Files
Vorrania/web/src/branding.js
Scarriffle 4448718d8d Logo-Upload sichtbar machen; empfohlene Abmessungen angeben
Fehler: Ein hochgeladenes Logo blieb unsichtbar, auch nach dem Neuladen.
Die Oberflaeche prueft per Anfrage, ob ein Bild hinterlegt ist, und nutzte dafuer
HEAD. FastAPI registriert fuer eine GET-Route aber - anders als Starlette - kein
HEAD; die Anfrage lief in ein 405, und jedes hinterlegte Bild galt als "nicht
vorhanden". Der Upload selbst war die ganze Zeit in Ordnung.

- Neuer Endpunkt GET /branding liefert nur den Status ({"logo": true, ...}),
  ohne Bilddaten zu uebertragen. Die Oberflaeche fragt jetzt diesen ab.
- Die Bild-Route beantwortet zusaetzlich HEAD, damit sie sich erwartungsgemaess
  verhaelt.

Ausserdem:
- Die empfohlenen Abmessungen stehen jetzt sichtbar ueber der Vorschau
  (Logo etwa 400x72 px, Favicon 64x64 px, jeweils hoechstens 512 KB).
- Nach dem Hochladen wird die tatsaechliche Bildgroesse angezeigt, damit man
  sie mit der Empfehlung vergleichen kann.

Geprueft: "npm run build" laeuft durch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 08:55:17 +02:00

46 lines
1.5 KiB
JavaScript
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.
// Eigenes Logo und Favicon der Installation.
// Beides ist optional: Ist nichts hinterlegt, antwortet das Backend mit 404
// und die Oberfläche bleibt bei ihrem eingebauten Zeichen.
export const BRANDING_KINDS = ["logo", "favicon"];
export function brandingUrl(kind, version) {
return `/api/branding/${kind}${version ? `?v=${version}` : ""}`;
}
/**
* Fragt beim Server ab, welche eigenen Bilder hinterlegt sind.
*
* Frueher lief das als HEAD-Anfrage auf das Bild selbst. FastAPI beantwortet
* eine GET-Route aber nicht automatisch auch mit HEAD die Anfrage endete in
* einem 405, und ein hochgeladenes Logo wurde nie angezeigt. Jetzt liefert der
* Server einen kleinen Status, ganz ohne Bilddaten.
*/
export async function brandingStatus() {
try {
const resp = await fetch("/api/branding");
if (!resp.ok) return {};
return await resp.json();
} catch {
return {}; // Server nicht erreichbar: eingebautes Zeichen genügt.
}
}
/** Prüft, ob ein eigenes Bild hinterlegt ist (ohne es zu laden). */
export async function hasBranding(kind) {
const status = await brandingStatus();
return Boolean(status[kind]);
}
/**
* Setzt das Favicon auf das hinterlegte Bild.
* Läuft bewusst schon vor dem Login der Browser holt das Favicon sofort.
*/
export async function applyFavicon() {
const link = document.querySelector("link[rel='icon']");
if (!link) return;
if (await hasBranding("favicon")) {
link.href = brandingUrl("favicon", Date.now());
}
}