@burdenoff/microfe-movethewheels 2026.929.4 → 2026.930.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 (49) hide show
  1. package/dist/components/CustomerPicker.js +52 -48
  2. package/dist/components/EntityCombobox.js +25 -23
  3. package/dist/components/OrderItemRow.js +123 -78
  4. package/dist/hooks/useCustomers.js +52 -17
  5. package/dist/hooks/useFleet.js +126 -44
  6. package/dist/hooks/useInventory.js +43 -7
  7. package/dist/hooks/useMultiModalShipments.js +30 -26
  8. package/dist/hooks/useRefetchOnLeaveEdit.js +10 -0
  9. package/dist/hooks/useRoutes.js +55 -15
  10. package/dist/movethewheels/components/CustomerPicker.d.ts +5 -1
  11. package/dist/movethewheels/components/EntityCombobox.d.ts +6 -3
  12. package/dist/movethewheels/components/OrderItemRow.d.ts +7 -1
  13. package/dist/movethewheels/hooks/useCustomers.d.ts +3 -0
  14. package/dist/movethewheels/hooks/useFleet.d.ts +6 -0
  15. package/dist/movethewheels/hooks/useInventory.d.ts +2 -0
  16. package/dist/movethewheels/hooks/useMultiModalShipments.d.ts +1 -0
  17. package/dist/movethewheels/hooks/useRefetchOnLeaveEdit.d.ts +7 -0
  18. package/dist/movethewheels/hooks/useRoutes.d.ts +3 -0
  19. package/dist/movethewheels/utils/orderValidation.d.ts +11 -0
  20. package/dist/pages/CreateOrderPage.js +349 -297
  21. package/dist/pages/DriverDetailsPage.js +258 -251
  22. package/dist/pages/DriversPage.js +3 -1
  23. package/dist/pages/MultiModalShipmentPage.js +139 -125
  24. package/dist/pages/OrderDetailsPage.js +132 -140
  25. package/dist/pages/ProductDetailsPage.js +22 -19
  26. package/dist/pages/RouteDetailsPage.js +284 -281
  27. package/dist/pages/TrackingPage.js +2 -1
  28. package/dist/pages/VehicleDetailsPage.js +28 -25
  29. package/dist/utils/orderValidation.js +18 -0
  30. package/package.json +1 -1
  31. package/src/movethewheels/components/CustomerPicker.tsx +12 -0
  32. package/src/movethewheels/components/EntityCombobox.tsx +30 -11
  33. package/src/movethewheels/components/OrderItemRow.tsx +44 -0
  34. package/src/movethewheels/hooks/useCustomers.ts +38 -0
  35. package/src/movethewheels/hooks/useFleet.ts +125 -5
  36. package/src/movethewheels/hooks/useInventory.ts +42 -0
  37. package/src/movethewheels/hooks/useMultiModalShipments.ts +9 -7
  38. package/src/movethewheels/hooks/useRefetchOnLeaveEdit.ts +18 -0
  39. package/src/movethewheels/hooks/useRoutes.ts +51 -0
  40. package/src/movethewheels/pages/CreateOrderPage.tsx +66 -2
  41. package/src/movethewheels/pages/DriverDetailsPage.tsx +14 -1
  42. package/src/movethewheels/pages/DriversPage.tsx +7 -1
  43. package/src/movethewheels/pages/MultiModalShipmentPage.tsx +15 -1
  44. package/src/movethewheels/pages/OrderDetailsPage.tsx +25 -25
  45. package/src/movethewheels/pages/ProductDetailsPage.tsx +2 -0
  46. package/src/movethewheels/pages/RouteDetailsPage.tsx +10 -4
  47. package/src/movethewheels/pages/TrackingPage.tsx +7 -2
  48. package/src/movethewheels/pages/VehicleDetailsPage.tsx +2 -0
  49. package/src/movethewheels/utils/orderValidation.ts +53 -0
@@ -25,7 +25,7 @@ function f(s = {}) {
25
25
  f?.isActive,
26
26
  f?.search,
27
27
  f?.type
28
- ]), { apiGatewayUrl: g, authToken: _, workspaceToken: v, workspaceId: y, tenantId: b, currentUser: x } = e(), [S, C] = a([]), [w, T] = a(0), [E, D] = a(!1), [O, k] = a(!1), [A, j] = a(null), M = i(() => ({
28
+ ]), { apiGatewayUrl: g, authToken: _, workspaceToken: v, workspaceId: y, tenantId: b, currentUser: x } = e(), [S, C] = a([]), [w, T] = a(0), [E, D] = a(!1), [O, k] = a(!1), [A, j] = a(!1), [M, N] = a(null), P = i(() => ({
29
29
  apiGatewayUrl: g,
30
30
  authToken: _,
31
31
  workspaceToken: v,
@@ -39,10 +39,10 @@ function f(s = {}) {
39
39
  y,
40
40
  b,
41
41
  x?.id
42
- ]), N = n(async () => {
43
- k(!0), j(null);
42
+ ]), F = n(async () => {
43
+ k(!0), N(null);
44
44
  try {
45
- let e = await t(M, o, {
45
+ let e = await t(P, o, {
46
46
  filter: {
47
47
  type: h?.type,
48
48
  search: h?.search
@@ -54,29 +54,64 @@ function f(s = {}) {
54
54
  }), n = e.customers;
55
55
  T(e.customersCount), D(m + n.length < e.customersCount), C(n.map(d));
56
56
  } catch (e) {
57
- j(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load customers"));
57
+ N(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load customers"));
58
58
  } finally {
59
59
  k(!1);
60
60
  }
61
61
  }, [
62
62
  h,
63
- M,
63
+ P,
64
+ p,
65
+ m
66
+ ]), I = n(async () => {
67
+ if (!E || O || A) return;
68
+ let e = m + S.length;
69
+ j(!0), N(null);
70
+ try {
71
+ let n = await t(P, o, {
72
+ filter: {
73
+ type: h?.type,
74
+ search: h?.search
75
+ },
76
+ pagination: {
77
+ limit: p,
78
+ offset: e
79
+ }
80
+ }), r = n.customers.map(d);
81
+ T(n.customersCount), D(e + r.length < n.customersCount), C((e) => {
82
+ let t = new Set(e.map((e) => e.id));
83
+ return [...e, ...r.filter((e) => !t.has(e.id))];
84
+ });
85
+ } catch (e) {
86
+ N(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more customers"));
87
+ } finally {
88
+ j(!1);
89
+ }
90
+ }, [
91
+ S.length,
92
+ h,
93
+ P,
94
+ E,
95
+ O,
96
+ A,
64
97
  p,
65
98
  m
66
99
  ]);
67
100
  return r(() => {
68
- N();
69
- }, [N]), {
101
+ F();
102
+ }, [F]), {
70
103
  customers: S,
71
104
  totalCustomers: w,
72
105
  hasMore: E,
73
106
  isLoading: O,
74
- error: A,
107
+ isLoadingMore: A,
108
+ error: M,
75
109
  refetch: n(() => {
76
- N();
77
- }, [N]),
110
+ F();
111
+ }, [F]),
112
+ loadMore: I,
78
113
  createCustomer: n(async (e) => {
79
- let n = d((await t(M, c, { input: {
114
+ let n = d((await t(P, c, { input: {
80
115
  name: e.name,
81
116
  email: e.email,
82
117
  phone: e.phone,
@@ -88,9 +123,9 @@ function f(s = {}) {
88
123
  rating: e.rating
89
124
  } })).createCustomer);
90
125
  return C((e) => [n, ...e]), n;
91
- }, [M]),
126
+ }, [P]),
92
127
  updateCustomer: n(async (e, n) => {
93
- let r = d((await t(M, l, {
128
+ let r = d((await t(P, l, {
94
129
  id: e,
95
130
  input: {
96
131
  name: n.name,
@@ -105,10 +140,10 @@ function f(s = {}) {
105
140
  }
106
141
  })).updateCustomer);
107
142
  return C((t) => t.map((t) => t.id === e ? r : t)), r;
108
- }, [M]),
143
+ }, [P]),
109
144
  deleteCustomer: n(async (e) => {
110
- await t(M, u, { id: e }), C((t) => t.filter((t) => t.id !== e));
111
- }, [M])
145
+ await t(P, u, { id: e }), C((t) => t.filter((t) => t.id !== e));
146
+ }, [P])
112
147
  };
113
148
  }
114
149
  function p(o) {
@@ -272,73 +272,115 @@ function O(e = {}) {
272
272
  };
273
273
  }
274
274
  function k(e = {}) {
275
- let { limit: i = 20, offset: s = 0, search: l, status: p, vehicleType: m, driverId: h, ids: g } = e, _ = D(), [v, y] = a([]), [b, S] = a(0), [C, w] = a(!1), [E, O] = a(!1), [k, A] = a(null), j = n(async () => {
276
- if (g && g.length === 0) {
277
- y([]), S(0), w(!1);
275
+ let { limit: s = 20, offset: l = 0, search: p, status: m, vehicleType: h, driverId: g, ids: _ } = e, v = D(), [y, b] = a([]), [S, C] = a(0), [w, E] = a(!1), [O, k] = a(!1), [A, j] = a(!1), [M, N] = a(null), P = _ ? [..._].sort().join(",") : "", F = _ === void 0 ? "none" : "exact", I = i(() => P ? P.split(",") : [], [P]), L = n(async () => {
276
+ if (F === "exact" && I.length === 0) {
277
+ b([]), C(0), E(!1);
278
278
  return;
279
279
  }
280
- O(!0), A(null);
280
+ k(!0), N(null);
281
281
  try {
282
- let e = await t(_, o, {
282
+ let e = await t(v, o, {
283
283
  filter: {
284
- search: l || void 0,
285
- status: p ? x(p) : void 0,
286
- type: m?.toUpperCase(),
287
- driverId: h || void 0,
288
- ids: g && g.length > 0 ? [...g] : void 0
284
+ search: p || void 0,
285
+ status: m ? x(m) : void 0,
286
+ type: h?.toUpperCase(),
287
+ driverId: g || void 0,
288
+ ids: I.length > 0 ? I : void 0
289
289
  },
290
290
  pagination: {
291
- limit: g && g.length > 0 ? g.length : i,
292
- offset: g ? 0 : s
291
+ limit: F === "exact" ? I.length : s,
292
+ offset: F === "exact" ? 0 : l
293
293
  }
294
294
  });
295
- w(s + e.vehicles.length < e.vehiclesCount), S(e.vehiclesCount), y(e.vehicles.map(T));
295
+ E(F === "none" && l + e.vehicles.length < e.vehiclesCount), C(e.vehiclesCount), b(e.vehicles.map(T));
296
296
  } catch (e) {
297
- A(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load vehicles"));
297
+ N(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load vehicles"));
298
298
  } finally {
299
- O(!1);
299
+ k(!1);
300
300
  }
301
301
  }, [
302
- _,
303
- i,
302
+ v,
304
303
  s,
305
304
  l,
306
305
  p,
307
306
  m,
308
307
  h,
309
- g ? [...g].sort().join(",") : ""
308
+ g,
309
+ F,
310
+ I
311
+ ]), R = n(async () => {
312
+ if (F === "exact" || !w || O || A) return;
313
+ let e = l + y.length;
314
+ j(!0), N(null);
315
+ try {
316
+ let n = await t(v, o, {
317
+ filter: {
318
+ search: p || void 0,
319
+ status: m ? x(m) : void 0,
320
+ type: h?.toUpperCase(),
321
+ driverId: g || void 0
322
+ },
323
+ pagination: {
324
+ limit: s,
325
+ offset: e
326
+ }
327
+ }), r = n.vehicles.map(T);
328
+ C(n.vehiclesCount), E(e + r.length < n.vehiclesCount), b((e) => {
329
+ let t = new Set(e.map((e) => e.id));
330
+ return [...e, ...r.filter((e) => !t.has(e.id))];
331
+ });
332
+ } catch (e) {
333
+ N(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more vehicles"));
334
+ } finally {
335
+ j(!1);
336
+ }
337
+ }, [
338
+ g,
339
+ v,
340
+ w,
341
+ F,
342
+ O,
343
+ A,
344
+ s,
345
+ l,
346
+ p,
347
+ m,
348
+ h,
349
+ y.length
310
350
  ]);
311
351
  return r(() => {
312
- j();
313
- }, [j]), {
314
- vehicles: v,
315
- totalVehicles: b,
316
- hasMore: C,
317
- isLoading: E,
318
- error: k,
352
+ L();
353
+ }, [L]), {
354
+ vehicles: y,
355
+ totalVehicles: S,
356
+ hasMore: w,
357
+ isLoading: O,
358
+ isLoadingMore: A,
359
+ error: M,
319
360
  refetch: n(() => {
320
- j();
321
- }, [j]),
361
+ L();
362
+ }, [L]),
363
+ loadMore: R,
322
364
  updateVehicleStatus: n(async (e, n) => {
323
- let r = T((await t(_, d, {
365
+ let r = T((await t(v, d, {
324
366
  id: e,
325
367
  status: x(n)
326
368
  })).updateVehicleStatus);
327
- return y((t) => t.map((t) => t.id === e ? r : t)), r;
328
- }, [_]),
369
+ return b((t) => t.map((t) => t.id === e ? r : t)), r;
370
+ }, [v]),
329
371
  assignDriver: n(async (e, n) => {
330
- await t(_, f, {
372
+ await t(v, f, {
331
373
  id: n,
332
374
  vehicleId: e
333
375
  });
334
- let r = await t(_, c, { id: e });
376
+ let r = await t(v, c, { id: e });
335
377
  if (!r.vehicle) throw Error("Vehicle not found");
336
378
  let i = T(r.vehicle);
337
- return y((t) => t.map((t) => t.id === e ? i : t)), i;
338
- }, [_]),
379
+ return b((t) => t.map((t) => t.id === e ? i : t)), i;
380
+ }, [v]),
339
381
  deleteVehicle: n(async (e) => {
340
- await t(_, u, { id: e }), y((t) => t.filter((t) => t.id !== e));
341
- }, [_])
382
+ await t(v, u, { id: e }), b((t) => t.filter((t) => t.id !== e));
383
+ }, [v])
342
384
  };
343
385
  }
344
386
  function A(e) {
@@ -369,8 +411,8 @@ function A(e) {
369
411
  };
370
412
  }
371
413
  function j(e = {}) {
372
- let { limit: i = 20, offset: o = 0, status: c, search: l, licenseClass: u, vehicleId: d } = e, m = D(), [h, g] = a([]), [_, v] = a(0), [y, b] = a(!1), [x, S] = a(!1), [w, T] = a(null), O = n(async () => {
373
- S(!0), T(null);
414
+ let { limit: i = 20, offset: o = 0, status: c, search: l, licenseClass: u, vehicleId: d } = e, m = D(), [h, g] = a([]), [_, v] = a(0), [y, b] = a(!1), [x, S] = a(!1), [w, T] = a(!1), [O, k] = a(null), A = n(async () => {
415
+ S(!0), k(null);
374
416
  try {
375
417
  let e = await t(m, s, {
376
418
  filter: {
@@ -386,7 +428,7 @@ function j(e = {}) {
386
428
  });
387
429
  b(o + e.drivers.length < e.driversCount), v(e.driversCount), g(e.drivers.map(E));
388
430
  } catch (e) {
389
- T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load drivers"));
431
+ k(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load drivers"));
390
432
  } finally {
391
433
  S(!1);
392
434
  }
@@ -398,18 +440,58 @@ function j(e = {}) {
398
440
  l,
399
441
  u,
400
442
  d
443
+ ]), j = n(async () => {
444
+ if (!y || x || w) return;
445
+ let e = o + h.length;
446
+ T(!0), k(null);
447
+ try {
448
+ let n = await t(m, s, {
449
+ filter: {
450
+ status: c ? C(c) : void 0,
451
+ search: l || void 0,
452
+ licenseClass: u || void 0,
453
+ vehicleId: d || void 0
454
+ },
455
+ pagination: {
456
+ limit: i,
457
+ offset: e
458
+ }
459
+ }), r = n.drivers.map(E);
460
+ v(n.driversCount), b(e + r.length < n.driversCount), g((e) => {
461
+ let t = new Set(e.map((e) => e.id));
462
+ return [...e, ...r.filter((e) => !t.has(e.id))];
463
+ });
464
+ } catch (e) {
465
+ k(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more drivers"));
466
+ } finally {
467
+ T(!1);
468
+ }
469
+ }, [
470
+ h.length,
471
+ m,
472
+ y,
473
+ x,
474
+ w,
475
+ i,
476
+ u,
477
+ o,
478
+ l,
479
+ c,
480
+ d
401
481
  ]);
402
482
  return r(() => {
403
- O();
404
- }, [O]), {
483
+ A();
484
+ }, [A]), {
405
485
  drivers: h,
406
486
  totalDrivers: _,
407
487
  hasMore: y,
408
488
  isLoading: x,
409
- error: w,
489
+ isLoadingMore: w,
490
+ error: O,
410
491
  refetch: n(() => {
411
- O();
412
- }, [O]),
492
+ A();
493
+ }, [A]),
494
+ loadMore: j,
413
495
  updateDriverStatus: n(async (e, n) => {
414
496
  let r = E((await t(m, p, {
415
497
  id: e,
@@ -273,8 +273,8 @@ function D(e = {}) {
273
273
  };
274
274
  }
275
275
  function O(e = {}) {
276
- let { limit: i = 20, offset: o = 0, search: c, category: l } = e, u = E(), [d, f] = a([]), [p, m] = a(0), [h, g] = a(!1), [_, v] = a(!1), [y, b] = a(null), x = n(async () => {
277
- v(!0), b(null);
276
+ let { limit: i = 20, offset: o = 0, search: c, category: l } = e, u = E(), [d, f] = a([]), [p, m] = a(0), [h, g] = a(!1), [_, v] = a(!1), [y, b] = a(!1), [x, C] = a(null), w = n(async () => {
277
+ v(!0), C(null);
278
278
  try {
279
279
  let e = await t(u, s, {
280
280
  filter: {
@@ -288,7 +288,7 @@ function O(e = {}) {
288
288
  });
289
289
  g(o + e.cargoItems.length < e.cargoItemsCount), m(e.cargoItemsCount), f(e.cargoItems.map(S));
290
290
  } catch (e) {
291
- b(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load products"));
291
+ C(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load products"));
292
292
  } finally {
293
293
  v(!1);
294
294
  }
@@ -298,16 +298,52 @@ function O(e = {}) {
298
298
  o,
299
299
  c,
300
300
  l
301
+ ]), T = n(async () => {
302
+ if (!h || _ || y) return;
303
+ let e = o + d.length;
304
+ b(!0), C(null);
305
+ try {
306
+ let n = await t(u, s, {
307
+ filter: {
308
+ search: c || void 0,
309
+ category: l || void 0
310
+ },
311
+ pagination: {
312
+ limit: i,
313
+ offset: e
314
+ }
315
+ }), r = n.cargoItems.map(S);
316
+ m(n.cargoItemsCount), g(e + r.length < n.cargoItemsCount), f((e) => {
317
+ let t = new Set(e.map((e) => e.id));
318
+ return [...e, ...r.filter((e) => !t.has(e.id))];
319
+ });
320
+ } catch (e) {
321
+ C(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more products"));
322
+ } finally {
323
+ b(!1);
324
+ }
325
+ }, [
326
+ l,
327
+ u,
328
+ h,
329
+ _,
330
+ y,
331
+ i,
332
+ o,
333
+ d.length,
334
+ c
301
335
  ]);
302
336
  return r(() => {
303
- x();
304
- }, [x]), {
337
+ w();
338
+ }, [w]), {
305
339
  products: d,
306
340
  totalProducts: p,
307
341
  hasMore: h,
308
342
  isLoading: _,
309
- error: y,
310
- refetch: () => void x()
343
+ isLoadingMore: y,
344
+ error: x,
345
+ refetch: () => void w(),
346
+ loadMore: T
311
347
  };
312
348
  }
313
349
  var k = "\n query CargoItemStats {\n cargoItemStats {\n total\n specialHandling\n temperatureControlled\n }\n }\n";
@@ -3,11 +3,11 @@ import { executeGraphQL as t } from "../utils/graphqlClient.js";
3
3
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
4
4
  //#region src/movethewheels/hooks/useMultiModalShipments.ts
5
5
  var o = "\n id\n shipmentNumber\n status\n primaryMode\n isMultiModal\n totalFreightCost\n freightCurrency\n origin\n destination\n createdAt\n legs(pagination: { limit: 20, offset: 0 }) {\n \n id\n legNumber\n mode\n status\n origin\n destination\n distanceKm\n weightKg\n lengthCm\n widthCm\n heightCm\n volumeCbm\n containerType\n containerCount\n carrierName\n chargeableWeightKg\n calculatedCost\n currency\n\n }\n", s = `
6
- query ListMultiModalShipments($pagination: PaginationInput) {
7
- shipments(filter: { isMultiModal: true }, pagination: $pagination) {
6
+ query ListMultiModalShipments($search: String, $pagination: PaginationInput) {
7
+ shipments(filter: { isMultiModal: true, search: $search }, pagination: $pagination) {
8
8
  ${o}
9
9
  }
10
- shipmentsCount(filter: { isMultiModal: true })
10
+ shipmentsCount(filter: { isMultiModal: true, search: $search })
11
11
  }
12
12
  `, c = "\n query CalculateFreightRate($input: FreightRateInput!) {\n calculateFreightRate(input: $input) {\n mode\n chargeableWeightKg\n ratePerUnit\n calculatedCost\n currency\n breakdown {\n label\n amount\n }\n }\n }\n", l = `
13
13
  mutation PlanMultiModalShipment($input: PlanMultiModalShipmentInput!) {
@@ -101,44 +101,48 @@ function m() {
101
101
  ]);
102
102
  }
103
103
  function h(e = {}) {
104
- let { limit: i = 10, offset: o = 0 } = e, f = m(), [h, g] = a([]), [_, v] = a(0), [y, b] = a(!1), [x, S] = a(!1), [C, w] = a(null), T = n(async () => {
105
- S(!0), w(null);
104
+ let { limit: i = 10, offset: o = 0, search: f = "" } = e, h = m(), [g, _] = a([]), [v, y] = a(0), [b, x] = a(!1), [S, C] = a(!1), [w, T] = a(null), E = n(async () => {
105
+ C(!0), T(null);
106
106
  try {
107
- let e = await t(f, s, { pagination: {
108
- limit: i,
109
- offset: o
110
- } });
111
- g(e.shipments.map(p)), v(e.shipmentsCount), b(o + e.shipments.length < e.shipmentsCount);
107
+ let e = await t(h, s, {
108
+ search: f.trim() || void 0,
109
+ pagination: {
110
+ limit: i,
111
+ offset: o
112
+ }
113
+ });
114
+ _(e.shipments.map(p)), y(e.shipmentsCount), x(o + e.shipments.length < e.shipmentsCount);
112
115
  } catch (e) {
113
- w(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load multi-modal shipments"));
116
+ T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load multi-modal shipments"));
114
117
  } finally {
115
- S(!1);
118
+ C(!1);
116
119
  }
117
120
  }, [
118
- f,
121
+ h,
119
122
  i,
120
- o
123
+ o,
124
+ f
121
125
  ]);
122
126
  return r(() => {
123
- T();
124
- }, [T]), {
125
- shipments: h,
126
- totalShipments: _,
127
- hasMore: y,
128
- isLoading: x,
129
- error: C,
130
- refetch: () => void T(),
131
- calculateFreightRate: n(async (e) => (await t(f, c, { input: d(e) })).calculateFreightRate, [f]),
127
+ E();
128
+ }, [E]), {
129
+ shipments: g,
130
+ totalShipments: v,
131
+ hasMore: b,
132
+ isLoading: S,
133
+ error: w,
134
+ refetch: () => void E(),
135
+ calculateFreightRate: n(async (e) => (await t(h, c, { input: d(e) })).calculateFreightRate, [h]),
132
136
  planMultiModalShipment: n(async (e) => {
133
- let n = p((await t(f, l, { input: {
137
+ let n = p((await t(h, l, { input: {
134
138
  shipmentNumber: e.shipmentNumber,
135
139
  customerId: e.customerId,
136
140
  origin: e.origin,
137
141
  destination: e.destination,
138
142
  legs: e.legs.map(u)
139
143
  } })).planMultiModalShipment);
140
- return g((e) => [n, ...e]), v((e) => e + 1), n;
141
- }, [f])
144
+ return _((e) => [n, ...e]), y((e) => e + 1), n;
145
+ }, [h])
142
146
  };
143
147
  }
144
148
  //#endregion
@@ -0,0 +1,10 @@
1
+ import { useEffect as e, useRef as t } from "react";
2
+ //#region src/movethewheels/hooks/useRefetchOnLeaveEdit.ts
3
+ function n(n, r) {
4
+ let i = t(n);
5
+ e(() => {
6
+ i.current && !n && r(), i.current = n;
7
+ }, [n, r]);
8
+ }
9
+ //#endregion
10
+ export { n as useRefetchOnLeaveEdit };
@@ -79,8 +79,8 @@ function g() {
79
79
  ]);
80
80
  }
81
81
  function _(e = {}) {
82
- let { driverId: i, vehicleId: s, status: f, search: m, limit: _ = 20, offset: v = 0 } = e, y = g(), [b, x] = a([]), [S, C] = a(0), [w, T] = a(!1), [E, D] = a(!1), [O, k] = a(null), A = n(async () => {
83
- D(!0), k(null);
82
+ let { driverId: i, vehicleId: s, status: f, search: m, limit: _ = 20, offset: v = 0 } = e, y = g(), [b, x] = a([]), [S, C] = a(0), [w, T] = a(!1), [E, D] = a(!1), [O, k] = a(!1), [A, j] = a(null), M = n(async () => {
83
+ D(!0), j(null);
84
84
  try {
85
85
  let e = await t(y, o, {
86
86
  filter: {
@@ -96,7 +96,7 @@ function _(e = {}) {
96
96
  });
97
97
  C(e.routesCount), T(v + e.routes.length < e.routesCount), x(e.routes.map(h));
98
98
  } catch (e) {
99
- k(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load routes"));
99
+ j(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load routes"));
100
100
  } finally {
101
101
  D(!1);
102
102
  }
@@ -108,13 +108,51 @@ function _(e = {}) {
108
108
  s,
109
109
  _,
110
110
  v
111
+ ]), N = n(async () => {
112
+ if (!w || E || O) return;
113
+ let e = v + b.length;
114
+ k(!0), j(null);
115
+ try {
116
+ let n = await t(y, o, {
117
+ filter: {
118
+ driverId: i,
119
+ vehicleId: s,
120
+ status: f ? p(f) : void 0,
121
+ search: m || void 0
122
+ },
123
+ pagination: {
124
+ limit: _,
125
+ offset: e
126
+ }
127
+ }), r = n.routes.map(h);
128
+ C(n.routesCount), T(e + r.length < n.routesCount), x((e) => {
129
+ let t = new Set(e.map((e) => e.id));
130
+ return [...e, ...r.filter((e) => !t.has(e.id))];
131
+ });
132
+ } catch (e) {
133
+ j(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more routes"));
134
+ } finally {
135
+ k(!1);
136
+ }
137
+ }, [
138
+ i,
139
+ y,
140
+ w,
141
+ E,
142
+ O,
143
+ _,
144
+ v,
145
+ b.length,
146
+ m,
147
+ f,
148
+ s
111
149
  ]);
112
150
  r(() => {
113
- A();
114
- }, [A]);
115
- let j = n(() => {
116
- A();
117
- }, [A]), M = n(async (e) => {
151
+ M();
152
+ }, [M]);
153
+ let P = n(() => {
154
+ M();
155
+ }, [M]), F = n(async (e) => {
118
156
  let n = h((await t(y, c, { input: {
119
157
  name: e.name ?? `Route ${(/* @__PURE__ */ new Date()).toLocaleDateString()}`,
120
158
  status: p(e.status),
@@ -126,7 +164,7 @@ function _(e = {}) {
126
164
  fuelCost: e.fuelCost
127
165
  } })).createRoute);
128
166
  return x((e) => [n, ...e]), n;
129
- }, [y]), N = n(async (e, n) => {
167
+ }, [y]), I = n(async (e, n) => {
130
168
  let r = h((await t(y, l, {
131
169
  id: e,
132
170
  input: {
@@ -147,10 +185,12 @@ function _(e = {}) {
147
185
  totalRoutes: S,
148
186
  hasMore: w,
149
187
  isLoading: E,
150
- error: O,
151
- refetch: j,
152
- createRoute: M,
153
- updateRoute: N,
188
+ isLoadingMore: O,
189
+ error: A,
190
+ refetch: P,
191
+ loadMore: N,
192
+ createRoute: F,
193
+ updateRoute: I,
154
194
  deleteRoute: n(async (e) => {
155
195
  await t(y, u, { id: e }), x((t) => t.filter((t) => t.id !== e));
156
196
  }, [y]),
@@ -169,11 +209,11 @@ function _(e = {}) {
169
209
  status: n,
170
210
  actualTime: n === "completed" ? /* @__PURE__ */ new Date() : e.actualTime
171
211
  } : e);
172
- return N(e, {
212
+ return I(e, {
173
213
  stops: i,
174
214
  status: i.every((e) => e.status === "completed") ? "completed" : r.status
175
215
  });
176
- }, [b, N])
216
+ }, [b, I])
177
217
  };
178
218
  }
179
219
  function v(e) {
@@ -7,8 +7,12 @@ interface CustomerPickerProps {
7
7
  onCreated: (customer: Customer) => void;
8
8
  createCustomer: (customer: Partial<Customer>) => Promise<Customer>;
9
9
  isLoading: boolean;
10
+ isLoadingMore?: boolean;
10
11
  error: Error | null;
11
12
  onRetry: () => void;
13
+ onLoadMore?: () => void | Promise<void>;
14
+ hasMore?: boolean;
15
+ totalCount?: number;
12
16
  onOpenCustomers?: () => void;
13
17
  selectedCustomer?: Customer | null;
14
18
  /** Called with the (already debounced) query text as the user types in the
@@ -16,5 +20,5 @@ interface CustomerPickerProps {
16
20
  onSearchQueryChange?: (query: string) => void;
17
21
  disabled?: boolean;
18
22
  }
19
- export declare function CustomerPicker({ customers, value, onValueChange, onCreated, createCustomer, isLoading, error, onRetry, onOpenCustomers, selectedCustomer, onSearchQueryChange, disabled, }: CustomerPickerProps): import("react").JSX.Element;
23
+ export declare function CustomerPicker({ customers, value, onValueChange, onCreated, createCustomer, isLoading, isLoadingMore, error, onRetry, onLoadMore, hasMore, totalCount, onOpenCustomers, selectedCustomer, onSearchQueryChange, disabled, }: CustomerPickerProps): import("react").JSX.Element;
20
24
  export {};
@@ -31,10 +31,13 @@ interface EntityComboboxProps<T> {
31
31
  /** Server-side search callback (debounced). Omit to hide the built-in search
32
32
  * input when a caller already provides one elsewhere for the same list. */
33
33
  onSearchChange?: (value: string) => void;
34
- /** True when the source hook's page doesn't hold every matching record —
35
- * paired with `totalCount` to render a "keep typing to narrow" hint. */
34
+ /** True when the source hook has another server page available. */
36
35
  hasMore?: boolean;
37
36
  totalCount?: number;
37
+ /** Fetches and appends the next server page without replacing the current options. */
38
+ onLoadMore?: () => void | Promise<void>;
39
+ /** True while the next server page is being fetched. */
40
+ loadingMore?: boolean;
38
41
  }
39
- export declare function EntityCombobox<T>({ value, onChange, options, loading, getId, renderOption, getLabel, selectedOption, selectedLoading, required, placeholder, searchPlaceholder, emptyText, noneLabel, disabled, id, error, className, onSearchChange, hasMore, totalCount, }: EntityComboboxProps<T>): import("react").JSX.Element;
42
+ export declare function EntityCombobox<T>({ value, onChange, options, loading, getId, renderOption, getLabel, selectedOption, selectedLoading, required, placeholder, searchPlaceholder, emptyText, noneLabel, disabled, id, error, className, onSearchChange, hasMore, totalCount, onLoadMore, loadingMore, }: EntityComboboxProps<T>): import("react").JSX.Element;
40
43
  export {};