@flowselections/floriday-voorraad 1.0.38 → 1.0.39

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 (120) hide show
  1. package/dist-lib/components/TemplatePage.d.ts +1 -1
  2. package/dist-lib/components/TemplatePage.d.ts.map +1 -1
  3. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts +1 -1
  4. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts.map +1 -1
  5. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts +1 -1
  6. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts.map +1 -1
  7. package/dist-lib/components/voorraad/ArtikelWizard.d.ts +1 -1
  8. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  9. package/dist-lib/components/voorraad/ConnectionBadge.d.ts +1 -1
  10. package/dist-lib/components/voorraad/ConnectionBadge.d.ts.map +1 -1
  11. package/dist-lib/components/voorraad/EditArtikelPage.d.ts +1 -1
  12. package/dist-lib/components/voorraad/EditArtikelPage.d.ts.map +1 -1
  13. package/dist-lib/components/voorraad/ExcelExportButton.d.ts +1 -1
  14. package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
  15. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts +1 -1
  16. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts.map +1 -1
  17. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts +1 -1
  18. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts.map +1 -1
  19. package/dist-lib/components/voorraad/FustenPage.d.ts +1 -1
  20. package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
  21. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts +10 -0
  22. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts.map +1 -0
  23. package/dist-lib/components/voorraad/InventorySettingsDrawer.js +99 -0
  24. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts +6 -0
  25. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts.map +1 -0
  26. package/dist-lib/components/voorraad/InventoryStatusBadge.js +43 -0
  27. package/dist-lib/components/voorraad/ModuleHealthCard.d.ts +1 -1
  28. package/dist-lib/components/voorraad/ModuleHealthCard.d.ts.map +1 -1
  29. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts +1 -1
  30. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
  31. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts +1 -1
  32. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts.map +1 -1
  33. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts +1 -1
  34. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts.map +1 -1
  35. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts +1 -1
  36. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -1
  37. package/dist-lib/components/voorraad/ProductLinkCard.d.ts +1 -1
  38. package/dist-lib/components/voorraad/ProductLinkCard.d.ts.map +1 -1
  39. package/dist-lib/components/voorraad/PublicatiesPage.d.ts +1 -1
  40. package/dist-lib/components/voorraad/PublicatiesPage.d.ts.map +1 -1
  41. package/dist-lib/components/voorraad/PublishProgressCard.d.ts +1 -1
  42. package/dist-lib/components/voorraad/PublishProgressCard.d.ts.map +1 -1
  43. package/dist-lib/components/voorraad/PublishReadinessCard.d.ts +1 -1
  44. package/dist-lib/components/voorraad/PublishReadinessCard.d.ts.map +1 -1
  45. package/dist-lib/components/voorraad/StepSamenstelling.d.ts +1 -1
  46. package/dist-lib/components/voorraad/StepSamenstelling.d.ts.map +1 -1
  47. package/dist-lib/components/voorraad/StockBulkButtons.d.ts +1 -1
  48. package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
  49. package/dist-lib/components/voorraad/StockHistoryChart.d.ts +4 -0
  50. package/dist-lib/components/voorraad/StockHistoryChart.d.ts.map +1 -0
  51. package/dist-lib/components/voorraad/StockHistoryChart.js +53 -0
  52. package/dist-lib/components/voorraad/StockPushMonitor.d.ts +1 -1
  53. package/dist-lib/components/voorraad/StockPushMonitor.d.ts.map +1 -1
  54. package/dist-lib/components/voorraad/StockSyncStatus.d.ts +1 -1
  55. package/dist-lib/components/voorraad/StockSyncStatus.d.ts.map +1 -1
  56. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +1 -1
  57. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
  58. package/dist-lib/components/voorraad/ValidationPage.d.ts +1 -1
  59. package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -1
  60. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +1 -1
  61. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -1
  62. package/dist-lib/components/voorraad/VoorraadPage.d.ts +1 -1
  63. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  64. package/dist-lib/components/voorraad/VoorraadPage.js +29 -1
  65. package/dist-lib/components/voorraad/VoorraadPagination.d.ts +1 -1
  66. package/dist-lib/components/voorraad/VoorraadPagination.d.ts.map +1 -1
  67. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts +1 -1
  68. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -1
  69. package/dist-lib/components/voorraad/VoorraadTable.d.ts +10 -2
  70. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  71. package/dist-lib/components/voorraad/VoorraadTable.js +17 -6
  72. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts +1 -1
  73. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts.map +1 -1
  74. package/dist-lib/hooks/useInventorySettings.d.ts +29 -0
  75. package/dist-lib/hooks/useInventorySettings.d.ts.map +1 -0
  76. package/dist-lib/hooks/useInventorySettings.js +62 -0
  77. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1195 -717
  78. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  79. package/dist-lib/integrations/supabase/client.d.ts +1195 -717
  80. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  81. package/dist-lib/integrations/supabase/client.js +1 -1
  82. package/dist-lib/integrations/supabase/client.server.d.ts +1195 -717
  83. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  84. package/dist-lib/integrations/supabase/client.server.js +1 -1
  85. package/dist-lib/integrations/supabase/types.d.ts +1208 -748
  86. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  87. package/dist-lib/lib/floricode-required-features.functions.d.ts +1196 -724
  88. package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -1
  89. package/dist-lib/lib/floriday-2026v1.server.d.ts +77 -0
  90. package/dist-lib/lib/floriday-2026v1.server.d.ts.map +1 -0
  91. package/dist-lib/lib/floriday-2026v1.server.js +178 -0
  92. package/dist-lib/lib/floriday-customer-offer.functions.d.ts +1198 -718
  93. package/dist-lib/lib/floriday-customer-offer.functions.d.ts.map +1 -1
  94. package/dist-lib/lib/floriday-env.functions.d.ts +2180 -1224
  95. package/dist-lib/lib/floriday-env.functions.d.ts.map +1 -1
  96. package/dist-lib/lib/floriday-gateway.functions.d.ts +6852 -3984
  97. package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
  98. package/dist-lib/lib/floriday-stock-supply.server.d.ts +18 -7
  99. package/dist-lib/lib/floriday-stock-supply.server.d.ts.map +1 -1
  100. package/dist-lib/lib/floriday-stock-supply.server.js +70 -68
  101. package/dist-lib/lib/floriday-vbn-required.functions.d.ts +2180 -1224
  102. package/dist-lib/lib/floriday-vbn-required.functions.d.ts.map +1 -1
  103. package/dist-lib/lib/floriday-warehouse.functions.d.ts +3476 -2042
  104. package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -1
  105. package/dist-lib/lib/floriday-writes.functions.d.ts +2180 -1224
  106. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  107. package/dist-lib/lib/inventory-settings.functions.d.ts +47391 -0
  108. package/dist-lib/lib/inventory-settings.functions.d.ts.map +1 -0
  109. package/dist-lib/lib/inventory-settings.functions.js +97 -0
  110. package/dist-lib/lib/module-health.functions.d.ts +2180 -1224
  111. package/dist-lib/lib/module-health.functions.d.ts.map +1 -1
  112. package/dist-lib/lib/stock-sync.functions.d.ts +2180 -1224
  113. package/dist-lib/lib/stock-sync.functions.d.ts.map +1 -1
  114. package/package.json +1 -1
  115. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts +0 -2
  116. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts.map +0 -1
  117. package/dist-lib/components/settings/VoorraadSettingsCard.js +0 -39
  118. package/dist-lib/components/voorraad/ConnectionPicker.d.ts +0 -8
  119. package/dist-lib/components/voorraad/ConnectionPicker.d.ts.map +0 -1
  120. package/dist-lib/components/voorraad/ConnectionPicker.js +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPage.tsx"],"names":[],"mappings":"AAiGA,wBAAgB,YAAY,4CA+O3B"}
1
+ {"version":3,"file":"VoorraadPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPage.tsx"],"names":[],"mappings":"AAqGA,wBAAgB,YAAY,gCAiT3B"}
@@ -11,6 +11,9 @@ import { ExcelExportButton } from "./ExcelExportButton";
11
11
  import { StockBulkButtons } from "./StockBulkButtons";
12
12
  import { VoorraadTable } from "./VoorraadTable";
13
13
  import { VoorraadPagination } from "./VoorraadPagination";
14
+ import { StockHistoryChart } from "./StockHistoryChart";
15
+ import { InventorySettingsDrawer } from "./InventorySettingsDrawer";
16
+ import { useInventorySettings } from "../../hooks/useInventorySettings";
14
17
  function isLinkedToFloriday(i) {
15
18
  return Boolean(i.floridayId) || i.source === "published";
16
19
  }
@@ -37,12 +40,32 @@ function availableOf(i) {
37
40
  export function VoorraadPage() {
38
41
  const { activeId, error: connError } = useFloridayConnection();
39
42
  const { items, loading, error, reload } = useVoorraadData(activeId);
43
+ const { byKey: settingsByKey, reload: reloadSettings } = useInventorySettings(activeId);
40
44
  const [search, setSearch] = useState("");
41
45
  const [stockFilter, setStockFilter] = useState("all");
42
46
  const [floridayFilter, setFloridayFilter] = useState("all");
43
47
  const [typeFilter, setTypeFilter] = useState("all");
44
48
  const [page, setPage] = useState(1);
45
49
  const [pageSize, setPageSize] = useState(25);
50
+ const [selected, setSelected] = useState(new Set());
51
+ const [drawerIds, setDrawerIds] = useState([]);
52
+ const [drawerOpen, setDrawerOpen] = useState(false);
53
+ const toggleSelect = (id) => setSelected((cur) => {
54
+ const next = new Set(cur);
55
+ if (next.has(id))
56
+ next.delete(id);
57
+ else
58
+ next.add(id);
59
+ return next;
60
+ });
61
+ const toggleAll = (ids) => setSelected((cur) => {
62
+ const all = ids.length > 0 && ids.every((id) => cur.has(id));
63
+ return all ? new Set() : new Set(ids);
64
+ });
65
+ const openSettings = (ids) => {
66
+ setDrawerIds(ids);
67
+ setDrawerOpen(true);
68
+ };
46
69
  const counts = useMemo(() => {
47
70
  let inStock = 0;
48
71
  let outOfStock = 0;
@@ -99,5 +122,10 @@ export function VoorraadPage() {
99
122
  return (_jsxs("button", { type: "button", onClick: () => setStockFilter(t.id), className: `relative py-3 px-3 text-sm font-medium whitespace-nowrap transition-colors ${active
100
123
  ? "text-foreground"
101
124
  : "text-muted-foreground hover:text-foreground"}`, children: [t.label, _jsx("span", { className: `ml-2 text-xs ${active ? "text-primary" : "text-muted-foreground/70"}`, children: t.count }), active && (_jsx("span", { className: "absolute left-2 right-2 -bottom-px h-0.5 bg-primary rounded-full" }))] }, t.id));
102
- }) }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 p-4 border-b", children: [_jsxs("div", { className: "relative flex-1 min-w-[220px] max-w-md", children: [_jsx(Search, { className: "w-4 h-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { placeholder: "Zoek op product of artikelnummer...", className: "pl-9", value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(Select, { value: floridayFilter, onValueChange: (v) => setFloridayFilter(v), children: [_jsx(SelectTrigger, { className: "h-9 w-[190px]", children: _jsx(SelectValue, { placeholder: "Floriday" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: "Alle (Floriday)" }), _jsx(SelectItem, { value: "linked", children: "Gekoppeld aan Floriday" }), _jsx(SelectItem, { value: "unlinked", children: "Niet gekoppeld" })] })] }), _jsxs(Select, { value: typeFilter, onValueChange: (v) => setTypeFilter(v), children: [_jsx(SelectTrigger, { className: "h-9 w-[170px]", children: _jsx(SelectValue, { placeholder: "Type" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: "Alle types" }), _jsx(SelectItem, { value: "artikel", children: "Artikel" }), _jsx(SelectItem, { value: "productgroep", children: "Productgroep" }), _jsx(SelectItem, { value: "samenstelling", children: "Samenstelling" })] })] }), _jsxs("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: [_jsx(ExcelExportButton, { items: filtered }), _jsx(StockBulkButtons, { items: items, activeConnectionId: activeId, onImported: reload })] })] }), _jsx("div", { className: "overflow-x-auto", children: _jsx(VoorraadTable, { items: paged, loading: loading }) }), _jsx(VoorraadPagination, { total: filtered.length, page: page, pageSize: pageSize, onPageChange: setPage, onPageSizeChange: setPageSize })] })] }));
125
+ }) }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 p-4 border-b", children: [_jsxs("div", { className: "relative flex-1 min-w-[220px] max-w-md", children: [_jsx(Search, { className: "w-4 h-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { placeholder: "Zoek op product of artikelnummer...", className: "pl-9", value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs(Select, { value: floridayFilter, onValueChange: (v) => setFloridayFilter(v), children: [_jsx(SelectTrigger, { className: "h-9 w-[190px]", children: _jsx(SelectValue, { placeholder: "Floriday" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: "Alle (Floriday)" }), _jsx(SelectItem, { value: "linked", children: "Gekoppeld aan Floriday" }), _jsx(SelectItem, { value: "unlinked", children: "Niet gekoppeld" })] })] }), _jsxs(Select, { value: typeFilter, onValueChange: (v) => setTypeFilter(v), children: [_jsx(SelectTrigger, { className: "h-9 w-[170px]", children: _jsx(SelectValue, { placeholder: "Type" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: "Alle types" }), _jsx(SelectItem, { value: "artikel", children: "Artikel" }), _jsx(SelectItem, { value: "productgroep", children: "Productgroep" }), _jsx(SelectItem, { value: "samenstelling", children: "Samenstelling" })] })] }), _jsxs("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: [_jsx(ExcelExportButton, { items: filtered }), _jsx(StockBulkButtons, { items: items, activeConnectionId: activeId, onImported: reload })] })] }), selected.size > 0 && (_jsxs("div", { className: "flex flex-wrap items-center gap-3 border-b bg-primary/5 px-4 py-2 text-sm", children: [_jsxs("span", { className: "font-medium", children: [selected.size, " geselecteerd"] }), _jsx(Button, { size: "sm", onClick: () => openSettings([...selected]), children: "Voorraadsturing instellen" }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => setSelected(new Set()), children: "Selectie wissen" })] })), _jsx("div", { className: "overflow-x-auto", children: _jsx(VoorraadTable, { items: paged, loading: loading, settingsByKey: settingsByKey, selected: selected, onToggleSelect: toggleSelect, onToggleAll: toggleAll, onOpenSettings: (id) => openSettings([id]) }) }), _jsx(VoorraadPagination, { total: filtered.length, page: page, pageSize: pageSize, onPageChange: setPage, onPageSizeChange: setPageSize })] }), _jsx(StockHistoryChart, { connectionId: activeId ?? null }), _jsx(InventorySettingsDrawer, { open: drawerOpen, onOpenChange: setDrawerOpen, connectionId: activeId ?? null, productIds: drawerIds, current: drawerIds.length === 1
126
+ ? [...settingsByKey.values()].find((s) => s.product_id === drawerIds[0])
127
+ : undefined, onSaved: () => {
128
+ reloadSettings();
129
+ reload();
130
+ } })] }));
103
131
  }
@@ -6,5 +6,5 @@ export interface VoorraadPaginationProps {
6
6
  onPageChange: (page: number) => void;
7
7
  onPageSizeChange: (size: number) => void;
8
8
  }
9
- export declare function VoorraadPagination({ total, page, pageSize, pageSizeOptions, onPageChange, onPageSizeChange, }: VoorraadPaginationProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function VoorraadPagination({ total, page, pageSize, pageSizeOptions, onPageChange, onPageSizeChange, }: VoorraadPaginationProps): import("react").JSX.Element;
10
10
  //# sourceMappingURL=VoorraadPagination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadPagination.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPagination.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,eAAmC,EACnC,YAAY,EACZ,gBAAgB,GACjB,EAAE,uBAAuB,2CAuDzB"}
1
+ {"version":3,"file":"VoorraadPagination.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPagination.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,eAAmC,EACnC,YAAY,EACZ,gBAAgB,GACjB,EAAE,uBAAuB,+BAuDzB"}
@@ -4,6 +4,6 @@ interface Props {
4
4
  draftId?: string | null;
5
5
  productId?: string | null;
6
6
  }
7
- export declare function VoorraadStockCard({ connectionId, tradeItemId, draftId, productId }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export declare function VoorraadStockCard({ connectionId, tradeItemId, draftId, productId }: Props): import("react").JSX.Element;
8
8
  export {};
9
9
  //# sourceMappingURL=VoorraadStockCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadStockCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadStockCard.tsx"],"names":[],"mappings":"AAeA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,2CAkQzF"}
1
+ {"version":3,"file":"VoorraadStockCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadStockCard.tsx"],"names":[],"mappings":"AAeA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,+BAkQzF"}
@@ -1,6 +1,14 @@
1
1
  import type { TradeItem } from "../../lib/floriday-client";
2
- export declare function VoorraadTable({ items, loading, }: {
2
+ import type { InventorySetting } from "../../hooks/useInventorySettings";
3
+ /** Sleutel waarmee een rij aan zijn Floriday-voorraadinstelling wordt gekoppeld. */
4
+ export declare function settingKeyOf(item: TradeItem): string | null;
5
+ export declare function VoorraadTable({ items, loading, settingsByKey, selected, onToggleSelect, onToggleAll, onOpenSettings, }: {
3
6
  items: TradeItem[];
4
7
  loading: boolean;
5
- }): import("react/jsx-runtime").JSX.Element;
8
+ settingsByKey?: Map<string, InventorySetting>;
9
+ selected?: Set<string>;
10
+ onToggleSelect?: (productId: string) => void;
11
+ onToggleAll?: (productIds: string[]) => void;
12
+ onOpenSettings?: (productId: string) => void;
13
+ }): import("react").JSX.Element;
6
14
  //# sourceMappingURL=VoorraadTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadTable.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadTable.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAmB3D,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,GACR,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,2CAmKA"}
1
+ {"version":3,"file":"VoorraadTable.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadTable.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAI3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAiBzE,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,cAAc,GACf,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,+BAoNA"}
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useNavigate } from "@tanstack/react-router";
3
- import { Package } from "lucide-react";
4
- import { Badge } from "@flowselections/core";
3
+ import { Package, Settings2 } from "lucide-react";
4
+ import { Badge, Button, Checkbox } from "@flowselections/core";
5
5
  import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
6
6
  import { formatCustomValue } from "../../lib/voorraad-custom-fields";
7
+ import { InventoryStatusBadge } from "./InventoryStatusBadge";
7
8
  const columns = [
8
9
  { key: "quantity", label: "Liggend" },
9
10
  { key: "minQuantity", label: "Minimum" },
@@ -16,17 +17,25 @@ function customValue(item, key) {
16
17
  const cf = item.raw?.custom_fields;
17
18
  return cf && typeof cf === "object" ? cf[key] : undefined;
18
19
  }
19
- export function VoorraadTable({ items, loading, }) {
20
+ /** Sleutel waarmee een rij aan zijn Floriday-voorraadinstelling wordt gekoppeld. */
21
+ export function settingKeyOf(item) {
22
+ return item.productId ?? item.floridayId ?? (item.source === "published" ? item.id : null);
23
+ }
24
+ export function VoorraadTable({ items, loading, settingsByKey, selected, onToggleSelect, onToggleAll, onOpenSettings, }) {
20
25
  const navigate = useNavigate();
21
26
  const { fields } = useVoorraadCustomFields();
22
27
  const extraColumns = fields.filter((f) => f.show_in_columns);
28
+ const selectableIds = items
29
+ .map((i) => settingsByKey?.get(settingKeyOf(i) ?? "")?.product_id ?? null)
30
+ .filter((v) => Boolean(v));
31
+ const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selected?.has(id));
23
32
  if (loading) {
24
33
  return _jsx("p", { className: "text-sm text-muted-foreground p-6", children: "Voorraad laden..." });
25
34
  }
26
35
  if (items.length === 0) {
27
36
  return (_jsx("p", { className: "text-sm text-muted-foreground p-6", children: "Geen producten gevonden voor deze connectie." }));
28
37
  }
29
- return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/50 text-left", children: _jsxs("tr", { children: [_jsx("th", { className: "p-3 w-14" }), _jsx("th", { className: "p-3", children: "Product" }), _jsx("th", { className: "p-3", children: "Type" }), _jsx("th", { className: "p-3", children: "Artikelnummer" }), columns.map((c) => (_jsx("th", { className: "p-3 text-right whitespace-nowrap", children: c.label }, c.key))), extraColumns.map((f) => (_jsx("th", { className: "p-3 whitespace-nowrap", children: f.field_label }, f.id)))] }) }), _jsx("tbody", { children: items.map((item) => {
38
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/50 text-left", children: _jsxs("tr", { children: [onToggleSelect && (_jsx("th", { className: "p-3 w-10", children: _jsx(Checkbox, { checked: allSelected, onCheckedChange: () => onToggleAll?.(selectableIds), "aria-label": "Alles selecteren" }) })), _jsx("th", { className: "p-3 w-14" }), _jsx("th", { className: "p-3", children: "Product" }), _jsx("th", { className: "p-3", children: "Floriday-sturing" }), _jsx("th", { className: "p-3", children: "Type" }), _jsx("th", { className: "p-3", children: "Artikelnummer" }), columns.map((c) => (_jsx("th", { className: "p-3 text-right whitespace-nowrap", children: c.label }, c.key))), extraColumns.map((f) => (_jsx("th", { className: "p-3 whitespace-nowrap", children: f.field_label }, f.id)))] }) }), _jsx("tbody", { children: items.map((item) => {
30
39
  const low = item.minQuantity > 0 &&
31
40
  item.availableQuantity < item.minQuantity;
32
41
  const linkId = item.productId ?? item.localId ?? item.id;
@@ -37,6 +46,8 @@ export function VoorraadTable({ items, loading, }) {
37
46
  };
38
47
  const floriday = item.floriday ?? null;
39
48
  const thumbUrl = floriday?.photoUrl || item.imageUrl;
49
+ const setting = settingsByKey?.get(settingKeyOf(item) ?? "");
50
+ const settingProductId = setting?.product_id ?? null;
40
51
  return (_jsxs("tr", { className: `border-t hover:bg-muted/30 ${clickable ? "cursor-pointer" : ""}`, onClick: clickable ? open : undefined, role: clickable ? "button" : undefined, tabIndex: clickable ? 0 : undefined, onKeyDown: clickable
41
52
  ? (e) => {
42
53
  if (e.key === "Enter" || e.key === " ") {
@@ -44,11 +55,11 @@ export function VoorraadTable({ items, loading, }) {
44
55
  open();
45
56
  }
46
57
  }
47
- : undefined, "aria-label": clickable ? `Bewerk ${item.name}` : undefined, children: [_jsx("td", { className: "p-2", children: thumbUrl ? (_jsx("img", { src: thumbUrl, alt: item.name, className: "h-10 w-10 rounded object-cover", loading: "lazy" })) : (_jsx("div", { className: "h-10 w-10 rounded bg-muted flex items-center justify-center", children: _jsx(Package, { className: "h-4 w-4 text-muted-foreground" }) })) }), _jsxs("td", { className: "p-3", children: [_jsxs("div", { className: "flex flex-col items-start gap-1", children: [_jsx("span", { className: "font-medium text-foreground", children: item.name }), _jsxs("div", { role: "status", "aria-label": floriday
58
+ : undefined, "aria-label": clickable ? `Bewerk ${item.name}` : undefined, children: [onToggleSelect && (_jsx("td", { className: "p-3", onClick: (e) => e.stopPropagation(), children: _jsx(Checkbox, { checked: settingProductId ? selected?.has(settingProductId) : false, disabled: !settingProductId, onCheckedChange: () => settingProductId && onToggleSelect(settingProductId), "aria-label": `Selecteer ${item.name}` }) })), _jsx("td", { className: "p-2", children: thumbUrl ? (_jsx("img", { src: thumbUrl, alt: item.name, className: "h-10 w-10 rounded object-cover", loading: "lazy" })) : (_jsx("div", { className: "h-10 w-10 rounded bg-muted flex items-center justify-center", children: _jsx(Package, { className: "h-4 w-4 text-muted-foreground" }) })) }), _jsxs("td", { className: "p-3", children: [_jsxs("div", { className: "flex flex-col items-start gap-1", children: [_jsx("span", { className: "font-medium text-foreground", children: item.name }), _jsxs("div", { role: "status", "aria-label": floriday
48
59
  ? "Online in Floriday"
49
60
  : "Niet online in Floriday", title: floriday
50
61
  ? "Online in Floriday"
51
62
  : "Niet online in Floriday", className: "inline-flex items-center gap-1.5 rounded-full border border-border bg-background px-2 py-0.5 text-[11px] font-medium leading-none text-muted-foreground", children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full " +
52
- (floriday ? "bg-emerald-500" : "bg-red-500"), "aria-hidden": true }), _jsx("span", { children: "Floriday" })] })] }), Boolean(customValue(item, "floriday_sync")?.dirty) && (_jsx("div", { className: "mt-1 inline-flex items-center rounded-full bg-amber-100 px-2 py-0.5 text-[11px] font-medium leading-none text-amber-800", title: "Opgeslagen in dit systeem, wacht nog op doorgifte naar Floriday", children: "Wacht op Floriday" })), low && (_jsx("div", { className: "text-xs text-destructive", children: "onder minimumvoorraad" }))] }), _jsx("td", { className: "p-3", children: item.itemType === "productgroep" ? (_jsx(Badge, { className: "bg-indigo-500/15 text-indigo-700 border-indigo-500/30", children: "Productgroep" })) : item.itemType === "samenstelling" ? (_jsx(Badge, { className: "bg-emerald-500/15 text-emerald-700 border-emerald-500/30", children: "Samenstelling" })) : (_jsx(Badge, { variant: "secondary", children: "Artikel" })) }), _jsx("td", { className: "p-3 font-mono text-xs", children: item.articleNumber || "—" }), columns.map((c) => (_jsx("td", { className: "p-3 text-right tabular-nums text-muted-foreground", children: Number(item[c.key] ?? 0) }, c.key))), extraColumns.map((f) => (_jsx("td", { className: "p-3 text-muted-foreground whitespace-nowrap", children: formatCustomValue(customValue(item, f.field_key)) }, f.id)))] }, item.id));
63
+ (floriday ? "bg-emerald-500" : "bg-red-500"), "aria-hidden": true }), _jsx("span", { children: "Floriday" })] })] }), Boolean(customValue(item, "floriday_sync")?.dirty) && (_jsx("div", { className: "mt-1 inline-flex items-center rounded-full bg-amber-100 px-2 py-0.5 text-[11px] font-medium leading-none text-amber-800", title: "Opgeslagen in dit systeem, wacht nog op doorgifte naar Floriday", children: "Wacht op Floriday" })), low && (_jsx("div", { className: "text-xs text-destructive", children: "onder minimumvoorraad" }))] }), _jsx("td", { className: "p-3", onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(InventoryStatusBadge, { setting: setting }), settingProductId && onOpenSettings && (_jsx(Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0", onClick: () => onOpenSettings(settingProductId), "aria-label": `Voorraadsturing van ${item.name}`, children: _jsx(Settings2, { className: "h-4 w-4" }) }))] }) }), _jsx("td", { className: "p-3", children: item.itemType === "productgroep" ? (_jsx(Badge, { className: "bg-indigo-500/15 text-indigo-700 border-indigo-500/30", children: "Productgroep" })) : item.itemType === "samenstelling" ? (_jsx(Badge, { className: "bg-emerald-500/15 text-emerald-700 border-emerald-500/30", children: "Samenstelling" })) : (_jsx(Badge, { variant: "secondary", children: "Artikel" })) }), _jsx("td", { className: "p-3 font-mono text-xs", children: item.articleNumber || "—" }), columns.map((c) => (_jsx("td", { className: "p-3 text-right tabular-nums text-muted-foreground", children: Number(item[c.key] ?? 0) }, c.key))), extraColumns.map((f) => (_jsx("td", { className: "p-3 text-muted-foreground whitespace-nowrap", children: formatCustomValue(customValue(item, f.field_key)) }, f.id)))] }, item.id));
53
64
  }) })] }) }));
54
65
  }
@@ -1,2 +1,2 @@
1
- export declare function VoorraadVeldenCard(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function VoorraadVeldenCard(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=VoorraadVeldenCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadVeldenCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadVeldenCard.tsx"],"names":[],"mappings":"AAoCA,wBAAgB,kBAAkB,4CAqOjC"}
1
+ {"version":3,"file":"VoorraadVeldenCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadVeldenCard.tsx"],"names":[],"mappings":"AAoCA,wBAAgB,kBAAkB,gCAqOjC"}
@@ -0,0 +1,29 @@
1
+ export type StockMode = "FOLLOW_ERP" | "MAX" | "FIXED" | "MANUAL" | "DISABLED";
2
+ export type InventorySetting = {
3
+ id: string;
4
+ connection_id: string;
5
+ product_id: string | null;
6
+ floriday_trade_item_id: string | null;
7
+ stock_mode: StockMode;
8
+ buffer_quantity: number;
9
+ maximum_quantity: number | null;
10
+ fixed_quantity: number | null;
11
+ manual_quantity: number | null;
12
+ desired_quantity: number;
13
+ desired_availability: boolean;
14
+ remote_quantity: number | null;
15
+ remote_available: boolean | null;
16
+ remote_checked_at: string | null;
17
+ sync_status: string;
18
+ last_sync_error: string | null;
19
+ last_published_at: string | null;
20
+ last_confirmed_at: string | null;
21
+ };
22
+ export declare function useInventorySettings(connectionId: string | null): {
23
+ rows: InventorySetting[];
24
+ byKey: Map<string, InventorySetting>;
25
+ loading: boolean;
26
+ error: string | null;
27
+ reload: () => Promise<void>;
28
+ };
29
+ //# sourceMappingURL=useInventorySettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInventorySettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useInventorySettings.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAKF,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;;;;;;EA0D/D"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Leest de Floriday-voorraadsturing per product. De rijen worden door de
3
+ * database zelf aangemaakt en bijgewerkt (`floriday_recompute_inventory`);
4
+ * de UI leest ze alleen en schrijft via server-functies.
5
+ */
6
+ import { useCallback, useEffect, useState } from "react";
7
+ import { supabase } from "../integrations/supabase/client";
8
+ const SELECT = "id, connection_id, product_id, floriday_trade_item_id, stock_mode, buffer_quantity, maximum_quantity, fixed_quantity, manual_quantity, desired_quantity, desired_availability, remote_quantity, remote_available, remote_checked_at, sync_status, last_sync_error, last_published_at, last_confirmed_at";
9
+ export function useInventorySettings(connectionId) {
10
+ const [rows, setRows] = useState([]);
11
+ const [loading, setLoading] = useState(false);
12
+ const [error, setError] = useState(null);
13
+ const load = useCallback(async () => {
14
+ if (!connectionId) {
15
+ setRows([]);
16
+ return;
17
+ }
18
+ setLoading(true);
19
+ const { data, error: err } = await supabase
20
+ .from("floriday_inventory_settings")
21
+ .select(SELECT)
22
+ .eq("connection_id", connectionId)
23
+ .limit(2000);
24
+ if (err)
25
+ setError(err.message);
26
+ else {
27
+ setError(null);
28
+ setRows((data ?? []));
29
+ }
30
+ setLoading(false);
31
+ }, [connectionId]);
32
+ useEffect(() => {
33
+ load();
34
+ }, [load]);
35
+ useEffect(() => {
36
+ if (!connectionId)
37
+ return;
38
+ const channel = supabase
39
+ .channel(`inventory-settings-${connectionId}`)
40
+ .on("postgres_changes", {
41
+ event: "*",
42
+ schema: "public",
43
+ table: "floriday_inventory_settings",
44
+ filter: `connection_id=eq.${connectionId}`,
45
+ }, () => {
46
+ load();
47
+ })
48
+ .subscribe();
49
+ return () => {
50
+ supabase.removeChannel(channel);
51
+ };
52
+ }, [connectionId, load]);
53
+ /** Zowel op product-id als op Floriday trade-item-id opzoekbaar. */
54
+ const byKey = new Map();
55
+ for (const r of rows) {
56
+ if (r.product_id)
57
+ byKey.set(r.product_id, r);
58
+ if (r.floriday_trade_item_id)
59
+ byKey.set(r.floriday_trade_item_id, r);
60
+ }
61
+ return { rows, byKey, loading, error, reload: load };
62
+ }