Upload via GUI (34 Dateien)

This commit is contained in:
2026-11-05 21:22:26 +00:00
parent 752b42245a
commit c0b4092498
8 changed files with 447 additions and 20 deletions
+34 -2
View File
@@ -168,6 +168,7 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
<a class="stat" href="admin.php?tab=packages"><div class="k">Themes</div><div class="v"><?= count($themes) ?></div><div class="s">veröffentlicht</div></a>
<a class="stat" href="admin.php?tab=apps"><div class="k">Windows</div><div class="v"><?= $latestApp['windows'] ? site_h($latestApp['windows']['version']) : '–' ?></div><div class="s">aktuelle App-Version</div></a>
<a class="stat" href="admin.php?tab=apps"><div class="k">Android</div><div class="v"><?= $latestApp['android'] ? site_h($latestApp['android']['version']) : '–' ?></div><div class="s">aktuelle App-Version</div></a>
<a class="stat" href="admin.php?tab=server"><div class="k">DeskHub-Server</div><div class="v"><?= $latestApp['server'] ? site_h($latestApp['server']['version']) : '–' ?></div><div class="s">aktuelles System-Update</div></a>
<a class="stat" href="admin.php?tab=push"><div class="k">Push-Geräte</div><div class="v"><?= count($pushRows) ?></div><div class="s">angemeldete Installationen</div></a>
</div>
<div class="cols">
@@ -254,7 +255,7 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
<form method="post" enctype="multipart/form-data" class="form">
<input type="hidden" name="action" value="publish_app"><input type="hidden" name="csrf" value="<?= site_h($csrf) ?>">
<div class="row2">
<label>Plattform<select name="platform" id="platform"><?php foreach (site_app_platforms() as $pk => $pv): ?><option value="<?= site_h($pk) ?>" data-zip="<?= $pv['ext'] === 'zip' ? '1' : '0' ?>"><?= site_h($pv['label'] . ' – ' . $pv['what']) ?></option><?php endforeach; ?></select></label>
<label>Plattform<select name="platform" id="platform"><?php foreach (site_app_platforms() as $pk => $pv): if ($pk === 'server') continue; ?><option value="<?= site_h($pk) ?>" data-zip="<?= $pv['ext'] === 'zip' ? '1' : '0' ?>"><?= site_h($pv['label'] . ' – ' . $pv['what']) ?></option><?php endforeach; ?></select></label>
<label>Versionsnummer <span class="muted small" id="versionhint" hidden>(leer lassen: wird aus dem Paket gelesen)</span><input type="text" id="appversion" name="version" placeholder="3.4.0" pattern="[0-9]+[.][0-9]+[.][0-9]+([+-][A-Za-z0-9.-]+)?" required></label>
</div>
<label>Installationsdatei<input type="file" name="app_file" accept=".apk,.exe,.jar,.zip,application/vnd.android.package-archive,application/vnd.microsoft.portable-executable,application/zip" required></label>
@@ -263,7 +264,7 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
</form>
</section>
<div class="cols">
<?php foreach (array_map(fn($p) => $p['label'], site_app_platforms()) as $pf => $pl): $mine = array_values(array_filter($appReleases, fn($r) => $r['platform'] === $pf)); $cur = $latestApp[$pf]; ?>
<?php foreach (array_map(fn($p) => $p['label'], array_diff_key(site_app_platforms(), ['server' => 1])) as $pf => $pl): $mine = array_values(array_filter($appReleases, fn($r) => $r['platform'] === $pf)); $cur = $latestApp[$pf]; ?>
<section class="card">
<header><div><h2><?= site_h($pl) ?></h2><p><?= site_h(site_app_platforms()[$pf]['what']) ?></p></div>
<?= $cur ? '<span class="badge ok">aktuell ' . site_h($cur['version']) . '</span>' : '<span class="badge">noch nichts veröffentlicht</span>' ?></header>
@@ -282,6 +283,37 @@ site_header($loggedIn ? $tabs[$tab][0] . ' · Verwaltung' : 'Anmelden', $tab, $l
</div>
<?php elseif ($tab === 'server'): $serverMine = array_values(array_filter($appReleases, fn($r) => $r['platform'] === 'server')); $serverCur = $latestApp['server']; ?>
<div class="pagehead"><div><h1>DeskHub-Update</h1><p class="sub">Das ZIP des DeskHub-Servers für das System-Update. Alle DeskHub-Installationen holen neue Versionen von hier (Adminportal → System-Update). Die Version wird aus <code>version.php</code> im Paket gelesen, das Paket wird mit dem Schlüssel dieser Seite automatisch signiert.</p></div></div>
<?php if (!$signed): ?><div class="alert err">Kein Signierschlüssel eingerichtet: Die Pakete werden nicht signiert, DeskHub mit eingebautem Herausgeber-Schlüssel lehnt sie ab. Siehe Einstellungen.</div><?php endif; ?>
<section class="card">
<header><div><h2>Neue Version hochladen</h2><p>ZIP des Projekts (ohne <code>config/</code>, Datenbank, Backups, Uploads; diese Ordner werden beim Update ohnehin nie überschrieben).</p></div>
<?= $serverCur ? '<span class="badge ok">aktuell ' . site_h($serverCur['version']) . '</span>' : '<span class="badge">noch nichts veröffentlicht</span>' ?></header>
<form method="post" enctype="multipart/form-data" class="form">
<input type="hidden" name="action" value="publish_app"><input type="hidden" name="csrf" value="<?= site_h($csrf) ?>"><input type="hidden" name="platform" value="server">
<label>Update-Paket (ZIP)<input type="file" name="app_file" accept=".zip,application/zip" required></label>
<div class="row2">
<label>Versionsnummer <span class="muted small">(leer lassen: wird aus version.php gelesen)</span><input type="text" name="version" placeholder="1.0.96" pattern="[0-9]+[.][0-9]+[.][0-9]+([+-][A-Za-z0-9.-]+)?"></label>
<label>Änderungen (erscheint im Update-Fenster)<textarea name="notes" rows="2" maxlength="2000"></textarea></label>
</div>
<div><button type="submit">Update veröffentlichen</button></div>
</form>
</section>
<section class="card">
<header><div><h2>Veröffentlichte Versionen</h2><p>DeskHub zeigt die neuesten 20 unter „Bestimmte Version installieren“.</p></div></header>
<?php if (!$serverMine): ?><div class="empty">Noch keine Version veröffentlicht. Bis dahin nutzt DeskHub die Ausweichquelle (Gitea).</div><?php else: ?>
<div class="tablewrap"><table>
<thead><tr><th>Version</th><th>Datum</th><th>Größe</th><th>Änderungen</th><th></th></tr></thead>
<?php foreach ($serverMine as $release): $isLatest = $serverCur && (int) $serverCur['id'] === (int) $release['id']; ?><tr>
<td><strong><?= site_h($release['version']) ?></strong> <?= $isLatest ? '<span class="badge ok">aktuell</span>' : '' ?></td>
<td class="muted"><?= site_h(substr($release['created_at'], 0, 16)) ?></td><td><?= number_format((int) $release['size'] / 1048576, 1, ',', '.') ?> MB</td>
<td class="muted small"><?= site_h(mb_substr((string) $release['notes'], 0, 120)) ?></td>
<td class="actions"><?= admin_btn('delete_app', ['id' => (int) $release['id']], 'Entfernen', 'link danger', 'Diese Version wirklich entfernen?') ?></td>
</tr><?php endforeach; ?>
</table></div>
<?php endif; ?>
</section>
<?php elseif ($tab === 'push'): ?>
<div class="pagehead"><div><h1>Push-Dienst</h1><p class="sub">Zentraler Push-Dienst der Android-App. Hier siehst du die angemeldeten DeskHub-Installationen.</p></div></div>
<div class="status <?= $pushSa ? 'ok' : 'warn' ?>"><i class="dot"></i><div><strong><?= $pushSa ? 'Firebase-Dienstkonto eingebaut' : 'Kein Firebase-Dienstkonto' ?></strong><span><?= $pushSa ? 'Projekt ' . site_h($pushSa['project_id']) : 'schluessel/firebase-dienstkonto.json fehlte beim Bauen – Push-Nachrichten sind nicht möglich.' ?></span></div></div>