From 71edcfd5502f88aa8a111427338af80ccb7e74b0 Mon Sep 17 00:00:00 2001 From: Emil Date: Tue, 17 Feb 2026 23:42:59 +0100 Subject: [PATCH] Started on new functionality --- .claude/settings.local.json | 7 + .gitignore | 2 + app/(dashboard)/modules/page.tsx | 134 +++++++++++ components/dashboard/DashboardNav.tsx | 65 ++++++ sections-functions.md | 310 ++++++++++++++++++++++++++ 5 files changed, 518 insertions(+) create mode 100644 .claude/settings.local.json create mode 100644 app/(dashboard)/modules/page.tsx create mode 100644 sections-functions.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 00000000..87e97b8d --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "mcp__ide__getDiagnostics" + ] + } +} diff --git a/.gitignore b/.gitignore index 5ef6a520..72adaecd 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +PRD_Modular_Swedish_ERP_Platform.md \ No newline at end of file diff --git a/app/(dashboard)/modules/page.tsx b/app/(dashboard)/modules/page.tsx new file mode 100644 index 00000000..137daaa1 --- /dev/null +++ b/app/(dashboard)/modules/page.tsx @@ -0,0 +1,134 @@ +import Link from 'next/link' +import { + UtensilsCrossed, + BedDouble, + Monitor, + HardHat, + HeartPulse, + Store, + ShoppingCart, + Scissors, + Truck, + Scale, + GraduationCap, + Wheat, + Film, + Dumbbell, + Wrench, + UserPlus, + Factory, + Briefcase, + PartyPopper, + Building, + Layers, + ChevronRight, +} from 'lucide-react' + +const sectors = [ + { name: 'Restaurang & Café', slug: 'restaurang', icon: UtensilsCrossed, description: 'Menyhantering, bordsbokning & kassa' }, + { name: 'Hotell & Boende', slug: 'hotell', icon: BedDouble, description: 'Rumsbokning, gäster & städschema' }, + { name: 'Tech & IT', slug: 'tech', icon: Monitor, description: 'Projekthantering, tid & SLA' }, + { name: 'Bygg & Entreprenad', slug: 'bygg', icon: HardHat, description: 'Projektkalkyler, underentreprenörer' }, + { name: 'Hälsa & Sjukvård', slug: 'halsa', icon: HeartPulse, description: 'Patientbokning, journal & recept' }, + { name: 'Detaljhandel', slug: 'detaljhandel', icon: Store, description: 'Lager, kassa & leverantörer' }, + { name: 'E-handel', slug: 'ehandel', icon: ShoppingCart, description: 'Ordrar, frakt & returer' }, + { name: 'Frisör & Skönhet', slug: 'frisor', icon: Scissors, description: 'Tidsbokning, kunder & produkter' }, + { name: 'Transport & Logistik', slug: 'transport', icon: Truck, description: 'Flotta, rutter & leveranser' }, + { name: 'Juridik & Redovisning', slug: 'juridik', icon: Scale, description: 'Ärenden, tidrapport & klienter' }, + { name: 'Utbildning & Förskola', slug: 'utbildning', icon: GraduationCap, description: 'Schema, elever & närvaro' }, + { name: 'Jordbruk & Livsmedel', slug: 'jordbruk', icon: Wheat, description: 'Skörd, djurhållning & spårbarhet' }, + { name: 'Media & Kommunikation', slug: 'media', icon: Film, description: 'Projekt, innehåll & publicering' }, + { name: 'Fitness & Sport', slug: 'fitness', icon: Dumbbell, description: 'Medlemskap, klasser & pass' }, + { name: 'Fordon & Verkstad', slug: 'fordon', icon: Wrench, description: 'Arbetsorder, delar & fordon' }, + { name: 'Bemanning & HR', slug: 'bemanning', icon: UserPlus, description: 'Kandidater, uppdrag & timmar' }, + { name: 'Tillverkning & Industri', slug: 'tillverkning', icon: Factory, description: 'Produktion, lager & kvalitet' }, + { name: 'Konsult & Rådgivning', slug: 'konsult', icon: Briefcase, description: 'Uppdrag, tid & debitering' }, + { name: 'Event & Underhållning', slug: 'event', icon: PartyPopper, description: 'Evenemang, biljetter & artister' }, + { name: 'Fastighetsförvaltning', slug: 'fastighet', icon: Building, description: 'Objekt, hyresgäster & underhåll' }, +] as const + +export default function ModulesPage() { + return ( +
+ {/* Page header */} +
+

+ Företagsmoduler +

+

+ Välj din bransch för att se anpassade moduler och funktioner. +

+
+ + {/* Visa alla — inline as first item in the grid */} +
+ {/* Visa alla tile */} + +
+ +
+ + Visa alla + + + + {/* Sector tiles */} + {sectors.map((sector) => { + const Icon = sector.icon + return ( + +
+ +
+ + {sector.name} + + + {/* Hover tooltip with description */} +
+
+ {sector.description} +
+
+ + ) + })} +
+ + {/* Compact list below for scanning */} +
+

+ Alla branscher +

+
+ {sectors.map((sector) => { + const Icon = sector.icon + return ( + + + + {sector.name} + + + {sector.description} + + + + ) + })} +
+
+
+ ) +} diff --git a/components/dashboard/DashboardNav.tsx b/components/dashboard/DashboardNav.tsx index b077af61..5d931425 100644 --- a/components/dashboard/DashboardNav.tsx +++ b/components/dashboard/DashboardNav.tsx @@ -24,6 +24,7 @@ import { HelpCircle, ChevronDown, ChevronUp, + Building2, } from 'lucide-react' import type { EntityType } from '@/types' @@ -50,6 +51,7 @@ const navItems: NavItem[] = [ { href: '/receipts', label: 'Kvitton', icon: Camera, group: 'finans' }, { href: '/deductions', label: 'Avdrag', icon: Calculator, group: 'finans' }, { href: '/bookkeeping', label: 'Bokföring', icon: BookOpen, group: 'finans' }, + { href: '/modules', label: 'Företagsmoduler', icon: Building2, group: 'moduler' }, { href: '/import', label: 'Importera', icon: Upload, group: 'övrigt' }, { href: '/reports', label: 'Rapporter', icon: BarChart3, group: 'övrigt' }, { href: '/help', label: 'Hjälp', icon: HelpCircle, group: 'övrigt' }, @@ -59,6 +61,7 @@ const navItems: NavItem[] = [ const groupLabels: Record = { main: 'Huvudmeny', finans: 'Finans', + moduler: 'Företagsmoduler', övrigt: 'Övrigt', } @@ -90,6 +93,7 @@ export default function DashboardNav({ companyName, entityType }: DashboardNavPr const mainItems = filteredItems.filter(i => i.group === 'main') const finansItems = filteredItems.filter(i => i.group === 'finans') + const modulerItems = filteredItems.filter(i => i.group === 'moduler') const övrigtItems = filteredItems.filter(i => i.group === 'övrigt') const mobileNavItems = [ @@ -185,6 +189,40 @@ export default function DashboardNav({ companyName, entityType }: DashboardNavPr {/* Separator */}
+ {/* Moduler group */} +
+

+ {groupLabels.moduler} +

+
+ {modulerItems.map((item) => { + const Icon = item.icon + const active = isActive(item.href) + return ( + + + {item.label} + + ) + })} +
+
+ + {/* Separator */} +
+ {/* Övrigt group - collapsible */}