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>
46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
// 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());
|
||
}
|
||
}
|