Some checks failed
🚀 Build & Deploy Image / Determine Build Necessity (push) Failing after 10m14s
🚀 Build & Deploy Image / Build Runtime Base Image (push) Has been skipped
🚀 Build & Deploy Image / Build Docker Image (push) Has been skipped
🚀 Build & Deploy Image / Run Tests & Quality Checks (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Staging (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Production (push) Has been skipped
Security Vulnerability Scan / Check for Dependency Changes (push) Failing after 11m25s
Security Vulnerability Scan / Composer Security Audit (push) Has been cancelled
- Remove middleware reference from Gitea Traefik labels (caused routing issues) - Optimize Gitea connection pool settings (MAX_IDLE_CONNS=30, authentication_timeout=180s) - Add explicit service reference in Traefik labels - Fix intermittent 504 timeouts by improving PostgreSQL connection handling Fixes Gitea unreachability via git.michaelschiemer.de
104 lines
4.4 KiB
PHP
104 lines
4.4 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Pre-Save Campaigns - Admin</title>
|
|
<link rel="stylesheet" href="/css/styles.css">
|
|
</head>
|
|
<body>
|
|
<layout name="admin">
|
|
<div class="container">
|
|
<div class="page-header">
|
|
<h1>Pre-Save Campaigns</h1>
|
|
<a href="/admin/presave/campaigns/create" class="btn btn-primary">New Campaign</a>
|
|
</div>
|
|
|
|
<div class="stats-grid" if="{{$stats}}">
|
|
<div class="stat-card">
|
|
<h3>Total Campaigns</h3>
|
|
<p class="stat-value">{{$stats['total']}}</p>
|
|
</div>
|
|
<div class="stat-card">
|
|
<h3>Active</h3>
|
|
<p class="stat-value">{{$stats['active']}}</p>
|
|
</div>
|
|
<div class="stat-card">
|
|
<h3>Total Registrations</h3>
|
|
<p class="stat-value">{{$stats['total_registrations']}}</p>
|
|
</div>
|
|
<div class="stat-card">
|
|
<h3>Completed</h3>
|
|
<p class="stat-value">{{$stats['completed']}}</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="campaigns-list" if="{{$campaigns}}">
|
|
<div class="campaign-card" foreach="$campaigns as $campaign">
|
|
<div class="campaign-header">
|
|
<img src="{{$campaign->coverImageUrl}}" alt="{{$campaign->title}}" class="campaign-cover">
|
|
<div class="campaign-info">
|
|
<h3>{{$campaign->title}}</h3>
|
|
<p class="artist">{{$campaign->artistName}}</p>
|
|
<p class="release-date">Release: {{$campaign->releaseDate}}</p>
|
|
</div>
|
|
<div class="campaign-status">
|
|
<span class="badge badge-{{$campaign->status->value}}">{{$campaign->status->value}}</span>
|
|
</div>
|
|
</div>
|
|
<div class="campaign-actions">
|
|
<a href="/admin/presave/campaigns/{{$campaign->id}}" class="btn btn-sm">View</a>
|
|
<a href="/admin/presave/campaigns/{{$campaign->id}}/edit" class="btn btn-sm">Edit</a>
|
|
|
|
<form action="/admin/presave/campaigns/{{$campaign->id}}/activate" method="POST" style="display: inline;" if="{{$campaign->status->value === 'draft'}}">
|
|
<csrf-token />
|
|
<button type="submit" class="btn btn-sm btn-success">Activate</button>
|
|
</form>
|
|
|
|
<form action="/admin/presave/campaigns/{{$campaign->id}}/pause" method="POST" style="display: inline;" if="{{$campaign->status->value === 'active'}}">
|
|
<csrf-token />
|
|
<button type="submit" class="btn btn-sm btn-warning">Pause</button>
|
|
</form>
|
|
|
|
<button class="btn btn-sm btn-danger" onclick="deleteCampaign({{$campaign->id}})">Delete</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="empty-state" if="{{!$campaigns || count($campaigns) === 0}}">
|
|
<p>No campaigns yet.</p>
|
|
<a href="/admin/presave/campaigns/create" class="btn btn-primary">Create your first campaign</a>
|
|
</div>
|
|
</div>
|
|
</layout>
|
|
|
|
<script>
|
|
async function deleteCampaign(id) {
|
|
if (!confirm('Are you sure you want to delete this campaign? This will also delete all registrations.')) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(`/admin/presave/campaigns/${id}`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
|
|
const data = await response.json();
|
|
|
|
if (data.success) {
|
|
window.location.reload();
|
|
} else {
|
|
alert(data.message || 'Failed to delete campaign');
|
|
}
|
|
} catch (error) {
|
|
alert('Error deleting campaign');
|
|
console.error(error);
|
|
}
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|