@aglyn/plugins-commerce 1.0.0-beta.277 → 1.0.0-beta.282

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 (212) hide show
  1. package/package.json +17 -14
  2. package/src/lib/components/commerce-console-page.js +33 -1
  3. package/src/lib/components/commerce-console-page.js.map +1 -1
  4. package/src/lib/components/console/payments-settings-card.component.js +1 -1
  5. package/src/lib/components/console/payments-settings-card.component.js.map +1 -1
  6. package/src/lib/components/console/pos/pos-hardware-api.d.ts +122 -0
  7. package/src/lib/components/console/pos/pos-hardware-api.js +90 -0
  8. package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -0
  9. package/src/lib/components/console/pos/pos-reader-splash-api.d.ts +58 -0
  10. package/src/lib/components/console/pos/pos-reader-splash-api.js +101 -0
  11. package/src/lib/components/console/pos/pos-reader-splash-api.js.map +1 -0
  12. package/src/lib/components/console/pos-devices-card.component.js +5 -0
  13. package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
  14. package/src/lib/components/console/pos-hardware-card.component.d.ts +26 -0
  15. package/src/lib/components/console/pos-hardware-card.component.js +456 -0
  16. package/src/lib/components/console/pos-hardware-card.component.js.map +1 -0
  17. package/src/lib/components/console/pos-hardware-orders-staff-page.component.d.ts +14 -0
  18. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +519 -0
  19. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -0
  20. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.d.ts +27 -0
  21. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +444 -0
  22. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -0
  23. package/src/lib/components/console/pos-ops/pos-check-in-zone.component.d.ts +9 -0
  24. package/src/lib/components/console/pos-ops/pos-check-in-zone.component.js +37 -0
  25. package/src/lib/components/console/pos-ops/pos-check-in-zone.component.js.map +1 -0
  26. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +24 -0
  27. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +346 -0
  28. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -0
  29. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +5 -1
  30. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +83 -4
  31. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -1
  32. package/src/lib/components/console/pos-ops/pos-day-totals-card.component.d.ts +35 -0
  33. package/src/lib/components/console/pos-ops/pos-day-totals-card.component.js +546 -0
  34. package/src/lib/components/console/pos-ops/pos-day-totals-card.component.js.map +1 -0
  35. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +2 -1
  36. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +20 -1
  37. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
  38. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +1 -1
  39. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -1
  40. package/src/lib/components/console/pos-page.component.js +6 -3
  41. package/src/lib/components/console/pos-page.component.js.map +1 -1
  42. package/src/lib/components/console/pos-reader-splash-setting.component.d.ts +22 -0
  43. package/src/lib/components/console/pos-reader-splash-setting.component.js +275 -0
  44. package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -0
  45. package/src/lib/components/console/pos-reader-splash-staff-page.component.d.ts +14 -0
  46. package/src/lib/components/console/pos-reader-splash-staff-page.component.js +301 -0
  47. package/src/lib/components/console/pos-reader-splash-staff-page.component.js.map +1 -0
  48. package/src/lib/components/console/pos-zones.d.ts +37 -3
  49. package/src/lib/components/console/pos-zones.js +11 -1
  50. package/src/lib/components/console/pos-zones.js.map +1 -1
  51. package/src/lib/components/console/product-check-in-fields.component.d.ts +20 -0
  52. package/src/lib/components/console/product-check-in-fields.component.js +172 -0
  53. package/src/lib/components/console/product-check-in-fields.component.js.map +1 -0
  54. package/src/lib/components/console/product-editor-dialog.component.js +48 -9
  55. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  56. package/src/lib/components/console/product-register-fields.component.d.ts +12 -0
  57. package/src/lib/components/console/product-register-fields.component.js +39 -1
  58. package/src/lib/components/console/product-register-fields.component.js.map +1 -1
  59. package/src/lib/components/console/products-hub-card.component.js +21 -6
  60. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  61. package/src/lib/components/console/reservations-card.component.js +239 -70
  62. package/src/lib/components/console/reservations-card.component.js.map +1 -1
  63. package/src/lib/components/reservation-widget.js +16 -0
  64. package/src/lib/components/reservation-widget.js.map +1 -1
  65. package/src/lib/constants/operator-alerts.d.ts +6 -0
  66. package/src/lib/constants/operator-alerts.js +20 -1
  67. package/src/lib/constants/operator-alerts.js.map +1 -1
  68. package/src/lib/declarations.console-server.js +7 -0
  69. package/src/lib/declarations.console-server.js.map +1 -1
  70. package/src/lib/declarations.d.ts +26 -0
  71. package/src/lib/declarations.js +34 -0
  72. package/src/lib/declarations.js.map +1 -0
  73. package/src/lib/model/commerce-check-in-product.d.ts +37 -0
  74. package/src/lib/model/commerce-check-in-product.js +49 -0
  75. package/src/lib/model/commerce-check-in-product.js.map +1 -0
  76. package/src/lib/model/commerce-check-in.d.ts +187 -0
  77. package/src/lib/model/commerce-check-in.js +468 -0
  78. package/src/lib/model/commerce-check-in.js.map +1 -0
  79. package/src/lib/model/commerce-pos-day-report.d.ts +209 -0
  80. package/src/lib/model/commerce-pos-day-report.js +572 -0
  81. package/src/lib/model/commerce-pos-day-report.js.map +1 -0
  82. package/src/lib/model/commerce-pos-offline.d.ts +65 -3
  83. package/src/lib/model/commerce-pos-offline.js +104 -7
  84. package/src/lib/model/commerce-pos-offline.js.map +1 -1
  85. package/src/lib/model/commerce-pos-ops.d.ts +3 -0
  86. package/src/lib/model/commerce-pos-ops.js +1 -0
  87. package/src/lib/model/commerce-pos-ops.js.map +1 -1
  88. package/src/lib/model/commerce-pos.d.ts +43 -3
  89. package/src/lib/model/commerce-pos.js +73 -5
  90. package/src/lib/model/commerce-pos.js.map +1 -1
  91. package/src/lib/model/commerce-reservations.d.ts +73 -7
  92. package/src/lib/model/commerce-reservations.js +90 -10
  93. package/src/lib/model/commerce-reservations.js.map +1 -1
  94. package/src/lib/model/commerce.d.ts +40 -0
  95. package/src/lib/model/commerce.js +22 -4
  96. package/src/lib/model/commerce.js.map +1 -1
  97. package/src/lib/model/index.d.ts +1 -0
  98. package/src/lib/model/index.js +1 -0
  99. package/src/lib/model/index.js.map +1 -1
  100. package/src/lib/model/plugin-permissions.d.ts +1 -1
  101. package/src/lib/model/plugin-permissions.js +2 -1
  102. package/src/lib/model/plugin-permissions.js.map +1 -1
  103. package/src/lib/model/pos-hardware.d.ts +288 -0
  104. package/src/lib/model/pos-hardware.js +499 -0
  105. package/src/lib/model/pos-hardware.js.map +1 -0
  106. package/src/lib/model/pos-offline-card-limits.d.ts +20 -0
  107. package/src/lib/model/pos-offline-card-limits.js +28 -0
  108. package/src/lib/model/pos-offline-card-limits.js.map +1 -0
  109. package/src/lib/model/pos-reader-splash.d.ts +114 -0
  110. package/src/lib/model/pos-reader-splash.js +141 -0
  111. package/src/lib/model/pos-reader-splash.js.map +1 -0
  112. package/src/lib/model/product-write.d.ts +6 -0
  113. package/src/lib/plugin-config.d.ts +10 -0
  114. package/src/lib/plugin-config.js +40 -0
  115. package/src/lib/plugin-config.js.map +1 -1
  116. package/src/lib/plugin.js +28 -0
  117. package/src/lib/plugin.js.map +1 -1
  118. package/src/lib/server/cart-checkout.js +3 -1
  119. package/src/lib/server/cart-checkout.js.map +1 -1
  120. package/src/lib/server/cart.js +12 -1
  121. package/src/lib/server/cart.js.map +1 -1
  122. package/src/lib/server/catalog.js +49 -12
  123. package/src/lib/server/catalog.js.map +1 -1
  124. package/src/lib/server/checkout-extras.js +1 -1
  125. package/src/lib/server/checkout-extras.js.map +1 -1
  126. package/src/lib/server/checkout.js +7 -0
  127. package/src/lib/server/checkout.js.map +1 -1
  128. package/src/lib/server/person-eraser.d.ts +8 -1
  129. package/src/lib/server/person-eraser.js +23 -1
  130. package/src/lib/server/person-eraser.js.map +1 -1
  131. package/src/lib/server/pos-check-in.d.ts +49 -0
  132. package/src/lib/server/pos-check-in.js +652 -0
  133. package/src/lib/server/pos-check-in.js.map +1 -0
  134. package/src/lib/server/pos-day-report.d.ts +46 -0
  135. package/src/lib/server/pos-day-report.js +299 -0
  136. package/src/lib/server/pos-day-report.js.map +1 -0
  137. package/src/lib/server/pos-hardware-admin.d.ts +50 -0
  138. package/src/lib/server/pos-hardware-admin.js +366 -0
  139. package/src/lib/server/pos-hardware-admin.js.map +1 -0
  140. package/src/lib/server/pos-hardware-notify.d.ts +27 -0
  141. package/src/lib/server/pos-hardware-notify.js +142 -0
  142. package/src/lib/server/pos-hardware-notify.js.map +1 -0
  143. package/src/lib/server/pos-hardware-user-eraser.d.ts +26 -0
  144. package/src/lib/server/pos-hardware-user-eraser.js +67 -0
  145. package/src/lib/server/pos-hardware-user-eraser.js.map +1 -0
  146. package/src/lib/server/pos-hardware-webhook.d.ts +31 -0
  147. package/src/lib/server/pos-hardware-webhook.js +176 -0
  148. package/src/lib/server/pos-hardware-webhook.js.map +1 -0
  149. package/src/lib/server/pos-hardware.d.ts +58 -0
  150. package/src/lib/server/pos-hardware.js +234 -0
  151. package/src/lib/server/pos-hardware.js.map +1 -0
  152. package/src/lib/server/pos-offline-card-reconcile.d.ts +38 -0
  153. package/src/lib/server/pos-offline-card-reconcile.js +58 -0
  154. package/src/lib/server/pos-offline-card-reconcile.js.map +1 -0
  155. package/src/lib/server/pos-offline-sync.d.ts +32 -0
  156. package/src/lib/server/pos-offline-sync.js +191 -15
  157. package/src/lib/server/pos-offline-sync.js.map +1 -1
  158. package/src/lib/server/pos-ops-routes.d.ts +4 -2
  159. package/src/lib/server/pos-ops-routes.js +14 -2
  160. package/src/lib/server/pos-ops-routes.js.map +1 -1
  161. package/src/lib/server/pos-order.js +39 -51
  162. package/src/lib/server/pos-order.js.map +1 -1
  163. package/src/lib/server/pos-payment.js +8 -4
  164. package/src/lib/server/pos-payment.js.map +1 -1
  165. package/src/lib/server/pos-reader-splash-admin.d.ts +36 -0
  166. package/src/lib/server/pos-reader-splash-admin.js +295 -0
  167. package/src/lib/server/pos-reader-splash-admin.js.map +1 -0
  168. package/src/lib/server/pos-reader-splash-render.d.ts +40 -0
  169. package/src/lib/server/pos-reader-splash-render.js +138 -0
  170. package/src/lib/server/pos-reader-splash-render.js.map +1 -0
  171. package/src/lib/server/pos-reader-splash-server.d.ts +32 -0
  172. package/src/lib/server/pos-reader-splash-server.js +32 -0
  173. package/src/lib/server/pos-reader-splash-server.js.map +1 -0
  174. package/src/lib/server/pos-reader-splash.d.ts +105 -0
  175. package/src/lib/server/pos-reader-splash.js +548 -0
  176. package/src/lib/server/pos-reader-splash.js.map +1 -0
  177. package/src/lib/server/pos-sale.d.ts +2 -1
  178. package/src/lib/server/pos-sale.js +3 -1
  179. package/src/lib/server/pos-sale.js.map +1 -1
  180. package/src/lib/server/pos-terminal.d.ts +67 -4
  181. package/src/lib/server/pos-terminal.js +239 -32
  182. package/src/lib/server/pos-terminal.js.map +1 -1
  183. package/src/lib/server/process-restock.js +4 -0
  184. package/src/lib/server/process-restock.js.map +1 -1
  185. package/src/lib/server/product-card.js +2 -2
  186. package/src/lib/server/product-card.js.map +1 -1
  187. package/src/lib/server/product-catalog.d.ts +2 -0
  188. package/src/lib/server/product-catalog.js +11 -4
  189. package/src/lib/server/product-catalog.js.map +1 -1
  190. package/src/lib/server/product.js +3 -1
  191. package/src/lib/server/product.js.map +1 -1
  192. package/src/lib/server/related.js +8 -1
  193. package/src/lib/server/related.js.map +1 -1
  194. package/src/lib/server/reservation-availability-query.d.ts +35 -0
  195. package/src/lib/server/reservation-availability-query.js +34 -0
  196. package/src/lib/server/reservation-availability-query.js.map +1 -0
  197. package/src/lib/server/reservation-availability.d.ts +21 -0
  198. package/src/lib/server/reservation-availability.js +64 -10
  199. package/src/lib/server/reservation-availability.js.map +1 -1
  200. package/src/lib/server/reservation-walk-in.d.ts +28 -0
  201. package/src/lib/server/reservation-walk-in.js +166 -0
  202. package/src/lib/server/reservation-walk-in.js.map +1 -0
  203. package/src/lib/server/reserve.js +13 -10
  204. package/src/lib/server/reserve.js.map +1 -1
  205. package/src/lib/server/reviews.js +3 -1
  206. package/src/lib/server/reviews.js.map +1 -1
  207. package/src/lib/server/site-page-resolver.js +5 -2
  208. package/src/lib/server/site-page-resolver.js.map +1 -1
  209. package/src/lib/server.js +26 -0
  210. package/src/lib/server.js.map +1 -1
  211. package/src/lib/testing/fake-firestore.js +72 -0
  212. package/src/lib/testing/fake-firestore.js.map +1 -1
@@ -0,0 +1,519 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ import { pluginDocsHelp } from "@aglyn/aglyn";
20
+ import { resolveStaffRoleGate } from "@aglyn/aglyn/app-utils/staff-role-gate";
21
+ import { CardDisplay, useConfirmationContext } from "@aglyn/shared-ui-jsx";
22
+ import { BlockedControl } from "@aglyn/shared-ui-jsx/components/blocked-control.component";
23
+ import { ListPagination } from "@aglyn/shared-ui-jsx/components/list-pagination.component";
24
+ import { ListTable } from "@aglyn/shared-ui-jsx/components/list-table.component";
25
+ import { useSnackbar } from "@aglyn/shared-ui-snackstack";
26
+ import { useUser } from "@aglyn/tenant-feature-instance";
27
+ import { Alert, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Link, MenuItem, Stack, TextField, Typography } from "@mui/material";
28
+ import { useCallback, useEffect, useMemo, useState } from "react";
29
+ import { formatPosHardwareCents, nextPosHardwareStatus, POS_HARDWARE_ORDER_STATUSES, POS_HARDWARE_STAFF_STATUS_LABELS, posHardwareRefundable, posHardwareSku } from "../../model/pos-hardware.js";
30
+ import { POS_HARDWARE_STATUS_COLOR } from "./pos-hardware-card.component.js";
31
+ import { PosHardwareRequestError, staffHardwareOrderAction, staffHardwareOrders } from "./pos/pos-hardware-api.js";
32
+ const WRITE_ROLES = [
33
+ 'super',
34
+ 'billing'
35
+ ];
36
+ const NOT_REFUNDABLE = 'Only an order that has not shipped can be canceled or refunded.';
37
+ const CLOSED = 'A canceled or refunded order can no longer change.';
38
+ /** A control disabled with its reason, or passed through when there is none. */ function Guarded(props) {
39
+ var _props_reason;
40
+ return /*#__PURE__*/ _jsx(BlockedControl, {
41
+ blocked: Boolean(props.reason),
42
+ reason: (_props_reason = props.reason) != null ? _props_reason : '',
43
+ children: props.children
44
+ });
45
+ }
46
+ const when = (ms)=>ms ? new Date(ms).toLocaleString() : '—';
47
+ function shipTo(order) {
48
+ var _order_shipping, _order_shipping1;
49
+ const address = (_order_shipping = order.shipping) == null ? void 0 : _order_shipping.address;
50
+ if (!address) {
51
+ var _order_shipping2;
52
+ // The buyer's account was erased: only the tax region is left (AGL-4038).
53
+ const region = (_order_shipping2 = order.shipping) == null ? void 0 : _order_shipping2.taxRegion;
54
+ return region ? [
55
+ [
56
+ region.state,
57
+ region.postalCode
58
+ ].filter(Boolean).join(' '),
59
+ region.country
60
+ ].filter(Boolean).join('\n') : '—';
61
+ }
62
+ return [
63
+ (_order_shipping1 = order.shipping) == null ? void 0 : _order_shipping1.name,
64
+ address.line1,
65
+ address.line2,
66
+ `${address.city}${address.state ? `, ${address.state}` : ''} ${address.postalCode}`,
67
+ address.country
68
+ ].filter(Boolean).join('\n');
69
+ }
70
+ /**
71
+ * Staff → Hardware orders (AGL-4038): every workspace's orders from the POS
72
+ * hardware shop, newest first. In phase 1 a person places each one in the
73
+ * Stripe Dashboard's Terminal hardware shop, then records Stripe's order id
74
+ * and the tracking here and moves the order along; the merchant is emailed
75
+ * as it ships and is delivered. Canceling or refunding returns the whole
76
+ * payment and is offered only before the order ships.
77
+ */ export function PosHardwareOrdersStaffPage(props) {
78
+ var _ref, _ref1;
79
+ var _open_shipping, _open_shipping1;
80
+ const { staffRole = null, staffPaths } = props;
81
+ const { data: user } = useUser();
82
+ const { enqueueSnackbar } = useSnackbar();
83
+ const { confirm } = useConfirmationContext();
84
+ const [status, setStatus] = useState('paid');
85
+ const [orders, setOrders] = useState(null);
86
+ // The cursor that opens each page: `cursors[page]` is the `after` its
87
+ // request carries, so Previous re-reads a page rather than keeping every
88
+ // page read so far in memory.
89
+ const [cursors, setCursors] = useState([
90
+ null
91
+ ]);
92
+ const [page, setPage] = useState(0);
93
+ const [nextPage, setNextPage] = useState(null);
94
+ const [pageSize, setPageSize] = useState(25);
95
+ const [error, setError] = useState(null);
96
+ const [open, setOpen] = useState(null);
97
+ const [busy, setBusy] = useState(false);
98
+ const [form, setForm] = useState({
99
+ stripeHardwareOrderId: '',
100
+ carrier: '',
101
+ number: '',
102
+ url: ''
103
+ });
104
+ const gate = resolveStaffRoleGate(staffRole, WRITE_ROLES);
105
+ const uid = (_ref = user == null ? void 0 : user.uid) != null ? _ref : '';
106
+ const load = useCallback(async (targetPage = 0, after = null)=>{
107
+ if (!user) return;
108
+ setError(null);
109
+ try {
110
+ const answer = await staffHardwareOrders(user, status, after);
111
+ setOrders(answer.orders);
112
+ setPage(targetPage);
113
+ setNextPage(answer.next);
114
+ setPageSize(answer.pageSize);
115
+ setCursors((existing)=>{
116
+ const kept = existing.slice(0, targetPage + 1);
117
+ return answer.next ? [
118
+ ...kept,
119
+ answer.next
120
+ ] : kept;
121
+ });
122
+ } catch (caught) {
123
+ setOrders([]);
124
+ setError(caught instanceof PosHardwareRequestError ? caught.message : 'Hardware orders could not be read');
125
+ }
126
+ // eslint-disable-next-line react-hooks/exhaustive-deps
127
+ }, [
128
+ uid,
129
+ status
130
+ ]);
131
+ useEffect(()=>{
132
+ void load();
133
+ }, [
134
+ load
135
+ ]);
136
+ const openOrder = (order)=>{
137
+ var _order_stripeHardwareOrderId, _ref, _ref1, _ref2;
138
+ var _order_tracking, _order_tracking1, _order_tracking2;
139
+ setOpen(order);
140
+ setForm({
141
+ stripeHardwareOrderId: (_order_stripeHardwareOrderId = order.stripeHardwareOrderId) != null ? _order_stripeHardwareOrderId : '',
142
+ carrier: (_ref = (_order_tracking = order.tracking) == null ? void 0 : _order_tracking.carrier) != null ? _ref : '',
143
+ number: (_ref1 = (_order_tracking1 = order.tracking) == null ? void 0 : _order_tracking1.number) != null ? _ref1 : '',
144
+ url: (_ref2 = (_order_tracking2 = order.tracking) == null ? void 0 : _order_tracking2.url) != null ? _ref2 : ''
145
+ });
146
+ };
147
+ const act = async (body, done)=>{
148
+ if (!user || !open) return;
149
+ setBusy(true);
150
+ try {
151
+ var _cursors_page;
152
+ const { order } = await staffHardwareOrderAction(user, _extends({}, body, {
153
+ orgId: open.orgId,
154
+ orderId: open.id
155
+ }));
156
+ setOpen(order);
157
+ enqueueSnackbar(done, {
158
+ variant: 'success',
159
+ persist: false
160
+ });
161
+ await load(page, (_cursors_page = cursors[page]) != null ? _cursors_page : null);
162
+ } catch (caught) {
163
+ enqueueSnackbar(caught instanceof PosHardwareRequestError ? caught.message : 'The order could not be changed', {
164
+ variant: 'warning',
165
+ persist: false
166
+ });
167
+ } finally{
168
+ setBusy(false);
169
+ }
170
+ };
171
+ const formTracking = ()=>form.carrier.trim() && form.number.trim() ? _extends({
172
+ carrier: form.carrier.trim(),
173
+ number: form.number.trim()
174
+ }, form.url.trim() ? {
175
+ url: form.url.trim()
176
+ } : {}) : undefined;
177
+ const save = (advance)=>{
178
+ const tracking = formTracking();
179
+ void act(_extends({
180
+ action: 'update',
181
+ stripeHardwareOrderId: form.stripeHardwareOrderId.trim() || null
182
+ }, tracking ? {
183
+ tracking
184
+ } : {}, advance ? {
185
+ status: advance
186
+ } : {}), advance ? `Marked ${POS_HARDWARE_STAFF_STATUS_LABELS[advance].toLowerCase()}` : 'Saved');
187
+ };
188
+ const returnMoney = async (action)=>{
189
+ if (!open) return;
190
+ const confirmed = await confirm({
191
+ title: action === 'cancel' ? 'Cancel and refund this order?' : 'Refund this order?',
192
+ description: `${formatPosHardwareCents(open.totalCents)} goes back to the card it was paid with. ` + 'Cancel the order in the Stripe Dashboard too if it was already placed there.',
193
+ confirmationText: action === 'cancel' ? 'Cancel and refund' : 'Refund',
194
+ confirmationButtonProps: {
195
+ color: 'error'
196
+ }
197
+ }).then(()=>true).catch(()=>false);
198
+ if (confirmed) await act({
199
+ action
200
+ }, action === 'cancel' ? 'Canceled and refunded' : 'Refunded');
201
+ };
202
+ const columns = useMemo(()=>[
203
+ {
204
+ field: 'number',
205
+ headerName: 'Order',
206
+ minWidth: 110
207
+ },
208
+ {
209
+ field: 'createdAtMs',
210
+ headerName: 'Placed',
211
+ type: 'number',
212
+ minWidth: 170,
213
+ align: 'left',
214
+ headerAlign: 'left',
215
+ valueFormatter: (value)=>when(value)
216
+ },
217
+ {
218
+ field: 'orgId',
219
+ headerName: 'Workspace',
220
+ minWidth: 160,
221
+ renderCell: ({ row })=>{
222
+ const href = staffPaths == null ? void 0 : staffPaths.orgDetail(row.orgId);
223
+ return href ? /*#__PURE__*/ _jsx(Link, {
224
+ href: href,
225
+ onClick: (event)=>event.stopPropagation(),
226
+ children: row.orgId
227
+ }) : row.orgId;
228
+ }
229
+ },
230
+ {
231
+ field: 'items',
232
+ headerName: 'Items',
233
+ flex: 1,
234
+ minWidth: 200,
235
+ valueGetter: (_value, row)=>row.lines.map((line)=>`${line.quantity} × ${line.name}`).join(', ')
236
+ },
237
+ {
238
+ field: 'totalCents',
239
+ headerName: 'Total',
240
+ type: 'number',
241
+ minWidth: 100,
242
+ valueFormatter: (value)=>formatPosHardwareCents(value)
243
+ },
244
+ {
245
+ field: 'shippingMethod',
246
+ headerName: 'Shipping',
247
+ minWidth: 140,
248
+ valueGetter: (_value, row)=>{
249
+ var _ref;
250
+ var _row_shipping;
251
+ return (_ref = (_row_shipping = row.shipping) == null ? void 0 : _row_shipping.label) != null ? _ref : '';
252
+ }
253
+ },
254
+ {
255
+ field: 'status',
256
+ headerName: 'Status',
257
+ minWidth: 160,
258
+ valueGetter: (_value, row)=>POS_HARDWARE_STAFF_STATUS_LABELS[row.status],
259
+ renderCell: ({ row })=>/*#__PURE__*/ _jsx(Chip, {
260
+ size: "small",
261
+ color: POS_HARDWARE_STATUS_COLOR[row.status],
262
+ label: POS_HARDWARE_STAFF_STATUS_LABELS[row.status] + (row.livemode ? '' : ' · test')
263
+ })
264
+ },
265
+ {
266
+ field: 'stripeHardwareOrderId',
267
+ headerName: 'Stripe order',
268
+ minWidth: 150,
269
+ valueGetter: (value)=>value != null ? value : ''
270
+ },
271
+ {
272
+ field: 'tracking',
273
+ headerName: 'Tracking',
274
+ minWidth: 160,
275
+ valueGetter: (_value, row)=>{
276
+ var _ref;
277
+ var _row_tracking;
278
+ return (_ref = (_row_tracking = row.tracking) == null ? void 0 : _row_tracking.number) != null ? _ref : '';
279
+ }
280
+ }
281
+ ], [
282
+ staffPaths
283
+ ]);
284
+ const next = open ? nextPosHardwareStatus(open.status) : null;
285
+ const closed = open ? open.status === 'canceled' || open.status === 'refunded' : true;
286
+ const refundable = open ? posHardwareRefundable(open.status) && !open.refundPending : false;
287
+ const writeReason = gate.blocked ? gate.reason : undefined;
288
+ return /*#__PURE__*/ _jsxs(CardDisplay, {
289
+ header: 'Hardware orders',
290
+ help: pluginDocsHelp('posHardware', {
291
+ anchor: '#hardware-purchase-records'
292
+ }),
293
+ subheader: 'Card readers bought from the POS hardware shop',
294
+ HeaderProps: {
295
+ action: /*#__PURE__*/ _jsxs(TextField, {
296
+ select: true,
297
+ size: "small",
298
+ label: "Status",
299
+ value: status,
300
+ onChange: (event)=>setStatus(event.target.value),
301
+ children: [
302
+ /*#__PURE__*/ _jsx(MenuItem, {
303
+ value: "",
304
+ children: 'All'
305
+ }),
306
+ POS_HARDWARE_ORDER_STATUSES.map((value)=>/*#__PURE__*/ _jsx(MenuItem, {
307
+ value: value,
308
+ children: POS_HARDWARE_STAFF_STATUS_LABELS[value]
309
+ }, value))
310
+ ]
311
+ })
312
+ },
313
+ contentGutterX: true,
314
+ contentGutterY: true,
315
+ children: [
316
+ /*#__PURE__*/ _jsxs(Stack, {
317
+ spacing: 2,
318
+ children: [
319
+ error ? /*#__PURE__*/ _jsx(Alert, {
320
+ severity: "error",
321
+ children: error
322
+ }) : null,
323
+ orders && orders.length === 0 && !error ? /*#__PURE__*/ _jsx(Typography, {
324
+ variant: "body2",
325
+ color: "text.secondary",
326
+ children: status ? `No orders are ${POS_HARDWARE_STAFF_STATUS_LABELS[status].toLowerCase()}.` : 'No hardware orders yet.'
327
+ }) : /*#__PURE__*/ _jsx(ListTable, {
328
+ rows: (orders != null ? orders : []).map((order)=>_extends({}, order, {
329
+ $id: order.id
330
+ })),
331
+ columns: columns,
332
+ loading: orders === null,
333
+ hideFooter: true,
334
+ onOpen: (_id, row)=>openOrder(row)
335
+ }),
336
+ orders && (orders.length || page > 0) ? /*#__PURE__*/ _jsx(ListPagination, {
337
+ page: page,
338
+ pageSize: pageSize,
339
+ rowCount: orders.length,
340
+ hasMore: Boolean(nextPage),
341
+ onPageChange: (target)=>{
342
+ var _cursors_target;
343
+ return void load(target, (_cursors_target = cursors[target]) != null ? _cursors_target : null);
344
+ }
345
+ }) : null
346
+ ]
347
+ }),
348
+ /*#__PURE__*/ _jsxs(Dialog, {
349
+ open: Boolean(open),
350
+ onClose: ()=>setOpen(null),
351
+ maxWidth: "sm",
352
+ fullWidth: true,
353
+ children: [
354
+ /*#__PURE__*/ _jsx(DialogTitle, {
355
+ children: open ? `Hardware order ${open.number}` : ''
356
+ }),
357
+ open ? /*#__PURE__*/ _jsxs(DialogContent, {
358
+ sx: {
359
+ display: 'flex',
360
+ flexDirection: 'column',
361
+ gap: 2
362
+ },
363
+ children: [
364
+ /*#__PURE__*/ _jsxs(Stack, {
365
+ spacing: 0.5,
366
+ sx: {
367
+ mt: 1
368
+ },
369
+ children: [
370
+ /*#__PURE__*/ _jsx(Typography, {
371
+ variant: "subtitle2",
372
+ children: 'Order in the Stripe hardware shop'
373
+ }),
374
+ open.lines.map((line)=>{
375
+ var _ref;
376
+ var _posHardwareSku;
377
+ return /*#__PURE__*/ _jsx(Typography, {
378
+ variant: "body2",
379
+ children: `${line.quantity} × ${(_ref = (_posHardwareSku = posHardwareSku(line.sku)) == null ? void 0 : _posHardwareSku.stripeProductName) != null ? _ref : line.name}`
380
+ }, line.sku);
381
+ }),
382
+ /*#__PURE__*/ _jsx(Typography, {
383
+ variant: "body2",
384
+ color: "text.secondary",
385
+ children: `${(_ref1 = (_open_shipping = open.shipping) == null ? void 0 : _open_shipping.label) != null ? _ref1 : 'Shipping'} · paid ${formatPosHardwareCents(open.totalCents)}`
386
+ })
387
+ ]
388
+ }),
389
+ /*#__PURE__*/ _jsxs(Stack, {
390
+ spacing: 0.5,
391
+ children: [
392
+ /*#__PURE__*/ _jsx(Typography, {
393
+ variant: "subtitle2",
394
+ children: 'Ship to'
395
+ }),
396
+ /*#__PURE__*/ _jsx(Typography, {
397
+ variant: "body2",
398
+ sx: {
399
+ whiteSpace: 'pre-line'
400
+ },
401
+ children: shipTo(open)
402
+ }),
403
+ /*#__PURE__*/ _jsx(Typography, {
404
+ variant: "body2",
405
+ color: "text.secondary",
406
+ children: [
407
+ (_open_shipping1 = open.shipping) == null ? void 0 : _open_shipping1.phone,
408
+ open.contactEmail
409
+ ].filter(Boolean).join(' · ')
410
+ })
411
+ ]
412
+ }),
413
+ /*#__PURE__*/ _jsx(TextField, {
414
+ label: "Stripe hardware order id",
415
+ value: form.stripeHardwareOrderId,
416
+ disabled: closed,
417
+ onChange: (event)=>setForm(_extends({}, form, {
418
+ stripeHardwareOrderId: event.target.value
419
+ }))
420
+ }),
421
+ /*#__PURE__*/ _jsxs(Stack, {
422
+ direction: {
423
+ xs: 'column',
424
+ sm: 'row'
425
+ },
426
+ spacing: 2,
427
+ children: [
428
+ /*#__PURE__*/ _jsx(TextField, {
429
+ label: "Carrier",
430
+ value: form.carrier,
431
+ disabled: closed,
432
+ onChange: (event)=>setForm(_extends({}, form, {
433
+ carrier: event.target.value
434
+ }))
435
+ }),
436
+ /*#__PURE__*/ _jsx(TextField, {
437
+ label: "Tracking number",
438
+ value: form.number,
439
+ disabled: closed,
440
+ onChange: (event)=>setForm(_extends({}, form, {
441
+ number: event.target.value
442
+ })),
443
+ sx: {
444
+ flex: 1
445
+ }
446
+ })
447
+ ]
448
+ }),
449
+ /*#__PURE__*/ _jsx(TextField, {
450
+ label: "Tracking link (optional)",
451
+ helperText: "Built from the carrier when left empty",
452
+ value: form.url,
453
+ disabled: closed,
454
+ onChange: (event)=>setForm(_extends({}, form, {
455
+ url: event.target.value
456
+ }))
457
+ }),
458
+ open.refundPending ? /*#__PURE__*/ _jsx(Alert, {
459
+ severity: "warning",
460
+ children: 'A refund is in progress.'
461
+ }) : null
462
+ ]
463
+ }) : null,
464
+ /*#__PURE__*/ _jsxs(DialogActions, {
465
+ sx: {
466
+ flexWrap: 'wrap',
467
+ gap: 1
468
+ },
469
+ children: [
470
+ /*#__PURE__*/ _jsx(Guarded, {
471
+ reason: writeReason != null ? writeReason : refundable ? undefined : NOT_REFUNDABLE,
472
+ children: /*#__PURE__*/ _jsx(Button, {
473
+ color: "error",
474
+ disabled: busy,
475
+ onClick: ()=>void returnMoney('cancel'),
476
+ children: 'Cancel and refund'
477
+ })
478
+ }),
479
+ /*#__PURE__*/ _jsx(Guarded, {
480
+ reason: writeReason != null ? writeReason : refundable ? undefined : NOT_REFUNDABLE,
481
+ children: /*#__PURE__*/ _jsx(Button, {
482
+ color: "error",
483
+ disabled: busy,
484
+ onClick: ()=>void returnMoney('refund'),
485
+ children: 'Refund'
486
+ })
487
+ }),
488
+ /*#__PURE__*/ _jsx(Button, {
489
+ onClick: ()=>setOpen(null),
490
+ children: 'Close'
491
+ }),
492
+ /*#__PURE__*/ _jsx(Guarded, {
493
+ reason: writeReason != null ? writeReason : closed ? CLOSED : undefined,
494
+ children: /*#__PURE__*/ _jsx(Button, {
495
+ disabled: busy,
496
+ onClick: ()=>save(),
497
+ children: 'Save'
498
+ })
499
+ }),
500
+ next ? /*#__PURE__*/ _jsx(Guarded, {
501
+ reason: writeReason != null ? writeReason : next === 'shipped' && !form.number.trim() ? 'Add the tracking number first.' : undefined,
502
+ children: /*#__PURE__*/ _jsx(Button, {
503
+ variant: "contained",
504
+ disabled: busy,
505
+ onClick: ()=>save(next),
506
+ children: `Mark ${POS_HARDWARE_STAFF_STATUS_LABELS[next].toLowerCase()}`
507
+ })
508
+ }) : null
509
+ ]
510
+ })
511
+ ]
512
+ })
513
+ ]
514
+ });
515
+ }
516
+ PosHardwareOrdersStaffPage.displayName = 'PosHardwareOrdersStaffPage';
517
+ export default PosHardwareOrdersStaffPage;
518
+
519
+ //# sourceMappingURL=pos-hardware-orders-staff-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-hardware-orders-staff-page.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport type { ConsoleStaffPageProps } from '@aglyn/aglyn'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport { resolveStaffRoleGate } from '@aglyn/aglyn/app-utils/staff-role-gate'\nimport { CardDisplay, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { BlockedControl } from '@aglyn/shared-ui-jsx/components/blocked-control.component'\nimport { ListPagination } from '@aglyn/shared-ui-jsx/components/list-pagination.component'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Alert,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Link,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { useCallback, useEffect, useMemo, useState, type ReactElement } from 'react'\nimport {\n formatPosHardwareCents,\n nextPosHardwareStatus,\n POS_HARDWARE_ORDER_STATUSES,\n POS_HARDWARE_STAFF_STATUS_LABELS,\n posHardwareRefundable,\n posHardwareSku,\n type PosHardwareOrderStatus,\n} from '../../model/pos-hardware'\nimport { POS_HARDWARE_STATUS_COLOR } from './pos-hardware-card.component'\nimport {\n PosHardwareRequestError,\n staffHardwareOrderAction,\n staffHardwareOrders,\n type StaffHardwareOrderRow,\n} from './pos/pos-hardware-api'\n\nconst WRITE_ROLES = ['super', 'billing'] as const\n\nconst NOT_REFUNDABLE = 'Only an order that has not shipped can be canceled or refunded.'\nconst CLOSED = 'A canceled or refunded order can no longer change.'\n\n/** A control disabled with its reason, or passed through when there is none. */\nfunction Guarded(props: { reason?: string; children: ReactElement<{ disabled?: boolean }> }) {\n return (\n <BlockedControl blocked={Boolean(props.reason)} reason={props.reason ?? ''}>\n {props.children}\n </BlockedControl>\n )\n}\n\nconst when = (ms: number) => (ms ? new Date(ms).toLocaleString() : '—')\n\nfunction shipTo(order: StaffHardwareOrderRow): string {\n const address = order.shipping?.address\n if (!address) {\n // The buyer's account was erased: only the tax region is left (AGL-4038).\n const region = order.shipping?.taxRegion\n return region\n ? [[region.state, region.postalCode].filter(Boolean).join(' '), region.country].filter(Boolean).join('\\n')\n : '—'\n }\n return [\n order.shipping?.name,\n address.line1,\n address.line2,\n `${address.city}${address.state ? `, ${address.state}` : ''} ${address.postalCode}`,\n address.country,\n ]\n .filter(Boolean)\n .join('\\n')\n}\n\n/**\n * Staff → Hardware orders (AGL-4038): every workspace's orders from the POS\n * hardware shop, newest first. In phase 1 a person places each one in the\n * Stripe Dashboard's Terminal hardware shop, then records Stripe's order id\n * and the tracking here and moves the order along; the merchant is emailed\n * as it ships and is delivered. Canceling or refunding returns the whole\n * payment and is offered only before the order ships.\n */\nexport function PosHardwareOrdersStaffPage(props: ConsoleStaffPageProps) {\n const { staffRole = null, staffPaths } = props\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const [status, setStatus] = useState<PosHardwareOrderStatus | ''>('paid')\n const [orders, setOrders] = useState<StaffHardwareOrderRow[] | null>(null)\n // The cursor that opens each page: `cursors[page]` is the `after` its\n // request carries, so Previous re-reads a page rather than keeping every\n // page read so far in memory.\n const [cursors, setCursors] = useState<Array<string | null>>([null])\n const [page, setPage] = useState(0)\n const [nextPage, setNextPage] = useState<string | null>(null)\n const [pageSize, setPageSize] = useState(25)\n const [error, setError] = useState<string | null>(null)\n const [open, setOpen] = useState<StaffHardwareOrderRow | null>(null)\n const [busy, setBusy] = useState(false)\n const [form, setForm] = useState({ stripeHardwareOrderId: '', carrier: '', number: '', url: '' })\n const gate = resolveStaffRoleGate(staffRole, WRITE_ROLES)\n const uid = user?.uid ?? ''\n\n const load = useCallback(async (targetPage = 0, after: string | null = null) => {\n if (!user) return\n setError(null)\n try {\n const answer = await staffHardwareOrders(user, status, after)\n setOrders(answer.orders)\n setPage(targetPage)\n setNextPage(answer.next)\n setPageSize(answer.pageSize)\n setCursors((existing) => {\n const kept = existing.slice(0, targetPage + 1)\n return answer.next ? [...kept, answer.next] : kept\n })\n } catch (caught) {\n setOrders([])\n setError(caught instanceof PosHardwareRequestError ? caught.message : 'Hardware orders could not be read')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, status])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const openOrder = (order: StaffHardwareOrderRow) => {\n setOpen(order)\n setForm({\n stripeHardwareOrderId: order.stripeHardwareOrderId ?? '',\n carrier: order.tracking?.carrier ?? '',\n number: order.tracking?.number ?? '',\n url: order.tracking?.url ?? '',\n })\n }\n\n const act = async (\n body: Omit<Parameters<typeof staffHardwareOrderAction>[1], 'orgId' | 'orderId'>,\n done: string,\n ) => {\n if (!user || !open) return\n setBusy(true)\n try {\n const { order } = await staffHardwareOrderAction(user, { ...body, orgId: open.orgId, orderId: open.id })\n setOpen(order)\n enqueueSnackbar(done, { variant: 'success', persist: false })\n await load(page, cursors[page] ?? null)\n } catch (caught) {\n enqueueSnackbar(\n caught instanceof PosHardwareRequestError ? caught.message : 'The order could not be changed',\n { variant: 'warning', persist: false },\n )\n } finally {\n setBusy(false)\n }\n }\n\n const formTracking = () =>\n form.carrier.trim() && form.number.trim()\n ? { carrier: form.carrier.trim(), number: form.number.trim(), ...(form.url.trim() ? { url: form.url.trim() } : {}) }\n : undefined\n\n const save = (advance?: PosHardwareOrderStatus) => {\n const tracking = formTracking()\n void act(\n {\n action: 'update',\n stripeHardwareOrderId: form.stripeHardwareOrderId.trim() || null,\n ...(tracking ? { tracking } : {}),\n ...(advance ? { status: advance } : {}),\n },\n advance ? `Marked ${POS_HARDWARE_STAFF_STATUS_LABELS[advance].toLowerCase()}` : 'Saved',\n )\n }\n\n const returnMoney = async (action: 'cancel' | 'refund') => {\n if (!open) return\n const confirmed = await confirm({\n title: action === 'cancel' ? 'Cancel and refund this order?' : 'Refund this order?',\n description:\n `${formatPosHardwareCents(open.totalCents)} goes back to the card it was paid with. ` +\n 'Cancel the order in the Stripe Dashboard too if it was already placed there.',\n confirmationText: action === 'cancel' ? 'Cancel and refund' : 'Refund',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (confirmed) await act({ action }, action === 'cancel' ? 'Canceled and refunded' : 'Refunded')\n }\n\n const columns = useMemo<GridColDef[]>(\n () => [\n { field: 'number', headerName: 'Order', minWidth: 110 },\n {\n field: 'createdAtMs',\n headerName: 'Placed',\n type: 'number',\n minWidth: 170,\n align: 'left',\n headerAlign: 'left',\n valueFormatter: (value: number) => when(value),\n },\n {\n field: 'orgId',\n headerName: 'Workspace',\n minWidth: 160,\n renderCell: ({ row }: { row: StaffHardwareOrderRow }) => {\n const href = staffPaths?.orgDetail(row.orgId)\n return href ? (\n <Link href={href} onClick={(event) => event.stopPropagation()}>\n {row.orgId}\n </Link>\n ) : (\n row.orgId\n )\n },\n },\n {\n field: 'items',\n headerName: 'Items',\n flex: 1,\n minWidth: 200,\n valueGetter: (_value: unknown, row: StaffHardwareOrderRow) =>\n row.lines.map((line) => `${line.quantity} × ${line.name}`).join(', '),\n },\n {\n field: 'totalCents',\n headerName: 'Total',\n type: 'number',\n minWidth: 100,\n valueFormatter: (value: number) => formatPosHardwareCents(value),\n },\n {\n field: 'shippingMethod',\n headerName: 'Shipping',\n minWidth: 140,\n valueGetter: (_value: unknown, row: StaffHardwareOrderRow) => row.shipping?.label ?? '',\n },\n {\n field: 'status',\n headerName: 'Status',\n minWidth: 160,\n valueGetter: (_value: unknown, row: StaffHardwareOrderRow) => POS_HARDWARE_STAFF_STATUS_LABELS[row.status],\n renderCell: ({ row }: { row: StaffHardwareOrderRow }) => (\n <Chip\n size=\"small\"\n color={POS_HARDWARE_STATUS_COLOR[row.status]}\n label={POS_HARDWARE_STAFF_STATUS_LABELS[row.status] + (row.livemode ? '' : ' · test')}\n />\n ),\n },\n {\n field: 'stripeHardwareOrderId',\n headerName: 'Stripe order',\n minWidth: 150,\n valueGetter: (value: string | null) => value ?? '',\n },\n {\n field: 'tracking',\n headerName: 'Tracking',\n minWidth: 160,\n valueGetter: (_value: unknown, row: StaffHardwareOrderRow) => row.tracking?.number ?? '',\n },\n ],\n [staffPaths],\n )\n\n const next = open ? nextPosHardwareStatus(open.status) : null\n const closed = open ? open.status === 'canceled' || open.status === 'refunded' : true\n const refundable = open ? posHardwareRefundable(open.status) && !open.refundPending : false\n const writeReason = gate.blocked ? gate.reason : undefined\n\n return (\n <CardDisplay\n header={'Hardware orders'}\n help={pluginDocsHelp('posHardware', { anchor: '#hardware-purchase-records' })}\n subheader={'Card readers bought from the POS hardware shop'}\n HeaderProps={{\n action: (\n <TextField\n select\n size=\"small\"\n label=\"Status\"\n value={status}\n onChange={(event) => setStatus(event.target.value as PosHardwareOrderStatus | '')}\n >\n <MenuItem value=\"\">{'All'}</MenuItem>\n {POS_HARDWARE_ORDER_STATUSES.map((value) => (\n <MenuItem key={value} value={value}>\n {POS_HARDWARE_STAFF_STATUS_LABELS[value]}\n </MenuItem>\n ))}\n </TextField>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n {error ? <Alert severity=\"error\">{error}</Alert> : null}\n {orders && orders.length === 0 && !error ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {status ? `No orders are ${POS_HARDWARE_STAFF_STATUS_LABELS[status].toLowerCase()}.` : 'No hardware orders yet.'}\n </Typography>\n ) : (\n <ListTable\n rows={(orders ?? []).map((order) => ({ ...order, $id: order.id }))}\n columns={columns}\n loading={orders === null}\n hideFooter\n onOpen={(_id, row) => openOrder(row as StaffHardwareOrderRow)}\n />\n )}\n {orders && (orders.length || page > 0) ? (\n <ListPagination\n page={page}\n pageSize={pageSize}\n rowCount={orders.length}\n hasMore={Boolean(nextPage)}\n onPageChange={(target) => void load(target, cursors[target] ?? null)}\n />\n ) : null}\n </Stack>\n\n <Dialog open={Boolean(open)} onClose={() => setOpen(null)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>{open ? `Hardware order ${open.number}` : ''}</DialogTitle>\n {open ? (\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Stack spacing={0.5} sx={{ mt: 1 }}>\n <Typography variant=\"subtitle2\">{'Order in the Stripe hardware shop'}</Typography>\n {open.lines.map((line) => (\n <Typography key={line.sku} variant=\"body2\">\n {`${line.quantity} × ${posHardwareSku(line.sku)?.stripeProductName ?? line.name}`}\n </Typography>\n ))}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${open.shipping?.label ?? 'Shipping'} · paid ${formatPosHardwareCents(open.totalCents)}`}\n </Typography>\n </Stack>\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\">{'Ship to'}</Typography>\n <Typography variant=\"body2\" sx={{ whiteSpace: 'pre-line' }}>\n {shipTo(open)}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {[open.shipping?.phone, open.contactEmail].filter(Boolean).join(' · ')}\n </Typography>\n </Stack>\n <TextField\n label=\"Stripe hardware order id\"\n value={form.stripeHardwareOrderId}\n disabled={closed}\n onChange={(event) => setForm({ ...form, stripeHardwareOrderId: event.target.value })}\n />\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}>\n <TextField\n label=\"Carrier\"\n value={form.carrier}\n disabled={closed}\n onChange={(event) => setForm({ ...form, carrier: event.target.value })}\n />\n <TextField\n label=\"Tracking number\"\n value={form.number}\n disabled={closed}\n onChange={(event) => setForm({ ...form, number: event.target.value })}\n sx={{ flex: 1 }}\n />\n </Stack>\n <TextField\n label=\"Tracking link (optional)\"\n helperText=\"Built from the carrier when left empty\"\n value={form.url}\n disabled={closed}\n onChange={(event) => setForm({ ...form, url: event.target.value })}\n />\n {open.refundPending ? <Alert severity=\"warning\">{'A refund is in progress.'}</Alert> : null}\n </DialogContent>\n ) : null}\n <DialogActions sx={{ flexWrap: 'wrap', gap: 1 }}>\n <Guarded reason={writeReason ?? (refundable ? undefined : NOT_REFUNDABLE)}>\n <Button color=\"error\" disabled={busy} onClick={() => void returnMoney('cancel')}>\n {'Cancel and refund'}\n </Button>\n </Guarded>\n <Guarded reason={writeReason ?? (refundable ? undefined : NOT_REFUNDABLE)}>\n <Button color=\"error\" disabled={busy} onClick={() => void returnMoney('refund')}>\n {'Refund'}\n </Button>\n </Guarded>\n <Button onClick={() => setOpen(null)}>{'Close'}</Button>\n <Guarded reason={writeReason ?? (closed ? CLOSED : undefined)}>\n <Button disabled={busy} onClick={() => save()}>\n {'Save'}\n </Button>\n </Guarded>\n {next ? (\n <Guarded\n reason={\n writeReason ??\n (next === 'shipped' && !form.number.trim() ? 'Add the tracking number first.' : undefined)\n }\n >\n <Button variant=\"contained\" disabled={busy} onClick={() => save(next)}>\n {`Mark ${POS_HARDWARE_STAFF_STATUS_LABELS[next].toLowerCase()}`}\n </Button>\n </Guarded>\n ) : null}\n </DialogActions>\n </Dialog>\n </CardDisplay>\n )\n}\nPosHardwareOrdersStaffPage.displayName = 'PosHardwareOrdersStaffPage'\n\nexport default PosHardwareOrdersStaffPage\n"],"names":["pluginDocsHelp","resolveStaffRoleGate","CardDisplay","useConfirmationContext","BlockedControl","ListPagination","ListTable","useSnackbar","useUser","Alert","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","Link","MenuItem","Stack","TextField","Typography","useCallback","useEffect","useMemo","useState","formatPosHardwareCents","nextPosHardwareStatus","POS_HARDWARE_ORDER_STATUSES","POS_HARDWARE_STAFF_STATUS_LABELS","posHardwareRefundable","posHardwareSku","POS_HARDWARE_STATUS_COLOR","PosHardwareRequestError","staffHardwareOrderAction","staffHardwareOrders","WRITE_ROLES","NOT_REFUNDABLE","CLOSED","Guarded","props","blocked","Boolean","reason","children","when","ms","Date","toLocaleString","shipTo","order","address","shipping","region","taxRegion","state","postalCode","filter","join","country","name","line1","line2","city","PosHardwareOrdersStaffPage","open","staffRole","staffPaths","data","user","enqueueSnackbar","confirm","status","setStatus","orders","setOrders","cursors","setCursors","page","setPage","nextPage","setNextPage","pageSize","setPageSize","error","setError","setOpen","busy","setBusy","form","setForm","stripeHardwareOrderId","carrier","number","url","gate","uid","load","targetPage","after","answer","next","existing","kept","slice","caught","message","openOrder","tracking","act","body","done","orgId","orderId","id","variant","persist","formTracking","trim","undefined","save","advance","action","toLowerCase","returnMoney","confirmed","title","description","totalCents","confirmationText","confirmationButtonProps","color","then","catch","columns","field","headerName","minWidth","type","align","headerAlign","valueFormatter","value","renderCell","row","href","orgDetail","onClick","event","stopPropagation","flex","valueGetter","_value","lines","map","line","quantity","label","size","livemode","closed","refundable","refundPending","writeReason","header","help","anchor","subheader","HeaderProps","select","onChange","target","contentGutterX","contentGutterY","spacing","severity","length","rows","$id","loading","hideFooter","onOpen","_id","rowCount","hasMore","onPageChange","onClose","maxWidth","fullWidth","sx","display","flexDirection","gap","mt","sku","stripeProductName","whiteSpace","phone","contactEmail","disabled","direction","xs","sm","helperText","flexWrap","displayName"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** The customer to open on, as the register's customer panel names them. */
2
+ export interface PosCheckInTarget {
3
+ customerKey?: string;
4
+ email?: string | null;
5
+ contactId?: string | null;
6
+ }
7
+ export interface PosCheckInDialogProps {
8
+ open: boolean;
9
+ hostId: string;
10
+ /** The register the dialog was opened at, so a PIN's cashier is who checks people in. */
11
+ registerId?: string;
12
+ cashierAssertion?: string;
13
+ /** Opens straight on one customer rather than on the search. */
14
+ initialCustomer?: PosCheckInTarget | null;
15
+ onClose: () => void;
16
+ }
17
+ /**
18
+ * Check-in at the window (AGL-4043): look the customer up by name, email,
19
+ * phone or order number, see each person their passes, camping and stays
20
+ * cover today, and check each in with an optional wristband number and
21
+ * color. One already checked in says when and by whom, with an undo.
22
+ */
23
+ export declare function PosCheckInDialog(props: PosCheckInDialogProps): import("react").JSX.Element;
24
+ export declare namespace PosCheckInDialog {
25
+ var displayName: string;
26
+ }
27
+ export default PosCheckInDialog;