Quellcode des ICON CRM (4)

This commit is contained in:
2026-09-14 16:55:36 +02:00
parent 28763fed6d
commit e383400d7c
25 changed files with 6030 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
/*
* Pruefung der Felder, die sowohl die Nutzerverwaltung als auch "Mein Konto"
* setzen duerfen. An einer Stelle, damit beide Wege dieselben Grenzen haben.
*/
/** Farbe als #rgb, #rrggbb oder #rrggbbaa; leer setzt zurueck. */
export function normalizeColor(input) {
if (input === null || input === undefined || input === '') return { value: null };
const value = String(input).trim();
if (!/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(value)) {
return { error: 'Farbe muss ein Hex-Wert sein, z. B. #C1862F.' };
}
return { value: value.toLowerCase() };
}
// Ein Foto liegt als Data-URL in der Datenbank. Der Browser komprimiert es
// vorher auf 256 px, damit die Nutzlast klein bleibt; die Grenze hier ist das
// Sicherheitsnetz gegen ein Bild, das diesen Weg umgeht.
const MAX_AVATAR_CHARS = 400_000;
export function normalizeAvatar(input) {
if (input === null || input === undefined || input === '') return { value: null };
const value = String(input).trim();
const isDataUrl = /^data:image\/(png|jpe?g|webp|gif|avif);base64,[A-Za-z0-9+/=]+$/.test(value);
const isHttpUrl = /^https?:\/\/\S+$/i.test(value);
if (!isDataUrl && !isHttpUrl) {
return { error: 'Foto muss ein Bild oder eine http(s)-Adresse sein.' };
}
if (value.length > MAX_AVATAR_CHARS) {
return { error: 'Das Foto ist zu gross. Bitte ein kleineres Bild verwenden.' };
}
return { value };
}
/*
* Verfügbare Farbwelten. Muss mit THEME_PALETTES in src/types.ts
* übereinstimmen. Ein unbekannter Wert wird abgewiesen, damit ein Tippfehler
* nicht still zum Standarddesign führt.
*/
const THEMES = new Set(['icon', 'halflife', 'pixel']);
export function normalizeTheme(input) {
if (input === null || input === undefined || input === '') return { value: null };
const value = String(input).trim().toLowerCase();
if (!THEMES.has(value)) return { error: 'Unbekanntes Design.' };
return { value };
}
export function normalizeThemeMode(input) {
if (input === null || input === undefined || input === '') return { value: null };
const value = String(input).trim().toLowerCase();
if (value !== 'light' && value !== 'dark') return { error: 'Modus muss light oder dark sein.' };
return { value };
}