@aglyn/plugins-commerce 1.0.0-beta.278 → 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.
- package/package.json +17 -14
- package/src/lib/components/commerce-console-page.js +33 -1
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/console/payments-settings-card.component.js +1 -1
- package/src/lib/components/console/payments-settings-card.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-api.d.ts +122 -0
- package/src/lib/components/console/pos/pos-hardware-api.js +90 -0
- package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-reader-splash-api.d.ts +58 -0
- package/src/lib/components/console/pos/pos-reader-splash-api.js +101 -0
- package/src/lib/components/console/pos/pos-reader-splash-api.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.js +5 -0
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-card.component.d.ts +26 -0
- package/src/lib/components/console/pos-hardware-card.component.js +456 -0
- package/src/lib/components/console/pos-hardware-card.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.d.ts +14 -0
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +519 -0
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.d.ts +27 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +444 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-in-zone.component.d.ts +9 -0
- package/src/lib/components/console/pos-ops/pos-check-in-zone.component.js +37 -0
- package/src/lib/components/console/pos-ops/pos-check-in-zone.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +24 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +346 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +5 -1
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +83 -4
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-day-totals-card.component.d.ts +35 -0
- package/src/lib/components/console/pos-ops/pos-day-totals-card.component.js +546 -0
- package/src/lib/components/console/pos-ops/pos-day-totals-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +2 -1
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +20 -1
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +1 -1
- package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -1
- package/src/lib/components/console/pos-page.component.js +6 -3
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.d.ts +22 -0
- package/src/lib/components/console/pos-reader-splash-setting.component.js +275 -0
- package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -0
- package/src/lib/components/console/pos-reader-splash-staff-page.component.d.ts +14 -0
- package/src/lib/components/console/pos-reader-splash-staff-page.component.js +301 -0
- package/src/lib/components/console/pos-reader-splash-staff-page.component.js.map +1 -0
- package/src/lib/components/console/pos-zones.d.ts +37 -3
- package/src/lib/components/console/pos-zones.js +11 -1
- package/src/lib/components/console/pos-zones.js.map +1 -1
- package/src/lib/components/console/product-check-in-fields.component.d.ts +20 -0
- package/src/lib/components/console/product-check-in-fields.component.js +172 -0
- package/src/lib/components/console/product-check-in-fields.component.js.map +1 -0
- package/src/lib/components/console/product-editor-dialog.component.js +48 -9
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-register-fields.component.d.ts +12 -0
- package/src/lib/components/console/product-register-fields.component.js +39 -1
- package/src/lib/components/console/product-register-fields.component.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +21 -6
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/reservations-card.component.js +239 -70
- package/src/lib/components/console/reservations-card.component.js.map +1 -1
- package/src/lib/components/reservation-widget.js +16 -0
- package/src/lib/components/reservation-widget.js.map +1 -1
- package/src/lib/constants/operator-alerts.d.ts +6 -0
- package/src/lib/constants/operator-alerts.js +20 -1
- package/src/lib/constants/operator-alerts.js.map +1 -1
- package/src/lib/declarations.console-server.js +7 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +26 -0
- package/src/lib/declarations.js +34 -0
- package/src/lib/declarations.js.map +1 -0
- package/src/lib/model/commerce-check-in-product.d.ts +37 -0
- package/src/lib/model/commerce-check-in-product.js +49 -0
- package/src/lib/model/commerce-check-in-product.js.map +1 -0
- package/src/lib/model/commerce-check-in.d.ts +187 -0
- package/src/lib/model/commerce-check-in.js +468 -0
- package/src/lib/model/commerce-check-in.js.map +1 -0
- package/src/lib/model/commerce-pos-day-report.d.ts +209 -0
- package/src/lib/model/commerce-pos-day-report.js +572 -0
- package/src/lib/model/commerce-pos-day-report.js.map +1 -0
- package/src/lib/model/commerce-pos-offline.d.ts +65 -3
- package/src/lib/model/commerce-pos-offline.js +104 -7
- package/src/lib/model/commerce-pos-offline.js.map +1 -1
- package/src/lib/model/commerce-pos-ops.d.ts +3 -0
- package/src/lib/model/commerce-pos-ops.js +1 -0
- package/src/lib/model/commerce-pos-ops.js.map +1 -1
- package/src/lib/model/commerce-pos.d.ts +43 -3
- package/src/lib/model/commerce-pos.js +73 -5
- package/src/lib/model/commerce-pos.js.map +1 -1
- package/src/lib/model/commerce-reservations.d.ts +73 -7
- package/src/lib/model/commerce-reservations.js +90 -10
- package/src/lib/model/commerce-reservations.js.map +1 -1
- package/src/lib/model/commerce.d.ts +40 -0
- package/src/lib/model/commerce.js +22 -4
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/index.d.ts +1 -0
- package/src/lib/model/index.js +1 -0
- package/src/lib/model/index.js.map +1 -1
- package/src/lib/model/plugin-permissions.d.ts +1 -1
- package/src/lib/model/plugin-permissions.js +2 -1
- package/src/lib/model/plugin-permissions.js.map +1 -1
- package/src/lib/model/pos-hardware.d.ts +288 -0
- package/src/lib/model/pos-hardware.js +499 -0
- package/src/lib/model/pos-hardware.js.map +1 -0
- package/src/lib/model/pos-offline-card-limits.d.ts +20 -0
- package/src/lib/model/pos-offline-card-limits.js +28 -0
- package/src/lib/model/pos-offline-card-limits.js.map +1 -0
- package/src/lib/model/pos-reader-splash.d.ts +114 -0
- package/src/lib/model/pos-reader-splash.js +141 -0
- package/src/lib/model/pos-reader-splash.js.map +1 -0
- package/src/lib/model/product-write.d.ts +6 -0
- package/src/lib/plugin-config.d.ts +10 -0
- package/src/lib/plugin-config.js +40 -0
- package/src/lib/plugin-config.js.map +1 -1
- package/src/lib/plugin.js +28 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/cart-checkout.js +3 -1
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/cart.js +12 -1
- package/src/lib/server/cart.js.map +1 -1
- package/src/lib/server/catalog.js +49 -12
- package/src/lib/server/catalog.js.map +1 -1
- package/src/lib/server/checkout-extras.js +1 -1
- package/src/lib/server/checkout-extras.js.map +1 -1
- package/src/lib/server/checkout.js +7 -0
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/person-eraser.d.ts +8 -1
- package/src/lib/server/person-eraser.js +23 -1
- package/src/lib/server/person-eraser.js.map +1 -1
- package/src/lib/server/pos-check-in.d.ts +49 -0
- package/src/lib/server/pos-check-in.js +652 -0
- package/src/lib/server/pos-check-in.js.map +1 -0
- package/src/lib/server/pos-day-report.d.ts +46 -0
- package/src/lib/server/pos-day-report.js +299 -0
- package/src/lib/server/pos-day-report.js.map +1 -0
- package/src/lib/server/pos-hardware-admin.d.ts +50 -0
- package/src/lib/server/pos-hardware-admin.js +366 -0
- package/src/lib/server/pos-hardware-admin.js.map +1 -0
- package/src/lib/server/pos-hardware-notify.d.ts +27 -0
- package/src/lib/server/pos-hardware-notify.js +142 -0
- package/src/lib/server/pos-hardware-notify.js.map +1 -0
- package/src/lib/server/pos-hardware-user-eraser.d.ts +26 -0
- package/src/lib/server/pos-hardware-user-eraser.js +67 -0
- package/src/lib/server/pos-hardware-user-eraser.js.map +1 -0
- package/src/lib/server/pos-hardware-webhook.d.ts +31 -0
- package/src/lib/server/pos-hardware-webhook.js +176 -0
- package/src/lib/server/pos-hardware-webhook.js.map +1 -0
- package/src/lib/server/pos-hardware.d.ts +58 -0
- package/src/lib/server/pos-hardware.js +234 -0
- package/src/lib/server/pos-hardware.js.map +1 -0
- package/src/lib/server/pos-offline-card-reconcile.d.ts +38 -0
- package/src/lib/server/pos-offline-card-reconcile.js +58 -0
- package/src/lib/server/pos-offline-card-reconcile.js.map +1 -0
- package/src/lib/server/pos-offline-sync.d.ts +32 -0
- package/src/lib/server/pos-offline-sync.js +191 -15
- package/src/lib/server/pos-offline-sync.js.map +1 -1
- package/src/lib/server/pos-ops-routes.d.ts +4 -2
- package/src/lib/server/pos-ops-routes.js +14 -2
- package/src/lib/server/pos-ops-routes.js.map +1 -1
- package/src/lib/server/pos-order.js +39 -51
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.js +8 -4
- package/src/lib/server/pos-payment.js.map +1 -1
- package/src/lib/server/pos-reader-splash-admin.d.ts +36 -0
- package/src/lib/server/pos-reader-splash-admin.js +295 -0
- package/src/lib/server/pos-reader-splash-admin.js.map +1 -0
- package/src/lib/server/pos-reader-splash-render.d.ts +40 -0
- package/src/lib/server/pos-reader-splash-render.js +138 -0
- package/src/lib/server/pos-reader-splash-render.js.map +1 -0
- package/src/lib/server/pos-reader-splash-server.d.ts +32 -0
- package/src/lib/server/pos-reader-splash-server.js +32 -0
- package/src/lib/server/pos-reader-splash-server.js.map +1 -0
- package/src/lib/server/pos-reader-splash.d.ts +105 -0
- package/src/lib/server/pos-reader-splash.js +548 -0
- package/src/lib/server/pos-reader-splash.js.map +1 -0
- package/src/lib/server/pos-sale.d.ts +2 -1
- package/src/lib/server/pos-sale.js +3 -1
- package/src/lib/server/pos-sale.js.map +1 -1
- package/src/lib/server/pos-terminal.d.ts +67 -4
- package/src/lib/server/pos-terminal.js +239 -32
- package/src/lib/server/pos-terminal.js.map +1 -1
- package/src/lib/server/process-restock.js +4 -0
- package/src/lib/server/process-restock.js.map +1 -1
- package/src/lib/server/product-card.js +2 -2
- package/src/lib/server/product-card.js.map +1 -1
- package/src/lib/server/product-catalog.d.ts +2 -0
- package/src/lib/server/product-catalog.js +11 -4
- package/src/lib/server/product-catalog.js.map +1 -1
- package/src/lib/server/product.js +3 -1
- package/src/lib/server/product.js.map +1 -1
- package/src/lib/server/related.js +8 -1
- package/src/lib/server/related.js.map +1 -1
- package/src/lib/server/reservation-availability-query.d.ts +35 -0
- package/src/lib/server/reservation-availability-query.js +34 -0
- package/src/lib/server/reservation-availability-query.js.map +1 -0
- package/src/lib/server/reservation-availability.d.ts +21 -0
- package/src/lib/server/reservation-availability.js +64 -10
- package/src/lib/server/reservation-availability.js.map +1 -1
- package/src/lib/server/reservation-walk-in.d.ts +28 -0
- package/src/lib/server/reservation-walk-in.js +166 -0
- package/src/lib/server/reservation-walk-in.js.map +1 -0
- package/src/lib/server/reserve.js +13 -10
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/reviews.js +3 -1
- package/src/lib/server/reviews.js.map +1 -1
- package/src/lib/server/site-page-resolver.js +5 -2
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server.js +26 -0
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/fake-firestore.js +72 -0
- package/src/lib/testing/fake-firestore.js.map +1 -1
|
@@ -0,0 +1,444 @@
|
|
|
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, Fragment as _Fragment } from "react/jsx-runtime";
|
|
19
|
+
import { Alert, Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Divider, List, ListItem, ListItemButton, ListItemText, MenuItem, Stack, TextField, Typography } from "@mui/material";
|
|
20
|
+
import { useUser } from "@aglyn/tenant-feature-instance";
|
|
21
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
22
|
+
import { alreadyCheckedInLabel, checkInItemLabel, checkInTimeLabel, CHECK_IN_WRISTBAND_COLORS, CHECK_IN_WRISTBAND_MAX, describeWristband } from "../../../model/commerce-check-in.js";
|
|
23
|
+
import { POS_TOUCH_PX } from "../pos/pos-product-grid.component.js";
|
|
24
|
+
import { callPosOps, newPosAttemptKey } from "./pos-ops-api.js";
|
|
25
|
+
import { PosCheckInZone } from "./pos-check-in-zone.component.js";
|
|
26
|
+
/** How long typing pauses before the register asks. */ const SEARCH_DEBOUNCE_MS = 250;
|
|
27
|
+
/**
|
|
28
|
+
* Check-in at the window (AGL-4043): look the customer up by name, email,
|
|
29
|
+
* phone or order number, see each person their passes, camping and stays
|
|
30
|
+
* cover today, and check each in with an optional wristband number and
|
|
31
|
+
* color. One already checked in says when and by whom, with an undo.
|
|
32
|
+
*/ export function PosCheckInDialog(props) {
|
|
33
|
+
var _ref;
|
|
34
|
+
const { open, hostId, registerId, cashierAssertion, initialCustomer, onClose } = props;
|
|
35
|
+
const { data: user } = useUser();
|
|
36
|
+
const [text, setText] = useState('');
|
|
37
|
+
const [customers, setCustomers] = useState([]);
|
|
38
|
+
const [searched, setSearched] = useState(false);
|
|
39
|
+
const [day, setDay] = useState(null);
|
|
40
|
+
const [customer, setCustomer] = useState(null);
|
|
41
|
+
const [rows, setRows] = useState([]);
|
|
42
|
+
const [drafts, setDrafts] = useState({});
|
|
43
|
+
const [busy, setBusy] = useState(false);
|
|
44
|
+
const [error, setError] = useState('');
|
|
45
|
+
const [notice, setNotice] = useState('');
|
|
46
|
+
const latest = useRef(0);
|
|
47
|
+
const reset = useCallback(()=>{
|
|
48
|
+
setText('');
|
|
49
|
+
setCustomers([]);
|
|
50
|
+
setSearched(false);
|
|
51
|
+
setCustomer(null);
|
|
52
|
+
setRows([]);
|
|
53
|
+
setDrafts({});
|
|
54
|
+
setError('');
|
|
55
|
+
setNotice('');
|
|
56
|
+
}, []);
|
|
57
|
+
const openCustomer = useCallback(async (target)=>{
|
|
58
|
+
var _answer_body_error, _answer_body_timeZone, _answer_body_customer, _answer_body_checkIns;
|
|
59
|
+
var _answer_body_checkIns1;
|
|
60
|
+
if (!user) return;
|
|
61
|
+
setBusy(true);
|
|
62
|
+
setError('');
|
|
63
|
+
setNotice('');
|
|
64
|
+
const answer = await callPosOps(user, 'pos-check-in', _extends({
|
|
65
|
+
hostId,
|
|
66
|
+
action: 'customer'
|
|
67
|
+
}, target));
|
|
68
|
+
setBusy(false);
|
|
69
|
+
if (!answer.ok) return setError((_answer_body_error = answer.body.error) != null ? _answer_body_error : 'That customer could not be opened.');
|
|
70
|
+
if (answer.body.dayKey) setDay({
|
|
71
|
+
dayKey: answer.body.dayKey,
|
|
72
|
+
timeZone: (_answer_body_timeZone = answer.body.timeZone) != null ? _answer_body_timeZone : 'UTC'
|
|
73
|
+
});
|
|
74
|
+
setCustomer((_answer_body_customer = answer.body.customer) != null ? _answer_body_customer : null);
|
|
75
|
+
setRows((_answer_body_checkIns = answer.body.checkIns) != null ? _answer_body_checkIns : []);
|
|
76
|
+
setDrafts({});
|
|
77
|
+
if (!((_answer_body_checkIns1 = answer.body.checkIns) == null ? void 0 : _answer_body_checkIns1.length)) setNotice('Nothing to check in today for this customer.');
|
|
78
|
+
}, [
|
|
79
|
+
user,
|
|
80
|
+
hostId
|
|
81
|
+
]);
|
|
82
|
+
useEffect(()=>{
|
|
83
|
+
if (!open) return reset();
|
|
84
|
+
if (initialCustomer && (initialCustomer.customerKey || initialCustomer.email || initialCustomer.contactId)) {
|
|
85
|
+
void openCustomer(initialCustomer);
|
|
86
|
+
}
|
|
87
|
+
// Opening is the trigger; a new target while open is not.
|
|
88
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
89
|
+
}, [
|
|
90
|
+
open
|
|
91
|
+
]);
|
|
92
|
+
useEffect(()=>{
|
|
93
|
+
const typed = text.trim();
|
|
94
|
+
if (!open || typed.length < 2 || !user) {
|
|
95
|
+
setCustomers([]);
|
|
96
|
+
setSearched(false);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const ticket = ++latest.current;
|
|
100
|
+
const timer = window.setTimeout(()=>{
|
|
101
|
+
void callPosOps(user, 'pos-check-in', {
|
|
102
|
+
hostId,
|
|
103
|
+
action: 'search',
|
|
104
|
+
text: typed
|
|
105
|
+
}).then((answer)=>{
|
|
106
|
+
var _answer_body_error, _answer_body_timeZone, _answer_body_customers;
|
|
107
|
+
if (ticket !== latest.current) return;
|
|
108
|
+
if (!answer.ok) return setError((_answer_body_error = answer.body.error) != null ? _answer_body_error : 'The search did not run.');
|
|
109
|
+
setError('');
|
|
110
|
+
if (answer.body.dayKey) setDay({
|
|
111
|
+
dayKey: answer.body.dayKey,
|
|
112
|
+
timeZone: (_answer_body_timeZone = answer.body.timeZone) != null ? _answer_body_timeZone : 'UTC'
|
|
113
|
+
});
|
|
114
|
+
setCustomers((_answer_body_customers = answer.body.customers) != null ? _answer_body_customers : []);
|
|
115
|
+
setSearched(true);
|
|
116
|
+
});
|
|
117
|
+
}, SEARCH_DEBOUNCE_MS);
|
|
118
|
+
return ()=>window.clearTimeout(timer);
|
|
119
|
+
}, [
|
|
120
|
+
text,
|
|
121
|
+
user,
|
|
122
|
+
hostId,
|
|
123
|
+
open
|
|
124
|
+
]);
|
|
125
|
+
const merge = (changed)=>{
|
|
126
|
+
const byId = new Map(changed.map((row)=>[
|
|
127
|
+
row.id,
|
|
128
|
+
row
|
|
129
|
+
]));
|
|
130
|
+
setRows((current)=>current.map((row)=>{
|
|
131
|
+
var _byId_get;
|
|
132
|
+
return (_byId_get = byId.get(row.id)) != null ? _byId_get : row;
|
|
133
|
+
}));
|
|
134
|
+
};
|
|
135
|
+
const checkIn = async (targets)=>{
|
|
136
|
+
var _answer_body_error, _answer_body_checkedIn, _answer_body_alreadyCheckedIn, _answer_body_alreadyCheckedIn1;
|
|
137
|
+
if (!targets.length) return;
|
|
138
|
+
setBusy(true);
|
|
139
|
+
setError('');
|
|
140
|
+
setNotice('');
|
|
141
|
+
const answer = await callPosOps(user, 'pos-check-in', _extends({
|
|
142
|
+
hostId,
|
|
143
|
+
action: 'check_in',
|
|
144
|
+
checkIns: targets.map((row)=>{
|
|
145
|
+
const draft = drafts[row.id];
|
|
146
|
+
return _extends({
|
|
147
|
+
id: row.id
|
|
148
|
+
}, draft && (draft.number.trim() || draft.color) ? {
|
|
149
|
+
wristband: {
|
|
150
|
+
number: draft.number.trim(),
|
|
151
|
+
color: draft.color
|
|
152
|
+
}
|
|
153
|
+
} : {});
|
|
154
|
+
})
|
|
155
|
+
}, registerId ? {
|
|
156
|
+
registerId
|
|
157
|
+
} : {}, cashierAssertion ? {
|
|
158
|
+
cashierAssertion
|
|
159
|
+
} : {}), {
|
|
160
|
+
idempotencyKey: newPosAttemptKey()
|
|
161
|
+
});
|
|
162
|
+
setBusy(false);
|
|
163
|
+
if (!answer.ok) return setError((_answer_body_error = answer.body.error) != null ? _answer_body_error : 'They could not be checked in.');
|
|
164
|
+
merge([
|
|
165
|
+
...(_answer_body_checkedIn = answer.body.checkedIn) != null ? _answer_body_checkedIn : [],
|
|
166
|
+
...(_answer_body_alreadyCheckedIn = answer.body.alreadyCheckedIn) != null ? _answer_body_alreadyCheckedIn : []
|
|
167
|
+
]);
|
|
168
|
+
const already = (_answer_body_alreadyCheckedIn1 = answer.body.alreadyCheckedIn) != null ? _answer_body_alreadyCheckedIn1 : [];
|
|
169
|
+
if (already.length && day) setNotice(alreadyCheckedInLabel(already[0], day.timeZone));
|
|
170
|
+
};
|
|
171
|
+
const undo = async (row)=>{
|
|
172
|
+
var _answer_body_error;
|
|
173
|
+
setBusy(true);
|
|
174
|
+
setError('');
|
|
175
|
+
setNotice('');
|
|
176
|
+
const answer = await callPosOps(user, 'pos-check-in', _extends({
|
|
177
|
+
hostId,
|
|
178
|
+
action: 'undo',
|
|
179
|
+
id: row.id
|
|
180
|
+
}, registerId ? {
|
|
181
|
+
registerId
|
|
182
|
+
} : {}, cashierAssertion ? {
|
|
183
|
+
cashierAssertion
|
|
184
|
+
} : {}));
|
|
185
|
+
setBusy(false);
|
|
186
|
+
if (!answer.ok || !answer.body.checkIn) return setError((_answer_body_error = answer.body.error) != null ? _answer_body_error : 'The check-in could not be undone.');
|
|
187
|
+
merge([
|
|
188
|
+
answer.body.checkIn
|
|
189
|
+
]);
|
|
190
|
+
};
|
|
191
|
+
const setDraft = (id, patch)=>setDrafts((current)=>_extends({}, current, {
|
|
192
|
+
[id]: _extends({
|
|
193
|
+
number: '',
|
|
194
|
+
color: ''
|
|
195
|
+
}, current[id], patch)
|
|
196
|
+
}));
|
|
197
|
+
const waiting = rows.filter((row)=>row.status === 'expected');
|
|
198
|
+
const dayKey = (_ref = day == null ? void 0 : day.dayKey) != null ? _ref : '';
|
|
199
|
+
return /*#__PURE__*/ _jsxs(Dialog, {
|
|
200
|
+
open: open,
|
|
201
|
+
onClose: onClose,
|
|
202
|
+
maxWidth: "sm",
|
|
203
|
+
fullWidth: true,
|
|
204
|
+
children: [
|
|
205
|
+
/*#__PURE__*/ _jsx(DialogTitle, {
|
|
206
|
+
children: customer ? customer.name || customer.email || 'Customer' : 'Check in'
|
|
207
|
+
}),
|
|
208
|
+
/*#__PURE__*/ _jsx(DialogContent, {
|
|
209
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
210
|
+
spacing: 2,
|
|
211
|
+
sx: {
|
|
212
|
+
pt: 1
|
|
213
|
+
},
|
|
214
|
+
children: [
|
|
215
|
+
customer ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
216
|
+
children: [
|
|
217
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
218
|
+
direction: "row",
|
|
219
|
+
spacing: 1,
|
|
220
|
+
useFlexGap: true,
|
|
221
|
+
sx: {
|
|
222
|
+
alignItems: 'center',
|
|
223
|
+
flexWrap: 'wrap'
|
|
224
|
+
},
|
|
225
|
+
children: [
|
|
226
|
+
customer.email ? /*#__PURE__*/ _jsx(Typography, {
|
|
227
|
+
variant: "body2",
|
|
228
|
+
color: "text.secondary",
|
|
229
|
+
children: customer.email
|
|
230
|
+
}) : null,
|
|
231
|
+
/*#__PURE__*/ _jsx(Chip, {
|
|
232
|
+
size: "small",
|
|
233
|
+
variant: "outlined",
|
|
234
|
+
color: rows.length && !waiting.length ? 'success' : 'default',
|
|
235
|
+
label: `${rows.filter((row)=>row.status === 'checked_in').length} of ${rows.length} checked in`
|
|
236
|
+
}),
|
|
237
|
+
dayKey ? /*#__PURE__*/ _jsx(PosCheckInZone, {
|
|
238
|
+
hostId: hostId,
|
|
239
|
+
orgId: undefined,
|
|
240
|
+
contactId: customer.contactId,
|
|
241
|
+
email: customer.email ? customer.email.toLowerCase() : null,
|
|
242
|
+
dayKey: dayKey,
|
|
243
|
+
name: customer.name,
|
|
244
|
+
unitsDue: rows.length,
|
|
245
|
+
placement: "check-in-customer"
|
|
246
|
+
}) : null
|
|
247
|
+
]
|
|
248
|
+
}),
|
|
249
|
+
/*#__PURE__*/ _jsx(List, {
|
|
250
|
+
disablePadding: true,
|
|
251
|
+
children: rows.map((row, index)=>{
|
|
252
|
+
var _row_orderLabel, _ref, _ref1;
|
|
253
|
+
var _drafts_row_id, _drafts_row_id1;
|
|
254
|
+
return /*#__PURE__*/ _jsxs(Box, {
|
|
255
|
+
children: [
|
|
256
|
+
index ? /*#__PURE__*/ _jsx(Divider, {
|
|
257
|
+
component: "li"
|
|
258
|
+
}) : null,
|
|
259
|
+
/*#__PURE__*/ _jsx(ListItem, {
|
|
260
|
+
disableGutters: true,
|
|
261
|
+
sx: {
|
|
262
|
+
display: 'block',
|
|
263
|
+
py: 1.5
|
|
264
|
+
},
|
|
265
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
266
|
+
spacing: 1,
|
|
267
|
+
children: [
|
|
268
|
+
/*#__PURE__*/ _jsx(ListItemText, {
|
|
269
|
+
primary: checkInItemLabel(row),
|
|
270
|
+
secondary: row.status === 'checked_in' && day ? [
|
|
271
|
+
`Checked in at ${checkInTimeLabel(row.checkedInAtMs, day.timeZone)}` + (row.checkedInByName ? ` by ${row.checkedInByName}` : ''),
|
|
272
|
+
describeWristband(row.wristband)
|
|
273
|
+
].filter(Boolean).join(' · ') : (_row_orderLabel = row.orderLabel) != null ? _row_orderLabel : row.source === 'reservation' ? 'Stay' : ''
|
|
274
|
+
}),
|
|
275
|
+
row.status === 'checked_in' ? /*#__PURE__*/ _jsx(Box, {
|
|
276
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
277
|
+
size: "small",
|
|
278
|
+
onClick: ()=>void undo(row),
|
|
279
|
+
disabled: busy,
|
|
280
|
+
children: 'Undo'
|
|
281
|
+
})
|
|
282
|
+
}) : /*#__PURE__*/ _jsxs(Stack, {
|
|
283
|
+
direction: {
|
|
284
|
+
xs: 'column',
|
|
285
|
+
sm: 'row'
|
|
286
|
+
},
|
|
287
|
+
spacing: 1,
|
|
288
|
+
children: [
|
|
289
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
290
|
+
size: "small",
|
|
291
|
+
label: "Wristband number",
|
|
292
|
+
value: (_ref = (_drafts_row_id = drafts[row.id]) == null ? void 0 : _drafts_row_id.number) != null ? _ref : '',
|
|
293
|
+
onChange: (event)=>setDraft(row.id, {
|
|
294
|
+
number: event.target.value
|
|
295
|
+
}),
|
|
296
|
+
slotProps: {
|
|
297
|
+
htmlInput: {
|
|
298
|
+
maxLength: CHECK_IN_WRISTBAND_MAX
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
sx: {
|
|
302
|
+
flex: 1
|
|
303
|
+
}
|
|
304
|
+
}),
|
|
305
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
306
|
+
select: true,
|
|
307
|
+
size: "small",
|
|
308
|
+
label: "Color",
|
|
309
|
+
value: (_ref1 = (_drafts_row_id1 = drafts[row.id]) == null ? void 0 : _drafts_row_id1.color) != null ? _ref1 : '',
|
|
310
|
+
onChange: (event)=>setDraft(row.id, {
|
|
311
|
+
color: event.target.value
|
|
312
|
+
}),
|
|
313
|
+
sx: {
|
|
314
|
+
flex: 1
|
|
315
|
+
},
|
|
316
|
+
children: [
|
|
317
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
318
|
+
value: "",
|
|
319
|
+
children: 'None'
|
|
320
|
+
}),
|
|
321
|
+
CHECK_IN_WRISTBAND_COLORS.map((color)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
322
|
+
value: color,
|
|
323
|
+
children: color
|
|
324
|
+
}, color))
|
|
325
|
+
]
|
|
326
|
+
}),
|
|
327
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
328
|
+
variant: "contained",
|
|
329
|
+
onClick: ()=>void checkIn([
|
|
330
|
+
row
|
|
331
|
+
]),
|
|
332
|
+
disabled: busy,
|
|
333
|
+
sx: {
|
|
334
|
+
minHeight: POS_TOUCH_PX
|
|
335
|
+
},
|
|
336
|
+
children: 'Check in'
|
|
337
|
+
})
|
|
338
|
+
]
|
|
339
|
+
})
|
|
340
|
+
]
|
|
341
|
+
})
|
|
342
|
+
})
|
|
343
|
+
]
|
|
344
|
+
}, row.id);
|
|
345
|
+
})
|
|
346
|
+
})
|
|
347
|
+
]
|
|
348
|
+
}) : /*#__PURE__*/ _jsxs(_Fragment, {
|
|
349
|
+
children: [
|
|
350
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
351
|
+
autoFocus: true,
|
|
352
|
+
label: "Find a customer",
|
|
353
|
+
placeholder: "Name, email, phone or order number",
|
|
354
|
+
value: text,
|
|
355
|
+
onChange: (event)=>setText(event.target.value)
|
|
356
|
+
}),
|
|
357
|
+
customers.length ? /*#__PURE__*/ _jsx(List, {
|
|
358
|
+
dense: true,
|
|
359
|
+
disablePadding: true,
|
|
360
|
+
children: customers.map((one)=>/*#__PURE__*/ _jsxs(ListItem, {
|
|
361
|
+
disablePadding: true,
|
|
362
|
+
children: [
|
|
363
|
+
/*#__PURE__*/ _jsx(ListItemButton, {
|
|
364
|
+
onClick: ()=>void openCustomer({
|
|
365
|
+
customerKey: one.customerKey
|
|
366
|
+
}),
|
|
367
|
+
children: /*#__PURE__*/ _jsx(ListItemText, {
|
|
368
|
+
primary: one.name || one.email || 'Customer',
|
|
369
|
+
secondary: [
|
|
370
|
+
`${one.unitsCheckedIn} of ${one.unitsDue} checked in`,
|
|
371
|
+
one.items.join(', '),
|
|
372
|
+
one.email,
|
|
373
|
+
one.phone
|
|
374
|
+
].filter(Boolean).join(' · ')
|
|
375
|
+
})
|
|
376
|
+
}),
|
|
377
|
+
dayKey ? /*#__PURE__*/ _jsx(PosCheckInZone, {
|
|
378
|
+
hostId: hostId,
|
|
379
|
+
orgId: undefined,
|
|
380
|
+
contactId: one.contactId,
|
|
381
|
+
email: one.email ? one.email.toLowerCase() : null,
|
|
382
|
+
dayKey: dayKey,
|
|
383
|
+
name: one.name,
|
|
384
|
+
unitsDue: one.unitsDue,
|
|
385
|
+
placement: "check-in-row"
|
|
386
|
+
}) : null
|
|
387
|
+
]
|
|
388
|
+
}, one.customerKey))
|
|
389
|
+
}) : searched ? /*#__PURE__*/ _jsx(Typography, {
|
|
390
|
+
variant: "body2",
|
|
391
|
+
color: "text.secondary",
|
|
392
|
+
children: 'Nobody with that name, email, phone or order number has anything to check in today.'
|
|
393
|
+
}) : /*#__PURE__*/ _jsx(Typography, {
|
|
394
|
+
variant: "body2",
|
|
395
|
+
color: "text.secondary",
|
|
396
|
+
children: 'Passes, camping and stays bought online or at the register show up here on the day they are for.'
|
|
397
|
+
})
|
|
398
|
+
]
|
|
399
|
+
}),
|
|
400
|
+
notice ? /*#__PURE__*/ _jsx(Alert, {
|
|
401
|
+
severity: "info",
|
|
402
|
+
children: notice
|
|
403
|
+
}) : null,
|
|
404
|
+
error ? /*#__PURE__*/ _jsx(Alert, {
|
|
405
|
+
severity: "warning",
|
|
406
|
+
children: error
|
|
407
|
+
}) : null
|
|
408
|
+
]
|
|
409
|
+
})
|
|
410
|
+
}),
|
|
411
|
+
/*#__PURE__*/ _jsxs(DialogActions, {
|
|
412
|
+
children: [
|
|
413
|
+
customer ? /*#__PURE__*/ _jsx(Button, {
|
|
414
|
+
onClick: ()=>{
|
|
415
|
+
setCustomer(null);
|
|
416
|
+
setRows([]);
|
|
417
|
+
setNotice('');
|
|
418
|
+
},
|
|
419
|
+
children: 'Back to search'
|
|
420
|
+
}) : null,
|
|
421
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
422
|
+
sx: {
|
|
423
|
+
flex: 1
|
|
424
|
+
}
|
|
425
|
+
}),
|
|
426
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
427
|
+
onClick: onClose,
|
|
428
|
+
children: 'Done'
|
|
429
|
+
}),
|
|
430
|
+
customer && waiting.length > 1 ? /*#__PURE__*/ _jsx(Button, {
|
|
431
|
+
variant: "contained",
|
|
432
|
+
disabled: busy,
|
|
433
|
+
onClick: ()=>void checkIn(waiting),
|
|
434
|
+
children: `Check in all ${waiting.length}`
|
|
435
|
+
}) : null
|
|
436
|
+
]
|
|
437
|
+
})
|
|
438
|
+
]
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
PosCheckInDialog.displayName = 'PosCheckInDialog';
|
|
442
|
+
export default PosCheckInDialog;
|
|
443
|
+
|
|
444
|
+
//# sourceMappingURL=pos-check-in-dialog.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-check-in-dialog.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 {\n Alert,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n List,\n ListItem,\n ListItemButton,\n ListItemText,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n alreadyCheckedInLabel,\n checkInItemLabel,\n checkInTimeLabel,\n CHECK_IN_WRISTBAND_COLORS,\n CHECK_IN_WRISTBAND_MAX,\n describeWristband,\n type CheckInCustomer,\n type CheckInRow,\n} from '../../../model/commerce-check-in'\nimport { POS_TOUCH_PX } from '../pos/pos-product-grid.component'\nimport { callPosOps, newPosAttemptKey } from './pos-ops-api'\nimport { PosCheckInZone } from './pos-check-in-zone.component'\n\n/** How long typing pauses before the register asks. */\nconst SEARCH_DEBOUNCE_MS = 250\n\n/** The customer to open on, as the register's customer panel names them. */\nexport interface PosCheckInTarget {\n customerKey?: string\n email?: string | null\n contactId?: string | null\n}\n\nexport interface PosCheckInDialogProps {\n open: boolean\n hostId: string\n /** The register the dialog was opened at, so a PIN's cashier is who checks people in. */\n registerId?: string\n cashierAssertion?: string\n /** Opens straight on one customer rather than on the search. */\n initialCustomer?: PosCheckInTarget | null\n onClose: () => void\n}\n\ntype Draft = { number: string; color: string }\n\n/**\n * Check-in at the window (AGL-4043): look the customer up by name, email,\n * phone or order number, see each person their passes, camping and stays\n * cover today, and check each in with an optional wristband number and\n * color. One already checked in says when and by whom, with an undo.\n */\nexport function PosCheckInDialog(props: PosCheckInDialogProps) {\n const { open, hostId, registerId, cashierAssertion, initialCustomer, onClose } = props\n const { data: user } = useUser()\n const [text, setText] = useState('')\n const [customers, setCustomers] = useState<CheckInCustomer[]>([])\n const [searched, setSearched] = useState(false)\n const [day, setDay] = useState<{ dayKey: string; timeZone: string } | null>(null)\n const [customer, setCustomer] = useState<CheckInCustomer | null>(null)\n const [rows, setRows] = useState<CheckInRow[]>([])\n const [drafts, setDrafts] = useState<Record<string, Draft>>({})\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const latest = useRef(0)\n\n const reset = useCallback(() => {\n setText('')\n setCustomers([])\n setSearched(false)\n setCustomer(null)\n setRows([])\n setDrafts({})\n setError('')\n setNotice('')\n }, [])\n\n const openCustomer = useCallback(\n async (target: PosCheckInTarget) => {\n if (!user) return\n setBusy(true)\n setError('')\n setNotice('')\n const answer = await callPosOps<{\n dayKey?: string\n timeZone?: string\n customer?: CheckInCustomer | null\n checkIns?: CheckInRow[]\n }>(user, 'pos-check-in', { hostId, action: 'customer', ...target })\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'That customer could not be opened.')\n if (answer.body.dayKey) setDay({ dayKey: answer.body.dayKey, timeZone: answer.body.timeZone ?? 'UTC' })\n setCustomer(answer.body.customer ?? null)\n setRows(answer.body.checkIns ?? [])\n setDrafts({})\n if (!answer.body.checkIns?.length) setNotice('Nothing to check in today for this customer.')\n },\n [user, hostId],\n )\n\n useEffect(() => {\n if (!open) return reset()\n if (initialCustomer && (initialCustomer.customerKey || initialCustomer.email || initialCustomer.contactId)) {\n void openCustomer(initialCustomer)\n }\n // Opening is the trigger; a new target while open is not.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n useEffect(() => {\n const typed = text.trim()\n if (!open || typed.length < 2 || !user) {\n setCustomers([])\n setSearched(false)\n return\n }\n const ticket = ++latest.current\n const timer = window.setTimeout(() => {\n void callPosOps<{ dayKey?: string; timeZone?: string; customers?: CheckInCustomer[] }>(user, 'pos-check-in', {\n hostId,\n action: 'search',\n text: typed,\n }).then((answer) => {\n if (ticket !== latest.current) return\n if (!answer.ok) return setError(answer.body.error ?? 'The search did not run.')\n setError('')\n if (answer.body.dayKey) setDay({ dayKey: answer.body.dayKey, timeZone: answer.body.timeZone ?? 'UTC' })\n setCustomers(answer.body.customers ?? [])\n setSearched(true)\n })\n }, SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n }, [text, user, hostId, open])\n\n const merge = (changed: CheckInRow[]) => {\n const byId = new Map(changed.map((row) => [row.id, row]))\n setRows((current) => current.map((row) => byId.get(row.id) ?? row))\n }\n\n const checkIn = async (targets: CheckInRow[]) => {\n if (!targets.length) return\n setBusy(true)\n setError('')\n setNotice('')\n const answer = await callPosOps<{ checkedIn?: CheckInRow[]; alreadyCheckedIn?: CheckInRow[] }>(\n user,\n 'pos-check-in',\n {\n hostId,\n action: 'check_in',\n checkIns: targets.map((row) => {\n const draft = drafts[row.id]\n return {\n id: row.id,\n ...(draft && (draft.number.trim() || draft.color)\n ? { wristband: { number: draft.number.trim(), color: draft.color } }\n : {}),\n }\n }),\n ...(registerId ? { registerId } : {}),\n ...(cashierAssertion ? { cashierAssertion } : {}),\n },\n { idempotencyKey: newPosAttemptKey() },\n )\n setBusy(false)\n if (!answer.ok) return setError(answer.body.error ?? 'They could not be checked in.')\n merge([...(answer.body.checkedIn ?? []), ...(answer.body.alreadyCheckedIn ?? [])])\n const already = answer.body.alreadyCheckedIn ?? []\n if (already.length && day) setNotice(alreadyCheckedInLabel(already[0]!, day.timeZone))\n }\n\n const undo = async (row: CheckInRow) => {\n setBusy(true)\n setError('')\n setNotice('')\n const answer = await callPosOps<{ checkIn?: CheckInRow }>(user, 'pos-check-in', {\n hostId,\n action: 'undo',\n id: row.id,\n ...(registerId ? { registerId } : {}),\n ...(cashierAssertion ? { cashierAssertion } : {}),\n })\n setBusy(false)\n if (!answer.ok || !answer.body.checkIn) return setError(answer.body.error ?? 'The check-in could not be undone.')\n merge([answer.body.checkIn])\n }\n\n const setDraft = (id: string, patch: Partial<Draft>) =>\n setDrafts((current) => ({ ...current, [id]: { number: '', color: '', ...current[id], ...patch } }))\n\n const waiting = rows.filter((row) => row.status === 'expected')\n const dayKey = day?.dayKey ?? ''\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>{customer ? customer.name || customer.email || 'Customer' : 'Check in'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n {customer ? (\n <>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n {customer.email ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {customer.email}\n </Typography>\n ) : null}\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={rows.length && !waiting.length ? 'success' : 'default'}\n label={`${rows.filter((row) => row.status === 'checked_in').length} of ${rows.length} checked in`}\n />\n {dayKey ? (\n <PosCheckInZone\n hostId={hostId}\n orgId={undefined}\n contactId={customer.contactId}\n email={customer.email ? customer.email.toLowerCase() : null}\n dayKey={dayKey}\n name={customer.name}\n unitsDue={rows.length}\n placement=\"check-in-customer\"\n />\n ) : null}\n </Stack>\n <List disablePadding>\n {rows.map((row, index) => (\n <Box key={row.id}>\n {index ? <Divider component=\"li\" /> : null}\n <ListItem disableGutters sx={{ display: 'block', py: 1.5 }}>\n <Stack spacing={1}>\n <ListItemText\n primary={checkInItemLabel(row)}\n secondary={\n row.status === 'checked_in' && day\n ? [\n `Checked in at ${checkInTimeLabel(row.checkedInAtMs, day.timeZone)}` +\n (row.checkedInByName ? ` by ${row.checkedInByName}` : ''),\n describeWristband(row.wristband),\n ]\n .filter(Boolean)\n .join(' · ')\n : row.orderLabel ?? (row.source === 'reservation' ? 'Stay' : '')\n }\n />\n {row.status === 'checked_in' ? (\n <Box>\n <Button size=\"small\" onClick={() => void undo(row)} disabled={busy}>\n {'Undo'}\n </Button>\n </Box>\n ) : (\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1}>\n <TextField\n size=\"small\"\n label=\"Wristband number\"\n value={drafts[row.id]?.number ?? ''}\n onChange={(event) => setDraft(row.id, { number: event.target.value })}\n slotProps={{ htmlInput: { maxLength: CHECK_IN_WRISTBAND_MAX } }}\n sx={{ flex: 1 }}\n />\n <TextField\n select\n size=\"small\"\n label=\"Color\"\n value={drafts[row.id]?.color ?? ''}\n onChange={(event) => setDraft(row.id, { color: event.target.value })}\n sx={{ flex: 1 }}\n >\n <MenuItem value=\"\">{'None'}</MenuItem>\n {CHECK_IN_WRISTBAND_COLORS.map((color) => (\n <MenuItem key={color} value={color}>\n {color}\n </MenuItem>\n ))}\n </TextField>\n <Button\n variant=\"contained\"\n onClick={() => void checkIn([row])}\n disabled={busy}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {'Check in'}\n </Button>\n </Stack>\n )}\n </Stack>\n </ListItem>\n </Box>\n ))}\n </List>\n </>\n ) : (\n <>\n <TextField\n autoFocus\n label=\"Find a customer\"\n placeholder=\"Name, email, phone or order number\"\n value={text}\n onChange={(event) => setText(event.target.value)}\n />\n {customers.length ? (\n <List dense disablePadding>\n {customers.map((one) => (\n <ListItem key={one.customerKey} disablePadding>\n <ListItemButton onClick={() => void openCustomer({ customerKey: one.customerKey })}>\n <ListItemText\n primary={one.name || one.email || 'Customer'}\n secondary={[\n `${one.unitsCheckedIn} of ${one.unitsDue} checked in`,\n one.items.join(', '),\n one.email,\n one.phone,\n ]\n .filter(Boolean)\n .join(' · ')}\n />\n </ListItemButton>\n {dayKey ? (\n <PosCheckInZone\n hostId={hostId}\n orgId={undefined}\n contactId={one.contactId}\n email={one.email ? one.email.toLowerCase() : null}\n dayKey={dayKey}\n name={one.name}\n unitsDue={one.unitsDue}\n placement=\"check-in-row\"\n />\n ) : null}\n </ListItem>\n ))}\n </List>\n ) : searched ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Nobody with that name, email, phone or order number has anything to check in today.'}\n </Typography>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Passes, camping and stays bought online or at the register show up here on the day they are for.'}\n </Typography>\n )}\n </>\n )}\n {notice ? <Alert severity=\"info\">{notice}</Alert> : null}\n {error ? <Alert severity=\"warning\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n {customer ? (\n <Button\n onClick={() => {\n setCustomer(null)\n setRows([])\n setNotice('')\n }}\n >\n {'Back to search'}\n </Button>\n ) : null}\n <Box sx={{ flex: 1 }} />\n <Button onClick={onClose}>{'Done'}</Button>\n {customer && waiting.length > 1 ? (\n <Button variant=\"contained\" disabled={busy} onClick={() => void checkIn(waiting)}>\n {`Check in all ${waiting.length}`}\n </Button>\n ) : null}\n </DialogActions>\n </Dialog>\n )\n}\n\nPosCheckInDialog.displayName = 'PosCheckInDialog'\n\nexport default PosCheckInDialog\n"],"names":["Alert","Box","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","Divider","List","ListItem","ListItemButton","ListItemText","MenuItem","Stack","TextField","Typography","useUser","useCallback","useEffect","useRef","useState","alreadyCheckedInLabel","checkInItemLabel","checkInTimeLabel","CHECK_IN_WRISTBAND_COLORS","CHECK_IN_WRISTBAND_MAX","describeWristband","POS_TOUCH_PX","callPosOps","newPosAttemptKey","PosCheckInZone","SEARCH_DEBOUNCE_MS","PosCheckInDialog","props","open","hostId","registerId","cashierAssertion","initialCustomer","onClose","data","user","text","setText","customers","setCustomers","searched","setSearched","day","setDay","customer","setCustomer","rows","setRows","drafts","setDrafts","busy","setBusy","error","setError","notice","setNotice","latest","reset","openCustomer","target","answer","action","ok","body","dayKey","timeZone","checkIns","length","customerKey","email","contactId","typed","trim","ticket","current","timer","window","setTimeout","then","clearTimeout","merge","changed","byId","Map","map","row","id","get","checkIn","targets","draft","number","color","wristband","idempotencyKey","checkedIn","alreadyCheckedIn","already","undo","setDraft","patch","waiting","filter","status","maxWidth","fullWidth","name","spacing","sx","pt","direction","useFlexGap","alignItems","flexWrap","variant","size","label","orgId","undefined","toLowerCase","unitsDue","placement","disablePadding","index","component","disableGutters","display","py","primary","secondary","checkedInAtMs","checkedInByName","Boolean","join","orderLabel","source","onClick","disabled","xs","sm","value","onChange","event","slotProps","htmlInput","maxLength","flex","select","minHeight","autoFocus","placeholder","dense","one","unitsCheckedIn","items","phone","severity","displayName"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;;AAEA,SACEA,KAAK,EACLC,GAAG,EACHC,MAAM,EACNC,IAAI,EACJC,MAAM,EACNC,aAAa,EACbC,aAAa,EACbC,WAAW,EACXC,OAAO,EACPC,IAAI,EACJC,QAAQ,EACRC,cAAc,EACdC,YAAY,EACZC,QAAQ,EACRC,KAAK,EACLC,SAAS,EACTC,UAAU,QACL,gBAAe;AACtB,SAASC,OAAO,QAAQ,iCAAgC;AACxD,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAChE,SACEC,qBAAqB,EACrBC,gBAAgB,EAChBC,gBAAgB,EAChBC,yBAAyB,EACzBC,sBAAsB,EACtBC,iBAAiB,QAGZ,sCAAkC;AACzC,SAASC,YAAY,QAAQ,uCAAmC;AAChE,SAASC,UAAU,EAAEC,gBAAgB,QAAQ,mBAAe;AAC5D,SAASC,cAAc,QAAQ,mCAA+B;AAE9D,qDAAqD,GACrD,MAAMC,qBAAqB;AAsB3B;;;;;CAKC,GACD,OAAO,SAASC,iBAAiBC,KAA4B;;IAC3D,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAEC,UAAU,EAAEC,gBAAgB,EAAEC,eAAe,EAAEC,OAAO,EAAE,GAAGN;IACjF,MAAM,EAAEO,MAAMC,IAAI,EAAE,GAAGzB;IACvB,MAAM,CAAC0B,MAAMC,QAAQ,GAAGvB,SAAS;IACjC,MAAM,CAACwB,WAAWC,aAAa,GAAGzB,SAA4B,EAAE;IAChE,MAAM,CAAC0B,UAAUC,YAAY,GAAG3B,SAAS;IACzC,MAAM,CAAC4B,KAAKC,OAAO,GAAG7B,SAAsD;IAC5E,MAAM,CAAC8B,UAAUC,YAAY,GAAG/B,SAAiC;IACjE,MAAM,CAACgC,MAAMC,QAAQ,GAAGjC,SAAuB,EAAE;IACjD,MAAM,CAACkC,QAAQC,UAAU,GAAGnC,SAAgC,CAAC;IAC7D,MAAM,CAACoC,MAAMC,QAAQ,GAAGrC,SAAS;IACjC,MAAM,CAACsC,OAAOC,SAAS,GAAGvC,SAAS;IACnC,MAAM,CAACwC,QAAQC,UAAU,GAAGzC,SAAS;IACrC,MAAM0C,SAAS3C,OAAO;IAEtB,MAAM4C,QAAQ9C,YAAY;QACxB0B,QAAQ;QACRE,aAAa,EAAE;QACfE,YAAY;QACZI,YAAY;QACZE,QAAQ,EAAE;QACVE,UAAU,CAAC;QACXI,SAAS;QACTE,UAAU;IACZ,GAAG,EAAE;IAEL,MAAMG,eAAe/C,YACnB,OAAOgD;YAY2BC,oBACuCA,uBAC3DA,uBACJA;YAEHA;QAhBL,IAAI,CAACzB,MAAM;QACXgB,QAAQ;QACRE,SAAS;QACTE,UAAU;QACV,MAAMK,SAAS,MAAMtC,WAKlBa,MAAM,gBAAgB;YAAEN;YAAQgC,QAAQ;WAAeF;QAC1DR,QAAQ;QACR,IAAI,CAACS,OAAOE,EAAE,EAAE,OAAOT,UAASO,qBAAAA,OAAOG,IAAI,CAACX,KAAK,YAAjBQ,qBAAqB;QACrD,IAAIA,OAAOG,IAAI,CAACC,MAAM,EAAErB,OAAO;YAAEqB,QAAQJ,OAAOG,IAAI,CAACC,MAAM;YAAEC,QAAQ,GAAEL,wBAAAA,OAAOG,IAAI,CAACE,QAAQ,YAApBL,wBAAwB;QAAM;QACrGf,aAAYe,wBAAAA,OAAOG,IAAI,CAACnB,QAAQ,YAApBgB,wBAAwB;QACpCb,SAAQa,wBAAAA,OAAOG,IAAI,CAACG,QAAQ,YAApBN,wBAAwB,EAAE;QAClCX,UAAU,CAAC;QACX,IAAI,GAACW,yBAAAA,OAAOG,IAAI,CAACG,QAAQ,qBAApBN,uBAAsBO,MAAM,GAAEZ,UAAU;IAC/C,GACA;QAACpB;QAAMN;KAAO;IAGhBjB,UAAU;QACR,IAAI,CAACgB,MAAM,OAAO6B;QAClB,IAAIzB,mBAAoBA,CAAAA,gBAAgBoC,WAAW,IAAIpC,gBAAgBqC,KAAK,IAAIrC,gBAAgBsC,SAAS,AAAD,GAAI;YAC1G,KAAKZ,aAAa1B;QACpB;IACA,0DAA0D;IAC1D,uDAAuD;IACzD,GAAG;QAACJ;KAAK;IAEThB,UAAU;QACR,MAAM2D,QAAQnC,KAAKoC,IAAI;QACvB,IAAI,CAAC5C,QAAQ2C,MAAMJ,MAAM,GAAG,KAAK,CAAChC,MAAM;YACtCI,aAAa,EAAE;YACfE,YAAY;YACZ;QACF;QACA,MAAMgC,SAAS,EAAEjB,OAAOkB,OAAO;QAC/B,MAAMC,QAAQC,OAAOC,UAAU,CAAC;YAC9B,KAAKvD,WAAkFa,MAAM,gBAAgB;gBAC3GN;gBACAgC,QAAQ;gBACRzB,MAAMmC;YACR,GAAGO,IAAI,CAAC,CAAClB;oBAEyBA,oBAEuCA,uBAC1DA;gBAJb,IAAIa,WAAWjB,OAAOkB,OAAO,EAAE;gBAC/B,IAAI,CAACd,OAAOE,EAAE,EAAE,OAAOT,UAASO,qBAAAA,OAAOG,IAAI,CAACX,KAAK,YAAjBQ,qBAAqB;gBACrDP,SAAS;gBACT,IAAIO,OAAOG,IAAI,CAACC,MAAM,EAAErB,OAAO;oBAAEqB,QAAQJ,OAAOG,IAAI,CAACC,MAAM;oBAAEC,QAAQ,GAAEL,wBAAAA,OAAOG,IAAI,CAACE,QAAQ,YAApBL,wBAAwB;gBAAM;gBACrGrB,cAAaqB,yBAAAA,OAAOG,IAAI,CAACzB,SAAS,YAArBsB,yBAAyB,EAAE;gBACxCnB,YAAY;YACd;QACF,GAAGhB;QACH,OAAO,IAAMmD,OAAOG,YAAY,CAACJ;IACnC,GAAG;QAACvC;QAAMD;QAAMN;QAAQD;KAAK;IAE7B,MAAMoD,QAAQ,CAACC;QACb,MAAMC,OAAO,IAAIC,IAAIF,QAAQG,GAAG,CAAC,CAACC,MAAQ;gBAACA,IAAIC,EAAE;gBAAED;aAAI;QACvDtC,QAAQ,CAAC2B,UAAYA,QAAQU,GAAG,CAAC,CAACC;oBAAQH;wBAAAA,YAAAA,KAAKK,GAAG,CAACF,IAAIC,EAAE,aAAfJ,YAAoBG;;IAChE;IAEA,MAAMG,UAAU,OAAOC;YA0BW7B,oBACrBA,wBAAkCA,+BAC7BA;QA3BhB,IAAI,CAAC6B,QAAQtB,MAAM,EAAE;QACrBhB,QAAQ;QACRE,SAAS;QACTE,UAAU;QACV,MAAMK,SAAS,MAAMtC,WACnBa,MACA,gBACA;YACEN;YACAgC,QAAQ;YACRK,UAAUuB,QAAQL,GAAG,CAAC,CAACC;gBACrB,MAAMK,QAAQ1C,MAAM,CAACqC,IAAIC,EAAE,CAAC;gBAC5B,OAAO;oBACLA,IAAID,IAAIC,EAAE;mBACNI,SAAUA,CAAAA,MAAMC,MAAM,CAACnB,IAAI,MAAMkB,MAAME,KAAK,AAAD,IAC3C;oBAAEC,WAAW;wBAAEF,QAAQD,MAAMC,MAAM,CAACnB,IAAI;wBAAIoB,OAAOF,MAAME,KAAK;oBAAC;gBAAE,IACjE,CAAC;YAET;WACI9D,aAAa;YAAEA;QAAW,IAAI,CAAC,GAC/BC,mBAAmB;YAAEA;QAAiB,IAAI,CAAC,IAEjD;YAAE+D,gBAAgBvE;QAAmB;QAEvC4B,QAAQ;QACR,IAAI,CAACS,OAAOE,EAAE,EAAE,OAAOT,UAASO,qBAAAA,OAAOG,IAAI,CAACX,KAAK,YAAjBQ,qBAAqB;QACrDoB,MAAM;gBAAKpB,yBAAAA,OAAOG,IAAI,CAACgC,SAAS,YAArBnC,yBAAyB,EAAE;gBAAOA,gCAAAA,OAAOG,IAAI,CAACiC,gBAAgB,YAA5BpC,gCAAgC,EAAE;SAAE;QACjF,MAAMqC,WAAUrC,iCAAAA,OAAOG,IAAI,CAACiC,gBAAgB,YAA5BpC,iCAAgC,EAAE;QAClD,IAAIqC,QAAQ9B,MAAM,IAAIzB,KAAKa,UAAUxC,sBAAsBkF,OAAO,CAAC,EAAE,EAAGvD,IAAIuB,QAAQ;IACtF;IAEA,MAAMiC,OAAO,OAAOb;YAYsCzB;QAXxDT,QAAQ;QACRE,SAAS;QACTE,UAAU;QACV,MAAMK,SAAS,MAAMtC,WAAqCa,MAAM,gBAAgB;YAC9EN;YACAgC,QAAQ;YACRyB,IAAID,IAAIC,EAAE;WACNxD,aAAa;YAAEA;QAAW,IAAI,CAAC,GAC/BC,mBAAmB;YAAEA;QAAiB,IAAI,CAAC;QAEjDoB,QAAQ;QACR,IAAI,CAACS,OAAOE,EAAE,IAAI,CAACF,OAAOG,IAAI,CAACyB,OAAO,EAAE,OAAOnC,UAASO,qBAAAA,OAAOG,IAAI,CAACX,KAAK,YAAjBQ,qBAAqB;QAC7EoB,MAAM;YAACpB,OAAOG,IAAI,CAACyB,OAAO;SAAC;IAC7B;IAEA,MAAMW,WAAW,CAACb,IAAYc,QAC5BnD,UAAU,CAACyB,UAAa,aAAKA;gBAAS,CAACY,GAAG,EAAE;oBAAEK,QAAQ;oBAAIC,OAAO;mBAAOlB,OAAO,CAACY,GAAG,EAAKc;;IAE1F,MAAMC,UAAUvD,KAAKwD,MAAM,CAAC,CAACjB,MAAQA,IAAIkB,MAAM,KAAK;IACpD,MAAMvC,iBAAStB,uBAAAA,IAAKsB,MAAM,mBAAI;IAE9B,qBACE,MAACnE;QAAO+B,MAAMA;QAAMK,SAASA;QAASuE,UAAS;QAAKC,SAAS;;0BAC3D,KAACzG;0BAAa4C,WAAWA,SAAS8D,IAAI,IAAI9D,SAASyB,KAAK,IAAI,aAAa;;0BACzE,KAACtE;0BACC,cAAA,MAACQ;oBAAMoG,SAAS;oBAAGC,IAAI;wBAAEC,IAAI;oBAAE;;wBAC5BjE,yBACC;;8CACE,MAACrC;oCAAMuG,WAAU;oCAAMH,SAAS;oCAAGI,UAAU;oCAACH,IAAI;wCAAEI,YAAY;wCAAUC,UAAU;oCAAO;;wCACxFrE,SAASyB,KAAK,iBACb,KAAC5D;4CAAWyG,SAAQ;4CAAQtB,OAAM;sDAC/BhD,SAASyB,KAAK;6CAEf;sDACJ,KAACzE;4CACCuH,MAAK;4CACLD,SAAQ;4CACRtB,OAAO9C,KAAKqB,MAAM,IAAI,CAACkC,QAAQlC,MAAM,GAAG,YAAY;4CACpDiD,OAAO,GAAGtE,KAAKwD,MAAM,CAAC,CAACjB,MAAQA,IAAIkB,MAAM,KAAK,cAAcpC,MAAM,CAAC,IAAI,EAAErB,KAAKqB,MAAM,CAAC,WAAW,CAAC;;wCAElGH,uBACC,KAACxC;4CACCK,QAAQA;4CACRwF,OAAOC;4CACPhD,WAAW1B,SAAS0B,SAAS;4CAC7BD,OAAOzB,SAASyB,KAAK,GAAGzB,SAASyB,KAAK,CAACkD,WAAW,KAAK;4CACvDvD,QAAQA;4CACR0C,MAAM9D,SAAS8D,IAAI;4CACnBc,UAAU1E,KAAKqB,MAAM;4CACrBsD,WAAU;6CAEV;;;8CAEN,KAACvH;oCAAKwH,cAAc;8CACjB5E,KAAKsC,GAAG,CAAC,CAACC,KAAKsC;4CAgBAtC;4CAcKrC,gBASAA;6DAtCnB,MAACtD;;gDACEiI,sBAAQ,KAAC1H;oDAAQ2H,WAAU;qDAAU;8DACtC,KAACzH;oDAAS0H,cAAc;oDAACjB,IAAI;wDAAEkB,SAAS;wDAASC,IAAI;oDAAI;8DACvD,cAAA,MAACxH;wDAAMoG,SAAS;;0EACd,KAACtG;gEACC2H,SAAShH,iBAAiBqE;gEAC1B4C,WACE5C,IAAIkB,MAAM,KAAK,gBAAgB7D,MAC3B;oEACE,CAAC,cAAc,EAAEzB,iBAAiBoE,IAAI6C,aAAa,EAAExF,IAAIuB,QAAQ,GAAG,GACjEoB,CAAAA,IAAI8C,eAAe,GAAG,CAAC,IAAI,EAAE9C,IAAI8C,eAAe,EAAE,GAAG,EAAC;oEACzD/G,kBAAkBiE,IAAIQ,SAAS;iEAChC,CACES,MAAM,CAAC8B,SACPC,IAAI,CAAC,UACRhD,kBAAAA,IAAIiD,UAAU,YAAdjD,kBAAmBA,IAAIkD,MAAM,KAAK,gBAAgB,SAAS;;4DAGlElD,IAAIkB,MAAM,KAAK,6BACd,KAAC7G;0EACC,cAAA,KAACC;oEAAOwH,MAAK;oEAAQqB,SAAS,IAAM,KAAKtC,KAAKb;oEAAMoD,UAAUvF;8EAC3D;;+EAIL,MAAC3C;gEAAMuG,WAAW;oEAAE4B,IAAI;oEAAUC,IAAI;gEAAM;gEAAGhC,SAAS;;kFACtD,KAACnG;wEACC2G,MAAK;wEACLC,OAAM;wEACNwB,KAAK,WAAE5F,iBAAAA,MAAM,CAACqC,IAAIC,EAAE,CAAC,qBAAdtC,eAAgB2C,MAAM,mBAAI;wEACjCkD,UAAU,CAACC,QAAU3C,SAASd,IAAIC,EAAE,EAAE;gFAAEK,QAAQmD,MAAMnF,MAAM,CAACiF,KAAK;4EAAC;wEACnEG,WAAW;4EAAEC,WAAW;gFAAEC,WAAW9H;4EAAuB;wEAAE;wEAC9DyF,IAAI;4EAAEsC,MAAM;wEAAE;;kFAEhB,MAAC1I;wEACC2I,MAAM;wEACNhC,MAAK;wEACLC,OAAM;wEACNwB,KAAK,YAAE5F,kBAAAA,MAAM,CAACqC,IAAIC,EAAE,CAAC,qBAAdtC,gBAAgB4C,KAAK,oBAAI;wEAChCiD,UAAU,CAACC,QAAU3C,SAASd,IAAIC,EAAE,EAAE;gFAAEM,OAAOkD,MAAMnF,MAAM,CAACiF,KAAK;4EAAC;wEAClEhC,IAAI;4EAAEsC,MAAM;wEAAE;;0FAEd,KAAC5I;gFAASsI,OAAM;0FAAI;;4EACnB1H,0BAA0BkE,GAAG,CAAC,CAACQ,sBAC9B,KAACtF;oFAAqBsI,OAAOhD;8FAC1BA;mFADYA;;;kFAKnB,KAACjG;wEACCuH,SAAQ;wEACRsB,SAAS,IAAM,KAAKhD,QAAQ;gFAACH;6EAAI;wEACjCoD,UAAUvF;wEACV0D,IAAI;4EAAEwC,WAAW/H;wEAAa;kFAE7B;;;;;;;;2CAvDHgE,IAAIC,EAAE;;;;2CAkEtB;;8CACE,KAAC9E;oCACC6I,SAAS;oCACTjC,OAAM;oCACNkC,aAAY;oCACZV,OAAOxG;oCACPyG,UAAU,CAACC,QAAUzG,QAAQyG,MAAMnF,MAAM,CAACiF,KAAK;;gCAEhDtG,UAAU6B,MAAM,iBACf,KAACjE;oCAAKqJ,KAAK;oCAAC7B,cAAc;8CACvBpF,UAAU8C,GAAG,CAAC,CAACoE,oBACd,MAACrJ;4CAA+BuH,cAAc;;8DAC5C,KAACtH;oDAAeoI,SAAS,IAAM,KAAK9E,aAAa;4DAAEU,aAAaoF,IAAIpF,WAAW;wDAAC;8DAC9E,cAAA,KAAC/D;wDACC2H,SAASwB,IAAI9C,IAAI,IAAI8C,IAAInF,KAAK,IAAI;wDAClC4D,WAAW;4DACT,GAAGuB,IAAIC,cAAc,CAAC,IAAI,EAAED,IAAIhC,QAAQ,CAAC,WAAW,CAAC;4DACrDgC,IAAIE,KAAK,CAACrB,IAAI,CAAC;4DACfmB,IAAInF,KAAK;4DACTmF,IAAIG,KAAK;yDACV,CACErD,MAAM,CAAC8B,SACPC,IAAI,CAAC;;;gDAGXrE,uBACC,KAACxC;oDACCK,QAAQA;oDACRwF,OAAOC;oDACPhD,WAAWkF,IAAIlF,SAAS;oDACxBD,OAAOmF,IAAInF,KAAK,GAAGmF,IAAInF,KAAK,CAACkD,WAAW,KAAK;oDAC7CvD,QAAQA;oDACR0C,MAAM8C,IAAI9C,IAAI;oDACdc,UAAUgC,IAAIhC,QAAQ;oDACtBC,WAAU;qDAEV;;2CAzBS+B,IAAIpF,WAAW;qCA6BhC5B,yBACF,KAAC/B;oCAAWyG,SAAQ;oCAAQtB,OAAM;8CAC/B;mDAGH,KAACnF;oCAAWyG,SAAQ;oCAAQtB,OAAM;8CAC/B;;;;wBAKRtC,uBAAS,KAAC7D;4BAAMmK,UAAS;sCAAQtG;6BAAkB;wBACnDF,sBAAQ,KAAC3D;4BAAMmK,UAAS;sCAAWxG;6BAAiB;;;;0BAGzD,MAACtD;;oBACE8C,yBACC,KAACjD;wBACC6I,SAAS;4BACP3F,YAAY;4BACZE,QAAQ,EAAE;4BACVQ,UAAU;wBACZ;kCAEC;yBAED;kCACJ,KAAC7D;wBAAIkH,IAAI;4BAAEsC,MAAM;wBAAE;;kCACnB,KAACvJ;wBAAO6I,SAASvG;kCAAU;;oBAC1BW,YAAYyD,QAAQlC,MAAM,GAAG,kBAC5B,KAACxE;wBAAOuH,SAAQ;wBAAYuB,UAAUvF;wBAAMsF,SAAS,IAAM,KAAKhD,QAAQa;kCACrE,CAAC,aAAa,EAAEA,QAAQlC,MAAM,EAAE;yBAEjC;;;;;AAIZ;AAEAzC,iBAAiBmI,WAAW,GAAG;AAE/B,eAAenI,iBAAgB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ConsolePosCheckInZoneProps } from '../pos-zones';
|
|
2
|
+
/**
|
|
3
|
+
* The register's check-in zone (AGL-4043), for one customer on one day:
|
|
4
|
+
* whatever another plugin shows there — a status, a button that starts its
|
|
5
|
+
* own flow — through the console shell's renderer and its gates. Outside the
|
|
6
|
+
* shell it draws nothing. Memoized: the check-in list redraws on every tap,
|
|
7
|
+
* and the shell's renderer is not.
|
|
8
|
+
*/
|
|
9
|
+
export declare const PosCheckInZone: import("react").MemoExoticComponent<(props: ConsolePosCheckInZoneProps) => import("react").JSX.Element>;
|
|
@@ -0,0 +1,37 @@
|
|
|
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 } from "react/jsx-runtime";
|
|
19
|
+
import { useConsoleWidgetSlot } from "@aglyn/aglyn/app-utils/console-widget-slot-context";
|
|
20
|
+
import { memo } from "react";
|
|
21
|
+
import { POS_CHECK_IN_ZONE } from "../pos-zones.js";
|
|
22
|
+
/**
|
|
23
|
+
* The register's check-in zone (AGL-4043), for one customer on one day:
|
|
24
|
+
* whatever another plugin shows there — a status, a button that starts its
|
|
25
|
+
* own flow — through the console shell's renderer and its gates. Outside the
|
|
26
|
+
* shell it draws nothing. Memoized: the check-in list redraws on every tap,
|
|
27
|
+
* and the shell's renderer is not.
|
|
28
|
+
*/ export const PosCheckInZone = /*#__PURE__*/ memo(function PosCheckInZone(props) {
|
|
29
|
+
const Renderer = useConsoleWidgetSlot();
|
|
30
|
+
if (!Renderer) return null;
|
|
31
|
+
return /*#__PURE__*/ _jsx(Renderer, _extends({
|
|
32
|
+
slot: POS_CHECK_IN_ZONE.id
|
|
33
|
+
}, props));
|
|
34
|
+
});
|
|
35
|
+
PosCheckInZone.displayName = 'PosCheckInZone';
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=pos-check-in-zone.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-check-in-zone.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 { useConsoleWidgetSlot } from '@aglyn/aglyn/app-utils/console-widget-slot-context'\nimport { memo } from 'react'\nimport { POS_CHECK_IN_ZONE, type ConsolePosCheckInZoneProps } from '../pos-zones'\n\n/**\n * The register's check-in zone (AGL-4043), for one customer on one day:\n * whatever another plugin shows there — a status, a button that starts its\n * own flow — through the console shell's renderer and its gates. Outside the\n * shell it draws nothing. Memoized: the check-in list redraws on every tap,\n * and the shell's renderer is not.\n */\nexport const PosCheckInZone = memo(function PosCheckInZone(props: ConsolePosCheckInZoneProps) {\n const Renderer = useConsoleWidgetSlot()\n if (!Renderer) return null\n return <Renderer slot={POS_CHECK_IN_ZONE.id} {...props} />\n})\n\nPosCheckInZone.displayName = 'PosCheckInZone'\n"],"names":["useConsoleWidgetSlot","memo","POS_CHECK_IN_ZONE","PosCheckInZone","props","Renderer","slot","id","displayName"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;;AAEA,SAASA,oBAAoB,QAAQ,qDAAoD;AACzF,SAASC,IAAI,QAAQ,QAAO;AAC5B,SAASC,iBAAiB,QAAyC,kBAAc;AAEjF;;;;;;CAMC,GACD,OAAO,MAAMC,+BAAiBF,KAAK,SAASE,eAAeC,KAAiC;IAC1F,MAAMC,WAAWL;IACjB,IAAI,CAACK,UAAU,OAAO;IACtB,qBAAO,KAACA;QAASC,MAAMJ,kBAAkBK,EAAE;OAAMH;AACnD,GAAE;AAEFD,eAAeK,WAAW,GAAG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type CheckInDayTotals, type CheckInRow } from '../../../model/commerce-check-in';
|
|
2
|
+
export interface PosCheckInsCardProps {
|
|
3
|
+
hostId: string;
|
|
4
|
+
/** The viewer may work the register: what the route's gate asks. */
|
|
5
|
+
canManagePos?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface DayList {
|
|
8
|
+
dayKey: string;
|
|
9
|
+
timeZone: string;
|
|
10
|
+
totals: CheckInDayTotals;
|
|
11
|
+
checkIns: CheckInRow[];
|
|
12
|
+
truncated?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** The day's list as a printable 80 mm document, like the day totals. */
|
|
15
|
+
export declare function posCheckInsDocument(list: DayList): string;
|
|
16
|
+
/**
|
|
17
|
+
* Today's check-ins (AGL-4043): beside the day totals, for a store with a
|
|
18
|
+
* register, on a plan with the point of sale.
|
|
19
|
+
*/
|
|
20
|
+
export declare function PosCheckInsCard(props: PosCheckInsCardProps): import("react").JSX.Element;
|
|
21
|
+
export declare namespace PosCheckInsCard {
|
|
22
|
+
var displayName: string;
|
|
23
|
+
}
|
|
24
|
+
export default PosCheckInsCard;
|