@flowselections/pick-schermen-kwekers 1.0.60 → 1.0.64
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.
- package/dist-lib/components/pick/PickScherm.d.ts.map +1 -1
- package/dist-lib/components/pick/PickScherm.js +28 -10
- package/dist-lib/components/pick/QueueTable.d.ts +5 -1
- package/dist-lib/components/pick/QueueTable.d.ts.map +1 -1
- package/dist-lib/components/pick/QueueTable.js +14 -31
- package/dist-lib/components/pick/ShippingNoteScan.d.ts.map +1 -1
- package/dist-lib/components/pick/ShippingNoteScan.js +52 -13
- package/dist-lib/components/pick/StickerState.d.ts +4 -0
- package/dist-lib/components/pick/StickerState.d.ts.map +1 -1
- package/dist-lib/components/pick/StickerState.js +30 -4
- package/dist-lib/hooks/usePickPrintStatus.d.ts +14 -0
- package/dist-lib/hooks/usePickPrintStatus.d.ts.map +1 -0
- package/dist-lib/hooks/usePickPrintStatus.js +47 -0
- package/dist-lib/hooks/usePickQueue.d.ts +2 -0
- package/dist-lib/hooks/usePickQueue.d.ts.map +1 -1
- package/dist-lib/hooks/usePickQueue.js +29 -8
- package/dist-lib/integrations/supabase/types.d.ts +937 -7
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/__tests__/pick143.test.js +1 -1
- package/dist-lib/lib/__tests__/pick161.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pick161.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pick161.test.js +29 -0
- package/dist-lib/lib/__tests__/pick163.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pick163.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pick163.test.js +68 -0
- package/dist-lib/lib/__tests__/pickUitwijk.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pickUitwijk.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pickUitwijk.test.js +36 -0
- package/dist-lib/lib/pick143.d.ts +7 -2
- package/dist-lib/lib/pick143.d.ts.map +1 -1
- package/dist-lib/lib/pick143.js +24 -5
- package/dist-lib/lib/pick159.js +2 -2
- package/dist-lib/lib/pick161.d.ts +27 -0
- package/dist-lib/lib/pick161.d.ts.map +1 -0
- package/dist-lib/lib/pick161.js +86 -0
- package/dist-lib/lib/pickPerf.d.ts +11 -0
- package/dist-lib/lib/pickPerf.d.ts.map +1 -0
- package/dist-lib/lib/pickPerf.js +35 -0
- package/dist-lib/lib/pickPreview.d.ts.map +1 -1
- package/dist-lib/lib/pickPreview.js +2 -1
- package/dist-lib/lib/pickPrintStatus.d.ts +36 -0
- package/dist-lib/lib/pickPrintStatus.d.ts.map +1 -0
- package/dist-lib/lib/pickPrintStatus.js +98 -0
- package/dist-lib/lib/pickRowState.d.ts +2 -1
- package/dist-lib/lib/pickRowState.d.ts.map +1 -1
- package/dist-lib/lib/pickRowState.js +4 -2
- package/dist-lib/lib/pickStickers.d.ts +5 -0
- package/dist-lib/lib/pickStickers.d.ts.map +1 -1
- package/dist-lib/lib/pickStickers.js +3 -0
- package/dist-lib/lib/pickUitwijk.d.ts +25 -0
- package/dist-lib/lib/pickUitwijk.d.ts.map +1 -0
- package/dist-lib/lib/pickUitwijk.js +93 -0
- package/dist-lib/lib/shippingNote.d.ts +2 -0
- package/dist-lib/lib/shippingNote.d.ts.map +1 -1
- package/dist-lib/lib/shippingNote.js +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { supabase } from "@flowselections/core";
|
|
4
|
+
import { keyedRpc } from "../lib/pick159.js";
|
|
5
|
+
import { inPrintIds, parsePrintStatus } from "../lib/pickPrintStatus.js";
|
|
6
|
+
import { pickMeasure } from "../lib/pickPerf.js";
|
|
7
|
+
const db = keyedRpc(supabase);
|
|
8
|
+
const MAX_IDS = 500;
|
|
9
|
+
/**
|
|
10
|
+
* Eén aanroep voor alle zichtbare regels. Openbaar station (slug):
|
|
11
|
+
* pickstation_print_status; ingelogd scherm: logistics_print_status direct.
|
|
12
|
+
* Fout: "niet beschikbaar" met reden, nooit terugvallen op printed_at.
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchPrintStatus(ids, slug) {
|
|
15
|
+
const list = ids.slice(0, MAX_IDS);
|
|
16
|
+
const { data, error } = await pickMeasure("printstatus", () => slug
|
|
17
|
+
? db.rpc("pickstation_print_status", { p_slug: slug, p_queue_item_ids: list })
|
|
18
|
+
: db.rpc("logistics_print_status", { p_queue_item_ids: list }));
|
|
19
|
+
if (error) {
|
|
20
|
+
const missing = /could not find|does not exist|PGRST202/i.test(error.message);
|
|
21
|
+
return {
|
|
22
|
+
beschikbaar: false,
|
|
23
|
+
reden: missing ? "Printstatus nog niet beschikbaar: de Logistiek Engine is te oud." : "Printstatus kon niet worden opgehaald.",
|
|
24
|
+
byId: new Map(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return parsePrintStatus(data);
|
|
28
|
+
}
|
|
29
|
+
export function usePickPrintStatus(ids, slug, enabled = true) {
|
|
30
|
+
const sorted = useMemo(() => Array.from(new Set(ids)).sort(), [ids]);
|
|
31
|
+
const q = useQuery({
|
|
32
|
+
queryKey: ["pick", "printStatus", slug ?? "-", sorted.join(",")],
|
|
33
|
+
enabled: enabled && sorted.length > 0,
|
|
34
|
+
queryFn: () => fetchPrintStatus(sorted, slug),
|
|
35
|
+
refetchInterval: (query) => {
|
|
36
|
+
const d = query.state.data;
|
|
37
|
+
return d && inPrintIds(d).size > 0 ? 3000 : 20000;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const inPrint = useMemo(() => inPrintIds(q.data), [q.data]);
|
|
41
|
+
return {
|
|
42
|
+
result: q.data ?? null,
|
|
43
|
+
loading: sorted.length > 0 && q.data === undefined,
|
|
44
|
+
inPrint,
|
|
45
|
+
refetch: q.refetch,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -29,6 +29,8 @@ export declare function usePickQueue(args: {
|
|
|
29
29
|
pendingCount: number;
|
|
30
30
|
printedCount: number;
|
|
31
31
|
urgentCount: number;
|
|
32
|
+
/** Tellingen nog niet geladen: kopregel toont "…". */
|
|
33
|
+
countsLoading: boolean;
|
|
32
34
|
loading: boolean;
|
|
33
35
|
error: string | null;
|
|
34
36
|
lockedIds: Set<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePickQueue.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickQueue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAY,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"usePickQueue.d.ts","sourceRoot":"","sources":["../../src/hooks/usePickQueue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAY,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAK9E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc,EAAE,YAS5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;;;;;;;IAqNG,sDAAsD;;;;;;IAMtD,gEAAgE;;IAEhE,6EAA6E;;;EAIhF;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM;;EAuBhG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,iFAOnF;AACD,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,OAAO,UAAO;;;YAQzC;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAEpF"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
3
|
import { pickApi, pickDb } from "../lib/pickApi.js";
|
|
4
4
|
import { safeArray } from "../lib/pickTypes.js";
|
|
5
|
+
import { isRowOpen } from "../lib/pick143.js";
|
|
6
|
+
import { pickMark, pickMeasure } from "../lib/pickPerf.js";
|
|
5
7
|
export const defaultFilters = {
|
|
6
8
|
country: null,
|
|
7
9
|
search: "",
|
|
@@ -64,7 +66,7 @@ export function usePickQueue(args) {
|
|
|
64
66
|
const pickDayQuery = useQuery({
|
|
65
67
|
queryKey: ["pick", "pickDay"],
|
|
66
68
|
enabled: enabled && !syncQuery.isLoading,
|
|
67
|
-
queryFn: () => pickApi.currentPickDay(),
|
|
69
|
+
queryFn: () => pickMeasure("pickdag", () => pickApi.currentPickDay()),
|
|
68
70
|
staleTime: 30000,
|
|
69
71
|
});
|
|
70
72
|
const pickDay = pickDayOverride ?? pickDayQuery.data ?? null;
|
|
@@ -96,7 +98,7 @@ export function usePickQueue(args) {
|
|
|
96
98
|
queryKey: key,
|
|
97
99
|
// Pas laden als de pickdag bekend is, anders flitst een oude lijst.
|
|
98
100
|
enabled: enabled && (pickDayOverride != null || pickDayQuery.isFetched),
|
|
99
|
-
queryFn: () => pickApi.queue({
|
|
101
|
+
queryFn: () => pickMeasure("wachtrij", () => pickApi.queue({
|
|
100
102
|
stationId,
|
|
101
103
|
screenId,
|
|
102
104
|
country: filters.country,
|
|
@@ -108,15 +110,16 @@ export function usePickQueue(args) {
|
|
|
108
110
|
sortRules: filters.sortRules,
|
|
109
111
|
page: filters.page,
|
|
110
112
|
pageSize: filters.pageSize,
|
|
111
|
-
}),
|
|
113
|
+
})),
|
|
112
114
|
// Vorige lijst alleen vasthouden bij filteren/bladeren binnen hetzelfde station en dezelfde pickdag.
|
|
113
115
|
placeholderData: (prev, prevQuery) => (prevQuery && sameQueueScope(prevQuery.queryKey, key) ? prev : undefined),
|
|
114
116
|
});
|
|
115
117
|
const countsQuery = useQuery({
|
|
116
118
|
queryKey: ["pick", "dayCounts", stationId ?? "-", screenId ?? "-", pickDay ?? "-"],
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
// 1.0.63: pas tellen als de pickdag bekend is (anders telt de database alle
|
|
120
|
+
// dagen en springt de kopregel), en geen oude telling van een andere dag tonen.
|
|
121
|
+
enabled: enabled && pickDay != null,
|
|
122
|
+
queryFn: () => pickMeasure("dagtelling", () => pickApi.dayCounts({ stationId, screenId, pickDay })),
|
|
120
123
|
});
|
|
121
124
|
// Locks komen primair via realtime binnen; deze poll is alleen terugval.
|
|
122
125
|
const locksQuery = useQuery({
|
|
@@ -131,6 +134,7 @@ export function usePickQueue(args) {
|
|
|
131
134
|
queryClient.invalidateQueries({ queryKey: ["pick", "dayCounts"] });
|
|
132
135
|
queryClient.invalidateQueries({ queryKey: ["pick", "countryCounts"] });
|
|
133
136
|
queryClient.invalidateQueries({ queryKey: ["pick", "dashboard"] });
|
|
137
|
+
queryClient.invalidateQueries({ queryKey: ["pick", "printStatus"] });
|
|
134
138
|
}, [queryClient]);
|
|
135
139
|
/**
|
|
136
140
|
* Realtime-meldingen komen bij een Engine-sync in tientallen tegelijk binnen.
|
|
@@ -175,14 +179,31 @@ export function usePickQueue(args) {
|
|
|
175
179
|
pickDb.removeChannel(channel);
|
|
176
180
|
};
|
|
177
181
|
}, [enabled, stationId, invalidate]);
|
|
182
|
+
// Laadtijd: van openen tot de eerste lijst binnen is.
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
if (enabled)
|
|
185
|
+
pickMark("start");
|
|
186
|
+
}, [enabled]);
|
|
187
|
+
const firstReady = useRef(false);
|
|
188
|
+
useEffect(() => {
|
|
189
|
+
if (!firstReady.current && queueQuery.isSuccess) {
|
|
190
|
+
firstReady.current = true;
|
|
191
|
+
pickMark("lijst-klaar");
|
|
192
|
+
}
|
|
193
|
+
}, [queueQuery.isSuccess]);
|
|
194
|
+
// Afgeronde of geannuleerde rijen (bv. na een kar-vervanging) nooit tonen,
|
|
195
|
+
// ook niet uit de vastgehouden vorige lijst.
|
|
196
|
+
const openItems = useMemo(() => safeArray(queueQuery.data?.items).filter((i) => isRowOpen(i)), [queueQuery.data]);
|
|
178
197
|
const lockedIds = useMemo(() => new Set(safeArray(locksQuery.data).map((l) => l.queue_item_id)), [locksQuery.data]);
|
|
179
198
|
return {
|
|
180
|
-
items:
|
|
199
|
+
items: openItems,
|
|
181
200
|
total: queueQuery.data?.total ?? 0,
|
|
182
201
|
pickDay,
|
|
183
202
|
pendingCount: countsQuery.data?.pending ?? 0,
|
|
184
203
|
printedCount: countsQuery.data?.printed ?? 0,
|
|
185
204
|
urgentCount: countsQuery.data?.urgent ?? 0,
|
|
205
|
+
/** Tellingen nog niet geladen: kopregel toont "…". */
|
|
206
|
+
countsLoading: countsQuery.data === undefined,
|
|
186
207
|
loading: queueQuery.isPending,
|
|
187
208
|
error: queueQuery.error instanceof Error ? queueQuery.error.message : null,
|
|
188
209
|
lockedIds,
|