feat(admin): eigener Arbeitsbereich mit Dashboard, Zaehlern und Schnellsuche
- Admin ohne Shop-Kopf-/Fusszeile (HideOnAdmin); kein doppeltes <main> mehr - Seitenleiste gruppiert (Verkauf, Sortiment, Kundschaft, Seite), aktive Seite als wandernde Flaeche mit Wabe, Zaehler fuer Wartendes: bezahlte offene Bestellungen, neue Retouren, unfreigegebene Bewertungen, neue Firmenanfragen (COUNT-Abfragen erst nach Admin-/2FA-Pruefung) - Schnellsuche (Strg/Cmd+K): Seiten und haeufige Aktionen per Tastatur, tolerante Wortsuche, Ziele nur aus fester Liste - Dashboard: Begruessung nach Tageszeit (Berliner Zeit), eine Leitzahl "Umsatz heute" mit Vergleich zu gestern und Mini-Verlauf, "Zu erledigen" mit direkten Links bzw. "Alles erledigt"-Siegel, ruhigere Kennzahl-Kacheln - Diagramme nach dataviz-Skill: per Validator gepruefter Diagrammton #a0722f (>=3:1; #b88a44 erreichte nur 2,93:1), gerundete Balkenkappen, 2px Luecke, Tooltip je Balken (auch per Tastatur), Meter mit Spur im selben Ton, Rang der Top-Produkte als Wabe - Einheitliche Admin-Details zentral: groessere Ueberschriften, Tabellenkopf als Etikett, feste Ziffernbreite, eigene Auswahlpfeile Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
15ddceaa39
commit
c95c713717
11 files changed
+762
-133
No files matched your search
@@ -1234,6 +1234,19 @@ export const de: Dictionary = {
|
||||
noVouchersYet: "Noch keine Gutscheine eingelöst.",
|
||||
usedCountLabel: (count, maxUses) => `${count}× genutzt${maxUses ? ` / ${maxUses}` : ""}`,
|
||||
viewAllOrders: "Alle Bestellungen ansehen →",
|
||||
greeting: (part, name) =>
|
||||
`${part === "morning" ? "Guten Morgen" : part === "day" ? "Hallo" : "Guten Abend"}, ${name}.`,
|
||||
todayRevenueLabel: "Umsatz heute",
|
||||
monthRevenueLabel: "Umsatz diesen Monat",
|
||||
vsYesterday: (delta, up) => `${up ? "↑" : "↓"} ${delta} gegenüber gestern`,
|
||||
toDoHeading: "Zu erledigen",
|
||||
toDoOrders: (count) => (count === 1 ? "1 Bestellung wartet auf Versand" : `${count} Bestellungen warten auf Versand`),
|
||||
toDoReturns: (count) => (count === 1 ? "1 neue Retoure" : `${count} neue Retouren`),
|
||||
toDoReviews: (count) => (count === 1 ? "1 Bewertung wartet auf Freigabe" : `${count} Bewertungen warten auf Freigabe`),
|
||||
toDoInquiries: (count) => (count === 1 ? "1 neue Firmenanfrage" : `${count} neue Firmenanfragen`),
|
||||
allDoneTitle: "Alles erledigt.",
|
||||
allDoneText: "Gerade wartet nichts auf dich. Zeit für die Bienen.",
|
||||
chartTooltip: (day, value) => `${day}: ${value}`,
|
||||
},
|
||||
adminContentPage: {
|
||||
backToDashboard: "Zurück zum Dashboard",
|
||||
@@ -1308,6 +1321,22 @@ export const de: Dictionary = {
|
||||
closeMenu: "Menü schließen",
|
||||
loggedInAs: (name) => `Angemeldet als ${name}`,
|
||||
logout: "Abmelden",
|
||||
groupSales: "Verkauf",
|
||||
groupRange: "Sortiment",
|
||||
groupCustomers: "Kundschaft",
|
||||
groupSite: "Seite",
|
||||
paletteOpen: "Schnellsuche",
|
||||
paletteShortcut: "Strg K",
|
||||
palettePlaceholder: "Wohin? Seite oder Aktion suchen …",
|
||||
paletteNoResults: "Nichts gefunden.",
|
||||
paletteSectionPages: "Seiten",
|
||||
paletteSectionActions: "Aktionen",
|
||||
actionNewProduct: "Neues Produkt anlegen",
|
||||
actionNewVoucher: "Neuen Gutschein anlegen",
|
||||
actionNewUser: "Neues Konto anlegen",
|
||||
actionNewShippingTier: "Neue Versandstufe anlegen",
|
||||
actionViewShop: "Shop ansehen",
|
||||
badgeWaiting: (count) => `${count} warten`,
|
||||
twoFactorWarning:
|
||||
"Dieses Admin-Konto hat noch keine Zwei-Faktor-Authentifizierung aktiviert, empfohlen für Konten mit Zugriff auf Bestellungen, Rückerstattungen und Kundendaten.",
|
||||
twoFactorSetupLink: "Jetzt einrichten →",
|
||||
|
||||
@@ -1220,6 +1220,19 @@ export const en: Dictionary = {
|
||||
noVouchersYet: "No vouchers redeemed yet.",
|
||||
usedCountLabel: (count, maxUses) => `used ${count}×${maxUses ? ` / ${maxUses}` : ""}`,
|
||||
viewAllOrders: "View all orders →",
|
||||
greeting: (part, name) =>
|
||||
`${part === "morning" ? "Good morning" : part === "day" ? "Hello" : "Good evening"}, ${name}.`,
|
||||
todayRevenueLabel: "Revenue today",
|
||||
monthRevenueLabel: "Revenue this month",
|
||||
vsYesterday: (delta, up) => `${up ? "↑" : "↓"} ${delta} vs. yesterday`,
|
||||
toDoHeading: "To do",
|
||||
toDoOrders: (count) => (count === 1 ? "1 order waiting to ship" : `${count} orders waiting to ship`),
|
||||
toDoReturns: (count) => (count === 1 ? "1 new return" : `${count} new returns`),
|
||||
toDoReviews: (count) => (count === 1 ? "1 review awaiting approval" : `${count} reviews awaiting approval`),
|
||||
toDoInquiries: (count) => (count === 1 ? "1 new business inquiry" : `${count} new business inquiries`),
|
||||
allDoneTitle: "All done.",
|
||||
allDoneText: "Nothing is waiting for you right now. Time for the bees.",
|
||||
chartTooltip: (day, value) => `${day}: ${value}`,
|
||||
},
|
||||
adminContentPage: {
|
||||
backToDashboard: "Back to dashboard",
|
||||
@@ -1294,6 +1307,22 @@ export const en: Dictionary = {
|
||||
closeMenu: "Close menu",
|
||||
loggedInAs: (name) => `Signed in as ${name}`,
|
||||
logout: "Sign out",
|
||||
groupSales: "Sales",
|
||||
groupRange: "Range",
|
||||
groupCustomers: "Customers",
|
||||
groupSite: "Site",
|
||||
paletteOpen: "Quick search",
|
||||
paletteShortcut: "Ctrl K",
|
||||
palettePlaceholder: "Where to? Search a page or action …",
|
||||
paletteNoResults: "Nothing found.",
|
||||
paletteSectionPages: "Pages",
|
||||
paletteSectionActions: "Actions",
|
||||
actionNewProduct: "Create new product",
|
||||
actionNewVoucher: "Create new voucher",
|
||||
actionNewUser: "Create new account",
|
||||
actionNewShippingTier: "Create new shipping tier",
|
||||
actionViewShop: "View shop",
|
||||
badgeWaiting: (count) => `${count} waiting`,
|
||||
twoFactorWarning:
|
||||
"This admin account doesn't have two-factor authentication enabled yet, recommended for accounts with access to orders, refunds, and customer data.",
|
||||
twoFactorSetupLink: "Set up now →",
|
||||
|
||||
@@ -895,6 +895,18 @@ export interface Dictionary {
|
||||
noVouchersYet: string;
|
||||
usedCountLabel: (count: number, maxUses: number | null) => string;
|
||||
viewAllOrders: string;
|
||||
greeting: (part: "morning" | "day" | "evening", name: string) => string;
|
||||
todayRevenueLabel: string;
|
||||
monthRevenueLabel: string;
|
||||
vsYesterday: (delta: string, up: boolean) => string;
|
||||
toDoHeading: string;
|
||||
toDoOrders: (count: number) => string;
|
||||
toDoReturns: (count: number) => string;
|
||||
toDoReviews: (count: number) => string;
|
||||
toDoInquiries: (count: number) => string;
|
||||
allDoneTitle: string;
|
||||
allDoneText: string;
|
||||
chartTooltip: (day: string, value: string) => string;
|
||||
};
|
||||
adminContentPage: {
|
||||
backToDashboard: string;
|
||||
@@ -964,6 +976,22 @@ export interface Dictionary {
|
||||
closeMenu: string;
|
||||
loggedInAs: (name: string) => string;
|
||||
logout: string;
|
||||
groupSales: string;
|
||||
groupRange: string;
|
||||
groupCustomers: string;
|
||||
groupSite: string;
|
||||
paletteOpen: string;
|
||||
paletteShortcut: string;
|
||||
palettePlaceholder: string;
|
||||
paletteNoResults: string;
|
||||
paletteSectionPages: string;
|
||||
paletteSectionActions: string;
|
||||
actionNewProduct: string;
|
||||
actionNewVoucher: string;
|
||||
actionNewUser: string;
|
||||
actionNewShippingTier: string;
|
||||
actionViewShop: string;
|
||||
badgeWaiting: (count: number) => string;
|
||||
twoFactorWarning: string;
|
||||
twoFactorSetupLink: string;
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user