@flowselections/pick-schermen-kwekers 1.0.57 → 1.0.60
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/PickPublicPage.d.ts.map +1 -1
- package/dist-lib/components/PickPublicPage.js +33 -2
- package/dist-lib/components/PickstationsPage.d.ts.map +1 -1
- package/dist-lib/components/PickstationsPage.js +2 -1
- package/dist-lib/components/pick/StationDevices.d.ts +6 -0
- package/dist-lib/components/pick/StationDevices.d.ts.map +1 -0
- package/dist-lib/components/pick/StationDevices.js +55 -0
- package/dist-lib/components/pick/StationPairing.d.ts +7 -0
- package/dist-lib/components/pick/StationPairing.d.ts.map +1 -0
- package/dist-lib/components/pick/StationPairing.js +25 -0
- package/dist-lib/hooks/usePickQueue.d.ts.map +1 -1
- package/dist-lib/hooks/usePickQueue.js +4 -0
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +1 -0
- package/dist-lib/integrations/supabase/types.d.ts +3400 -90
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/__tests__/pick159.test.d.ts +2 -0
- package/dist-lib/lib/__tests__/pick159.test.d.ts.map +1 -0
- package/dist-lib/lib/__tests__/pick159.test.js +36 -0
- package/dist-lib/lib/pick150.d.ts.map +1 -1
- package/dist-lib/lib/pick150.js +2 -1
- package/dist-lib/lib/pick152.d.ts.map +1 -1
- package/dist-lib/lib/pick152.js +2 -1
- package/dist-lib/lib/pick156.d.ts.map +1 -1
- package/dist-lib/lib/pick156.js +2 -1
- package/dist-lib/lib/pick159.d.ts +56 -0
- package/dist-lib/lib/pick159.d.ts.map +1 -0
- package/dist-lib/lib/pick159.js +125 -0
- package/dist-lib/lib/pickApi.d.ts.map +1 -1
- package/dist-lib/lib/pickApi.js +35 -81
- package/dist-lib/lib/pickPreview.d.ts.map +1 -1
- package/dist-lib/lib/pickPreview.js +3 -4
- package/dist-lib/lib/pickStickers.d.ts.map +1 -1
- package/dist-lib/lib/pickStickers.js +2 -1
- package/package.json +5 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick159.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/pick159.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("@flowselections/core", () => ({ supabase: {} }));
|
|
3
|
+
import { mustPair, pairResult, parseDeviceStatus, NOT_PAIRED_TEXT } from "../pick159.js";
|
|
4
|
+
describe("1.0.59 apparaatsleutel", () => {
|
|
5
|
+
it("koppelscherm alleen als verplicht en niet gekoppeld", () => {
|
|
6
|
+
expect(mustPair({ stationBekend: true, verplicht: true, gekoppeld: false })).toBe(true);
|
|
7
|
+
expect(mustPair({ stationBekend: true, verplicht: false, gekoppeld: false })).toBe(false);
|
|
8
|
+
expect(mustPair({ stationBekend: true, verplicht: true, gekoppeld: true })).toBe(false);
|
|
9
|
+
});
|
|
10
|
+
it("onleesbare status blokkeert niet", () => {
|
|
11
|
+
expect(parseDeviceStatus("x")).toBeNull();
|
|
12
|
+
expect(mustPair(parseDeviceStatus(null))).toBe(false);
|
|
13
|
+
});
|
|
14
|
+
it("vervallen code na 5 pogingen geeft eigen tekst", () => {
|
|
15
|
+
const r = pairResult({ ok: false, reden: "code_vervallen" });
|
|
16
|
+
expect(r.ok).toBe(false);
|
|
17
|
+
if (!r.ok)
|
|
18
|
+
expect(r.tekst).toContain("vervallen");
|
|
19
|
+
});
|
|
20
|
+
it("korte sleutel wordt niet geaccepteerd", () => {
|
|
21
|
+
expect(pairResult({ ok: true, device_key: "kort" }).ok).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it("tekst niet gekoppeld", () => expect(NOT_PAIRED_TEXT).toContain("nog niet gekoppeld"));
|
|
24
|
+
});
|
|
25
|
+
import { keyedCall } from "../pick159.js";
|
|
26
|
+
describe("1.0.59 sleutelvarianten", () => {
|
|
27
|
+
it("stuurt een pickfunctie naar de variant met sleutel", () => {
|
|
28
|
+
expect(keyedCall("pick_release_lock", { _queue_item_id: "x" }, "k")).toEqual({ fn: "pick_release_lock", args: { _queue_item_id: "x", p_device_key: "k" } });
|
|
29
|
+
});
|
|
30
|
+
it("stuurt een Engine-functie naar het pickstation-omhulsel", () => {
|
|
31
|
+
expect(keyedCall("logistics_pick_mode", undefined, null)).toEqual({ fn: "pickstation_logistics_pick_mode", args: { p_device_key: null } });
|
|
32
|
+
});
|
|
33
|
+
it("laat koppelen ongemoeid", () => {
|
|
34
|
+
expect(keyedCall("pickstation_pair_device", { p_slug: "a" }, "k")).toEqual({ fn: "pickstation_pair_device", args: { p_slug: "a" } });
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick150.d.ts","sourceRoot":"","sources":["../../src/lib/pick150.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pick150.d.ts","sourceRoot":"","sources":["../../src/lib/pick150.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AACjF,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAOD,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,IAAI,CAiBjE;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAInF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAMvG"}
|
package/dist-lib/lib/pick150.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Pickschermen 1.0.50: controle vooraf of klantstickers passen. Alleen lezen;
|
|
2
2
|
// de uitkomst en melding komen letterlijk uit Layouts en printers.
|
|
3
3
|
import { supabase } from "@flowselections/core";
|
|
4
|
-
|
|
4
|
+
import { keyedRpc } from "./pick159.js";
|
|
5
|
+
const db = keyedRpc(supabase);
|
|
5
6
|
export const STICKER_FIT_UNKNOWN = "Stickercontrole onbekend";
|
|
6
7
|
const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
7
8
|
const txt = (v) => (typeof v === "string" && v.trim() ? v : null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick152.d.ts","sourceRoot":"","sources":["../../src/lib/pick152.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pick152.d.ts","sourceRoot":"","sources":["../../src/lib/pick152.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKvD,eAAO,MAAM,cAAc,2DAA2D,CAAC;AAQvF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGjF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAO9E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAK1G"}
|
package/dist-lib/lib/pick152.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// 1.0.52: stickers van een kar opnieuw printen via de Engine (pickstation_sticker_reprint).
|
|
2
2
|
// Deze module maakt zelf nooit printopdrachten.
|
|
3
3
|
import { supabase } from "@flowselections/core";
|
|
4
|
-
|
|
4
|
+
import { keyedRpc } from "./pick159.js";
|
|
5
|
+
const db = keyedRpc(supabase);
|
|
5
6
|
export const REPRINT_FAILED = "Opnieuw printen lukte niet. Probeer het later opnieuw.";
|
|
6
7
|
const REDEN_TEKST = {
|
|
7
8
|
onbekend_of_inactief_station: "Dit pickstation is onbekend of staat uit.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick156.d.ts","sourceRoot":"","sources":["../../src/lib/pick156.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pick156.d.ts","sourceRoot":"","sources":["../../src/lib/pick156.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,kBAAkB,yDAAyD,CAAC;AACzF,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,eAAO,MAAM,yBAAyB,6DAA6D,CAAC;AAEpG,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvD;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAMzB,sGAAsG;AACtG,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAMhE;AAED,2EAA2E;AAC3E,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAKvE;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAErG;AAOD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiB1B"}
|
package/dist-lib/lib/pick156.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Pickschermen 1.0.56: het document wordt automatisch bepaald uit de order
|
|
2
2
|
// (logistics_document_for_order). Alleen lezen; de Engine kiest bij het printen zelf.
|
|
3
3
|
import { supabase } from "@flowselections/core";
|
|
4
|
-
|
|
4
|
+
import { keyedRpc } from "./pick159.js";
|
|
5
|
+
const db = keyedRpc(supabase);
|
|
5
6
|
export const DOCUMENT_AUTO_TEXT = "Het document wordt automatisch bepaald uit de order.";
|
|
6
7
|
export const DOCUMENT_CHOICE_UNKNOWN = "Documentcontrole onbekend";
|
|
7
8
|
export const DOCUMENT_BLOCKED_FALLBACK = "Voor deze order kan dit document nu niet worden gemaakt.";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export declare const NOT_PAIRED_TEXT = "Dit pickstation is nog niet gekoppeld. Vraag een beheerder om de QR-code te scannen.";
|
|
2
|
+
export declare const PAIR_FAILED = "Koppelen lukte niet. Probeer het opnieuw.";
|
|
3
|
+
export declare function readDeviceKey(slug: string): string | null;
|
|
4
|
+
export declare function saveDeviceKey(slug: string, key: string): void;
|
|
5
|
+
export type DeviceStatus = {
|
|
6
|
+
stationBekend: boolean;
|
|
7
|
+
gekoppeld: boolean;
|
|
8
|
+
verplicht: boolean;
|
|
9
|
+
} | null;
|
|
10
|
+
export declare function parseDeviceStatus(raw: unknown): DeviceStatus;
|
|
11
|
+
/** Moet het koppelscherm getoond worden? Onleesbare status = niet blokkeren (de database beslist). */
|
|
12
|
+
export declare function mustPair(s: DeviceStatus): boolean;
|
|
13
|
+
export declare function pairResult(raw: unknown): {
|
|
14
|
+
ok: true;
|
|
15
|
+
key: string;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
tekst: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function fetchDeviceStatus(slug: string, key: string | null): Promise<DeviceStatus>;
|
|
21
|
+
export declare function pairDevice(slug: string, code: string, name: string | null): Promise<{
|
|
22
|
+
ok: true;
|
|
23
|
+
key: string;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
tekst: string;
|
|
27
|
+
}>;
|
|
28
|
+
export type DeviceRow = {
|
|
29
|
+
id: string;
|
|
30
|
+
naam: string | null;
|
|
31
|
+
laatst_gezien: string | null;
|
|
32
|
+
ingetrokken_op: string | null;
|
|
33
|
+
created_at: string;
|
|
34
|
+
};
|
|
35
|
+
export declare function createPairCode(stationId: string): Promise<{
|
|
36
|
+
code: string;
|
|
37
|
+
geldigTot: string;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function listDevices(stationId: string): Promise<DeviceRow[]>;
|
|
40
|
+
export declare function revokeDevice(deviceId: string): Promise<void>;
|
|
41
|
+
export declare function setActiveDeviceKey(key: string | null): void;
|
|
42
|
+
export declare function activeDeviceKey(): string | null;
|
|
43
|
+
/** Functies met een variant met p_device_key (zelfde naam). */
|
|
44
|
+
export declare const KEYED_RPCS: Set<string>;
|
|
45
|
+
/** Engine-functies: via een eigen pickstation_-omhulsel met sleutelcontrole. */
|
|
46
|
+
export declare const ENGINE_WRAPPED: Set<string>;
|
|
47
|
+
/** Naam en argumenten (op naam) van de variant met sleutel. */
|
|
48
|
+
export declare function keyedCall(fn: string, args: Record<string, unknown> | undefined, key: string | null): {
|
|
49
|
+
fn: string;
|
|
50
|
+
args: Record<string, unknown> | undefined;
|
|
51
|
+
};
|
|
52
|
+
/** Client-omhulsel: stuurt elke bekende aanroep naar de variant met sleutel. */
|
|
53
|
+
export declare function keyedRpc<T extends {
|
|
54
|
+
rpc: (fn: string, args?: Record<string, unknown>) => unknown;
|
|
55
|
+
}>(client: T): T;
|
|
56
|
+
//# sourceMappingURL=pick159.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick159.d.ts","sourceRoot":"","sources":["../../src/lib/pick159.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,yFAAyF,CAAC;AACtH,eAAO,MAAM,WAAW,8CAA8C,CAAC;AAUvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD;AACD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAEtD;AAKD,MAAM,MAAM,YAAY,GAAG;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC;AAErG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAI5D;AAED,sGAAsG;AACtG,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAEjD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAOjG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAI/F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;QAfhC,IAAI;SAAO,MAAM;;QAAW,KAAK;WAAS,MAAM;GAmB/F;AAED,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7I,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAMpG;AACD,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAIzE;AACD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,iBAGlD;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,QAEpD;AACD,wBAAgB,eAAe,kBAE9B;AAED,+DAA+D;AAC/D,eAAO,MAAM,UAAU,aAerB,CAAC;AACH,gFAAgF;AAChF,eAAO,MAAM,cAAc,aAIzB,CAAC;AAEH,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;;;EAIlG;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,CAAC,SAAS;IAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAQjH"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Pickschermen 1.0.59: apparaatsleutel per pickstation.
|
|
2
|
+
// De sleutel staat alleen op het apparaat (localStorage); de database bewaart alleen de hash.
|
|
3
|
+
import { supabase } from "@flowselections/core";
|
|
4
|
+
const db = supabase;
|
|
5
|
+
export const NOT_PAIRED_TEXT = "Dit pickstation is nog niet gekoppeld. Vraag een beheerder om de QR-code te scannen.";
|
|
6
|
+
export const PAIR_FAILED = "Koppelen lukte niet. Probeer het opnieuw.";
|
|
7
|
+
const REDEN_TEKST = {
|
|
8
|
+
onbekend_of_inactief_station: "Dit pickstation is onbekend of staat uit.",
|
|
9
|
+
geen_geldige_code: "Er is geen geldige koppelcode. Vraag een beheerder om een nieuwe code.",
|
|
10
|
+
code_onjuist: "Deze code klopt niet. Controleer de code en probeer het opnieuw.",
|
|
11
|
+
code_vervallen: "Deze code is vervallen na te veel pogingen. Vraag een beheerder om een nieuwe code.",
|
|
12
|
+
};
|
|
13
|
+
const storageKey = (slug) => `pickstation-device-key:${slug}`;
|
|
14
|
+
export function readDeviceKey(slug) {
|
|
15
|
+
try {
|
|
16
|
+
const v = window.localStorage.getItem(storageKey(slug));
|
|
17
|
+
return v && v.length >= 32 ? v : null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function saveDeviceKey(slug, key) {
|
|
24
|
+
window.localStorage.setItem(storageKey(slug), key);
|
|
25
|
+
}
|
|
26
|
+
const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
27
|
+
export function parseDeviceStatus(raw) {
|
|
28
|
+
const r = rec(raw);
|
|
29
|
+
if (!r || typeof r["gekoppeld"] !== "boolean")
|
|
30
|
+
return null;
|
|
31
|
+
return { stationBekend: r["station_bekend"] === true, gekoppeld: r["gekoppeld"] === true, verplicht: r["verplicht"] === true };
|
|
32
|
+
}
|
|
33
|
+
/** Moet het koppelscherm getoond worden? Onleesbare status = niet blokkeren (de database beslist). */
|
|
34
|
+
export function mustPair(s) {
|
|
35
|
+
return !!s && s.stationBekend && s.verplicht && !s.gekoppeld;
|
|
36
|
+
}
|
|
37
|
+
export function pairResult(raw) {
|
|
38
|
+
const r = rec(raw);
|
|
39
|
+
if (r?.["ok"] === true && typeof r["device_key"] === "string" && r["device_key"].length >= 32) {
|
|
40
|
+
return { ok: true, key: r["device_key"] };
|
|
41
|
+
}
|
|
42
|
+
const reden = typeof r?.["reden"] === "string" ? r["reden"] : "";
|
|
43
|
+
return { ok: false, tekst: REDEN_TEKST[reden] ?? PAIR_FAILED };
|
|
44
|
+
}
|
|
45
|
+
export async function fetchDeviceStatus(slug, key) {
|
|
46
|
+
const { data, error } = await db.rpc("pickstation_device_status", { p_slug: slug, p_device_key: key });
|
|
47
|
+
if (error)
|
|
48
|
+
throw new Error(error.message);
|
|
49
|
+
return parseDeviceStatus(data);
|
|
50
|
+
}
|
|
51
|
+
export async function pairDevice(slug, code, name) {
|
|
52
|
+
const { data, error } = await db.rpc("pickstation_pair_device", { p_slug: slug, p_code: code, p_device_name: name });
|
|
53
|
+
if (error)
|
|
54
|
+
return { ok: false, tekst: PAIR_FAILED };
|
|
55
|
+
return pairResult(data);
|
|
56
|
+
}
|
|
57
|
+
export async function createPairCode(stationId) {
|
|
58
|
+
const { data, error } = await db.rpc("pick_create_pair_code", { p_station_id: stationId });
|
|
59
|
+
if (error)
|
|
60
|
+
throw new Error(error.message);
|
|
61
|
+
const r = rec(data);
|
|
62
|
+
if (!r || typeof r["code"] !== "string")
|
|
63
|
+
throw new Error(PAIR_FAILED);
|
|
64
|
+
return { code: r["code"], geldigTot: String(r["geldig_tot"] ?? "") };
|
|
65
|
+
}
|
|
66
|
+
export async function listDevices(stationId) {
|
|
67
|
+
const { data, error } = await db.rpc("pick_station_devices_list", { p_station_id: stationId });
|
|
68
|
+
if (error)
|
|
69
|
+
throw new Error(error.message);
|
|
70
|
+
return Array.isArray(data) ? data : [];
|
|
71
|
+
}
|
|
72
|
+
export async function revokeDevice(deviceId) {
|
|
73
|
+
const { error } = await db.rpc("pick_revoke_device", { p_device_id: deviceId });
|
|
74
|
+
if (error)
|
|
75
|
+
throw new Error(error.message);
|
|
76
|
+
}
|
|
77
|
+
// Actieve sleutel van dit apparaat; null = ingelogd scherm of nog niet gekoppeld.
|
|
78
|
+
let activeKey = null;
|
|
79
|
+
export function setActiveDeviceKey(key) {
|
|
80
|
+
activeKey = key;
|
|
81
|
+
}
|
|
82
|
+
export function activeDeviceKey() {
|
|
83
|
+
return activeKey;
|
|
84
|
+
}
|
|
85
|
+
/** Functies met een variant met p_device_key (zelfde naam). */
|
|
86
|
+
export const KEYED_RPCS = new Set([
|
|
87
|
+
"pick_active_printers", "pick_apply_buffer_events", "pick_available_pick_days", "pick_claim_document",
|
|
88
|
+
"pick_claim_next_document", "pick_complete_print", "pick_complete_print_cart", "pick_complete_print_carts",
|
|
89
|
+
"pick_current_pick_day", "pick_day_counts", "pick_enqueue_print_job", "pick_mark_printed", "pick_preview_job",
|
|
90
|
+
"pick_print_job_status", "pick_print_jobs_status", "pick_print_plekken", "pick_queue_cart_plan",
|
|
91
|
+
"pick_reference_data_status", "pick_release_expired_locks", "pick_release_lock", "pick_report_missing_cart_plan",
|
|
92
|
+
"pick_reprint_cart", "pick_reprint_document", "pick_reset_print", "pick_reset_print_job", "pick_reset_print_jobs",
|
|
93
|
+
"pick_restore_to_queue", "pick_set_station_print_plek", "pick_station_dashboard", "pick_station_print_plek",
|
|
94
|
+
"pick_station_print_plekken", "pick_sync_pick_day", "pick_sync_queue_throttled", "pick_verify_rows",
|
|
95
|
+
"pickstation_auto_send_status", "pickstation_cart_sticker_state", "pickstation_document_for_order",
|
|
96
|
+
"pickstation_get_orders_raw", "pickstation_get_planning_context", "pickstation_get_settings", "pickstation_log_print",
|
|
97
|
+
"pickstation_order_sticker_meldingen", "pickstation_resolve_delivery_orders", "pickstation_sticker_past_controle",
|
|
98
|
+
"pickstation_sticker_reprint",
|
|
99
|
+
"pick_read_station", "pick_read_locks", "pick_read_queue", "pick_read_country_counts", "pick_read_by_code",
|
|
100
|
+
"pick_read_unscanned_earlier",
|
|
101
|
+
]);
|
|
102
|
+
/** Engine-functies: via een eigen pickstation_-omhulsel met sleutelcontrole. */
|
|
103
|
+
export const ENGINE_WRAPPED = new Set([
|
|
104
|
+
"logistics_barcode_lookup", "logistics_cart_plan_status", "logistics_cart_slip_plan", "logistics_complete_task",
|
|
105
|
+
"logistics_is_pick_workday", "logistics_order_released", "logistics_pick_mode",
|
|
106
|
+
"logistics_shipping_note_from_barcode", "logistics_working_hours_status",
|
|
107
|
+
]);
|
|
108
|
+
/** Naam en argumenten (op naam) van de variant met sleutel. */
|
|
109
|
+
export function keyedCall(fn, args, key) {
|
|
110
|
+
if (ENGINE_WRAPPED.has(fn))
|
|
111
|
+
return { fn: `pickstation_${fn}`, args: { ...(args ?? {}), p_device_key: key } };
|
|
112
|
+
if (KEYED_RPCS.has(fn))
|
|
113
|
+
return { fn, args: { ...(args ?? {}), p_device_key: key } };
|
|
114
|
+
return { fn, args };
|
|
115
|
+
}
|
|
116
|
+
/** Client-omhulsel: stuurt elke bekende aanroep naar de variant met sleutel. */
|
|
117
|
+
export function keyedRpc(client) {
|
|
118
|
+
return {
|
|
119
|
+
...client,
|
|
120
|
+
rpc: (fn, args) => {
|
|
121
|
+
const c = keyedCall(fn, args, activeKey);
|
|
122
|
+
return client.rpc(c.fn, c.args);
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickApi.d.ts","sourceRoot":"","sources":["../../src/lib/pickApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EAEX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,UAAU,EACV,QAAQ,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAA2C,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pickApi.d.ts","sourceRoot":"","sources":["../../src/lib/pickApi.ts"],"names":[],"mappings":"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"}
|
package/dist-lib/lib/pickApi.js
CHANGED
|
@@ -3,12 +3,16 @@ import { supabase } from "@flowselections/core";
|
|
|
3
3
|
import { cartPlanMismatchesOf, parsePickCartPlan } from "./pickTypes.js";
|
|
4
4
|
import { safeArray } from "./pickTypes.js";
|
|
5
5
|
import { withRetry } from "./pickRetry.js";
|
|
6
|
+
import { activeDeviceKey, keyedCall } from "./pick159.js";
|
|
6
7
|
const raw = supabase;
|
|
7
8
|
/** Zelfde client, maar RPC-aanroepen vangen tijdelijke netwerkhaperingen op. */
|
|
8
9
|
export function createRetryingDb(base) {
|
|
9
10
|
return {
|
|
10
11
|
from: (t) => base.from(t),
|
|
11
|
-
rpc: (fn, args) =>
|
|
12
|
+
rpc: (fn, args) => {
|
|
13
|
+
const c = keyedCall(fn, args, activeDeviceKey());
|
|
14
|
+
return withRetry(() => base.rpc(c.fn, c.args));
|
|
15
|
+
},
|
|
12
16
|
channel: (name) => base.channel(name),
|
|
13
17
|
removeChannel: (c) => base.removeChannel(c),
|
|
14
18
|
get auth() {
|
|
@@ -154,7 +158,7 @@ export const pickApi = {
|
|
|
154
158
|
return unwrap(await db.from("pick_stations").select("*").order("sort_order"));
|
|
155
159
|
},
|
|
156
160
|
async stationBySlug(slug) {
|
|
157
|
-
const rows = unwrap(await db.
|
|
161
|
+
const rows = unwrap(await db.rpc("pick_read_station", { p_slug: slug }));
|
|
158
162
|
return rows[0] ?? null;
|
|
159
163
|
},
|
|
160
164
|
async screens(stationId) {
|
|
@@ -167,10 +171,7 @@ export const pickApi = {
|
|
|
167
171
|
return unwrap(await db.from("pick_screen_document_types").select("*").eq("screen_id", screenId).order("print_order"));
|
|
168
172
|
},
|
|
169
173
|
async locks(stationId) {
|
|
170
|
-
|
|
171
|
-
if (stationId)
|
|
172
|
-
q = q.eq("station_id", stationId);
|
|
173
|
-
return unwrap(await q);
|
|
174
|
+
return unwrap(await db.rpc("pick_read_locks", { p_station_id: stationId ?? null }));
|
|
174
175
|
},
|
|
175
176
|
async dashboard() {
|
|
176
177
|
const { data, error } = await db.rpc("pick_station_dashboard");
|
|
@@ -241,22 +242,16 @@ export const pickApi = {
|
|
|
241
242
|
};
|
|
242
243
|
},
|
|
243
244
|
async countryCounts(args) {
|
|
244
|
-
|
|
245
|
-
.
|
|
246
|
-
.
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
.
|
|
250
|
-
.limit(5000);
|
|
251
|
-
if (args.screenId)
|
|
252
|
-
q = q.eq("screen_id", args.screenId);
|
|
253
|
-
if (args.stationId)
|
|
254
|
-
q = q.eq("station_id", args.stationId);
|
|
255
|
-
const rows = unwrap(await q);
|
|
245
|
+
const { data, error } = await db.rpc("pick_read_country_counts", {
|
|
246
|
+
p_station_id: args.stationId ?? null,
|
|
247
|
+
p_screen_id: args.screenId ?? null,
|
|
248
|
+
});
|
|
249
|
+
if (error)
|
|
250
|
+
throw new Error(error.message);
|
|
256
251
|
const counts = {};
|
|
257
|
-
|
|
258
|
-
const
|
|
259
|
-
|
|
252
|
+
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
253
|
+
for (const [k, v] of Object.entries(data))
|
|
254
|
+
counts[k] = Number(v) || 0;
|
|
260
255
|
}
|
|
261
256
|
return counts;
|
|
262
257
|
},
|
|
@@ -264,32 +259,6 @@ export const pickApi = {
|
|
|
264
259
|
async queue(params) {
|
|
265
260
|
const pageSize = params.pageSize ?? 50;
|
|
266
261
|
const page = params.page ?? 0;
|
|
267
|
-
let q = db.from("pick_queue").select("*", { count: "exact" });
|
|
268
|
-
if (params.screenId)
|
|
269
|
-
q = q.eq("screen_id", params.screenId);
|
|
270
|
-
if (params.stationId)
|
|
271
|
-
q = q.eq("station_id", params.stationId);
|
|
272
|
-
if (params.country)
|
|
273
|
-
q = q.eq("country_code", params.country);
|
|
274
|
-
if (params.documentTypeId)
|
|
275
|
-
q = q.eq("document_type_id", params.documentTypeId);
|
|
276
|
-
if (params.urgentOnly)
|
|
277
|
-
q = q.eq("is_urgent", true);
|
|
278
|
-
if (params.pickDay)
|
|
279
|
-
q = q.eq("payload->>pickDate", params.pickDay);
|
|
280
|
-
q = q.is("cancelled_at", null).is("completed_at", null);
|
|
281
|
-
if (!params.includeDone)
|
|
282
|
-
q = q.is("printed_at", null);
|
|
283
|
-
if (params.search) {
|
|
284
|
-
const s = `%${params.search}%`;
|
|
285
|
-
q = q.or([
|
|
286
|
-
`document_number.ilike.${s}`,
|
|
287
|
-
`order_number.ilike.${s}`,
|
|
288
|
-
`customer_name.ilike.${s}`,
|
|
289
|
-
`reference.ilike.${s}`,
|
|
290
|
-
`barcode.ilike.${s}`,
|
|
291
|
-
].join(","));
|
|
292
|
-
}
|
|
293
262
|
const rules = params.sortRules?.length
|
|
294
263
|
? params.sortRules
|
|
295
264
|
: [
|
|
@@ -297,50 +266,35 @@ export const pickApi = {
|
|
|
297
266
|
{ field: "priority", direction: "asc" },
|
|
298
267
|
{ field: "announced_at", direction: "asc" },
|
|
299
268
|
];
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
269
|
+
const { data, error } = await db.rpc("pick_read_queue", {
|
|
270
|
+
p_station_id: params.stationId ?? null,
|
|
271
|
+
p_screen_id: params.screenId ?? null,
|
|
272
|
+
p_country: params.country ?? null,
|
|
273
|
+
p_search: params.search || null,
|
|
274
|
+
p_document_type_id: params.documentTypeId ?? null,
|
|
275
|
+
p_urgent_only: !!params.urgentOnly,
|
|
276
|
+
p_include_done: !!params.includeDone,
|
|
277
|
+
p_pick_day: params.pickDay ?? null,
|
|
278
|
+
p_sort: rules.map((r) => ({ field: r.field, direction: r.direction })),
|
|
279
|
+
p_offset: page * pageSize,
|
|
280
|
+
p_limit: pageSize,
|
|
281
|
+
});
|
|
282
|
+
if (error)
|
|
283
|
+
throw new Error(error.message);
|
|
284
|
+
const row = (data && typeof data === "object" ? data : {});
|
|
285
|
+
return { items: safeArray(row["items"]), total: Number(row["total"] ?? 0) || 0 };
|
|
307
286
|
},
|
|
308
287
|
/** Zoekt één wachtrijregel op barcode, documentnummer of ordernummer (voor de scanner). */
|
|
309
288
|
async findByCode(code, stationId) {
|
|
310
289
|
const value = code.trim();
|
|
311
290
|
if (!value)
|
|
312
291
|
return null;
|
|
313
|
-
|
|
314
|
-
.from("pick_queue")
|
|
315
|
-
.select("*")
|
|
316
|
-
.is("cancelled_at", null)
|
|
317
|
-
.is("completed_at", null)
|
|
318
|
-
.or([
|
|
319
|
-
`barcode.eq.${value}`,
|
|
320
|
-
`document_number.eq.${value}`,
|
|
321
|
-
`order_number.eq.${value}`,
|
|
322
|
-
].join(","))
|
|
323
|
-
.order("printed_at", { ascending: true, nullsFirst: true })
|
|
324
|
-
.limit(1);
|
|
325
|
-
if (stationId)
|
|
326
|
-
q = q.eq("station_id", stationId);
|
|
327
|
-
const rows = unwrap(await q);
|
|
292
|
+
const rows = unwrap(await db.rpc("pick_read_by_code", { p_code: value, p_station_id: stationId ?? null }));
|
|
328
293
|
return rows[0] ?? null;
|
|
329
294
|
},
|
|
330
295
|
/** Geprint, nog niet gescand, van een pickdag vóór de gekozen dag (Engine 1.0.152). */
|
|
331
296
|
async unscannedEarlier(args) {
|
|
332
|
-
|
|
333
|
-
.from("pick_queue")
|
|
334
|
-
.select("*")
|
|
335
|
-
.not("printed_at", "is", null)
|
|
336
|
-
.is("cancelled_at", null)
|
|
337
|
-
.is("completed_at", null)
|
|
338
|
-
.lt("payload->>pickDate", args.beforeDay)
|
|
339
|
-
.order("printed_at", { ascending: true })
|
|
340
|
-
.limit(200);
|
|
341
|
-
if (args.stationId)
|
|
342
|
-
q = q.eq("station_id", args.stationId);
|
|
343
|
-
return unwrap(await q);
|
|
297
|
+
return unwrap(await db.rpc("pick_read_unscanned_earlier", { p_station_id: args.stationId ?? null, p_before_day: args.beforeDay }));
|
|
344
298
|
},
|
|
345
299
|
async claimNext(args) {
|
|
346
300
|
const { data, error } = await db.rpc("pick_claim_next_document", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pickPreview.d.ts","sourceRoot":"","sources":["../../src/lib/pickPreview.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,qFAAqF;IACrF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yDAAyD;IACzD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,2BAA2B,uGAC8D,CAAC;AAEvG,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,GAAG,IAAW;CAMnF;AAcD,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C7B"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// RPC: pick_preview_job(_station_slug, _queue_item_id) -> jsonb
|
|
3
3
|
// Deze module print hier nooit mee; de RPC raakt print_jobs niet aan.
|
|
4
4
|
import { supabase } from "../integrations/supabase/client.js";
|
|
5
|
+
import { activeDeviceKey, keyedCall } from "./pick159.js";
|
|
5
6
|
export const PREVIEW_UNAVAILABLE_MESSAGE = "Voorbeeld niet beschikbaar.";
|
|
6
7
|
export const PREVIEW_LAYOUT_ONLY_MESSAGE = "Voorbeeld niet beschikbaar. Het document wordt bij het printen opgemaakt met de ingestelde layout.";
|
|
7
8
|
export class PickPreviewError extends Error {
|
|
@@ -25,10 +26,8 @@ function tekst(value) {
|
|
|
25
26
|
}
|
|
26
27
|
/** Haalt het voorbeeld op. Foutteksten uit de database worden letterlijk doorgegeven. */
|
|
27
28
|
export async function fetchPickPreview(args) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
_queue_item_id: args.queueItemId,
|
|
31
|
-
});
|
|
29
|
+
const call = keyedCall("pick_preview_job", { _station_slug: args.stationSlug, _queue_item_id: args.queueItemId }, activeDeviceKey());
|
|
30
|
+
const { data, error } = await supabase.rpc(call.fn, call.args ?? {});
|
|
32
31
|
if (args.signal?.aborted)
|
|
33
32
|
throw new PickPreviewError("Voorbeeld afgebroken.", "afgebroken");
|
|
34
33
|
if (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pickStickers.d.ts","sourceRoot":"","sources":["../../src/lib/pickStickers.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AACD,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAOpE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQvD,CAAC;AACF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG3D;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAqB3E;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAIjF;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,IAAI,CAe3E;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,IAAI,CAI/E;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAIjE;AAQD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGjH;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAGvH"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Stickerstand en stickermeldingen: alleen lezen uit de Engine. Deze module
|
|
2
2
|
// voert zelf nooit print.sticker/print.traysticker uit en haalt geen PDF op.
|
|
3
3
|
import { supabase } from "@flowselections/core";
|
|
4
|
-
|
|
4
|
+
import { keyedRpc } from "./pick159.js";
|
|
5
|
+
const db = keyedRpc(supabase);
|
|
5
6
|
export const STICKER_UNKNOWN = "Stickerstand onbekend";
|
|
6
7
|
const rec = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
7
8
|
const txt = (v) => (typeof v === "string" && v.trim() ? v : typeof v === "number" ? String(v) : null);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/pick-schermen-kwekers",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.60",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "pick-schermen",
|
|
6
6
|
"pages": [
|
|
@@ -59,12 +59,13 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@flowselections/layout-maker": "^1.19.0",
|
|
62
|
-
"@supabase/supabase-js": "^2.111.0"
|
|
62
|
+
"@supabase/supabase-js": "^2.111.0",
|
|
63
|
+
"qrcode": "^1.5.4"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"@cloudflare/vite-plugin": "^1.25.5",
|
|
66
67
|
"@eslint/js": "^9.32.0",
|
|
67
|
-
"@flowselections/core": "1.0.
|
|
68
|
+
"@flowselections/core": "1.0.30",
|
|
68
69
|
"@lovable.dev/vite-tanstack-config": "2.26.5",
|
|
69
70
|
"@rsbuild/core": "^1.0.0",
|
|
70
71
|
"@tailwindcss/vite": "^4.2.1",
|
|
@@ -73,6 +74,7 @@
|
|
|
73
74
|
"@tanstack/react-start": "1.167.63",
|
|
74
75
|
"@tanstack/router-plugin": "1.167.33",
|
|
75
76
|
"@types/node": "^22.16.5",
|
|
77
|
+
"@types/qrcode": "^1.5.6",
|
|
76
78
|
"@types/react": "^19.2.0",
|
|
77
79
|
"@types/react-dom": "^19.2.0",
|
|
78
80
|
"@vitejs/plugin-react": "^5.0.4",
|