@mxpicture/print-backlog 0.0.6 → 0.0.8

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 (45) hide show
  1. package/dist/public/assets/index-CPkWeOIJ.js +1 -0
  2. package/dist/public/assets/{index-BnhoKdrs.css → index-D7yzmKDn.css} +1 -1
  3. package/dist/public/index.html +2 -2
  4. package/dist/server/api/events.d.ts +21 -0
  5. package/dist/server/api/events.d.ts.map +1 -0
  6. package/dist/server/api/events.js +204 -0
  7. package/dist/server/api/events.js.map +1 -0
  8. package/dist/server/api/items.d.ts +14 -1
  9. package/dist/server/api/items.d.ts.map +1 -1
  10. package/dist/server/api/items.js +49 -1
  11. package/dist/server/api/items.js.map +1 -1
  12. package/dist/server/app.d.ts +9 -1
  13. package/dist/server/app.d.ts.map +1 -1
  14. package/dist/server/app.js +17 -5
  15. package/dist/server/app.js.map +1 -1
  16. package/dist/server/bambuddy.d.ts +32 -7
  17. package/dist/server/bambuddy.d.ts.map +1 -1
  18. package/dist/server/bambuddy.js +92 -23
  19. package/dist/server/bambuddy.js.map +1 -1
  20. package/dist/server/cli.js +11 -1
  21. package/dist/server/cli.js.map +1 -1
  22. package/dist/server/http.d.ts +5 -0
  23. package/dist/server/http.d.ts.map +1 -1
  24. package/dist/server/http.js +13 -6
  25. package/dist/server/http.js.map +1 -1
  26. package/dist/server/jobs.d.ts +13 -0
  27. package/dist/server/jobs.d.ts.map +1 -0
  28. package/dist/server/jobs.js +41 -0
  29. package/dist/server/jobs.js.map +1 -0
  30. package/dist/server/matching.d.ts +22 -0
  31. package/dist/server/matching.d.ts.map +1 -0
  32. package/dist/server/matching.js +72 -0
  33. package/dist/server/matching.js.map +1 -0
  34. package/dist/server/storage.d.ts +6 -0
  35. package/dist/server/storage.d.ts.map +1 -1
  36. package/dist/server/storage.js +11 -1
  37. package/dist/server/storage.js.map +1 -1
  38. package/dist/shared/types.d.ts +46 -0
  39. package/dist/shared/types.d.ts.map +1 -1
  40. package/package.json +3 -2
  41. package/dist/public/assets/index-j0LpYaft.js +0 -1
  42. package/dist/server/api/hooks.d.ts +0 -9
  43. package/dist/server/api/hooks.d.ts.map +0 -1
  44. package/dist/server/api/hooks.js +0 -29
  45. package/dist/server/api/hooks.js.map +0 -1
@@ -0,0 +1,41 @@
1
+ import { errorMessage } from "./log.js";
2
+ /**
3
+ * The trash purge (docs/plan.md §3.5): an item deleted more than `days` ago
4
+ * loses its rows (versions and status history cascade; a print event keeps
5
+ * its row, unlinked) and then its files. The rows go first: an item without
6
+ * rows is invisible, while rows without files would be a broken item.
7
+ * Files whose removal failed are tried again on the next run.
8
+ */
9
+ export const purgeTrash = async (sql, store, days, log) => {
10
+ const rows = await sql `
11
+ DELETE FROM backlog.item
12
+ WHERE deleted_at IS NOT NULL AND deleted_at < now() - make_interval(days => ${days})
13
+ RETURNING id
14
+ `;
15
+ const ids = rows.map((r) => Number(r.id));
16
+ for (const id of ids)
17
+ await store
18
+ .removeItem(id)
19
+ .catch((e) => log(`trash purge: files of item ${id} not removed: ${errorMessage(e)}`));
20
+ if (ids.length)
21
+ log(`trash purge: ${ids.length} item(s) older than ${days} days removed`);
22
+ return ids;
23
+ };
24
+ const DAY_MS = 24 * 60 * 60_000;
25
+ /** The first run waits a little, so a crash loop does not purge on every start. */
26
+ const FIRST_RUN_MS = 10 * 60_000;
27
+ /** The daily purge, started by `serve`. Returns its stop function. */
28
+ export const startJobs = (sql, store, trashDays, log) => {
29
+ const run = () => void purgeTrash(sql, store, trashDays, log).catch((e) => log(`trash purge failed: ${errorMessage(e)}`));
30
+ let daily;
31
+ const first = setTimeout(() => {
32
+ run();
33
+ daily = setInterval(run, DAY_MS);
34
+ }, FIRST_RUN_MS);
35
+ return () => {
36
+ clearTimeout(first);
37
+ if (daily)
38
+ clearInterval(daily);
39
+ };
40
+ };
41
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/server/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,GAAQ,EACR,KAAgB,EAChB,IAAY,EACZ,GAA2B,EACR,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAkB;;kFAEwC,IAAI;;GAEnF,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,GAAG;QAClB,MAAM,KAAK;aACR,UAAU,CAAC,EAAE,CAAC;aACd,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CACpB,GAAG,CAAC,8BAA8B,EAAE,iBAAiB,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CACxE,CAAC;IACN,IAAI,GAAG,CAAC,MAAM;QACZ,GAAG,CAAC,gBAAgB,GAAG,CAAC,MAAM,uBAAuB,IAAI,eAAe,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAChC,mFAAmF;AACnF,MAAM,YAAY,GAAG,EAAE,GAAG,MAAM,CAAC;AAEjC,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,GAAQ,EACR,KAAgB,EAChB,SAAiB,EACjB,GAA2B,EACb,EAAE;IAChB,MAAM,GAAG,GAAG,GAAG,EAAE,CACf,KAAK,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAC/D,GAAG,CAAC,uBAAuB,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAC9C,CAAC;IACJ,IAAI,KAAiC,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,GAAG,EAAE,CAAC;QACN,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,EAAE,YAAY,CAAC,CAAC;IACjB,OAAO,GAAG,EAAE;QACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ItemStatus } from "../shared/types.js";
2
+ /**
3
+ * A name reduced to what survives slicing and Bambuddy's cleaning: lower
4
+ * case, no extension, no trailing plate number, `_ - .` as spaces, accents
5
+ * dropped, whitespace collapsed.
6
+ */
7
+ export declare const norm: (s: string) => string;
8
+ export interface Candidate {
9
+ id: number;
10
+ title: string;
11
+ /** file names of every version of the item */
12
+ filenames: string[];
13
+ }
14
+ /** The candidates whose title or any version's file name matches `filename`. */
15
+ export declare const matchCandidates: <C extends Candidate>(filename: string | null | undefined, candidates: readonly C[]) => C[];
16
+ /** Bambuddy's webhook events we act on. */
17
+ export type PrintEvent = "print_complete" | "print_failed" | "print_stopped";
18
+ /** The status a matched print sets, or null when it changes nothing (a cancelled print). */
19
+ export declare const statusForEvent: (event: string) => ItemStatus | null;
20
+ /** The fields of the webhook payload kept with the status change (`detail`). */
21
+ export declare const eventDetail: (payload: Record<string, unknown>) => Record<string, unknown>;
22
+ //# sourceMappingURL=matching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/server/matching.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBrD;;;;GAIG;AACH,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAahC,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,gFAAgF;AAChF,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,SAAS,EACjD,UAAU,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,YAAY,SAAS,CAAC,EAAE,KACvB,CAAC,EAMH,CAAC;AAEF,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,cAAc,GAAG,eAAe,CAAC;AAE7E,4FAA4F;AAC5F,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,UAAU,GAAG,IAI3D,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAiBxB,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Matching a Bambuddy print event to a backlog item (docs/plan.md §3.9).
3
+ * Pure functions: the database side is in api/events.ts.
4
+ *
5
+ * Bambuddy's webhook `filename` is the slicer project name with `_` replaced
6
+ * by spaces, or else the printed file's name without `.gcode` / `.gcode.3mf`
7
+ * / `.3mf`. Without server-side slicing nothing links the printed file to
8
+ * our upload, so the match is by name, and only an exact one counts.
9
+ */
10
+ const MODEL_SUFFIXES = [
11
+ ".gcode.3mf",
12
+ ".3mf",
13
+ ".stl",
14
+ ".step",
15
+ ".stp",
16
+ ".obj",
17
+ ".gcode",
18
+ ];
19
+ /**
20
+ * A name reduced to what survives slicing and Bambuddy's cleaning: lower
21
+ * case, no extension, no trailing plate number, `_ - .` as spaces, accents
22
+ * dropped, whitespace collapsed.
23
+ */
24
+ export const norm = (s) => {
25
+ let n = s.normalize("NFKD").replace(/\p{M}/gu, "").toLowerCase().trim();
26
+ for (let changed = true; changed;) {
27
+ changed = false;
28
+ for (const suffix of MODEL_SUFFIXES)
29
+ if (n.endsWith(suffix)) {
30
+ n = n.slice(0, -suffix.length);
31
+ changed = true;
32
+ }
33
+ }
34
+ n = n.replace(/[_\-.]+/g, " ");
35
+ n = n.replace(/\s+plate\s*\d+$/, "");
36
+ return n.replace(/\s+/g, " ").trim();
37
+ };
38
+ /** The candidates whose title or any version's file name matches `filename`. */
39
+ export const matchCandidates = (filename, candidates) => {
40
+ const key = norm(filename ?? "");
41
+ if (!key)
42
+ return [];
43
+ return candidates.filter((c) => norm(c.title) === key || c.filenames.some((f) => norm(f) === key));
44
+ };
45
+ /** The status a matched print sets, or null when it changes nothing (a cancelled print). */
46
+ export const statusForEvent = (event) => {
47
+ if (event === "print_complete")
48
+ return "done";
49
+ if (event === "print_failed")
50
+ return "error";
51
+ return null;
52
+ };
53
+ /** The fields of the webhook payload kept with the status change (`detail`). */
54
+ export const eventDetail = (payload) => {
55
+ const keep = [
56
+ "printer",
57
+ "filename",
58
+ "duration",
59
+ "filament_grams",
60
+ "reason",
61
+ "status",
62
+ ];
63
+ const out = {};
64
+ for (const k of keep) {
65
+ const v = payload[k];
66
+ // Bambuddy fills unknown values with "Unknown"; leave those out.
67
+ if (v !== undefined && v !== null && v !== "" && v !== "Unknown")
68
+ out[k] = v;
69
+ }
70
+ return out;
71
+ };
72
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/server/matching.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,MAAM,cAAc,GAAG;IACrB,YAAY;IACZ,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;CACT,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACxE,KAAK,IAAI,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC;QAClC,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,cAAc;YACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/B,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;IACL,CAAC;IACD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC,CAAC;AASF,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAmC,EACnC,UAAwB,EACnB,EAAE;IACP,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,UAAU,CAAC,MAAM,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CACzE,CAAC;AACJ,CAAC,CAAC;AAKF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAqB,EAAE;IACjE,IAAI,KAAK,KAAK,gBAAgB;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,KAAK,KAAK,cAAc;QAAE,OAAO,OAAO,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,OAAgC,EACP,EAAE;IAC3B,MAAM,IAAI,GAAG;QACX,SAAS;QACT,UAAU;QACV,UAAU;QACV,gBAAgB;QAChB,QAAQ;QACR,QAAQ;KACT,CAAC;IACF,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,iEAAiE;QACjE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,SAAS;YAC9D,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -72,6 +72,12 @@ export declare class FileStore {
72
72
  placeBuffer(data: Buffer, relPath: string): Promise<void>;
73
73
  /** Drop a staged file that will not be placed (duplicate, rejected batch, failed transaction). */
74
74
  discard(staged: StagedFile): Promise<void>;
75
+ /**
76
+ * Remove an item's directory with every version and thumbnail: only for an
77
+ * item whose rows are gone (the trash purge). Deleting is not modifying:
78
+ * the backup keeps its copies.
79
+ */
80
+ removeItem(itemId: number): Promise<void>;
75
81
  absolute(relPath: string): string;
76
82
  exists(relPath: string): Promise<boolean>;
77
83
  read(relPath: string): Readable;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;GAUG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,+CAAgD,CAAC;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAIlD,CAAC;AAEH,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;gBAAjB,MAAM,EAAE,GAAG,GAAG,GAAG,EAC1B,OAAO,EAAE,MAAM;CAIlB;AAID;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAY3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,KAAG,QAe3C,CAAC;AAEF,2GAA2G;AAC3G,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,MAKpD,CAAC;AAEF,4HAA4H;AAC5H,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,KAAK,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,CAAC;AACzD,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,KAAG,CAAC,IAAI,WAA8B,CAAC;AAE5E,0CAA0C;AAC1C,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,UAAU,OAAO,KAChB,QAAQ,GAAG,KAGb,CAAC;AAEF,qBAAa,SAAS;IAMlB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAL3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGtB,OAAO,EAAE,MAAM,EACN,QAAQ,EAAE,MAAM;IAMrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;OAIG;IACG,KAAK,CACT,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,EACxB,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAChC,OAAO,CAAC,UAAU,CAAC;IA2CtB,oEAAoE;IACpE,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM;IAIT,uFAAuF;IACjF,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/D,kGAAkG;IAC5F,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAO3B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;CAGhC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;GAUG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,+CAAgD,CAAC;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAIlD,CAAC;AAEH,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;gBAAjB,MAAM,EAAE,GAAG,GAAG,GAAG,EAC1B,OAAO,EAAE,MAAM;CAIlB;AAID;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAY3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,KAAG,QAe3C,CAAC;AAEF,2GAA2G;AAC3G,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,MAKpD,CAAC;AAEF,4HAA4H;AAC5H,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,KAAK,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,CAAC;AACzD,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,KAAG,CAAC,IAAI,WAA8B,CAAC;AAE5E,0CAA0C;AAC1C,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,UAAU,OAAO,KAChB,QAAQ,GAAG,KAGb,CAAC;AAEF,qBAAa,SAAS;IAMlB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAL3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGtB,OAAO,EAAE,MAAM,EACN,QAAQ,EAAE,MAAM;IAMrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;OAIG;IACG,KAAK,CACT,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,EACxB,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAChC,OAAO,CAAC,UAAU,CAAC;IA2CtB,oEAAoE;IACpE,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM;IAIT,uFAAuF;IACjF,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/D,kGAAkG;IAC5F,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;OAIG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAO3B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;CAGhC"}
@@ -1,6 +1,6 @@
1
1
  import { createHash, randomUUID } from "node:crypto";
2
2
  import { createReadStream } from "node:fs";
3
- import { link, mkdir, open, stat, unlink } from "node:fs/promises";
3
+ import { link, mkdir, open, rm, stat, unlink } from "node:fs/promises";
4
4
  import { dirname, join } from "node:path";
5
5
  /**
6
6
  * The write-once file store under DATA_DIR/files (docs/plan.md §3.5).
@@ -178,6 +178,16 @@ export class FileStore {
178
178
  async discard(staged) {
179
179
  await unlink(staged.tmpPath).catch(() => { });
180
180
  }
181
+ /**
182
+ * Remove an item's directory with every version and thumbnail: only for an
183
+ * item whose rows are gone (the trash purge). Deleting is not modifying:
184
+ * the backup keeps its copies.
185
+ */
186
+ async removeItem(itemId) {
187
+ if (!Number.isSafeInteger(itemId) || itemId <= 0)
188
+ throw new Error(`not an item id: ${itemId}`);
189
+ await rm(this.absolute(String(itemId)), { recursive: true, force: true });
190
+ }
181
191
  absolute(relPath) {
182
192
  const abs = join(this.root, relPath);
183
193
  if (!abs.startsWith(this.root + "/"))
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,48 @@ export interface QueueSummary {
31
31
  export interface HookAck {
32
32
  stored: true;
33
33
  id: number;
34
+ /** "auto": matched and applied; "ignored": nothing to do (a cancelled print, another event); null: left open for a person */
35
+ resolution: "auto" | "ignored" | null;
36
+ matchedItemId: number | null;
37
+ }
38
+ /** One candidate item for a print event. */
39
+ export interface EventCandidate {
40
+ id: number;
41
+ title: string;
42
+ queueId: number;
43
+ queueName: string;
44
+ status: ItemStatus;
45
+ /** the current version's file name, to tell same-titled items apart */
46
+ filename: string | null;
47
+ }
48
+ /** GET /api/v1/print-events: a print Bambuddy reported. */
49
+ export interface PrintEventView {
50
+ id: number;
51
+ receivedAt: string;
52
+ event: string;
53
+ filename: string | null;
54
+ printer: string | null;
55
+ status: string | null;
56
+ resolution: "auto" | "manual" | "ignored" | null;
57
+ matchedItemId: number | null;
58
+ /** for an open event: the items whose name matches, any status, any queue (the trash excluded) */
59
+ candidates: EventCandidate[];
60
+ }
61
+ /** POST /api/v1/print-events/:id/assign: the item it was, or ignore it. */
62
+ export type EventAssign = {
63
+ itemId: number;
64
+ } | {
65
+ ignore: true;
66
+ };
67
+ /** POST /api/v1/items/:id/send-to-bambuddy */
68
+ export interface SendResult {
69
+ item: ItemDetail;
70
+ /**
71
+ * Another library file in Bambuddy with the same content, if any. Bambuddy
72
+ * stores the upload anyway (item.bambuddyFileId is the new file); this only
73
+ * says the copy is not the first.
74
+ */
75
+ duplicateOf: number | null;
34
76
  }
35
77
  /** One stored file of an item. Versions are never changed, only added. */
36
78
  export interface Version {
@@ -111,6 +153,10 @@ export type HistoryEntry = {
111
153
  printer: string | null;
112
154
  filename: string | null;
113
155
  resolution: string | null;
156
+ } | {
157
+ kind: "sent";
158
+ at: string;
159
+ fileId: number;
114
160
  };
115
161
  /** PATCH /api/v1/items/:id. `move` places the item right after `afterId` (null = top) in `queueId` (default: its queue). */
116
162
  export interface ItemPatch {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/print-backlog",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "A backlog for unsliced 3D models (STL, 3MF, STEP) next to Bambuddy: queues, one status per item, versions, drag & drop",
5
5
  "type": "module",
6
6
  "author": "MXPicture",
@@ -25,7 +25,8 @@
25
25
  "build": "tsc -b . && pnpm run build:client",
26
26
  "build:client": "tsc -p tsconfig.client.json && vite build",
27
27
  "dev:client": "vite",
28
- "test": "tsc -b . && tsc -p tsconfig.client.json && vitest run"
28
+ "test": "tsc -b . && tsc -p tsconfig.client.json && vitest run",
29
+ "test:contract": "vitest run --config vitest.contract.config.ts"
29
30
  },
30
31
  "publishConfig": {
31
32
  "access": "public"
@@ -1 +0,0 @@
1
- (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e,t,n,r,i,a,o,s,c,l,u,d,f,p,m={},h=[],g=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,_=Array.isArray;function v(e,t){for(var n in t)e[n]=t[n];return e}function y(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function b(t,n,r){var i,a,o,s={};for(o in n)o==`key`?i=n[o]:o==`ref`?a=n[o]:s[o]=n[o];if(arguments.length>2&&(s.children=arguments.length>3?e.call(arguments,2):r),typeof t==`function`&&t.defaultProps!=null)for(o in t.defaultProps)s[o]===void 0&&(s[o]=t.defaultProps[o]);return x(t,s,i,a,null)}function x(e,r,i,a,o){var s={type:e,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++n,__i:-1,__u:0};return o==null&&t.vnode!=null&&t.vnode(s),s}function S(e){return e.children}function C(e,t){this.props=e,this.context=t}function w(e,t){if(t==null)return e.__?w(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type==`function`?w(e):null}function T(e){if(e.__P&&e.__d){var n=e.__v,r=n.__e,i=[],a=[],o=v({},n);o.__v=n.__v+1,t.vnode&&t.vnode(o),ae(e.__P,o,n,e.__n,e.__P.namespaceURI,32&n.__u?[r]:null,i,r??w(n),!!(32&n.__u),a),o.__v=n.__v,o.__.__k[o.__i]=o,se(i,o,a),n.__e=n.__=null,o.__e!=r&&E(o)}}function E(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),E(e)}function D(e){(!e.__d&&(e.__d=!0)&&r.push(e)&&!O.__r++||i!=t.debounceRendering)&&((i=t.debounceRendering)||a)(O)}function O(){try{for(var e,t=1;r.length;)r.length>t&&r.sort(o),e=r.shift(),t=r.length,T(e)}finally{r.length=O.__r=0}}function ee(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,g,_,v,y=r&&r.__k||h,b=t.length;for(c=k(n,t,y,c,b),d=0;d<b;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&y[p.__i]||m,p.__i=d,v=ae(e,p,f,i,a,o,s,c,l,u),g=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&ue(f.ref,null,p),u.push(p.ref,p.__c||g,p)),_==null&&g!=null&&(_=g),4&p.__u?(c=A(p,c,e),f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:g&&(c=g.nextSibling),p.__u&=-7);return n.__e=_,c}function k(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=x(null,o,null,null,null):_(o)?o=e.__k[a]=x(S,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=x(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=te(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=w(s)),de(s,s));return r}function A(e,t,n){var r,i;if(typeof e.type==`function`){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=A(r[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=w(e)),t=n.insertBefore(e.__e,t||null));do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function te(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&!(2&l.__u);if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function ne(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||g.test(t)?n:n+`px`}function re(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||ne(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||ne(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(u,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[l]=r[l]:(n[l]=d,e.addEventListener(t,a?p:f,a)):e.removeEventListener(t,a?p:f,a);else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function ie(e){return function(n){if(this.l){var r=this.l[n.type+e];if(n[c]==null)n[c]=d++;else if(n[c]<r[l])return;return r(t.event?t.event(n):n)}}}function ae(e,n,r,i,a,o,s,c,l,u){var d,f,p,m,g,b,x,T,E,D,O,k,A,te,ne,re,ie=n.type;if(n.constructor!==void 0)return null;128&r.__u&&(l=!!(32&r.__u),o=[c=n.__e=r.__e]),(d=t.__b)&&d(n);n:if(typeof ie==`function`){f=s.length;try{if(E=n.props,D=ie.prototype&&ie.prototype.render,O=(d=ie.contextType)&&i[d.__c],k=d?O?O.props.value:d.__:i,r.__c?T=(p=n.__c=r.__c).__=p.__E:(D?n.__c=p=new ie(E,k):(n.__c=p=new C(E,k),p.constructor=ie,p.render=fe),O&&O.sub(p),p.state||(p.state={}),p.__n=i,m=p.__d=!0,p.__h=[],p._sb=[]),D&&p.__s==null&&(p.__s=p.state),D&&ie.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=v({},p.__s)),v(p.__s,ie.getDerivedStateFromProps(E,p.__s))),g=p.props,b=p.state,p.__v=n,m)D&&ie.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),D&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(D&&ie.getDerivedStateFromProps==null&&E!==g&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(E,k),n.__v==r.__v||!p.__e&&p.shouldComponentUpdate!=null&&!1===p.shouldComponentUpdate(E,p.__s,k)){n.__v!=r.__v&&(p.props=E,p.state=p.__s,p.__d=!1),n.__e=r.__e,n.__k=r.__k,n.__k.some(function(e){e&&(e.__=n)}),h.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&s.push(p),c=w(r);break n}p.componentWillUpdate!=null&&p.componentWillUpdate(E,p.__s,k),D&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(g,b,x)})}if(p.context=k,p.props=E,p.__P=e,p.__e=!1,A=t.__r,te=0,D)p.state=p.__s,p.__d=!1,A&&A(n),d=p.render(p.props,p.state,p.context),h.push.apply(p.__h,p._sb),p._sb=[];else do p.__d=!1,A&&A(n),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++te<25);p.state=p.__s,p.getChildContext!=null&&(i=v(v({},i),p.getChildContext())),D&&!m&&p.getSnapshotBeforeUpdate!=null&&(x=p.getSnapshotBeforeUpdate(g,b)),ne=d!=null&&d.type===S&&d.key==null?ce(d.props.children):d,c=ee(e,_(ne)?ne:[ne],n,r,i,a,o,s,c,l,u),p.base=n.__e,n.__u&=-161,p.__h.length&&s.push(p),T&&(p.__E=p.__=null)}catch(e){if(s.length=f,n.__v=null,l||o!=null){if(e.then){for(n.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o!=null&&(o[o.indexOf(c)]=null),n.__e=c}else if(o!=null)for(re=o.length;re--;)y(o[re])}else n.__e=r.__e;n.__k??=r.__k||[],e.then||oe(n),t.__e(e,n,r)}}else o==null&&n.__v==r.__v?(n.__k=r.__k,n.__e=r.__e):c=n.__e=le(r.__e,n,r,i,a,o,s,l,u);return(d=t.diffed)&&d(n),128&n.__u?void 0:c}function oe(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(oe))}function se(e,n,r){for(var i=0;i<r.length;i++)ue(r[i],r[++i],r[++i]);t.__c&&t.__c(n,e),e.some(function(n){try{e=n.__h,n.__h=[],e.some(function(e){e.call(n)})}catch(e){t.__e(e,n.__v)}})}function ce(e){return typeof e!=`object`||!e||e.__b>0?e:_(e)?e.map(ce):e.constructor===void 0?v({},e):null}function le(n,r,i,a,o,s,c,l,u){var d,f,p,h,g,v,b,x=i.props||m,S=r.props,C=r.type;if(C==`svg`?o=`http://www.w3.org/2000/svg`:C==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((g=s[d])&&`setAttribute`in g==!!C&&(C?g.localName==C:g.nodeType==3)){n=g,s[d]=null;break}}if(n==null){if(C==null)return document.createTextNode(S);n=document.createElementNS(o,C,S.is&&S),l&&=(t.__m&&t.__m(r,s),!1),s=null}if(C==null)x===S||l&&n.data==S||(n.data=S);else{if(s=C==`textarea`&&S.defaultValue!=null?null:s&&e.call(n.childNodes),!l&&s!=null)for(x={},d=0;d<n.attributes.length;d++)x[(g=n.attributes[d]).name]=g.value;for(d in x)g=x[d],d==`dangerouslySetInnerHTML`?p=g:d==`children`||d in S||d==`value`&&`defaultValue`in S||d==`checked`&&`defaultChecked`in S||re(n,d,null,g,o);for(d in S)g=S[d],d==`children`?h=g:d==`dangerouslySetInnerHTML`?f=g:d==`value`?v=g:d==`checked`?b=g:l&&typeof g!=`function`||x[d]===g||re(n,d,g,x[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==n.innerHTML)||(n.innerHTML=f.__html),r.__k=[];else if(p&&(n.innerHTML=``),ee(r.type==`template`?n.content:n,_(h)?h:[h],r,i,a,C==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&w(i,0),l,u),s!=null)for(d=s.length;d--;)y(s[d]);l&&C!=`textarea`||(d=`value`,C==`progress`&&v==null?n.removeAttribute(`value`):v!=null&&(v!==n[d]||C==`progress`&&!v||C==`option`&&v!=x[d])&&re(n,d,v,x[d],o),d=`checked`,b!=null&&b!=n[d]&&re(n,d,b,x[d],o))}return n}function ue(e,n,r){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&n==null||(e.__u=e(n))}else e.current=n}catch(e){t.__e(e,r)}}function de(e,n,r){var i,a;if(t.unmount&&t.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||ue(i,null,n)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){t.__e(e,n)}i.base=i.__P=i.__n=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&de(i[a],n,r||typeof e.type!=`function`);r||y(e.__e),e.__c=e.__=e.__e=void 0}function fe(e,t,n){return this.constructor(e,n)}function pe(n,r,i){var a,o,s,c;r==document&&(r=document.documentElement),t.__&&t.__(n,r),o=(a=typeof i==`function`)?null:i&&i.__k||r.__k,s=[],c=[],ae(r,n=(!a&&i||r).__k=b(S,null,[n]),o||m,m,r.namespaceURI,!a&&i?[i]:o?null:r.firstChild?e.call(r.childNodes):null,s,!a&&i?i:o?o.__e:r.firstChild,a,c),se(s,n,c),n.props.children=null}e=h.slice,t={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},n=0,C.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=v({},this.state);typeof e==`function`&&(e=e(v({},n),this.props)),e&&v(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),D(this))},C.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),D(this))},C.prototype.render=S,r=[],a=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,o=function(e,t){return e.__v.__b-t.__v.__b},O.__r=0,s=Math.random().toString(8),c=`__d`+s,l=`__a`+s,u=/(PointerCapture)$|Capture$/i,d=0,f=ie(!1),p=ie(!0);var me,j,he,ge,_e=0,ve=[],M=t,ye=M.__b,be=M.__r,xe=M.diffed,Se=M.__c,Ce=M.unmount,we=M.__;function Te(e,t){M.__h&&M.__h(j,e,_e||t),_e=0;var n=j.__H||(j.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function N(e){return _e=1,Ee(Le,e)}function Ee(e,t,n){var r=Te(me++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Le(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=!1,o=r.__c.props!==e;if(r.__c.__H.__.some(function(e){if(e.__N){i=!0;var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a){var s=a.call(this,e,t,n);return i?s||o:s}return!i||o};j.__f=!0;var a=j.shouldComponentUpdate,o=j.componentWillUpdate;j.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},j.shouldComponentUpdate=i}return r.__N||r.__}function De(e,t){var n=Te(me++,3);!M.__s&&Ie(n.__H,t)&&(n.__=e,n.u=t,j.__H.__h.push(n))}function Oe(e){return _e=5,ke(function(){return{current:e}},[])}function ke(e,t){var n=Te(me++,7);return Ie(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function Ae(e,t){return _e=8,ke(function(){return e},t)}function je(){for(var e;e=ve.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Pe),t.__h.some(Fe),t.__h=[]}catch(n){t.__h=[],M.__e(n,e.__v)}}}M.__b=function(e){j=null,ye&&ye(e)},M.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),we&&we(e,t)},M.__r=function(e){be&&be(e),me=0;var t=(j=e.__c).__H;t&&(he===j?(t.__h=[],j.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(Pe),t.__h.some(Fe),t.__h=[],me=0)),he=j},M.diffed=function(e){xe&&xe(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ve.push(t)!==1&&ge===M.requestAnimationFrame||((ge=M.requestAnimationFrame)||Ne)(je)),t.__H.__.some(function(e){e.u&&=(e.__H=e.u,void 0)})),he=j=null},M.__c=function(e,t){t.some(function(e){try{e.__h.some(Pe),e.__h=e.__h.filter(function(e){return!e.__||Fe(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],M.__e(n,e.__v)}}),Se&&Se(e,t)},M.unmount=function(e){Ce&&Ce(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{Pe(e)}catch(e){t=e}}),n.__H=void 0,t&&M.__e(t,n.__v))};var Me=typeof requestAnimationFrame==`function`;function Ne(e){var t,n=function(){clearTimeout(r),Me&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);Me&&(t=requestAnimationFrame(n))}function Pe(e){var t=j,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),j=t}function Fe(e){var t=j;e.__c=e.__(),j=t}function Ie(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function Le(e,t){return typeof t==`function`?t(e):t}var Re=[`queued`,`skipped`,`done`,`error`],ze=class extends Error{status;constructor(e,t){super(t),this.status=e}},Be=()=>{throw location.reload(),new ze(401,`session expired, reloading`)},Ve=async(e,t={})=>{let n=await fetch(e,{...t,redirect:`manual`,headers:{Accept:`application/json`,...t.headers}});n.type===`opaqueredirect`&&Be();let r=await n.json().catch(()=>null);if(!n.ok)throw new ze(n.status,r?.error??`HTTP ${n.status}`);return r},He=(e,t,n)=>Ve(t,{method:e,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}),Ue=(e,t,n)=>new Promise((r,i)=>{let a=new XMLHttpRequest;a.open(`POST`,e),a.setRequestHeader(`Accept`,`application/json`),a.responseType=`text`,a.upload.onprogress=e=>{e.lengthComputable&&n?.(e.loaded/e.total)},a.onerror=()=>i(new ze(0,`network error during upload`)),a.onload=()=>{if(!(a.getResponseHeader(`Content-Type`)??``).includes(`application/json`)){try{Be()}catch(e){i(e)}return}let e=null;try{e=JSON.parse(a.responseText)}catch{}a.status>=200&&a.status<300?r(e):i(new ze(a.status,e?.error??`HTTP ${a.status}`))},a.send(t)}),We=e=>{let t=new URLSearchParams;return e.queue&&t.set(`queue`,String(e.queue)),e.status&&t.set(`status`,e.status),e.q&&t.set(`q`,e.q),e.trash&&t.set(`trash`,`1`),t.toString()},P={me:()=>Ve(`/api/v1/me`),queues:()=>Ve(`/api/v1/queues`),createQueue:e=>He(`POST`,`/api/v1/queues`,e),patchQueue:(e,t)=>He(`PATCH`,`/api/v1/queues/${e}`,t),deleteQueue:e=>He(`DELETE`,`/api/v1/queues/${e}`,{}),exportUrl:(e,t)=>`/api/v1/queues/${e}/export.zip${t?`?status=${t}`:``}`,items:e=>Ve(`/api/v1/items?${We(e)}`),item:e=>Ve(`/api/v1/items/${e}`),history:e=>Ve(`/api/v1/items/${e}/history`),patchItem:(e,t)=>He(`PATCH`,`/api/v1/items/${e}`,t),deleteItem:e=>He(`DELETE`,`/api/v1/items/${e}`,{}),restoreItem:e=>He(`POST`,`/api/v1/items/${e}/restore`,{}),uploadItems:async(e,t,n)=>{let r=t.reduce((e,t)=>e+t.size,0)||1,i=0,a={items:[],skipped:[]};for(let o=0;o<t.length;o+=50){let s=t.slice(o,o+50),c=s.reduce((e,t)=>e+t.size,0),l=new FormData;for(let e of s)l.append(`file`,e,e.name);let u=await Ue(`/api/v1/queues/${e}/items`,l,e=>n?.((i+e*c)/r));i+=c,a.items.push(...u.items),a.skipped.push(...u.skipped)}return a},uploadVersion:(e,t,n,r)=>{let i=new FormData;return i.append(`file`,t,t.name),n&&i.append(`comment`,n),Ue(`/api/v1/items/${e}/versions`,i,r)},patchVersion:(e,t,n)=>He(`PATCH`,`/api/v1/items/${e}/versions/${t}`,n),downloadUrl:(e,t)=>`/api/v1/items/${e}/versions/${t}/download`,thumbnailUrl:(e,t)=>`/api/v1/items/${e}/versions/${t}/thumbnail`},F=e=>e instanceof Error?e.message:String(e),Ge=[`B`,`KB`,`MB`,`GB`],Ke=e=>{let t=e,n=0;for(;t>=1024&&n<Ge.length-1;)t/=1024,n++;return`${n===0?t:t.toFixed(+(t<10))} ${Ge[n]}`},qe=new Intl.RelativeTimeFormat(void 0,{numeric:`auto`}),Je=e=>{let t=new Date(e),n=(t.getTime()-Date.now())/1e3,r=Math.abs(n);return r<60?qe.format(Math.round(n),`second`):r<3600?qe.format(Math.round(n/60),`minute`):r<86400?qe.format(Math.round(n/3600),`hour`):r<2592e3?qe.format(Math.round(n/86400),`day`):t.toLocaleDateString()},Ye=e=>new Date(e).toLocaleString(),Xe=0;Array.isArray;function I(e,n,r,i,a,o){n||={};var s,c,l=n;if(`ref`in l)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:e,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Xe,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return t.vnode&&t.vnode(u),u}var Ze=1,Qe=[],$e=new Set,et=()=>$e.forEach(e=>e(Qe)),L=(e,t=`info`)=>{let n={id:Ze++,kind:t,text:e};Qe=[...Qe,n].slice(-4),et(),setTimeout(()=>{Qe=Qe.filter(e=>e.id!==n.id),et()},t===`error`?8e3:3500)},tt=()=>{let[e,t]=N(Qe);return De(()=>($e.add(t),()=>void $e.delete(t)),[]),I(`div`,{class:`toasts`,role:`status`,"aria-live":`polite`,children:e.map(e=>I(`div`,{class:`toast toast-${e.kind}`,children:e.text},e.id))})},nt=e=>{switch(e.kind){case`status`:{let t=typeof e.detail?.reason==`string`?` (${e.detail.reason})`:``;return e.from===null?`created as ${e.to}`:`${e.from} → ${e.to}${t}`}case`version`:return`version ${e.n} uploaded (${e.filename})`;case`print`:return`print event ${e.event}${e.printer?` on ${e.printer}`:``}${e.filename?`: ${e.filename}`:``}`}},rt=e=>{let[t,n]=N(e.value);De(()=>n(e.value),[e.value]);let r={value:t,placeholder:e.placeholder,onInput:e=>n(e.currentTarget.value),onBlur:()=>{t.trim()!==e.value.trim()&&e.onSave(t).catch(t=>{L(F(t),`error`),n(e.value)})}};return I(`label`,{class:`field`,children:[I(`span`,{children:e.label}),e.multiline?I(`textarea`,{rows:4,...r}):I(`input`,{type:e.type??`text`,...r,onKeyDown:e=>e.key===`Enter`&&e.currentTarget.blur()})]})},it=({itemId:e,queues:t,revision:n,onClose:r,onChanged:i,onUploadVersion:a})=>{let[o,s]=N(null),[c,l]=N([]),[u,d]=N(``),f=Oe(null),p=()=>Promise.all([P.item(e),P.history(e)]).then(([e,t])=>{s(e),l(t)}).catch(e=>L(F(e),`error`));if(De(()=>{s(null),p()},[e,n]),!o)return I(`aside`,{class:`panel`,children:`Loading…`});let m=o.deletedAt!==null,h=async e=>{s(await P.patchItem(o.id,e)),l(await P.history(o.id)),i()},g=e=>h({status:e,...u.trim()?{reason:u.trim()}:{}}).then(()=>d(``)).catch(e=>L(F(e),`error`));return I(`aside`,{class:`panel`,"aria-label":`Item details`,children:[I(`header`,{class:`panel-head`,children:[I(`h2`,{children:o.title}),I(`button`,{class:`icon`,onClick:r,"aria-label":`Close`,children:`✕`})]}),o.current?.hasThumbnail&&I(`img`,{class:`preview`,src:P.thumbnailUrl(o.id,o.current.n),alt:`Preview of ${o.title}`}),m?I(`p`,{class:`muted`,children:[`In the trash since `,Ye(o.deletedAt),`.`]}):I(S,{children:[I(rt,{label:`Title`,value:o.title,onSave:e=>h({title:e})}),I(`div`,{class:`field`,children:[I(`span`,{children:`Status`}),I(`div`,{class:`status-row`,children:Re.map(e=>I(`button`,{class:`chip status-${e}${o.status===e?` active`:``}`,"aria-pressed":o.status===e,onClick:()=>o.status!==e&&void g(e),children:e},e))}),I(`input`,{class:`reason`,placeholder:`Reason for the next change (optional)`,value:u,onInput:e=>d(e.currentTarget.value)})]}),I(rt,{label:`Source URL`,type:`url`,placeholder:`https://www.printables.com/model/…`,value:o.sourceUrl??``,onSave:e=>h({sourceUrl:e.trim()||null})}),o.sourceUrl&&I(`a`,{class:`source`,href:o.sourceUrl,target:`_blank`,rel:`noopener noreferrer`,children:`Open source ↗`}),I(rt,{label:`Notes`,multiline:!0,value:o.notes??``,onSave:e=>h({notes:e||null})}),I(`label`,{class:`field`,children:[I(`span`,{children:`Queue`}),I(`select`,{value:o.queueId,onChange:e=>{let n=Number(e.currentTarget.value);P.items({queue:n}).then(e=>h({move:{queueId:n,afterId:e.at(-1)?.id??null}})).then(()=>L(`Moved to ${t.find(e=>e.id===n)?.name??`queue`}`,`ok`)).catch(e=>L(F(e),`error`))},children:t.map(e=>I(`option`,{value:e.id,children:e.name},e.id))})]})]}),I(`section`,{children:[I(`header`,{class:`section-head`,children:[I(`h3`,{children:`Versions`}),!m&&I(S,{children:[I(`button`,{class:`small`,onClick:()=>f.current?.click(),children:`Upload new version`}),I(`input`,{ref:f,type:`file`,hidden:!0,accept:`.stl,.3mf,.step,.stp,.obj`,onChange:e=>{let t=e.currentTarget.files?.[0];t&&a(o,t),e.currentTarget.value=``}})]})]}),o.alsoIn.length>0&&I(`p`,{class:`muted`,children:[`Same file also in: `,o.alsoIn.map(e=>e.title).join(`, `)]}),I(`ul`,{class:`versions`,children:o.versions.map(e=>I(`li`,{class:e.current?`current`:``,children:[I(`div`,{class:`version-head`,children:[I(`b`,{children:[`v`,e.n]}),` `,e.filename,e.current&&I(`span`,{class:`badge`,children:`current`})]}),I(`div`,{class:`muted`,children:[Ke(e.size),` · `,e.uploadedBy,` ·`,` `,I(`time`,{title:Ye(e.uploadedAt),children:Je(e.uploadedAt)})]}),!m&&I(rt,{label:`Comment`,value:e.comment??``,onSave:async t=>{s(await P.patchVersion(o.id,e.n,{comment:t.trim()||null}))}}),I(`div`,{class:`row-actions`,children:[I(`a`,{href:P.downloadUrl(o.id,e.n),children:`Download`}),!e.current&&!m&&I(`button`,{class:`small`,onClick:()=>P.patchVersion(o.id,e.n,{current:!0}).then(e=>{s(e),i()}).catch(e=>L(F(e),`error`)),children:`Make current`})]})]},e.n))})]}),I(`section`,{children:[I(`h3`,{children:`History`}),I(`ol`,{class:`history`,children:[...c].reverse().map((e,t)=>I(`li`,{children:[I(`time`,{title:Ye(e.at),children:Je(e.at)}),` `,nt(e),`by`in e&&I(`span`,{class:`muted`,children:[` · `,e.by]})]},t))})]}),I(`footer`,{class:`panel-foot`,children:m?I(`button`,{onClick:()=>P.restoreItem(o.id).then(()=>{L(`Restored`,`ok`),i(),p()}).catch(e=>L(F(e),`error`)),children:`Restore`}):I(`button`,{class:`danger`,onClick:()=>P.deleteItem(o.id).then(()=>{L(`"${o.title}" moved to the trash`,`ok`),i(),r()}).catch(e=>L(F(e),`error`)),children:`Move to trash`})})]})};function at(e,t,n){return(t=ft(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ot(){return ot=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ot.apply(null,arguments)}function st(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function ct(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?st(Object(n),!0).forEach(function(t){at(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):st(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function lt(e,t){if(e==null)return{};var n,r,i=ut(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function ut(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function dt(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ft(e){var t=dt(e,`string`);return typeof t==`symbol`?t:t+``}function pt(e){"@babel/helpers - typeof";return pt=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},pt(e)}var mt=`1.15.7`;function ht(e){if(typeof window<`u`&&window.navigator)return!!navigator.userAgent.match(e)}var gt=ht(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),_t=ht(/Edge/i),vt=ht(/firefox/i),yt=ht(/safari/i)&&!ht(/chrome/i)&&!ht(/android/i),bt=ht(/iP(ad|od|hone)/i),xt=ht(/chrome/i)&&ht(/android/i),St={capture:!1,passive:!1};function R(e,t,n){e.addEventListener(t,n,!gt&&St)}function z(e,t,n){e.removeEventListener(t,n,!gt&&St)}function Ct(e,t){if(t){if(t[0]===`>`&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function wt(e){return e.host&&e!==document&&e.host.nodeType&&e.host!==e?e.host:e.parentNode}function Tt(e,t,n,r){if(e){n||=document;do{if(t!=null&&(t[0]===`>`?e.parentNode===n&&Ct(e,t):Ct(e,t))||r&&e===n)return e;if(e===n)break}while(e=wt(e))}return null}var Et=/\s+/g;function Dt(e,t,n){e&&t&&(e.classList?e.classList[n?`add`:`remove`](t):e.className=((` `+e.className+` `).replace(Et,` `).replace(` `+t+` `,` `)+(n?` `+t:``)).replace(Et,` `))}function B(e,t,n){var r=e&&e.style;if(r){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,``):e.currentStyle&&(n=e.currentStyle),t===void 0?n:n[t];!(t in r)&&t.indexOf(`webkit`)===-1&&(t=`-webkit-`+t),r[t]=n+(typeof n==`string`?``:`px`)}}function Ot(e,t){var n=``;if(typeof e==`string`)n=e;else do{var r=B(e,`transform`);r&&r!==`none`&&(n=r+` `+n)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function kt(e,t,n){if(e){var r=e.getElementsByTagName(t),i=0,a=r.length;if(n)for(;i<a;i++)n(r[i],i);return r}return[]}function At(){return document.scrollingElement||document.documentElement}function V(e,t,n,r,i){if(e.getBoundingClientRect||e===window){var a,o,s,c,l,u,d;if(e!==window&&e.parentNode&&e!==At()?(a=e.getBoundingClientRect(),o=a.top,s=a.left,c=a.bottom,l=a.right,u=a.height,d=a.width):(o=0,s=0,c=window.innerHeight,l=window.innerWidth,u=window.innerHeight,d=window.innerWidth),(t||n)&&e!==window&&(i||=e.parentNode,!gt))do if(i&&i.getBoundingClientRect&&(B(i,`transform`)!==`none`||n&&B(i,`position`)!==`static`)){var f=i.getBoundingClientRect();o-=f.top+parseInt(B(i,`border-top-width`)),s-=f.left+parseInt(B(i,`border-left-width`)),c=o+a.height,l=s+a.width;break}while(i=i.parentNode);if(r&&e!==window){var p=Ot(i||e),m=p&&p.a,h=p&&p.d;p&&(o/=h,s/=m,d/=m,u/=h,c=o+u,l=s+d)}return{top:o,left:s,bottom:c,right:l,width:d,height:u}}}function jt(e,t,n){for(var r=Lt(e,!0),i=V(e)[t];r;){var a=V(r)[n],o=void 0;if(o=n===`top`||n===`left`?i>=a:i<=a,!o)return r;if(r===At())break;r=Lt(r,!1)}return!1}function Mt(e,t,n,r){for(var i=0,a=0,o=e.children;a<o.length;){if(o[a].style.display!==`none`&&o[a]!==Q.ghost&&(r||o[a]!==Q.dragged)&&Tt(o[a],n.draggable,e,!1)){if(i===t)return o[a];i++}a++}return null}function Nt(e,t){for(var n=e.lastElementChild;n&&(n===Q.ghost||B(n,`display`)===`none`||t&&!Ct(n,t));)n=n.previousElementSibling;return n||null}function Pt(e,t){var n=0;if(!e||!e.parentNode)return-1;for(;e=e.previousElementSibling;)e.nodeName.toUpperCase()!==`TEMPLATE`&&e!==Q.clone&&(!t||Ct(e,t))&&n++;return n}function Ft(e){var t=0,n=0,r=At();if(e)do{var i=Ot(e),a=i.a,o=i.d;t+=e.scrollLeft*a,n+=e.scrollTop*o}while(e!==r&&(e=e.parentNode));return[t,n]}function It(e,t){for(var n in e)if(e.hasOwnProperty(n)){for(var r in t)if(t.hasOwnProperty(r)&&t[r]===e[n][r])return Number(n)}return-1}function Lt(e,t){if(!e||!e.getBoundingClientRect)return At();var n=e,r=!1;do if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=B(n);if(n.clientWidth<n.scrollWidth&&(i.overflowX==`auto`||i.overflowX==`scroll`)||n.clientHeight<n.scrollHeight&&(i.overflowY==`auto`||i.overflowY==`scroll`)){if(!n.getBoundingClientRect||n===document.body)return At();if(r||t)return n;r=!0}}while(n=n.parentNode);return At()}function Rt(e,t){if(e&&t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function zt(e,t){return Math.round(e.top)===Math.round(t.top)&&Math.round(e.left)===Math.round(t.left)&&Math.round(e.height)===Math.round(t.height)&&Math.round(e.width)===Math.round(t.width)}var Bt;function Vt(e,t){return function(){if(!Bt){var n=arguments,r=this;n.length===1?e.call(r,n[0]):e.apply(r,n),Bt=setTimeout(function(){Bt=void 0},t)}}}function Ht(){clearTimeout(Bt),Bt=void 0}function Ut(e,t,n){e.scrollLeft+=t,e.scrollTop+=n}function Wt(e){var t=window.Polymer,n=window.jQuery||window.Zepto;return t&&t.dom?t.dom(e).cloneNode(!0):n?n(e).clone(!0)[0]:e.cloneNode(!0)}function Gt(e,t,n){var r={};return Array.from(e.children).forEach(function(i){if(Tt(i,t.draggable,e,!1)&&!i.animated&&i!==n){var a=V(i);r.left=Math.min(r.left??1/0,a.left),r.top=Math.min(r.top??1/0,a.top),r.right=Math.max(r.right??-1/0,a.right),r.bottom=Math.max(r.bottom??-1/0,a.bottom)}}),r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}var H=`Sortable`+new Date().getTime();function Kt(){var e=[],t;return{captureAnimationState:function(){e=[],this.options.animation&&[].slice.call(this.el.children).forEach(function(t){if(B(t,`display`)!==`none`&&t!==Q.ghost){e.push({target:t,rect:V(t)});var n=ct({},e[e.length-1].rect);if(t.thisAnimationDuration){var r=Ot(t,!0);r&&(n.top-=r.f,n.left-=r.e)}t.fromRect=n}})},addAnimationState:function(t){e.push(t)},removeAnimationState:function(t){e.splice(It(e,{target:t}),1)},animateAll:function(n){var r=this;if(!this.options.animation)clearTimeout(t),typeof n==`function`&&n();else{var i=!1,a=0;e.forEach(function(e){var t=0,n=e.target,o=n.fromRect,s=V(n),c=n.prevFromRect,l=n.prevToRect,u=e.rect,d=Ot(n,!0);d&&(s.top-=d.f,s.left-=d.e),n.toRect=s,n.thisAnimationDuration&&zt(c,s)&&!zt(o,s)&&(u.top-s.top)/(u.left-s.left)===(o.top-s.top)/(o.left-s.left)&&(t=Jt(u,c,l,r.options)),zt(s,o)||(n.prevFromRect=o,n.prevToRect=s,t||=r.options.animation,r.animate(n,u,s,t)),t&&(i=!0,a=Math.max(a,t),clearTimeout(n.animationResetTimer),n.animationResetTimer=setTimeout(function(){n.animationTime=0,n.prevFromRect=null,n.fromRect=null,n.prevToRect=null,n.thisAnimationDuration=null},t),n.thisAnimationDuration=t)}),clearTimeout(t),i?t=setTimeout(function(){typeof n==`function`&&n()},a):typeof n==`function`&&n(),e=[]}},animate:function(e,t,n,r){if(r){B(e,`transition`,``),B(e,`transform`,``);var i=Ot(this.el),a=i&&i.a,o=i&&i.d,s=(t.left-n.left)/(a||1),c=(t.top-n.top)/(o||1);e.animatingX=!!s,e.animatingY=!!c,B(e,`transform`,`translate3d(`+s+`px,`+c+`px,0)`),this.forRepaintDummy=qt(e),B(e,`transition`,`transform `+r+`ms`+(this.options.easing?` `+this.options.easing:``)),B(e,`transform`,`translate3d(0,0,0)`),typeof e.animated==`number`&&clearTimeout(e.animated),e.animated=setTimeout(function(){B(e,`transition`,``),B(e,`transform`,``),e.animated=!1,e.animatingX=!1,e.animatingY=!1},r)}}}}function qt(e){return e.offsetWidth}function Jt(e,t,n,r){return Math.sqrt((t.top-e.top)**2+(t.left-e.left)**2)/Math.sqrt((t.top-n.top)**2+(t.left-n.left)**2)*r.animation}var Yt=[],Xt={initializeByDefault:!0},Zt={mount:function(e){for(var t in Xt)Xt.hasOwnProperty(t)&&!(t in e)&&(e[t]=Xt[t]);Yt.forEach(function(t){if(t.pluginName===e.pluginName)throw`Sortable: Cannot mount plugin ${e.pluginName} more than once`}),Yt.push(e)},pluginEvent:function(e,t,n){var r=this;this.eventCanceled=!1,n.cancel=function(){r.eventCanceled=!0};var i=e+`Global`;Yt.forEach(function(r){t[r.pluginName]&&(t[r.pluginName][i]&&t[r.pluginName][i](ct({sortable:t},n)),t.options[r.pluginName]&&t[r.pluginName][e]&&t[r.pluginName][e](ct({sortable:t},n)))})},initializePlugins:function(e,t,n,r){for(var i in Yt.forEach(function(r){var i=r.pluginName;if(e.options[i]||r.initializeByDefault){var a=new r(e,t,e.options);a.sortable=e,a.options=e.options,e[i]=a,ot(n,a.defaults)}}),e.options)if(e.options.hasOwnProperty(i)){var a=this.modifyOption(e,i,e.options[i]);a!==void 0&&(e.options[i]=a)}},getEventProperties:function(e,t){var n={};return Yt.forEach(function(r){typeof r.eventProperties==`function`&&ot(n,r.eventProperties.call(t[r.pluginName],e))}),n},modifyOption:function(e,t,n){var r;return Yt.forEach(function(i){e[i.pluginName]&&i.optionListeners&&typeof i.optionListeners[t]==`function`&&(r=i.optionListeners[t].call(e[i.pluginName],n))}),r}};function Qt(e){var t=e.sortable,n=e.rootEl,r=e.name,i=e.targetEl,a=e.cloneEl,o=e.toEl,s=e.fromEl,c=e.oldIndex,l=e.newIndex,u=e.oldDraggableIndex,d=e.newDraggableIndex,f=e.originalEvent,p=e.putSortable,m=e.extraEventProperties;if(t||=n&&n[H],t){var h,g=t.options,_=`on`+r.charAt(0).toUpperCase()+r.substr(1);window.CustomEvent&&!gt&&!_t?h=new CustomEvent(r,{bubbles:!0,cancelable:!0}):(h=document.createEvent(`Event`),h.initEvent(r,!0,!0)),h.to=o||n,h.from=s||n,h.item=i||n,h.clone=a,h.oldIndex=c,h.newIndex=l,h.oldDraggableIndex=u,h.newDraggableIndex=d,h.originalEvent=f,h.pullMode=p?p.lastPutMode:void 0;var v=ct(ct({},m),Zt.getEventProperties(r,t));for(var y in v)h[y]=v[y];n&&n.dispatchEvent(h),g[_]&&g[_].call(t,h)}}var $t=[`evt`],U=function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.evt,i=lt(n,$t);Zt.pluginEvent.bind(Q)(e,t,ct({dragEl:G,parentEl:K,ghostEl:q,rootEl:J,nextEl:en,lastDownEl:tn,cloneEl:Y,cloneHidden:nn,dragStarted:vn,putSortable:X,activeSortable:Q.active,originalEvent:r,oldIndex:rn,oldDraggableIndex:on,newIndex:an,newDraggableIndex:sn,hideGhostForTarget:In,unhideGhostForTarget:Ln,cloneNowHidden:function(){nn=!0},cloneNowShown:function(){nn=!1},dispatchSortableEvent:function(e){W({sortable:t,name:e,originalEvent:r})}},i))};function W(e){Qt(ct({putSortable:X,cloneEl:Y,targetEl:G,rootEl:J,oldIndex:rn,oldDraggableIndex:on,newIndex:an,newDraggableIndex:sn},e))}var G,K,q,J,en,tn,Y,nn,rn,an,on,sn,cn,X,ln=!1,un=!1,dn=[],fn,pn,mn,hn,gn,_n,vn,yn,bn,xn=!1,Sn=!1,Cn,Z,wn=[],Tn=!1,En=[],Dn=typeof document<`u`,On=bt,kn=_t||gt?`cssFloat`:`float`,An=Dn&&!xt&&!bt&&`draggable`in document.createElement(`div`),jn=function(){if(Dn){if(gt)return!1;var e=document.createElement(`x`);return e.style.cssText=`pointer-events:auto`,e.style.pointerEvents===`auto`}}(),Mn=function(e,t){var n=B(e),r=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),i=Mt(e,0,t),a=Mt(e,1,t),o=i&&B(i),s=a&&B(a),c=o&&parseInt(o.marginLeft)+parseInt(o.marginRight)+V(i).width,l=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+V(a).width;if(n.display===`flex`)return n.flexDirection===`column`||n.flexDirection===`column-reverse`?`vertical`:`horizontal`;if(n.display===`grid`)return n.gridTemplateColumns.split(` `).length<=1?`vertical`:`horizontal`;if(i&&o.float&&o.float!==`none`){var u=o.float===`left`?`left`:`right`;return a&&(s.clear===`both`||s.clear===u)?`vertical`:`horizontal`}return i&&(o.display===`block`||o.display===`flex`||o.display===`table`||o.display===`grid`||c>=r&&n[kn]===`none`||a&&n[kn]===`none`&&c+l>r)?`vertical`:`horizontal`},Nn=function(e,t,n){var r=n?e.left:e.top,i=n?e.right:e.bottom,a=n?e.width:e.height,o=n?t.left:t.top,s=n?t.right:t.bottom,c=n?t.width:t.height;return r===o||i===s||r+a/2===o+c/2},Pn=function(e,t){var n;return dn.some(function(r){var i=r[H].options.emptyInsertThreshold;if(i&&!Nt(r)){var a=V(r),o=e>=a.left-i&&e<=a.right+i,s=t>=a.top-i&&t<=a.bottom+i;if(o&&s)return n=r}}),n},Fn=function(e){function t(e,n){return function(r,i,a,o){var s=r.options.group.name&&i.options.group.name&&r.options.group.name===i.options.group.name;if(e==null&&(n||s))return!0;if(e==null||e===!1)return!1;if(n&&e===`clone`)return e;if(typeof e==`function`)return t(e(r,i,a,o),n)(r,i,a,o);var c=(n?r:i).options.group.name;return e===!0||typeof e==`string`&&e===c||e.join&&e.indexOf(c)>-1}}var n={},r=e.group;r&&pt(r)==`object`||(r={name:r}),n.name=r.name,n.checkPull=t(r.pull,!0),n.checkPut=t(r.put),n.revertClone=r.revertClone,e.group=n},In=function(){!jn&&q&&B(q,`display`,`none`)},Ln=function(){!jn&&q&&B(q,`display`,``)};Dn&&!xt&&document.addEventListener(`click`,function(e){if(un)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),un=!1,!1},!0);var Rn=function(e){if(G){e=e.touches?e.touches[0]:e;var t=Pn(e.clientX,e.clientY);if(t){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[H]._onDragOver(n)}}},zn=function(e){G&&G.parentNode[H]._isOutsideThisEl(e.target)};function Q(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw`Sortable: \`el\` must be an HTMLElement, not ${{}.toString.call(e)}`;this.el=e,this.options=t=ot({},t),e[H]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?`>li`:`>*`,swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Mn(e,this.options)},ghostClass:`sortable-ghost`,chosenClass:`sortable-chosen`,dragClass:`sortable-drag`,ignore:`a, img`,filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData(`Text`,t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:`data-id`,delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:`sortable-fallback`,fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Q.supportPointer!==!1&&`PointerEvent`in window&&(!yt||bt),emptyInsertThreshold:5};for(var r in Zt.initializePlugins(this,e,n),n)!(r in t)&&(t[r]=n[r]);for(var i in Fn(t),this)i.charAt(0)===`_`&&typeof this[i]==`function`&&(this[i]=this[i].bind(this));this.nativeDraggable=!t.forceFallback&&An,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?R(e,`pointerdown`,this._onTapStart):(R(e,`mousedown`,this._onTapStart),R(e,`touchstart`,this._onTapStart)),this.nativeDraggable&&(R(e,`dragover`,this),R(e,`dragenter`,this)),dn.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),ot(this,Kt())}Q.prototype={constructor:Q,_isOutsideThisEl:function(e){!this.el.contains(e)&&e!==this.el&&(yn=null)},_getDirection:function(e,t){return typeof this.options.direction==`function`?this.options.direction.call(this,e,t,G):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,r=this.options,i=r.preventOnFilter,a=e.type,o=e.touches&&e.touches[0]||e.pointerType&&e.pointerType===`touch`&&e,s=(o||e).target,c=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||s,l=r.filter;if(Yn(n),!G&&!(/mousedown|pointerdown/.test(a)&&e.button!==0||r.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&yt&&s&&s.tagName.toUpperCase()===`SELECT`)&&(s=Tt(s,r.draggable,n,!1),!(s&&s.animated)&&tn!==s)){if(rn=Pt(s),on=Pt(s,r.draggable),typeof l==`function`){if(l.call(this,e,s,this)){W({sortable:t,rootEl:c,name:`filter`,targetEl:s,toEl:n,fromEl:n}),U(`filter`,t,{evt:e}),i&&e.preventDefault();return}}else if(l&&(l=l.split(`,`).some(function(r){if(r=Tt(c,r.trim(),n,!1),r)return W({sortable:t,rootEl:r,name:`filter`,targetEl:s,fromEl:n,toEl:n}),U(`filter`,t,{evt:e}),!0}),l)){i&&e.preventDefault();return}(!r.handle||Tt(c,r.handle,n,!1))&&this._prepareDragStart(e,o,s)}}},_prepareDragStart:function(e,t,n){var r=this,i=r.el,a=r.options,o=i.ownerDocument,s;if(n&&!G&&n.parentNode===i){var c=V(n);if(J=i,G=n,K=G.parentNode,en=G.nextSibling,tn=n,cn=a.group,Q.dragged=G,fn={target:G,clientX:(t||e).clientX,clientY:(t||e).clientY},gn=fn.clientX-c.left,_n=fn.clientY-c.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,G.style[`will-change`]=`all`,s=function(){U(`delayEnded`,r,{evt:e}),Q.eventCanceled?r._onDrop():(r._disableDelayedDragEvents(),!vt&&r.nativeDraggable&&(G.draggable=!0),r._triggerDragStart(e,t),W({sortable:r,name:`choose`,originalEvent:e}),Dt(G,a.chosenClass,!0))},a.ignore.split(`,`).forEach(function(e){kt(G,e.trim(),Hn)}),R(o,`dragover`,Rn),R(o,`mousemove`,Rn),R(o,`touchmove`,Rn),a.supportPointer?(R(o,`pointerup`,r._onDrop),!this.nativeDraggable&&R(o,`pointercancel`,r._onDrop)):(R(o,`mouseup`,r._onDrop),R(o,`touchend`,r._onDrop),R(o,`touchcancel`,r._onDrop)),vt&&this.nativeDraggable&&(this.options.touchStartThreshold=4,G.draggable=!0),U(`delayStart`,this,{evt:e}),a.delay&&(!a.delayOnTouchOnly||t)&&(!this.nativeDraggable||!(_t||gt))){if(Q.eventCanceled){this._onDrop();return}a.supportPointer?(R(o,`pointerup`,r._disableDelayedDrag),R(o,`pointercancel`,r._disableDelayedDrag)):(R(o,`mouseup`,r._disableDelayedDrag),R(o,`touchend`,r._disableDelayedDrag),R(o,`touchcancel`,r._disableDelayedDrag)),R(o,`mousemove`,r._delayedDragTouchMoveHandler),R(o,`touchmove`,r._delayedDragTouchMoveHandler),a.supportPointer&&R(o,`pointermove`,r._delayedDragTouchMoveHandler),r._dragStartTimer=setTimeout(s,a.delay)}else s()}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){G&&Hn(G),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;z(e,`mouseup`,this._disableDelayedDrag),z(e,`touchend`,this._disableDelayedDrag),z(e,`touchcancel`,this._disableDelayedDrag),z(e,`pointerup`,this._disableDelayedDrag),z(e,`pointercancel`,this._disableDelayedDrag),z(e,`mousemove`,this._delayedDragTouchMoveHandler),z(e,`touchmove`,this._delayedDragTouchMoveHandler),z(e,`pointermove`,this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t||=e.pointerType==`touch`&&e,!this.nativeDraggable||t?this.options.supportPointer?R(document,`pointermove`,this._onTouchMove):t?R(document,`touchmove`,this._onTouchMove):R(document,`mousemove`,this._onTouchMove):(R(G,`dragend`,this),R(J,`dragstart`,this._onDragStart));try{document.selection?Xn(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(e,t){if(ln=!1,J&&G){U(`dragStarted`,this,{evt:t}),this.nativeDraggable&&R(document,`dragover`,zn);var n=this.options;!e&&Dt(G,n.dragClass,!1),Dt(G,n.ghostClass,!0),Q.active=this,e&&this._appendGhost(),W({sortable:this,name:`start`,originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(pn){this._lastX=pn.clientX,this._lastY=pn.clientY,In();for(var e=document.elementFromPoint(pn.clientX,pn.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(pn.clientX,pn.clientY),e!==t);)t=e;if(G.parentNode[H]._isOutsideThisEl(e),t)do{if(t[H]){var n=void 0;if(n=t[H]._onDragOver({clientX:pn.clientX,clientY:pn.clientY,target:e,rootEl:t}),n&&!this.options.dragoverBubble)break}e=t}while(t=wt(t));Ln()}},_onTouchMove:function(e){if(fn){var t=this.options,n=t.fallbackTolerance,r=t.fallbackOffset,i=e.touches?e.touches[0]:e,a=q&&Ot(q,!0),o=q&&a&&a.a,s=q&&a&&a.d,c=On&&Z&&Ft(Z),l=(i.clientX-fn.clientX+r.x)/(o||1)+(c?c[0]-wn[0]:0)/(o||1),u=(i.clientY-fn.clientY+r.y)/(s||1)+(c?c[1]-wn[1]:0)/(s||1);if(!Q.active&&!ln){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))<n)return;this._onDragStart(e,!0)}if(q){a?(a.e+=l-(mn||0),a.f+=u-(hn||0)):a={a:1,b:0,c:0,d:1,e:l,f:u};var d=`matrix(${a.a},${a.b},${a.c},${a.d},${a.e},${a.f})`;B(q,`webkitTransform`,d),B(q,`mozTransform`,d),B(q,`msTransform`,d),B(q,`transform`,d),mn=l,hn=u,pn=i}e.cancelable&&e.preventDefault()}},_appendGhost:function(){if(!q){var e=this.options.fallbackOnBody?document.body:J,t=V(G,!0,On,!0,e),n=this.options;if(On){for(Z=e;B(Z,`position`)===`static`&&B(Z,`transform`)===`none`&&Z!==document;)Z=Z.parentNode;Z!==document.body&&Z!==document.documentElement?(Z===document&&(Z=At()),t.top+=Z.scrollTop,t.left+=Z.scrollLeft):Z=At(),wn=Ft(Z)}q=G.cloneNode(!0),Dt(q,n.ghostClass,!1),Dt(q,n.fallbackClass,!0),Dt(q,n.dragClass,!0),B(q,`transition`,``),B(q,`transform`,``),B(q,`box-sizing`,`border-box`),B(q,`margin`,0),B(q,`top`,t.top),B(q,`left`,t.left),B(q,`width`,t.width),B(q,`height`,t.height),B(q,`opacity`,`0.8`),B(q,`position`,On?`absolute`:`fixed`),B(q,`zIndex`,`100000`),B(q,`pointerEvents`,`none`),Q.ghost=q,e.appendChild(q),B(q,`transform-origin`,gn/parseInt(q.style.width)*100+`% `+_n/parseInt(q.style.height)*100+`%`)}},_onDragStart:function(e,t){var n=this,r=e.dataTransfer,i=n.options;U(`dragStart`,this,{evt:e}),Q.eventCanceled?this._onDrop():(U(`setupClone`,this),Q.eventCanceled||(Y=Wt(G),Y.removeAttribute(`id`),Y.draggable=!1,Y.style[`will-change`]=``,this._hideClone(),Dt(Y,this.options.chosenClass,!1),Q.clone=Y),n.cloneId=Xn(function(){U(`clone`,n),Q.eventCanceled||(n.options.removeCloneOnHide||J.insertBefore(Y,G),n._hideClone(),W({sortable:n,name:`clone`}))}),!t&&Dt(G,i.dragClass,!0),t?(un=!0,n._loopId=setInterval(n._emulateDragOver,50)):(z(document,`mouseup`,n._onDrop),z(document,`touchend`,n._onDrop),z(document,`touchcancel`,n._onDrop),r&&(r.effectAllowed=`move`,i.setData&&i.setData.call(n,r,G)),R(document,`drop`,n),B(G,`transform`,`translateZ(0)`)),ln=!0,n._dragStartId=Xn(n._dragStarted.bind(n,t,e)),R(document,`selectstart`,n),vn=!0,window.getSelection().removeAllRanges(),yt&&B(document.body,`user-select`,`none`))},_onDragOver:function(e){var t=this.el,n=e.target,r,i,a,o=this.options,s=o.group,c=Q.active,l=cn===s,u=o.sort,d=X||c,f,p=this,m=!1;if(Tn)return;function h(o,s){U(o,p,ct({evt:e,isOwner:l,axis:f?`vertical`:`horizontal`,revert:a,dragRect:r,targetRect:i,canSort:u,fromSortable:d,target:n,completed:_,onMove:function(n,i){return Vn(J,t,G,r,n,V(n),e,i)},changed:v},s))}function g(){h(`dragOverAnimationCapture`),p.captureAnimationState(),p!==d&&d.captureAnimationState()}function _(r){return h(`dragOverCompleted`,{insertion:r}),r&&(l?c._hideClone():c._showClone(p),p!==d&&(Dt(G,X?X.options.ghostClass:c.options.ghostClass,!1),Dt(G,o.ghostClass,!0)),X!==p&&p!==Q.active?X=p:p===Q.active&&X&&(X=null),d===p&&(p._ignoreWhileAnimating=n),p.animateAll(function(){h(`dragOverAnimationComplete`),p._ignoreWhileAnimating=null}),p!==d&&(d.animateAll(),d._ignoreWhileAnimating=null)),(n===G&&!G.animated||n===t&&!n.animated)&&(yn=null),!o.dragoverBubble&&!e.rootEl&&n!==document&&(G.parentNode[H]._isOutsideThisEl(e.target),!r&&Rn(e)),!o.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),m=!0}function v(){an=Pt(G),sn=Pt(G,o.draggable),W({sortable:p,name:`change`,toEl:t,newIndex:an,newDraggableIndex:sn,originalEvent:e})}if(e.preventDefault!==void 0&&e.cancelable&&e.preventDefault(),n=Tt(n,o.draggable,t,!0),h(`dragOver`),Q.eventCanceled)return m;if(G.contains(e.target)||n.animated&&n.animatingX&&n.animatingY||p._ignoreWhileAnimating===n)return _(!1);if(un=!1,c&&!o.disabled&&(l?u||(a=K!==J):X===this||(this.lastPutMode=cn.checkPull(this,c,G,e))&&s.checkPut(this,c,G,e))){if(f=this._getDirection(e,n)===`vertical`,r=V(G),h(`dragOverValid`),Q.eventCanceled)return m;if(a)return K=J,g(),this._hideClone(),h(`revert`),Q.eventCanceled||(en?J.insertBefore(G,en):J.appendChild(G)),_(!0);var y=Nt(t,o.draggable);if(!y||Gn(e,f,this)&&!y.animated){if(y===G)return _(!1);if(y&&t===e.target&&(n=y),n&&(i=V(n)),Vn(J,t,G,r,n,i,e,!!n)!==!1)return g(),y&&y.nextSibling?t.insertBefore(G,y.nextSibling):t.appendChild(G),K=t,v(),_(!0)}else if(y&&Wn(e,f,this)){var b=Mt(t,0,o,!0);if(b===G)return _(!1);if(n=b,i=V(n),Vn(J,t,G,r,n,i,e,!1)!==!1)return g(),t.insertBefore(G,b),K=t,v(),_(!0)}else if(n.parentNode===t){i=V(n);var x=0,S,C=G.parentNode!==t,w=!Nn(G.animated&&G.toRect||r,n.animated&&n.toRect||i,f),T=f?`top`:`left`,E=jt(n,`top`,`top`)||jt(G,`top`,`top`),D=E?E.scrollTop:void 0;yn!==n&&(S=i[T],xn=!1,Sn=!w&&o.invertSwap||C),x=Kn(e,n,i,f,w?1:o.swapThreshold,o.invertedSwapThreshold==null?o.swapThreshold:o.invertedSwapThreshold,Sn,yn===n);var O;if(x!==0){var ee=Pt(G);do ee-=x,O=K.children[ee];while(O&&(B(O,`display`)===`none`||O===q))}if(x===0||O===n)return _(!1);yn=n,bn=x;var k=n.nextElementSibling,A=!1;A=x===1;var te=Vn(J,t,G,r,n,i,e,A);if(te!==!1)return(te===1||te===-1)&&(A=te===1),Tn=!0,setTimeout(Un,30),g(),A&&!k?t.appendChild(G):n.parentNode.insertBefore(G,A?k:n),E&&Ut(E,0,D-E.scrollTop),K=G.parentNode,S!==void 0&&!Sn&&(Cn=Math.abs(S-V(n)[T])),v(),_(!0)}if(t.contains(G))return _(!1)}return!1},_ignoreWhileAnimating:null,_offMoveEvents:function(){z(document,`mousemove`,this._onTouchMove),z(document,`touchmove`,this._onTouchMove),z(document,`pointermove`,this._onTouchMove),z(document,`dragover`,Rn),z(document,`mousemove`,Rn),z(document,`touchmove`,Rn)},_offUpEvents:function(){var e=this.el.ownerDocument;z(e,`mouseup`,this._onDrop),z(e,`touchend`,this._onDrop),z(e,`pointerup`,this._onDrop),z(e,`pointercancel`,this._onDrop),z(e,`touchcancel`,this._onDrop),z(document,`selectstart`,this)},_onDrop:function(e){var t=this.el,n=this.options;an=Pt(G),sn=Pt(G,n.draggable),U(`drop`,this,{evt:e}),K=G&&G.parentNode,an=Pt(G),sn=Pt(G,n.draggable),Q.eventCanceled||(ln=!1,Sn=!1,xn=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Zn(this.cloneId),Zn(this._dragStartId),this.nativeDraggable&&(z(document,`drop`,this),z(t,`dragstart`,this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),yt&&B(document.body,`user-select`,``),B(G,`transform`,``),e&&(vn&&(e.cancelable&&e.preventDefault(),!n.dropBubble&&e.stopPropagation()),q&&q.parentNode&&q.parentNode.removeChild(q),(J===K||X&&X.lastPutMode!==`clone`)&&Y&&Y.parentNode&&Y.parentNode.removeChild(Y),G&&(this.nativeDraggable&&z(G,`dragend`,this),Hn(G),G.style[`will-change`]=``,vn&&!ln&&Dt(G,X?X.options.ghostClass:this.options.ghostClass,!1),Dt(G,this.options.chosenClass,!1),W({sortable:this,name:`unchoose`,toEl:K,newIndex:null,newDraggableIndex:null,originalEvent:e}),J===K?an!==rn&&an>=0&&(W({sortable:this,name:`update`,toEl:K,originalEvent:e}),W({sortable:this,name:`sort`,toEl:K,originalEvent:e})):(an>=0&&(W({rootEl:K,name:`add`,toEl:K,fromEl:J,originalEvent:e}),W({sortable:this,name:`remove`,toEl:K,originalEvent:e}),W({rootEl:K,name:`sort`,toEl:K,fromEl:J,originalEvent:e}),W({sortable:this,name:`sort`,toEl:K,originalEvent:e})),X&&X.save()),Q.active&&((an==null||an===-1)&&(an=rn,sn=on),W({sortable:this,name:`end`,toEl:K,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){U(`nulling`,this),J=G=K=q=en=Y=tn=nn=fn=pn=vn=an=sn=rn=on=yn=bn=X=cn=Q.dragged=Q.ghost=Q.clone=Q.active=null;var e=this.el;En.forEach(function(t){e.contains(t)&&(t.checked=!0)}),En.length=mn=hn=0},handleEvent:function(e){switch(e.type){case`drop`:case`dragend`:this._onDrop(e);break;case`dragenter`:case`dragover`:G&&(this._onDragOver(e),Bn(e));break;case`selectstart`:e.preventDefault()}},toArray:function(){for(var e=[],t,n=this.el.children,r=0,i=n.length,a=this.options;r<i;r++)t=n[r],Tt(t,a.draggable,this.el,!1)&&e.push(t.getAttribute(a.dataIdAttr)||Jn(t));return e},sort:function(e,t){var n={},r=this.el;this.toArray().forEach(function(e,t){var i=r.children[t];Tt(i,this.options.draggable,r,!1)&&(n[e]=i)},this),t&&this.captureAnimationState(),e.forEach(function(e){n[e]&&(r.removeChild(n[e]),r.appendChild(n[e]))}),t&&this.animateAll()},save:function(){var e=this.options.store;e&&e.set&&e.set(this)},closest:function(e,t){return Tt(e,t||this.options.draggable,this.el,!1)},option:function(e,t){var n=this.options;if(t===void 0)return n[e];var r=Zt.modifyOption(this,e,t);n[e]=r===void 0?t:r,e===`group`&&Fn(n)},destroy:function(){U(`destroy`,this);var e=this.el;e[H]=null,z(e,`mousedown`,this._onTapStart),z(e,`touchstart`,this._onTapStart),z(e,`pointerdown`,this._onTapStart),this.nativeDraggable&&(z(e,`dragover`,this),z(e,`dragenter`,this)),Array.prototype.forEach.call(e.querySelectorAll(`[draggable]`),function(e){e.removeAttribute(`draggable`)}),this._onDrop(),this._disableDelayedDragEvents(),dn.splice(dn.indexOf(this.el),1),this.el=e=null},_hideClone:function(){if(!nn){if(U(`hideClone`,this),Q.eventCanceled)return;B(Y,`display`,`none`),this.options.removeCloneOnHide&&Y.parentNode&&Y.parentNode.removeChild(Y),nn=!0}},_showClone:function(e){if(e.lastPutMode!==`clone`)this._hideClone();else if(nn){if(U(`showClone`,this),Q.eventCanceled)return;G.parentNode==J&&!this.options.group.revertClone?J.insertBefore(Y,G):en?J.insertBefore(Y,en):J.appendChild(Y),this.options.group.revertClone&&this.animate(G,Y),B(Y,`display`,``),nn=!1}}};function Bn(e){e.dataTransfer&&(e.dataTransfer.dropEffect=`move`),e.cancelable&&e.preventDefault()}function Vn(e,t,n,r,i,a,o,s){var c,l=e[H],u=l.options.onMove,d;return window.CustomEvent&&!gt&&!_t?c=new CustomEvent(`move`,{bubbles:!0,cancelable:!0}):(c=document.createEvent(`Event`),c.initEvent(`move`,!0,!0)),c.to=t,c.from=e,c.dragged=n,c.draggedRect=r,c.related=i||t,c.relatedRect=a||V(t),c.willInsertAfter=s,c.originalEvent=o,e.dispatchEvent(c),u&&(d=u.call(l,c,o)),d}function Hn(e){e.draggable=!1}function Un(){Tn=!1}function Wn(e,t,n){var r=V(Mt(n.el,0,n.options,!0)),i=Gt(n.el,n.options,q),a=10;return t?e.clientX<i.left-a||e.clientY<r.top&&e.clientX<r.right:e.clientY<i.top-a||e.clientY<r.bottom&&e.clientX<r.left}function Gn(e,t,n){var r=V(Nt(n.el,n.options.draggable)),i=Gt(n.el,n.options,q),a=10;return t?e.clientX>i.right+a||e.clientY>r.bottom&&e.clientX>r.left:e.clientY>i.bottom+a||e.clientX>r.right&&e.clientY>r.top}function Kn(e,t,n,r,i,a,o,s){var c=r?e.clientY:e.clientX,l=r?n.height:n.width,u=r?n.top:n.left,d=r?n.bottom:n.right,f=!1;if(!o){if(s&&Cn<l*i){if(!xn&&(bn===1?c>u+l*a/2:c<d-l*a/2)&&(xn=!0),xn)f=!0;else if(bn===1?c<u+Cn:c>d-Cn)return-bn}else if(c>u+l*(1-i)/2&&c<d-l*(1-i)/2)return qn(t)}return f||=o,f&&(c<u+l*a/2||c>d-l*a/2)?c>u+l/2?1:-1:0}function qn(e){return Pt(G)<Pt(e)?1:-1}function Jn(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,r=0;n--;)r+=t.charCodeAt(n);return r.toString(36)}function Yn(e){En.length=0;for(var t=e.getElementsByTagName(`input`),n=t.length;n--;){var r=t[n];r.checked&&En.push(r)}}function Xn(e){return setTimeout(e,0)}function Zn(e){return clearTimeout(e)}Dn&&R(document,`touchmove`,function(e){(Q.active||ln)&&e.cancelable&&e.preventDefault()}),Q.utils={on:R,off:z,css:B,find:kt,is:function(e,t){return!!Tt(e,t,e,!1)},extend:Rt,throttle:Vt,closest:Tt,toggleClass:Dt,clone:Wt,index:Pt,nextTick:Xn,cancelNextTick:Zn,detectDirection:Mn,getChild:Mt,expando:H},Q.get=function(e){return e[H]},Q.mount=function(){var e=[...arguments];e[0].constructor===Array&&(e=e[0]),e.forEach(function(e){if(!e.prototype||!e.prototype.constructor)throw`Sortable: Mounted plugin must be a constructor function, not ${{}.toString.call(e)}`;e.utils&&(Q.utils=ct(ct({},Q.utils),e.utils)),Zt.mount(e)})},Q.create=function(e,t){return new Q(e,t)},Q.version=mt;var $=[],Qn,$n,er=!1,tr,nr,rr,ir;function ar(){function e(){for(var e in this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)e.charAt(0)===`_`&&typeof this[e]==`function`&&(this[e]=this[e].bind(this))}return e.prototype={dragStarted:function(e){var t=e.originalEvent;this.sortable.nativeDraggable?R(document,`dragover`,this._handleAutoScroll):this.options.supportPointer?R(document,`pointermove`,this._handleFallbackAutoScroll):t.touches?R(document,`touchmove`,this._handleFallbackAutoScroll):R(document,`mousemove`,this._handleFallbackAutoScroll)},dragOverCompleted:function(e){var t=e.originalEvent;!this.options.dragOverBubble&&!t.rootEl&&this._handleAutoScroll(t)},drop:function(){this.sortable.nativeDraggable?z(document,`dragover`,this._handleAutoScroll):(z(document,`pointermove`,this._handleFallbackAutoScroll),z(document,`touchmove`,this._handleFallbackAutoScroll),z(document,`mousemove`,this._handleFallbackAutoScroll)),sr(),or(),Ht()},nulling:function(){rr=$n=Qn=er=ir=tr=nr=null,$.length=0},_handleFallbackAutoScroll:function(e){this._handleAutoScroll(e,!0)},_handleAutoScroll:function(e,t){var n=this,r=(e.touches?e.touches[0]:e).clientX,i=(e.touches?e.touches[0]:e).clientY,a=document.elementFromPoint(r,i);if(rr=e,t||this.options.forceAutoScrollFallback||_t||gt||yt){cr(e,this.options,a,t);var o=Lt(a,!0);er&&(!ir||r!==tr||i!==nr)&&(ir&&sr(),ir=setInterval(function(){var a=Lt(document.elementFromPoint(r,i),!0);a!==o&&(o=a,or()),cr(e,n.options,a,t)},10),tr=r,nr=i)}else{if(!this.options.bubbleScroll||Lt(a,!0)===At()){or();return}cr(e,this.options,Lt(a,!1),!1)}}},ot(e,{pluginName:`scroll`,initializeByDefault:!0})}function or(){$.forEach(function(e){clearInterval(e.pid)}),$=[]}function sr(){clearInterval(ir)}var cr=Vt(function(e,t,n,r){if(t.scroll){var i=(e.touches?e.touches[0]:e).clientX,a=(e.touches?e.touches[0]:e).clientY,o=t.scrollSensitivity,s=t.scrollSpeed,c=At(),l=!1,u;$n!==n&&($n=n,or(),Qn=t.scroll,u=t.scrollFn,Qn===!0&&(Qn=Lt(n,!0)));var d=0,f=Qn;do{var p=f,m=V(p),h=m.top,g=m.bottom,_=m.left,v=m.right,y=m.width,b=m.height,x=void 0,S=void 0,C=p.scrollWidth,w=p.scrollHeight,T=B(p),E=p.scrollLeft,D=p.scrollTop;p===c?(x=y<C&&(T.overflowX===`auto`||T.overflowX===`scroll`||T.overflowX===`visible`),S=b<w&&(T.overflowY===`auto`||T.overflowY===`scroll`||T.overflowY===`visible`)):(x=y<C&&(T.overflowX===`auto`||T.overflowX===`scroll`),S=b<w&&(T.overflowY===`auto`||T.overflowY===`scroll`));var O=x&&(Math.abs(v-i)<=o&&E+y<C)-(Math.abs(_-i)<=o&&!!E),ee=S&&(Math.abs(g-a)<=o&&D+b<w)-(Math.abs(h-a)<=o&&!!D);if(!$[d])for(var k=0;k<=d;k++)$[k]||($[k]={});($[d].vx!=O||$[d].vy!=ee||$[d].el!==p)&&($[d].el=p,$[d].vx=O,$[d].vy=ee,clearInterval($[d].pid),(O!=0||ee!=0)&&(l=!0,$[d].pid=setInterval(function(){r&&this.layer===0&&Q.active._onTouchMove(rr);var t=$[this.layer].vy?$[this.layer].vy*s:0,n=$[this.layer].vx?$[this.layer].vx*s:0;(typeof u!=`function`||u.call(Q.dragged.parentNode[H],n,t,e,rr,$[this.layer].el)===`continue`)&&Ut($[this.layer].el,n,t)}.bind({layer:d}),24))),d++}while(t.bubbleScroll&&f!==c&&(f=Lt(f,!1)));er=l}},30),lr=function(e){var t=e.originalEvent,n=e.putSortable,r=e.dragEl,i=e.activeSortable,a=e.dispatchSortableEvent,o=e.hideGhostForTarget,s=e.unhideGhostForTarget;if(t){var c=n||i;o();var l=t.changedTouches&&t.changedTouches.length?t.changedTouches[0]:t,u=document.elementFromPoint(l.clientX,l.clientY);s(),c&&!c.el.contains(u)&&(a(`spill`),this.onSpill({dragEl:r,putSortable:n}))}};function ur(){}ur.prototype={startIndex:null,dragStart:function(e){var t=e.oldDraggableIndex;this.startIndex=t},onSpill:function(e){var t=e.dragEl,n=e.putSortable;this.sortable.captureAnimationState(),n&&n.captureAnimationState();var r=Mt(this.sortable.el,this.startIndex,this.options);r?this.sortable.el.insertBefore(t,r):this.sortable.el.appendChild(t),this.sortable.animateAll(),n&&n.animateAll()},drop:lr},ot(ur,{pluginName:`revertOnSpill`});function dr(){}dr.prototype={onSpill:function(e){var t=e.dragEl,n=e.putSortable||this.sortable;n.captureAnimationState(),t.parentNode&&t.parentNode.removeChild(t),n.animateAll()},drop:lr},ot(dr,{pluginName:`removeOnSpill`}),Q.mount(new ar),Q.mount(dr,ur);var fr=e=>Array.from(e.dataTransfer?.types??[]).includes(`Files`),pr=e=>{let t=e?.closest?.(`[data-item-id]`);return t?Number(t.dataset.itemId):null},mr=({item:e})=>{let t=e.current;return t?.hasThumbnail?I(`img`,{class:`thumb`,src:P.thumbnailUrl(e.id,t.n),alt:``,loading:`lazy`}):I(`span`,{class:`thumb thumb-ext ext-${t?.ext??`none`}`,children:(t?.ext??`?`).toUpperCase()})},hr=e=>{let t=Oe(null),[n,r]=N(null),i=Oe(e);return i.current=e,De(()=>{if(!t.current||!e.editable)return;let n=Q.create(t.current,{handle:`.handle`,animation:120,forceFallback:!0,fallbackTolerance:4,onEnd:e=>{let{oldIndex:t,newIndex:n,item:r,from:a}=e;if(t===void 0||n===void 0||t===n)return;a.removeChild(r),a.insertBefore(r,a.children[t]??null);let o=[...i.current.items],[s]=o.splice(t,1);o.splice(n,0,s),i.current.onReorder(s,n===0?null:o[n-1].id)}});return()=>n.destroy()},[e.editable]),I(`div`,{class:`list-wrap${n===`list`?` drop-list`:``}`,onDragOver:t=>{e.editable&&fr(t)&&(t.preventDefault(),t.dataTransfer.dropEffect=`copy`,r(pr(t.target)??`list`))},onDragLeave:e=>{e.currentTarget.contains(e.relatedTarget)||r(null)},onDrop:t=>{if(!e.editable||!fr(t))return;t.preventDefault(),r(null);let n=Array.from(t.dataTransfer?.files??[]);if(!n.length)return;let i=pr(t.target);e.onDropFiles(n,i===null?null:e.items.find(e=>e.id===i)??null)},children:[I(`ul`,{class:`items`,ref:t,children:e.items.map(t=>I(`li`,{"data-item-id":t.id,class:[`item`,t.id===e.selectedId?`selected`:``,n===t.id?`drop-row`:``,`status-${t.status}`].join(` `),onClick:n=>{n.target.closest(`select, a, button, .handle`)||e.onSelect(t.id)},children:[e.editable&&I(`span`,{class:`handle`,title:`Drag to reorder`,"aria-label":`Drag to reorder`,children:`⠿`}),I(mr,{item:t}),I(`span`,{class:`title`,children:[I(`span`,{class:`name`,children:t.title}),t.needsConfirm&&I(`span`,{class:`badge warn`,children:`printed?`}),I(`span`,{class:`meta`,children:[t.current?I(S,{children:[`v`,t.current.n,t.versionCount>1?`/${t.versionCount}`:``,` · `,t.current.ext.toUpperCase(),` ·`,` `,Ke(t.current.size)]}):`no file`,I(`span`,{class:`when`,children:[` · `,I(`time`,{title:Ye(t.createdAt),children:Je(t.createdAt)})]})]})]}),e.editable?I(`select`,{class:`status status-${t.status}`,value:t.status,"aria-label":`Status`,onChange:n=>e.onStatus(t,n.currentTarget.value),children:Re.map(e=>I(`option`,{value:e,children:e},e))}):I(`button`,{class:`small`,onClick:()=>e.onRestore(t),children:`Restore`}),t.current&&I(`a`,{class:`icon`,href:P.downloadUrl(t.id,t.current.n),title:`Download`,"aria-label":`Download`,children:`⇩`})]},t.id))}),e.editable&&I(`p`,{class:`dropzone`,children:`⇪ Drop STL, 3MF, STEP, OBJ or ZIP files here. Drop one file on a row to add a new version.`})]})},gr=({queues:e,currentId:t,onSelect:n,onChanged:r})=>{let[i,a]=N(!1),[o,s]=N(``),[c,l]=N(!1),u=e.find(e=>e.id===t)??null,d=async()=>{let e=o.trim();if(!e)return a(!1);try{let t=await P.createQueue({name:e});s(``),a(!1),r(t.id)}catch(e){L(F(e),`error`)}};return I(`nav`,{class:`queuebar`,"aria-label":`Queues`,children:[I(`div`,{class:`tabs`,role:`tablist`,children:e.map(e=>I(`button`,{role:`tab`,"aria-selected":e.id===t,class:`tab${e.id===t?` active`:``}`,onClick:()=>n(e.id),children:[e.name,` `,I(`span`,{class:`count`,children:e.counts.queued})]},e.id))}),I(`select`,{class:`tabs-select`,"aria-label":`Queue`,value:t??``,onChange:e=>n(Number(e.currentTarget.value)),children:e.map(e=>I(`option`,{value:e.id,children:[e.name,` (`,e.counts.queued,`)`]},e.id))}),i?I(`form`,{class:`inline-form`,onSubmit:e=>{e.preventDefault(),d()},children:[I(`input`,{autoFocus:!0,placeholder:`Queue name`,value:o,onInput:e=>s(e.currentTarget.value),onKeyDown:e=>e.key===`Escape`&&a(!1)}),I(`button`,{type:`submit`,class:`small`,children:`Add`})]}):I(`button`,{class:`small`,onClick:()=>a(!0),title:`New queue`,children:`+ Queue`}),u&&I(`div`,{class:`settings`,children:[I(`button`,{class:`icon`,"aria-expanded":c,title:`Queue settings`,"aria-label":`Queue settings`,onClick:()=>l(!c),children:`⚙`}),c&&I(`div`,{class:`menu`,role:`dialog`,"aria-label":`Settings of ${u.name}`,children:[I(`form`,{class:`inline-form`,onSubmit:e=>{e.preventDefault();let t=e.currentTarget.elements.namedItem(`qname`).value.trim();t&&t!==u.name&&P.patchQueue(u.id,{name:t}).then(()=>r()).catch(e=>L(F(e),`error`))},children:[I(`input`,{name:`qname`,defaultValue:u.name,"aria-label":`Queue name`}),I(`button`,{type:`submit`,class:`small`,children:`Rename`})]}),I(`label`,{class:`check`,children:[I(`input`,{type:`checkbox`,checked:u.autoStatus,onChange:e=>P.patchQueue(u.id,{autoStatus:e.currentTarget.checked}).then(()=>r()).catch(e=>L(F(e),`error`))}),`Bambuddy prints set the status automatically`]}),I(`button`,{class:`danger small`,disabled:e.length<=1,title:e.length<=1?`The last queue cannot be deleted`:void 0,onClick:()=>{confirm(`Delete the queue "${u.name}"? Only an empty queue (trash included) can be deleted.`)&&P.deleteQueue(u.id).then(()=>{l(!1),r(e.find(e=>e.id!==u.id)?.id)}).catch(e=>L(F(e),`error`))},children:`Delete queue`})]})]})]})},_r={get:e=>{try{return localStorage.getItem(`print-backlog.${e}`)}catch{return null}},set:(e,t)=>{try{localStorage.setItem(`print-backlog.${e}`,t)}catch{}}};pe(I(()=>{let[e,t]=N(null),[n,r]=N([]),[i,a]=N(Number(_r.get(`queue`))||null),[o,s]=N(_r.get(`view`)??`queued`),[c,l]=N(``),[u,d]=N([]),[f,p]=N(null),[m,h]=N(0),[g,_]=N(null),[v,y]=N(null),b=Oe(null),x=Ae(async e=>{let t=await P.queues();r(t),a(n=>{let r=e??n;return t.some(e=>e.id===r)?r:t[0]?.id??null})},[]),C=Ae(async()=>{if(i===null)return;let e=await P.items({queue:i,status:o===`all`||o===`trash`?void 0:o,trash:o===`trash`,q:c.trim()||void 0});d(e)},[i,o,c]),w=Ae(()=>{C().catch(e=>L(F(e),`error`)),x().catch(e=>L(F(e),`error`))},[C,x]);De(()=>{Promise.all([P.me(),x()]).then(([e])=>t(e)).catch(e=>y(F(e)))},[]),De(()=>{let e=setTimeout(()=>C().catch(e=>L(F(e),`error`)),c?200:0);return()=>clearTimeout(e)},[C]),De(()=>{i&&_r.set(`queue`,String(i)),_r.set(`view`,o)},[i,o]);let T=async e=>{if(i&&e.length){_(0);try{let t=await P.uploadItems(i,e,_);L(`Added ${t.items.length} item${t.items.length===1?``:`s`}`,`ok`),t.skipped.length&&L(`Not imported from ZIP: ${t.skipped.slice(0,5).join(`, `)}${t.skipped.length>5?` …`:``}`,`info`),o!==`queued`&&o!==`all`&&s(`queued`),w()}catch(e){L(F(e),`error`)}finally{_(null)}}},E=async(e,t)=>{_(0);try{let n=await P.uploadVersion(e.id,t,void 0,_);L(n.duplicate?`"${e.title}": same file as version ${n.version.n}, nothing new stored`:`"${e.title}": version ${n.version.n} added`,n.duplicate?`info`:`ok`),h(e=>e+1),w()}catch(e){L(F(e),`error`)}finally{_(null)}},D=(e,t)=>{t&&e.length===1?confirm(`Add "${e[0].name}" as a new version of "${t.title}"?`)&&E(t,e[0]):T(e)},O=(e,t)=>{d(n=>n.map(n=>n.id===e.id?{...n,status:t}:n)),P.patchItem(e.id,{status:t}).then(()=>{h(e=>e+1),w()}).catch(e=>{L(F(e),`error`),w()})},ee=(e,t)=>{d(n=>{let r=n.filter(t=>t.id!==e.id),i=t===null?0:r.findIndex(e=>e.id===t)+1;return[...r.slice(0,i),e,...r.slice(i)]}),P.patchItem(e.id,{move:{afterId:t}}).catch(e=>L(F(e),`error`)).finally(()=>void C())};if(v)return I(`main`,{class:`fatal`,children:[`Print Backlog could not start: `,v]});let k=n.find(e=>e.id===i)??null,A=[...Re.map(e=>({id:e,label:e,count:k?.counts[e]})),{id:`all`,label:`all`},{id:`trash`,label:`trash`}];return I(S,{children:[I(`header`,{class:`top`,children:[I(`h1`,{children:`Print Backlog`}),I(`span`,{class:`muted`,children:e?.user})]}),I(gr,{queues:n,currentId:i,onSelect:e=>{a(e),p(null)},onChanged:e=>void x(e).then(()=>C())}),I(`div`,{class:`layout${f?` with-panel`:``}`,children:[I(`main`,{children:[I(`div`,{class:`toolbar`,children:[I(`div`,{class:`views`,role:`tablist`,"aria-label":`Filter by status`,children:A.map(e=>I(`button`,{role:`tab`,"aria-selected":o===e.id,class:`chip status-${e.id}${o===e.id?` active`:``}`,onClick:()=>s(e.id),children:[e.label,e.count!==void 0&&I(`span`,{class:`count`,children:e.count})]},e.id))}),I(`input`,{type:`search`,class:`search`,placeholder:`Filter by title`,"aria-label":`Filter by title`,value:c,onInput:e=>l(e.currentTarget.value)}),o!==`trash`&&I(S,{children:[I(`button`,{onClick:()=>b.current?.click(),disabled:g!==null,children:`Add files`}),I(`input`,{ref:b,type:`file`,multiple:!0,hidden:!0,accept:`.stl,.3mf,.step,.stp,.obj,.zip`,onChange:e=>{let t=Array.from(e.currentTarget.files??[]);e.currentTarget.value=``,T(t)}}),i&&u.length>0&&I(`a`,{class:`button`,href:P.exportUrl(i,o===`all`?void 0:o),title:`Download the current version of every item in this view as one ZIP`,children:`Export ZIP`})]})]}),g!==null&&I(`div`,{class:`progress`,role:`progressbar`,"aria-valuenow":Math.round(g*100),"aria-valuemin":0,"aria-valuemax":100,children:I(`div`,{style:{width:`${Math.round(g*100)}%`}})}),u.length===0&&I(`p`,{class:`empty`,children:o===`trash`?`The trash is empty.`:c?`Nothing matches the filter.`:`Nothing ${o===`all`?``:o} here yet.`}),I(hr,{items:u,selectedId:f,editable:o!==`trash`,onSelect:p,onStatus:O,onReorder:ee,onRestore:e=>P.restoreItem(e.id).then(()=>{L(`"${e.title}" restored`,`ok`),w()}).catch(e=>L(F(e),`error`)),onDropFiles:D})]}),f!==null&&I(it,{itemId:f,queues:n,revision:m,onClose:()=>p(null),onChanged:w,onUploadVersion:(e,t)=>void E(e,t)})]}),I(tt,{})]})},{}),document.getElementById(`app`));
@@ -1,9 +0,0 @@
1
- import type { HookAck } from "../../shared/types.js";
2
- import type { Sql } from "../db.js";
3
- import type { Ctx } from "../http.js";
4
- /**
5
- * Store the event. Matching it to an item and applying the status rule comes
6
- * with PB6 (docs/plan.md §3.9); until then every event stays open.
7
- */
8
- export declare const bambuddyHook: (sql: Sql) => ({ body }: Ctx) => Promise<HookAck>;
9
- //# sourceMappingURL=hooks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/server/api/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAiBtC;;;GAGG;AACH,eAAO,MAAM,YAAY,GACtB,KAAK,GAAG,MACF,UAAU,GAAG,KAAG,OAAO,CAAC,OAAO,CAQrC,CAAC"}
@@ -1,29 +0,0 @@
1
- import { z } from "zod";
2
- /**
3
- * Bambuddy's "Webhook" notification provider, payload format "generic":
4
- * {title, message, timestamp, source, event, printer, filename, status?,
5
- * duration?, filament_grams?, reason?, …}. Only the fields the matching needs
6
- * are typed; the whole payload is kept as it came.
7
- */
8
- const payloadSchema = z
9
- .object({
10
- event: z.string().min(1).max(100),
11
- filename: z.string().max(1000).optional(),
12
- printer: z.string().max(200).optional(),
13
- status: z.string().max(100).optional(),
14
- })
15
- .loose();
16
- /**
17
- * Store the event. Matching it to an item and applying the status rule comes
18
- * with PB6 (docs/plan.md §3.9); until then every event stays open.
19
- */
20
- export const bambuddyHook = (sql) => async ({ body }) => {
21
- const p = payloadSchema.parse(body);
22
- const [row] = await sql `
23
- INSERT INTO backlog.print_event (event, filename, printer, status, payload)
24
- VALUES (${p.event}, ${p.filename ?? null}, ${p.printer ?? null}, ${p.status ?? null}, ${sql.json(body)})
25
- RETURNING id
26
- `;
27
- return { stored: true, id: Number(row.id) };
28
- };
29
- //# sourceMappingURL=hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/server/api/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;GAKG;AACH,MAAM,aAAa,GAAG,CAAC;KACpB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC;KACD,KAAK,EAAE,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,CAAC,GAAQ,EAAE,EAAE,CACb,KAAK,EAAE,EAAE,IAAI,EAAO,EAAoB,EAAE;IACxC,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAkB;;gBAE7B,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAa,CAAC;;KAEhH,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC,CAAC"}