From 3200784c5113ac19768c6a7c7b6d6136ca67a189 Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 22 Jul 2026 09:13:31 +0200 Subject: [PATCH 1/6] style(wizard): remove aligned spacing in license-lookup-panel Update mock license keys to CASPOS format and normalize object property alignment to standard single-space style. --- .../wizard/license-lookup-panel.tsx | 146 +++++++++--------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/shop/components/wizard/license-lookup-panel.tsx b/shop/components/wizard/license-lookup-panel.tsx index e8f4dab..7873a6f 100644 --- a/shop/components/wizard/license-lookup-panel.tsx +++ b/shop/components/wizard/license-lookup-panel.tsx @@ -26,46 +26,46 @@ import { lookupLicenseFromLicServer } from '@/lib/actions/licserver-config' // ─── MOCK DATA (until real LicServer API is wired up) ─────────────────────── const MOCK_LICENSES: Record = { 'CAS-2023-PRO-00123': { - licenseKey: 'CAS-2023-PRO-00123', - status: 'active', - product: 'CAS genesisWorld Professional', - edition: 'Professional', - version: '14.1.2', - seats: 10, - customer: 'Mustermann GmbH', - contact: 'Max Mustermann', - issuedAt: '2023-04-01', - expiresAt: '2026-03-31', + licenseKey: 'CAS-2023-PRO-00123', + status: 'active', + product: 'CAS genesisWorld Professional', + edition: 'Professional', + version: '14.1.2', + seats: 10, + customer: 'Mustermann GmbH', + contact: 'Max Mustermann', + issuedAt: '2023-04-01', + expiresAt: '2026-03-31', maintenanceUntil: '2025-03-31', - modules: ['CRM', 'ERP-Link', 'Mobile Client', 'Web Client'], + modules: ['CRM', 'ERP-Link', 'Mobile Client', 'Web Client'], }, - 'CAS-2020-STD-00456': { - licenseKey: 'CAS-2020-STD-00456', - status: 'expired', - product: 'CAS genesisWorld Standard', - edition: 'Standard', - version: '12.0.0', - seats: 5, - customer: 'Beispiel AG', - contact: 'Erika Muster', - issuedAt: '2020-01-15', - expiresAt: '2023-01-14', - maintenanceUntil: '2022-01-14', - modules: ['CRM'], + '995501-00': { + licenseKey: '995501-00', + status: 'expired', + product: 'CASPOS Handel', + edition: 'Standard', + version: '3.12.1', + seats: 1, + customer: 'Beispiel AG', + contact: 'Erika Muster', + issuedAt: '2016-03-14', + expiresAt: '2017-03-14', + maintenanceUntil: '2017-03-14', + modules: ['CASPOS Handel'], }, - 'CAS-2024-ENT-00789': { - licenseKey: 'CAS-2024-ENT-00789', - status: 'active', - product: 'CAS genesisWorld Enterprise', - edition: 'Enterprise', - version: '15.0.0', - seats: 50, - customer: 'Tech Solutions GmbH & Co. KG', - contact: 'Julia Schneider', - issuedAt: '2024-01-01', - expiresAt: '2026-12-31', - maintenanceUntil: '2026-12-31', - modules: ['CRM', 'ERP-Link', 'Mobile Client', 'Web Client', 'AI Assistant', 'Analytics Pro'], + '995500-00': { + licenseKey: '995500-00', + status: 'active', + product: 'CASPOS Handel', + edition: 'Standard', + version: '4.11.2', + seats: 2, + customer: 'Tech Solutions GmbH & Co. KG', + contact: 'Julia Schneider', + issuedAt: '2026-01-01', + expiresAt: '2027-12-31', + maintenanceUntil: '2027-12-31', + modules: ['CASPOS Handel'], }, } @@ -73,18 +73,18 @@ const MOCK_LICENSES: Record = { export type LicenseStatus = 'active' | 'expired' | 'invalid' | 'suspended' export interface LicenseInfo { - licenseKey: string - status: LicenseStatus - product: string - edition: string - version: string - seats: number - customer: string - contact: string - issuedAt: string - expiresAt: string - maintenanceUntil: string - modules: string[] + licenseKey: string + status: LicenseStatus + product: string + edition: string + version: string + seats: number + customer: string + contact: string + issuedAt: string + expiresAt: string + maintenanceUntil: string + modules: string[] } interface LicenseLookupPanelProps { @@ -98,34 +98,34 @@ function statusConfig(status: LicenseStatus) { case 'active': return { label: 'Aktiv', - icon: , - cls: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/40', - ring: 'border-emerald-500/30', - glow: 'shadow-emerald-500/10', + icon: , + cls: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/40', + ring: 'border-emerald-500/30', + glow: 'shadow-emerald-500/10', } case 'expired': return { label: 'Abgelaufen', - icon: , - cls: 'bg-amber-500/20 text-amber-300 border-amber-500/40', - ring: 'border-amber-500/30', - glow: 'shadow-amber-500/10', + icon: , + cls: 'bg-amber-500/20 text-amber-300 border-amber-500/40', + ring: 'border-amber-500/30', + glow: 'shadow-amber-500/10', } case 'suspended': return { label: 'Gesperrt', - icon: , - cls: 'bg-red-500/20 text-red-300 border-red-500/40', - ring: 'border-red-500/30', - glow: 'shadow-red-500/10', + icon: , + cls: 'bg-red-500/20 text-red-300 border-red-500/40', + ring: 'border-red-500/30', + glow: 'shadow-red-500/10', } default: return { label: 'Ungültig', - icon: , - cls: 'bg-red-500/20 text-red-300 border-red-500/40', - ring: 'border-red-500/30', - glow: 'shadow-red-500/10', + icon: , + cls: 'bg-red-500/20 text-red-300 border-red-500/40', + ring: 'border-red-500/30', + glow: 'shadow-red-500/10', } } } @@ -149,13 +149,13 @@ async function lookupLicense(key: string): Promise { // ─── MAIN COMPONENT ─────────────────────────────────────────────────────────── export function LicenseLookupPanel({ onLicenseResolved }: LicenseLookupPanelProps) { - const [licenseKey, setLicenseKey] = useState('') - const [result, setResult] = useState(null) - const [notFound, setNotFound] = useState(false) - const [isPending, startTransition] = useTransition() - const [expanded, setExpanded] = useState(true) + const [licenseKey, setLicenseKey] = useState('') + const [result, setResult] = useState(null) + const [notFound, setNotFound] = useState(false) + const [isPending, startTransition] = useTransition() + const [expanded, setExpanded] = useState(true) const [modulesOpen, setModulesOpen] = useState(false) - const inputRef = useRef(null) + const inputRef = useRef(null) const handleSearch = () => { if (!licenseKey.trim()) return @@ -285,9 +285,9 @@ export function LicenseLookupPanel({ onLicenseResolved }: LicenseLookupPanelProp {' · '} setLicenseKey('CAS-2020-STD-00456')} + onClick={() => setLicenseKey('995501-00')} > - CAS-2020-STD-00456 + 995500-00

From fef1ccd0f5346da484c195ae3eb502f0d6d747a4 Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 22 Jul 2026 11:07:30 +0200 Subject: [PATCH 2/6] style(wizard): rename CAS references to CASPOS Replace all occurrences of 'CAS-Lizenz' and related strings with 'CASPOS' across license-lookup-panel, step-billing, and order-wizard. Update mock key to 995502-00 (GASTRO edition). --- shop/components/order-wizard.tsx | 4 ++-- .../components/wizard/license-lookup-panel.tsx | 18 +++++++++--------- shop/components/wizard/step-billing.tsx | 12 +++++------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/shop/components/order-wizard.tsx b/shop/components/order-wizard.tsx index 708303e..2b0c9ca 100644 --- a/shop/components/order-wizard.tsx +++ b/shop/components/order-wizard.tsx @@ -179,7 +179,7 @@ export function OrderWizard({ return 'one_time' }) - // Falls "one_time" (Kauf) gewählt: optionales Datum der letzten CAS-Lizenzierung + // Falls "one_time" (Kauf) gewählt: optionales Datum der letzten CASPOS-Lizenzierung const [lastLicenseDate, setLastLicenseDate] = useState( initialOrder?.order_data?.last_license_date || '' ) @@ -516,7 +516,7 @@ export function OrderWizard({ setEditingIdx(null) setModuleQuantities({}) setDeviceName('') - + const resetSels: Record = {} categories.forEach(cat => { const isVisible = selectedBillingInterval === 'one_time' ? cat.show_in_kauf !== false : cat.show_in_abo !== false diff --git a/shop/components/wizard/license-lookup-panel.tsx b/shop/components/wizard/license-lookup-panel.tsx index 7873a6f..a75178d 100644 --- a/shop/components/wizard/license-lookup-panel.tsx +++ b/shop/components/wizard/license-lookup-panel.tsx @@ -25,12 +25,12 @@ import { lookupLicenseFromLicServer } from '@/lib/actions/licserver-config' // ─── MOCK DATA (until real LicServer API is wired up) ─────────────────────── const MOCK_LICENSES: Record = { - 'CAS-2023-PRO-00123': { - licenseKey: 'CAS-2023-PRO-00123', + '995502-00': { + licenseKey: '995502-00', status: 'active', - product: 'CAS genesisWorld Professional', - edition: 'Professional', - version: '14.1.2', + product: 'CASPOS', + edition: 'GASTRO', + version: '4.8.6', seats: 10, customer: 'Mustermann GmbH', contact: 'Max Mustermann', @@ -224,7 +224,7 @@ export function LicenseLookupPanel({ onLicenseResolved }: LicenseLookupPanelProp {/* ── Input + Search Button ──────────────────────────────── */}

- Geben Sie Ihre bisherige CAS-Lizenznummer ein, + Geben Sie Ihre bisherige CASPOS-Lizenznummer ein, um Lizenzinformationen automatisch abzurufen.

@@ -242,7 +242,7 @@ export function LicenseLookupPanel({ onLicenseResolved }: LicenseLookupPanelProp setNotFound(false) }} onKeyDown={handleKeyDown} - placeholder="z. B. CAS-2023-PRO-00123" + placeholder="z. B. 995502-00" className="pl-9 pr-8 bg-white/5 border-white/10 text-white placeholder:text-slate-500 focus:border-violet-500/60 focus:ring-violet-500/20 rounded-xl text-sm h-10" /> @@ -278,9 +278,9 @@ export function LicenseLookupPanel({ onLicenseResolved }: LicenseLookupPanelProp Demo:  setLicenseKey('CAS-2023-PRO-00123')} + onClick={() => setLicenseKey('995502-00')} > - CAS-2023-PRO-00123 + 995502-00 {' · '} handleBillingIntervalChange('one_time')} - className={`relative p-6 rounded-2xl border-2 cursor-pointer transition-all duration-300 flex flex-col justify-between h-48 hover:shadow-[0_0_20px_rgba(255,255,255,0.05)] ${ - selectedBillingInterval === 'one_time' + className={`relative p-6 rounded-2xl border-2 cursor-pointer transition-all duration-300 flex flex-col justify-between h-48 hover:shadow-[0_0_20px_rgba(255,255,255,0.05)] ${selectedBillingInterval === 'one_time' ? 'border-primary bg-primary/10 shadow-[0_0_25px_rgba(59,130,246,0.2)]' : 'border-white/5 bg-white/5 hover:border-white/20' - }`} + }`} >
@@ -71,11 +70,10 @@ export function StepBilling({ {/* Option 2: Abo */}
handleBillingIntervalChange('monthly')} - className={`relative p-6 rounded-2xl border-2 cursor-pointer transition-all duration-300 flex flex-col justify-between h-48 hover:shadow-[0_0_20px_rgba(255,255,255,0.05)] ${ - selectedBillingInterval === 'monthly' + className={`relative p-6 rounded-2xl border-2 cursor-pointer transition-all duration-300 flex flex-col justify-between h-48 hover:shadow-[0_0_20px_rgba(255,255,255,0.05)] ${selectedBillingInterval === 'monthly' ? 'border-primary bg-primary/10 shadow-[0_0_25px_rgba(59,130,246,0.2)]' : 'border-white/5 bg-white/5 hover:border-white/20' - }`} + }`} >
@@ -99,7 +97,7 @@ export function StepBilling({
Date: Wed, 22 Jul 2026 12:33:04 +0200 Subject: [PATCH 3/6] feat(dashboard): mark calendar button as planned in quick access Add planned status badge to appointment calendar quick access button. --- shop/components/HomeClient.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/shop/components/HomeClient.tsx b/shop/components/HomeClient.tsx index 1f9dbac..759abde 100644 --- a/shop/components/HomeClient.tsx +++ b/shop/components/HomeClient.tsx @@ -163,6 +163,27 @@ export function HomeClient({ initialUser }: HomeClientProps) { + + +
+
+ +
+
+
+ Termin-Kalender + Geplant +
+ Alle Termine im Überblick +
+
+ +
+
From 2497063e82672fd241034e2bde15c8d285aa69bb Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 22 Jul 2026 12:39:53 +0200 Subject: [PATCH 4/6] fix(dashboard): import Calendar icon in HomeClient Add missing Calendar import from lucide-react. --- shop/components/HomeClient.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/shop/components/HomeClient.tsx b/shop/components/HomeClient.tsx index 759abde..c37e5cc 100644 --- a/shop/components/HomeClient.tsx +++ b/shop/components/HomeClient.tsx @@ -18,6 +18,7 @@ import { Zap, ArrowUpRight, ShieldCheck, + Calendar, Sparkles, Activity } from 'lucide-react' From 61adf76da5c4b4a47896a8cb8af3465e4a58c07b Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 22 Jul 2026 12:45:15 +0200 Subject: [PATCH 5/6] feat(dashboard): align quick access buttons in 3 columns with calendar popup Convert quick access grid to 3 columns and open in-app dialog modal for calendar button. --- shop/components/HomeClient.tsx | 102 +++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 23 deletions(-) diff --git a/shop/components/HomeClient.tsx b/shop/components/HomeClient.tsx index c37e5cc..9850e34 100644 --- a/shop/components/HomeClient.tsx +++ b/shop/components/HomeClient.tsx @@ -22,6 +22,14 @@ import { Sparkles, Activity } from 'lucide-react' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from '@/components/ui/dialog' interface HomeClientProps { initialUser: User | null @@ -30,6 +38,7 @@ interface HomeClientProps { export function HomeClient({ initialUser }: HomeClientProps) { const [user, setUser] = useState(initialUser) const [mounted, setMounted] = useState(false) + const [calendarOpen, setCalendarOpen] = useState(false) useEffect(() => { setMounted(true) @@ -126,23 +135,23 @@ export function HomeClient({ initialUser }: HomeClientProps) { Mein Dashboard Schnellzugriff

-
+
-
-
- +
+
+
Kundenliste - Kunden & Lizenzen verwalten + Verwalten
- + @@ -150,41 +159,42 @@ export function HomeClient({ initialUser }: HomeClientProps) { -
-
- +
+
+
Bestellungen - Aufträge & Status einsehen + Status einsehen
- + - + +
@@ -193,6 +203,52 @@ export function HomeClient({ initialUser }: HomeClientProps) { + {/* Dialog / Popup für Termin-Kalender (Geplant) */} + + + +
+
+ +
+
+ + Termin-Kalender + + In Planung + + +
+
+ + Die direkte Termin-Kalender Integration befindet sich aktuell in der Entwicklung. + Hier können Sie in Kürze Schulungs-, Installations- und Beratungstermine direkt buchen und verwalten. + +
+ +
+
+ Geplante Features: +
+
    +
  • Online-Terminbuchung für Kassen-Installationen
  • +
  • Schulungstermine vereinbaren
  • +
  • Kalender-Synchronisation (Outlook / Google)
  • +
+
+ + + + +
+
+ {/* Grid of modules */}
From 086a893e19593863f6b2044374187220cc3e392d Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 22 Jul 2026 12:54:26 +0200 Subject: [PATCH 6/6] docs(dashboard): clarify calendar popup info for workshops and partners Update calendar modal description to specify workshops (online/onsite), trainings, and Blue Wednesday partner registrations. --- shop/components/HomeClient.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/shop/components/HomeClient.tsx b/shop/components/HomeClient.tsx index 9850e34..d96ede8 100644 --- a/shop/components/HomeClient.tsx +++ b/shop/components/HomeClient.tsx @@ -221,19 +221,19 @@ export function HomeClient({ initialUser }: HomeClientProps) {
- Die direkte Termin-Kalender Integration befindet sich aktuell in der Entwicklung. - Hier können Sie in Kürze Schulungs-, Installations- und Beratungstermine direkt buchen und verwalten. + Der Termin-Kalender bietet in Kürze eine Übersicht für anstehende Schulungen, Online- & Vor-Ort-Workshops sowie Termine für Blauer-Mittwoch-Partner zur direkten Anmeldung.
- Geplante Features: + Geplante Features & Angebote:
    -
  • Online-Terminbuchung für Kassen-Installationen
  • -
  • Schulungstermine vereinbaren
  • -
  • Kalender-Synchronisation (Outlook / Google)
  • +
  • Anmeldung zu Online- & Vor-Ort-Workshops
  • +
  • Anstehende Schulungstermine auf einen Blick
  • +
  • Spezielle Schulungen für Blauer-Mittwoch-Partner
  • +
  • Kalender-Export (.ics / Google / Outlook)