// Einstellungen — sub-views part 2: Dokumente, Erinnerungen, Darstellung.
const { useState: useStateE2, useEffect: useEffectE2 } = React;
// ─────────────────────────────────────────────────────────────
// Dokumente — number patterns, payment defaults, footer + PDF template + accent
// ─────────────────────────────────────────────────────────────
function DokumenteSettingsView({ t, c, set, onBack, onClose }) {
const nextInvoiceNo = previewNumber(c.invoicePattern, c.invoiceCounter || 1);
const nextContractNo = previewNumber(c.contractPattern, c.contractCounter || 1);
return (
Nummern-Schemata
set({ invoicePattern: v })}
placeholder="RE-{YYYY}-{####}" t={t} />
set({ contractPattern: v })}
placeholder="MV-{YYYY}-{####}" t={t} last />
{'{YYYY} = Jahr · {YY} = Kurzjahr · {####} = Zähler'}
{/* Preview tile */}
Nächste Rechnung: {nextInvoiceNo}
Nächster Vertrag: {nextContractNo}
Standard-Konditionen
set({ paymentDays: v === '' ? '' : v })} />
Tage
} />
set({ defaultDeposit: v === '' ? '' : v })} />
€
} />
{/* PDF template + accent (kept from previous Firmenprofil) */}
PDF-Vorlage
{PDF_TEMPLATES.map((tp) => {
const sel = (c.template || 'modern') === tp.id;
return (
set({ template: tp.id })} scale={0.96} style={{ flex: 1 }}>
);
})}
Akzentfarbe
{ACCENT_OPTIONS.map((col) => {
const sel = (c.accent || '#1f6feb').toLowerCase() === col.toLowerCase();
return (
set({ accent: col })} scale={0.88}>
);
})}
Rechnungs-Fußzeile
);
}
// ─────────────────────────────────────────────────────────────
// Erinnerungen — push toggles + lead-time days
// ─────────────────────────────────────────────────────────────
function ErinnerungenView({ t, c, set, onBack, onClose }) {
const rContract = c.remContractEnd || { on: true, days: 3 };
const rReturn = c.remReturnOverdue || { on: true };
const rMaint = c.remMaintDue || { on: true };
const rInvoice = c.remInvoiceOverdue || { on: true, days: 7 };
const rStart = c.remRentalStart || { on: true, days: 1 };
const rPickup = c.remPickupTime || { on: true, hours: 2 };
const tagePill = (val, onChange) =>
onChange(v === '' ? 0 : v)} />
Tage
;
const stundenPill = (val, onChange) =>
onChange(v === '' ? 0 : v)} />
Std.
;
return (
Push-Benachrichtigungen
System-Mitteilungen, wenn etwas zu tun ist.
{tagePill(rStart.days, (v) => set({ remRentalStart: { ...rStart, days: v } }))}
set({ remRentalStart: { ...rStart, on: v } })} />
} />
{stundenPill(rPickup.hours, (v) => set({ remPickupTime: { ...rPickup, hours: v } }))}
set({ remPickupTime: { ...rPickup, on: v } })} />
} />
{tagePill(rContract.days, (v) => set({ remContractEnd: { ...rContract, days: v } }))}
set({ remContractEnd: { ...rContract, on: v } })} />
} />
set({ remReturnOverdue: { ...rReturn, on: v } })} />} />
set({ remMaintDue: { ...rMaint, on: v } })} />} />
{tagePill(rInvoice.days, (v) => set({ remInvoiceOverdue: { ...rInvoice, days: v } }))}
set({ remInvoiceOverdue: { ...rInvoice, on: v } })} />
} />
);
}
// ─────────────────────────────────────────────────────────────
// Darstellung — light/dark mode + about
// ─────────────────────────────────────────────────────────────
function DarstellungView({ t, dark, toggleDark, themeId, setThemeId, accents, setAccents, navLayout, setNavLayout, navLabels, setNavLabels, c, set, onBack, onClose }) {
const useLogoIcon = !!(c && c.useLogoIcon);
const hasLogo = !!(c && c.logo);
const THEMES = window.THEMES || {};
const META = window.THEME_META || [];
const curId = themeId || (dark ? 'dark' : 'light');
const curBase = THEMES[curId] || {};
const curAccent = (accents && accents[curId]) || curBase.accent;
// A small theme preview swatch (background + card + accent dot).
const ThemeCard = ({ id, label }) => {
const th = THEMES[id] || {};
const on = curId === id;
const ac = (accents && accents[id]) || th.accent;
return (
setThemeId && setThemeId(id)} scale={0.96}>
);
};
const LAYOUTS = [
{ id: 'classic', label: 'Automatisch', sub: 'Passt sich dem Design an (Studio = Vollleiste)' },
{ id: 'pill', label: 'Schwebeleiste', sub: 'Schwebende Pille unten — frei über dem Inhalt' },
{ id: 'bar', label: 'Vollleiste', sub: 'Durchgehende Leiste unten mit Beschriftung' },
{ id: 'command', label: 'Befehlsleiste', sub: 'Suchfeld + Schnell-Plus, minimale Wechsel' },
{ id: 'launcher', label: 'Launcher', sub: 'Ein Knopf öffnet alle Bereiche & Aktionen' }];
return (
Design
{META.map((m) => )}
Akzentfarbe
{(curBase.accents || []).map((col) => {
const on = curAccent === col;
return (
setAccents && setAccents({ ...accents, [curId]: col })} scale={0.9}>
{on && }
);
})}
{(() => {
const presets = curBase.accents || [];
const isCustom = curAccent && !presets.some((col) => col.toLowerCase() === curAccent.toLowerCase());
return (
{isCustom
?
:
}
setAccents && setAccents({ ...accents, [curId]: e.target.value })}
style={{ position: 'absolute', inset: 0, opacity: 0, cursor: 'pointer' }} />
);
})()}
Bedienung & Layout
{LAYOUTS.map((l, i) => {
const on = (navLayout || 'classic') === l.id;
return (
setNavLayout && setNavLayout(l.id)} scale={0.99}>
);
})}
setNavLabels && setNavLabels(!v)} />} />
Symbol oben rechts
{if (!hasLogo) return;set({ useLogoIcon: v });}} />
} />
{useLogoIcon && hasLogo &&
}
);
}
// ─── Tab-Einstellungen — per-area display & calculation prefs ───
function TabDisplayView({ t, tabSettings, setTabSettings, onBack, onClose }) {
const cfg = (tab) => (tabSettings && tabSettings[tab]) || {};
const setCfg = (tab, patch) => setTabSettings && setTabSettings((prev) => ({ ...prev, [tab]: { ...((prev && prev[tab]) || {}), ...patch } }));
const Segmented = ({ value, options, onPick }) => (
{options.map(([id, label]) => {
const on = value === id;
return (
onPick(id)} scale={0.96} style={{ flex: 1 }}>
{label}
);
})}
);
const eq = cfg('equipment');
const zub = cfg('zubehoer');
const rentalsCfg = cfg('rentals');
return (
Lege je Bereich fest, wie Inhalte dargestellt und berechnet werden. Die Einstellungen bleiben gespeichert.
Equipment
Listenansicht
setCfg('equipment', { view: v })} />
setCfg('equipment', { showIcons: v })} />} />
Zubehör
Listenansicht
setCfg('zubehoer', { view: v })} />
setCfg('zubehoer', { showIcons: v })} />} />
Mietvertrag
Formular-Darstellung
setCfg('rentals', { layout: v })} />
setCfg('rentals', { expandContact: v })} />} />
);
}
Object.assign(window, {
DokumenteSettingsView, ErinnerungenView, DarstellungView, TabDisplayView
});