Quellcode des ICON CRM (4)
This commit is contained in:
@@ -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 };
|
||||
}
|
||||
Reference in New Issue
Block a user