Files
felhom-controller/controller/internal/web/inframeta.go
T
admin 987e915bf2 Indítópult launcher page + universal app placeholder icon (v0.163.0)
New /launcher page: a grid of large tappable tiles, one per openable deployed
app (subdomain presence is the single openability criterion, shared with the
Megnyitás button via the extracted Server.subdomainMap helper). Colored tiles
(deterministic slug color or .felhom.yml brand_color), white glyph/monogram
fallback, target=_blank links for operational apps, greyed unclickable tiles for
stopped ones. First sidebar item; / stays the Vezérlőpult.

Universal app placeholder: new AppPlaceholderSVG served at
/static/app-placeholder.svg, now the default FallbackIcon on app_list_row so a
logo-less app shows a placeholder instead of visibility:hidden. Brand mark is
never an app placeholder.

New Metadata.BrandColor; new funcmap tileColor/initial. 10 new test functions +
4 red-proofs. No agent coupling; MinAgent unchanged.
2026-07-24 09:16:28 +02:00

62 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package web
// Infra-stack display metadata (v0.126.0 Part B). The protected base stacks (infra.go:
// traefik, cloudflared, filebrowser) carry no catalog metadata, so they rendered as bare
// directory names on the dashboard and app cards. This map gives them curated Hungarian
// identity — DISPLAY ONLY, keyed by stack name; it never affects protection, deploy or
// backup logic.
//
// Linked marks the ONLY infra stack with a customer-facing UI (filebrowser →
// files.<domain>). cloudflared and traefik have no customer UI — rendering an open link
// for them is the guarded-wrong outcome (render test asserts absence).
// InfraMeta is one protected infra stack's customer-facing identity.
type InfraMeta struct {
DisplayName string
Description string
Linked bool // has a customer-facing URL (subdomain via protectedStackSubdomains)
}
var infraMetaMap = map[string]InfraMeta{
"cloudflared": {
DisplayName: "Cloudflare Tunnel",
Description: "Biztonságos internetkapcsolat — a szerver portnyitás nélkül érhető el kívülről.",
},
"traefik": {
DisplayName: "Traefik",
Description: "Forgalomirányító (reverse proxy) — a kéréseket a megfelelő alkalmazáshoz irányítja.",
},
"filebrowser": {
DisplayName: "FileBrowser",
Description: "Fájlkezelő — a tárhely fájljainak böngészése a böngészőből.",
Linked: true,
},
// R-7: the LAN sharing stack has no web UI of its own (it is reached from Windows Intéző /
// Mac Finder), so Linked stays false — it is configured on the „Megosztás" page.
"samba": {
DisplayName: "Hálózati megosztás",
Description: "Fájlmegosztás a helyi hálózaton — a mappák a Windows Intézőben és a Mac Finderben jelennek meg.",
},
}
// infraMetaFor returns the curated metadata for a protected infra stack, nil for
// everything else (templates branch on the nil).
func infraMetaFor(stackName string) *InfraMeta {
if m, ok := infraMetaMap[stackName]; ok {
return &m
}
return nil
}
// InfraLogoSVG is the shared generic infra icon (Lucide-style "server", monochrome,
// --text-2 stroke) — the last-resort icon for infra stacks whose logo asset is not
// synced. Served at /static/infra-logo.svg; consumed via the app-row FallbackIcon slot.
const InfraLogoSVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#94A6BF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>`
// AppPlaceholderSVG is the generic APP placeholder icon — a 2×2 rounded-square app-grid, matching
// InfraLogoSVG's monochrome --text-2 visual language but a distinct glyph (apps, not server racks).
// It is the default FallbackIcon on every app-list row for a regular app whose logo asset is missing,
// replacing the old visibility:hidden dead-end. NEVER the felhom brand mark: the brand is platform
// identity, never an app stand-in (design ruling, CONTEXT.md). Served at /static/app-placeholder.svg.
const AppPlaceholderSVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#94A6BF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="3" width="7" height="7" rx="1.5"/><rect x="3" y="14" width="7" height="7" rx="1.5"/><rect x="14" y="14" width="7" height="7" rx="1.5"/></svg>`