@flowselections/floriday-voorraad 1.0.13 → 1.0.15

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 (114) hide show
  1. package/dist-lib/assets/floriday-logo.png.asset.json +11 -0
  2. package/dist-lib/components/voorraad/ArtikelWizard.d.ts +5 -0
  3. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -0
  4. package/dist-lib/components/voorraad/ArtikelWizard.js +1229 -0
  5. package/dist-lib/components/voorraad/EditArtikelPage.d.ts +4 -0
  6. package/dist-lib/components/voorraad/EditArtikelPage.d.ts.map +1 -0
  7. package/dist-lib/components/voorraad/EditArtikelPage.js +51 -0
  8. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts +2 -0
  9. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -0
  10. package/dist-lib/components/voorraad/NieuwArtikelPage.js +5 -0
  11. package/dist-lib/components/voorraad/StockBulkButtons.d.ts +7 -0
  12. package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -0
  13. package/dist-lib/components/voorraad/StockBulkButtons.js +356 -0
  14. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +7 -0
  15. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -0
  16. package/dist-lib/components/voorraad/ValidationOverviewTable.js +87 -0
  17. package/dist-lib/components/voorraad/ValidationPage.d.ts +2 -0
  18. package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -0
  19. package/dist-lib/components/voorraad/ValidationPage.js +12 -0
  20. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +6 -0
  21. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -0
  22. package/dist-lib/components/voorraad/VoorraadDashboard.js +42 -0
  23. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  24. package/dist-lib/components/voorraad/VoorraadPage.js +70 -11
  25. package/dist-lib/components/voorraad/VoorraadPagination.d.ts +10 -0
  26. package/dist-lib/components/voorraad/VoorraadPagination.d.ts.map +1 -0
  27. package/dist-lib/components/voorraad/VoorraadPagination.js +12 -0
  28. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts +8 -0
  29. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -0
  30. package/dist-lib/components/voorraad/VoorraadStockCard.js +33 -0
  31. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  32. package/dist-lib/components/voorraad/VoorraadTable.js +16 -5
  33. package/dist-lib/hooks/useFloriday.d.ts +55 -0
  34. package/dist-lib/hooks/useFloriday.d.ts.map +1 -0
  35. package/dist-lib/hooks/useFloriday.js +298 -0
  36. package/dist-lib/hooks/useLocalTradeItems.d.ts +17 -1
  37. package/dist-lib/hooks/useLocalTradeItems.d.ts.map +1 -1
  38. package/dist-lib/hooks/useLocalTradeItems.js +54 -10
  39. package/dist-lib/hooks/useTradeItemSpec.d.ts +42 -0
  40. package/dist-lib/hooks/useTradeItemSpec.d.ts.map +1 -0
  41. package/dist-lib/hooks/useTradeItemSpec.js +448 -0
  42. package/dist-lib/hooks/useTradeItemStock.d.ts +19 -0
  43. package/dist-lib/hooks/useTradeItemStock.d.ts.map +1 -0
  44. package/dist-lib/hooks/useTradeItemStock.js +78 -0
  45. package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts +3 -0
  46. package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts.map +1 -0
  47. package/dist-lib/hooks/useVbnRegulatoryFeatures.js +19 -0
  48. package/dist-lib/hooks/useVoorraadData.d.ts +2 -1
  49. package/dist-lib/hooks/useVoorraadData.d.ts.map +1 -1
  50. package/dist-lib/hooks/useVoorraadData.js +39 -11
  51. package/dist-lib/index.d.ts +4 -0
  52. package/dist-lib/index.d.ts.map +1 -1
  53. package/dist-lib/index.js +6 -5
  54. package/dist-lib/integrations/supabase/auth-middleware.d.ts +8346 -3367
  55. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  56. package/dist-lib/integrations/supabase/client.d.ts +8346 -3367
  57. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  58. package/dist-lib/integrations/supabase/client.server.d.ts +8346 -3367
  59. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  60. package/dist-lib/integrations/supabase/types.d.ts +8460 -3341
  61. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  62. package/dist-lib/integrations/supabase/types.js +10 -1
  63. package/dist-lib/lib/__tests__/floricode-required-features.test.d.ts +2 -0
  64. package/dist-lib/lib/__tests__/floricode-required-features.test.d.ts.map +1 -0
  65. package/dist-lib/lib/__tests__/floricode-required-features.test.js +186 -0
  66. package/dist-lib/lib/floricode-client.d.ts +15 -1
  67. package/dist-lib/lib/floricode-client.d.ts.map +1 -1
  68. package/dist-lib/lib/floricode-client.js +42 -4
  69. package/dist-lib/lib/floricode-required-features.functions.d.ts +10026 -0
  70. package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -0
  71. package/dist-lib/lib/floricode-required-features.functions.js +170 -0
  72. package/dist-lib/lib/floriday-client.d.ts +36 -8
  73. package/dist-lib/lib/floriday-client.d.ts.map +1 -1
  74. package/dist-lib/lib/floriday-client.js +206 -25
  75. package/dist-lib/lib/floriday-env.d.ts +29 -0
  76. package/dist-lib/lib/floriday-env.d.ts.map +1 -0
  77. package/dist-lib/lib/floriday-env.js +42 -0
  78. package/dist-lib/lib/floriday-env.server.d.ts +15 -0
  79. package/dist-lib/lib/floriday-env.server.d.ts.map +1 -0
  80. package/dist-lib/lib/floriday-env.server.js +13 -0
  81. package/dist-lib/lib/floriday-field-sources.d.ts +18 -0
  82. package/dist-lib/lib/floriday-field-sources.d.ts.map +1 -0
  83. package/dist-lib/lib/floriday-field-sources.js +45 -0
  84. package/dist-lib/lib/floriday-gateway-entities.d.ts +44 -0
  85. package/dist-lib/lib/floriday-gateway-entities.d.ts.map +1 -0
  86. package/dist-lib/lib/floriday-gateway-entities.js +51 -0
  87. package/dist-lib/lib/floriday-gateway.functions.d.ts +39999 -0
  88. package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -0
  89. package/dist-lib/lib/floriday-gateway.functions.js +68 -0
  90. package/dist-lib/lib/floriday-gateway.server.d.ts +122 -0
  91. package/dist-lib/lib/floriday-gateway.server.d.ts.map +1 -0
  92. package/dist-lib/lib/floriday-gateway.server.js +230 -0
  93. package/dist-lib/lib/floriday-import-validator.d.ts +26 -0
  94. package/dist-lib/lib/floriday-import-validator.d.ts.map +1 -0
  95. package/dist-lib/lib/floriday-import-validator.js +41 -0
  96. package/dist-lib/lib/floriday-payload.d.ts +47 -3
  97. package/dist-lib/lib/floriday-payload.d.ts.map +1 -1
  98. package/dist-lib/lib/floriday-payload.js +179 -7
  99. package/dist-lib/lib/floriday-schema-to-zod.d.ts +9 -0
  100. package/dist-lib/lib/floriday-schema-to-zod.d.ts.map +1 -0
  101. package/dist-lib/lib/floriday-schema-to-zod.js +53 -0
  102. package/dist-lib/lib/floriday-writes.functions.d.ts +19998 -0
  103. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -0
  104. package/dist-lib/lib/floriday-writes.functions.js +74 -0
  105. package/dist-lib/lib/image-resize.d.ts +43 -0
  106. package/dist-lib/lib/image-resize.d.ts.map +1 -0
  107. package/dist-lib/lib/image-resize.js +212 -0
  108. package/dist-lib/lib/normalize-errors-middleware.d.ts +2 -0
  109. package/dist-lib/lib/normalize-errors-middleware.d.ts.map +1 -0
  110. package/dist-lib/lib/normalize-errors-middleware.js +24 -0
  111. package/dist-lib/lib/wizard-step-fields.d.ts +15 -0
  112. package/dist-lib/lib/wizard-step-fields.d.ts.map +1 -0
  113. package/dist-lib/lib/wizard-step-fields.js +51 -0
  114. package/package.json +35 -14
@@ -1,8 +1,17 @@
1
1
  export const Constants = {
2
2
  public: {
3
3
  Enums: {
4
- app_role: ["admin", "manager", "warehouse", "sales", "developer"],
4
+ app_role: [
5
+ "admin",
6
+ "manager",
7
+ "warehouse",
8
+ "sales",
9
+ "developer",
10
+ "receptie",
11
+ "monteur",
12
+ ],
5
13
  exact_env: ["staging", "live"],
14
+ exact_push_status: ["pending", "sent", "error"],
6
15
  quote_status: [
7
16
  "concept",
8
17
  "verzonden",
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=floricode-required-features.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floricode-required-features.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/floricode-required-features.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,186 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { computeVbnRequiredFeatures, } from "../floricode-required-features.functions";
3
+ const REG_100023 = [
4
+ {
5
+ record_id: "REG|100023|S01",
6
+ data: {
7
+ product_id: "100023",
8
+ feature_type_id: "S01",
9
+ regulation_type_id: 1,
10
+ presentation_order: 10,
11
+ },
12
+ },
13
+ {
14
+ record_id: "REG|100023|S02",
15
+ data: {
16
+ product_id: "100023",
17
+ feature_type_id: "S02",
18
+ regulation_type_id: 1,
19
+ presentation_order: 20,
20
+ },
21
+ },
22
+ {
23
+ record_id: "REG|100023|S05",
24
+ data: {
25
+ product_id: "100023",
26
+ feature_type_id: "S05",
27
+ regulation_type_id: 2, // advies
28
+ presentation_order: 30,
29
+ },
30
+ },
31
+ // Vervallen — moet genegeerd worden.
32
+ {
33
+ record_id: "REG|100023|S99",
34
+ data: {
35
+ product_id: "100023",
36
+ feature_type_id: "S99",
37
+ regulation_type_id: 1,
38
+ expiry_date: "2020-01-01",
39
+ },
40
+ },
41
+ // Dubbele S01 → moet gededupliceerd worden.
42
+ {
43
+ record_id: "REG|100023|S01|dup",
44
+ data: {
45
+ product_id: "100023",
46
+ feature_type_id: "S01",
47
+ regulation_type_id: 1,
48
+ presentation_order: 10,
49
+ },
50
+ },
51
+ ];
52
+ const FEATURE_TYPES = [
53
+ { record_id: "S01", data: { description: "Potmaat" } },
54
+ { record_id: "S02", data: { description: "Min planthoogte" } },
55
+ { record_id: "S05", data: { description: "Rijpheidsstadium" } },
56
+ ];
57
+ const FEATURE_VALUES = [
58
+ { data: { feature_type_id: "S01", code: "003", description: "3 cm" } },
59
+ { data: { feature_type_id: "S01", code: "004", description: "4 cm" } },
60
+ { data: { feature_type_id: "S01", code: "004", description: "4 cm" } }, // dup
61
+ { data: { feature_type_id: "S02", code: "010", description: "10 cm" } },
62
+ { data: { feature_type_id: "S05", code: "R", description: "Rijp" } },
63
+ // Vervallen value — moet weg.
64
+ {
65
+ data: {
66
+ feature_type_id: "S01",
67
+ code: "999",
68
+ description: "vervallen",
69
+ expiry_date: "2020-01-01",
70
+ },
71
+ },
72
+ ];
73
+ /**
74
+ * Minimalistische fake die exact de chain reproduceert die
75
+ * `computeVbnRequiredFeatures` gebruikt:
76
+ * .from(table).select(...).eq("resource", X)[.filter(...)|.in(...)]
77
+ * en awaitable is → { data, error }.
78
+ */
79
+ function makeFakeClient(rowsByResource) {
80
+ return {
81
+ from() {
82
+ const state = {};
83
+ const resolve = () => {
84
+ const src = state.resource ? rowsByResource[state.resource] ?? [] : [];
85
+ let out = src;
86
+ if (state.productId !== undefined) {
87
+ out = out.filter((r) => r.data["product_id"] === state.productId);
88
+ }
89
+ if (state.recordIdIn) {
90
+ const set = new Set(state.recordIdIn);
91
+ out = out.filter((r) => r.record_id != null && set.has(r.record_id));
92
+ }
93
+ if (state.featureTypeIdIn) {
94
+ const set = new Set(state.featureTypeIdIn);
95
+ out = out.filter((r) => set.has(String(r.data["feature_type_id"] ?? "")));
96
+ }
97
+ if (state.recordIdLike) {
98
+ const prefix = state.recordIdLike.replace(/%$/, "");
99
+ out = out.filter((r) => String(r.record_id ?? "").startsWith(prefix));
100
+ }
101
+ return { data: out, error: null };
102
+ };
103
+ const builder = {
104
+ select: () => builder,
105
+ eq: (col, val) => {
106
+ if (col === "resource")
107
+ state.resource = val;
108
+ return builder;
109
+ },
110
+ filter: (col, _op, val) => {
111
+ if (col === "data->>product_id")
112
+ state.productId = val;
113
+ return builder;
114
+ },
115
+ in: (col, vals) => {
116
+ if (col === "record_id")
117
+ state.recordIdIn = vals;
118
+ if (col === "data->>feature_type_id")
119
+ state.featureTypeIdIn = vals;
120
+ return builder;
121
+ },
122
+ like: (col, pattern) => {
123
+ if (col === "record_id")
124
+ state.recordIdLike = pattern;
125
+ return builder;
126
+ },
127
+ then: (onFulfilled) => Promise.resolve(resolve()).then(onFulfilled),
128
+ };
129
+ return builder;
130
+ },
131
+ };
132
+ }
133
+ const client = makeFakeClient({
134
+ RegulatoryFeatureType: REG_100023,
135
+ FeatureType: FEATURE_TYPES,
136
+ FeatureValue: FEATURE_VALUES,
137
+ });
138
+ describe("computeVbnRequiredFeatures — VBN 100023", () => {
139
+ it("markeert S01 en S02 als required en S05 als advised", async () => {
140
+ const res = await computeVbnRequiredFeatures(client, "100023");
141
+ expect(res.vbnCode).toBe("100023");
142
+ const byCode = Object.fromEntries(res.features.map((f) => [f.code, f]));
143
+ expect(byCode.S01?.regulation).toBe("required");
144
+ expect(byCode.S01?.label).toBe("Potmaat");
145
+ expect(byCode.S02?.regulation).toBe("required");
146
+ expect(byCode.S02?.label).toBe("Min planthoogte");
147
+ expect(byCode.S05?.regulation).toBe("advised");
148
+ expect(byCode.S05?.label).toBe("Rijpheidsstadium");
149
+ });
150
+ it("filtert vervallen regulatory rows en dedupliceert", async () => {
151
+ const res = await computeVbnRequiredFeatures(client, "100023");
152
+ expect(res.features.find((f) => f.code === "S99")).toBeUndefined();
153
+ // Geen dubbele S01.
154
+ expect(res.features.filter((f) => f.code === "S01")).toHaveLength(1);
155
+ });
156
+ it("sorteert verplicht vóór advies", async () => {
157
+ const res = await computeVbnRequiredFeatures(client, "100023");
158
+ expect(res.features.map((f) => f.code)).toEqual(["S01", "S02", "S05"]);
159
+ });
160
+ it("levert toegestane waarden per feature (gededupliceerd, zonder vervallen)", async () => {
161
+ const res = await computeVbnRequiredFeatures(client, "100023");
162
+ const s01 = res.features.find((f) => f.code === "S01");
163
+ expect(s01?.values.map((v) => v.code).sort()).toEqual(["003", "004"]);
164
+ expect(s01?.values.some((v) => v.code === "999")).toBe(false);
165
+ });
166
+ it("geeft lege lijst terug voor onbekende VBN-code", async () => {
167
+ const res = await computeVbnRequiredFeatures(client, "99999");
168
+ expect(res).toEqual({ vbnCode: "99999", features: [] });
169
+ });
170
+ it("vindt regulatory rows via record_id-prefix als data.product_id ontbreekt", async () => {
171
+ const prefixOnlyClient = makeFakeClient({
172
+ RegulatoryFeatureType: REG_100023.map((r) => ({
173
+ record_id: r.record_id?.replace("REG|100023|", "100023:"),
174
+ data: Object.fromEntries(Object.entries(r.data).filter(([key]) => key !== "product_id")),
175
+ })),
176
+ FeatureType: FEATURE_TYPES,
177
+ FeatureValue: FEATURE_VALUES,
178
+ });
179
+ const res = await computeVbnRequiredFeatures(prefixOnlyClient, "100023");
180
+ expect(res.features.map((f) => [f.code, f.regulation])).toEqual([
181
+ ["S01", "required"],
182
+ ["S02", "required"],
183
+ ["S05", "advised"],
184
+ ]);
185
+ });
186
+ });
@@ -4,9 +4,23 @@ export interface FloricodeRecord {
4
4
  data: Record<string, any>;
5
5
  }
6
6
  export interface ListFloricodeOpts {
7
- /** Optional jsonb field to filter with a LIKE-prefix (e.g. `product_group_id`). */
7
+ /** Optional jsonb field to filter with a single LIKE-prefix. */
8
8
  prefixField?: string;
9
9
  prefix?: string;
10
+ /**
11
+ * Optional jsonb field to filter on één van meerdere prefixes.
12
+ * Wordt vertaald naar een PostgREST `or(field.like.p1%,field.like.p2%,…)`.
13
+ */
14
+ prefixIn?: {
15
+ field: string;
16
+ prefixes: string[];
17
+ };
18
+ /**
19
+ * Token-zoeken: elk token moet (case-insensitive) voorkomen in `name`
20
+ * OF `description`. Hierdoor speelt de woordvolgorde geen rol meer,
21
+ * gelijk aan hoe Floriday zoekt.
22
+ */
23
+ tokens?: string[];
10
24
  /** Optional sort field — either a table column (e.g. `record_id`) or `data->>field` for jsonb. */
11
25
  sortField?: string;
12
26
  sortAscending?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"floricode-client.d.ts","sourceRoot":"","sources":["../../src/lib/floricode-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,EACV,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,EAAE,CAAC,CA0B5B;AAED,0DAA0D;AAC1D,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,KAAK,SAAM,GACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAS5B"}
1
+ {"version":3,"file":"floricode-client.d.ts","sourceRoot":"","sources":["../../src/lib/floricode-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACjD;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,EACV,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,EAAE,CAAC,CA2D5B;AAED,0DAA0D;AAC1D,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,KAAK,SAAO,GACX,OAAO,CAAC,eAAe,EAAE,CAAC,CAS5B"}
@@ -13,9 +13,47 @@ export async function listFloricode(resource, search, limit = 50, opts = {}) {
13
13
  if (opts.prefixField && opts.prefix) {
14
14
  q = q.like(`data->>${opts.prefixField}`, `${opts.prefix}%`);
15
15
  }
16
- if (search && search.trim()) {
17
- const s = search.trim().replace(/[(),]/g, " ");
18
- q = q.or(`data->>name.ilike.%${s}%,data->>description.ilike.%${s}%`);
16
+ if (opts.prefixIn && opts.prefixIn.prefixes.length > 0) {
17
+ const { field, prefixes } = opts.prefixIn;
18
+ const orExpr = prefixes
19
+ .map((p) => `data->>${field}.like.${p}%`)
20
+ .join(",");
21
+ q = q.or(orExpr);
22
+ }
23
+ // Token-zoeken heeft voorrang op simpel substring-zoeken zodra er
24
+ // meerdere woorden zijn — Floriday matcht ook woord-voor-woord.
25
+ const explicitTokens = opts.tokens?.filter((t) => t.trim().length > 0);
26
+ if (explicitTokens && explicitTokens.length > 0) {
27
+ for (const tok of explicitTokens) {
28
+ const s = tok.trim().replace(/[(),%]/g, " ");
29
+ q = q.or(`data->>name.ilike.%${s}%,data->>description.ilike.%${s}%`);
30
+ }
31
+ }
32
+ else if (search && search.trim()) {
33
+ const cleaned = search.trim().replace(/[(),%]/g, " ");
34
+ const parts = cleaned.split(/\s+/).filter(Boolean);
35
+ if (parts.length > 1) {
36
+ for (const tok of parts) {
37
+ const isNumeric = /^\d+$/.test(tok);
38
+ const clauses = [
39
+ `data->>name.ilike.%${tok}%`,
40
+ `data->>description.ilike.%${tok}%`,
41
+ ];
42
+ if (isNumeric)
43
+ clauses.push(`record_id.ilike.%${tok}%`);
44
+ q = q.or(clauses.join(","));
45
+ }
46
+ }
47
+ else {
48
+ const isNumeric = /^\d+$/.test(cleaned);
49
+ const clauses = [
50
+ `data->>name.ilike.%${cleaned}%`,
51
+ `data->>description.ilike.%${cleaned}%`,
52
+ ];
53
+ if (isNumeric)
54
+ clauses.push(`record_id.ilike.%${cleaned}%`);
55
+ q = q.or(clauses.join(","));
56
+ }
19
57
  }
20
58
  if (opts.sortField) {
21
59
  const ascending = opts.sortAscending ?? true;
@@ -27,7 +65,7 @@ export async function listFloricode(resource, search, limit = 50, opts = {}) {
27
65
  return (data ?? []);
28
66
  }
29
67
  /** Exact-match lookup op een veld binnen data (jsonb). */
30
- export async function listFloricodeByField(resource, field, value, limit = 500) {
68
+ export async function listFloricodeByField(resource, field, value, limit = 2000) {
31
69
  const { data, error } = await supabase
32
70
  .from("floricode_records")
33
71
  .select("record_id,resource,data")