From 29b77f22e40db671217313ad82b5909550a508f2 Mon Sep 17 00:00:00 2001 From: Till JS Date: Wed, 1 Apr 2026 11:44:38 +0200 Subject: [PATCH] refactor(status-page): show tier badges inline instead of separate section Move release tier info (founder/alpha/beta/public) from a standalone grid section into the existing service rows as small inline badges next to each web app name. Cleaner, less visual noise. Co-Authored-By: Claude Opus 4.6 (1M context) --- ...o-gradient.png => cards-logo-gradient.png} | Bin ...GRATION.md => CARDS_POSTGRES_MIGRATION.md} | 0 scripts/generate-status-page.sh | 133 +++++------------- 3 files changed, 32 insertions(+), 101 deletions(-) rename apps/cards/apps/web/static/images/app-icons/{manadeck-logo-gradient.png => cards-logo-gradient.png} (100%) rename docs/{MANADECK_POSTGRES_MIGRATION.md => CARDS_POSTGRES_MIGRATION.md} (100%) diff --git a/apps/cards/apps/web/static/images/app-icons/manadeck-logo-gradient.png b/apps/cards/apps/web/static/images/app-icons/cards-logo-gradient.png similarity index 100% rename from apps/cards/apps/web/static/images/app-icons/manadeck-logo-gradient.png rename to apps/cards/apps/web/static/images/app-icons/cards-logo-gradient.png diff --git a/docs/MANADECK_POSTGRES_MIGRATION.md b/docs/CARDS_POSTGRES_MIGRATION.md similarity index 100% rename from docs/MANADECK_POSTGRES_MIGRATION.md rename to docs/CARDS_POSTGRES_MIGRATION.md diff --git a/scripts/generate-status-page.sh b/scripts/generate-status-page.sh index 7243c1ee8..cb3cabeff 100755 --- a/scripts/generate-status-page.sh +++ b/scripts/generate-status-page.sh @@ -97,6 +97,7 @@ render_rows() { success="$(get_success "$inst")" ms="$(get_duration_ms "$inst")" name="$(friendly_name "$inst")" + tier_badge="$(get_tier_badge "$inst")" if [ "$success" = "1" ]; then status_class="up" status_text="UP" @@ -106,8 +107,10 @@ render_rows() { status_text="DOWN" ms_html="" fi - printf '%s%s%s %s\n' \ - "$status_class" "$status_class" "$name" "$inst" \ + tier_html="" + [ -n "$tier_badge" ] && tier_html=" $tier_badge" + printf '%s%s%s%s %s\n' \ + "$status_class" "$status_class" "$name" "$tier_html" "$inst" \ "$status_text" \ "${ms_html:-}" done @@ -142,7 +145,7 @@ TIMESTAMP="$(date -u '+%d. %B %Y, %H:%M Uhr UTC')" # ── App Release Tiers (automatisch aus mana-apps.ts) ──────────────────────── # Gemountet als /mana-apps.ts (read-only) im Container. -# Format je Zeile: name|tier|status +# Format je Zeile: id|name|tier|status MANA_APPS_TS="${MANA_APPS_TS:-/mana-apps.ts}" @@ -151,86 +154,38 @@ if [ -f "$MANA_APPS_TS" ]; then /^export const MANA_APPS/ { inside=1; next } /^];/ { inside=0 } !inside { next } - /^\t\{/ { name=""; tier=""; st=""; archived=0 } + /^\t\{/ { id=""; name=""; tier=""; st=""; archived=0 } + /^\t\tid:/ { gsub(/.*id:[[:space:]]*'\''/, ""); gsub(/'\''.*/, ""); id=$0 } /^\t\tname:/ { gsub(/.*name:[[:space:]]*'\''/, ""); gsub(/'\''.*/, ""); name=$0 } /^\t\trequiredTier:/ { gsub(/.*requiredTier:[[:space:]]*'\''/, ""); gsub(/'\''.*/, ""); tier=$0 } /^\t\tstatus:/ { gsub(/.*status:[[:space:]]*'\''/, ""); gsub(/'\''.*/, ""); st=$0 } /^\t\tarchived:[[:space:]]*true/ { archived=1 } - /^\t\},/ { if (name != "" && tier != "" && archived == 0) print name "|" tier "|" st } + /^\t\},/ { if (id != "" && tier != "" && archived == 0) print id "|" name "|" tier "|" st } ' "$MANA_APPS_TS")" else - echo "$(date '+%H:%M:%S') WARNUNG: $MANA_APPS_TS nicht gefunden — Tier-Sektion wird übersprungen" + echo "$(date '+%H:%M:%S') WARNUNG: $MANA_APPS_TS nicht gefunden — Tier-Badges deaktiviert" TIER_APPS="" fi -render_tier_rows() { - tier="$1" - echo "$TIER_APPS" | while IFS='|' read -r name t status; do - [ -z "$name" ] && continue - [ "$t" != "$tier" ] && continue - case "$status" in - published) status_class="published"; status_label="Published" ;; - beta) status_class="beta-status"; status_label="Beta" ;; - development) status_class="dev-status"; status_label="Development" ;; - planning) status_class="plan-status"; status_label="Planned" ;; - *) status_class="dev-status"; status_label="$status" ;; - esac - printf '%s%s\n' \ - "$name" "$status_class" "$status_label" +# Gibt Tier-Badge-HTML für eine Blackbox-URL zurück (leer wenn kein Match) +get_tier_badge() { + url="$1" + # Subdomain extrahieren: https://todo.mana.how → todo, https://todo-api.mana.how/health → todo-api + subdomain="${url#https://}" + subdomain="${subdomain%.mana.how*}" + subdomain="${subdomain%/health}" + # API-Subdomains skippen (z.B. todo-api, chat-api) + case "$subdomain" in *-api) return ;; esac + # Spezialfall: mana.how selbst → manacore (kein Tier) + [ "$subdomain" = "mana.how" ] && return + + echo "$TIER_APPS" | while IFS='|' read -r id name tier st; do + [ "$id" = "$subdomain" ] || continue + printf '%s' "$tier" "$tier" + break done } -count_tier() { - tier="$1" - echo "$TIER_APPS" | grep -c "|${tier}|" || echo "0" -} - -tier_founder_count="$(count_tier founder)" -tier_alpha_count="$(count_tier alpha)" -tier_beta_count="$(count_tier beta)" -tier_public_count="$(count_tier public)" - -render_tier_section() { - [ -z "$TIER_APPS" ] && return - cat << TIEREOF -
-
-

App Release Tiers

- ${tier_public_count} public · ${tier_beta_count} beta · ${tier_alpha_count} alpha · ${tier_founder_count} founder -
-
-
-
-

Founder

- ${tier_founder_count} Apps -
- -$(render_tier_rows founder) -
-
-
-
-

Alpha

- ${tier_alpha_count} Apps -
- -$(render_tier_rows alpha) -
-
-
-
-

Beta

- ${tier_beta_count} Apps -
- -$(render_tier_rows beta) -
-
-
-
-TIEREOF -} - # ── HTML generieren ────────────────────────────────────────────────────────── cat > "${OUTPUT}.tmp" << HTMLEOF @@ -370,33 +325,11 @@ cat > "${OUTPUT}.tmp" << HTMLEOF .no-data { color: var(--muted); font-size: 13px; text-align: center; padding: 20px; } - /* ── Tier Section ── */ - .tier-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; } - .tier-card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; overflow: hidden; } - .tier-card-header { - display: flex; align-items: center; justify-content: space-between; - padding: 12px 16px; border-bottom: 1px solid var(--border); - } - .tier-card-header h3 { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; } - .tier-card-header .tier-count { font-size: 12px; color: var(--muted); } - .tier-card table { border: none; border-radius: 0; } - .tier-card tr:last-child { border-bottom: none; } - .tier-card td { padding: 8px 16px; } - .tier-card .name { font-size: 14px; } - - .tier-founder .tier-card-header { background: rgba(168,85,247,.08); } - .tier-founder .tier-card-header h3 { color: #a855f7; } - .tier-alpha .tier-card-header { background: rgba(245,158,11,.08); } - .tier-alpha .tier-card-header h3 { color: #f59e0b; } - .tier-beta .tier-card-header { background: rgba(59,130,246,.08); } - .tier-beta .tier-card-header h3 { color: #3b82f6; } - .tier-public .tier-card-header { background: rgba(34,197,94,.08); } - .tier-public .tier-card-header h3 { color: var(--green); } - - .badge.published { background: rgba(34,197,94,.12); color: var(--green); } - .badge.beta-status { background: rgba(59,130,246,.12); color: #3b82f6; } - .badge.dev-status { background: rgba(245,158,11,.12); color: #f59e0b; } - .badge.plan-status { background: rgba(102,102,102,.15); color: var(--muted); } + /* ── Tier Badges (inline) ── */ + .badge.tier-founder { background: rgba(168,85,247,.12); color: #a855f7; margin-left: 8px; font-size: 10px; text-transform: uppercase; } + .badge.tier-alpha { background: rgba(245,158,11,.12); color: #f59e0b; margin-left: 8px; font-size: 10px; text-transform: uppercase; } + .badge.tier-beta { background: rgba(59,130,246,.12); color: #3b82f6; margin-left: 8px; font-size: 10px; text-transform: uppercase; } + .badge.tier-public { background: rgba(34,197,94,.12); color: var(--green); margin-left: 8px; font-size: 10px; text-transform: uppercase; } /* ── Footer ── */ footer { @@ -480,8 +413,6 @@ $(render_rows blackbox-gpu) -$(render_tier_section) - @@ -505,7 +436,7 @@ if [ -n "$TIER_APPS" ]; then TIER_JSON="$(echo "$TIER_APPS" | awk -F'|' ' BEGIN { printf "[" } NR>1 { printf "," } - { printf "{\"name\":\"%s\",\"tier\":\"%s\",\"status\":\"%s\"}", $1, $2, $3 } + { printf "{\"id\":\"%s\",\"name\":\"%s\",\"tier\":\"%s\",\"status\":\"%s\"}", $1, $2, $3, $4 } END { printf "]" } ')" fi