@fayz-ai/plugin-tables 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"TablesContext.d.ts","sourceRoot":"","sources":["../src/TablesContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAM3C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;CACtB;AAMD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,kBAAkB,CAAA;IAC1B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACrD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACtE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACzD;AAID,eAAO,MAAM,qBAAqB;;;;;EAAsB,CAAA;AACxD,eAAO,MAAM,eAAe,4BAAgB,CAAA;AAC5C,eAAO,MAAM,iBAAiB,0BAAkB,CAAA;AAChD,eAAO,MAAM,cAAc,iDAAe,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/TablesContext.tsx","../src/views/FloorPlanView.tsx","../src/TablesPage.tsx"],"names":["_","t","jsx"],"mappings":"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","file":"TablesPage-IM732NWO.js","sourcesContent":["import { createPluginContext } from '@fayz-ai/saas'\nimport type { TablesDataProvider } from './data/types'\nimport type { TablesUIState } from './store'\nimport type { TableSession } from './types'\n\n// ---------------------------------------------------------------------------\n// Plugin labels\n// ---------------------------------------------------------------------------\n\nexport interface TablesPluginLabels {\n pageTitle: string\n pageSubtitle: string\n tableSingular: string\n tablePlural: string\n sessionSingular: string\n sessionPlural: string\n}\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface TablesModules {\n reservations: boolean\n sessionHistory: boolean\n}\n\nexport interface ResolvedTablesConfig {\n modules: TablesModules\n labels: TablesPluginLabels\n defaultZones: Array<{ name: string; color?: string }>\n onTableSeated?: (session: TableSession) => Promise<string | undefined>\n onTableClosed?: (session: TableSession) => Promise<void>\n}\n\nconst ctx = createPluginContext<ResolvedTablesConfig, TablesDataProvider, TablesUIState>('TablesPage')\n\nexport const TablesContextProvider = ctx.ContextProvider\nexport const useTablesConfig = ctx.useConfig\nexport const useTablesProvider = ctx.useProvider\nexport const useTablesStore = ctx.useStore\n","import React, { useEffect, useMemo } from 'react'\nimport { MapPin, Users, Clock, UtensilsCrossed, Loader2 } from 'lucide-react'\nimport { useTablesConfig, useTablesStore } from '../TablesContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { RestaurantTable, TableStatus } from '../types'\n\n// ---------------------------------------------------------------------------\n// Status config\n// ---------------------------------------------------------------------------\n\nconst statusConfig: Record<TableStatus, { color: string; bg: string }> = {\n available: { color: 'text-success', bg: 'bg-success/10 border-success/30 hover:bg-success/20' },\n occupied: { color: 'text-primary', bg: 'bg-primary/10 border-primary/30 hover:bg-primary/20' },\n reserved: { color: 'text-accent', bg: 'bg-accent/10 border-accent/30 hover:bg-accent/20' },\n cleaning: { color: 'text-muted-foreground', bg: 'bg-muted border-border hover:bg-muted/80' },\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatElapsed(minutes: number | undefined, minLabel: string): string {\n if (minutes == null) return ''\n if (minutes < 60) return `${minutes}${minLabel}`\n const h = Math.floor(minutes / 60)\n const m = minutes % 60\n return m > 0 ? `${h}h ${m}${minLabel}` : `${h}h`\n}\n\nfunction formatCurrency(value: number | undefined): string {\n if (value == null) return ''\n return new Intl.NumberFormat(undefined, { style: 'currency', currency: 'BRL' }).format(value)\n}\n\n// ---------------------------------------------------------------------------\n// Table card\n// ---------------------------------------------------------------------------\n\nfunction TableCard({ table, isSelected, onClick, t }: {\n table: RestaurantTable\n isSelected: boolean\n onClick: () => void\n t: (key: string) => string\n}) {\n const config = statusConfig[table.status]\n const isLarge = table.seats >= 6\n const minLabel = t('tables.floorPlan.min')\n\n return (\n <button\n onClick={onClick}\n className={`\n relative flex flex-col items-center justify-center rounded-lg border-2 p-3 transition-all cursor-pointer\n ${config.bg}\n ${isLarge ? 'col-span-2' : ''}\n ${isSelected ? 'ring-2 ring-primary ring-offset-2' : ''}\n `}\n style={{ minHeight: '120px' }}\n >\n <span className={`text-2xl font-bold ${config.color}`}>{table.number}</span>\n <span className=\"text-xs text-muted-foreground mt-1\">\n {table.seats} {t('tables.floorPlan.seats')}\n </span>\n\n {table.status === 'occupied' && (\n <>\n <span className=\"text-xs font-medium mt-1\">\n {table.currentGuests} {t('tables.detail.guests').toLowerCase()}\n </span>\n <span className=\"text-[10px] text-muted-foreground\">\n {formatElapsed(table.currentElapsedMinutes, minLabel)}\n </span>\n </>\n )}\n\n <span\n className={`\n absolute -top-2 -right-2 text-[10px] px-1.5 py-0.5 rounded-full font-medium border\n ${table.status === 'occupied'\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-secondary text-secondary-foreground border-border'}\n `}\n >\n {t(`tables.floorPlan.${table.status}`)}\n </span>\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Detail sidebar\n// ---------------------------------------------------------------------------\n\nfunction DetailPanel({ table, t }: { table: RestaurantTable; t: (key: string) => string }) {\n const updateTableStatus = useTablesStore(s => s.updateTableStatus)\n const seatGuests = useTablesStore(s => s.seatGuests)\n const closeSession = useTablesStore(s => s.closeSession)\n const minLabel = t('tables.floorPlan.min')\n\n return (\n <div className=\"rounded-lg border bg-card p-5 sticky top-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-bold\">\n {table.name || `#${table.number}`}\n </h3>\n <span\n className={`\n text-xs px-2 py-1 rounded-full font-medium border\n ${table.status === 'occupied'\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-secondary text-secondary-foreground border-border'}\n `}\n >\n {t(`tables.floorPlan.${table.status}`)}\n </span>\n </div>\n\n <dl className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.floorPlan.seats')}</dt>\n <dd className=\"font-medium\">{table.seats}</dd>\n </div>\n {table.zoneName && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.floorPlan.zone')}</dt>\n <dd className=\"font-medium\">{table.zoneName}</dd>\n </div>\n )}\n {table.status === 'occupied' && (\n <>\n {table.currentGuests != null && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.detail.guests')}</dt>\n <dd className=\"font-medium\">{table.currentGuests}</dd>\n </div>\n )}\n {table.currentWaiterName && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.detail.waiter')}</dt>\n <dd className=\"font-medium\">{table.currentWaiterName}</dd>\n </div>\n )}\n {table.currentOrderId && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.floorPlan.order')}</dt>\n <dd className=\"font-medium\">{table.currentOrderId}</dd>\n </div>\n )}\n {table.currentTotal != null && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.detail.total')}</dt>\n <dd className=\"font-bold text-base\">{formatCurrency(table.currentTotal)}</dd>\n </div>\n )}\n {table.currentElapsedMinutes != null && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">{t('tables.detail.elapsed')}</dt>\n <dd className=\"font-medium\">{formatElapsed(table.currentElapsedMinutes, minLabel)}</dd>\n </div>\n )}\n </>\n )}\n </dl>\n\n <div className=\"mt-5 grid grid-cols-2 gap-2\">\n {table.status === 'available' && (\n <button\n className=\"col-span-2 inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={() => seatGuests({ tableId: table.id, guests: 2 })}\n >\n {t('tables.detail.seatGuests')}\n </button>\n )}\n {table.status === 'occupied' && (\n <>\n <button className=\"inline-flex items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground transition-colors\">\n {t('tables.detail.viewOrder')}\n </button>\n <button\n className=\"inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={() => {\n if (table.currentSessionId) closeSession(table.currentSessionId)\n }}\n >\n {t('tables.detail.closeTable')}\n </button>\n </>\n )}\n {table.status === 'cleaning' && (\n <button\n className=\"col-span-2 inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={() => updateTableStatus({ tableId: table.id, status: 'available' })}\n >\n {t('tables.detail.markClean')}\n </button>\n )}\n {table.status === 'reserved' && (\n <>\n <button\n className=\"inline-flex items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground transition-colors\"\n onClick={() => updateTableStatus({ tableId: table.id, status: 'available' })}\n >\n {t('tables.detail.cancel')}\n </button>\n <button\n className=\"inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={() => seatGuests({ tableId: table.id, guests: 2 })}\n >\n {t('tables.floorPlan.checkIn')}\n </button>\n </>\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton\n// ---------------------------------------------------------------------------\n\nfunction FloorPlanSkeleton() {\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-3\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-4 w-20 rounded bg-muted animate-pulse\" />\n ))}\n </div>\n <div className=\"grid lg:grid-cols-[1fr_320px] gap-6\">\n <div className=\"space-y-6\">\n {Array.from({ length: 2 }).map((_, z) => (\n <div key={z} className=\"rounded-lg border bg-card p-5\">\n <div className=\"h-4 w-24 rounded bg-muted animate-pulse mb-4\" />\n <div className=\"grid grid-cols-4 gap-3\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-[120px] rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n </div>\n ))}\n </div>\n <div className=\"h-[300px] rounded-lg bg-muted animate-pulse\" />\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main view\n// ---------------------------------------------------------------------------\n\nexport function FloorPlanView() {\n const t = useTranslation()\n const config = useTablesConfig()\n\n const tables = useTablesStore(s => s.tables)\n const zones = useTablesStore(s => s.zones)\n const tablesLoading = useTablesStore(s => s.tablesLoading)\n const fetchTables = useTablesStore(s => s.fetchTables)\n const fetchZones = useTablesStore(s => s.fetchZones)\n const selectedTableId = useTablesStore(s => s.selectedTableId)\n const selectTable = useTablesStore(s => s.selectTable)\n\n // Fetch on mount\n useEffect(() => {\n fetchTables()\n fetchZones()\n }, [fetchTables, fetchZones])\n\n // Group tables by zone\n const tablesByZone = useMemo(() => {\n const map = new Map<string, { zoneName: string; color?: string; tables: RestaurantTable[] }>()\n\n // Seed zone order from store zones\n for (const zone of zones) {\n map.set(zone.id, { zoneName: zone.name, color: zone.color, tables: [] })\n }\n\n for (const table of tables) {\n const zoneId = table.zone\n if (!map.has(zoneId)) {\n map.set(zoneId, { zoneName: table.zoneName || zoneId, tables: [] })\n }\n map.get(zoneId)!.tables.push(table)\n }\n\n // Filter out empty zones\n return Array.from(map.entries())\n .filter(([, v]) => v.tables.length > 0)\n .map(([id, v]) => ({ id, ...v }))\n }, [tables, zones])\n\n // Summary counts\n const occupiedCount = tables.filter(t => t.status === 'occupied').length\n const availableCount = tables.filter(t => t.status === 'available').length\n\n // Selected table\n const selectedTable = selectedTableId\n ? tables.find(t => t.id === selectedTableId) ?? null\n : null\n\n // Loading state\n if (tablesLoading && tables.length === 0) {\n return <FloorPlanSkeleton />\n }\n\n // Empty state\n if (!tablesLoading && tables.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <UtensilsCrossed className=\"h-12 w-12 text-muted-foreground/40 mb-4\" />\n <h3 className=\"text-lg font-semibold\">{t('tables.floorPlan.noTables')}</h3>\n <p className=\"text-sm text-muted-foreground mt-1\">{t('tables.floorPlan.noTablesDesc')}</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Header: summary + status legend */}\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\n <div>\n <p className=\"text-muted-foreground text-sm\">\n {t('tables.floorPlan.occupiedOf')\n .replace('{occupied}', String(occupiedCount))\n .replace('{available}', String(availableCount))\n .replace('{total}', String(tables.length))}\n </p>\n </div>\n <div className=\"flex gap-3 flex-wrap\">\n {(Object.keys(statusConfig) as TableStatus[]).map(status => (\n <div key={status} className=\"flex items-center gap-1.5 text-xs\">\n <div className={`h-3 w-3 rounded-full ${statusConfig[status].bg} border`} />\n <span className=\"text-muted-foreground\">{t(`tables.floorPlan.${status}`)}</span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Floor plan grid + detail panel */}\n <div className=\"grid lg:grid-cols-[1fr_320px] gap-6\">\n {/* Zone sections */}\n <div className=\"space-y-6\">\n {tablesByZone.map(zone => (\n <div key={zone.id} className=\"rounded-lg border bg-card p-5\">\n <div className=\"flex items-center gap-2 mb-4\">\n {zone.color && (\n <div\n className=\"h-3 w-3 rounded-full border\"\n style={{ backgroundColor: zone.color }}\n />\n )}\n <h3 className=\"text-sm font-semibold text-muted-foreground uppercase tracking-wider\">\n {zone.zoneName}\n </h3>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3\">\n {zone.tables.map(table => (\n <TableCard\n key={table.id}\n table={table}\n isSelected={table.id === selectedTableId}\n onClick={() => selectTable(table.id === selectedTableId ? null : table.id)}\n t={t}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {/* Detail panel / sidebar */}\n <div>\n {selectedTable ? (\n <DetailPanel table={selectedTable} t={t} />\n ) : (\n <div className=\"rounded-lg border bg-card p-8 text-center text-muted-foreground\">\n <MapPin className=\"h-10 w-10 mx-auto mb-3 text-muted-foreground/40\" />\n <p className=\"font-medium\">{t('tables.floorPlan.selectTable')}</p>\n <p className=\"text-sm mt-1\">{t('tables.floorPlan.selectTableDesc')}</p>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { TablesContextProvider, type ResolvedTablesConfig } from './TablesContext'\nimport { FloorPlanView } from './views/FloorPlanView'\nimport type { TablesDataProvider } from './data/types'\nimport type { TablesUIState } from './store'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\n\nexport function TablesPage({ config, provider, store, registries }: {\n config: ResolvedTablesConfig\n provider: TablesDataProvider\n store: StoreApi<TablesUIState>\n registries?: PluginRegistryDef[]\n}) {\n return (\n <TablesContextProvider config={config} provider={provider} store={store}>\n <FloorPlanView />\n </TablesContextProvider>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TablesPage.d.ts","sourceRoot":"","sources":["../src/TablesPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAElF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;IAClE,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAA;IAC9B,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAA;CACjC,qBAMA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAkBtD,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAa/C,CAAA"}
@@ -1,41 +0,0 @@
1
- import { createPluginContext } from '@fayz-ai/saas'
2
- import type { TablesDataProvider } from './data/types'
3
- import type { TablesUIState } from './store'
4
- import type { TableSession } from './types'
5
-
6
- // ---------------------------------------------------------------------------
7
- // Plugin labels
8
- // ---------------------------------------------------------------------------
9
-
10
- export interface TablesPluginLabels {
11
- pageTitle: string
12
- pageSubtitle: string
13
- tableSingular: string
14
- tablePlural: string
15
- sessionSingular: string
16
- sessionPlural: string
17
- }
18
-
19
- // ---------------------------------------------------------------------------
20
- // Resolved config — fully merged, no optionals
21
- // ---------------------------------------------------------------------------
22
-
23
- export interface TablesModules {
24
- reservations: boolean
25
- sessionHistory: boolean
26
- }
27
-
28
- export interface ResolvedTablesConfig {
29
- modules: TablesModules
30
- labels: TablesPluginLabels
31
- defaultZones: Array<{ name: string; color?: string }>
32
- onTableSeated?: (session: TableSession) => Promise<string | undefined>
33
- onTableClosed?: (session: TableSession) => Promise<void>
34
- }
35
-
36
- const ctx = createPluginContext<ResolvedTablesConfig, TablesDataProvider, TablesUIState>('TablesPage')
37
-
38
- export const TablesContextProvider = ctx.ContextProvider
39
- export const useTablesConfig = ctx.useConfig
40
- export const useTablesProvider = ctx.useProvider
41
- export const useTablesStore = ctx.useStore
@@ -1,20 +0,0 @@
1
- import React from 'react'
2
- import type { StoreApi } from 'zustand/vanilla'
3
- import { TablesContextProvider, type ResolvedTablesConfig } from './TablesContext'
4
- import { FloorPlanView } from './views/FloorPlanView'
5
- import type { TablesDataProvider } from './data/types'
6
- import type { TablesUIState } from './store'
7
- import type { PluginRegistryDef } from '@fayz-ai/core'
8
-
9
- export function TablesPage({ config, provider, store, registries }: {
10
- config: ResolvedTablesConfig
11
- provider: TablesDataProvider
12
- store: StoreApi<TablesUIState>
13
- registries?: PluginRegistryDef[]
14
- }) {
15
- return (
16
- <TablesContextProvider config={config} provider={provider} store={store}>
17
- <FloorPlanView />
18
- </TablesContextProvider>
19
- )
20
- }
package/src/data/mock.ts DELETED
@@ -1,322 +0,0 @@
1
- import type {
2
- RestaurantTable, TableSession, Zone,
3
- CreateTableInput, SeatGuestsInput, UpdateTableStatusInput,
4
- TableQuery, TablesSummary, TableShape,
5
- } from '../types'
6
- import type { TablesDataProvider } from './types'
7
-
8
- // ---------------------------------------------------------------------------
9
- // ID generator
10
- // ---------------------------------------------------------------------------
11
-
12
- let uid = 0
13
- function nextId(prefix: string) { return prefix + '-' + (++uid) }
14
-
15
- // ---------------------------------------------------------------------------
16
- // Seed helpers
17
- // ---------------------------------------------------------------------------
18
-
19
- const TENANT = 'mock-tenant'
20
- const NOW = new Date().toISOString()
21
-
22
- function makeTable(
23
- id: string,
24
- number: number,
25
- seats: number,
26
- zone: string,
27
- zoneName: string,
28
- shape: TableShape,
29
- gridCol: number,
30
- gridRow: number,
31
- ): RestaurantTable {
32
- return {
33
- id,
34
- name: `Table ${number}`,
35
- number,
36
- seats,
37
- status: 'available',
38
- zone,
39
- zoneName,
40
- shape,
41
- gridCol,
42
- gridRow,
43
- isActive: true,
44
- tenantId: TENANT,
45
- createdAt: NOW,
46
- updatedAt: NOW,
47
- }
48
- }
49
-
50
- function seedZones(): Zone[] {
51
- return [
52
- { id: nextId('zone'), name: 'Indoor', color: '#3b82f6', sortOrder: 0, isActive: true, tenantId: TENANT, createdAt: NOW },
53
- { id: nextId('zone'), name: 'Outdoor', color: '#22c55e', sortOrder: 1, isActive: true, tenantId: TENANT, createdAt: NOW },
54
- { id: nextId('zone'), name: 'Bar', color: '#f59e0b', sortOrder: 2, isActive: true, tenantId: TENANT, createdAt: NOW },
55
- ]
56
- }
57
-
58
- function seedTables(zones: Zone[]): RestaurantTable[] {
59
- const [indoor, outdoor, bar] = zones
60
-
61
- const tables: RestaurantTable[] = []
62
-
63
- // Indoor zone — tables 1-8, 4x2 grid, alternating 4/6 seats, square/rectangle
64
- for (let i = 0; i < 8; i++) {
65
- const num = i + 1
66
- tables.push(makeTable(
67
- nextId('table'),
68
- num,
69
- i % 2 === 0 ? 4 : 6,
70
- indoor.id,
71
- indoor.name,
72
- i % 2 === 0 ? 'square' : 'rectangle',
73
- (i % 4),
74
- Math.floor(i / 4),
75
- ))
76
- }
77
-
78
- // Outdoor zone — tables 9-10, round, 4 seats
79
- tables.push(makeTable(nextId('table'), 9, 4, outdoor.id, outdoor.name, 'round', 0, 0))
80
- tables.push(makeTable(nextId('table'), 10, 4, outdoor.id, outdoor.name, 'round', 1, 0))
81
-
82
- // Bar zone — tables 11-12, bar shape, 2 seats
83
- tables.push(makeTable(nextId('table'), 11, 2, bar.id, bar.name, 'bar', 0, 0))
84
- tables.push(makeTable(nextId('table'), 12, 2, bar.id, bar.name, 'bar', 1, 0))
85
-
86
- return tables
87
- }
88
-
89
- // ---------------------------------------------------------------------------
90
- // Provider factory
91
- // ---------------------------------------------------------------------------
92
-
93
- export function createMockTablesProvider(): TablesDataProvider {
94
- const zones = seedZones()
95
- const tables = seedTables(zones)
96
- const sessions: TableSession[] = []
97
-
98
- // ------- helpers -------
99
-
100
- function findTable(id: string) {
101
- return tables.find(t => t.id === id) ?? null
102
- }
103
-
104
- function matchesQuery(table: RestaurantTable, query?: TableQuery): boolean {
105
- if (!query) return true
106
- if (query.zone && table.zone !== query.zone) return false
107
- if (query.status) {
108
- const statuses = Array.isArray(query.status) ? query.status : [query.status]
109
- if (!statuses.includes(table.status)) return false
110
- }
111
- if (query.search) {
112
- const s = query.search.toLowerCase()
113
- if (
114
- !table.name.toLowerCase().includes(s) &&
115
- !String(table.number).includes(s) &&
116
- !(table.zoneName ?? '').toLowerCase().includes(s)
117
- ) return false
118
- }
119
- return true
120
- }
121
-
122
- // ------- provider -------
123
-
124
- return {
125
- // ---- Tables ----
126
-
127
- async getTables(query?: TableQuery) {
128
- return tables.filter(t => matchesQuery(t, query))
129
- },
130
-
131
- async getTableById(id: string) {
132
- return findTable(id)
133
- },
134
-
135
- async createTable(input: CreateTableInput) {
136
- const zone = zones.find(z => z.id === input.zone)
137
- const table: RestaurantTable = {
138
- id: nextId('table'),
139
- name: input.name,
140
- number: input.number,
141
- seats: input.seats,
142
- status: 'available',
143
- zone: input.zone,
144
- zoneName: zone?.name,
145
- shape: input.shape ?? 'square',
146
- gridCol: input.gridCol ?? 0,
147
- gridRow: input.gridRow ?? 0,
148
- isActive: true,
149
- tenantId: TENANT,
150
- createdAt: new Date().toISOString(),
151
- updatedAt: new Date().toISOString(),
152
- }
153
- tables.push(table)
154
- return table
155
- },
156
-
157
- async updateTable(id: string, data: Partial<RestaurantTable>) {
158
- const table = findTable(id)
159
- if (!table) throw new Error(`Table ${id} not found`)
160
- Object.assign(table, data, { updatedAt: new Date().toISOString() })
161
- return table
162
- },
163
-
164
- async deleteTable(id: string) {
165
- const idx = tables.findIndex(t => t.id === id)
166
- if (idx !== -1) tables.splice(idx, 1)
167
- },
168
-
169
- async updateTableStatus(input: UpdateTableStatusInput) {
170
- const table = findTable(input.tableId)
171
- if (!table) throw new Error(`Table ${input.tableId} not found`)
172
- table.status = input.status
173
- table.updatedAt = new Date().toISOString()
174
- return table
175
- },
176
-
177
- async updateTablePositions(positions: Array<{ id: string; gridCol: number; gridRow: number }>) {
178
- for (const pos of positions) {
179
- const table = findTable(pos.id)
180
- if (table) {
181
- table.gridCol = pos.gridCol
182
- table.gridRow = pos.gridRow
183
- table.updatedAt = new Date().toISOString()
184
- }
185
- }
186
- },
187
-
188
- // ---- Sessions ----
189
-
190
- async seatGuests(input: SeatGuestsInput) {
191
- const table = findTable(input.tableId)
192
- if (!table) throw new Error(`Table ${input.tableId} not found`)
193
-
194
- const session: TableSession = {
195
- id: nextId('session'),
196
- tableId: input.tableId,
197
- tableName: table.name,
198
- guests: input.guests,
199
- waiterId: input.waiterId,
200
- waiterName: input.waiterId ? `Waiter ${input.waiterId}` : undefined,
201
- seatedAt: new Date().toISOString(),
202
- status: 'active',
203
- notes: input.notes,
204
- tenantId: TENANT,
205
- createdAt: new Date().toISOString(),
206
- }
207
- sessions.push(session)
208
-
209
- // Denormalize onto table
210
- table.status = 'occupied'
211
- table.currentSessionId = session.id
212
- table.currentGuests = input.guests
213
- table.currentWaiterName = session.waiterName
214
- table.currentElapsedMinutes = 0
215
- table.currentTotal = 0
216
- table.updatedAt = new Date().toISOString()
217
-
218
- return session
219
- },
220
-
221
- async closeSession(sessionId: string) {
222
- const session = sessions.find(s => s.id === sessionId)
223
- if (!session) throw new Error(`Session ${sessionId} not found`)
224
-
225
- session.status = 'closed'
226
- session.closedAt = new Date().toISOString()
227
-
228
- // Update table → cleaning
229
- const table = findTable(session.tableId)
230
- if (table) {
231
- table.status = 'cleaning'
232
- table.currentSessionId = undefined
233
- table.currentOrderId = undefined
234
- table.currentGuests = undefined
235
- table.currentWaiterName = undefined
236
- table.currentElapsedMinutes = undefined
237
- table.currentTotal = undefined
238
- table.updatedAt = new Date().toISOString()
239
- }
240
-
241
- return session
242
- },
243
-
244
- async getActiveSessions() {
245
- return sessions.filter(s => s.status === 'active')
246
- },
247
-
248
- async getSessionHistory(tableId?: string) {
249
- const closed = sessions.filter(s => s.status === 'closed')
250
- if (tableId) return closed.filter(s => s.tableId === tableId)
251
- return closed
252
- },
253
-
254
- // ---- Zones ----
255
-
256
- async getZones() {
257
- return [...zones]
258
- },
259
-
260
- async createZone(data: Partial<Zone>) {
261
- const zone: Zone = {
262
- id: nextId('zone'),
263
- name: data.name ?? 'New Zone',
264
- color: data.color,
265
- sortOrder: data.sortOrder ?? zones.length,
266
- isActive: data.isActive ?? true,
267
- tenantId: TENANT,
268
- createdAt: new Date().toISOString(),
269
- }
270
- zones.push(zone)
271
- return zone
272
- },
273
-
274
- async updateZone(id: string, data: Partial<Zone>) {
275
- const zone = zones.find(z => z.id === id)
276
- if (!zone) throw new Error(`Zone ${id} not found`)
277
- Object.assign(zone, data)
278
- return zone
279
- },
280
-
281
- async deleteZone(id: string) {
282
- const idx = zones.findIndex(z => z.id === id)
283
- if (idx !== -1) zones.splice(idx, 1)
284
- },
285
-
286
- // ---- Summary ----
287
-
288
- async getSummary(): Promise<TablesSummary> {
289
- const available = tables.filter(t => t.status === 'available').length
290
- const occupied = tables.filter(t => t.status === 'occupied').length
291
- const reserved = tables.filter(t => t.status === 'reserved').length
292
- const cleaning = tables.filter(t => t.status === 'cleaning').length
293
-
294
- const totalSeats = tables.reduce((sum, t) => sum + t.seats, 0)
295
- const occupiedSeats = tables
296
- .filter(t => t.status === 'occupied')
297
- .reduce((sum, t) => sum + (t.currentGuests ?? t.seats), 0)
298
-
299
- const closedSessions = sessions.filter(s => s.status === 'closed' && s.closedAt)
300
- let averageSessionMinutes = 0
301
- if (closedSessions.length > 0) {
302
- const totalMinutes = closedSessions.reduce((sum, s) => {
303
- const seated = new Date(s.seatedAt).getTime()
304
- const closed = new Date(s.closedAt!).getTime()
305
- return sum + (closed - seated) / 60_000
306
- }, 0)
307
- averageSessionMinutes = Math.round(totalMinutes / closedSessions.length)
308
- }
309
-
310
- return {
311
- totalTables: tables.length,
312
- availableCount: available,
313
- occupiedCount: occupied,
314
- reservedCount: reserved,
315
- cleaningCount: cleaning,
316
- totalSeats,
317
- occupiedSeats,
318
- averageSessionMinutes,
319
- }
320
- },
321
- }
322
- }