@seedtactics/insight-client 16.8.4-beta.0 → 16.8.4-beta.2

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 (97) hide show
  1. package/dist/assets/index-BLYS5tHD.js +388 -0
  2. package/dist/assets/index-DXfAwuj-.css +1 -0
  3. package/dist/assets/roboto-cyrillic-300-normal-D0x1uCa7.woff +0 -0
  4. package/dist/assets/roboto-cyrillic-400-normal-BepgbcUK.woff +0 -0
  5. package/dist/assets/roboto-cyrillic-500-normal-C8ZOEKN4.woff +0 -0
  6. package/dist/assets/roboto-cyrillic-700-normal-D8g9KsRf.woff +0 -0
  7. package/dist/assets/roboto-cyrillic-ext-300-normal-C0UYUNTV.woff +0 -0
  8. package/dist/assets/roboto-cyrillic-ext-400-normal-DhDk0Xwi.woff +0 -0
  9. package/dist/assets/roboto-cyrillic-ext-500-normal-SCgicl0l.woff +0 -0
  10. package/dist/assets/roboto-cyrillic-ext-700-normal-BWOtdzfy.woff +0 -0
  11. package/dist/assets/roboto-greek-300-normal-xS8CB6LN.woff +0 -0
  12. package/dist/assets/roboto-greek-400-normal-D904r64h.woff +0 -0
  13. package/dist/assets/roboto-greek-500-normal-XBIQOowA.woff +0 -0
  14. package/dist/assets/roboto-greek-700-normal-xQsEWSIA.woff +0 -0
  15. package/dist/assets/roboto-latin-300-normal-Dqn3NW0Y.woff +0 -0
  16. package/dist/assets/roboto-latin-400-normal-D27F5sTu.woff +0 -0
  17. package/dist/assets/roboto-latin-500-normal-fsTFPL3E.woff +0 -0
  18. package/dist/assets/roboto-latin-700-normal-YuyVweIx.woff +0 -0
  19. package/dist/assets/roboto-latin-ext-300-normal-B0-sTZUp.woff +0 -0
  20. package/dist/assets/roboto-latin-ext-400-normal-CIveymTr.woff +0 -0
  21. package/dist/assets/roboto-latin-ext-500-normal-C1cK9xmS.woff +0 -0
  22. package/dist/assets/roboto-latin-ext-700-normal-BDePAh3g.woff +0 -0
  23. package/dist/assets/roboto-math-300-normal-CkwMvXpj.woff +0 -0
  24. package/dist/assets/roboto-math-400-normal-D6sS4O5l.woff +0 -0
  25. package/dist/assets/roboto-math-500-normal-BNGXE_xU.woff +0 -0
  26. package/dist/assets/roboto-math-700-normal-DbhUef31.woff +0 -0
  27. package/dist/assets/roboto-symbols-300-normal-CBIeSvs3.woff +0 -0
  28. package/dist/assets/roboto-symbols-400-normal-C7tGlxgb.woff +0 -0
  29. package/dist/assets/roboto-symbols-500-normal-DFnofPUt.woff +0 -0
  30. package/dist/assets/roboto-symbols-700-normal-C59U6HqI.woff +0 -0
  31. package/dist/assets/roboto-vietnamese-300-normal-CYjuQheQ.woff +0 -0
  32. package/dist/assets/roboto-vietnamese-400-normal-Bf76hAzZ.woff +0 -0
  33. package/dist/assets/roboto-vietnamese-500-normal-BgoYVz-9.woff +0 -0
  34. package/dist/assets/roboto-vietnamese-700-normal-kpkdMgbf.woff +0 -0
  35. package/dist/bootstrap.d.ts +5 -0
  36. package/dist/bootstrap.js +56 -0
  37. package/dist/cell-status/custom-state.d.ts +9 -0
  38. package/dist/cell-status/custom-state.js +42 -0
  39. package/dist/cell-status/loading.js +5 -0
  40. package/dist/components/App.d.ts +2 -0
  41. package/dist/components/App.js +1 -1
  42. package/dist/components/operations/Programs.js +1 -1
  43. package/dist/components/station-monitor/BasketLoadStationWork.d.ts +15 -0
  44. package/dist/components/station-monitor/BasketLoadStationWork.js +147 -0
  45. package/dist/components/station-monitor/LoadStation.d.ts +2 -0
  46. package/dist/components/station-monitor/LoadStation.js +26 -17
  47. package/dist/components/station-monitor/Material.js +21 -4
  48. package/dist/components/station-monitor/MoveMaterialArrows.js +1 -1
  49. package/dist/components/station-monitor/QuarantineButton.js +5 -2
  50. package/dist/components/station-monitor/QueuesAddMaterial.js +2 -1
  51. package/dist/components/station-monitor/SystemOverview.js +8 -4
  52. package/dist/data/all-material-bins.js +10 -0
  53. package/dist/data/current-cycles.js +22 -20
  54. package/dist/data/move-arrows.d.ts +1 -0
  55. package/dist/data/move-arrows.js +18 -2
  56. package/dist/data/queue-material.js +2 -0
  57. package/dist/index.html +2 -2
  58. package/dist/index.js +7 -15
  59. package/dist/network/api.d.ts +10 -1
  60. package/dist/network/api.js +9 -0
  61. package/dist/network/backend.d.ts +2 -0
  62. package/dist/network/backend.js +14 -9
  63. package/package.json +8 -7
  64. package/dist/assets/index-4ivKxo2f.js +0 -388
  65. package/dist/assets/index-CbqW4-gR.css +0 -1
  66. package/dist/assets/roboto-cyrillic-300-normal-DEFNdjk5.woff +0 -0
  67. package/dist/assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff +0 -0
  68. package/dist/assets/roboto-cyrillic-500-normal-CBKMylY4.woff +0 -0
  69. package/dist/assets/roboto-cyrillic-700-normal-DhZFXDSN.woff +0 -0
  70. package/dist/assets/roboto-cyrillic-ext-300-normal-D7ank4TF.woff +0 -0
  71. package/dist/assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff +0 -0
  72. package/dist/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
  73. package/dist/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
  74. package/dist/assets/roboto-greek-300-normal-C_Dgaih9.woff +0 -0
  75. package/dist/assets/roboto-greek-400-normal-Bb5mj_fZ.woff +0 -0
  76. package/dist/assets/roboto-greek-500-normal-oCqhoyfc.woff +0 -0
  77. package/dist/assets/roboto-greek-700-normal-DjRqqLBV.woff +0 -0
  78. package/dist/assets/roboto-latin-300-normal-BARJ-h6h.woff +0 -0
  79. package/dist/assets/roboto-latin-400-normal-DyYNIH4P.woff +0 -0
  80. package/dist/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
  81. package/dist/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
  82. package/dist/assets/roboto-latin-ext-300-normal-CTCCHkZF.woff +0 -0
  83. package/dist/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
  84. package/dist/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
  85. package/dist/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
  86. package/dist/assets/roboto-math-300-normal-Ds0YpBw2.woff +0 -0
  87. package/dist/assets/roboto-math-400-normal-C9RxBKAh.woff +0 -0
  88. package/dist/assets/roboto-math-500-normal-C-7mKPO3.woff +0 -0
  89. package/dist/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
  90. package/dist/assets/roboto-symbols-300-normal-BCnjhQd_.woff +0 -0
  91. package/dist/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
  92. package/dist/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
  93. package/dist/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
  94. package/dist/assets/roboto-vietnamese-300-normal-INUupD3o.woff +0 -0
  95. package/dist/assets/roboto-vietnamese-400-normal-DnpnVwnf.woff +0 -0
  96. package/dist/assets/roboto-vietnamese-500-normal-D380IkQ8.woff +0 -0
  97. package/dist/assets/roboto-vietnamese-700-normal-DsFyXAL4.woff +0 -0
@@ -61,6 +61,7 @@ import { useAtomValue, useSetAtom } from "jotai";
61
61
  import { PrintLabelButton } from "./PrintedLabel.js";
62
62
  import { hideNonLoadingMaterialOnLoadStation } from "../../data/queue-material.js";
63
63
  import { basketDisplayName, loadStationDisplayName } from "../../cell-status/station-cycles.js";
64
+ import { BasketLoadStationWorkflow, } from "./BasketLoadStationWork.js";
64
65
  function encodeLoadStationRegionIdPart(value) {
65
66
  return encodeURIComponent(value.toString());
66
67
  }
@@ -75,9 +76,15 @@ function materialColumnTestId(region) {
75
76
  }
76
77
  }
77
78
  function isLoadingToDisplayedTarget(mat, pallet, activeBasket) {
78
- return (mat.action.type === api.ActionType.Loading &&
79
- ((pallet !== undefined && mat.action.loadOntoPalletNum === pallet.palletNum) ||
80
- (activeBasket !== undefined && mat.action.loadFromBasketId === activeBasket.basketId)));
79
+ switch (mat.action.type) {
80
+ case api.ActionType.Loading:
81
+ return ((pallet !== undefined && mat.action.loadOntoPalletNum === pallet.palletNum) ||
82
+ (activeBasket !== undefined && mat.action.loadFromBasketId === activeBasket.basketId));
83
+ case api.ActionType.LoadingToBasket:
84
+ return activeBasket !== undefined && mat.action.loadToBasketId === activeBasket.basketId;
85
+ default:
86
+ return false;
87
+ }
81
88
  }
82
89
  function selectLoadStationAndQueueProps(loadNum, queues, curSt, hideNonLoading) {
83
90
  // search for pallet
@@ -148,8 +155,7 @@ function selectLoadStationAndQueueProps(loadNum, queues, curSt, hideNonLoading)
148
155
  }
149
156
  if (m.location.type === api.LocType.InQueue &&
150
157
  m.location.currentQueue &&
151
- m.action.type === api.ActionType.Loading &&
152
- m.action.loadFromBasketId === activeBasket.basketId) {
158
+ isLoadingToDisplayedTarget(m, undefined, activeBasket)) {
153
159
  queuesToShow.add(m.location.currentQueue);
154
160
  }
155
161
  }
@@ -205,6 +211,11 @@ function selectLoadStationAndQueueProps(loadNum, queues, curSt, hideNonLoading)
205
211
  if (isLoadingToDisplayedTarget(m, pal, activeBasket) && m.action.elapsedLoadUnloadTime) {
206
212
  elapsedLoadingTime = m.action.elapsedLoadUnloadTime;
207
213
  }
214
+ if (m.action.type === api.ActionType.LoadingToBasket &&
215
+ m.action.loadToBasketId === activeBasket.basketId &&
216
+ m.location.type === api.LocType.Free) {
217
+ freeLoading.push(m);
218
+ }
208
219
  if (m.location.type === api.LocType.InBasket &&
209
220
  m.location.basketId === activeBasket.basketId) {
210
221
  if ((m.action.type === api.ActionType.UnloadToCompletedMaterial ||
@@ -274,6 +285,7 @@ function selectLoadStationAndQueueProps(loadNum, queues, curSt, hideNonLoading)
274
285
  return {
275
286
  pallet: pal,
276
287
  activeBasket,
288
+ allMaterial: curSt.material,
277
289
  face: palFaces,
278
290
  freeLoadingMaterial: freeLoading,
279
291
  queues: queueMat,
@@ -346,7 +358,7 @@ function ElapsedLoadTime({ elapsedLoadTime }) {
346
358
  return null;
347
359
  }
348
360
  }
349
- function PalletFace({ data, faceNum }) {
361
+ function PalletFace({ data, faceNum, loadNum, submitBasketLoadStationCommand, }) {
350
362
  const face = data.face.get(faceNum);
351
363
  const fmsInfo = useAtomValue(fmsInformation);
352
364
  const basketName = basketDisplayName(fmsInfo.basketName);
@@ -358,17 +370,10 @@ function PalletFace({ data, faceNum }) {
358
370
  gridTemplateColumns: "1fr auto",
359
371
  }, children: [_jsxs(Typography, { variant: "h4", children: [basketName, " ", data.activeBasket.basketId] }), _jsx(Box, { sx: {
360
372
  justifySelf: "flex-end",
361
- }, children: _jsx(ElapsedLoadTime, { elapsedLoadTime: data.elapsedLoadingTime }) })] })) : null, _jsx(Box, { sx: {
362
- ml: "4em",
363
- mr: "4em",
364
- }, children: _jsx(MoveMaterialArrowNode, { kind: {
373
+ }, children: _jsx(ElapsedLoadTime, { elapsedLoadTime: data.elapsedLoadingTime }) })] })) : null, _jsx(Box, { sx: { ml: "4em", mr: "4em" }, children: _jsx(MoveMaterialArrowNode, { kind: {
365
374
  type: MoveMaterialNodeKindType.BasketZone,
366
375
  basketId: data.activeBasket.basketId,
367
- }, children: _jsx(Box, { sx: {
368
- display: "flex",
369
- flexWrap: "wrap",
370
- justifyContent: "space-around",
371
- }, children: face.map((m, idx) => (_jsx(MoveMaterialArrowNode, { kind: { type: MoveMaterialNodeKindType.Material, material: m }, children: _jsx(InProcMaterial, { mat: m, fsize: data.fsize }) }, idx))) }) }) })] }));
376
+ }, children: _jsx(BasketLoadStationWorkflow, { stationNumber: loadNum, basket: data.activeBasket, material: data.allMaterial, fsize: data.fsize, submitCommand: submitBasketLoadStationCommand }) }) })] }));
372
377
  }
373
378
  if (!data.pallet)
374
379
  return null;
@@ -395,6 +400,9 @@ function MaterialRegion({ data, mat, }) {
395
400
  return (_jsxs("div", { children: [mat.label !== "" ? _jsx(Typography, { variant: "h4", children: mat.label }) : null, mat.material.mats.map((m, matIdx) => (_jsx(MoveMaterialArrowNode, { kind: {
396
401
  type: MoveMaterialNodeKindType.Material,
397
402
  material: m,
403
+ identifier: m.materialID < 0
404
+ ? `raw-${mat.isFree ? "free" : "queue"}-${mat.label}-${matIdx}`
405
+ : undefined,
398
406
  }, children: mat.isFree || mat.sortable === false ? (_jsx(InProcMaterial, { mat: m, displayActionForSinglePallet: data.pallet ? data.pallet.palletNum : 0, fsize: data.fsize, showRawMaterial: true, showJobComment: true })) : (_jsx(SortableInProcMaterial, { mat: m, displayActionForSinglePallet: data.pallet ? data.pallet.palletNum : 0, shake: m.action.type === api.ActionType.Loading &&
399
407
  m.action.loadOntoPalletNum === data.pallet?.palletNum, fsize: m.action.type === api.ActionType.Loading &&
400
408
  m.action.loadOntoPalletNum === data.pallet?.palletNum
@@ -534,7 +542,8 @@ function AddMatButton({ queues, onClose, toQueue, showAddToQueue, setShowAddToQu
534
542
  const [addExistingMat, addingExistingMat] = matDetails.useAddExistingMaterialToQueue();
535
543
  if (!existingMat ||
536
544
  inProcMat?.location.type === api.LocType.OnPallet ||
537
- inProcMat?.action.type === api.ActionType.Loading) {
545
+ inProcMat?.action.type === api.ActionType.Loading ||
546
+ inProcMat?.action.type === api.ActionType.LoadingToBasket) {
538
547
  return null;
539
548
  }
540
549
  if (queues.length === 0)
@@ -695,7 +704,7 @@ export function LoadStation(props) {
695
704
  gridArea: `palface${idx}`,
696
705
  padding: "8px",
697
706
  borderTop: data.pallet && idx !== 0 ? "1px solid black" : undefined,
698
- }, children: _jsx(PalletFace, { data: data, faceNum: faceNum }) }, faceNum))), _jsx(Box, { "data-testid": "load-station-completed", sx: {
707
+ }, children: _jsx(PalletFace, { data: data, faceNum: faceNum, loadNum: props.loadNum, submitBasketLoadStationCommand: props.submitBasketLoadStationCommand }) }, faceNum))), _jsx(Box, { "data-testid": "load-station-completed", sx: {
699
708
  borderLeft: fillViewPort ? "1px solid black" : undefined,
700
709
  borderTop: !fillViewPort ? "1px solid black" : undefined,
701
710
  gridArea: "completed",
@@ -89,11 +89,12 @@ function shakeAnimationIteration(event) {
89
89
  }
90
90
  const MatCardHeader = styled("div", { shouldForwardProp: (prop) => prop !== "fsize" })(({ fsize, theme }) => {
91
91
  if (!fsize)
92
- return { fontSize: "1.25rem" };
92
+ return { fontSize: "1.25rem", fontWeight: "500" };
93
93
  switch (fsize) {
94
94
  case "normal":
95
95
  return {
96
96
  fontSize: "1rem",
97
+ fontWeight: "500",
97
98
  [theme.breakpoints.up("md")]: {
98
99
  fontSize: "1.25rem",
99
100
  },
@@ -104,6 +105,7 @@ const MatCardHeader = styled("div", { shouldForwardProp: (prop) => prop !== "fsi
104
105
  case "large":
105
106
  return {
106
107
  fontSize: "1.5rem",
108
+ fontWeight: "500",
107
109
  [theme.breakpoints.up("lg")]: {
108
110
  fontSize: "1.75rem",
109
111
  },
@@ -114,6 +116,7 @@ const MatCardHeader = styled("div", { shouldForwardProp: (prop) => prop !== "fsi
114
116
  case "x-large":
115
117
  return {
116
118
  fontSize: "1.5rem",
119
+ fontWeight: "500",
117
120
  [theme.breakpoints.up("md")]: {
118
121
  fontSize: "1.75rem",
119
122
  },
@@ -128,11 +131,12 @@ const MatCardHeader = styled("div", { shouldForwardProp: (prop) => prop !== "fsi
128
131
  });
129
132
  const MatCardDetail = styled("div", { shouldForwardProp: (prop) => prop !== "fsize" })(({ fsize, theme }) => {
130
133
  if (!fsize)
131
- return { fontSize: "0.75rem" };
134
+ return { fontSize: "0.75rem", fontWeight: "500" };
132
135
  switch (fsize) {
133
136
  case "normal":
134
137
  return {
135
138
  fontSize: "0.75rem",
139
+ fontWeight: "500",
136
140
  [theme.breakpoints.up("md")]: {
137
141
  fontSize: "1rem",
138
142
  },
@@ -140,6 +144,7 @@ const MatCardDetail = styled("div", { shouldForwardProp: (prop) => prop !== "fsi
140
144
  case "large":
141
145
  return {
142
146
  fontSize: "1rem",
147
+ fontWeight: "500",
143
148
  [theme.breakpoints.up("lg")]: {
144
149
  fontSize: "1.5rem",
145
150
  },
@@ -150,6 +155,7 @@ const MatCardDetail = styled("div", { shouldForwardProp: (prop) => prop !== "fsi
150
155
  case "x-large":
151
156
  return {
152
157
  fontSize: "1rem",
158
+ fontWeight: "500",
153
159
  [theme.breakpoints.up("md")]: {
154
160
  fontSize: "1.5rem",
155
161
  },
@@ -228,16 +234,25 @@ export function MaterialAction({ mat, displayActionForSinglePallet, fsize, }) {
228
234
  }
229
235
  }
230
236
  }
237
+ case api.ActionType.LoadingToBasket:
238
+ return (_jsxs(MatCardDetail, { fsize: fsize, children: ["Load into ", basketName, " ", mat.action.loadToBasketId ?? "", mat.action.loadToBasketSlot !== undefined ? ` slot ${mat.action.loadToBasketSlot}` : ""] }));
231
239
  case api.ActionType.UnloadToInProcess:
232
240
  case api.ActionType.UnloadToCompletedMaterial:
233
241
  if (mat.action.unloadToBasketId) {
234
242
  return (_jsxs(MatCardDetail, { fsize: fsize, children: ["Unload to ", basketName, " ", mat.action.unloadToBasketId, mat.action.unloadToBasketSlot !== undefined
235
- ? ` slot ${mat.action.unloadToBasketSlot + 1}`
243
+ ? ` slot ${mat.action.unloadToBasketSlot}`
236
244
  : ""] }));
237
245
  }
238
246
  else if (mat.action.unloadIntoQueue) {
239
247
  return (_jsxs(MatCardDetail, { fsize: fsize, children: ["Unload into queue ", mat.action.unloadIntoQueue] }));
240
248
  }
249
+ else if (mat.action.type === api.ActionType.UnloadToCompletedMaterial &&
250
+ mat.location.type === api.LocType.InBasket) {
251
+ return (_jsxs(MatCardDetail, { fsize: fsize, children: ["Unload from ", basketName, " ", mat.location.basketId, " to completed material"] }));
252
+ }
253
+ else if (mat.location.type === api.LocType.InBasket) {
254
+ return (_jsxs(MatCardDetail, { fsize: fsize, children: ["Unload from ", basketName, " ", mat.location.basketId] }));
255
+ }
241
256
  else {
242
257
  return _jsx(MatCardDetail, { fsize: fsize, children: "Unload from pallet" });
243
258
  }
@@ -282,7 +297,9 @@ function Warning({ mat }) {
282
297
  function JobRawMaterial({ fsize, mat, }) {
283
298
  const job = useAtomValue(currentStatus).jobs[mat.jobUnique];
284
299
  let path = mat.path;
285
- if (mat.action.type === api.ActionType.Loading && mat.action.pathAfterLoad) {
300
+ if ((mat.action.type === api.ActionType.Loading ||
301
+ mat.action.type === api.ActionType.LoadingToBasket) &&
302
+ mat.action.pathAfterLoad) {
286
303
  path = mat.action.pathAfterLoad;
287
304
  }
288
305
  if (!job) {
@@ -116,5 +116,5 @@ export function useMoveMaterialArrowRef(kind) {
116
116
  }
117
117
  export function MoveMaterialArrowNode({ kind, children, }) {
118
118
  const ref = useMoveMaterialArrowRef(kind);
119
- return _jsx("div", { ref: ref, children: children });
119
+ return (_jsx("div", { ref: ref, "data-move-material-identifier": uniqueIdForNodeKind(kind), children: children }));
120
120
  }
@@ -116,10 +116,13 @@ function useQuarantineMaterial(ignoreOperator) {
116
116
  }
117
117
  break;
118
118
  case LocType.InQueue:
119
- if (inProcMat.action.type === ActionType.Loading && !fmsInfo.allowQuarantineToCancelLoad) {
119
+ if ((inProcMat.action.type === ActionType.Loading ||
120
+ inProcMat.action.type === ActionType.LoadingToBasket) &&
121
+ !fmsInfo.allowQuarantineToCancelLoad) {
120
122
  return null;
121
123
  }
122
- else if (inProcMat.action.type === ActionType.Loading) {
124
+ else if (inProcMat.action.type === ActionType.Loading ||
125
+ inProcMat.action.type === ActionType.LoadingToBasket) {
123
126
  type = "CancelLoad";
124
127
  }
125
128
  else {
@@ -54,7 +54,8 @@ function useAllowAddToQueue(queueNames) {
54
54
  return false;
55
55
  if (inProcMat?.location.type === api.LocType.OnPallet)
56
56
  return false;
57
- if (inProcMat?.action.type === api.ActionType.Loading)
57
+ if (inProcMat?.action.type === api.ActionType.Loading ||
58
+ inProcMat?.action.type === api.ActionType.LoadingToBasket)
58
59
  return false;
59
60
  if (existingMat === null && !possibleNewMats) {
60
61
  return false;
@@ -59,10 +59,13 @@ function useCellOverview() {
59
59
  .filter((m) => m.location.type === LocType.OnPallet || m.action.type === ActionType.Loading)
60
60
  .toRLookup((m) => m.location.palletNum ?? m.action.loadOntoPalletNum ?? 0);
61
61
  const matByBasket = LazySeq.of(currentSt.material)
62
- .filter((m) => m.location.type === LocType.InBasket &&
62
+ .filter((m) => (m.location.type === LocType.InBasket &&
63
63
  m.location.basketId !== null &&
64
- m.location.basketId !== undefined)
65
- .toRLookup((m) => m.location.basketId ?? 0);
64
+ m.location.basketId !== undefined) ||
65
+ (m.action.type === ActionType.LoadingToBasket &&
66
+ m.action.loadToBasketId !== null &&
67
+ m.action.loadToBasketId !== undefined))
68
+ .toRLookup((m) => m.location.basketId ?? m.action.loadToBasketId ?? 0);
66
69
  let loads = LazySeq.ofObject(currentSt.pallets)
67
70
  .filter(([_, p]) => p.currentPalletLocation.loc === PalletLocationEnum.LoadUnload)
68
71
  .toOrderedMap(([_, p]) => [
@@ -443,7 +446,7 @@ function PalletFaces({ maxNumFaces, mats: allMats, loadingOntoPallet, noFilter,
443
446
  }
444
447
  }
445
448
  function BasketContents({ mats }) {
446
- const byPosition = LazySeq.of(mats).orderedGroupBy((m) => (m.location.basketSlot ?? 0) + 1);
449
+ const byPosition = LazySeq.of(mats).orderedGroupBy((m) => m.location.basketSlot ?? 0);
447
450
  return (_jsx(Box, { sx: {
448
451
  display: "flex",
449
452
  flexWrap: "wrap",
@@ -582,6 +585,7 @@ function Machine({ maxNumFaces, machine }) {
582
585
  }
583
586
  function useElapsedLoadTime(material) {
584
587
  const mat = material?.find((m) => m.action.type === ActionType.Loading ||
588
+ m.action.type === ActionType.LoadingToBasket ||
585
589
  m.action.type === ActionType.UnloadToCompletedMaterial ||
586
590
  m.action.type === ActionType.UnloadToInProcess);
587
591
  const elapsedDurationFromCurSt = mat?.action?.elapsedLoadUnloadTime;
@@ -126,6 +126,16 @@ export function selectAllMaterialIntoBins(curSt, curBinOrder) {
126
126
  addToMap(loadStations, lul, mat);
127
127
  break;
128
128
  }
129
+ case api.ActionType.LoadingToBasket: {
130
+ const basket = curSt.baskets?.[mat.action.loadToBasketId ?? 0];
131
+ if (basket?.position.location === api.BasketLocationEnum.LoadUnload) {
132
+ addToMap(loadStations, basket.position.locationNum, mat);
133
+ }
134
+ else {
135
+ addToMap(queues, "Free Material", mat);
136
+ }
137
+ break;
138
+ }
129
139
  default:
130
140
  addToMap(queues, "Free Material", mat);
131
141
  break;
@@ -47,24 +47,17 @@ function basketsAtLoad(currentSt) {
47
47
  })
48
48
  .toRMap(([basketId, loc]) => [basketId, loc]);
49
49
  }
50
- function locationForLoadActivity(material, jobs, palToLoc, basketToLoad) {
51
- if (material.action.type === ActionType.Loading) {
50
+ function locationForLoadActivity(material, palToLoc, basketToLoad) {
51
+ if (material.action.type === ActionType.LoadingToBasket) {
52
+ return basketToLoad.get(material.action.loadToBasketId ?? 0) ?? null;
53
+ }
54
+ else if (material.action.type === ActionType.Loading) {
52
55
  if (material.action.loadOntoPalletNum) {
53
56
  return palToLoc.get(material.action.loadOntoPalletNum) ?? null;
54
57
  }
55
58
  if (material.action.loadFromBasketId) {
56
59
  return basketToLoad.get(material.action.loadFromBasketId) ?? null;
57
60
  }
58
- // queue → basket: neither pallet nor source basket set. Find a basket at a load station
59
- // that is a basket-load station for this job/process.
60
- const proc = material.action.processAfterLoad ?? material.process;
61
- const procInfo = jobs[material.jobUnique]?.procsAndPaths?.[proc - 1];
62
- const basketLoadStations = procInfo?.basketLoadStations ?? [];
63
- for (const [, loc] of basketToLoad) {
64
- if (basketLoadStations.length === 0 || basketLoadStations.includes(loc.num)) {
65
- return loc;
66
- }
67
- }
68
61
  return null;
69
62
  }
70
63
  else {
@@ -110,13 +103,14 @@ function loadCurrentCycles(currentSt, estimated, palToLoc, loadStationNames) {
110
103
  .collect((m) => {
111
104
  if (m.action.type === ActionType.UnloadToCompletedMaterial ||
112
105
  m.action.type === ActionType.UnloadToInProcess) {
113
- const loc = locationForLoadActivity(m, currentSt.jobs, palToLoc, basketToLoad);
106
+ const loc = locationForLoadActivity(m, palToLoc, basketToLoad);
114
107
  if (!loc)
115
108
  return null;
116
109
  return { mat: m, material: [m], proc: m.process, path: m.path, loc };
117
110
  }
118
- else if (m.action.type === ActionType.Loading) {
119
- const loc = locationForLoadActivity(m, currentSt.jobs, palToLoc, basketToLoad);
111
+ else if (m.action.type === ActionType.Loading ||
112
+ m.action.type === ActionType.LoadingToBasket) {
113
+ const loc = locationForLoadActivity(m, palToLoc, basketToLoad);
120
114
  if (!loc)
121
115
  return null;
122
116
  return {
@@ -133,8 +127,9 @@ function loadCurrentCycles(currentSt, estimated, palToLoc, loadStationNames) {
133
127
  const job = currentSt.jobs[m.mat.jobUnique];
134
128
  const procInfo = job?.procsAndPaths?.[m.proc - 1];
135
129
  const pathData = job?.procsAndPaths?.[m.proc - 1]?.paths?.[m.path - 1];
136
- if (m.mat.action.type === ActionType.Loading) {
137
- const expected = m.mat.action.loadOntoPalletNum !== null && m.mat.action.loadOntoPalletNum !== undefined
130
+ if (m.mat.action.type === ActionType.Loading ||
131
+ m.mat.action.type === ActionType.LoadingToBasket) {
132
+ const expected = m.mat.action.type === ActionType.Loading
138
133
  ? pathData?.expectedLoadTime
139
134
  : (procInfo?.expectedBasketLoadTime ?? pathData?.expectedLoadTime);
140
135
  return { ...m, expectedLoadSecs: durationToSeconds(expected ?? "PT0S") };
@@ -152,7 +147,8 @@ function loadCurrentCycles(currentSt, estimated, palToLoc, loadStationNames) {
152
147
  let outlier = false;
153
148
  let expectedSecs = 0;
154
149
  for (const { cycle: m, elapsedForSingleMaterialMinutes } of matsWithTime) {
155
- const stats = estimated.get(new PartAndStationOperation(m.mat.partName, statGroup, m.mat.action.type === ActionType.Loading
150
+ const stats = estimated.get(new PartAndStationOperation(m.mat.partName, statGroup, m.mat.action.type === ActionType.Loading ||
151
+ m.mat.action.type === ActionType.LoadingToBasket
156
152
  ? "LOAD-" + m.proc.toString()
157
153
  : "UNLOAD-" + m.proc.toString()));
158
154
  if (stats && isOutlierAbove(stats, elapsedForSingleMaterialMinutes)) {
@@ -172,10 +168,16 @@ function loadCurrentCycles(currentSt, estimated, palToLoc, loadStationNames) {
172
168
  expectedEnd: addSeconds(currentSt.timeOfCurrentStatusUTC, -elapsedSec + expectedSecs),
173
169
  isOutlier: outlier,
174
170
  parts: LazySeq.of(mats)
175
- .distinctAndSortBy((m) => m.mat.partName, (m) => m.proc, (m) => (m.mat.action.type === ActionType.Loading ? "LOAD" : "UNLOAD"))
171
+ .distinctAndSortBy((m) => m.mat.partName, (m) => m.proc, (m) => m.mat.action.type === ActionType.Loading ||
172
+ m.mat.action.type === ActionType.LoadingToBasket
173
+ ? "LOAD"
174
+ : "UNLOAD")
176
175
  .map((m) => ({
177
176
  part: m.mat.partName + "-" + m.proc.toString(),
178
- oper: m.mat.action.type === ActionType.Loading ? "LOAD" : "UNLOAD",
177
+ oper: m.mat.action.type === ActionType.Loading ||
178
+ m.mat.action.type === ActionType.LoadingToBasket
179
+ ? "LOAD"
180
+ : "UNLOAD",
179
181
  }))
180
182
  .toRArray(),
181
183
  };
@@ -12,6 +12,7 @@ export declare enum MoveMaterialNodeKindType {
12
12
  export type MoveMaterialNodeKind = {
13
13
  readonly type: MoveMaterialNodeKindType.Material;
14
14
  readonly material: Readonly<api.IInProcessMaterial> | null;
15
+ readonly identifier?: string;
15
16
  } | {
16
17
  readonly type: MoveMaterialNodeKindType.FreeMaterialZone;
17
18
  } | {
@@ -45,7 +45,7 @@ export var MoveMaterialNodeKindType;
45
45
  export function uniqueIdForNodeKind(kind) {
46
46
  switch (kind.type) {
47
47
  case MoveMaterialNodeKindType.Material:
48
- return "Material-" + (kind.material?.materialID ?? -1).toString();
48
+ return "Material-" + (kind.identifier ?? (kind.material?.materialID ?? -1).toString());
49
49
  case MoveMaterialNodeKindType.FreeMaterialZone:
50
50
  return "FreeMaterialZone";
51
51
  case MoveMaterialNodeKindType.CompletedCollapsedMaterialZone:
@@ -63,7 +63,7 @@ export function uniqueIdForNodeKind(kind) {
63
63
  export function memoPropsForNodeKind(kind) {
64
64
  switch (kind.type) {
65
65
  case MoveMaterialNodeKindType.Material:
66
- return [kind.type, kind.material];
66
+ return [kind.type, kind.material, kind.identifier];
67
67
  case MoveMaterialNodeKindType.FreeMaterialZone:
68
68
  case MoveMaterialNodeKindType.CompletedCollapsedMaterialZone:
69
69
  case MoveMaterialNodeKindType.CompletedExpandedMaterialZone:
@@ -257,6 +257,22 @@ export function computeArrows(container, allNodes) {
257
257
  }
258
258
  }
259
259
  break;
260
+ case api.ActionType.LoadingToBasket: {
261
+ const basketId = mat.action.loadToBasketId;
262
+ if (basketId === undefined)
263
+ break;
264
+ const dest = byKind.baskets.get(basketId);
265
+ const lastSlotUsed = basketDestUsed.get(basketId) ?? 0;
266
+ basketDestUsed.set(basketId, lastSlotUsed + 1);
267
+ arrows.push({
268
+ fromX: rect.right,
269
+ fromY: rect.top + rect.height / 2,
270
+ toX: dest !== undefined ? dest.left + 20 : container.right - 10,
271
+ toY: dest !== undefined ? dest.top + 50 + 20 * lastSlotUsed : rect.top + rect.height / 2,
272
+ curveDirection: -1,
273
+ });
274
+ break;
275
+ }
260
276
  }
261
277
  }
262
278
  return arrows.map((arr) => ({
@@ -107,12 +107,14 @@ function isMatAssignedRaw(unique, m) {
107
107
  return (m.jobUnique === unique &&
108
108
  m.location.type === api.LocType.InQueue &&
109
109
  m.action.type !== api.ActionType.Loading &&
110
+ m.action.type !== api.ActionType.LoadingToBasket &&
110
111
  m.process === 0);
111
112
  }
112
113
  function isMatUnassignedRaw(rawMatName, m) {
113
114
  return (m.partName === rawMatName &&
114
115
  m.location.type === api.LocType.InQueue &&
115
116
  m.action.type !== api.ActionType.Loading &&
117
+ m.action.type !== api.ActionType.LoadingToBasket &&
116
118
  m.process === 0 &&
117
119
  !m.jobUnique);
118
120
  }
package/dist/index.html CHANGED
@@ -44,8 +44,8 @@
44
44
  }
45
45
  }
46
46
  </style>
47
- <script type="module" crossorigin src="/assets/index-4ivKxo2f.js"></script>
48
- <link rel="stylesheet" crossorigin href="/assets/index-CbqW4-gR.css">
47
+ <script type="module" crossorigin src="/assets/index-BLYS5tHD.js"></script>
48
+ <link rel="stylesheet" crossorigin href="/assets/index-DXfAwuj-.css">
49
49
  </head>
50
50
  <body>
51
51
  <noscript> You need to enable JavaScript to run this app. </noscript>
package/dist/index.js CHANGED
@@ -30,16 +30,15 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
30
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
31
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
32
  */
33
- import { render } from "./renderer.js";
34
- import { registerNetworkBackend } from "./network/backend.js";
35
- import { fmsInformation, loadInfo } from "./network/server-settings.js";
33
+ import { bootstrapInsight } from "./bootstrap.js";
36
34
  import { ApiException } from "./network/api.js";
37
- import { createStore } from "jotai";
38
35
  async function main() {
39
- registerNetworkBackend();
40
- const store = createStore();
41
- store.set(fmsInformation, await loadInfo());
42
- render(null, document.getElementById("root"), store);
36
+ const developmentProps = import.meta.env.DEV
37
+ ? {
38
+ submitBasketLoadStationCommand: async () => "accepted",
39
+ }
40
+ : {};
41
+ await bootstrapInsight(developmentProps);
43
42
  }
44
43
  main().catch((e) => {
45
44
  console.log(e);
@@ -51,10 +50,3 @@ main().catch((e) => {
51
50
  p.textContent = msg;
52
51
  (document.getElementById("loading") ?? document.body).appendChild(p);
53
52
  });
54
- if ("serviceWorker" in navigator) {
55
- void navigator.serviceWorker.getRegistrations().then((registrations) => {
56
- for (const reg of registrations) {
57
- void reg.unregister();
58
- }
59
- });
60
- }
@@ -722,6 +722,7 @@ export declare class CurrentStatus implements ICurrentStatus {
722
722
  [key: string]: BasketStatus;
723
723
  } | undefined;
724
724
  basketMoveInstructions?: BasketMoveInstruction[] | undefined;
725
+ customState?: unknown | undefined;
725
726
  constructor(data?: ICurrentStatus);
726
727
  init(_data?: any): void;
727
728
  static fromJS(data: any): CurrentStatus;
@@ -746,6 +747,7 @@ export interface ICurrentStatus {
746
747
  [key: string]: BasketStatus;
747
748
  } | undefined;
748
749
  basketMoveInstructions?: BasketMoveInstruction[] | undefined;
750
+ customState?: unknown | undefined;
749
751
  }
750
752
  export declare class HistoricJob extends Job implements IHistoricJob {
751
753
  scheduleId?: string | undefined;
@@ -902,11 +904,14 @@ export declare enum LocType {
902
904
  }
903
905
  export declare class InProcessMaterialAction implements IInProcessMaterialAction {
904
906
  type: ActionType;
907
+ workId?: string | undefined;
905
908
  loadOntoPalletNum?: number | undefined;
906
909
  loadOntoFace?: number | undefined;
907
910
  processAfterLoad?: number | undefined;
908
911
  pathAfterLoad?: number | undefined;
909
912
  loadFromBasketId?: number | undefined;
913
+ loadToBasketId?: number | undefined;
914
+ loadToBasketSlot?: number | undefined;
910
915
  unloadIntoQueue?: string | undefined;
911
916
  unloadToBasketId?: number | undefined;
912
917
  unloadToBasketSlot?: number | undefined;
@@ -921,11 +926,14 @@ export declare class InProcessMaterialAction implements IInProcessMaterialAction
921
926
  }
922
927
  export interface IInProcessMaterialAction {
923
928
  type: ActionType;
929
+ workId?: string | undefined;
924
930
  loadOntoPalletNum?: number | undefined;
925
931
  loadOntoFace?: number | undefined;
926
932
  processAfterLoad?: number | undefined;
927
933
  pathAfterLoad?: number | undefined;
928
934
  loadFromBasketId?: number | undefined;
935
+ loadToBasketId?: number | undefined;
936
+ loadToBasketSlot?: number | undefined;
929
937
  unloadIntoQueue?: string | undefined;
930
938
  unloadToBasketId?: number | undefined;
931
939
  unloadToBasketSlot?: number | undefined;
@@ -939,7 +947,8 @@ export declare enum ActionType {
939
947
  Loading = "Loading",
940
948
  UnloadToInProcess = "UnloadToInProcess",
941
949
  UnloadToCompletedMaterial = "UnloadToCompletedMaterial",
942
- Machining = "Machining"
950
+ Machining = "Machining",
951
+ LoadingToBasket = "LoadingToBasket"
943
952
  }
944
953
  export declare class QueueInfo implements IQueueInfo {
945
954
  maxSizeBeforeStopUnloading?: number | undefined;
@@ -3561,6 +3561,7 @@ export class CurrentStatus {
3561
3561
  for (let item of _data["BasketMoveInstructions"])
3562
3562
  this.basketMoveInstructions.push(BasketMoveInstruction.fromJS(item));
3563
3563
  }
3564
+ this.customState = _data["CustomState"];
3564
3565
  }
3565
3566
  }
3566
3567
  static fromJS(data) {
@@ -3635,6 +3636,7 @@ export class CurrentStatus {
3635
3636
  for (let item of this.basketMoveInstructions)
3636
3637
  data["BasketMoveInstructions"].push(item ? item.toJSON() : undefined);
3637
3638
  }
3639
+ data["CustomState"] = this.customState;
3638
3640
  return data;
3639
3641
  }
3640
3642
  }
@@ -3979,11 +3981,14 @@ export class InProcessMaterialAction {
3979
3981
  init(_data) {
3980
3982
  if (_data) {
3981
3983
  this.type = _data["Type"];
3984
+ this.workId = _data["WorkId"];
3982
3985
  this.loadOntoPalletNum = _data["LoadOntoPalletNum"];
3983
3986
  this.loadOntoFace = _data["LoadOntoFace"];
3984
3987
  this.processAfterLoad = _data["ProcessAfterLoad"];
3985
3988
  this.pathAfterLoad = _data["PathAfterLoad"];
3986
3989
  this.loadFromBasketId = _data["LoadFromBasketId"];
3990
+ this.loadToBasketId = _data["LoadToBasketId"];
3991
+ this.loadToBasketSlot = _data["LoadToBasketSlot"];
3987
3992
  this.unloadIntoQueue = _data["UnloadIntoQueue"];
3988
3993
  this.unloadToBasketId = _data["UnloadToBasketId"];
3989
3994
  this.unloadToBasketSlot = _data["UnloadToBasketSlot"];
@@ -4002,11 +4007,14 @@ export class InProcessMaterialAction {
4002
4007
  toJSON(data) {
4003
4008
  data = typeof data === "object" ? data : {};
4004
4009
  data["Type"] = this.type;
4010
+ data["WorkId"] = this.workId;
4005
4011
  data["LoadOntoPalletNum"] = this.loadOntoPalletNum;
4006
4012
  data["LoadOntoFace"] = this.loadOntoFace;
4007
4013
  data["ProcessAfterLoad"] = this.processAfterLoad;
4008
4014
  data["PathAfterLoad"] = this.pathAfterLoad;
4009
4015
  data["LoadFromBasketId"] = this.loadFromBasketId;
4016
+ data["LoadToBasketId"] = this.loadToBasketId;
4017
+ data["LoadToBasketSlot"] = this.loadToBasketSlot;
4010
4018
  data["UnloadIntoQueue"] = this.unloadIntoQueue;
4011
4019
  data["UnloadToBasketId"] = this.unloadToBasketId;
4012
4020
  data["UnloadToBasketSlot"] = this.unloadToBasketSlot;
@@ -4024,6 +4032,7 @@ export var ActionType;
4024
4032
  ActionType["UnloadToInProcess"] = "UnloadToInProcess";
4025
4033
  ActionType["UnloadToCompletedMaterial"] = "UnloadToCompletedMaterial";
4026
4034
  ActionType["Machining"] = "Machining";
4035
+ ActionType["LoadingToBasket"] = "LoadingToBasket";
4027
4036
  })(ActionType || (ActionType = {}));
4028
4037
  export class QueueInfo {
4029
4038
  constructor(data) {
@@ -54,4 +54,6 @@ export declare function registerNetworkBackend(): void;
54
54
  export declare function setOtherLogBackends(servers: ReadonlyArray<string>): void;
55
55
  export declare function registerBackend(log: LogAPI, job: JobAPI, fms: FmsAPI, machine: MachineAPI): void;
56
56
  export declare function setUserToken(u: User): void;
57
+ /** Performs a request using the authenticated Insight user's bearer token, when present. */
58
+ export declare function authenticatedFetch(url: RequestInfo, init?: RequestInit): Promise<Response>;
57
59
  export declare function instructionUrl(partName: string, type: string, matId: number, pallet: number | null, proc: number | null | undefined, operator: string | null): string;