feat: replace online status metric with favorites counter, ordered Dienste first
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 13s

This commit is contained in:
Kroonk
2026-05-22 00:20:59 +02:00
parent 57b39f8771
commit b0bcc8abbd
4 changed files with 19 additions and 15 deletions

View File

@@ -189,4 +189,5 @@ volumes:
- **PWA-Kachel Entfernung:** Die ungenutzte "PWA Installierbar"-Statistik-Kachel wurde aus der oberen Übersichtsleiste (`index.html`) entfernt. Das Layout der verbleibenden zwei Kacheln ("Online" & "Dienste") wurde in `style.css` auf ein stabiles, zentriertes 2-Spalten-Raster für Desktop und mobile Ansichten angepasst.
- **Kompakte Service-Kategoriefilter:** Die Kategorieauswahl (`.segments`) wurde aus der klebrigen (`sticky`) oberen `.control-bar` herausgelöst und in einem separaten `#categoryFilters`-Bereich direkt über dem Dienste-Grid platziert. Sie verbraucht dadurch im ungescrollten Zustand keinen kostbaren Platz mehr auf Mobilgeräten.
- **Visual-Premium Redesign & Untertitel:** Die Filter-Pills wurden verkleinert (Höhe von 36px auf 28px reduziert, kleinere Schriftgröße `0.78rem` und kompakteres Padding), linksbündig ausgerichtet und mit sanften Hover- & Aktiv-Transitions versehen. Zudem wurde der fälschlicherweise hinzugefügte dunkle Hintergrundbalken auf der `.control-bar` vollständig entfernt, um den nahtlosen Backdrop-Blur-Effekt über dem globalen Farbverlauf wiederherzustellen. Der Untertitel der Landing Page wurde von *"Cloud, Medien, Code..."* auf den prägnanten Namen *"Die Selfhost-Werkstatt"* abgeändert.
- **Cache-Buster & PWA Cache Update:** Die Cache-Busting-Parameter für `style.css` und `app.js` wurden in `index.html` hochgestuft (`v=32` bzw. `v=38`). Im Service-Worker (`sw.js`) wurde der Cache-Name auf `mischlabs-pwa-v24` erhöht und die App-Shell-Liste entsprechend angepasst, um ein sofortiges Update der App bei allen Nutzern ohne manuelles Cache-Leeren zu garantieren.
- **Favoriten-Zähler statt Online-Status:** Die "Online"-Statistik-Kachel in der Kopfzeile wurde durch eine dynamische "Favoriten"-Statistik-Kachel ersetzt, um direkt die Anzahl der geladenen Lesezeichen anzuzeigen. Die Reihenfolge wurde auf "Dienste" zuerst und "Favoriten" an zweiter Stelle geändert. Das Erreichbarkeits-Monitoring im Hintergrund läuft weiterhin stabil, um die Status-Punkte der einzelnen Dienste-Karten aktuell zu halten.
- **Cache-Buster & PWA Cache Update:** Die Cache-Busting-Parameter für `style.css` und `app.js` wurden in `index.html` auf `v=33` bzw. `v=39` hochgestuft. Im Service-Worker (`sw.js`) wurde der Cache-Name auf `mischlabs-pwa-v25` erhöht und die App-Shell-Liste entsprechend angepasst, um ein sofortiges Update der App bei allen Nutzern ohne manuelles Cache-Leeren zu garantieren.

13
app.js
View File

@@ -25,7 +25,7 @@ const searchInput = document.querySelector('#serviceSearch');
const segments = [...document.querySelectorAll('.segment')];
const viewOptions = [...document.querySelectorAll('.view-option')];
const emptyState = document.querySelector('#emptyState');
const onlineCount = document.querySelector('#onlineCount');
const favoriteCount = document.querySelector('#favoriteCount');
const serviceCount = document.querySelector('#serviceCount');
const lastChecked = document.querySelector('#lastChecked');
const dashboardSections = document.querySelector('#dashboardSections');
@@ -218,6 +218,10 @@ function createFavoriteCard(favorite) {
}
function renderFavorites() {
if (favoriteCount) {
favoriteCount.textContent = String(favorites.length);
}
if (!favoritesSections) return;
if (!MischLabsAuth.isAuthenticated()) {
@@ -466,9 +470,7 @@ async function probeService(card) {
async function refreshStatus() {
const results = await Promise.allSettled(cards.map(probeService));
const online = results.filter((result) => result.status === 'fulfilled' && result.value).length;
const unknown = results.filter((result) => result.status === 'fulfilled' && result.value === null).length;
onlineCount.textContent = String(online);
lastChecked.textContent = `Status geprueft: ${new Date().toLocaleTimeString('de-DE', {
hour: '2-digit',
minute: '2-digit'
@@ -477,7 +479,6 @@ async function refreshStatus() {
function scheduleStatusRefresh() {
const run = () => refreshStatus().catch(() => {
onlineCount.textContent = '--';
lastChecked.textContent = 'Status aktuell nicht verfuegbar.';
});
@@ -598,7 +599,9 @@ MischLabsAuth.handleCallback()
})
.catch(() => {
dashboardSections.innerHTML = '<p class="empty-state">Dashboard-Konfiguration konnte nicht geladen werden.</p>';
onlineCount.textContent = '--';
if (favoriteCount) {
favoriteCount.textContent = '--';
}
});
// ==========================================================================

View File

@@ -15,7 +15,7 @@
<link rel="icon" type="image/png" sizes="48x48" href="/icons/favicon-48-v4.png">
<link rel="icon" type="image/png" sizes="192x192" href="/icons/favicon-192-v4.png">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon-v4.png">
<link rel="stylesheet" href="style.css?v=32">
<link rel="stylesheet" href="style.css?v=33">
</head>
<body>
<header class="shell hero">
@@ -29,14 +29,14 @@
</div>
<div class="hero-meta" aria-label="Systemuebersicht">
<div class="metric">
<span class="metric-value" id="onlineCount">--</span>
<span class="metric-label">Online</span>
</div>
<div class="metric">
<span class="metric-value" id="serviceCount">9</span>
<span class="metric-label">Dienste</span>
</div>
<div class="metric">
<span class="metric-value" id="favoriteCount">--</span>
<span class="metric-label">Favoriten</span>
</div>
</div>
<div class="dashboard-menu">
@@ -140,6 +140,6 @@
</div>
<script src="/auth.js?v=2" defer></script>
<script src="/app.js?v=38" defer></script>
<script src="/app.js?v=39" defer></script>
</body>
</html>

6
sw.js
View File

@@ -1,12 +1,12 @@
const CACHE_NAME = 'mischlabs-pwa-v24';
const CACHE_NAME = 'mischlabs-pwa-v25';
const APP_SHELL = [
'/',
'/index.html',
'/favorites.html',
'/offline.html',
'/style.css?v=32',
'/style.css?v=33',
'/auth.js?v=2',
'/app.js?v=38',
'/app.js?v=39',
'/favorites.js?v=1',
'/services.json?v=1',
'/manifest.webmanifest?v=4',