@fayz-ai/plugin-orders 0.11.2 → 0.12.0

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.
Files changed (37) hide show
  1. package/dist/OrdersPage-IKIIQALX.js +450 -0
  2. package/dist/OrdersPage-IKIIQALX.js.map +1 -0
  3. package/dist/chunk-TYS3LCKX.js +57 -0
  4. package/dist/chunk-TYS3LCKX.js.map +1 -0
  5. package/dist/context.d.ts +9 -0
  6. package/dist/context.d.ts.map +1 -1
  7. package/dist/data/core-supabase.d.ts +26 -0
  8. package/dist/data/core-supabase.d.ts.map +1 -0
  9. package/dist/data/mock.d.ts.map +1 -1
  10. package/dist/data/platform.d.ts +1 -1
  11. package/dist/index.d.ts +59 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +608 -38
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/floor-plan-id.d.ts +13 -0
  16. package/dist/lib/floor-plan-id.d.ts.map +1 -0
  17. package/dist/locales/en.d.ts.map +1 -1
  18. package/dist/locales/pt-BR.d.ts.map +1 -1
  19. package/dist/store.d.ts +5 -1
  20. package/dist/store.d.ts.map +1 -1
  21. package/dist/types.d.ts +20 -3
  22. package/dist/types.d.ts.map +1 -1
  23. package/dist/views/CommercialOrdersScreen.d.ts +3 -0
  24. package/dist/views/CommercialOrdersScreen.d.ts.map +1 -0
  25. package/dist/views/OrderReceivableActions.d.ts +12 -0
  26. package/dist/views/OrderReceivableActions.d.ts.map +1 -0
  27. package/dist/views/OrdersPage.d.ts +7 -1
  28. package/dist/views/OrdersPage.d.ts.map +1 -1
  29. package/dist/views/OrdersScreen.d.ts +3 -0
  30. package/dist/views/OrdersScreen.d.ts.map +1 -0
  31. package/package.json +5 -3
  32. package/dist/OrdersPage-CQ7O74ZW.js +0 -155
  33. package/dist/OrdersPage-CQ7O74ZW.js.map +0 -1
  34. package/dist/chunk-MTVIXIPL.js +0 -23
  35. package/dist/chunk-MTVIXIPL.js.map +0 -1
  36. package/dist/views/OrderKanbanView.d.ts +0 -3
  37. package/dist/views/OrderKanbanView.d.ts.map +0 -1
@@ -0,0 +1,13 @@
1
+ /**
2
+ * O id sob o qual a planta do salão se anuncia no registro de componentes.
3
+ *
4
+ * Uma cópia da constante, não um import de `@fayz-ai/plugin-tables`: os dois
5
+ * plugins são independentes de propósito — uma lanchonete de balcão tem pedido
6
+ * e não tem salão — e um import aqui faria o plugin de mesas virar dependência
7
+ * de todo app que mostra pedidos. O acoplamento é a string, e ela é combinada
8
+ * em dois lugares porque nenhum dos dois pode ser dono do outro.
9
+ *
10
+ * Mantido em par com `FLOOR_PLAN_COMPONENT_ID` de `@fayz-ai/plugin-tables`.
11
+ */
12
+ export declare const FLOOR_PLAN_COMPONENT_ID = "tables.floor-plan";
13
+ //# sourceMappingURL=floor-plan-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floor-plan-id.d.ts","sourceRoot":"","sources":["../../src/lib/floor-plan-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,sBAAsB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoDrC,CAAA"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6ErC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoDvC,CAAA"}
1
+ {"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6EvC,CAAA"}
package/dist/store.d.ts CHANGED
@@ -25,5 +25,9 @@ export interface OrdersUIState {
25
25
  addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<void>;
26
26
  removeOrderItem(itemId: string): Promise<void>;
27
27
  }
28
- export declare function createOrdersStore(provider: OrdersDataProvider): StoreApi<OrdersUIState>;
28
+ export interface OrdersLifecycleHooks {
29
+ onOrderCompleted?: (order: RestaurantOrder) => Promise<void>;
30
+ onOrderCancelled?: (order: RestaurantOrder) => Promise<void>;
31
+ }
32
+ export declare function createOrdersStore(provider: OrdersDataProvider, hooks?: OrdersLifecycleHooks): StoreApi<OrdersUIState>;
29
33
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EACV,eAAe,EAAE,aAAa,EAC9B,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAClD,sBAAsB,EACvB,MAAM,SAAS,CAAA;AAOhB,MAAM,WAAW,aAAa;IAE5B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;IAEtB,YAAY,EAAE,eAAe,EAAE,CAAA;IAC/B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;IAC7B,cAAc,EAAE,OAAO,CAAA;IAEvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAG9B,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,YAAY,CAAC,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACpC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC9D,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/C;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,QAAQ,CAAC,aAAa,CAAC,CA+IvF"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAI5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EACV,eAAe,EAAE,aAAa,EAC9B,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAClD,sBAAsB,EACvB,MAAM,SAAS,CAAA;AA0BhB,MAAM,WAAW,aAAa;IAE5B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;IAEtB,YAAY,EAAE,eAAe,EAAE,CAAA;IAC/B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;IAC7B,cAAc,EAAE,OAAO,CAAA;IAEvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAG9B,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,YAAY,CAAC,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACpC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC9D,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7D;AAoCD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,GAAE,oBAAyB,GAC/B,QAAQ,CAAC,aAAa,CAAC,CA2KzB"}
package/dist/types.d.ts CHANGED
@@ -1,12 +1,29 @@
1
1
  export type OrderKind = 'dine_in' | 'takeout' | 'delivery';
2
- export type DineInStatus = 'new' | 'confirmed' | 'preparing' | 'ready' | 'served' | 'completed' | 'cancelled';
3
- export type TakeoutStatus = 'new' | 'confirmed' | 'preparing' | 'ready' | 'picked_up' | 'completed' | 'cancelled';
4
- export type DeliveryStatus = 'new' | 'confirmed' | 'preparing' | 'ready' | 'dispatched' | 'delivered' | 'completed' | 'cancelled';
2
+ export type DineInStatus = 'draft' | 'new' | 'confirmed' | 'preparing' | 'ready' | 'served' | 'completed' | 'cancelled';
3
+ export type TakeoutStatus = 'draft' | 'new' | 'confirmed' | 'preparing' | 'ready' | 'picked_up' | 'completed' | 'cancelled';
4
+ export type DeliveryStatus = 'draft' | 'new' | 'confirmed' | 'preparing' | 'ready' | 'dispatched' | 'delivered' | 'completed' | 'cancelled';
5
5
  export type OrderStatus = DineInStatus | TakeoutStatus | DeliveryStatus;
6
6
  /** Unified columns for the kanban board */
7
7
  export type KanbanColumn = 'new' | 'confirmed' | 'preparing' | 'ready' | 'out' | 'completed' | 'cancelled';
8
8
  export declare const STATUS_FLOW: Record<OrderKind, OrderStatus[]>;
9
9
  export declare function getNextStatus(kind: OrderKind, current: OrderStatus): OrderStatus | null;
10
+ /**
11
+ * O VERBO de cada passo — o que o botão FAZ, não o estado a que chega.
12
+ *
13
+ * "Avançar" é a palavra do desenvolvedor: descreve o movimento no diagrama, e
14
+ * não o ato. Quem está no salão numa sexta cheia não avança um pedido, ele
15
+ * confirma, prepara, serve ou despacha — e a diferença aparece justamente no
16
+ * cartão, que é onde a decisão é tomada sem abrir nada.
17
+ *
18
+ * Chaveado pelo estado ALVO, porque é o alvo que nomeia o ato: `getNextStatus`
19
+ * já sabe qual é, inclusive no passo que cada espécie chama de um jeito (o
20
+ * salão serve, o balcão entrega, o motoboy despacha — um passo, quatro
21
+ * vocabulários; ver OUT_STATUSES acima).
22
+ *
23
+ * `draft → new` é "Enviar" e não "Novo": o rascunho existe porque "a cozinha só
24
+ * vê depois de enviada", e enviar é literalmente o que o botão faz.
25
+ */
26
+ export declare const ADVANCE_VERB: Record<OrderStatus, string>;
10
27
  export declare function getPreviousStatus(kind: OrderKind, current: OrderStatus): OrderStatus | null;
11
28
  export declare function mapToKanbanColumn(status: OrderStatus): KanbanColumn;
12
29
  export declare const KANBAN_COLUMNS: KanbanColumn[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAA;AACvH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAA;AAC3H,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAA;AAC3I,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,CAAA;AAEvE,2CAA2C;AAC3C,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,CAAA;AAc1G,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,CAIxD,CAAA;AASD,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAavF;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAYpD,CAAA;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAI3F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAMnE;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EAAmE,CAAA;AAM5G,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,EAAE,CAAA;IAEd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,mBAAmB,EAAE,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,oBAAoB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,WAAW,CAAA;CACpB;AAMD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAA;IAC9B,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd;AAMD,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACvC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrE;AAMD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,sBAAsB,EAAE,iBAAiB,EAWrD,CAAA"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function CommercialOrdersScreen(): React.JSX.Element;
3
+ //# sourceMappingURL=CommercialOrdersScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommercialOrdersScreen.d.ts","sourceRoot":"","sources":["../../src/views/CommercialOrdersScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwDzB,wBAAgB,sBAAsB,sBAiGrC"}
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { type OrderReceivable } from '@fayz-ai/admin';
3
+ export interface OrderReceivableActionsProps {
4
+ orderId: string;
5
+ /** O total do pedido — nao ha o que receber de um pedido que nao vale nada. */
6
+ orderTotal: number;
7
+ receivable: OrderReceivable | null;
8
+ /** `force` porque faturar e receber precisam enxergar a propria escrita. */
9
+ reload: (force?: boolean) => Promise<void>;
10
+ }
11
+ export declare function OrderReceivableActions({ orderId, orderTotal, receivable, reload }: OrderReceivableActionsProps): React.JSX.Element;
12
+ //# sourceMappingURL=OrderReceivableActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderReceivableActions.d.ts","sourceRoot":"","sources":["../../src/views/OrderReceivableActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAmD7F,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,4EAA4E;IAC5E,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAED,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,2BAA2B,qBAiH9G"}
@@ -4,10 +4,16 @@ import { type ResolvedOrdersConfig } from '../context';
4
4
  import type { OrdersDataProvider } from '../data/types';
5
5
  import type { OrdersUIState } from '../store';
6
6
  import type { PluginRegistryDef } from '@fayz-ai/core';
7
- export declare function OrdersPage({ config, provider, store, registries }: {
7
+ export declare function OrdersPage({ config, provider, store, variant }: {
8
8
  config: ResolvedOrdersConfig;
9
9
  provider: OrdersDataProvider;
10
10
  store: StoreApi<OrdersUIState>;
11
11
  registries?: PluginRegistryDef[];
12
+ /**
13
+ * Which vocabulary the screen speaks (#334, #336). The restaurant watches a
14
+ * service in progress; a salon or a clinic looks a Venda up and asks whether
15
+ * it produced a Título. Same archetype, same board, different columns.
16
+ */
17
+ variant?: 'restaurant' | 'commercial';
12
18
  }): React.JSX.Element;
13
19
  //# sourceMappingURL=OrdersPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrdersPage.d.ts","sourceRoot":"","sources":["../../src/views/OrdersPage.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,YAAY,CAAA;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,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
+ {"version":3,"file":"OrdersPage.d.ts","sourceRoot":"","sources":["../../src/views/OrdersPage.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,YAAY,CAAA;AAG7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;IAC9E,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAA;IAC9B,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,CAAA;CACtC,qBAMA"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function OrdersScreen(): React.JSX.Element;
3
+ //# sourceMappingURL=OrdersScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrdersScreen.d.ts","sourceRoot":"","sources":["../../src/views/OrdersScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AA4JzB,wBAAgB,YAAY,sBA2S3B"}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "menu"
7
7
  ]
8
8
  },
9
- "version": "0.11.2",
9
+ "version": "0.12.0",
10
10
  "description": "Fayz SDK — plugin-orders plugin",
11
11
  "type": "module",
12
12
  "sideEffects": false,
@@ -30,9 +30,11 @@
30
30
  "sonner": "^2.0.7"
31
31
  },
32
32
  "dependencies": {
33
- "@fayz-ai/core": "^0.17.0",
33
+ "@fayz-ai/core": "^0.19.0",
34
34
  "@fayz-ai/sdk": "^0.15.0",
35
- "@fayz-ai/admin": "^0.17.0"
35
+ "@fayz-ai/admin": "^0.19.0",
36
+ "@fayz-ai/plugin-financial": "^0.13.0",
37
+ "@fayz-ai/ui": "^0.19.0"
36
38
  },
37
39
  "devDependencies": {
38
40
  "@types/react": "^18.3.0",
@@ -1,155 +0,0 @@
1
- import { mapToKanbanColumn, KANBAN_COLUMNS, getNextStatus } from './chunk-MTVIXIPL.js';
2
- import { createPluginContext, formatCurrency } from '@fayz-ai/admin';
3
- import { useEffect, useMemo } from 'react';
4
- import { ClipboardList, Clock, ChevronRight } from 'lucide-react';
5
- import { useTranslation } from '@fayz-ai/core';
6
- import { jsx, jsxs } from 'react/jsx-runtime';
7
-
8
- var ctx = createPluginContext("OrdersPage");
9
- var OrdersContextProvider = ctx.ContextProvider;
10
- var useOrdersConfig = ctx.useConfig;
11
- ctx.useProvider;
12
- var useOrdersStore = ctx.useStore;
13
- var COLUMN_CONFIG = {
14
- new: { color: "bg-violet-500" },
15
- confirmed: { color: "bg-blue-500" },
16
- preparing: { color: "bg-amber-500" },
17
- ready: { color: "bg-emerald-500" },
18
- out: { color: "bg-cyan-500" },
19
- completed: { color: "bg-gray-400" },
20
- cancelled: { color: "bg-red-500" }
21
- };
22
- function timeAgo(dateStr) {
23
- const diff = Math.floor((Date.now() - new Date(dateStr).getTime()) / 6e4);
24
- if (diff < 1) return "just now";
25
- if (diff === 1) return "1min";
26
- return `${diff}min`;
27
- }
28
- function OrderCard({
29
- order,
30
- onAdvance,
31
- onSelect,
32
- currency
33
- }) {
34
- const t = useTranslation();
35
- const sourceLabel = t(`orders.source.${order.source}`) !== `orders.source.${order.source}` ? t(`orders.source.${order.source}`) : order.source;
36
- return /* @__PURE__ */ jsxs(
37
- "div",
38
- {
39
- className: "rounded-card border bg-card p-3 hover:shadow-md transition-shadow cursor-pointer",
40
- onClick: onSelect,
41
- children: [
42
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
43
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold", children: order.referenceNumber }),
44
- /* @__PURE__ */ jsx("span", { className: "inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium", children: sourceLabel })
45
- ] }),
46
- order.partyName && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium truncate", children: order.partyName }),
47
- order.tableName && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: order.tableName }),
48
- order.items.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-2 space-y-0.5", children: order.items.map((item) => /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground truncate", children: [
49
- item.quantity,
50
- "x ",
51
- item.name
52
- ] }, item.id)) }),
53
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mt-3 pt-2 border-t", children: [
54
- /* @__PURE__ */ jsx("span", { className: "text-sm font-bold", children: formatCurrency(order.total, currency) }),
55
- /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-0.5 text-[10px] text-muted-foreground", children: [
56
- /* @__PURE__ */ jsx(Clock, { className: "h-3 w-3" }),
57
- timeAgo(order.createdAt)
58
- ] })
59
- ] }),
60
- onAdvance && /* @__PURE__ */ jsxs(
61
- "button",
62
- {
63
- type: "button",
64
- className: "mt-2 flex w-full items-center justify-center gap-1 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
65
- onClick: (e) => {
66
- e.stopPropagation();
67
- onAdvance();
68
- },
69
- children: [
70
- t("orders.kanban.advance"),
71
- /* @__PURE__ */ jsx(ChevronRight, { className: "h-3 w-3" })
72
- ]
73
- }
74
- )
75
- ]
76
- }
77
- );
78
- }
79
- function SkeletonColumn() {
80
- return /* @__PURE__ */ jsxs("div", { className: "flex-shrink-0 w-72", children: [
81
- /* @__PURE__ */ jsx("div", { className: "h-9 rounded-lg bg-muted animate-pulse mb-3" }),
82
- /* @__PURE__ */ jsx("div", { className: "space-y-3", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx("div", { className: "h-32 rounded-lg bg-muted/60 animate-pulse" }, i)) })
83
- ] });
84
- }
85
- function OrderKanbanView() {
86
- const t = useTranslation();
87
- const config = useOrdersConfig();
88
- const activeOrders = useOrdersStore((s) => s.activeOrders);
89
- const activeOrdersLoading = useOrdersStore((s) => s.activeOrdersLoading);
90
- const fetchActiveOrders = useOrdersStore((s) => s.fetchActiveOrders);
91
- const advanceOrderStatus = useOrdersStore((s) => s.advanceOrderStatus);
92
- const selectOrder = useOrdersStore((s) => s.selectOrder);
93
- useEffect(() => {
94
- fetchActiveOrders();
95
- }, [fetchActiveOrders]);
96
- const grouped = useMemo(() => {
97
- const map = {
98
- new: [],
99
- confirmed: [],
100
- preparing: [],
101
- ready: [],
102
- out: [],
103
- completed: [],
104
- cancelled: []
105
- };
106
- for (const order of activeOrders) {
107
- const col = mapToKanbanColumn(order.status);
108
- map[col].push(order);
109
- }
110
- return map;
111
- }, [activeOrders]);
112
- if (activeOrdersLoading && activeOrders.length === 0) {
113
- return /* @__PURE__ */ jsx("div", { className: "flex gap-4 overflow-x-auto pb-4", children: KANBAN_COLUMNS.map((col) => /* @__PURE__ */ jsx(SkeletonColumn, {}, col)) });
114
- }
115
- if (!activeOrdersLoading && activeOrders.length === 0) {
116
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-64 text-center", children: [
117
- /* @__PURE__ */ jsx(ClipboardList, { className: "h-12 w-12 text-muted-foreground/40 mb-3" }),
118
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: t("orders.kanban.noOrders") }),
119
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground/70 mt-1", children: t("orders.kanban.noOrdersDesc") })
120
- ] });
121
- }
122
- return /* @__PURE__ */ jsx("div", { className: "flex gap-4 overflow-x-auto pb-4", children: KANBAN_COLUMNS.map((col) => {
123
- const columnOrders = grouped[col];
124
- const colConfig = COLUMN_CONFIG[col];
125
- const label = t(`orders.kanban.column.${col}`);
126
- const hasNext = (order) => getNextStatus(order.kind, order.status) !== null;
127
- return /* @__PURE__ */ jsxs("div", { className: "flex-shrink-0 w-72", children: [
128
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 rounded-lg mb-3", children: [
129
- /* @__PURE__ */ jsx("span", { className: `h-2.5 w-2.5 rounded-full ${colConfig.color}` }),
130
- /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: label }),
131
- /* @__PURE__ */ jsx("span", { className: "ml-auto inline-flex items-center justify-center rounded-full bg-muted px-2 py-0.5 text-xs font-medium", children: columnOrders.length })
132
- ] }),
133
- /* @__PURE__ */ jsxs("div", { className: "space-y-3 max-h-[calc(100vh-16rem)] overflow-y-auto pr-1", children: [
134
- columnOrders.map((order) => /* @__PURE__ */ jsx(
135
- OrderCard,
136
- {
137
- order,
138
- currency: config.currency,
139
- onSelect: () => selectOrder(order.id),
140
- onAdvance: hasNext(order) ? () => advanceOrderStatus(order.id) : void 0
141
- },
142
- order.id
143
- )),
144
- columnOrders.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-center py-8 text-sm text-muted-foreground rounded-lg border border-dashed", children: t("orders.kanban.noOrders") })
145
- ] })
146
- ] }, col);
147
- }) });
148
- }
149
- function OrdersPage({ config, provider, store, registries }) {
150
- return /* @__PURE__ */ jsx(OrdersContextProvider, { config, provider, store, children: /* @__PURE__ */ jsx(OrderKanbanView, {}) });
151
- }
152
-
153
- export { OrdersPage };
154
- //# sourceMappingURL=OrdersPage-CQ7O74ZW.js.map
155
- //# sourceMappingURL=OrdersPage-CQ7O74ZW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/context.tsx","../src/views/OrderKanbanView.tsx","../src/views/OrdersPage.tsx"],"names":["jsx"],"mappings":"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","file":"OrdersPage-CQ7O74ZW.js","sourcesContent":["import { createPluginContext, formatCurrency, type CurrencyConfig, type EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { OrdersUIState } from './store'\nimport type { RestaurantOrder } from './types'\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface OrdersModules {\n delivery: boolean\n takeout: boolean\n}\n\nexport type OrdersCurrency = CurrencyConfig\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n pageSubtitle: string\n orderSingular: string\n orderPlural: string\n}\n\nexport interface ResolvedOrdersConfig {\n modules: OrdersModules\n labels: OrdersPluginLabels\n currency: OrdersCurrency\n orderSources: OrderSourceOption[]\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n}\n\nconst ctx = createPluginContext<ResolvedOrdersConfig, OrdersDataProvider, OrdersUIState>('OrdersPage')\n\nexport const OrdersContextProvider = ctx.ContextProvider\nexport const useOrdersConfig = ctx.useConfig\nexport const useOrdersProvider = ctx.useProvider\nexport const useOrdersStore = ctx.useStore\n\nexport { formatCurrency }\n","import React, { useEffect, useMemo } from 'react'\nimport { ChevronRight, Clock, Loader2, ClipboardList } from 'lucide-react'\nimport { useOrdersConfig, useOrdersStore, formatCurrency } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n KANBAN_COLUMNS,\n mapToKanbanColumn,\n getNextStatus,\n type KanbanColumn,\n type RestaurantOrder,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Column config\n// ---------------------------------------------------------------------------\n\nconst COLUMN_CONFIG: Record<KanbanColumn, { color: string }> = {\n new: { color: 'bg-violet-500' },\n confirmed: { color: 'bg-blue-500' },\n preparing: { color: 'bg-amber-500' },\n ready: { color: 'bg-emerald-500' },\n out: { color: 'bg-cyan-500' },\n completed: { color: 'bg-gray-400' },\n cancelled: { color: 'bg-red-500' },\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction timeAgo(dateStr: string): string {\n const diff = Math.floor((Date.now() - new Date(dateStr).getTime()) / 60000)\n if (diff < 1) return 'just now'\n if (diff === 1) return '1min'\n return `${diff}min`\n}\n\n// ---------------------------------------------------------------------------\n// Order Card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onAdvance,\n onSelect,\n currency,\n}: {\n order: RestaurantOrder\n onAdvance?: () => void\n onSelect: () => void\n currency: { code: string; locale: string; symbol: string }\n}) {\n const t = useTranslation()\n const sourceLabel = t(`orders.source.${order.source}`) !== `orders.source.${order.source}`\n ? t(`orders.source.${order.source}`)\n : order.source\n\n return (\n <div\n className=\"rounded-card border bg-card p-3 hover:shadow-md transition-shadow cursor-pointer\"\n onClick={onSelect}\n >\n {/* Header: order number + source badge */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-bold\">{order.referenceNumber}</span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium\">\n {sourceLabel}\n </span>\n </div>\n\n {/* Customer + table */}\n {order.partyName && (\n <p className=\"text-sm font-medium truncate\">{order.partyName}</p>\n )}\n {order.tableName && (\n <p className=\"text-xs text-muted-foreground\">{order.tableName}</p>\n )}\n\n {/* Items */}\n {order.items.length > 0 && (\n <div className=\"mt-2 space-y-0.5\">\n {order.items.map((item) => (\n <p key={item.id} className=\"text-xs text-muted-foreground truncate\">\n {item.quantity}x {item.name}\n </p>\n ))}\n </div>\n )}\n\n {/* Total + time */}\n <div className=\"flex items-center justify-between mt-3 pt-2 border-t\">\n <span className=\"text-sm font-bold\">\n {formatCurrency(order.total, currency)}\n </span>\n <span className=\"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeAgo(order.createdAt)}\n </span>\n </div>\n\n {/* Advance button */}\n {onAdvance && (\n <button\n type=\"button\"\n className=\"mt-2 flex w-full items-center justify-center gap-1 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n onAdvance()\n }}\n >\n {t('orders.kanban.advance')}\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Skeleton column (loading state)\n// ---------------------------------------------------------------------------\n\nfunction SkeletonColumn() {\n return (\n <div className=\"flex-shrink-0 w-72\">\n <div className=\"h-9 rounded-lg bg-muted animate-pulse mb-3\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-32 rounded-lg bg-muted/60 animate-pulse\" />\n ))}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// OrderKanbanView\n// ---------------------------------------------------------------------------\n\nexport function OrderKanbanView() {\n const t = useTranslation()\n const config = useOrdersConfig()\n\n const activeOrders = useOrdersStore((s) => s.activeOrders)\n const activeOrdersLoading = useOrdersStore((s) => s.activeOrdersLoading)\n const fetchActiveOrders = useOrdersStore((s) => s.fetchActiveOrders)\n const advanceOrderStatus = useOrdersStore((s) => s.advanceOrderStatus)\n const selectOrder = useOrdersStore((s) => s.selectOrder)\n\n useEffect(() => {\n fetchActiveOrders()\n }, [fetchActiveOrders])\n\n // Group orders by kanban column\n const grouped = useMemo(() => {\n const map: Record<KanbanColumn, RestaurantOrder[]> = {\n new: [],\n confirmed: [],\n preparing: [],\n ready: [],\n out: [],\n completed: [],\n cancelled: [],\n }\n for (const order of activeOrders) {\n const col = mapToKanbanColumn(order.status)\n map[col].push(order)\n }\n return map\n }, [activeOrders])\n\n // Loading state\n if (activeOrdersLoading && activeOrders.length === 0) {\n return (\n <div className=\"flex gap-4 overflow-x-auto pb-4\">\n {KANBAN_COLUMNS.map((col) => (\n <SkeletonColumn key={col} />\n ))}\n </div>\n )\n }\n\n // Empty state\n if (!activeOrdersLoading && activeOrders.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center h-64 text-center\">\n <ClipboardList className=\"h-12 w-12 text-muted-foreground/40 mb-3\" />\n <p className=\"text-sm font-medium text-muted-foreground\">\n {t('orders.kanban.noOrders')}\n </p>\n <p className=\"text-xs text-muted-foreground/70 mt-1\">\n {t('orders.kanban.noOrdersDesc')}\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"flex gap-4 overflow-x-auto pb-4\">\n {KANBAN_COLUMNS.map((col) => {\n const columnOrders = grouped[col]\n const colConfig = COLUMN_CONFIG[col]\n const label = t(`orders.kanban.column.${col}`)\n const hasNext = (order: RestaurantOrder) =>\n getNextStatus(order.kind, order.status) !== null\n\n return (\n <div key={col} className=\"flex-shrink-0 w-72\">\n {/* Column header */}\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg mb-3\">\n <span className={`h-2.5 w-2.5 rounded-full ${colConfig.color}`} />\n <span className=\"text-sm font-semibold\">{label}</span>\n <span className=\"ml-auto inline-flex items-center justify-center rounded-full bg-muted px-2 py-0.5 text-xs font-medium\">\n {columnOrders.length}\n </span>\n </div>\n\n {/* Cards */}\n <div className=\"space-y-3 max-h-[calc(100vh-16rem)] overflow-y-auto pr-1\">\n {columnOrders.map((order) => (\n <OrderCard\n key={order.id}\n order={order}\n currency={config.currency}\n onSelect={() => selectOrder(order.id)}\n onAdvance={hasNext(order) ? () => advanceOrderStatus(order.id) : undefined}\n />\n ))}\n {columnOrders.length === 0 && (\n <div className=\"text-center py-8 text-sm text-muted-foreground rounded-lg border border-dashed\">\n {t('orders.kanban.noOrders')}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { OrdersContextProvider, type ResolvedOrdersConfig } from '../context'\nimport { OrderKanbanView } from './OrderKanbanView'\nimport type { OrdersDataProvider } from '../data/types'\nimport type { OrdersUIState } from '../store'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\n\nexport function OrdersPage({ config, provider, store, registries }: {\n config: ResolvedOrdersConfig\n provider: OrdersDataProvider\n store: StoreApi<OrdersUIState>\n registries?: PluginRegistryDef[]\n}) {\n return (\n <OrdersContextProvider config={config} provider={provider} store={store}>\n <OrderKanbanView />\n </OrdersContextProvider>\n )\n}\n"]}
@@ -1,23 +0,0 @@
1
- // src/types.ts
2
- var STATUS_FLOW = {
3
- dine_in: ["new", "confirmed", "preparing", "ready", "served", "completed"],
4
- takeout: ["new", "confirmed", "preparing", "ready", "picked_up", "completed"],
5
- delivery: ["new", "confirmed", "preparing", "ready", "dispatched", "delivered", "completed"]
6
- };
7
- function getNextStatus(kind, current) {
8
- const flow = STATUS_FLOW[kind];
9
- const idx = flow.indexOf(current);
10
- return idx >= 0 && idx < flow.length - 1 ? flow[idx + 1] : null;
11
- }
12
- function mapToKanbanColumn(status) {
13
- if (["served", "picked_up", "dispatched", "delivered"].includes(status)) return "out";
14
- if (["new", "confirmed", "preparing", "ready", "completed", "cancelled"].includes(status)) {
15
- return status;
16
- }
17
- return "new";
18
- }
19
- var KANBAN_COLUMNS = ["new", "confirmed", "preparing", "ready", "out", "completed"];
20
-
21
- export { KANBAN_COLUMNS, STATUS_FLOW, getNextStatus, mapToKanbanColumn };
22
- //# sourceMappingURL=chunk-MTVIXIPL.js.map
23
- //# sourceMappingURL=chunk-MTVIXIPL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts"],"names":[],"mappings":";AAsBO,IAAM,WAAA,GAAgD;AAAA,EAC3D,SAAS,CAAC,KAAA,EAAO,aAAa,WAAA,EAAa,OAAA,EAAS,UAAU,WAAW,CAAA;AAAA,EACzE,SAAS,CAAC,KAAA,EAAO,aAAa,WAAA,EAAa,OAAA,EAAS,aAAa,WAAW,CAAA;AAAA,EAC5E,QAAA,EAAU,CAAC,KAAA,EAAO,WAAA,EAAa,aAAa,OAAA,EAAS,YAAA,EAAc,aAAa,WAAW;AAC7F;AAEO,SAAS,aAAA,CAAc,MAAiB,OAAA,EAA0C;AACvF,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAChC,EAAA,OAAO,GAAA,IAAO,KAAK,GAAA,GAAM,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,GAAI,IAAA;AAC7D;AAQO,SAAS,kBAAkB,MAAA,EAAmC;AACnE,EAAA,IAAI,CAAC,UAAU,WAAA,EAAa,YAAA,EAAc,WAAW,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AAChF,EAAA,IAAI,CAAC,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,OAAA,EAAS,aAAa,WAAW,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AACzF,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEO,IAAM,iBAAiC,CAAC,KAAA,EAAO,aAAa,WAAA,EAAa,OAAA,EAAS,OAAO,WAAW","file":"chunk-MTVIXIPL.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Orders Plugin — Pure TypeScript types\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\nexport type OrderKind = 'dine_in' | 'takeout' | 'delivery'\n\nexport type DineInStatus = 'new' | 'confirmed' | 'preparing' | 'ready' | 'served' | 'completed' | 'cancelled'\nexport type TakeoutStatus = 'new' | 'confirmed' | 'preparing' | 'ready' | 'picked_up' | 'completed' | 'cancelled'\nexport type DeliveryStatus = 'new' | 'confirmed' | 'preparing' | 'ready' | 'dispatched' | 'delivered' | 'completed' | 'cancelled'\nexport type OrderStatus = DineInStatus | TakeoutStatus | DeliveryStatus\n\n/** Unified columns for the kanban board */\nexport type KanbanColumn = 'new' | 'confirmed' | 'preparing' | 'ready' | 'out' | 'completed' | 'cancelled'\n\n// ============================================================\n// STATUS FLOW\n// ============================================================\n\nexport const STATUS_FLOW: Record<OrderKind, OrderStatus[]> = {\n dine_in: ['new', 'confirmed', 'preparing', 'ready', 'served', 'completed'],\n takeout: ['new', 'confirmed', 'preparing', 'ready', 'picked_up', 'completed'],\n delivery: ['new', 'confirmed', 'preparing', 'ready', 'dispatched', 'delivered', 'completed'],\n}\n\nexport function getNextStatus(kind: OrderKind, current: OrderStatus): OrderStatus | null {\n const flow = STATUS_FLOW[kind]\n const idx = flow.indexOf(current)\n return idx >= 0 && idx < flow.length - 1 ? flow[idx + 1] : null\n}\n\nexport function getPreviousStatus(kind: OrderKind, current: OrderStatus): OrderStatus | null {\n const flow = STATUS_FLOW[kind]\n const idx = flow.indexOf(current)\n return idx > 0 ? flow[idx - 1] : null\n}\n\nexport function mapToKanbanColumn(status: OrderStatus): KanbanColumn {\n if (['served', 'picked_up', 'dispatched', 'delivered'].includes(status)) return 'out'\n if (['new', 'confirmed', 'preparing', 'ready', 'completed', 'cancelled'].includes(status)) {\n return status as KanbanColumn\n }\n return 'new'\n}\n\nexport const KANBAN_COLUMNS: KanbanColumn[] = ['new', 'confirmed', 'preparing', 'ready', 'out', 'completed']\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** Restaurant order — public.orders + public.orders extension */\nexport interface RestaurantOrder {\n id: string\n referenceNumber: string\n kind: OrderKind\n status: OrderStatus\n partyId?: string\n partyName?: string\n assigneeId?: string\n assigneeName?: string\n locationId?: string\n subtotal: number\n discount: number\n tax: number\n total: number\n currency: string\n notes?: string\n tags: string[]\n // Extension fields\n source: string\n tableId?: string\n tableName?: string\n estimatedMinutes?: number\n items: RestaurantOrderItem[]\n metadata?: Record<string, unknown>\n tenantId: string\n unitId?: string\n createdAt: string\n updatedAt: string\n completedAt?: string\n}\n\nexport interface RestaurantOrderItem {\n id: string\n orderId: string\n productId?: string\n name: string\n description?: string\n quantity: number\n unitPrice: number\n discount: number\n total: number\n sortOrder: number\n modifiers?: string\n kitchenNotes?: string\n metadata?: Record<string, unknown>\n createdAt: string\n}\n\n// ============================================================\n// INPUT TYPES\n// ============================================================\n\nexport interface CreateOrderInput {\n kind: OrderKind\n source?: string\n tableId?: string\n partyId?: string\n assigneeId?: string\n notes?: string\n estimatedMinutes?: number\n items: CreateOrderItemInput[]\n}\n\nexport interface CreateOrderItemInput {\n productId?: string\n name: string\n quantity: number\n unitPrice: number\n discount?: number\n modifiers?: string\n kitchenNotes?: string\n}\n\nexport interface UpdateOrderStatusInput {\n orderId: string\n status: OrderStatus\n}\n\n// ============================================================\n// QUERY TYPES\n// ============================================================\n\nexport interface OrderQuery {\n kind?: OrderKind | OrderKind[]\n status?: OrderStatus | OrderStatus[]\n source?: string\n tableId?: string\n assigneeId?: string\n dateRange?: { from: string; to: string }\n search?: string\n page?: number\n pageSize?: number\n}\n\nexport interface PaginatedResult<T> {\n data: T[]\n total: number\n}\n\n// ============================================================\n// AGGREGATION\n// ============================================================\n\nexport interface OrdersSummary {\n todayOrderCount: number\n todayRevenue: number\n averageTicket: number\n activeOrderCount: number\n ordersByKind: Record<OrderKind, number>\n ordersByStatus: Record<string, number>\n topItems: Array<{ name: string; quantity: number; revenue: number }>\n}\n\n// ============================================================\n// STATUS CONFIG\n// ============================================================\n\nexport interface OrderStatusConfig {\n value: string\n label: string\n color: string\n icon?: string\n}\n\nexport const DEFAULT_STATUS_CONFIGS: OrderStatusConfig[] = [\n { value: 'new', label: 'New', color: '#6366f1', icon: 'PlusCircle' },\n { value: 'confirmed', label: 'Confirmed', color: '#3b82f6', icon: 'CheckCircle' },\n { value: 'preparing', label: 'Preparing', color: '#f59e0b', icon: 'ChefHat' },\n { value: 'ready', label: 'Ready', color: '#10b981', icon: 'Bell' },\n { value: 'served', label: 'Served', color: '#06b6d4', icon: 'Utensils' },\n { value: 'picked_up', label: 'Picked Up', color: '#06b6d4', icon: 'ShoppingBag' },\n { value: 'dispatched', label: 'Dispatched', color: '#8b5cf6', icon: 'Truck' },\n { value: 'delivered', label: 'Delivered', color: '#06b6d4', icon: 'PackageCheck' },\n { value: 'completed', label: 'Completed', color: '#22c55e', icon: 'CircleCheck' },\n { value: 'cancelled', label: 'Cancelled', color: '#ef4444', icon: 'XCircle' },\n]\n"]}
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- export declare function OrderKanbanView(): React.JSX.Element;
3
- //# sourceMappingURL=OrderKanbanView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrderKanbanView.d.ts","sourceRoot":"","sources":["../../src/views/OrderKanbanView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAA;AA2IjD,wBAAgB,eAAe,sBAoG9B"}