@aglyn/plugins-commerce 1.0.0-beta.287 → 1.0.0-beta.289

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 (109) hide show
  1. package/README.md +2 -2
  2. package/package.json +13 -13
  3. package/src/lib/components/commerce-console-page.js +29 -2
  4. package/src/lib/components/commerce-console-page.js.map +1 -1
  5. package/src/lib/components/console/commerce-analytics-card.component.js +4 -2
  6. package/src/lib/components/console/commerce-analytics-card.component.js.map +1 -1
  7. package/src/lib/components/console/host-orders-card.component.js +5 -1
  8. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  9. package/src/lib/components/console/host-quotes-card.component.d.ts +34 -0
  10. package/src/lib/components/console/host-quotes-card.component.js +247 -0
  11. package/src/lib/components/console/host-quotes-card.component.js.map +1 -0
  12. package/src/lib/components/console/order-webhooks-card.component.js +1 -1
  13. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -1
  14. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +33 -28
  15. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
  16. package/src/lib/components/console/quote-editor-dialog.component.d.ts +45 -0
  17. package/src/lib/components/console/quote-editor-dialog.component.js +1266 -0
  18. package/src/lib/components/console/quote-editor-dialog.component.js.map +1 -0
  19. package/src/lib/components/console/quote-pay-link.component.d.ts +38 -0
  20. package/src/lib/components/console/quote-pay-link.component.js +213 -0
  21. package/src/lib/components/console/quote-pay-link.component.js.map +1 -0
  22. package/src/lib/components/console/quote-settings-card.component.d.ts +29 -0
  23. package/src/lib/components/console/quote-settings-card.component.js +121 -0
  24. package/src/lib/components/console/quote-settings-card.component.js.map +1 -0
  25. package/src/lib/components/console/tax-settings-card.component.js +4 -1
  26. package/src/lib/components/console/tax-settings-card.component.js.map +1 -1
  27. package/src/lib/components/quote-page-body.d.ts +33 -0
  28. package/src/lib/components/quote-page-body.js +696 -0
  29. package/src/lib/components/quote-page-body.js.map +1 -0
  30. package/src/lib/components/quote-page.d.ts +29 -0
  31. package/src/lib/components/quote-page.js +96 -0
  32. package/src/lib/components/quote-page.js.map +1 -0
  33. package/src/lib/components/storefront-payment-element.d.ts +7 -1
  34. package/src/lib/components/storefront-payment-element.js +8 -3
  35. package/src/lib/components/storefront-payment-element.js.map +1 -1
  36. package/src/lib/constants/orders-list-query.js +6 -1
  37. package/src/lib/constants/orders-list-query.js.map +1 -1
  38. package/src/lib/constants/quote-page.d.ts +30 -0
  39. package/src/lib/constants/quote-page.js +35 -0
  40. package/src/lib/constants/quote-page.js.map +1 -0
  41. package/src/lib/declarations.js +5 -1
  42. package/src/lib/declarations.js.map +1 -1
  43. package/src/lib/model/commerce-orders.d.ts +25 -2
  44. package/src/lib/model/commerce-orders.js +10 -1
  45. package/src/lib/model/commerce-orders.js.map +1 -1
  46. package/src/lib/model/commerce-quote-pay.d.ts +229 -0
  47. package/src/lib/model/commerce-quote-pay.js +393 -0
  48. package/src/lib/model/commerce-quote-pay.js.map +1 -0
  49. package/src/lib/model/commerce-quotes.d.ts +279 -0
  50. package/src/lib/model/commerce-quotes.js +522 -0
  51. package/src/lib/model/commerce-quotes.js.map +1 -0
  52. package/src/lib/model/index.d.ts +2 -0
  53. package/src/lib/model/index.js +2 -0
  54. package/src/lib/model/index.js.map +1 -1
  55. package/src/lib/model/plugin-permissions.d.ts +8 -1
  56. package/src/lib/model/plugin-permissions.js +21 -1
  57. package/src/lib/model/plugin-permissions.js.map +1 -1
  58. package/src/lib/model/workspace-site-permissions.d.ts +26 -0
  59. package/src/lib/model/workspace-site-permissions.js +81 -0
  60. package/src/lib/model/workspace-site-permissions.js.map +1 -0
  61. package/src/lib/server/api-v1/orders-and-products.js +6 -2
  62. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  63. package/src/lib/server/billing-webhook.js +127 -52
  64. package/src/lib/server/billing-webhook.js.map +1 -1
  65. package/src/lib/server/checkout-session-expiry.d.ts +36 -0
  66. package/src/lib/server/checkout-session-expiry.js +63 -0
  67. package/src/lib/server/checkout-session-expiry.js.map +1 -0
  68. package/src/lib/server/commerce-site-keys.d.ts +19 -0
  69. package/src/lib/server/commerce-site-keys.js +23 -2
  70. package/src/lib/server/commerce-site-keys.js.map +1 -1
  71. package/src/lib/server/draft-order.js +16 -8
  72. package/src/lib/server/draft-order.js.map +1 -1
  73. package/src/lib/server/order-webhooks.js +8 -8
  74. package/src/lib/server/order-webhooks.js.map +1 -1
  75. package/src/lib/server/person-eraser.d.ts +7 -0
  76. package/src/lib/server/person-eraser.js +24 -2
  77. package/src/lib/server/person-eraser.js.map +1 -1
  78. package/src/lib/server/pos-ops-gate.d.ts +13 -5
  79. package/src/lib/server/pos-ops-gate.js +12 -14
  80. package/src/lib/server/pos-ops-gate.js.map +1 -1
  81. package/src/lib/server/pos-refund-authority.d.ts +3 -1
  82. package/src/lib/server/pos-refund-authority.js +3 -2
  83. package/src/lib/server/pos-refund-authority.js.map +1 -1
  84. package/src/lib/server/pos-return.js +6 -7
  85. package/src/lib/server/pos-return.js.map +1 -1
  86. package/src/lib/server/pos-staff-pin.js +7 -7
  87. package/src/lib/server/pos-staff-pin.js.map +1 -1
  88. package/src/lib/server/quote-link-token.d.ts +39 -0
  89. package/src/lib/server/quote-link-token.js +97 -0
  90. package/src/lib/server/quote-link-token.js.map +1 -0
  91. package/src/lib/server/quote-pay.d.ts +83 -0
  92. package/src/lib/server/quote-pay.js +606 -0
  93. package/src/lib/server/quote-pay.js.map +1 -0
  94. package/src/lib/server/quote.d.ts +49 -0
  95. package/src/lib/server/quote.js +513 -0
  96. package/src/lib/server/quote.js.map +1 -0
  97. package/src/lib/server/refund.js +26 -36
  98. package/src/lib/server/refund.js.map +1 -1
  99. package/src/lib/server/related.js +2 -0
  100. package/src/lib/server/related.js.map +1 -1
  101. package/src/lib/server/site-page-resolver.d.ts +2 -0
  102. package/src/lib/server/site-page-resolver.js +75 -0
  103. package/src/lib/server/site-page-resolver.js.map +1 -1
  104. package/src/lib/server.js +14 -0
  105. package/src/lib/server.js.map +1 -1
  106. package/src/lib/site.js +6 -0
  107. package/src/lib/site.js.map +1 -1
  108. package/src/lib/transfer/tracking.server.js +6 -0
  109. package/src/lib/transfer/tracking.server.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-check-ins-card.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 { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useFirestore, useFirestoreCollection, useUser } from '@aglyn/tenant-feature-instance'\nimport { Alert, Button, Chip, Stack, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport type { Dayjs } from 'dayjs'\nimport { collection, documentId, limit, orderBy, query } from 'firebase/firestore'\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useState } from 'react'\nimport { zonedDayKey } from '@aglyn/shared-util-timestamp/zoned-time'\nimport {\n checkInItemLabel,\n checkInRainCheckIsOpen,\n checkInStatusLabel,\n checkInTimeLabel,\n describeWristband,\n POS_CHECK_IN_ROUTE,\n rainCheckLabel,\n type CheckInDayTotals,\n type CheckInRow,\n} from '../../../model/commerce-check-in'\nimport { callPosOps } from './pos-ops-api'\nimport type { StayCheckInMode } from '../../../model/commerce-reservations'\nimport { PosRainCheckDialog } from './pos-rain-check-dialog.component'\nimport { escapeHtml } from '../../../utils/escape-html'\nimport CommerceStatTile from '../commerce-stat-tile.component'\nimport { EntitlementGatedCard } from '../entitlement-gate.component'\nimport { POS_RECEIPT_STYLES } from './pos-receipt'\nimport { printPosDocument } from './pos-shift-report.component'\n\n/*==========================================\n * TODAY'S CHECK-INS (AGL-4043): who is due at the window on a day, who is\n * checked in, by whom and with which wristband, from\n * `GET /api/commerce/pos-check-in`. The day is a whole, bounded list, so\n * the grid sorts it by any column itself.\n *=========================================*/\n\nexport interface PosCheckInsCardProps {\n hostId: string\n /** The viewer may work the register: what the route's gate asks. */\n canManagePos?: boolean\n}\n\n/** A stay's guest count (AGL-4043), loaded the first time it opens. */\nconst ReservationGuestsDialog = lazy(() => import('../reservation-guests-dialog.component'))\n\nconst HEADER = \"Today's check-ins\"\nconst HELP = pluginDocsHelp('posOperations', { anchor: '#check-in-at-the-window' })\nconst DAY_FORMAT = 'YYYY-MM-DD'\n\ninterface DayList {\n dayKey: string\n timeZone: string\n totals: CheckInDayTotals\n checkIns: CheckInRow[]\n truncated?: boolean\n /** How the store checks stays in (AGL-4043). */\n stayCheckIn?: StayCheckInMode\n}\n\n/** The quick control's choices, in the order the window reads them. */\nconst STAY_MODE_LABELS: ReadonlyArray<{ mode: StayCheckInMode; label: string }> = [\n { mode: 'resource', label: 'As each resource is set' },\n { mode: 'stay', label: 'One per stay' },\n { mode: 'guest', label: 'One per guest' },\n]\n\ntype Answer =\n | { state: 'idle' | 'loading' }\n | { state: 'ready'; list: DayList }\n | { state: 'error'; error: string }\n\n/** The day's list as a printable 80 mm document, like the day totals. */\nexport function posCheckInsDocument(list: DayList): string {\n const rows = list.checkIns\n .map(\n (row) =>\n `<div class=\"row\"><span>${escapeHtml(`${row.customerName || row.customerEmail || 'Customer'} · ${checkInItemLabel(row)}`)}</span>` +\n `<span>${escapeHtml(\n row.status === 'checked_in'\n ? [checkInTimeLabel(row.checkedInAtMs, list.timeZone), describeWristband(row.wristband)].filter(Boolean).join(' ')\n : checkInRainCheckIsOpen(row)\n ? 'Rain check'\n : '—',\n )}</span></div>`,\n )\n .join('')\n return (\n '<!doctype html><html><head><meta charset=\"utf-8\">' +\n `<title>CHECK-INS</title><style>${POS_RECEIPT_STYLES}</style></head><body>` +\n `<div class=\"receipt\"><div class=\"center\"><div class=\"title\">CHECK-INS</div>` +\n `<div class=\"muted\">${escapeHtml(list.dayKey)} · ${list.totals.checkedIn} of ${list.totals.expected} checked in</div></div>` +\n `<hr class=\"rule\">${rows}</div></body></html>`\n )\n}\n\nfunction PosCheckInsBody(props: PosCheckInsCardProps) {\n const { hostId, canManagePos = false } = props\n const { data: user } = useUser()\n const [day, setDay] = useState<Dayjs | null>(null)\n const [answer, setAnswer] = useState<Answer>({ state: 'idle' })\n const [exporting, setExporting] = useState(false)\n /** The pass a rain check is being given on (AGL-4043). */\n const [rainCheckRow, setRainCheckRow] = useState<CheckInRow | null>(null)\n const [actionError, setActionError] = useState('')\n /** The stay whose guests are being changed (AGL-4043). */\n const [guestsFor, setGuestsFor] = useState<string | null>(null)\n\n const url = useCallback(\n (format?: 'csv') => {\n const params = new URLSearchParams({ hostId })\n if (day?.isValid()) params.set('day', day.format(DAY_FORMAT))\n if (format) params.set('format', format)\n return `${POS_CHECK_IN_ROUTE}?${params.toString()}`\n },\n [hostId, day],\n )\n\n const load = useCallback(async () => {\n if (!user || !canManagePos) return\n setAnswer({ state: 'loading' })\n try {\n const response = await authorizedFetch(user as never, url(), { method: 'GET' })\n const body = (await response.json().catch(() => ({}))) as Partial<DayList> & { error?: string }\n setAnswer(\n response.ok && body.checkIns\n ? { state: 'ready', list: body as DayList }\n : { state: 'error', error: body.error || 'The check-ins could not be read.' },\n )\n } catch {\n setAnswer({ state: 'error', error: 'The check-ins could not be read. Check the connection.' })\n }\n }, [user, canManagePos, url])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const list = answer.state === 'ready' ? answer.list : null\n const todayKey = list ? zonedDayKey(Date.now(), list.timeZone) : ''\n\n const [savingStayMode, setSavingStayMode] = useState(false)\n /** The store's quick control for stays: one check-in per stay or per guest (AGL-4043). */\n const setStayMode = useCallback(\n async (mode: StayCheckInMode) => {\n setActionError('')\n setSavingStayMode(true)\n const done = await callPosOps(user, 'pos-check-in', {\n hostId,\n action: 'stay_mode',\n mode,\n ...(day?.isValid() ? { day: day.format(DAY_FORMAT) } : {}),\n })\n setSavingStayMode(false)\n if (!done.ok) return setActionError(done.body.error ?? 'The setting could not be saved.')\n await load()\n },\n [user, hostId, day, load],\n )\n\n const undoRainCheck = useCallback(\n async (row: CheckInRow) => {\n setActionError('')\n const done = await callPosOps<{ checkIn?: CheckInRow }>(user, 'pos-check-in', {\n hostId,\n action: 'undo_rain_check',\n id: row.id,\n })\n if (!done.ok) return setActionError(done.body.error ?? 'The rain check could not be undone.')\n await load()\n },\n [user, hostId, load],\n )\n\n const columns = useMemo<GridColDef[]>(\n () => [\n {\n field: 'customerName',\n headerName: 'Name',\n flex: 1,\n minWidth: 150,\n valueGetter: (_value: unknown, row: CheckInRow) => row.customerName || row.customerEmail || '',\n },\n {\n field: 'itemName',\n headerName: 'Item',\n flex: 1,\n minWidth: 160,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInItemLabel(row),\n },\n {\n field: 'orderLabel',\n headerName: 'Order',\n minWidth: 100,\n valueGetter: (_value: unknown, row: CheckInRow) => row.orderLabel ?? (row.source === 'reservation' ? 'Stay' : ''),\n },\n {\n field: 'status',\n headerName: 'Status',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInStatusLabel(row),\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.status === 'checked_in' ? (\n <Chip size=\"small\" color=\"success\" label=\"Checked in\" />\n ) : checkInRainCheckIsOpen(row) ? (\n <Chip size=\"small\" color=\"info\" variant=\"outlined\" label=\"Rain check\" />\n ) : (\n <Chip size=\"small\" variant=\"outlined\" label=\"Expected\" />\n ),\n },\n {\n field: 'rainCheck',\n headerName: 'Rain check',\n minWidth: 200,\n flex: 1,\n valueGetter: (_value: unknown, row: CheckInRow) => rainCheckLabel(row),\n },\n {\n field: 'checkedInAtMs',\n headerName: 'Checked in at',\n type: 'number',\n minWidth: 120,\n valueFormatter: (value: number | null) => (list ? checkInTimeLabel(value, list.timeZone) : ''),\n },\n { field: 'checkedInByName', headerName: 'By', minWidth: 120 },\n {\n field: 'wristband',\n headerName: 'Wristband',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => describeWristband(row.wristband),\n },\n {\n // What a pass waiting at the window can still have done to it: a\n // rain check, or one taken back; and a stay's guest count (AGL-4043).\n // Not a value, so nothing to sort.\n field: 'rainCheckAction',\n headerName: '',\n minWidth: 150,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.source === 'reservation' && row.reservationId ? (\n <Button size=\"small\" disabled={!canManagePos} onClick={() => setGuestsFor(row.reservationId)}>\n {'Guests'}\n </Button>\n ) : row.source !== 'order' || row.status !== 'expected' ? null : row.rainCheck ? (\n <Button size=\"small\" disabled={!canManagePos} onClick={() => void undoRainCheck(row)}>\n {'Undo rain check'}\n </Button>\n ) : (\n <Button size=\"small\" disabled={!canManagePos || !todayKey} onClick={() => setRainCheckRow(row)}>\n {'Rain check'}\n </Button>\n ),\n },\n ],\n [list, canManagePos, todayKey, undoRainCheck],\n )\n const rows = useMemo(() => (list ? list.checkIns.map((row) => ({ ...row, $id: row.id })) : []), [list])\n\n const exportCsv = async () => {\n if (!user || !list) return\n setExporting(true)\n try {\n const response = await authorizedFetch(user as never, url('csv'), { method: 'GET' })\n if (!response.ok) {\n const body = (await response.json().catch(() => ({}))) as { error?: string }\n setAnswer({ state: 'error', error: body.error || 'The spreadsheet could not be made.' })\n return\n }\n const blob = new Blob([await response.text()], { type: 'text/csv;charset=utf-8' })\n const href = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = href\n link.download = `check-ins-${list.dayKey}.csv`\n link.click()\n window.setTimeout(() => URL.revokeObjectURL(href), 1000)\n } finally {\n setExporting(false)\n }\n }\n\n return (\n <CardDisplay\n header={HEADER}\n help={HELP}\n HeaderProps={{\n action: (\n <Stack direction=\"row\" spacing={1}>\n <Button size=\"small\" onClick={() => void load()} disabled={!canManagePos || answer.state === 'loading'}>\n {'Refresh'}\n </Button>\n <Button size=\"small\" onClick={() => void exportCsv()} disabled={!list || exporting}>\n {'Export CSV'}\n </Button>\n <Button size=\"small\" onClick={() => list && printPosDocument(posCheckInsDocument(list))} disabled={!list}>\n {'Print'}\n </Button>\n </Stack>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2.5}>\n {!canManagePos ? (\n <Alert severity=\"info\">\n {'Check-ins are for members who can use the register: a site admin or editor with the \"Use the point of sale\" permission.'}\n </Alert>\n ) : null}\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'center' } }}>\n <DatePicker\n label=\"Day\"\n value={day}\n onChange={setDay}\n disabled={!canManagePos}\n slotProps={{ textField: { size: 'small' } }}\n />\n <Button size=\"small\" disabled={!canManagePos || !day} onClick={() => setDay(null)}>\n {'Today'}\n </Button>\n </Stack>\n </LocalizationProvider>\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\" component=\"h3\" id=\"stay-check-in-label\">\n {'Stays at check-in'}\n </Typography>\n <ToggleButtonGroup\n exclusive\n size=\"small\"\n aria-labelledby=\"stay-check-in-label\"\n value={list?.stayCheckIn ?? 'resource'}\n onChange={(_event, mode: StayCheckInMode | null) => {\n if (mode && mode !== list?.stayCheckIn) void setStayMode(mode)\n }}\n disabled={!canManagePos || !list || savingStayMode}\n sx={{ flexWrap: 'wrap' }}\n >\n {STAY_MODE_LABELS.map((choice) => (\n <ToggleButton key={choice.mode} value={choice.mode}>\n {choice.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'One per guest gives each guest of a stay their own check-in and wristband, by the stay’s guest count.'}\n </Typography>\n </Stack>\n {answer.state === 'loading' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Reading who is due…'}\n </Typography>\n ) : null}\n {answer.state === 'error' ? <Alert severity=\"warning\">{answer.error}</Alert> : null}\n {list ? (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${list.dayKey} · ${list.timeZone} · passes and stays that need check-in`}\n </Typography>\n {list.truncated ? (\n <Alert severity=\"warning\">\n {'This day has more check-ins than one list reads; some are missing here.'}\n </Alert>\n ) : null}\n <Stack direction=\"row\" spacing={3} sx={{ flexWrap: 'wrap', rowGap: 1.5 }}>\n <CommerceStatTile label=\"Expected\" value={String(list.totals.expected)} />\n <CommerceStatTile label=\"Checked in\" value={String(list.totals.checkedIn)} />\n <CommerceStatTile label=\"Still to come\" value={String(list.totals.expected - list.totals.checkedIn)} />\n {list.totals.rainChecks ? (\n <CommerceStatTile label=\"Rain checks\" value={String(list.totals.rainChecks)} />\n ) : null}\n </Stack>\n {actionError ? <Alert severity=\"warning\">{actionError}</Alert> : null}\n <ListTable\n aria-label=\"Check-ins on this day\"\n rows={rows}\n columns={columns}\n noRowsLabel=\"Nobody is due to check in on this day\"\n />\n </>\n ) : null}\n </Stack>\n <PosRainCheckDialog\n row={rainCheckRow}\n hostId={hostId}\n todayKey={todayKey}\n onClose={() => setRainCheckRow(null)}\n onDone={() => {\n setRainCheckRow(null)\n void load()\n }}\n />\n {guestsFor ? (\n <Suspense fallback={null}>\n <ReservationGuestsDialog\n reservationId={guestsFor}\n hostId={hostId}\n onClose={() => setGuestsFor(null)}\n onDone={() => {\n setGuestsFor(null)\n void load()\n }}\n />\n </Suspense>\n ) : null}\n </CardDisplay>\n )\n}\n\n/**\n * Today's check-ins (AGL-4043): beside the day totals, for a store with a\n * register, on a plan with the point of sale.\n */\nexport function PosCheckInsCard(props: PosCheckInsCardProps) {\n const firestore = useFirestore()\n // Whether the store has a register at all, as the day totals ask it.\n const { data: registers, status } = useFirestoreCollection<any>(\n () =>\n query(collection(firestore, 'hosts', props.hostId, 'registers'), orderBy(documentId()), limit(1)),\n [firestore, props.hostId],\n { idField: '$id' },\n )\n if (status === 'success' && !registers?.length) return null\n return (\n <EntitlementGatedCard\n hostId={props.hostId}\n feature=\"pos\"\n header={HEADER}\n help={HELP}\n upsell={'Checking in passes, camping and stays at the window, with wristbands, comes with the point of sale.'}\n >\n <PosCheckInsBody {...props} />\n </EntitlementGatedCard>\n )\n}\n\nPosCheckInsCard.displayName = 'PosCheckInsCard'\n\nexport default PosCheckInsCard\n"],"names":["pluginDocsHelp","CardDisplay","ListTable","authorizedFetch","useFirestore","useFirestoreCollection","useUser","Alert","Button","Chip","Stack","ToggleButton","ToggleButtonGroup","Typography","AdapterDayjs","DatePicker","LocalizationProvider","collection","documentId","limit","orderBy","query","lazy","Suspense","useCallback","useEffect","useMemo","useState","zonedDayKey","checkInItemLabel","checkInRainCheckIsOpen","checkInStatusLabel","checkInTimeLabel","describeWristband","POS_CHECK_IN_ROUTE","rainCheckLabel","callPosOps","PosRainCheckDialog","escapeHtml","CommerceStatTile","EntitlementGatedCard","POS_RECEIPT_STYLES","printPosDocument","ReservationGuestsDialog","HEADER","HELP","anchor","DAY_FORMAT","STAY_MODE_LABELS","mode","label","posCheckInsDocument","list","rows","checkIns","map","row","customerName","customerEmail","status","checkedInAtMs","timeZone","wristband","filter","Boolean","join","dayKey","totals","checkedIn","expected","PosCheckInsBody","props","hostId","canManagePos","data","user","day","setDay","answer","setAnswer","state","exporting","setExporting","rainCheckRow","setRainCheckRow","actionError","setActionError","guestsFor","setGuestsFor","url","format","params","URLSearchParams","isValid","set","toString","load","response","method","body","json","catch","ok","error","todayKey","Date","now","savingStayMode","setSavingStayMode","setStayMode","done","action","undoRainCheck","id","columns","field","headerName","flex","minWidth","valueGetter","_value","orderLabel","source","renderCell","size","color","variant","type","valueFormatter","value","sortable","filterable","hideable","disableColumnMenu","reservationId","disabled","onClick","rainCheck","$id","exportCsv","blob","Blob","text","href","URL","createObjectURL","link","document","createElement","download","click","window","setTimeout","revokeObjectURL","header","help","HeaderProps","direction","spacing","contentGutterX","contentGutterY","severity","dateAdapter","xs","sm","sx","alignItems","onChange","slotProps","textField","component","exclusive","aria-labelledby","stayCheckIn","_event","flexWrap","choice","truncated","rowGap","String","rainChecks","aria-label","noRowsLabel","onClose","onDone","fallback","PosCheckInsCard","firestore","registers","idField","length","feature","upsell","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-ops/pos-check-ins-card.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 { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useFirestore, useFirestoreCollection, useUser } from '@aglyn/tenant-feature-instance'\nimport { Alert, Button, Chip, Stack, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport type { Dayjs } from 'dayjs'\nimport { collection, documentId, limit, orderBy, query } from 'firebase/firestore'\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useState } from 'react'\nimport { zonedDayKey } from '@aglyn/shared-util-timestamp/zoned-time'\nimport {\n checkInItemLabel,\n checkInRainCheckIsOpen,\n checkInStatusLabel,\n checkInTimeLabel,\n describeWristband,\n POS_CHECK_IN_ROUTE,\n rainCheckLabel,\n type CheckInDayTotals,\n type CheckInRow,\n} from '../../../model/commerce-check-in'\nimport { callPosOps } from './pos-ops-api'\nimport type { StayCheckInMode } from '../../../model/commerce-reservations'\nimport { PosRainCheckDialog } from './pos-rain-check-dialog.component'\nimport { escapeHtml } from '../../../utils/escape-html'\nimport CommerceStatTile from '../commerce-stat-tile.component'\nimport { EntitlementGatedCard } from '../entitlement-gate.component'\nimport { POS_RECEIPT_STYLES } from './pos-receipt'\nimport { printPosDocument } from './pos-shift-report.component'\n\n/*==========================================\n * TODAY'S CHECK-INS (AGL-4043): who is due at the window on a day, who is\n * checked in, by whom and with which wristband, from\n * `GET /api/commerce/pos-check-in`. The day is a whole, bounded list, so\n * the grid sorts it by any column itself.\n *=========================================*/\n\nexport interface PosCheckInsCardProps {\n hostId: string\n /** The viewer may work the register: what the route's gate asks. */\n canManagePos?: boolean\n}\n\n/** A stay's guest count (AGL-4043), loaded the first time it opens. */\nconst ReservationGuestsDialog = lazy(() => import('../reservation-guests-dialog.component'))\n\nconst HEADER = \"Today's check-ins\"\nconst HELP = pluginDocsHelp('posOperations', { anchor: '#check-in-at-the-window' })\nconst DAY_FORMAT = 'YYYY-MM-DD'\n\ninterface DayList {\n dayKey: string\n timeZone: string\n totals: CheckInDayTotals\n checkIns: CheckInRow[]\n truncated?: boolean\n /** How the store checks stays in (AGL-4043). */\n stayCheckIn?: StayCheckInMode\n}\n\n/** The quick control's choices, in the order the window reads them. */\nconst STAY_MODE_LABELS: ReadonlyArray<{ mode: StayCheckInMode; label: string }> = [\n { mode: 'resource', label: 'As each resource is set' },\n { mode: 'stay', label: 'One per stay' },\n { mode: 'guest', label: 'One per guest' },\n]\n\ntype Answer =\n | { state: 'idle' | 'loading' }\n | { state: 'ready'; list: DayList }\n | { state: 'error'; error: string }\n\n/** The day's list as a printable 80 mm document, like the day totals. */\nexport function posCheckInsDocument(list: DayList): string {\n const rows = list.checkIns\n .map(\n (row) =>\n `<div class=\"row\"><span>${escapeHtml(`${row.customerName || row.customerEmail || 'Customer'} · ${checkInItemLabel(row)}`)}</span>` +\n `<span>${escapeHtml(\n row.status === 'checked_in'\n ? [checkInTimeLabel(row.checkedInAtMs, list.timeZone), describeWristband(row.wristband)].filter(Boolean).join(' ')\n : checkInRainCheckIsOpen(row)\n ? 'Rain check'\n : '—',\n )}</span></div>`,\n )\n .join('')\n return (\n '<!doctype html><html><head><meta charset=\"utf-8\">' +\n `<title>CHECK-INS</title><style>${POS_RECEIPT_STYLES}</style></head><body>` +\n `<div class=\"receipt\"><div class=\"center\"><div class=\"title\">CHECK-INS</div>` +\n `<div class=\"muted\">${escapeHtml(list.dayKey)} · ${list.totals.checkedIn} of ${list.totals.expected} checked in</div></div>` +\n `<hr class=\"rule\">${rows}</div></body></html>`\n )\n}\n\nfunction PosCheckInsBody(props: PosCheckInsCardProps) {\n const { hostId, canManagePos = false } = props\n const { data: user } = useUser()\n const [day, setDay] = useState<Dayjs | null>(null)\n const [answer, setAnswer] = useState<Answer>({ state: 'idle' })\n const [exporting, setExporting] = useState(false)\n /** The pass a rain check is being given on (AGL-4043). */\n const [rainCheckRow, setRainCheckRow] = useState<CheckInRow | null>(null)\n const [actionError, setActionError] = useState('')\n /** The stay whose guests are being changed (AGL-4043). */\n const [guestsFor, setGuestsFor] = useState<string | null>(null)\n\n const url = useCallback(\n (format?: 'csv') => {\n const params = new URLSearchParams({ hostId })\n if (day?.isValid()) params.set('day', day.format(DAY_FORMAT))\n if (format) params.set('format', format)\n return `${POS_CHECK_IN_ROUTE}?${params.toString()}`\n },\n [hostId, day],\n )\n\n const load = useCallback(async () => {\n if (!user || !canManagePos) return\n setAnswer({ state: 'loading' })\n try {\n const response = await authorizedFetch(user as never, url(), { method: 'GET' })\n const body = (await response.json().catch(() => ({}))) as Partial<DayList> & { error?: string }\n setAnswer(\n response.ok && body.checkIns\n ? { state: 'ready', list: body as DayList }\n : { state: 'error', error: body.error || 'The check-ins could not be read.' },\n )\n } catch {\n setAnswer({ state: 'error', error: 'The check-ins could not be read. Check the connection.' })\n }\n }, [user, canManagePos, url])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const list = answer.state === 'ready' ? answer.list : null\n const todayKey = list ? zonedDayKey(Date.now(), list.timeZone) : ''\n\n const [savingStayMode, setSavingStayMode] = useState(false)\n /** The store's quick control for stays: one check-in per stay or per guest (AGL-4043). */\n const setStayMode = useCallback(\n async (mode: StayCheckInMode) => {\n setActionError('')\n setSavingStayMode(true)\n const done = await callPosOps(user, 'pos-check-in', {\n hostId,\n action: 'stay_mode',\n mode,\n ...(day?.isValid() ? { day: day.format(DAY_FORMAT) } : {}),\n })\n setSavingStayMode(false)\n if (!done.ok) return setActionError(done.body.error ?? 'The setting could not be saved.')\n await load()\n },\n [user, hostId, day, load],\n )\n\n const undoRainCheck = useCallback(\n async (row: CheckInRow) => {\n setActionError('')\n const done = await callPosOps<{ checkIn?: CheckInRow }>(user, 'pos-check-in', {\n hostId,\n action: 'undo_rain_check',\n id: row.id,\n })\n if (!done.ok) return setActionError(done.body.error ?? 'The rain check could not be undone.')\n await load()\n },\n [user, hostId, load],\n )\n\n const columns = useMemo<GridColDef[]>(\n () => [\n {\n field: 'customerName',\n headerName: 'Name',\n flex: 1,\n minWidth: 150,\n valueGetter: (_value: unknown, row: CheckInRow) => row.customerName || row.customerEmail || '',\n },\n {\n // What a pass waiting at the window can still have done to it: a\n // rain check, or one taken back; and a stay's guest count (AGL-4043).\n // Not a value, so nothing to sort.\n //\n // Second, beside the name it acts on, rather than trailing. The grid\n // has no column pinning, so a trailing column sat past the right edge\n // of any window narrower than every column put together — on a\n // laptop, and always on a phone — and the window could not see it.\n field: 'rainCheckAction',\n headerName: 'Actions',\n minWidth: 150,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.source === 'reservation' && row.reservationId ? (\n <Button size=\"small\" disabled={!canManagePos} onClick={() => setGuestsFor(row.reservationId)}>\n {'Guests'}\n </Button>\n ) : row.source !== 'order' || row.status !== 'expected' ? null : row.rainCheck ? (\n <Button size=\"small\" disabled={!canManagePos} onClick={() => void undoRainCheck(row)}>\n {'Undo rain check'}\n </Button>\n ) : (\n <Button size=\"small\" disabled={!canManagePos || !todayKey} onClick={() => setRainCheckRow(row)}>\n {'Rain check'}\n </Button>\n ),\n },\n {\n field: 'itemName',\n headerName: 'Item',\n flex: 1,\n minWidth: 160,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInItemLabel(row),\n },\n {\n field: 'orderLabel',\n headerName: 'Order',\n minWidth: 100,\n valueGetter: (_value: unknown, row: CheckInRow) => row.orderLabel ?? (row.source === 'reservation' ? 'Stay' : ''),\n },\n {\n field: 'status',\n headerName: 'Status',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => checkInStatusLabel(row),\n renderCell: ({ row }: { row: CheckInRow }) =>\n row.status === 'checked_in' ? (\n <Chip size=\"small\" color=\"success\" label=\"Checked in\" />\n ) : checkInRainCheckIsOpen(row) ? (\n <Chip size=\"small\" color=\"info\" variant=\"outlined\" label=\"Rain check\" />\n ) : (\n <Chip size=\"small\" variant=\"outlined\" label=\"Expected\" />\n ),\n },\n {\n field: 'rainCheck',\n headerName: 'Rain check',\n minWidth: 200,\n flex: 1,\n valueGetter: (_value: unknown, row: CheckInRow) => rainCheckLabel(row),\n },\n {\n field: 'checkedInAtMs',\n headerName: 'Checked in at',\n type: 'number',\n minWidth: 120,\n valueFormatter: (value: number | null) => (list ? checkInTimeLabel(value, list.timeZone) : ''),\n },\n { field: 'checkedInByName', headerName: 'By', minWidth: 120 },\n {\n field: 'wristband',\n headerName: 'Wristband',\n minWidth: 120,\n valueGetter: (_value: unknown, row: CheckInRow) => describeWristband(row.wristband),\n },\n ],\n [list, canManagePos, todayKey, undoRainCheck],\n )\n const rows = useMemo(() => (list ? list.checkIns.map((row) => ({ ...row, $id: row.id })) : []), [list])\n\n const exportCsv = async () => {\n if (!user || !list) return\n setExporting(true)\n try {\n const response = await authorizedFetch(user as never, url('csv'), { method: 'GET' })\n if (!response.ok) {\n const body = (await response.json().catch(() => ({}))) as { error?: string }\n setAnswer({ state: 'error', error: body.error || 'The spreadsheet could not be made.' })\n return\n }\n const blob = new Blob([await response.text()], { type: 'text/csv;charset=utf-8' })\n const href = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = href\n link.download = `check-ins-${list.dayKey}.csv`\n link.click()\n window.setTimeout(() => URL.revokeObjectURL(href), 1000)\n } finally {\n setExporting(false)\n }\n }\n\n return (\n <CardDisplay\n header={HEADER}\n help={HELP}\n HeaderProps={{\n action: (\n <Stack direction=\"row\" spacing={1}>\n <Button size=\"small\" onClick={() => void load()} disabled={!canManagePos || answer.state === 'loading'}>\n {'Refresh'}\n </Button>\n <Button size=\"small\" onClick={() => void exportCsv()} disabled={!list || exporting}>\n {'Export CSV'}\n </Button>\n <Button size=\"small\" onClick={() => list && printPosDocument(posCheckInsDocument(list))} disabled={!list}>\n {'Print'}\n </Button>\n </Stack>\n ),\n }}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2.5}>\n {!canManagePos ? (\n <Alert severity=\"info\">\n {'Check-ins are for members who can use the register: a site admin or editor with the \"Use the point of sale\" permission.'}\n </Alert>\n ) : null}\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'center' } }}>\n <DatePicker\n label=\"Day\"\n value={day}\n onChange={setDay}\n disabled={!canManagePos}\n slotProps={{ textField: { size: 'small' } }}\n />\n <Button size=\"small\" disabled={!canManagePos || !day} onClick={() => setDay(null)}>\n {'Today'}\n </Button>\n </Stack>\n </LocalizationProvider>\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\" component=\"h3\" id=\"stay-check-in-label\">\n {'Stays at check-in'}\n </Typography>\n <ToggleButtonGroup\n exclusive\n size=\"small\"\n aria-labelledby=\"stay-check-in-label\"\n value={list?.stayCheckIn ?? 'resource'}\n onChange={(_event, mode: StayCheckInMode | null) => {\n if (mode && mode !== list?.stayCheckIn) void setStayMode(mode)\n }}\n disabled={!canManagePos || !list || savingStayMode}\n sx={{ flexWrap: 'wrap' }}\n >\n {STAY_MODE_LABELS.map((choice) => (\n <ToggleButton key={choice.mode} value={choice.mode}>\n {choice.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'One per guest gives each guest of a stay their own check-in and wristband, by the stay’s guest count.'}\n </Typography>\n </Stack>\n {answer.state === 'loading' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Reading who is due…'}\n </Typography>\n ) : null}\n {answer.state === 'error' ? <Alert severity=\"warning\">{answer.error}</Alert> : null}\n {list ? (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${list.dayKey} · ${list.timeZone} · passes and stays that need check-in`}\n </Typography>\n {list.truncated ? (\n <Alert severity=\"warning\">\n {'This day has more check-ins than one list reads; some are missing here.'}\n </Alert>\n ) : null}\n <Stack direction=\"row\" spacing={3} sx={{ flexWrap: 'wrap', rowGap: 1.5 }}>\n <CommerceStatTile label=\"Expected\" value={String(list.totals.expected)} />\n <CommerceStatTile label=\"Checked in\" value={String(list.totals.checkedIn)} />\n <CommerceStatTile label=\"Still to come\" value={String(list.totals.expected - list.totals.checkedIn)} />\n {list.totals.rainChecks ? (\n <CommerceStatTile label=\"Rain checks\" value={String(list.totals.rainChecks)} />\n ) : null}\n </Stack>\n {actionError ? <Alert severity=\"warning\">{actionError}</Alert> : null}\n <ListTable\n aria-label=\"Check-ins on this day\"\n rows={rows}\n columns={columns}\n noRowsLabel=\"Nobody is due to check in on this day\"\n />\n </>\n ) : null}\n </Stack>\n <PosRainCheckDialog\n row={rainCheckRow}\n hostId={hostId}\n todayKey={todayKey}\n onClose={() => setRainCheckRow(null)}\n onDone={() => {\n setRainCheckRow(null)\n void load()\n }}\n />\n {guestsFor ? (\n <Suspense fallback={null}>\n <ReservationGuestsDialog\n reservationId={guestsFor}\n hostId={hostId}\n onClose={() => setGuestsFor(null)}\n onDone={() => {\n setGuestsFor(null)\n void load()\n }}\n />\n </Suspense>\n ) : null}\n </CardDisplay>\n )\n}\n\n/**\n * Today's check-ins (AGL-4043): beside the day totals, for a store with a\n * register, on a plan with the point of sale.\n */\nexport function PosCheckInsCard(props: PosCheckInsCardProps) {\n const firestore = useFirestore()\n // Whether the store has a register at all, as the day totals ask it.\n const { data: registers, status } = useFirestoreCollection<any>(\n () =>\n query(collection(firestore, 'hosts', props.hostId, 'registers'), orderBy(documentId()), limit(1)),\n [firestore, props.hostId],\n { idField: '$id' },\n )\n if (status === 'success' && !registers?.length) return null\n return (\n <EntitlementGatedCard\n hostId={props.hostId}\n feature=\"pos\"\n header={HEADER}\n help={HELP}\n upsell={'Checking in passes, camping and stays at the window, with wristbands, comes with the point of sale.'}\n >\n <PosCheckInsBody {...props} />\n </EntitlementGatedCard>\n )\n}\n\nPosCheckInsCard.displayName = 'PosCheckInsCard'\n\nexport default PosCheckInsCard\n"],"names":["pluginDocsHelp","CardDisplay","ListTable","authorizedFetch","useFirestore","useFirestoreCollection","useUser","Alert","Button","Chip","Stack","ToggleButton","ToggleButtonGroup","Typography","AdapterDayjs","DatePicker","LocalizationProvider","collection","documentId","limit","orderBy","query","lazy","Suspense","useCallback","useEffect","useMemo","useState","zonedDayKey","checkInItemLabel","checkInRainCheckIsOpen","checkInStatusLabel","checkInTimeLabel","describeWristband","POS_CHECK_IN_ROUTE","rainCheckLabel","callPosOps","PosRainCheckDialog","escapeHtml","CommerceStatTile","EntitlementGatedCard","POS_RECEIPT_STYLES","printPosDocument","ReservationGuestsDialog","HEADER","HELP","anchor","DAY_FORMAT","STAY_MODE_LABELS","mode","label","posCheckInsDocument","list","rows","checkIns","map","row","customerName","customerEmail","status","checkedInAtMs","timeZone","wristband","filter","Boolean","join","dayKey","totals","checkedIn","expected","PosCheckInsBody","props","hostId","canManagePos","data","user","day","setDay","answer","setAnswer","state","exporting","setExporting","rainCheckRow","setRainCheckRow","actionError","setActionError","guestsFor","setGuestsFor","url","format","params","URLSearchParams","isValid","set","toString","load","response","method","body","json","catch","ok","error","todayKey","Date","now","savingStayMode","setSavingStayMode","setStayMode","done","action","undoRainCheck","id","columns","field","headerName","flex","minWidth","valueGetter","_value","sortable","filterable","hideable","disableColumnMenu","renderCell","source","reservationId","size","disabled","onClick","rainCheck","orderLabel","color","variant","type","valueFormatter","value","$id","exportCsv","blob","Blob","text","href","URL","createObjectURL","link","document","createElement","download","click","window","setTimeout","revokeObjectURL","header","help","HeaderProps","direction","spacing","contentGutterX","contentGutterY","severity","dateAdapter","xs","sm","sx","alignItems","onChange","slotProps","textField","component","exclusive","aria-labelledby","stayCheckIn","_event","flexWrap","choice","truncated","rowGap","String","rainChecks","aria-label","noRowsLabel","onClose","onDone","fallback","PosCheckInsCard","firestore","registers","idField","length","feature","upsell","displayName"],"mappings":"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"}
@@ -0,0 +1,45 @@
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
+ */
17
+ import * as CommerceModel from '../../model';
18
+ /** A quote as the list reads it: the order document and its id. */
19
+ export type QuoteRow = CommerceModel.HostOrder & {
20
+ $id: string;
21
+ };
22
+ export interface QuoteEditorDialogProps {
23
+ hostId: string;
24
+ /** The quote to edit, or `null` for a new one. */
25
+ quote: QuoteRow | null;
26
+ /** The store's products, for the product picker. */
27
+ products: readonly Record<string, any>[];
28
+ /** Holds "Create and edit quotes" (`commerce.quotes`). */
29
+ canEdit: boolean;
30
+ /** Holds "Send quotes and invoices to customers" (`commerce.quotes.send`). */
31
+ canSend: boolean;
32
+ onClose: () => void;
33
+ }
34
+ /**
35
+ * The quote editor (AGL-4093): who it is for, its lines (products with their
36
+ * options and add-ons, typed items, things included at no charge), discount,
37
+ * shipping, notes and terms, with the totals worked out as it is edited. The
38
+ * server prices and saves it; the totals here are the same function's answer
39
+ * over the same inputs, and a connected tax service's figure arrives on save.
40
+ */
41
+ export declare function QuoteEditorDialog(props: QuoteEditorDialogProps): import("react").JSX.Element;
42
+ export declare namespace QuoteEditorDialog {
43
+ var displayName: string;
44
+ }
45
+ export default QuoteEditorDialog;