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
-
+
-
+
+