@flowselections/floriday-voorraad 1.0.76 → 1.0.78

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 (235) hide show
  1. package/dist-lib/components/TemplatePage.d.ts +2 -0
  2. package/dist-lib/components/TemplatePage.d.ts.map +1 -0
  3. package/dist-lib/components/TemplatePage.js +4 -0
  4. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts +2 -0
  5. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts.map +1 -0
  6. package/dist-lib/components/settings/VoorraadSettingsCard.js +39 -0
  7. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts +2 -2
  8. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts.map +1 -1
  9. package/dist-lib/components/voorraad/AdditionalPackagingDialog.js +2 -2
  10. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts +1 -1
  11. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts.map +1 -1
  12. package/dist-lib/components/voorraad/ArtikelCompositionCard.js +1 -1
  13. package/dist-lib/components/voorraad/ArtikelWizard.d.ts +1 -1
  14. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  15. package/dist-lib/components/voorraad/ArtikelWizard.js +49 -49
  16. package/dist-lib/components/voorraad/CollapsibleText.d.ts +1 -1
  17. package/dist-lib/components/voorraad/CollapsibleText.d.ts.map +1 -1
  18. package/dist-lib/components/voorraad/ConnectionBadge.d.ts +6 -0
  19. package/dist-lib/components/voorraad/ConnectionBadge.d.ts.map +1 -0
  20. package/dist-lib/components/voorraad/ConnectionBadge.js +12 -0
  21. package/dist-lib/components/voorraad/ConnectionPicker.d.ts +8 -0
  22. package/dist-lib/components/voorraad/ConnectionPicker.d.ts.map +1 -0
  23. package/dist-lib/components/voorraad/ConnectionPicker.js +8 -0
  24. package/dist-lib/components/voorraad/EditArtikelPage.d.ts +1 -1
  25. package/dist-lib/components/voorraad/EditArtikelPage.d.ts.map +1 -1
  26. package/dist-lib/components/voorraad/EditArtikelPage.js +4 -4
  27. package/dist-lib/components/voorraad/ExcelExportButton.d.ts +2 -2
  28. package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
  29. package/dist-lib/components/voorraad/ExcelExportButton.js +1 -1
  30. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts +1 -1
  31. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts.map +1 -1
  32. package/dist-lib/components/voorraad/FloridayInfoCard.js +3 -3
  33. package/dist-lib/components/voorraad/FloridaySentCard.d.ts +1 -1
  34. package/dist-lib/components/voorraad/FloridaySentCard.d.ts.map +1 -1
  35. package/dist-lib/components/voorraad/FloridaySentCard.js +4 -4
  36. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts +4 -0
  37. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts.map +1 -0
  38. package/dist-lib/components/voorraad/FloridayStatusBadge.js +8 -0
  39. package/dist-lib/components/voorraad/FustenPage.d.ts +1 -1
  40. package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
  41. package/dist-lib/components/voorraad/FustenPage.js +4 -4
  42. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts +2 -2
  43. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts.map +1 -1
  44. package/dist-lib/components/voorraad/InventorySettingsDrawer.js +3 -3
  45. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts +3 -3
  46. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts.map +1 -1
  47. package/dist-lib/components/voorraad/InventoryStatusBadge.js +2 -2
  48. package/dist-lib/components/voorraad/ModuleHealthCard.d.ts +2 -0
  49. package/dist-lib/components/voorraad/ModuleHealthCard.d.ts.map +1 -0
  50. package/dist-lib/components/voorraad/ModuleHealthCard.js +40 -0
  51. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts +1 -1
  52. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
  53. package/dist-lib/components/voorraad/NieuwArtikelPage.js +3 -3
  54. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts +1 -1
  55. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts.map +1 -1
  56. package/dist-lib/components/voorraad/OrderHistoryCard.js +1 -1
  57. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts +1 -1
  58. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts.map +1 -1
  59. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts +1 -1
  60. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -1
  61. package/dist-lib/components/voorraad/ProductCustomFieldsCard.js +2 -2
  62. package/dist-lib/components/voorraad/ProductLinkCard.d.ts +1 -1
  63. package/dist-lib/components/voorraad/ProductLinkCard.d.ts.map +1 -1
  64. package/dist-lib/components/voorraad/ProductLinkCard.js +6 -6
  65. package/dist-lib/components/voorraad/ProductSalePriceField.d.ts +2 -2
  66. package/dist-lib/components/voorraad/ProductSalePriceField.d.ts.map +1 -1
  67. package/dist-lib/components/voorraad/ProductSalePriceField.js +2 -2
  68. package/dist-lib/components/voorraad/ProductStructureCard.d.ts +2 -2
  69. package/dist-lib/components/voorraad/ProductStructureCard.d.ts.map +1 -1
  70. package/dist-lib/components/voorraad/ProductStructureCard.js +3 -3
  71. package/dist-lib/components/voorraad/PublicatiesPage.d.ts +1 -1
  72. package/dist-lib/components/voorraad/PublicatiesPage.d.ts.map +1 -1
  73. package/dist-lib/components/voorraad/PublicatiesPage.js +2 -2
  74. package/dist-lib/components/voorraad/PublishProgressCard.d.ts +2 -2
  75. package/dist-lib/components/voorraad/PublishProgressCard.d.ts.map +1 -1
  76. package/dist-lib/components/voorraad/PublishReadinessCard.d.ts +2 -2
  77. package/dist-lib/components/voorraad/PublishReadinessCard.d.ts.map +1 -1
  78. package/dist-lib/components/voorraad/StepSamenstelling.d.ts +2 -2
  79. package/dist-lib/components/voorraad/StepSamenstelling.d.ts.map +1 -1
  80. package/dist-lib/components/voorraad/StepSamenstelling.js +98 -1
  81. package/dist-lib/components/voorraad/StockBulkButtons.d.ts +2 -2
  82. package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
  83. package/dist-lib/components/voorraad/StockBulkButtons.js +6 -6
  84. package/dist-lib/components/voorraad/StockHistoryChart.d.ts +1 -1
  85. package/dist-lib/components/voorraad/StockHistoryChart.d.ts.map +1 -1
  86. package/dist-lib/components/voorraad/StockHistoryChart.js +1 -1
  87. package/dist-lib/components/voorraad/StockIntegrityAlert.d.ts +1 -1
  88. package/dist-lib/components/voorraad/StockIntegrityAlert.d.ts.map +1 -1
  89. package/dist-lib/components/voorraad/StockIntegrityAlert.js +1 -1
  90. package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts +1 -1
  91. package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts.map +1 -1
  92. package/dist-lib/components/voorraad/StockMutationHistoryCard.js +2 -2
  93. package/dist-lib/components/voorraad/StockPushMonitor.d.ts +1 -1
  94. package/dist-lib/components/voorraad/StockPushMonitor.d.ts.map +1 -1
  95. package/dist-lib/components/voorraad/StockPushMonitor.js +8 -8
  96. package/dist-lib/components/voorraad/StockSyncStatus.d.ts +1 -1
  97. package/dist-lib/components/voorraad/StockSyncStatus.d.ts.map +1 -1
  98. package/dist-lib/components/voorraad/StockSyncStatus.js +2 -2
  99. package/dist-lib/components/voorraad/SupplyReadScopeAlert.d.ts +1 -1
  100. package/dist-lib/components/voorraad/SupplyReadScopeAlert.d.ts.map +1 -1
  101. package/dist-lib/components/voorraad/SupplyReadScopeAlert.js +1 -1
  102. package/dist-lib/components/voorraad/TrayStickerCard.d.ts +1 -1
  103. package/dist-lib/components/voorraad/TrayStickerCard.d.ts.map +1 -1
  104. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +2 -2
  105. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
  106. package/dist-lib/components/voorraad/ValidationOverviewTable.js +5 -5
  107. package/dist-lib/components/voorraad/ValidationPage.d.ts +1 -1
  108. package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -1
  109. package/dist-lib/components/voorraad/ValidationPage.js +3 -3
  110. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +10 -0
  111. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -0
  112. package/dist-lib/components/voorraad/VoorraadDashboard.js +53 -0
  113. package/dist-lib/components/voorraad/VoorraadPage.d.ts +1 -1
  114. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  115. package/dist-lib/components/voorraad/VoorraadPage.js +35 -16
  116. package/dist-lib/components/voorraad/VoorraadPagination.d.ts +1 -1
  117. package/dist-lib/components/voorraad/VoorraadPagination.d.ts.map +1 -1
  118. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts +1 -1
  119. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -1
  120. package/dist-lib/components/voorraad/VoorraadStockCard.js +3 -3
  121. package/dist-lib/components/voorraad/VoorraadTable.d.ts +3 -3
  122. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  123. package/dist-lib/components/voorraad/VoorraadTable.js +122 -39
  124. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts +1 -1
  125. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts.map +1 -1
  126. package/dist-lib/components/voorraad/VoorraadVeldenCard.js +2 -2
  127. package/dist-lib/hooks/useFloriday.d.ts +1 -1
  128. package/dist-lib/hooks/useFloriday.js +4 -4
  129. package/dist-lib/hooks/useFloridayConnection.d.ts +1 -1
  130. package/dist-lib/hooks/useFloridayConnection.js +1 -1
  131. package/dist-lib/hooks/useFloridayContinuousStock.js +1 -1
  132. package/dist-lib/hooks/useFloridayPriceGroups.js +1 -1
  133. package/dist-lib/hooks/useFloridayVbnRequired.js +1 -1
  134. package/dist-lib/hooks/useFlorydayCustomers.js +1 -1
  135. package/dist-lib/hooks/useFusten.d.ts +1 -1
  136. package/dist-lib/hooks/useFusten.js +2 -2
  137. package/dist-lib/hooks/useInventorySettings.d.ts +1 -1
  138. package/dist-lib/hooks/useInventorySettings.js +1 -1
  139. package/dist-lib/hooks/useLocalTradeItems.d.ts +2 -2
  140. package/dist-lib/hooks/useLocalTradeItems.js +3 -3
  141. package/dist-lib/hooks/usePublishJob.d.ts +1 -1
  142. package/dist-lib/hooks/usePublishJob.js +2 -2
  143. package/dist-lib/hooks/useStockPushJobs.js +1 -1
  144. package/dist-lib/hooks/useStockSyncHealth.js +1 -1
  145. package/dist-lib/hooks/useTradeItemSpec.d.ts +2 -2
  146. package/dist-lib/hooks/useTradeItemStock.js +3 -3
  147. package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts +1 -1
  148. package/dist-lib/hooks/useVbnRegulatoryFeatures.js +1 -1
  149. package/dist-lib/hooks/useVoorraadCustomFields.d.ts +1 -1
  150. package/dist-lib/hooks/useVoorraadCustomFields.js +1 -1
  151. package/dist-lib/hooks/useVoorraadData.d.ts +1 -1
  152. package/dist-lib/hooks/useVoorraadData.js +6 -6
  153. package/dist-lib/hooks-entry.d.ts +5 -5
  154. package/dist-lib/hooks-entry.js +5 -5
  155. package/dist-lib/index.d.ts +11 -11
  156. package/dist-lib/index.js +12 -12
  157. package/dist-lib/integrations/supabase/auth-attacher.js +1 -1
  158. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1 -1
  159. package/dist-lib/integrations/supabase/client.d.ts +1 -1
  160. package/dist-lib/integrations/supabase/client.js +1 -1
  161. package/dist-lib/integrations/supabase/client.server.d.ts +1 -1
  162. package/dist-lib/integrations/supabase/client.server.js +1 -1
  163. package/dist-lib/integrations/supabase/types.d.ts +450 -0
  164. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  165. package/dist-lib/lib/__tests__/floricode-required-features.test.js +1 -1
  166. package/dist-lib/lib/__tests__/floriday-base-supply.test.js +1 -1
  167. package/dist-lib/lib/base-supply-reader.server.js +2 -2
  168. package/dist-lib/lib/ensure-article-codes.d.ts +1 -1
  169. package/dist-lib/lib/ensure-article-codes.js +1 -1
  170. package/dist-lib/lib/floricode-client.js +1 -1
  171. package/dist-lib/lib/floriday-2026v1.server.js +2 -2
  172. package/dist-lib/lib/floriday-client.d.ts +2 -2
  173. package/dist-lib/lib/floriday-client.js +2 -2
  174. package/dist-lib/lib/floriday-customer-offer.functions.d.ts +1 -1
  175. package/dist-lib/lib/floriday-customer-offer.functions.js +4 -4
  176. package/dist-lib/lib/floriday-env.functions.d.ts +4 -4
  177. package/dist-lib/lib/floriday-env.functions.js +4 -4
  178. package/dist-lib/lib/floriday-env.server.d.ts +2 -2
  179. package/dist-lib/lib/floriday-env.server.js +2 -2
  180. package/dist-lib/lib/floriday-field-sources.d.ts +18 -0
  181. package/dist-lib/lib/floriday-field-sources.d.ts.map +1 -0
  182. package/dist-lib/lib/floriday-field-sources.js +45 -0
  183. package/dist-lib/lib/floriday-gateway.functions.d.ts +10 -10
  184. package/dist-lib/lib/floriday-gateway.functions.js +14 -14
  185. package/dist-lib/lib/floriday-gateway.server.d.ts +1 -1
  186. package/dist-lib/lib/floriday-gateway.server.js +9 -9
  187. package/dist-lib/lib/floriday-import-validator.d.ts +1 -1
  188. package/dist-lib/lib/floriday-readiness.server.d.ts +1 -1
  189. package/dist-lib/lib/floriday-readiness.server.js +2 -2
  190. package/dist-lib/lib/floriday-relink.js +1 -1
  191. package/dist-lib/lib/floriday-schema-to-zod.d.ts +9 -0
  192. package/dist-lib/lib/floriday-schema-to-zod.d.ts.map +1 -0
  193. package/dist-lib/lib/floriday-schema-to-zod.js +53 -0
  194. package/dist-lib/lib/floriday-stock-supply.server.d.ts +1 -1
  195. package/dist-lib/lib/floriday-stock-supply.server.js +2 -2
  196. package/dist-lib/lib/floriday-supply-line.js +2 -2
  197. package/dist-lib/lib/floriday-vbn-required.functions.d.ts +2 -2
  198. package/dist-lib/lib/floriday-vbn-required.functions.js +2 -2
  199. package/dist-lib/lib/floriday-warehouse.functions.d.ts +6 -6
  200. package/dist-lib/lib/floriday-warehouse.functions.js +7 -7
  201. package/dist-lib/lib/floriday-write-gate.server.js +1 -1
  202. package/dist-lib/lib/floriday-writes.functions.d.ts +2 -2
  203. package/dist-lib/lib/floriday-writes.functions.js +6 -6
  204. package/dist-lib/lib/fusten.d.ts +1 -1
  205. package/dist-lib/lib/fusten.js +2 -2
  206. package/dist-lib/lib/inventory-settings.functions.js +1 -1
  207. package/dist-lib/lib/logistics-buffer-events.server.js +2 -2
  208. package/dist-lib/lib/logistics-events.js +2 -2
  209. package/dist-lib/lib/logistics-tasks.server.js +5 -5
  210. package/dist-lib/lib/merge-products.d.ts +8 -0
  211. package/dist-lib/lib/merge-products.d.ts.map +1 -0
  212. package/dist-lib/lib/merge-products.js +17 -0
  213. package/dist-lib/lib/module-health.functions.d.ts +53497 -0
  214. package/dist-lib/lib/module-health.functions.d.ts.map +1 -0
  215. package/dist-lib/lib/module-health.functions.js +261 -0
  216. package/dist-lib/lib/module-runtime-config.functions.d.ts +1 -1
  217. package/dist-lib/lib/module-runtime-config.functions.js +2 -2
  218. package/dist-lib/lib/module-runtime.server.js +1 -1
  219. package/dist-lib/lib/product-packing.js +1 -1
  220. package/dist-lib/lib/product-types.js +1 -1
  221. package/dist-lib/lib/publish-pipeline.d.ts +1 -1
  222. package/dist-lib/lib/publish-pipeline.js +2 -2
  223. package/dist-lib/lib/publish-readiness.d.ts +2 -2
  224. package/dist-lib/lib/trade-item-prices.d.ts +1 -1
  225. package/dist-lib/lib/trade-item-prices.js +2 -2
  226. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  227. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  228. package/dist-lib/lib/validationSchemas.js +25 -0
  229. package/dist-lib/lib/voorraad-custom-fields.js +1 -1
  230. package/dist-lib/server-hooks/floriday-base-supply.js +1 -1
  231. package/dist-lib/server-hooks/floriday-continuous-stock-pull.js +1 -1
  232. package/dist-lib/server-hooks/floriday-continuous-stock.js +1 -1
  233. package/dist-lib/server-hooks/floriday-stock-reconcile.js +1 -1
  234. package/dist-lib/server-hooks/logistics-tasks-run.js +1 -1
  235. package/package.json +2 -2
@@ -2,10 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useState } from "react";
3
3
  import { Boxes, Minus, Plus, RefreshCw, Search } from "lucide-react";
4
4
  import { Button, Card, Input, Badge, toast } from "@flowselections/core";
5
- import { supabase } from "../../integrations/supabase/client";
6
- import { useFloridayConnection } from "../../hooks/useFloridayConnection";
7
- import { useFusten } from "../../hooks/useFusten";
8
- import { fetchFustMutations, formatFustDimensions, } from "../../lib/fusten";
5
+ import { supabase } from "../../integrations/supabase/client.js";
6
+ import { useFloridayConnection } from "../../hooks/useFloridayConnection.js";
7
+ import { useFusten } from "../../hooks/useFusten.js";
8
+ import { fetchFustMutations, formatFustDimensions, } from "../../lib/fusten.js";
9
9
  /** Afmetingen tonen en handmatig aanvullen wanneer de catalogus ze niet kent. */
10
10
  function DimensionCell({ fust, onSave, }) {
11
11
  const [editing, setEditing] = useState(false);
@@ -1,4 +1,4 @@
1
- import type { InventorySetting } from "../../hooks/useInventorySettings";
1
+ import type { InventorySetting } from "../../hooks/useInventorySettings.js";
2
2
  export declare function InventorySettingsDrawer({ open, onOpenChange, connectionId, productIds, current, onSaved, }: {
3
3
  open: boolean;
4
4
  onOpenChange: (v: boolean) => void;
@@ -6,5 +6,5 @@ export declare function InventorySettingsDrawer({ open, onOpenChange, connection
6
6
  productIds: string[];
7
7
  current?: InventorySetting | undefined;
8
8
  onSaved?: () => void;
9
- }): import("react").JSX.Element;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
10
  //# sourceMappingURL=InventorySettingsDrawer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InventorySettingsDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventorySettingsDrawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAkBzE,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,OAAO,EACP,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,+BAkMA"}
1
+ {"version":3,"file":"InventorySettingsDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventorySettingsDrawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAkBzE,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,OAAO,EACP,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,2CAkMA"}
@@ -7,9 +7,9 @@ import { useEffect, useState } from "react";
7
7
  import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@flowselections/core";
8
8
  import { useServerFn } from "@tanstack/react-start";
9
9
  import { toast } from "sonner";
10
- import { saveInventorySettings, republishInventory, } from "../../lib/inventory-settings.functions";
11
- import { MissingPriceNotice } from "./ProductSalePriceField";
12
- import { MODE_LABELS, ACTION_REASON_LABELS, publishedLabel, } from "../../lib/stock-modes";
10
+ import { saveInventorySettings, republishInventory, } from "../../lib/inventory-settings.functions.js";
11
+ import { MissingPriceNotice } from "./ProductSalePriceField.js";
12
+ import { MODE_LABELS, ACTION_REASON_LABELS, publishedLabel, } from "../../lib/stock-modes.js";
13
13
  const MODE_HELP = {
14
14
  FOLLOW_ERP: "Publiceert beschikbaar min gereserveerd min buffer, afgerond op hele verpakkingen.",
15
15
  MAXIMUM: "Volgt het ERP (min buffer), maar publiceert nooit meer dan het maximum.",
@@ -1,7 +1,7 @@
1
- import type { InventorySetting } from "../../hooks/useInventorySettings";
2
- import { MODE_LABELS } from "../../lib/stock-modes";
1
+ import type { InventorySetting } from "../../hooks/useInventorySettings.js";
2
+ import { MODE_LABELS } from "../../lib/stock-modes.js";
3
3
  export { MODE_LABELS };
4
4
  export declare function InventoryStatusBadge({ setting }: {
5
5
  setting: InventorySetting | undefined;
6
- }): import("react").JSX.Element;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
7
  //# sourceMappingURL=InventoryStatusBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InventoryStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventoryStatusBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAwC,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,CAAC;AAiCvB,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAA;CAAE,+BAuC1F"}
1
+ {"version":3,"file":"InventoryStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventoryStatusBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAwC,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,CAAC;AAiCvB,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAA;CAAE,2CAuC1F"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Badge } from "@flowselections/core";
3
- import { MODE_LABELS, ACTION_REASON_LABELS } from "../../lib/stock-modes";
3
+ import { MODE_LABELS, ACTION_REASON_LABELS } from "../../lib/stock-modes.js";
4
4
  export { MODE_LABELS };
5
5
  const MODE_CLASSES = {
6
6
  FOLLOW_ERP: "bg-primary/10 text-primary border-primary/30",
@@ -43,5 +43,5 @@ export function InventoryStatusBadge({ setting }) {
43
43
  ? `${dot.title}: ${ACTION_REASON_LABELS[setting.action_reason] ?? setting.action_reason}`
44
44
  : setting.last_sync_error
45
45
  ? `${dot.title}: ${setting.last_sync_error}`
46
- : dot.title, "aria-label": dot.title }), _jsx("span", { className: "tabular-nums text-xs text-muted-foreground", children: setting.desired_quantity ?? 0 }), setting.last_sync_error?.startsWith("Geen voorkeursmagazijn") && (_jsx("span", { className: "rounded bg-destructive/15 px-1.5 py-0.5 text-xs text-destructive", title: setting.last_sync_error, children: "Geen magazijn \u2014 kies er een op de Connectie-pagina" }))] }));
46
+ : dot.title, "aria-label": dot.title }), _jsx("span", { className: "tabular-nums text-xs text-muted-foreground", children: setting.desired_quantity ?? 0 }), setting.last_sync_error?.startsWith("Geen voorkeursmagazijn") && (_jsx("span", { className: "rounded bg-destructive/15 px-1.5 py-0.5 text-xs text-destructive", title: setting.last_sync_error, children: "Geen magazijn \u2014 kies er een in Instellingen \u203A Floriday" }))] }));
47
47
  }
@@ -0,0 +1,2 @@
1
+ export declare function ModuleHealthCard(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ModuleHealthCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleHealthCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ModuleHealthCard.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,gBAAgB,4CA8D/B"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Statuskaart in de instellingen: laat in gewone taal zien of de module in
4
+ * déze omgeving volledig werkt, en biedt één knop om vastgelopen
5
+ * voorraadwijzigingen weer op gang te helpen.
6
+ */
7
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
8
+ import { useServerFn } from "@tanstack/react-start";
9
+ import { AlertTriangle, CheckCircle2, RotateCw, XCircle } from "lucide-react";
10
+ import { toast } from "sonner";
11
+ import { getModuleHealth, recoverStockQueue, } from "../../lib/module-health.functions.js";
12
+ function StatusIcon({ status }) {
13
+ if (status === "ok")
14
+ return _jsx(CheckCircle2, { className: "mt-0.5 h-4 w-4 shrink-0 text-emerald-600" });
15
+ if (status === "warn")
16
+ return _jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4 shrink-0 text-amber-600" });
17
+ return _jsx(XCircle, { className: "mt-0.5 h-4 w-4 shrink-0 text-destructive" });
18
+ }
19
+ export function ModuleHealthCard() {
20
+ const fetchHealth = useServerFn(getModuleHealth);
21
+ const recover = useServerFn(recoverStockQueue);
22
+ const queryClient = useQueryClient();
23
+ const { data, isLoading } = useQuery({
24
+ queryKey: ["module-health"],
25
+ queryFn: () => fetchHealth({}),
26
+ refetchInterval: 60000,
27
+ });
28
+ const mutation = useMutation({
29
+ mutationFn: () => recover({}),
30
+ onSuccess: (res) => {
31
+ toast.success(res?.restored
32
+ ? `${res.restored} voorraadwijziging${res.restored === 1 ? "" : "en"} opnieuw ingepland.`
33
+ : "Er stond niets vast.");
34
+ void queryClient.invalidateQueries({ queryKey: ["module-health"] });
35
+ void queryClient.invalidateQueries({ queryKey: ["stock-sync-health"] });
36
+ },
37
+ onError: (e) => toast.error(e?.message ?? "Herstellen is niet gelukt."),
38
+ });
39
+ return (_jsxs("section", { className: "rounded-lg border border-border bg-card p-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-base font-semibold text-foreground", children: "Status van de voorraadmodule" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Controleert de koppeling, de achtergrondtaken en de synchronisatie naar Floriday." })] }), _jsxs("button", { type: "button", className: "inline-flex shrink-0 items-center rounded-md border border-border px-2.5 py-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:opacity-50", disabled: mutation.isPending, onClick: () => mutation.mutate(), children: [_jsx(RotateCw, { className: `mr-1.5 h-3.5 w-3.5 ${mutation.isPending ? "animate-spin" : ""}` }), "Vastgelopen taken hervatten"] })] }), _jsxs("ul", { className: "mt-4 space-y-2.5", children: [isLoading && _jsx("li", { className: "text-sm text-muted-foreground", children: "Bezig met controleren\u2026" }), data?.checks.map((check) => (_jsxs("li", { className: "flex items-start gap-2 text-sm", children: [_jsx(StatusIcon, { status: check.status }), _jsxs("div", { className: "min-w-0", children: [_jsxs("span", { className: "font-medium text-foreground", children: [check.label, ": "] }), _jsx("span", { className: "text-muted-foreground break-words", children: check.detail }), check.hint && (_jsx("p", { className: "mt-0.5 text-xs text-muted-foreground/80 break-words", children: check.hint }))] })] }, check.id)))] })] }));
40
+ }
@@ -1,2 +1,2 @@
1
- export declare function NieuwArtikelPage(): import("react").JSX.Element;
1
+ export declare function NieuwArtikelPage(): import("react/jsx-runtime").JSX.Element;
2
2
  //# sourceMappingURL=NieuwArtikelPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NieuwArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/NieuwArtikelPage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,gCAkM/B"}
1
+ {"version":3,"file":"NieuwArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/NieuwArtikelPage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,4CAkM/B"}
@@ -9,9 +9,9 @@ import { useRef, useState } from "react";
9
9
  import { Link, useNavigate } from "@tanstack/react-router";
10
10
  import { Button, Card, Input, Label, toast } from "@flowselections/core";
11
11
  import { ArrowLeft, Check, Loader2, Send } from "lucide-react";
12
- import { supabase } from "../../integrations/supabase/client";
13
- import { validateDraftForPublish } from "../../lib/floriday-import-validator";
14
- import { ArtikelWizard } from "./ArtikelWizard";
12
+ import { supabase } from "../../integrations/supabase/client.js";
13
+ import { validateDraftForPublish } from "../../lib/floriday-import-validator.js";
14
+ import { ArtikelWizard } from "./ArtikelWizard.js";
15
15
  const STEPS = ["Naam en code", "Voorraad", "Prijs"];
16
16
  export function NieuwArtikelPage() {
17
17
  const navigate = useNavigate();
@@ -3,6 +3,6 @@ interface Props {
3
3
  productName: string | null;
4
4
  productId?: string | null;
5
5
  }
6
- export declare function OrderHistoryCard({ tradeItemKey, productName, productId }: Props): import("react").JSX.Element;
6
+ export declare function OrderHistoryCard({ tradeItemKey, productName, productId }: Props): import("react/jsx-runtime").JSX.Element;
7
7
  export {};
8
8
  //# sourceMappingURL=OrderHistoryCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderHistoryCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/OrderHistoryCard.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAgDD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,+BAoK/E"}
1
+ {"version":3,"file":"OrderHistoryCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/OrderHistoryCard.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAgDD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,2CAoK/E"}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { Card, CardContent, Badge } from "@flowselections/core";
4
4
  import { Loader2, ClipboardList, ExternalLink } from "lucide-react";
5
- import { supabase } from "../../integrations/supabase/client";
5
+ import { supabase } from "../../integrations/supabase/client.js";
6
6
  const STATUS_TONE = {
7
7
  "nog te picken": "bg-amber-100 text-amber-800 border-amber-200",
8
8
  "klaar voor verzending": "bg-blue-100 text-blue-800 border-blue-200",
@@ -4,6 +4,6 @@ type Props = {
4
4
  productId?: string | null;
5
5
  offerForSale: boolean;
6
6
  };
7
- export declare function PriceStatusBadge({ tradeItemId, productId, offerForSale }: Props): import("react").JSX.Element | null;
7
+ export declare function PriceStatusBadge({ tradeItemId, productId, offerForSale }: Props): import("react/jsx-runtime").JSX.Element | null;
8
8
  export {};
9
9
  //# sourceMappingURL=PriceStatusBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PriceStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PriceStatusBadge.tsx"],"names":[],"mappings":"AAuFA,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,sCAmG/E"}
1
+ {"version":3,"file":"PriceStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PriceStatusBadge.tsx"],"names":[],"mappings":"AAuFA,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,kDAmG/E"}
@@ -1,5 +1,5 @@
1
1
  /** Eigen voorraadvelden met `show_in_detail`, tonen en bewerken op de productpagina. */
2
2
  export declare function ProductCustomFieldsCard({ productId }: {
3
3
  productId: string;
4
- }): import("react").JSX.Element | null;
4
+ }): import("react/jsx-runtime").JSX.Element | null;
5
5
  //# sourceMappingURL=ProductCustomFieldsCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductCustomFieldsCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductCustomFieldsCard.tsx"],"names":[],"mappings":"AAyBA,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,sCA6H3E"}
1
+ {"version":3,"file":"ProductCustomFieldsCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductCustomFieldsCard.tsx"],"names":[],"mappings":"AAyBA,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,kDA6H3E"}
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Checkbox, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
4
4
  import { Loader2, Save } from "lucide-react";
5
- import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
6
- import { fetchProductCustomValues, saveProductCustomValues, } from "../../lib/voorraad-custom-fields";
5
+ import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields.js";
6
+ import { fetchProductCustomValues, saveProductCustomValues, } from "../../lib/voorraad-custom-fields.js";
7
7
  /** Eigen voorraadvelden met `show_in_detail`, tonen en bewerken op de productpagina. */
8
8
  export function ProductCustomFieldsCard({ productId }) {
9
9
  const { fields, loading } = useVoorraadCustomFields();
@@ -8,6 +8,6 @@ interface Props {
8
8
  * Koppelt ERP-`products` rijen aan één Floriday-voorraadrij (`trade_item_key`).
9
9
  * Zonder koppeling doen bestel-triggers niets voor mailbox/manual-orders.
10
10
  */
11
- export declare function ProductLinkCard({ tradeItemKey, productName }: Props): import("react").JSX.Element;
11
+ export declare function ProductLinkCard({ tradeItemKey, productName }: Props): import("react/jsx-runtime").JSX.Element;
12
12
  export {};
13
13
  //# sourceMappingURL=ProductLinkCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductLinkCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductLinkCard.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,qFAAqF;IACrF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,+BA4OnE"}
1
+ {"version":3,"file":"ProductLinkCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductLinkCard.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,qFAAqF;IACrF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,2CA4OnE"}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { useCallback, useEffect, useMemo, useState } from "react";
3
3
  import { Button, Card, CardContent, Input, toast, } from "@flowselections/core";
4
4
  import { Link2, Loader2, RefreshCw, Trash2, Wand2 } from "lucide-react";
5
- import { supabase } from "../../integrations/supabase/client";
5
+ import { supabase } from "../../integrations/supabase/client.js";
6
6
  /**
7
7
  * Koppelt ERP-`products` rijen aan één Floriday-voorraadrij (`trade_item_key`).
8
8
  * Zonder koppeling doen bestel-triggers niets voor mailbox/manual-orders.
@@ -137,10 +137,10 @@ export function ProductLinkCard({ tradeItemKey, productName }) {
137
137
  throw error;
138
138
  const rows = data ?? [];
139
139
  const n = rows[0]?.processed_items ?? 0;
140
- toast.success(`Backfill klaar: ${n} orderregel(s) verwerkt`);
140
+ toast.success(`Openstaande orders gereserveerd: ${n} orderregel(s)`);
141
141
  }
142
142
  catch (e) {
143
- toast.error(`Backfill mislukt: ${e.message}`);
143
+ toast.error("Openstaande orders reserveren is niet gelukt. Probeer het opnieuw.");
144
144
  }
145
145
  finally {
146
146
  setBusy(false);
@@ -151,9 +151,9 @@ export function ProductLinkCard({ tradeItemKey, productName }) {
151
151
  return "Sla het artikel eerst op om producten te kunnen koppelen.";
152
152
  }
153
153
  if (linked.length === 0) {
154
- return "Nog geen ERP-product gekoppeld. Zonder koppeling worden mailbox-orders niet automatisch van de voorraad afgeschreven.";
154
+ return "Nog geen eigen product gekoppeld. Zonder koppeling worden mailbox-orders niet automatisch van de voorraad afgeschreven.";
155
155
  }
156
- return "Bestellingen op deze ERP-producten reserveren automatisch op deze voorraadrij.";
156
+ return "Bestellingen op deze eigen producten reserveren automatisch op deze voorraadrij.";
157
157
  }, [tradeItemKey, linked.length]);
158
- return (_jsxs(Card, { children: [_jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 px-6 py-4", children: [_jsx("span", { className: "flex h-7 w-7 items-center justify-center rounded-full border border-primary/40 bg-primary/10 text-primary", children: _jsx(Link2, { className: "h-4 w-4" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: "Gekoppelde ERP-producten" }), _jsx("div", { className: "text-xs text-muted-foreground", children: helpText })] }), _jsxs("div", { className: "flex gap-2", children: [productName && (_jsxs(Button, { variant: "outline", size: "sm", onClick: autoLinkByName, disabled: !tradeItemKey || busy, title: "Zoek ERP-producten met exact deze naam en koppel ze", children: [_jsx(Wand2, { className: "h-4 w-4 mr-1" }), "Auto op naam"] })), _jsxs(Button, { variant: "outline", size: "sm", onClick: backfillReservations, disabled: busy, title: "Reserveer openstaande orders retroactief", children: [_jsx(RefreshCw, { className: "h-4 w-4 mr-1" }), "Backfill"] })] })] }), _jsx(CardContent, { className: "pt-0 space-y-3", children: loading ? (_jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Laden\u2026"] })) : (_jsxs(_Fragment, { children: [linked.length > 0 && (_jsx("ul", { className: "divide-y rounded-md border", children: linked.map((p) => (_jsxs("li", { className: "flex items-center justify-between gap-2 px-3 py-2 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate font-medium", children: p.product ?? "(zonder naam)" }), p.barcode && (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Barcode: ", p.barcode] }))] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => unlinkProduct(p.id), disabled: busy, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, p.id))) })), _jsxs("div", { className: "space-y-2", children: [_jsx(Input, { placeholder: "Zoek ERP-product op naam of SKU\u2026", value: query, onChange: (e) => setQuery(e.target.value), disabled: !tradeItemKey || busy }), candidates.length > 0 && (_jsx("ul", { className: "divide-y rounded-md border max-h-56 overflow-auto", children: candidates.map((p) => (_jsxs("li", { className: "flex items-center justify-between gap-2 px-3 py-2 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate", children: p.product ?? "(zonder naam)" }), p.barcode && (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Barcode: ", p.barcode] }))] }), _jsx(Button, { size: "sm", onClick: () => linkProduct(p.id), disabled: busy, children: "Koppel" })] }, p.id))) }))] })] })) })] }));
158
+ return (_jsxs(Card, { children: [_jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 px-6 py-4", children: [_jsx("span", { className: "flex h-7 w-7 items-center justify-center rounded-full border border-primary/40 bg-primary/10 text-primary", children: _jsx(Link2, { className: "h-4 w-4" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: "Gekoppelde eigen producten" }), _jsx("div", { className: "text-xs text-muted-foreground", children: helpText })] }), _jsxs("div", { className: "flex gap-2", children: [productName && (_jsxs(Button, { variant: "outline", size: "sm", onClick: autoLinkByName, disabled: !tradeItemKey || busy, title: "Zoek eigen producten met exact deze naam en koppel ze", children: [_jsx(Wand2, { className: "h-4 w-4 mr-1" }), "Auto op naam"] })), _jsxs(Button, { variant: "outline", size: "sm", onClick: backfillReservations, disabled: busy, title: "Openstaande orders reserveren", children: [_jsx(RefreshCw, { className: "h-4 w-4 mr-1" }), "Openstaande orders reserveren"] })] })] }), _jsx(CardContent, { className: "pt-0 space-y-3", children: loading ? (_jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Laden\u2026"] })) : (_jsxs(_Fragment, { children: [linked.length > 0 && (_jsx("ul", { className: "divide-y rounded-md border", children: linked.map((p) => (_jsxs("li", { className: "flex items-center justify-between gap-2 px-3 py-2 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate font-medium", children: p.product ?? "(zonder naam)" }), p.barcode && (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Barcode: ", p.barcode] }))] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => unlinkProduct(p.id), disabled: busy, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, p.id))) })), _jsxs("div", { className: "space-y-2", children: [_jsx(Input, { placeholder: "Zoek eigen product op naam of artikelcode\u2026", value: query, onChange: (e) => setQuery(e.target.value), disabled: !tradeItemKey || busy }), candidates.length > 0 && (_jsx("ul", { className: "divide-y rounded-md border max-h-56 overflow-auto", children: candidates.map((p) => (_jsxs("li", { className: "flex items-center justify-between gap-2 px-3 py-2 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate", children: p.product ?? "(zonder naam)" }), p.barcode && (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Barcode: ", p.barcode] }))] }), _jsx(Button, { size: "sm", onClick: () => linkProduct(p.id), disabled: busy, children: "Koppel" })] }, p.id))) }))] })] })) })] }));
159
159
  }
@@ -1,9 +1,9 @@
1
1
  export declare function ProductSalePriceField({ productId, onSaved, }: {
2
2
  productId: string;
3
3
  onSaved?: (price: number) => void;
4
- }): import("react").JSX.Element | null;
4
+ }): import("react/jsx-runtime").JSX.Element | null;
5
5
  /** Melding met directe link naar het prijsveld; toont niets als de prijs in orde is. */
6
6
  export declare function MissingPriceNotice({ productId }: {
7
7
  productId: string;
8
- }): import("react").JSX.Element | null;
8
+ }): import("react/jsx-runtime").JSX.Element | null;
9
9
  //# sourceMappingURL=ProductSalePriceField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductSalePriceField.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductSalePriceField.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,sCAkGA;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,sCAqCtE"}
1
+ {"version":3,"file":"ProductSalePriceField.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductSalePriceField.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,kDAkGA;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,kDAqCtE"}
@@ -10,8 +10,8 @@ import { useEffect, useState } from "react";
10
10
  import { Link } from "@tanstack/react-router";
11
11
  import { Button, Input, Label, toast } from "@flowselections/core";
12
12
  import { AlertTriangle, Loader2 } from "lucide-react";
13
- import { supabase } from "../../integrations/supabase/client";
14
- import { priceProblem } from "../../lib/floriday-base-supply";
13
+ import { supabase } from "../../integrations/supabase/client.js";
14
+ import { priceProblem } from "../../lib/floriday-base-supply.js";
15
15
  function isPieceUnit(unit) {
16
16
  const u = String(unit ?? "").trim().toLowerCase();
17
17
  return u === "" || u === "stuks" || u === "stuk";
@@ -1,8 +1,8 @@
1
1
  export declare function ProductStructureCard({ productId }: {
2
2
  productId: string | null;
3
- }): import("react").JSX.Element | null;
3
+ }): import("react/jsx-runtime").JSX.Element | null;
4
4
  /** Eén regel met de echte reden waarom de voorraad (nog) niet in Floriday staat. */
5
5
  export declare function FloridayStockReasonLine({ productId }: {
6
6
  productId: string | null;
7
- }): import("react").JSX.Element | null;
7
+ }): import("react/jsx-runtime").JSX.Element | null;
8
8
  //# sourceMappingURL=ProductStructureCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductStructureCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductStructureCard.tsx"],"names":[],"mappings":"AAiDA,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,sCAoQ/E;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,sCAkClF"}
1
+ {"version":3,"file":"ProductStructureCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductStructureCard.tsx"],"names":[],"mappings":"AAiDA,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,kDAoQ/E;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,kDAkClF"}
@@ -8,9 +8,9 @@ import { useEffect, useState } from "react";
8
8
  import { Link } from "@tanstack/react-router";
9
9
  import { Badge, Card, CardContent, CardDescription, CardHeader, CardTitle } from "@flowselections/core";
10
10
  import { Info, Loader2 } from "lucide-react";
11
- import { supabase } from "../../integrations/supabase/client";
12
- import { PRODUCT_TYPE_CLASSES, PRODUCT_TYPE_HELP, PRODUCT_TYPE_LABELS, floridayPendingReason, toStructureType, } from "../../lib/product-types";
13
- import { ACTION_REASON_LABELS, publishedLabel } from "../../lib/stock-modes";
11
+ import { supabase } from "../../integrations/supabase/client.js";
12
+ import { PRODUCT_TYPE_CLASSES, PRODUCT_TYPE_HELP, PRODUCT_TYPE_LABELS, floridayPendingReason, toStructureType, } from "../../lib/product-types.js";
13
+ import { ACTION_REASON_LABELS, publishedLabel } from "../../lib/stock-modes.js";
14
14
  export function ProductStructureCard({ productId }) {
15
15
  const [loading, setLoading] = useState(true);
16
16
  const [totals, setTotals] = useState(null);
@@ -1,2 +1,2 @@
1
- export declare function PublicatiesPage(): import("react").JSX.Element;
1
+ export declare function PublicatiesPage(): import("react/jsx-runtime").JSX.Element;
2
2
  //# sourceMappingURL=PublicatiesPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublicatiesPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublicatiesPage.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,eAAe,gCAwJ9B"}
1
+ {"version":3,"file":"PublicatiesPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublicatiesPage.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,eAAe,4CAwJ9B"}
@@ -3,8 +3,8 @@ import { Link } from "@tanstack/react-router";
3
3
  import { Card, Button } from "@flowselections/core";
4
4
  import { ArrowLeft, Check, AlertTriangle, Loader2, RefreshCw } from "lucide-react";
5
5
  import { useEffect, useState } from "react";
6
- import { usePublishJobs } from "../../hooks/usePublishJob";
7
- import { supabase } from "../../integrations/supabase/client";
6
+ import { usePublishJobs } from "../../hooks/usePublishJob.js";
7
+ import { supabase } from "../../integrations/supabase/client.js";
8
8
  const STATUS_LABEL = {
9
9
  running: "Bezig",
10
10
  succeeded: "Gepubliceerd",
@@ -1,4 +1,4 @@
1
- import type { PublishJobRow, PublishStepRow } from "../../lib/publish-pipeline";
1
+ import type { PublishJobRow, PublishStepRow } from "../../lib/publish-pipeline.js";
2
2
  /**
3
3
  * Toont de voortgang van een publicatie in deelstappen.
4
4
  */
@@ -8,5 +8,5 @@ export declare function PublishProgressCard({ job, steps, onRetry, retrying, onF
8
8
  onRetry?: () => void;
9
9
  retrying?: boolean;
10
10
  onFixStep?: (stepKey: string) => void;
11
- }): import("react").JSX.Element | null;
11
+ }): import("react/jsx-runtime").JSX.Element | null;
12
12
  //# sourceMappingURL=PublishProgressCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublishProgressCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishProgressCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAoBhF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE;IACD,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,sCAyDA"}
1
+ {"version":3,"file":"PublishProgressCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishProgressCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAoBhF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE;IACD,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,kDAyDA"}
@@ -1,4 +1,4 @@
1
- import type { ReadinessReport } from "../../lib/publish-readiness";
1
+ import type { ReadinessReport } from "../../lib/publish-readiness.js";
2
2
  /**
3
3
  * Korte checklist die laat zien of het product klaar is om te publiceren.
4
4
  */
@@ -6,5 +6,5 @@ export declare function PublishReadinessCard({ report, loading, onGoToStep, }: {
6
6
  report: ReadinessReport;
7
7
  loading?: boolean;
8
8
  onGoToStep?: (stepKey: string) => void;
9
- }): import("react").JSX.Element;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
10
  //# sourceMappingURL=PublishReadinessCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublishReadinessCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishReadinessCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,+BAuEA"}
1
+ {"version":3,"file":"PublishReadinessCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishReadinessCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,2CAuEA"}
@@ -1,10 +1,10 @@
1
- import type { PackingConfigurationInput } from "../../lib/floriday-payload";
1
+ import type { PackingConfigurationInput } from "../../lib/floriday-payload.js";
2
2
  interface Props {
3
3
  productId: string | null;
4
4
  floridayId: string | null;
5
5
  packings: PackingConfigurationInput[];
6
6
  packagingTypeLabel: (code: string) => string;
7
7
  }
8
- export declare function StepSamenstelling({ productId, floridayId, packings, packagingTypeLabel, }: Props): import("react").JSX.Element;
8
+ export declare function StepSamenstelling({ productId, floridayId, packings, packagingTypeLabel, }: Props): import("react/jsx-runtime").JSX.Element;
9
9
  export {};
10
10
  //# sourceMappingURL=StepSamenstelling.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepSamenstelling.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StepSamenstelling.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAsB5E,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,yBAAyB,EAAE,CAAC;IACtC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAUD,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,kBAAkB,GACnB,EAAE,KAAK,+BA+ZP"}
1
+ {"version":3,"file":"StepSamenstelling.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StepSamenstelling.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAsB5E,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,yBAAyB,EAAE,CAAC;IACtC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AA6FD,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,kBAAkB,GACnB,EAAE,KAAK,2CA+aP"}
@@ -2,7 +2,89 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useState } from "react";
3
3
  import { Button, Input, Popover, PopoverContent, PopoverTrigger, toast, } from "@flowselections/core";
4
4
  import { Loader2, Package, Plus, Search, Trash2 } from "lucide-react";
5
- import { supabase } from "../../integrations/supabase/client";
5
+ import { supabase } from "../../integrations/supabase/client.js";
6
+ /** Vanaf dit aantal per stuk vragen we of de verhouding klopt. */
7
+ const RATIO_WARN_THRESHOLD = 10;
8
+ const MAX_DEPTH = 6;
9
+ function fmt(n) {
10
+ return n.toLocaleString("nl-NL", { maximumFractionDigits: 2 });
11
+ }
12
+ /**
13
+ * Telt per eindonderdeel hoeveel er in 1 stuk van het artikel zit, door alle
14
+ * lagen van de samenstelling heen (op id). Een groep telt mee als haar eerste lid.
15
+ */
16
+ async function unlikelyRatios(parentId, baseRows) {
17
+ const totals = new Map();
18
+ const bomCache = new Map();
19
+ const groupCache = new Map();
20
+ const childrenOf = async (pid) => {
21
+ if (bomCache.has(pid))
22
+ return bomCache.get(pid);
23
+ const { data } = await supabase
24
+ .from("product_bom_items")
25
+ .select("component_product_id,quantity")
26
+ .eq("parent_product_id", pid)
27
+ .is("packing_configuration_id", null);
28
+ const list = (data ?? [])
29
+ .filter((r) => r.component_product_id)
30
+ .map((r) => ({ id: r.component_product_id, qty: Number(r.quantity ?? 1) }));
31
+ bomCache.set(pid, list);
32
+ return list;
33
+ };
34
+ const groupMemberOf = async (pid) => {
35
+ if (groupCache.has(pid))
36
+ return groupCache.get(pid);
37
+ const { data: g } = await supabase
38
+ .from("product_groups")
39
+ .select("id")
40
+ .eq("head_product_id", pid)
41
+ .eq("is_active", true)
42
+ .order("updated_at", { ascending: false })
43
+ .limit(1)
44
+ .maybeSingle();
45
+ let member = null;
46
+ if (g?.id) {
47
+ const { data: m } = await supabase
48
+ .from("product_group_items")
49
+ .select("trade_item_id")
50
+ .eq("product_group_id", g.id)
51
+ .order("sort_order", { ascending: true })
52
+ .limit(1)
53
+ .maybeSingle();
54
+ member = m?.trade_item_id ?? null;
55
+ }
56
+ groupCache.set(pid, member);
57
+ return member;
58
+ };
59
+ const walk = async (pid, mult, depth) => {
60
+ if (depth > MAX_DEPTH)
61
+ return;
62
+ const kids = await childrenOf(pid);
63
+ if (kids.length > 0) {
64
+ for (const k of kids)
65
+ await walk(k.id, mult * k.qty, depth + 1);
66
+ return;
67
+ }
68
+ const member = await groupMemberOf(pid);
69
+ if (member && member !== pid) {
70
+ await walk(member, mult, depth + 1);
71
+ return;
72
+ }
73
+ totals.set(pid, (totals.get(pid) ?? 0) + mult);
74
+ };
75
+ for (const r of baseRows) {
76
+ if (r.component_product_id)
77
+ await walk(r.component_product_id, Number(r.quantity) || 0, 1);
78
+ }
79
+ const over = Array.from(totals.entries()).filter(([, q]) => q >= RATIO_WARN_THRESHOLD);
80
+ if (over.length === 0)
81
+ return [];
82
+ const ids = [...over.map(([id]) => id), ...(parentId ? [parentId] : [])];
83
+ const { data: prods } = await supabase.from("products").select("id,product").in("id", ids);
84
+ const nameOf = new Map((prods ?? []).map((p) => [p.id, String(p.product ?? "")]));
85
+ const parent = (parentId && nameOf.get(parentId)) || "stuk van dit artikel";
86
+ return over.map(([id, qty]) => ({ parent, name: nameOf.get(id) || "onderdeel", qty }));
87
+ }
6
88
  function newRowId() {
7
89
  return `new:${typeof crypto !== "undefined" && "randomUUID" in crypto
8
90
  ? crypto.randomUUID()
@@ -166,6 +248,21 @@ export function StepSamenstelling({ productId, floridayId, packings, packagingTy
166
248
  if (dirty.length === 0)
167
249
  return;
168
250
  setSaving(true);
251
+ // Verhoudingscontrole: alle lagen meetellen, nooit blokkeren.
252
+ try {
253
+ const warnings = await unlikelyRatios(productId, rows.filter((r) => r.packing_configuration_id === null));
254
+ if (warnings.length > 0) {
255
+ const ok = window.confirm(warnings.map((w) => `Let op: 1 ${w.parent} bevat ${fmt(w.qty)} ${w.name}. Klopt dat?`).join("\n") +
256
+ "\n\nKies OK om toch op te slaan, of Annuleren om aan te passen.");
257
+ if (!ok) {
258
+ setSaving(false);
259
+ return;
260
+ }
261
+ }
262
+ }
263
+ catch {
264
+ // Controle mislukt: opslaan gaat gewoon door.
265
+ }
169
266
  try {
170
267
  const inserts = dirty
171
268
  .filter((r) => r._new)
@@ -1,7 +1,7 @@
1
- import type { TradeItem } from "../../lib/floriday-client";
1
+ import type { TradeItem } from "../../lib/floriday-client.js";
2
2
  export declare function StockBulkButtons({ items, activeConnectionId, onImported, }: {
3
3
  items: TradeItem[];
4
4
  activeConnectionId: string | null;
5
5
  onImported: () => void | Promise<void>;
6
- }): import("react").JSX.Element;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
7
  //# sourceMappingURL=StockBulkButtons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StockBulkButtons.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StockBulkButtons.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAwG3D,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,kBAAkB,EAClB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,+BAmoBA"}
1
+ {"version":3,"file":"StockBulkButtons.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StockBulkButtons.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAwG3D,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,kBAAkB,EAClB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,2CAmoBA"}
@@ -3,11 +3,11 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import * as XLSX from "xlsx";
4
4
  import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
5
5
  import { Download, FileDown, Upload, Loader2, Undo2, Play } from "lucide-react";
6
- import { supabase } from "../../integrations/supabase/client";
7
- import { emptyWizardData } from "../../lib/floriday-payload";
8
- import { validateDraftForPublish } from "../../lib/floriday-import-validator";
9
- import { ensureArticleCodes } from "../../lib/ensure-article-codes";
10
- import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
6
+ import { supabase } from "../../integrations/supabase/client.js";
7
+ import { emptyWizardData } from "../../lib/floriday-payload.js";
8
+ import { validateDraftForPublish } from "../../lib/floriday-import-validator.js";
9
+ import { ensureArticleCodes } from "../../lib/ensure-article-codes.js";
10
+ import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields.js";
11
11
  /**
12
12
  * Voorraadimport in porties (Voorraad-module).
13
13
  * De browser leest het bestand en controleert de rijen; de database verwerkt
@@ -193,7 +193,7 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
193
193
  /** Stap 1: bestand lezen en per rij controleren (nog niets opgeslagen). */
194
194
  const handleFile = async (file) => {
195
195
  if (!activeConnectionId) {
196
- toast.error("Geen actieve Floriday-connectie");
196
+ toast.error("Geen actieve Floriday-koppeling. Kijk bij Instellingen › Floriday.");
197
197
  return;
198
198
  }
199
199
  setBusy("lezen");