@alfadocs/ui-kit-debug 1.126.0 → 1.127.1
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/dist/_chunks/{balance-badge-cell-DtxbGJcA.js → balance-badge-cell-BtFge7Y6.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-DtxbGJcA.js.map → balance-badge-cell-BtFge7Y6.js.map} +1 -1
- package/dist/_chunks/{bill-line-table-HrynB7ND.js → bill-line-table-BRxX0Awq.js} +2 -2
- package/dist/_chunks/{bill-line-table-HrynB7ND.js.map → bill-line-table-BRxX0Awq.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-CiCmsBCH.js → calendar-appointment-editor-dialog-B-zYgCgH.js} +2 -2
- package/dist/_chunks/{calendar-appointment-editor-dialog-CiCmsBCH.js.map → calendar-appointment-editor-dialog-B-zYgCgH.js.map} +1 -1
- package/dist/_chunks/{data-grid-C71BhGDw.js → data-grid-bzvkQ3kc.js} +446 -423
- package/dist/_chunks/data-grid-bzvkQ3kc.js.map +1 -0
- package/dist/_chunks/{data-table-DhYx-hCD.js → data-table-BCfkcPti.js} +2 -2
- package/dist/_chunks/{data-table-DhYx-hCD.js.map → data-table-BCfkcPti.js.map} +1 -1
- package/dist/_chunks/{default-tabs-RvCI5uN0.js → default-tabs-yEfqAPuT.js} +3 -3
- package/dist/_chunks/{default-tabs-RvCI5uN0.js.map → default-tabs-yEfqAPuT.js.map} +1 -1
- package/dist/_chunks/{file-manager-DNq-sEsy.js → file-manager-Dpwv0qs-.js} +2 -2
- package/dist/_chunks/{file-manager-DNq-sEsy.js.map → file-manager-Dpwv0qs-.js.map} +1 -1
- package/dist/_chunks/{heatmap-BurtKmeu.js → heatmap-Ds5DJBUL.js} +2 -2
- package/dist/_chunks/{heatmap-BurtKmeu.js.map → heatmap-Ds5DJBUL.js.map} +1 -1
- package/dist/_chunks/{invoice-upload-list-C95s5Q7m.js → invoice-upload-list-CgS_TBuX.js} +12 -12
- package/dist/_chunks/invoice-upload-list-CgS_TBuX.js.map +1 -0
- package/dist/_chunks/{link-cell-renderer-BEaLczk2.js → link-cell-renderer-CC9VHU68.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-BEaLczk2.js.map → link-cell-renderer-CC9VHU68.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-TgnoZGDA.js → muscle-scheme-CHrjv7p2.js} +237 -235
- package/dist/_chunks/{muscle-scheme-TgnoZGDA.js.map → muscle-scheme-CHrjv7p2.js.map} +1 -1
- package/dist/_chunks/{parts-CcyRkB8t.js → parts-tGzYz0uG.js} +42 -36
- package/dist/_chunks/parts-tGzYz0uG.js.map +1 -0
- package/dist/_chunks/{toolbar-Dznu_Dou.js → toolbar-Co46MEn9.js} +3 -3
- package/dist/_chunks/{toolbar-Dznu_Dou.js.map → toolbar-Co46MEn9.js.map} +1 -1
- package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js +289 -0
- package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/browser-support.js +1 -1
- package/dist/components/_shared/table-toolbar/parts.d.ts.map +1 -1
- package/dist/components/bill-line-table/index.js +1 -1
- package/dist/components/bill-table/index.js +1 -1
- package/dist/components/data-grid/data-grid.variants.d.ts +3 -1
- package/dist/components/data-grid/data-grid.variants.d.ts.map +1 -1
- package/dist/components/data-grid/header.d.ts.map +1 -1
- package/dist/components/data-grid/index.js +2 -2
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/invoice-upload-list/columns.d.ts.map +1 -1
- package/dist/components/invoice-upload-list/index.js +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/muscle-scheme/muscle-scheme.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/warehouse-load-summary/index.js +1 -1
- package/dist/components/warehouse-load-summary/types.d.ts +6 -0
- package/dist/components/warehouse-load-summary/types.d.ts.map +1 -1
- package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts +1 -1
- package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts.map +1 -1
- package/dist/core.css +1 -1
- package/dist/host-legacy.css +9 -0
- package/dist/i18n/locales/ar.d.ts +5 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +5 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +5 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +5 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +5 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +5 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +5 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +5 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +5 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +5 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +5 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +5 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +5 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +5 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +5 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +5 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +5 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +5 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +5 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +5 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +5 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +5 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +5 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +5 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +5 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +5 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +5 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +5 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +5 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +5 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +5 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +5 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +5 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +5 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +5 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +5 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +13 -13
- package/dist/locales/ar.json +5 -0
- package/dist/locales/de.json +5 -0
- package/dist/locales/el.json +5 -0
- package/dist/locales/en.json +5 -0
- package/dist/locales/es.json +5 -0
- package/dist/locales/fr.json +5 -0
- package/dist/locales/hi.json +5 -0
- package/dist/locales/it.json +5 -0
- package/dist/locales/ja.json +5 -0
- package/dist/locales/nl.json +5 -0
- package/dist/locales/pl.json +5 -0
- package/dist/locales/pt.json +5 -0
- package/dist/locales/ro.json +5 -0
- package/dist/locales/ru.json +5 -0
- package/dist/locales/sq.json +5 -0
- package/dist/locales/sv.json +5 -0
- package/dist/locales/tr.json +5 -0
- package/dist/locales/zh.json +5 -0
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/data-grid-C71BhGDw.js.map +0 -1
- package/dist/_chunks/invoice-upload-list-C95s5Q7m.js.map +0 -1
- package/dist/_chunks/parts-CcyRkB8t.js.map +0 -1
- package/dist/_chunks/warehouse-load-summary-D88M4Ii7.js +0 -255
- package/dist/_chunks/warehouse-load-summary-D88M4Ii7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invoice-upload-list-C95s5Q7m.js","sources":["../../node_modules/lucide-react/dist/esm/icons/scan-search.mjs","../../src/components/invoice-upload-list/invoice-upload-list.agent.ts","../../src/components/invoice-upload-list/invoice-upload-list.variants.ts","../../src/components/invoice-upload-list/types.ts","../../src/components/invoice-upload-list/model.ts","../../src/components/invoice-upload-list/cells.tsx","../../src/components/invoice-upload-list/columns.tsx","../../src/components/invoice-upload-list/handle.ts","../../src/components/invoice-upload-list/invoice-upload-list.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 7V5a2 2 0 0 1 2-2h2\", key: \"aa7l1z\" }],\n [\"path\", { d: \"M17 3h2a2 2 0 0 1 2 2v2\", key: \"4qcy5o\" }],\n [\"path\", { d: \"M21 17v2a2 2 0 0 1-2 2h-2\", key: \"6vwrx8\" }],\n [\"path\", { d: \"M7 21H5a2 2 0 0 1-2-2v-2\", key: \"ioqczr\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"path\", { d: \"m16 16-1.9-1.9\", key: \"1dq9hf\" }]\n];\nconst ScanSearch = createLucideIcon(\"scan-search\", __iconNode);\n\nexport { __iconNode, ScanSearch as default };\n//# sourceMappingURL=scan-search.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter: InvoiceUploadList. */\n/* */\n/* Works against the curated `InvoiceUploadListHandle`: ids and kit */\n/* shapes only, never the DataGrid handle, a TanStack object, a row */\n/* object or a DOM node. It is the list's only agent surface: the */\n/* DataGrid inside registers none (`registerAgent={false}`). */\n/* */\n/* Safety: selecting, sorting and scrolling change the view (`read`). */\n/* Review opens the host's review dialog and changes nothing by itself */\n/* (`read` + `openWorld`). Load all ready and Load selected hand invoices */\n/* to the host, which loads them into the warehouse (`write` + */\n/* `openWorld`). Supplier invoices are not patient data. Agent state */\n/* carries no host text: a supplier name is read only when it is not */\n/* masked (a person under privacy mode is not), and an error reads as */\n/* `hasError`, never as the platform's message. */\n/* */\n/* Literal enums, not imports: the catalog build loads this file in plain */\n/* Node, where only type imports are erased. A test keeps the literals */\n/* equal to the constants in types.ts. */\n/* See src/docs/26-agent-readiness.mdx. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type {\n InvoiceUploadListHandle,\n InvoiceUploadListSortEntry,\n} from './types';\n\nconst SORT_COLUMNS = [\n 'fileName',\n 'supplier',\n 'invoiceNumber',\n 'date',\n 'lineCount',\n 'total',\n 'status',\n] as const;\n\ntype InvoiceUploadListAgentErrorCode =\n | 'UNKNOWN_ROW'\n | 'ROW_FILTERED_OUT'\n | 'COLUMN_MASKED'\n | 'SELECTION_DISABLED';\n\nfunction refuse(code: InvoiceUploadListAgentErrorCode, detail: string): never {\n throw new Error(`${code}: ${detail}`);\n}\n\nfunction knownRow(handle: InvoiceUploadListHandle, id: string): void {\n // Every invoice, not only the rows the search and filters leave showing.\n if (!handle.hasRow(id)) {\n refuse('UNKNOWN_ROW', `no invoice \"${id}\" in the list.`);\n }\n}\n\nconst ROW_ID_SCHEMA = {\n type: 'object',\n properties: { id: { type: 'string', description: 'An invoice id (rows).' } },\n required: ['id'],\n additionalProperties: false,\n};\n\nexport const invoiceUploadListAgent: AgentAdapter<InvoiceUploadListHandle> = {\n id: 'invoice-upload-list',\n capabilities: [\n 'select_multiple',\n 'sort',\n 'scroll',\n // review opens the host's review dialog (`open`: a Dialog).\n 'open',\n // load_all_ready and load_selected commit invoices to the warehouse.\n 'submit',\n ],\n state: {\n features: {\n type: '{ privacyMode, status, selectable, readyCount }',\n descriptionKey: 'ui.agent.invoiceUploadList.state.features',\n description:\n 'What the list can do now: privacy mode, loading status, whether rows can be selected, and how many invoices are ready to load.',\n read: (handle) => handle.getFeatures(),\n },\n rows: {\n type: 'Array<{ id, fileId, fileName, status, supplierKind, supplierName?, invoiceNumber, date, lineCount, loading, hasError, selectable, review }>',\n descriptionKey: 'ui.agent.invoiceUploadList.state.rows',\n description:\n 'The uploaded invoices. A supplier name is given only when it is not hidden; a person is never named under privacy mode. An error row reads hasError, not its message.',\n read: (handle) => handle.getRowSummaries(),\n },\n counts: {\n type: 'Record<status, number>',\n descriptionKey: 'ui.agent.invoiceUploadList.state.counts',\n description:\n 'How many invoices have each status: readyToLoad, toReview, alreadyLoaded, loaded and error.',\n read: (handle) => handle.getCounts(),\n },\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.invoiceUploadList.state.selection',\n description: 'Ids of the selected invoices.',\n read: (handle) => handle.getSelection(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.invoiceUploadList.state.sort',\n description: 'The active sort.',\n read: (handle) => handle.getSort(),\n },\n columns: {\n type: 'Array<{ id, label, visible, canHide, sortable, masked }>',\n descriptionKey: 'ui.agent.invoiceUploadList.state.columns',\n description: 'The columns, in display order.',\n read: (handle) => handle.getColumns(),\n },\n },\n actions: {\n select_ready: {\n safety: 'read',\n returns: 'string[]',\n idempotent: true,\n errors: ['SELECTION_DISABLED: the list has no selection.'],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.selectReady',\n description:\n 'Select every invoice that is ready to load and not being loaded. Nothing loads until load_selected.',\n invoke: (handle) => {\n if (!handle.getFeatures().selectable) {\n refuse('SELECTION_DISABLED', 'this list has no selection.');\n }\n return handle.selectReady();\n },\n },\n select_rows: {\n safety: 'read',\n argsType: '{ ids: string[] }',\n argsSchema: {\n type: 'object',\n properties: { ids: { type: 'array', items: { type: 'string' } } },\n required: ['ids'],\n additionalProperties: false,\n },\n returns: 'string[]',\n idempotent: true,\n errors: ['SELECTION_DISABLED: the list has no selection.'],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.selectRows',\n description:\n 'Replace the selection with the given invoice ids. Only invoices that are ready to load can be selected; others are ignored.',\n invoke: (handle, args: { ids: string[] }) => {\n if (!handle.getFeatures().selectable) {\n refuse('SELECTION_DISABLED', 'this list has no selection.');\n }\n handle.setSelection(args.ids);\n return handle.getSelection();\n },\n },\n clear_selection: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.invoiceUploadList.actions.clearSelection',\n description: 'Clear the selection.',\n invoke: (handle) => handle.clearSelection(),\n },\n sort_by: {\n safety: 'read',\n argsType:\n '{ colId: \"fileName\" | \"supplier\" | \"invoiceNumber\" | \"date\" | \"lineCount\" | \"total\" | \"status\", sort: \"asc\" | \"desc\" }',\n argsSchema: {\n type: 'object',\n properties: {\n colId: { enum: [...SORT_COLUMNS] },\n sort: { enum: ['asc', 'desc'] },\n },\n required: ['colId', 'sort'],\n additionalProperties: false,\n },\n idempotent: true,\n errors: [\n 'COLUMN_MASKED: supplier cannot be sorted while privacy mode is on.',\n ],\n examples: [{ args: { colId: 'status', sort: 'asc' } }],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.sortBy',\n description: 'Sort the invoices by one column. The selection is kept.',\n invoke: (handle, args: InvoiceUploadListSortEntry) => {\n const column = handle.getColumns().find((c) => c.id === args.colId);\n if (column?.masked) {\n refuse('COLUMN_MASKED', `\"${args.colId}\" is hidden by privacy mode.`);\n }\n handle.setSort([{ colId: args.colId, sort: args.sort }]);\n },\n },\n scroll_to_row: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: ROW_ID_SCHEMA,\n idempotent: true,\n errors: [\n 'UNKNOWN_ROW: the id is not in the list.',\n 'ROW_FILTERED_OUT: the search or a filter hides the invoice.',\n ],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.scrollToRow',\n description: 'Scroll one invoice into view.',\n invoke: (handle, args: { id: string }) => {\n knownRow(handle, args.id);\n handle.scrollToRow(args.id);\n },\n },\n open_review: {\n safety: 'read',\n openWorld: true,\n argsType: '{ id: string }',\n argsSchema: ROW_ID_SCHEMA,\n errors: [\n 'UNKNOWN_ROW: the id is not in the list.',\n 'ACTION_UNAVAILABLE: the list offers no review.',\n 'ACTION_DISABLED: error, the file could not be read.',\n ],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.openReview',\n description:\n 'Open one invoice for review. The host shows its lines. Nothing loads until the user confirms there.',\n invoke: (handle, args: { id: string }) => {\n knownRow(handle, args.id);\n handle.review(args.id);\n },\n },\n load_all_ready: {\n safety: 'write',\n openWorld: true,\n returns: 'string[]',\n errors: [\n 'ACTION_UNAVAILABLE: the list offers no \"load all ready\".',\n 'ACTION_DISABLED: noReadyInvoices.',\n ],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.loadAllReady',\n description:\n 'Hand every invoice that is ready to load to the host, which loads it into the warehouse. Returns the ids sent.',\n invoke: (handle) => handle.loadAllReady(),\n },\n load_selected: {\n safety: 'write',\n openWorld: true,\n returns: 'string[]',\n errors: [\n 'ACTION_UNAVAILABLE: the list offers no bulk load.',\n 'ACTION_DISABLED: emptySelection.',\n ],\n descriptionKey: 'ui.agent.invoiceUploadList.actions.loadSelected',\n description:\n 'Hand the selected invoices to the host, which loads them into the warehouse. Returns the ids sent.',\n invoke: (handle) => handle.loadSelected(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'invoice-upload-list',\n description: 'Marks the element as a kit InvoiceUploadList.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from id (default warehouse-invoice-upload-list).',\n },\n item: {\n attr: 'data-row-id',\n description:\n 'Opaque invoice id on each row (DataGrid). Act through the handle, not the DOM.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: CVA for the root, the cells and the count footer. */\n/* Tokens only, logical properties only. DataGrid owns the table chrome; */\n/* these classes lay out what sits inside one cell. */\n/* -------------------------------------------------------------------- */\n\nimport { cva } from 'class-variance-authority';\n\n/** The root around the DataGrid frame and the count footer. With\n * `height: 'fill'` it is a flex column that fills its flex parent, so the\n * grid becomes the bounded scroll container (virtualised rows). */\nexport const invoiceUploadListVariants = cva('ds:w-full ds:min-w-0', {\n variants: {\n height: {\n auto: 'ds:block',\n fill: 'ds:flex ds:min-h-0 ds:flex-auto ds:flex-col',\n },\n },\n defaultVariants: { height: 'auto' },\n});\n\n/** Lines stacked in one cell (a value and its muted second line). */\nexport const cellStackVariants = cva(\n 'ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]',\n {\n variants: {\n align: { start: 'ds:items-start', end: 'ds:items-end' },\n },\n defaultVariants: { align: 'start' },\n },\n);\n\n/** A muted second line (\"Credit note\"). */\nexport const secondaryTextVariants = cva(\n 'type-meta ds:text-[color:var(--muted-foreground)]',\n);\n\n/** The error message under the Error badge. It wraps: a platform message\n * is a sentence, not a word. */\nexport const errorTextVariants = cva(\n 'type-meta ds:text-[color:var(--destructive)] ds:[overflow-wrap:anywhere]',\n);\n\n/** One line of text that truncates; the full text stays in the DOM. */\nexport const truncatedTextVariants = cva(\n 'ds:block ds:min-w-0 ds:max-w-full ds:truncate',\n);\n\n/** The file name: the row header. */\nexport const fileNameVariants = cva(\n 'ds:block ds:min-w-0 ds:max-w-full ds:truncate ds:font-medium',\n);\n\n/** Digits that line up. */\nexport const figureVariants = cva('ds:tabular-nums');\n\n/** A spinner beside its words. */\nexport const loadingGroupVariants = cva(\n 'ds:inline-flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)]',\n);\n\n/** The decorative spinner of a loading row. */\nexport const loadingSpinnerVariants = cva('ds:inline-flex ds:shrink-0');\n\n/** The count footer under the grid: counts per status. */\nexport const countsFooterVariants = cva(\n 'type-meta ds:m-0 ds:px-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)] ds:text-[color:var(--muted-foreground)]',\n);\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: public types (warehouse supplier invoices). */\n/* */\n/* Display and emit only. The platform reads the XML, decides the status */\n/* and matches the lines; the kit shows what it is given and reports */\n/* what the person chose. Only ids reach the DOM (`data-row-id`). */\n/* -------------------------------------------------------------------- */\n\nimport type { DecimalString } from '../_shared/decimal';\nimport type {\n WarehouseBadgeVariant,\n WarehouseInvoiceStatus,\n} from '../_shared/warehouse-load';\n\nexport type { DecimalString, WarehouseBadgeVariant, WarehouseInvoiceStatus };\n\n/** Column ids, in display order. `select` is the grid's own checkbox. */\nexport const INVOICE_UPLOAD_LIST_COLUMNS = [\n 'fileName',\n 'supplier',\n 'invoiceNumber',\n 'date',\n 'lineCount',\n 'total',\n 'status',\n 'actions',\n] as const;\nexport type InvoiceUploadListColumnId =\n (typeof INVOICE_UPLOAD_LIST_COLUMNS)[number];\n\n/** Columns the list sorts by. */\nexport const INVOICE_UPLOAD_LIST_SORT_COLUMNS = [\n 'fileName',\n 'supplier',\n 'invoiceNumber',\n 'date',\n 'lineCount',\n 'total',\n 'status',\n] as const satisfies readonly InvoiceUploadListColumnId[];\nexport type InvoiceUploadListSortColumn =\n (typeof INVOICE_UPLOAD_LIST_SORT_COLUMNS)[number];\n\nexport const INVOICE_SUPPLIER_KINDS = ['company', 'person'] as const;\nexport type InvoiceSupplierKind = (typeof INVOICE_SUPPLIER_KINDS)[number];\n\nexport const INVOICE_DOCUMENT_KINDS = ['invoice', 'creditNote'] as const;\nexport type InvoiceDocumentKind = (typeof INVOICE_DOCUMENT_KINDS)[number];\n\n/** One invoice body. A file may hold several, so a file name can repeat. */\nexport interface UploadedInvoice {\n /** The only row value in the DOM (`data-row-id`). Unique per invoice. */\n id: string;\n /** The `InvoiceUpload` file id this invoice came from. */\n fileId: string;\n /** File name as chosen; shown, never parsed. Names the row. */\n fileName: string;\n /** Who issued it. `person` is masked under privacy mode; a company\n * stays visible. `null` when the platform found no supplier. */\n supplier: { name: string; kind: InvoiceSupplierKind } | null;\n invoiceNumber: string | null;\n /** Calendar day `YYYY-MM-DD` of this invoice body; shown in UTC. */\n date: string | null;\n lineCount: number | null;\n /** FatturaPA `ImportoTotaleDocumento` as decimal text (\"1234.50\"). */\n total: DecimalString | null;\n /** ISO 4217 code for `total`. */\n currency: string;\n /** Default `invoice`. A credit note shows a muted \"Credit note\" line. */\n documentKind?: InvoiceDocumentKind;\n status: WarehouseInvoiceStatus;\n /** Platform text for status `error`, already translated. It is host\n * text: under privacy mode it gives way to kit copy on a row whose\n * supplier is a person. */\n error?: string;\n}\n\n/** Error panel copy and retry for `status=\"error\"`. */\nexport interface InvoiceUploadListError {\n title?: string;\n description?: string;\n onRetry?: () => void;\n}\n\nexport interface InvoiceUploadListProps {\n /** Instance id: the saved column state key and `data-component-id`. */\n id?: string;\n invoices: readonly UploadedInvoice[];\n /** `loading` with no invoices shows skeleton rows. Default `ready`. */\n status?: 'ready' | 'loading' | 'error';\n error?: InvoiceUploadListError;\n /** Ids of the selected invoices. Only `readyToLoad` rows are selectable.\n * Checkboxes show when any selection prop or `onLoadSelected` is set. */\n selection?: readonly string[];\n defaultSelection?: readonly string[];\n onSelectionChange?: (ids: string[]) => void;\n /** Row action \"Review\". Disabled, with a reason, on error rows. */\n onReview?: (invoice: UploadedInvoice) => void;\n /** Toolbar \"Load all ready (N)\": every `readyToLoad` invoice that is not\n * already loading, whatever the search or sort. */\n onLoadAllReady?: (ids: string[]) => void;\n /** Bulk action on the selection. */\n onLoadSelected?: (ids: string[]) => void;\n /** Invoices being loaded now: a spinner, and not selectable. */\n loadingIds?: readonly string[];\n /** Hides the supplier of every `person`; companies stay visible. */\n privacyMode?: boolean;\n /** Table caption. Default \"Uploaded invoices\". */\n caption?: string;\n density?: 'default' | 'compact';\n /** `fill` makes the grid the bounded scroll container of a flex column\n * parent (200 invoices virtualise). Default `auto`. */\n height?: 'auto' | 'fill';\n persistColumnState?: boolean;\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n}\n\n/* ---------------- the curated handle ---------------- */\n\nexport interface InvoiceUploadListSortEntry {\n colId: InvoiceUploadListSortColumn;\n sort: 'asc' | 'desc';\n}\n\nexport interface InvoiceUploadListFeatureInfo {\n privacyMode: boolean;\n status: 'ready' | 'loading' | 'error';\n selectable: boolean;\n readyCount: number;\n}\n\nexport interface InvoiceUploadListColumnInfo {\n id: InvoiceUploadListColumnId;\n label: string;\n visible: boolean;\n canHide: boolean;\n sortable: boolean;\n masked: boolean;\n}\n\n/** Why Review is off. `error`: the file could not be read. */\nexport type InvoiceUploadReviewDisabledReason = 'error';\n\n/** The agent-safe projection of one row: ids, enums and counts. A supplier\n * name is given only when it is not masked; a host error text is never\n * given (`hasError` instead). */\nexport interface InvoiceUploadRowSummary {\n id: string;\n fileId: string;\n fileName: string;\n status: WarehouseInvoiceStatus;\n supplierKind: InvoiceSupplierKind | null;\n supplierName?: string;\n invoiceNumber: string | null;\n date: string | null;\n lineCount: number | null;\n loading: boolean;\n hasError: boolean;\n selectable: boolean;\n review: 'enabled' | { disabled: InvoiceUploadReviewDisabledReason } | null;\n}\n\n/** The `ref` of InvoiceUploadList. Ids and kit shapes only: never the\n * DataGrid handle, a row object or a DOM node. A refused call throws an\n * Error whose message starts with its code. */\nexport interface InvoiceUploadListHandle {\n getFeatures(): InvoiceUploadListFeatureInfo;\n /** Ids of the rows showing now: the search and filters apply. */\n getRowIds(): string[];\n /** Is this invoice in the list at all, shown or not? */\n hasRow(id: string): boolean;\n getRowSummaries(): InvoiceUploadRowSummary[];\n /** Invoices per status, every status present. */\n getCounts(): Record<WarehouseInvoiceStatus, number>;\n getSelection(): string[];\n setSelection(ids: readonly string[]): void;\n /** Selects every ready, not-loading invoice; returns the selection. */\n selectReady(): string[];\n clearSelection(): void;\n getSort(): InvoiceUploadListSortEntry[];\n setSort(model: readonly InvoiceUploadListSortEntry[]): void;\n getColumns(): InvoiceUploadListColumnInfo[];\n scrollToRow(id: string): void;\n focusRow(id: string): void;\n /** Same host callback as the Review button. */\n review(id: string): void;\n /** Same host callback as \"Load all ready\". Returns the ids sent. */\n loadAllReady(): string[];\n /** Same host callback as the bulk action. Returns the ids sent. */\n loadSelected(): string[];\n}\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: pure helpers shared by the component, the handle */\n/* and the agent projection. No React, no translation. */\n/* -------------------------------------------------------------------- */\n\nimport { FATTURAPA_VALUE, parseDecimal } from '../_shared/decimal';\nimport type { ScaledDecimal } from '../_shared/decimal';\nimport { formatLocale } from '../_shared/intl-locale';\nimport {\n countInvoicesByStatus,\n type WarehouseInvoiceStatus,\n} from '../_shared/warehouse-load';\nimport type {\n InvoiceUploadRowSummary,\n UploadedInvoice,\n InvoiceUploadListSortEntry,\n InvoiceUploadListSortColumn,\n} from './types';\nimport { INVOICE_UPLOAD_LIST_SORT_COLUMNS } from './types';\n\nexport const INVOICE_UPLOAD_LIST_DEFAULT_ID = 'warehouse-invoice-upload-list';\n\n/** Reading order of the statuses: work to do first. Used to sort. */\nexport const INVOICE_STATUS_RANK: Record<WarehouseInvoiceStatus, number> = {\n readyToLoad: 0,\n toReview: 1,\n error: 2,\n alreadyLoaded: 3,\n loaded: 4,\n};\n\n/** Amounts here arrive as decimal text, signed (a credit note is negative),\n * up to 11 integer digits and 8 decimals. `null` when it does not parse. */\nexport function readInvoiceTotal(total: string | null): ScaledDecimal | null {\n if (total === null) return null;\n const parsed = parseDecimal(total, FATTURAPA_VALUE.lineTotal);\n return parsed.ok ? parsed.value : null;\n}\n\n/** Is this supplier masked right now? Only people, only in privacy mode. */\nexport function isSupplierMasked(\n invoice: Pick<UploadedInvoice, 'supplier'>,\n privacyMode: boolean,\n): boolean {\n return privacyMode && invoice.supplier?.kind === 'person';\n}\n\nexport function isPersonSupplier(invoice: UploadedInvoice): boolean {\n return invoice.supplier?.kind === 'person';\n}\n\n/** A row can be ticked when it is ready and not being loaded. */\nexport function isInvoiceSelectable(\n invoice: UploadedInvoice,\n loading: ReadonlySet<string>,\n): boolean {\n return invoice.status === 'readyToLoad' && !loading.has(invoice.id);\n}\n\n/** Ids a \"load all ready\" sends: ready and not already loading, in the\n * order given. */\nexport function readyInvoiceIds(\n invoices: readonly UploadedInvoice[],\n loading: ReadonlySet<string>,\n): string[] {\n return invoices\n .filter((invoice) => isInvoiceSelectable(invoice, loading))\n .map((invoice) => invoice.id);\n}\n\nexport function countByStatus(\n invoices: readonly UploadedInvoice[],\n): Record<WarehouseInvoiceStatus, number> {\n return countInvoicesByStatus(invoices);\n}\n\n/** Row name for row-scoped controls: the file, then the invoice number\n * when the file holds more than one. Not personal data. */\nexport function invoiceRowLabel(invoice: UploadedInvoice): string {\n return invoice.invoiceNumber\n ? `${invoice.fileName} · ${invoice.invoiceNumber}`\n : invoice.fileName;\n}\n\n/** The agent-safe projection of one invoice. */\nexport function summariseInvoice(\n invoice: UploadedInvoice,\n privacyMode: boolean,\n loading: ReadonlySet<string>,\n canReview: boolean,\n): InvoiceUploadRowSummary {\n const masked = isSupplierMasked(invoice, privacyMode);\n const summary: InvoiceUploadRowSummary = {\n id: invoice.id,\n fileId: invoice.fileId,\n fileName: invoice.fileName,\n status: invoice.status,\n supplierKind: invoice.supplier?.kind ?? null,\n invoiceNumber: invoice.invoiceNumber,\n date: invoice.date,\n lineCount: invoice.lineCount,\n loading: loading.has(invoice.id),\n hasError: invoice.status === 'error',\n selectable: isInvoiceSelectable(invoice, loading),\n review: !canReview\n ? null\n : invoice.status === 'error'\n ? { disabled: 'error' }\n : 'enabled',\n };\n if (invoice.supplier && !masked) summary.supplierName = invoice.supplier.name;\n return summary;\n}\n\n/* Building an `Intl.DateTimeFormat` costs far more than using one. */\nconst dayFormatters = new Map<string, Intl.DateTimeFormat>();\nconst CALENDAR_DAY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\n/** A calendar day `YYYY-MM-DD` in the UI language, medium style, read and\n * formatted in UTC so it never moves with the time zone. Other text is\n * returned as given. */\nexport function formatInvoiceDay(day: string, language: string): string {\n const match = CALENDAR_DAY.exec(day);\n if (!match) return day;\n const [, year, month, date] = match;\n const instant = new Date(\n Date.UTC(Number(year), Number(month) - 1, Number(date)),\n );\n if (Number.isNaN(instant.getTime())) return day;\n const locale = formatLocale(language);\n let formatter = dayFormatters.get(locale);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(locale, {\n dateStyle: 'medium',\n timeZone: 'UTC',\n });\n dayFormatters.set(locale, formatter);\n }\n return formatter.format(instant);\n}\n\nconst SORT_COLUMNS: ReadonlySet<string> = new Set(\n INVOICE_UPLOAD_LIST_SORT_COLUMNS,\n);\n\nexport function isInvoiceSortColumn(\n id: string,\n): id is InvoiceUploadListSortColumn {\n return SORT_COLUMNS.has(id);\n}\n\n/** DataGrid sort entries to the list's own, dropping other columns. */\nexport function toInvoiceSortEntries(\n entries: ReadonlyArray<{ colId: string; sort: 'asc' | 'desc' }>,\n): InvoiceUploadListSortEntry[] {\n const out: InvoiceUploadListSortEntry[] = [];\n for (const entry of entries) {\n if (isInvoiceSortColumn(entry.colId)) {\n out.push({ colId: entry.colId, sort: entry.sort });\n }\n }\n return out;\n}\n\n/** Callbacks the handle and the UI share. */\nexport interface InvoiceUploadListCallbacks {\n onReview?: (invoice: UploadedInvoice) => void;\n onLoadAllReady?: (ids: string[]) => void;\n onLoadSelected?: (ids: string[]) => void;\n}\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: what each cell shows. */\n/* */\n/* Always rendered inside the InvoiceUploadList root through its */\n/* DataGrid. Kit leaves only (Badge, Money, Spinner); no row datum goes */\n/* into an attribute: names are text. */\n/* -------------------------------------------------------------------- */\n\nimport { useTranslation } from 'react-i18next';\nimport { Check } from 'lucide-react';\n\nimport { Badge } from '../badge/badge';\nimport { Money } from '../money/money';\nimport { Spinner } from '../spinner/spinner';\nimport { formatNumber } from '../_shared/format-number';\nimport { WAREHOUSE_INVOICE_STATUS_COPY } from '../_shared/warehouse-load';\nimport {\n cellStackVariants,\n errorTextVariants,\n figureVariants,\n fileNameVariants,\n loadingGroupVariants,\n loadingSpinnerVariants,\n secondaryTextVariants,\n truncatedTextVariants,\n} from './invoice-upload-list.variants';\nimport { formatInvoiceDay, isPersonSupplier, readInvoiceTotal } from './model';\nimport type { UploadedInvoice } from './types';\n\nexport function FileNameCell({ invoice }: { invoice: UploadedInvoice }) {\n return (\n <span dir=\"auto\" className={fileNameVariants()}>\n {invoice.fileName}\n </span>\n );\n}\n\nfunction NotFound() {\n const { t } = useTranslation('ui');\n return (\n <span className={secondaryTextVariants()}>\n {t('invoiceUploadList.cell.notFound', 'Not found')}\n </span>\n );\n}\n\n/** Never rendered for a masked cell: under privacy mode DataGrid shows its\n * mask instead. */\nexport function SupplierCell({ invoice }: { invoice: UploadedInvoice }) {\n if (invoice.supplier === null) return <NotFound />;\n return (\n <span dir=\"auto\" className={truncatedTextVariants()}>\n {invoice.supplier.name}\n </span>\n );\n}\n\nexport function InvoiceNumberCell({ invoice }: { invoice: UploadedInvoice }) {\n const { t } = useTranslation('ui');\n if (invoice.invoiceNumber === null) return <NotFound />;\n return (\n <span className={cellStackVariants()}>\n <span dir=\"auto\" className={truncatedTextVariants()}>\n {invoice.invoiceNumber}\n </span>\n {invoice.documentKind === 'creditNote' ? (\n <span className={secondaryTextVariants()}>\n {t('invoiceUploadList.documentKind.creditNote', 'Credit note')}\n </span>\n ) : null}\n </span>\n );\n}\n\nexport function DateCell({ invoice }: { invoice: UploadedInvoice }) {\n const { i18n } = useTranslation('ui');\n if (invoice.date === null) return <NotFound />;\n return <>{formatInvoiceDay(invoice.date, i18n.language)}</>;\n}\n\nexport function LineCountCell({ invoice }: { invoice: UploadedInvoice }) {\n const { i18n } = useTranslation('ui');\n if (invoice.lineCount === null) return <NotFound />;\n return (\n <span className={figureVariants()}>\n {formatNumber(invoice.lineCount, i18n.language)}\n </span>\n );\n}\n\n/** Money on its exact decimal path. Text that does not parse shows as\n * written, never as a rounded figure. */\nexport function TotalCell({ invoice }: { invoice: UploadedInvoice }) {\n if (invoice.total === null) return <NotFound />;\n const amount = readInvoiceTotal(invoice.total);\n if (!amount) {\n return (\n <span dir=\"ltr\" className={figureVariants()}>\n {invoice.total.trim()}\n </span>\n );\n }\n return (\n <Money\n size=\"sm\"\n value={amount.units}\n scale={amount.scale}\n currency={invoice.currency}\n minimumFractionDigits={Math.min(2, amount.scale)}\n maximumFractionDigits={Math.max(2, amount.scale)}\n />\n );\n}\n\nexport interface StatusCellProps {\n invoice: UploadedInvoice;\n loading: boolean;\n privacyMode: boolean;\n}\n\n/**\n * The status badge. An error row shows its message as a second line and\n * blocks nothing else. A loading row shows a spinner with its words in\n * place of the badge. Under privacy mode a person-supplier row never shows\n * the host's error text (it may name the person); kit copy stands in.\n */\nexport function StatusCell({ invoice, loading, privacyMode }: StatusCellProps) {\n const { t } = useTranslation('ui');\n if (loading) {\n const label = t('invoiceUploadList.loading', 'Loading');\n return (\n <span className={loadingGroupVariants()}>\n {/* decorative: a live region per loading row would chatter */}\n <span aria-hidden=\"true\" className={loadingSpinnerVariants()}>\n <Spinner size=\"sm\" label={label} />\n </span>\n <span>{label}</span>\n </span>\n );\n }\n const copy = WAREHOUSE_INVOICE_STATUS_COPY[invoice.status];\n let message: string | null = null;\n if (invoice.status === 'error') {\n message =\n privacyMode && isPersonSupplier(invoice)\n ? t(\n 'invoiceUploadList.errorHidden',\n 'This file could not be read (details hidden in privacy mode)',\n )\n : (invoice.error ?? null);\n }\n return (\n <span className={cellStackVariants()}>\n <Badge\n size=\"sm\"\n variant={copy.variant}\n withDot={!copy.check}\n leading={copy.check ? <Check aria-hidden=\"true\" /> : undefined}\n >\n {t(copy.key, copy.en)}\n </Badge>\n {message ? (\n <span dir=\"auto\" className={errorTextVariants()}>\n {message}\n </span>\n ) : null}\n </span>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: the column definitions on the DataGrid column API. */\n/* */\n/* Client mode: sorting, search and the status filter run in the grid. */\n/* The file name is the row header. Widths are initial px; tiers show a */\n/* column from 640, 900 or 1,200 px of grid width, and a user's own */\n/* choice in ColumnToggle always wins. Only `invoice.id` reaches the DOM. */\n/* -------------------------------------------------------------------- */\n\nimport { createElement, useMemo, type MutableRefObject } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ScanSearch } from 'lucide-react';\n\nimport type { DataGridColumn, DataGridOption } from '../data-grid/types';\nimport { RowActions, type RowActionDef } from '../row-actions/row-actions';\nimport { VisuallyHidden } from '../visually-hidden/visually-hidden';\nimport {\n WAREHOUSE_INVOICE_STATUSES,\n WAREHOUSE_INVOICE_STATUS_COPY,\n type WarehouseInvoiceStatus,\n} from '../_shared/warehouse-load';\nimport {\n DateCell,\n FileNameCell,\n InvoiceNumberCell,\n LineCountCell,\n StatusCell,\n SupplierCell,\n TotalCell,\n} from './cells';\nimport {\n INVOICE_STATUS_RANK,\n isPersonSupplier,\n readInvoiceTotal,\n type InvoiceUploadListCallbacks,\n} from './model';\nimport type { UploadedInvoice } from './types';\nimport { decimalToNumber } from '../_shared/decimal';\n\n/** The Review row action: one inline button, off on an error row. */\nexport function useInvoiceRowActions(\n callbacksRef: MutableRefObject<InvoiceUploadListCallbacks>,\n available: boolean,\n): RowActionDef<UploadedInvoice>[] {\n const { t } = useTranslation('ui');\n return useMemo(() => {\n if (!available) return [];\n return [\n {\n // Developer constant: React key and `data-action-id`.\n id: 'review',\n icon: createElement(ScanSearch, { 'aria-hidden': true }),\n label: t('invoiceUploadList.action.review', 'Review'),\n onClick: (invoice) => callbacksRef.current.onReview?.(invoice),\n disabled: (invoice) => invoice.status === 'error',\n disabledReason: (invoice) =>\n invoice.status === 'error'\n ? t(\n 'invoiceUploadList.action.reviewDisabledError',\n 'This file has an error, so there is nothing to review',\n )\n : undefined,\n },\n ];\n }, [t, callbacksRef, available]);\n}\n\nexport interface UseInvoiceUploadListColumnsOptions {\n privacyMode: boolean;\n loadingIds: ReadonlySet<string>;\n rowActions: readonly RowActionDef<UploadedInvoice>[];\n}\n\nexport function useInvoiceUploadListColumns({\n privacyMode,\n loadingIds,\n rowActions,\n}: UseInvoiceUploadListColumnsOptions): DataGridColumn<UploadedInvoice>[] {\n const { t } = useTranslation('ui');\n\n return useMemo(() => {\n const statusLabel = (status: WarehouseInvoiceStatus): string => {\n const copy = WAREHOUSE_INVOICE_STATUS_COPY[status];\n return t(copy.key, copy.en);\n };\n const statusOptions: DataGridOption[] = WAREHOUSE_INVOICE_STATUSES.map(\n (status) => ({ value: status, label: statusLabel(status) }),\n );\n const actionsLabel = t('dataTable.actions', 'Actions');\n\n const columns: DataGridColumn<UploadedInvoice>[] = [\n {\n id: 'fileName',\n header: t('invoiceUploadList.column.fileName', 'File'),\n rowHeader: true,\n pin: 'start',\n hideable: false,\n reorderable: false,\n pinnable: false,\n size: 240,\n minSize: 160,\n value: (invoice) => invoice.fileName,\n exportValue: (invoice) => invoice.fileName,\n sort: 'text',\n cell: (invoice) => <FileNameCell invoice={invoice} />,\n },\n {\n id: 'supplier',\n header: t('invoiceUploadList.column.supplier', 'Supplier'),\n size: 240,\n minSize: 160,\n value: (invoice) => invoice.supplier?.name ?? null,\n // Off while privacy mode is on: the whole column leaves sorting.\n sort: 'text',\n // People are masked; companies stay visible.\n privacy: { mode: 'mask', appliesTo: isPersonSupplier },\n cell: (invoice) => <SupplierCell invoice={invoice} />,\n },\n {\n id: 'invoiceNumber',\n header: t('invoiceUploadList.column.invoiceNumber', 'Invoice number'),\n size: 160,\n responsiveTier: 1,\n value: (invoice) => invoice.invoiceNumber,\n exportValue: (invoice) => invoice.invoiceNumber,\n sort: 'text',\n cell: (invoice) => <InvoiceNumberCell invoice={invoice} />,\n },\n {\n id: 'date',\n header: t('invoiceUploadList.column.date', 'Date'),\n size: 128,\n responsiveTier: 1,\n // A calendar day `YYYY-MM-DD`; DataGrid formats it for export.\n value: (invoice) => invoice.date,\n sort: 'date',\n sortDescFirst: true,\n search: false,\n cell: (invoice) => <DateCell invoice={invoice} />,\n },\n {\n id: 'lineCount',\n header: t('invoiceUploadList.column.lineCount', 'Lines'),\n align: 'end',\n size: 96,\n responsiveTier: 2,\n value: (invoice) => invoice.lineCount,\n sort: 'number',\n sortDescFirst: true,\n search: false,\n cell: (invoice) => <LineCountCell invoice={invoice} />,\n },\n {\n id: 'total',\n header: t('invoiceUploadList.column.total', 'Total'),\n align: 'end',\n size: 136,\n responsiveTier: 1,\n value: (invoice) => {\n const amount = readInvoiceTotal(invoice.total);\n return amount ? decimalToNumber(amount) : null;\n },\n exportValue: (invoice) => invoice.total,\n sort: 'number',\n sortDescFirst: true,\n search: false,\n cell: (invoice) => <TotalCell invoice={invoice} />,\n },\n {\n id: 'status',\n header: t('invoiceUploadList.column.status', 'Status'),\n size: 224,\n minSize: 160,\n wrap: true,\n value: (invoice) => invoice.status,\n exportValue: (invoice) => statusLabel(invoice.status),\n // Work to do first: ready, to review, error, then the rest.\n sort: (a, b) =>\n INVOICE_STATUS_RANK[a.status] - INVOICE_STATUS_RANK[b.status],\n filter: { kind: 'select', options: statusOptions },\n search: false,\n cell: (invoice) => (\n <StatusCell\n invoice={invoice}\n loading={loadingIds.has(invoice.id)}\n privacyMode={privacyMode}\n />\n ),\n },\n {\n id: 'actions',\n header: <VisuallyHidden>{actionsLabel}</VisuallyHidden>,\n headerLabel: actionsLabel,\n pin: 'end',\n size: 120,\n hideable: false,\n reorderable: false,\n pinnable: false,\n resizable: false,\n exportable: false,\n printable: false,\n search: false,\n // Kit RowActions, named by reference (\"Actions, invoice.xml\"),\n // never by row data in an attribute.\n cell: (invoice, context) => (\n <RowActions\n row={invoice}\n actions={rowActions}\n aria-labelledby={context.inputLabelledBy}\n />\n ),\n },\n ];\n return columns;\n }, [t, privacyMode, loadingIds, rowActions]);\n}\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: the curated handle (`ref`). */\n/* */\n/* Built over the inner DataGrid's handle and the props of the last */\n/* render. It hands out ids and kit shapes only: never the DataGrid */\n/* handle, a TanStack object, a row object or a DOM node. Review and */\n/* load call the same host callbacks as the UI, after the same checks; */\n/* a refused call throws an Error whose message starts with its code. */\n/* -------------------------------------------------------------------- */\n\nimport type { DataGridHandle } from '../data-grid/types';\nimport {\n countByStatus,\n isInvoiceSortColumn,\n readyInvoiceIds,\n summariseInvoice,\n toInvoiceSortEntries,\n type InvoiceUploadListCallbacks,\n} from './model';\nimport {\n INVOICE_UPLOAD_LIST_COLUMNS,\n type InvoiceUploadListColumnId,\n type InvoiceUploadListColumnInfo,\n type InvoiceUploadListFeatureInfo,\n type InvoiceUploadListHandle,\n type UploadedInvoice,\n} from './types';\n\n/** What the handle reads from the last render. */\nexport interface InvoiceUploadListLive {\n invoices: readonly UploadedInvoice[];\n callbacks: InvoiceUploadListCallbacks;\n loadingIds: ReadonlySet<string>;\n privacyMode: boolean;\n status: InvoiceUploadListFeatureInfo['status'];\n selectable: boolean;\n}\n\ntype InvoiceUploadListHandleErrorCode =\n | 'UNKNOWN_ROW'\n | 'ROW_FILTERED_OUT'\n | 'ACTION_UNAVAILABLE'\n | 'ACTION_DISABLED';\n\nfunction refuse(code: InvoiceUploadListHandleErrorCode, detail: string): never {\n throw new Error(`${code}: ${detail}`);\n}\n\nconst COLUMN_IDS: ReadonlySet<string> = new Set(INVOICE_UPLOAD_LIST_COLUMNS);\n\nfunction isColumnId(id: string): id is InvoiceUploadListColumnId {\n return COLUMN_IDS.has(id);\n}\n\nexport function createInvoiceUploadListHandle(\n gridRef: { readonly current: DataGridHandle | null },\n liveRef: { readonly current: InvoiceUploadListLive },\n): InvoiceUploadListHandle {\n const grid = (): DataGridHandle | null => gridRef.current;\n const live = (): InvoiceUploadListLive => liveRef.current;\n\n function find(id: string): UploadedInvoice {\n const invoice = live().invoices.find((candidate) => candidate.id === id);\n return invoice ?? refuse('UNKNOWN_ROW', `no invoice \"${id}\" in the list.`);\n }\n\n /** The row is in the list and the search and filters leave it showing. */\n function findShown(id: string): UploadedInvoice {\n const invoice = find(id);\n const shown = grid()?.getRowIds();\n if (shown && !shown.includes(id)) {\n refuse(\n 'ROW_FILTERED_OUT',\n `invoice \"${id}\" is hidden by the search or a filter.`,\n );\n }\n return invoice;\n }\n\n function readyIds(): string[] {\n const { invoices, loadingIds } = live();\n return readyInvoiceIds(invoices, loadingIds);\n }\n\n return {\n getFeatures() {\n const { privacyMode, status, selectable } = live();\n return { privacyMode, status, selectable, readyCount: readyIds().length };\n },\n\n getRowIds() {\n return grid()?.getRowIds() ?? live().invoices.map((i) => i.id);\n },\n\n getRowSummaries() {\n const { invoices, privacyMode, loadingIds, callbacks } = live();\n const canReview = Boolean(callbacks.onReview);\n return invoices.map((invoice) =>\n summariseInvoice(invoice, privacyMode, loadingIds, canReview),\n );\n },\n\n getCounts() {\n return countByStatus(live().invoices);\n },\n\n getSelection() {\n return grid()?.getSelection() ?? [];\n },\n\n setSelection(ids) {\n grid()?.setSelection(ids);\n },\n\n selectReady() {\n const handle = grid();\n if (!handle) return [];\n handle.setSelection(readyIds());\n return handle.getSelection();\n },\n\n clearSelection() {\n grid()?.clearSelection();\n },\n\n getSort() {\n return toInvoiceSortEntries(grid()?.getSort() ?? []);\n },\n\n setSort(model) {\n const handle = grid();\n if (!handle) return;\n const masked = new Set(\n handle\n .getColumns()\n .filter((column) => column.masked === true)\n .map((column) => column.id),\n );\n for (const entry of model) {\n if (!isInvoiceSortColumn(entry.colId) || masked.has(entry.colId))\n return;\n }\n handle.setSort(model);\n },\n\n getColumns() {\n const handle = grid();\n if (!handle) return [];\n const { privacyMode } = live();\n const columns: InvoiceUploadListColumnInfo[] = [];\n for (const column of handle.getColumns()) {\n if (!isColumnId(column.id)) continue;\n columns.push({\n id: column.id,\n label: column.label,\n visible: column.visible,\n canHide: column.canHide,\n sortable: column.sortable,\n masked: column.masked ?? (privacyMode && column.id === 'supplier'),\n });\n }\n return columns;\n },\n\n hasRow(id) {\n return live().invoices.some((candidate) => candidate.id === id);\n },\n\n scrollToRow(id) {\n findShown(id);\n grid()?.scrollToRow(id);\n },\n\n focusRow(id) {\n findShown(id);\n grid()?.focusRow(id, 'fileName');\n },\n\n review(id) {\n const invoice = find(id);\n const { callbacks } = live();\n if (!callbacks.onReview) {\n refuse('ACTION_UNAVAILABLE', 'this list offers no review.');\n }\n if (invoice.status === 'error') {\n refuse('ACTION_DISABLED', 'error');\n }\n callbacks.onReview(invoice);\n },\n\n loadAllReady() {\n const { callbacks } = live();\n if (!callbacks.onLoadAllReady) {\n refuse('ACTION_UNAVAILABLE', 'this list offers no \"load all ready\".');\n }\n const ids = readyIds();\n if (ids.length === 0) {\n refuse('ACTION_DISABLED', 'noReadyInvoices');\n }\n callbacks.onLoadAllReady(ids);\n return ids;\n },\n\n loadSelected() {\n const { callbacks } = live();\n if (!callbacks.onLoadSelected) {\n refuse('ACTION_UNAVAILABLE', 'this list offers no bulk load.');\n }\n const ids = grid()?.getSelection() ?? [];\n if (ids.length === 0) {\n refuse('ACTION_DISABLED', 'emptySelection');\n }\n callbacks.onLoadSelected(ids);\n return ids;\n },\n };\n}\n","/* -------------------------------------------------------------------- */\n/* InvoiceUploadList: the uploaded supplier invoices, one row per invoice */\n/* body, on the kit DataGrid in client mode. */\n/* */\n/* Displays and emits. It never reads a file, calls a server or decides */\n/* a status: the platform does, and passes `invoices`. Sorting, search */\n/* and the status filter run in the grid; rows virtualise past 100. Only */\n/* `readyToLoad` rows can be ticked. An error row shows its message and */\n/* blocks nothing. Privacy mode hides person suppliers; companies stay. */\n/* One agent surface per list: `invoiceUploadListAgent` over the curated */\n/* handle; the inner DataGrid registers none. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useImperativeHandle,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PackagePlus } from 'lucide-react';\n\nimport { useAgentRegistration } from '../../agent';\nimport { Button } from '../button/button';\nimport { VisuallyHidden } from '../visually-hidden/visually-hidden';\nimport { DataGrid } from '../data-grid/data-grid';\nimport { DataGridToolbar } from '../data-grid/toolbar';\nimport type {\n DataGridHandle,\n DataGridRowSelectability,\n} from '../data-grid/types';\nimport { formatNumber } from '../_shared/format-number';\nimport {\n WAREHOUSE_INVOICE_STATUSES,\n WAREHOUSE_INVOICE_STATUS_COPY,\n warehouseInvoiceStatusCountLabel,\n} from '../_shared/warehouse-load';\nimport { invoiceUploadListAgent } from './invoice-upload-list.agent';\nimport {\n countsFooterVariants,\n invoiceUploadListVariants,\n} from './invoice-upload-list.variants';\nimport { useInvoiceRowActions, useInvoiceUploadListColumns } from './columns';\nimport {\n createInvoiceUploadListHandle,\n type InvoiceUploadListLive,\n} from './handle';\nimport {\n INVOICE_UPLOAD_LIST_DEFAULT_ID,\n countByStatus,\n invoiceRowLabel,\n isInvoiceSelectable,\n readyInvoiceIds,\n type InvoiceUploadListCallbacks,\n} from './model';\nimport type {\n InvoiceUploadListHandle,\n InvoiceUploadListProps,\n UploadedInvoice,\n} from './types';\n\nexport type { InvoiceUploadListProps, InvoiceUploadListHandle } from './types';\n\nconst NO_IDS: readonly string[] = [];\nconst getInvoiceId = (invoice: UploadedInvoice): string => invoice.id;\nconst getInvoiceLabel = (invoice: UploadedInvoice): string =>\n invoiceRowLabel(invoice);\n\n/**\n * The uploaded invoices of a warehouse load. Pass `invoices` with the\n * status the platform worked out for each; react to `onReview`,\n * `onLoadAllReady` and `onLoadSelected`. `ref` gives the curated\n * `InvoiceUploadListHandle`.\n */\nexport const InvoiceUploadList = forwardRef<\n InvoiceUploadListHandle,\n InvoiceUploadListProps\n>(function InvoiceUploadList(props, ref) {\n const {\n id = INVOICE_UPLOAD_LIST_DEFAULT_ID,\n invoices,\n status = 'ready',\n error,\n selection,\n defaultSelection,\n onSelectionChange,\n onReview,\n onLoadAllReady,\n onLoadSelected,\n loadingIds = NO_IDS,\n privacyMode = false,\n caption,\n density = 'default',\n height = 'auto',\n persistColumnState = true,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n } = props;\n\n const { t, i18n } = useTranslation('ui');\n const gridRef = useRef<DataGridHandle | null>(null);\n\n const loadingSet = useMemo(() => new Set(loadingIds), [loadingIds]);\n // Any selection prop turns the checkboxes on, so `defaultSelection` and\n // `onSelectionChange` alone are never silently ignored.\n const selectable =\n Boolean(onLoadSelected) ||\n selection !== undefined ||\n defaultSelection !== undefined ||\n onSelectionChange !== undefined;\n\n /* ---------------- what the handle reads ---------------- */\n\n const noneReadyId = useId();\n const callbacks: InvoiceUploadListCallbacks = {\n onReview,\n onLoadAllReady,\n onLoadSelected,\n };\n // Read when an action runs, so a host's inline functions never rebuild\n // the columns.\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n const live: InvoiceUploadListLive = {\n invoices,\n callbacks,\n loadingIds: loadingSet,\n privacyMode,\n status,\n selectable,\n };\n const liveRef = useRef(live);\n liveRef.current = live;\n\n const [handle] = useState(() =>\n createInvoiceUploadListHandle(gridRef, liveRef),\n );\n useImperativeHandle(ref, () => handle, [handle]);\n // `id` is the instance id. The DataGrid inside gets\n // `registerAgent={false}`, so one list exposes one agent surface.\n useAgentRegistration(invoiceUploadListAgent, handle, id);\n\n /* ---------------- derived ---------------- */\n\n const readyIds = useMemo(\n () => readyInvoiceIds(invoices, loadingSet),\n [invoices, loadingSet],\n );\n const counts = useMemo(() => countByStatus(invoices), [invoices]);\n\n const rowActions = useInvoiceRowActions(callbacksRef, Boolean(onReview));\n const columns = useInvoiceUploadListColumns({\n privacyMode,\n loadingIds: loadingSet,\n rowActions,\n });\n\n const getRowSelectability = useMemo(\n () =>\n (invoice: UploadedInvoice): DataGridRowSelectability => {\n if (isInvoiceSelectable(invoice, loadingSet)) return 'selectable';\n if (loadingSet.has(invoice.id)) {\n return {\n state: 'none',\n reason: t(\n 'invoiceUploadList.selection.loadingReason',\n 'This invoice is being loaded',\n ),\n };\n }\n const reasons = {\n toReview: t(\n 'invoiceUploadList.selection.toReviewReason',\n 'Review this invoice before you load it',\n ),\n alreadyLoaded: t(\n 'invoiceUploadList.selection.alreadyLoadedReason',\n 'This invoice is already in the warehouse',\n ),\n loaded: t(\n 'invoiceUploadList.selection.loadedReason',\n 'This invoice is loaded',\n ),\n error: t(\n 'invoiceUploadList.selection.errorReason',\n 'This file has an error',\n ),\n } as const;\n return {\n state: 'none',\n reason:\n invoice.status === 'readyToLoad'\n ? reasons.toReview\n : reasons[invoice.status],\n };\n },\n [loadingSet, t],\n );\n\n /* The bulk button leaves the toolbar when the selection empties (the\n rows turn to loading). If focus fell to the page, put it on the first\n row that was sent. */\n const keepFocusAfterBulk = (firstId: string | undefined): void => {\n if (!firstId) return;\n requestAnimationFrame(() => {\n const active = document.activeElement;\n if (!active || active === document.body) {\n gridRef.current?.focusRow(firstId, 'fileName');\n }\n });\n };\n\n /* ---------------- toolbar ---------------- */\n\n const statusPills = WAREHOUSE_INVOICE_STATUSES.map((value) => {\n const copy = WAREHOUSE_INVOICE_STATUS_COPY[value];\n return { value, label: t(copy.key, copy.en) };\n });\n\n const toolbar = (\n <DataGridToolbar>\n <DataGridToolbar.FilterBar>\n <DataGridToolbar.QuickSearch\n placeholder={t(\n 'invoiceUploadList.search.placeholder',\n 'Search by file, supplier or invoice number',\n )}\n />\n <DataGridToolbar.FacetFilter\n field=\"status\"\n label={t('invoiceUploadList.column.status', 'Status')}\n options={[\n { value: null, label: t('dataTable.selectFilter.all', 'All') },\n ...statusPills,\n ]}\n />\n <DataGridToolbar.FilterChips />\n </DataGridToolbar.FilterBar>\n <DataGridToolbar.Actions>\n {onLoadSelected ? (\n <DataGridToolbar.BulkAction\n label={t('invoiceUploadList.bulk.loadSelected', 'Load selected')}\n icon={<PackagePlus aria-hidden=\"true\" />}\n onAction={({ selectedRowIds }) => {\n const ids = [...selectedRowIds];\n onLoadSelected(ids);\n keepFocusAfterBulk(ids[0]);\n }}\n />\n ) : null}\n {onLoadAllReady ? (\n <>\n {/* aria-disabled, not disabled: the button keeps focus when the\n last ready invoice starts loading (WCAG 2.4.3). */}\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<PackagePlus aria-hidden=\"true\" />}\n aria-disabled={readyIds.length === 0 ? true : undefined}\n aria-describedby={readyIds.length === 0 ? noneReadyId : undefined}\n onClick={() => {\n if (readyIds.length === 0) return;\n onLoadAllReady(readyIds);\n }}\n >\n {t(\n 'invoiceUploadList.loadAllReady',\n 'Load all ready ({{countText}})',\n {\n countText: formatNumber(readyIds.length, i18n.language),\n },\n )}\n </Button>\n <VisuallyHidden id={noneReadyId}>\n {t(\n 'invoiceUploadList.loadAllReadyNone',\n 'No invoice is ready to load',\n )}\n </VisuallyHidden>\n </>\n ) : null}\n <DataGridToolbar.ColumnToggle />\n </DataGridToolbar.Actions>\n </DataGridToolbar>\n );\n\n /* ---------------- render ---------------- */\n\n const shownCounts = WAREHOUSE_INVOICE_STATUSES.filter(\n (value) => counts[value] > 0,\n );\n const countLabels = shownCounts.map((value) =>\n warehouseInvoiceStatusCountLabel(t, i18n.language, value, counts[value]),\n );\n\n // One announcement when a load finishes, never row by row. The region is\n // always mounted so the first message is heard.\n const [announcement, setAnnouncement] = useState('');\n const wasLoading = useRef(false);\n const countsSentence = countLabels.join(', ');\n const countsSentenceRef = useRef(countsSentence);\n countsSentenceRef.current = countsSentence;\n const isLoading = loadingSet.size > 0;\n useEffect(() => {\n if (wasLoading.current && !isLoading) {\n setAnnouncement(countsSentenceRef.current);\n }\n wasLoading.current = isLoading;\n }, [isLoading]);\n\n return (\n <div\n data-component=\"invoice-upload-list\"\n data-component-id={id}\n className={invoiceUploadListVariants({ height, className })}\n {...rest}\n >\n <DataGrid<UploadedInvoice>\n ref={gridRef}\n columns={columns}\n rows={invoices}\n getRowId={getInvoiceId}\n caption={caption ?? t('invoiceUploadList.caption', 'Uploaded invoices')}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n /* identity: storage key only; the list is the agent surface */\n gridId={id}\n registerAgent={false}\n persistColumnState={persistColumnState}\n dataMode=\"client\"\n /* selection: ready rows only; survives sorting and search */\n selectionMode={selectable ? 'multiple' : 'none'}\n rowSelection={selection}\n defaultRowSelection={defaultSelection}\n onRowSelectionChange={onSelectionChange}\n getRowSelectability={getRowSelectability}\n selectAllScope=\"all\"\n rangeSelection\n columnResizing\n responsiveColumns\n getRowLabel={getInvoiceLabel}\n rowLabelPrivacySafe\n /* states */\n status={status}\n error={{\n title:\n error?.title ??\n t(\n 'invoiceUploadList.error.title',\n 'The uploaded invoices could not be shown',\n ),\n description: error?.description,\n onRetry: error?.onRetry,\n }}\n empty={{\n title: t('invoiceUploadList.empty.title', 'No invoices uploaded yet'),\n description: t(\n 'invoiceUploadList.empty.description',\n 'Invoices from the files you upload appear here.',\n ),\n noResultsTitle: t(\n 'invoiceUploadList.empty.noResultsTitle',\n 'No invoices match your search',\n ),\n }}\n toolbar={toolbar}\n density={density}\n height={height}\n privacyMode={privacyMode}\n /* every selectability reason is translated kit copy, no row data */\n hostTextPrivacySafe\n />\n {countLabels.length > 0 ? (\n <p className={countsFooterVariants()}>\n {countLabels.map((label, index) => (\n <span key={shownCounts[index]}>\n {index > 0 ? (\n <>\n {' '}\n <span aria-hidden=\"true\">·</span>{' '}\n </>\n ) : null}\n {label}\n </span>\n ))}\n </p>\n ) : null}\n <VisuallyHidden role=\"status\" aria-atomic=\"true\">\n {announcement}\n </VisuallyHidden>\n </div>\n );\n});\n\nInvoiceUploadList.displayName = 'InvoiceUploadList';\n"],"names":["__iconNode","ScanSearch","createLucideIcon","SORT_COLUMNS","refuse","code","detail","knownRow","handle","id","ROW_ID_SCHEMA","invoiceUploadListAgent","args","column","c","invoiceUploadListVariants","cva","cellStackVariants","secondaryTextVariants","errorTextVariants","truncatedTextVariants","fileNameVariants","figureVariants","loadingGroupVariants","loadingSpinnerVariants","countsFooterVariants","INVOICE_UPLOAD_LIST_COLUMNS","INVOICE_UPLOAD_LIST_SORT_COLUMNS","INVOICE_SUPPLIER_KINDS","INVOICE_DOCUMENT_KINDS","INVOICE_UPLOAD_LIST_DEFAULT_ID","INVOICE_STATUS_RANK","readInvoiceTotal","total","parsed","parseDecimal","FATTURAPA_VALUE","isSupplierMasked","invoice","privacyMode","_a","isPersonSupplier","isInvoiceSelectable","loading","readyInvoiceIds","invoices","countByStatus","countInvoicesByStatus","invoiceRowLabel","summariseInvoice","canReview","masked","summary","dayFormatters","CALENDAR_DAY","formatInvoiceDay","day","language","match","year","month","date","instant","locale","formatLocale","formatter","isInvoiceSortColumn","toInvoiceSortEntries","entries","out","entry","FileNameCell","jsx","NotFound","t","useTranslation","SupplierCell","InvoiceNumberCell","jsxs","DateCell","i18n","LineCountCell","TotalCell","amount","Money","StatusCell","label","Spinner","copy","WAREHOUSE_INVOICE_STATUS_COPY","message","Badge","Check","useInvoiceRowActions","callbacksRef","available","useMemo","createElement","_b","useInvoiceUploadListColumns","loadingIds","rowActions","statusLabel","status","statusOptions","WAREHOUSE_INVOICE_STATUSES","actionsLabel","decimalToNumber","a","b","VisuallyHidden","context","RowActions","COLUMN_IDS","isColumnId","createInvoiceUploadListHandle","gridRef","liveRef","grid","live","find","candidate","findShown","shown","readyIds","selectable","i","callbacks","ids","model","columns","NO_IDS","getInvoiceId","getInvoiceLabel","InvoiceUploadList","forwardRef","props","ref","error","selection","defaultSelection","onSelectionChange","onReview","onLoadAllReady","onLoadSelected","caption","density","height","persistColumnState","className","ariaLabel","ariaLabelledBy","ariaDescribedBy","rest","useRef","loadingSet","noneReadyId","useId","useState","useImperativeHandle","useAgentRegistration","counts","getRowSelectability","reasons","keepFocusAfterBulk","firstId","active","statusPills","value","toolbar","DataGridToolbar","PackagePlus","selectedRowIds","Fragment","Button","formatNumber","shownCounts","countLabels","warehouseInvoiceStatusCountLabel","announcement","setAnnouncement","wasLoading","countsSentence","countsSentenceRef","isLoading","useEffect","DataGrid","index"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parts-CcyRkB8t.js","sources":["../../node_modules/lucide-react/dist/esm/icons/columns-3-cog.mjs","../../src/components/_shared/table-toolbar/context.tsx","../../src/components/_shared/table-toolbar/describe-filter.ts","../../src/components/_shared/table-toolbar/parts.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.5 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.5\", key: \"1g2yzs\" }],\n [\"path\", { d: \"m14.3 19.6 1-.4\", key: \"11sv9r\" }],\n [\"path\", { d: \"M15 3v7.5\", key: \"7lm50a\" }],\n [\"path\", { d: \"m15.2 16.9-.9-.3\", key: \"1t7mvx\" }],\n [\"path\", { d: \"m16.6 21.7.3-.9\", key: \"1j67ps\" }],\n [\"path\", { d: \"m16.8 15.3-.4-1\", key: \"1ei7r6\" }],\n [\"path\", { d: \"m19.1 15.2.3-.9\", key: \"18r7jp\" }],\n [\"path\", { d: \"m19.6 21.7-.4-1\", key: \"z2vh2\" }],\n [\"path\", { d: \"m20.7 16.8 1-.4\", key: \"19m87a\" }],\n [\"path\", { d: \"m21.7 19.4-.9-.3\", key: \"1qgwi9\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"circle\", { cx: \"18\", cy: \"18\", r: \"3\", key: \"1xkwt0\" }]\n];\nconst Columns3Cog = createLucideIcon(\"columns-3-cog\", __iconNode);\n\nexport { __iconNode, Columns3Cog as default };\n//# sourceMappingURL=columns-3-cog.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Table toolbar context: how a toolbar part finds its table's seam. */\n/* */\n/* Engine-agnostic. DataTable provides an AG-backed seam */\n/* (`data-table/ag-toolbar-seam.ts`), DataGrid its own */\n/* (`data-grid/toolbar-seam.ts`). The parts never see an engine API. */\n/* -------------------------------------------------------------------- */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport type { TableToolbarChangeKind, TableToolbarSeam } from './seam';\n\n/** @internal What the shared parts read. */\nexport interface TableToolbarContextValue {\n seam: TableToolbarSeam;\n}\n\nconst TableToolbarContext = createContext<TableToolbarContextValue | null>(\n null,\n);\n\n/** @internal Props of {@link TableToolbarProvider}. */\nexport interface TableToolbarProviderProps {\n seam: TableToolbarSeam;\n children: ReactNode;\n}\n\n/** @internal Puts one table's seam in reach of the toolbar parts below. */\nexport function TableToolbarProvider({\n seam,\n children,\n}: TableToolbarProviderProps) {\n // Keyed on the seam alone; parts re-read the seam through\n // `useSeamVersion`, not through a new context value.\n const value = useMemo<TableToolbarContextValue>(() => ({ seam }), [seam]);\n return (\n <TableToolbarContext.Provider value={value}>\n {children}\n </TableToolbarContext.Provider>\n );\n}\n\n/**\n * @internal The seam of the nearest table toolbar provider, else\n * `fallback` (an engine's own context, such as DataGrid's toolbar slot).\n * Throws `missingMessage` when there is neither (each engine words it for\n * its own API).\n */\nexport function useTableToolbarSeam(\n missingMessage: string,\n fallback?: TableToolbarSeam | null,\n): TableToolbarSeam {\n const ctx = useContext(TableToolbarContext);\n const seam = ctx?.seam ?? fallback;\n if (!seam) throw new Error(missingMessage);\n return seam;\n}\n\n/**\n * @internal A number that changes whenever the seam reports a change of one\n * of `kinds`. Read the seam during render and list this number in the\n * dependencies of anything memoised over it. Subscribing is safe before the\n * engine is ready: the seam binds late and fires once it can answer.\n */\nexport function useSeamVersion(\n seam: TableToolbarSeam,\n kinds: readonly TableToolbarChangeKind[],\n): number {\n const [version, setVersion] = useState(0);\n const key = kinds.join(' ');\n useEffect(() => {\n const wanted = new Set(key.split(' '));\n return seam.subscribe((kind) => {\n if (wanted.has(kind)) setVersion((v) => v + 1);\n });\n }, [seam, key]);\n return version;\n}\n","/* -------------------------------------------------------------------- */\n/* Chip text for a filter model (moved from `data-table/toolbar.tsx`). */\n/* -------------------------------------------------------------------- */\n\nimport { getShortDateFormat } from '../date-locale';\nimport { formatNumber } from '../format-number';\nimport { fromIsoDate } from '../table-filters/calendar-day';\nimport type { TableToolbarColumn, TextFilterOperator } from './seam';\n\n/**\n * `date-fns` `format(date, pattern)` for the patterns `getShortDateFormat`\n * returns, which use only `dd`, `MM`, `yyyy` and the separators `/ . -`.\n * Same output (local calendar fields, zero-padded, era year as date-fns\n * writes it), without shipping date-fns `format` with every toolbar.\n */\nexport function formatShortDate(date: Date, pattern: string): string {\n const pad = (n: number, width: number) => String(n).padStart(width, '0');\n return pattern.replace(/yyyy|MM|dd/g, (token) => {\n if (token === 'dd') return pad(date.getDate(), 2);\n if (token === 'MM') return pad(date.getMonth() + 1, 2);\n const signed = date.getFullYear();\n return pad(signed > 0 ? signed : 1 - signed, 4);\n });\n}\n\n/** A translator with a fallback, as `useTranslation('ui').t` is called. */\nexport type DescribeFilterTranslate = (key: string, fallback: string) => string;\n\n/** How values read in a chip. Each hook is optional: without them the chip\n * reads exactly as DataTable's did in kit 1.112. */\nexport interface DescribeFilterFormat {\n /** DataGrid's wording: a text operator in the text filter menu's words,\n * an open date bound as \"From …\" or \"To …\", and a one-date operator\n * named (\"Less than …\"). Without it, kit 1.112's wording (DataTable). */\n kitWording?: boolean;\n /** A select option's label for its value, if the column has one. */\n optionLabel?: (value: unknown) => string | undefined;\n /** A number in the UI language. */\n number?: (value: number) => string;\n /** A `YYYY-MM-DD` calendar day in the UI language. */\n day?: (day: string) => string;\n}\n\n/**\n * The format hooks for one column, all only when the seam asks for\n * formatted values (`features.formatsFilterValues`, DataGrid), so\n * DataTable's chips keep their kit 1.112 text.\n */\nexport function chipFormatFor(\n column: Pick<TableToolbarColumn, 'filterOptions'>,\n formatsValues: boolean,\n language: string | undefined,\n): DescribeFilterFormat {\n const options = column.filterOptions;\n if (!formatsValues) return {};\n return {\n kitWording: true,\n optionLabel: options\n ? (value) => options.find((o) => o.value === value)?.label\n : undefined,\n number: (n) => formatNumber(n, language),\n day: (day) => {\n const date = fromIsoDate(day);\n return date\n ? formatShortDate(date, getShortDateFormat(language ?? 'en'))\n : day;\n },\n };\n}\n\n/** The text filter's operators (`TextFilterOperator`). */\nfunction isTextOperator(op: string): op is TextFilterOperator {\n return (\n op === 'contains' ||\n op === 'notContains' ||\n op === 'equals' ||\n op === 'startsWith' ||\n op === 'endsWith'\n );\n}\n\n/** A text operator through the text filter's own strings, the words its\n * menu shows. One literal key per operator, so no lookup misses. */\nfunction textOperatorText(\n op: TextFilterOperator,\n t: DescribeFilterTranslate,\n): string {\n switch (op) {\n case 'contains':\n return t('dataTable.textFilter.operators.contains', 'Contains');\n case 'notContains':\n return t(\n 'dataTable.textFilter.operators.notContains',\n 'Does not contain',\n );\n case 'equals':\n return t('dataTable.textFilter.operators.equals', 'Equals');\n case 'startsWith':\n return t('dataTable.textFilter.operators.startsWith', 'Starts with');\n case 'endsWith':\n return t('dataTable.textFilter.operators.endsWith', 'Ends with');\n }\n}\n\n/** An operator through AG Grid's strings, as kit 1.112 chips read (they\n * also name the `…OrEqual` operators). One literal key per operator, so\n * no fallback key is looked up. An operator the kit does not know prints\n * as it is (a consumer's own filter). */\nfunction gridOperatorText(op: string, t: DescribeFilterTranslate): string {\n switch (op) {\n case 'contains':\n return t('dataTable.agGrid.contains', 'Contains');\n case 'notContains':\n return t('dataTable.agGrid.notContains', 'Does not contain');\n case 'startsWith':\n return t('dataTable.agGrid.startsWith', 'Starts with');\n case 'endsWith':\n return t('dataTable.agGrid.endsWith', 'Ends with');\n case 'equals':\n return t('dataTable.agGrid.equals', 'Equals');\n case 'notEqual':\n return t('dataTable.agGrid.notEqual', 'Not equal');\n case 'greaterThan':\n return t('dataTable.agGrid.greaterThan', 'Greater than');\n case 'greaterThanOrEqual':\n return t(\n 'dataTable.agGrid.greaterThanOrEqual',\n 'Greater than or equal to',\n );\n case 'lessThan':\n return t('dataTable.agGrid.lessThan', 'Less than');\n case 'lessThanOrEqual':\n return t('dataTable.agGrid.lessThanOrEqual', 'Less than or equal to');\n case 'inRange':\n return t('dataTable.agGrid.inRange', 'In range');\n case 'blank':\n return t('dataTable.agGrid.blank', 'Blank');\n case 'notBlank':\n return t('dataTable.agGrid.notBlank', 'Not blank');\n default:\n return op;\n }\n}\n\n/**\n * One line of chip text for a kit filter model. The operator is the model's\n * own type key (`contains`, `greaterThan`, …); it reads through the\n * `dataTable.agGrid.*` strings DataTable's filter menus use (with\n * `kitWording`, a text operator reads through the text filter's own menu\n * strings), so a chip says \"Contiene Rossi\" in Italian, not the raw key.\n *\n * The typeahead model (`{ type: 'equals', value }`) is described by its\n * column name only, as in kit 1.112: its value can be a person's name.\n */\nexport function describeFilterModel(\n model: unknown,\n t: DescribeFilterTranslate,\n format: DescribeFilterFormat = {},\n): string {\n if (!model || typeof model !== 'object') return '';\n const m = model as Record<string, unknown>;\n const type = typeof m.type === 'string' ? m.type : '';\n const kitWording = format.kitWording === true;\n const operatorText = (op: string): string =>\n kitWording && typeof m.filter === 'string' && isTextOperator(op)\n ? textOperatorText(op, t)\n : gridOperatorText(op, t);\n const value = (v: unknown): string =>\n typeof v === 'number' && format.number ? format.number(v) : String(v);\n const day = (d: string): string => (format.day ? format.day(d) : d);\n const from = t('dataTable.numberFilter.from', 'From');\n const to = t('dataTable.numberFilter.to', 'To');\n // Blank takes no value; the number popover still sends `filter: 0`.\n if (type === 'blank' || type === 'notBlank') return operatorText(type);\n const hasFrom = typeof m.filter === 'string' || typeof m.filter === 'number';\n const hasTo =\n typeof m.filterTo === 'string' || typeof m.filterTo === 'number';\n // Range first: a number range may carry only `filterTo` (\"≤ 5\"), which the\n // `hasFrom` branch below would drop to an empty chip.\n if (type === 'inRange' && (hasFrom || hasTo)) {\n if (hasFrom && hasTo) return `${value(m.filter)} – ${value(m.filterTo)}`;\n // \"In range 1\" reads as nonsense, so name the one bound that is set.\n return hasFrom\n ? `${from} ${value(m.filter)}`\n : `${to} ${value(m.filterTo)}`;\n }\n // Text / number filter shape: { type, filter, filterTo, filterType }\n if (hasFrom) {\n return type ? `${operatorText(type)} ${value(m.filter)}` : value(m.filter);\n }\n // Date filter shape: { type, dateFrom, dateTo }.\n if (!kitWording) {\n // Kit 1.112 (DataTable): the bare date, or nothing for a range with\n // only an end.\n if (typeof m.dateFrom === 'string') {\n if (typeof m.dateTo === 'string' && m.dateTo) {\n return `${m.dateFrom} – ${m.dateTo}`;\n }\n return String(m.dateFrom);\n }\n } else {\n // Either bound of a range may be open. AG Grid's own date filter keeps\n // a one-date operator's date in `dateFrom` (\"before 1 Jan\" is\n // `lessThan`), so only a range says \"From\".\n const dateFrom =\n typeof m.dateFrom === 'string' && m.dateFrom ? m.dateFrom : '';\n const dateTo = typeof m.dateTo === 'string' && m.dateTo ? m.dateTo : '';\n const range = type === 'inRange' || type === '';\n if (dateFrom && dateTo) return `${day(dateFrom)} – ${day(dateTo)}`;\n if (dateFrom) {\n return range\n ? `${from} ${day(dateFrom)}`\n : `${operatorText(type)} ${day(dateFrom)}`;\n }\n if (dateTo) return `${to} ${day(dateTo)}`;\n }\n // Set filter shape: { values: [...] }\n if (Array.isArray((m as { values?: unknown[] }).values)) {\n const values = (m as { values: unknown[] }).values;\n return values.map((v) => format.optionLabel?.(v) ?? value(v)).join(', ');\n }\n return '';\n}\n","/* -------------------------------------------------------------------- */\n/* Table toolbar parts, shared by DataTable and DataGrid. */\n/* */\n/* Moved from `data-table/toolbar.tsx`. Every part talks to its table */\n/* through `TableToolbarSeam` only (`./seam.ts`), so the same code serves */\n/* AG Grid (DataTable) and TanStack Table (DataGrid). Behaviour that */\n/* differs between engines is gated on `seam.features`. */\n/* */\n/* `createTableToolbarParts` builds one set per engine, so each set */\n/* carries its own display names (`DataTable.Toolbar.*`, */\n/* `DataGrid.Toolbar.*`) and its own \"rendered outside\" message. The */\n/* engine wrappers add the engine-shaped callbacks. */\n/* -------------------------------------------------------------------- */\n\nimport {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n ArrowDown,\n ArrowUp,\n Columns3Cog,\n Download,\n FileSpreadsheet,\n FileText,\n GripVertical,\n Printer,\n RefreshCw,\n RotateCcw,\n Search,\n X,\n} from 'lucide-react';\nimport { Button, type ButtonProps } from '../../button/button';\nimport { IconButton, type IconButtonProps } from '../../button/icon-button';\nimport { Popover } from '../../popover/popover';\nimport { Checkbox } from '../../checkbox/checkbox';\nimport { TextInput } from '../../text-input';\nimport { Tag } from '../../tag';\nimport { DropdownMenu } from '../../dropdown-menu';\nimport type {\n IconButtonGroupOverflowItem,\n IconButtonGroupOverflowItemProps,\n} from '../../icon-button-group/icon-button-group';\nimport { useSeamVersion, useTableToolbarSeam } from './context';\nimport { formatNumber } from '../format-number';\nimport { chipFormatFor, describeFilterModel } from './describe-filter';\nimport type {\n TableFacetValue,\n TableToolbarColumn,\n TableToolbarSeam,\n ToolbarActionContext,\n} from './seam';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n// Lucide icons default to 24×24 regardless of the wrapping span size, so\n// Button's `startIcon` slot (size-4 span) can't shrink them. Coerce icon\n// nodes to the `sm` button's 16px rendered size before handing them off.\nexport function sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} ds:size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\n/**\n * Whether the quick-search text counts as personal data now: while privacy\n * mode masks any column, typed free text may be a patient's name (the rule\n * the DataGrid agent applies to `quickFilter`). Always `false` on a seam\n * with no privacy mode (DataTable).\n */\nexport function masksFreeText(seam: TableToolbarSeam): boolean {\n return seam.getColumns().some((c) => c.masked === true);\n}\n\n/**\n * Whether a one-step move of `columns[from]` to `to` would be refused by\n * the seam's rules (`moveColumn`): a fixed column, a pin side the column\n * may not take, or a header group split. ColumnToggle disables such a\n * button rather than offer one that does nothing.\n */\nexport function canStepColumn(\n columns: readonly TableToolbarColumn[],\n from: number,\n to: number,\n): boolean {\n const column = columns[from];\n const target = columns[to];\n if (!column || !target || !column.canMove) return false;\n if (column.canPin === false && target.pinned !== column.pinned) return false;\n const next = columns.filter((_, i) => i !== from);\n next.splice(to, 0, column);\n // Every header group stays one contiguous run.\n const seen = new Set<string>();\n let previous: string | null = null;\n for (const c of next) {\n const group = c.groupId ?? null;\n if (group !== previous) {\n if (group !== null && seen.has(group)) return false;\n if (group !== null) seen.add(group);\n previous = group;\n }\n }\n return true;\n}\n\n/** The engine-agnostic context BulkAction and custom export items pass on. */\nexport function actionContextOf(seam: TableToolbarSeam): ToolbarActionContext {\n return {\n selectedRowIds: seam.getSelectedRowIds(),\n getExportSnapshot: () => seam.getExportSnapshot(),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants (class strings byte-identical to kit 1.112) */\n/* ------------------------------------------------------------------ */\n\nexport const toolbarRootVariants = cva([\n 'data-table-toolbar',\n // Mobile (<sm) keeps `flex-wrap` so a wide QuickSearch can flow above the\n // Actions cluster on narrow screens. From `sm` (≥640px) we switch to\n // `flex-nowrap` + `min-w-0` so the row stays single-line at every common\n // desktop width (1024 / 1280 / 1440): the QuickSearch slot shrinks via\n // its own `min-w-0` instead of pushing the trailing Actions to a new row.\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:sm:flex-nowrap ds:min-w-0',\n // No card surface: the toolbar sits directly on the page background,\n // matching the header-tools layout the Patients / Care Plan List\n // patterns established.\n]);\n\nexport const toolbarFilterBarVariants = cva([\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n // `grow` lets FilterBar absorb the free space; `min-w-0` lets the\n // QuickSearch slot inside shrink below its intrinsic width when the\n // toolbar runs `flex-nowrap` at `sm` and above, so the trailing\n // Actions cluster stays pinned on a single row.\n 'ds:grow ds:min-w-0',\n]);\n\nconst quickSearchSlotVariants = cva('ds:w-full ds:max-w-[24rem] ds:min-w-0', {\n variants: {\n // The masked \"Search applied\" state adds a Clear button beside the box.\n hiddenQuery: {\n true: 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:[&>[data-component=text-input]]:min-w-0 ds:[&>[data-component=text-input]]:grow',\n false: '',\n },\n },\n defaultVariants: { hiddenQuery: false },\n});\n\nexport const toolbarActionsVariants = cva([\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:ms-auto',\n]);\n\nconst columnRowVariants = cva(\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs,var(--spacing-xs))] ds:transition-colors',\n {\n variants: {\n dragging: { true: 'ds:opacity-50', false: '' },\n dragOver: {\n true: 'ds:bg-[color:color-mix(in_srgb,var(--primary)_8%,transparent)]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dragOver: false },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Public prop shapes (engine-agnostic) */\n/* ------------------------------------------------------------------ */\n\n/** Icon-button parts: the label is the tooltip and the accessible name. */\nexport type TableToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> & {\n label?: string;\n};\n\nexport interface TableQuickSearchProps {\n /** Placeholder text. Falls back to `t('dataTable.quickSearch.placeholder')`. */\n placeholder?: string;\n /** Debounce ms before pushing to the table. Defaults to 150 ms. */\n debounceMs?: number;\n}\n\nexport interface TableFacetOption {\n value: TableFacetValue | null;\n label: string;\n}\n\nexport interface TableFacetFilterProps {\n field: string;\n options: readonly TableFacetOption[];\n label?: string;\n}\n\nexport interface TableColumnToggleProps extends TableToolbarIconButtonProps {\n /** Override the trigger glyph (defaults to the Columns3Cog icon). */\n icon?: ReactNode;\n /** Extra content rendered below the column list. */\n footer?: ReactNode;\n /** Extra content rendered above the column list, under the title. */\n header?: ReactNode;\n}\n\nexport interface TableExportMenuProps extends TableToolbarIconButtonProps {\n /** Menu items (the engine wrapper supplies its defaults). */\n children: ReactNode;\n}\n\nexport type TableExportFormat = 'csv' | 'xlsx' | 'pdf' | 'custom';\n\n/** @internal The shared item: icon, label and what selecting it does. */\nexport interface TableExportMenuItemBaseProps {\n format: TableExportFormat;\n label?: string;\n onSelect: () => void;\n disabled?: boolean;\n /** Shown under the label (the reason a disabled item cannot run). */\n description?: string;\n}\n\nexport interface TableRefreshProps extends TableToolbarIconButtonProps {\n onRefresh: () => void;\n}\n\nexport interface TableBulkActionProps extends Omit<\n ButtonProps,\n 'onClick' | 'children' | 'startIcon' | 'intent'\n> {\n label: string;\n icon?: ReactNode;\n onAction: (context: ToolbarActionContext) => void;\n variant?: 'default' | 'destructive';\n}\n\n/** How one engine names its parts. */\nexport interface TableToolbarPartNames {\n /** Display-name prefix, e.g. `DataTable.Toolbar`. */\n prefix: string;\n /** Error thrown when a part renders outside any toolbar provider. */\n missingProvider: (caller: string) => string;\n /** The engine's own way to find a seam when no toolbar provider is above\n * (a hook, called on every render). */\n useEngineSeam?: () => TableToolbarSeam | null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Factory */\n/* ------------------------------------------------------------------ */\n\n/**\n * @internal One set of toolbar parts for an engine. Called once per engine\n * at module level (`data-table/toolbar.tsx`, `data-grid/toolbar.tsx`).\n */\nexport function createTableToolbarParts(names: TableToolbarPartNames) {\n const { prefix } = names;\n const useEngineSeam = names.useEngineSeam ?? (() => null);\n const useSeam = (part: string): TableToolbarSeam =>\n useTableToolbarSeam(\n names.missingProvider(`${prefix}.${part}`),\n useEngineSeam(),\n );\n\n /* ---- Root, FilterBar, Actions ------------------------------------ */\n\n const Root = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"toolbar\"\n className={toolbarRootVariants({ className })}\n {...props}\n >\n {children}\n </div>\n ),\n );\n Root.displayName = prefix;\n\n const FilterBar = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={toolbarFilterBarVariants({ className })}\n {...props}\n >\n {children}\n </div>\n ),\n );\n FilterBar.displayName = `${prefix}.FilterBar`;\n\n const Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={toolbarActionsVariants({ className })}\n {...props}\n >\n {children}\n </div>\n ),\n );\n Actions.displayName = `${prefix}.Actions`;\n\n /* ---- Print, Refresh ---------------------------------------------- */\n\n /* The public props leave out onClick, but a wrapper that clones its\n children (a consumer's own group) may inject one. Read it so the part\n composes it with its own action instead of losing that action. */\n function withInjectedClick<P extends object>(\n props: P,\n ): P & { onClick?: MouseEventHandler<HTMLButtonElement> } {\n return props;\n }\n\n const Print = forwardRef<HTMLButtonElement, TableToolbarIconButtonProps>(\n ({ label, intent = 'outline', ...props }, ref) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('Print');\n const { onClick, ...rest } = withInjectedClick(props);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Printer aria-hidden />}\n tooltip={label ?? t('dataTable.print')}\n {...rest}\n // Run an injected onClick first, then print unless it called\n // preventDefault.\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) void seam.print();\n }}\n />\n );\n },\n );\n Print.displayName = `${prefix}.Print`;\n\n const Refresh = forwardRef<HTMLButtonElement, TableRefreshProps>(\n ({ onRefresh, label, intent = 'outline', ...props }, ref) => {\n const { t } = useTranslation('ui');\n const { onClick, ...rest } = withInjectedClick(props);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<RefreshCw aria-hidden />}\n tooltip={label ?? t('dataTable.refresh', 'Refresh')}\n {...rest}\n // Compose with an injected onClick so it never replaces\n // onRefresh.\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) onRefresh();\n }}\n />\n );\n },\n );\n Refresh.displayName = `${prefix}.Refresh`;\n\n /* In an IconButtonGroup with overflow=\"menu\", a folded Print or Refresh\n shows as one of these \"More\" menu items and runs the same action (the\n group would otherwise mirror an onClick prop these parts do not have). */\n const PrintMenuItem = ({\n childProps,\n disabled,\n }: IconButtonGroupOverflowItemProps) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('Print');\n const label = childProps.label;\n return (\n <DropdownMenu.Item\n startIcon={<Printer aria-hidden className=\"ds:size-4\" />}\n disabled={disabled}\n onSelect={() => void seam.print()}\n >\n {typeof label === 'string' ? label : t('dataTable.print')}\n </DropdownMenu.Item>\n );\n };\n PrintMenuItem.displayName = `${prefix}.Print.MenuItem`;\n\n const RefreshMenuItem = ({\n childProps,\n disabled,\n }: IconButtonGroupOverflowItemProps) => {\n const { t } = useTranslation('ui');\n const { label, onRefresh } = childProps as Partial<TableRefreshProps>;\n return (\n <DropdownMenu.Item\n startIcon={<RefreshCw aria-hidden className=\"ds:size-4\" />}\n disabled={disabled}\n onSelect={() => onRefresh?.()}\n >\n {label ?? t('dataTable.refresh', 'Refresh')}\n </DropdownMenu.Item>\n );\n };\n RefreshMenuItem.displayName = `${prefix}.Refresh.MenuItem`;\n\n // An engine wrapper around Print or Refresh copies this static onto its\n // own component, so the group finds it there too.\n const PrintPart = Object.assign(Print, {\n overflowMenuItem: PrintMenuItem as IconButtonGroupOverflowItem,\n });\n const RefreshPart = Object.assign(Refresh, {\n overflowMenuItem: RefreshMenuItem as IconButtonGroupOverflowItem,\n });\n\n /* ---- QuickSearch ------------------------------------------------- */\n\n const QuickSearch = ({\n placeholder,\n debounceMs = 150,\n }: TableQuickSearchProps) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('QuickSearch');\n const sync = seam.features.syncsFilterInputs;\n const version = useSeamVersion(\n seam,\n sync ? ['quickFilter', 'filter', 'columns'] : [],\n );\n // Under privacy mode the box never paints a query the user did not\n // type here (a restored tab, a URL, an agent): it may be a name.\n const masked = sync && masksFreeText(seam);\n const [value, setValue] = useState(() =>\n sync && !masksFreeText(seam) ? seam.getQuickFilter() : '',\n );\n // The table's quick filter as this input last saw it, so an external\n // change (a tab, a chip, an agent, Clear all) can be told apart from\n // the input's own push.\n const seenRef = useRef(sync ? seam.getQuickFilter() : '');\n const maskedRef = useRef(masked);\n const timerRef = useRef<number | undefined>(undefined);\n // A push waits on the debounce: the box is the user's own text until\n // it lands, so it never flips to \"Search applied\" in between.\n const [pending, setPending] = useState(false);\n const describedById = useId();\n // \"Clear search\" unmounts once pressed, so focus goes back to the box.\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!sync) return;\n const external = seam.getQuickFilter();\n if (maskedRef.current !== masked) {\n // Privacy switched: hide what the box shows, or show the table's\n // query again. The table's filter itself is untouched.\n maskedRef.current = masked;\n seenRef.current = external;\n setValue(masked ? '' : external);\n return;\n }\n if (external !== seenRef.current) {\n // The table moved on: a pending edit typed against the old value\n // would overwrite it, so drop it.\n if (timerRef.current) {\n window.clearTimeout(timerRef.current);\n timerRef.current = undefined;\n setPending(false);\n }\n seenRef.current = external;\n setValue(masked && external !== '' ? '' : external);\n }\n }, [sync, seam, version, masked]);\n\n useEffect(\n () => () => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n },\n [],\n );\n\n // Only the user's own edits are pushed, and only while the table still\n // holds what the input last saw: an external write that lands while a\n // push waits (Clear all, then a tab restoring a query) wins.\n const push = (next: string) => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n setPending(true);\n timerRef.current = window.setTimeout(() => {\n timerRef.current = undefined;\n setPending(false);\n if (sync) {\n if (seam.getQuickFilter() !== seenRef.current) return;\n if (next === seenRef.current) return;\n seenRef.current = next;\n }\n seam.setQuickFilter(next);\n }, debounceMs);\n };\n\n const edit = (next: string) => {\n setValue(next);\n push(next);\n };\n\n // Privacy mode with a query the box does not show (restored by a tab,\n // set by an agent, or typed before privacy turned on): the search is\n // applied, so say so calmly and offer a way to clear it, without the\n // text. Typing replaces it as usual.\n const hiddenQuery =\n masked && !pending && value === '' && seam.getQuickFilter() !== '';\n\n return (\n // Slot wrapper caps the search at a legible width on desktop: without\n // it, TextInput's `w-full` lets the QuickSearch absorb the entire\n // FilterBar row and push trailing Actions onto a second line at\n // 1024 / 1280 / 1440. `min-w-0` lets the slot shrink below `24rem`\n // when the toolbar is squeezed on narrow viewports.\n <div className={quickSearchSlotVariants({ hiddenQuery })}>\n <TextInput\n ref={inputRef}\n type=\"search\"\n size=\"sm\"\n // Controlled only when the input follows the table, so it can show\n // an external clear. TextInput writes a controlled value to the DOM\n // property only (useDomValue), never the `value` attribute, so a\n // typed or restored name stays out of the markup.\n {...(sync ? { value } : {})}\n onChange={(e) => edit(e.target.value)}\n placeholder={\n hiddenQuery\n ? t('dataTable.quickSearch.appliedHidden', 'Search applied')\n : (placeholder ??\n t('dataTable.quickSearch.placeholder', 'Search…'))\n }\n startAdornment={<Search aria-hidden className=\"ds:size-4\" />}\n clearable\n onClear={() => edit('')}\n aria-label={t('dataTable.quickSearch.label', 'Quick search')}\n aria-describedby={hiddenQuery ? describedById : undefined}\n />\n {hiddenQuery ? (\n <>\n <span id={describedById} className=\"ds:sr-only\">\n {t(\n 'dataTable.quickSearch.appliedHiddenDescription',\n 'A search is applied. Its text is hidden in privacy mode.',\n )}\n </span>\n <IconButton\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n icon={<X aria-hidden />}\n tooltip={t('dataTable.quickSearch.clearApplied', 'Clear search')}\n onClick={() => {\n edit('');\n inputRef.current?.focus();\n }}\n />\n </>\n ) : null}\n </div>\n );\n };\n QuickSearch.displayName = `${prefix}.QuickSearch`;\n\n /* ---- FilterChips ------------------------------------------------- */\n\n interface Chip {\n key: string;\n label: string;\n }\n\n const FilterChips = () => {\n // Named: a host whose i18next defaultNS is `app` would otherwise read\n // every chip label from its own namespace, not the kit's.\n const { t, i18n } = useTranslation('ui');\n const seam = useSeam('FilterChips');\n useSeamVersion(seam, ['filter', 'quickFilter', 'columns']);\n // Re-read straight after this part's own writes, before the table's\n // change event arrives.\n const [, bump] = useReducer((n: number) => n + 1, 0);\n\n // Read on every render, never memoised on events alone: a chip must\n // drop a value the moment privacy mode masks its column, even when the\n // host re-renders without a change event.\n const model = seam.getFilterModel() ?? {};\n const columnList = seam.getColumns();\n const columns = new Map<string, TableToolbarColumn>(\n columnList.map((c) => [c.id, c]),\n );\n const formatsValues = seam.features.formatsFilterValues === true;\n // DataGrid joins the two through a translated pattern (\"Colonne :\n // valeur\" in French); DataTable keeps kit 1.112's \": \".\n const chipText = (column: string, value: string): string =>\n formatsValues\n ? t('dataTable.filterChips.chip', { column, value })\n : `${column}: ${value}`;\n const chips: Chip[] = [];\n for (const key of Object.keys(model)) {\n const column = columns.get(key);\n if (!column) {\n // A host key (DataGrid server filters): its label only, never the\n // value, which is opaque and may be personal data.\n const hostLabel = seam.getFilterLabel?.(key);\n chips.push({ key, label: hostLabel ?? key });\n continue;\n }\n // A masked column's chip names the column only.\n const text = column.masked\n ? ''\n : describeFilterModel(\n model[key],\n t,\n chipFormatFor(column, formatsValues, i18n.language),\n );\n const name = column.label || key;\n chips.push({ key, label: text ? chipText(name, text) : name });\n }\n const quickFilter = seam.getQuickFilter();\n const quickLabel = t('dataTable.quickSearch.label', 'Quick search');\n // Under privacy mode the query may be a name: the chip says only that\n // a quick search is active, so no attribute or announcement carries it.\n const quickChip = columnList.some((c) => c.masked === true)\n ? quickLabel\n : chipText(quickLabel, quickFilter);\n\n const total = chips.length + (quickFilter ? 1 : 0);\n if (total === 0) return null;\n\n return (\n <div\n role=\"group\"\n aria-label={t('dataTable.filterChips.label', 'Active filters')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {quickFilter && (\n <Tag\n label={quickChip}\n size=\"sm\"\n variant=\"brand\"\n fill=\"solid\"\n onRemove={() => {\n seam.setQuickFilter('');\n bump();\n }}\n />\n )}\n {chips.map((c) => (\n <Tag\n key={c.key}\n label={c.label}\n size=\"sm\"\n // An active filter is a state the user must notice: it silently\n // changes what the table means. Outline read as decoration.\n variant=\"brand\"\n fill=\"solid\"\n // Clear the MODEL, never destroy the filter instance, so a\n // floating filter stops showing the value it no longer applies.\n onRemove={() => {\n seam.setColumnFilter(c.key, null);\n bump();\n }}\n />\n ))}\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => {\n seam.clearAllFilters();\n bump();\n }}\n startIcon={<X aria-hidden className=\"ds:size-4\" />}\n >\n {t('dataTable.filterChips.clearAll', 'Clear all')}\n </Button>\n </div>\n );\n };\n FilterChips.displayName = `${prefix}.FilterChips`;\n\n /* ---- FacetFilter ------------------------------------------------- */\n\n const FacetFilter = ({ field, options, label }: TableFacetFilterProps) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('FacetFilter');\n const reads = seam.features.syncsFilterInputs && !!seam.getFacet;\n const version = useSeamVersion(seam, reads ? ['filter'] : []);\n // Local pill: the only state when the seam cannot read facets back;\n // otherwise an optimistic value until the table reports the change.\n const [local, setLocal] = useState<{\n value: TableFacetValue | null;\n } | null>(null);\n useEffect(() => {\n if (reads) setLocal(null);\n }, [reads, version]);\n const active = local\n ? local.value\n : reads\n ? (seam.getFacet?.(field) ?? null)\n : null;\n\n function apply(value: TableFacetValue | null) {\n setLocal({ value });\n seam.setFacet(field, value);\n }\n\n return (\n <div\n role=\"group\"\n aria-label={label ?? t('dataTable.facetFilter.label', 'Filter')}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {options.map((opt) => {\n const isActive = active === opt.value;\n return (\n <Button\n key={String(opt.value)}\n type=\"button\"\n size=\"sm\"\n intent={isActive ? 'primary' : 'secondary'}\n aria-pressed={isActive}\n onClick={() => apply(opt.value)}\n >\n {opt.label}\n </Button>\n );\n })}\n </div>\n );\n };\n FacetFilter.displayName = `${prefix}.FacetFilter`;\n\n /* ---- ExportMenu -------------------------------------------------- */\n\n const ExportMenuMarker = createContext(false);\n\n const ExportMenu = forwardRef<HTMLButtonElement, TableExportMenuProps>(\n ({ children, label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation('ui');\n useSeam('ExportMenu');\n return (\n <ExportMenuMarker.Provider value>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.export.menu', 'Export')}\n aria-label={label ?? t('dataTable.export.menu', 'Export')}\n aria-haspopup=\"menu\"\n {...rest}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" sideOffset={4}>\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </ExportMenuMarker.Provider>\n );\n },\n );\n ExportMenu.displayName = `${prefix}.ExportMenu`;\n\n function defaultExportLabel(\n t: (key: string, fallback: string) => string,\n format: TableExportFormat,\n ): string {\n if (format === 'csv') return t('dataTable.export.csv', 'Export CSV');\n if (format === 'xlsx') return t('dataTable.export.xlsx', 'Export Excel');\n if (format === 'pdf') return t('dataTable.export.pdf', 'Export PDF');\n return t('dataTable.export.custom', 'Export');\n }\n\n function exportIcon(format: TableExportFormat): ReactNode {\n if (format === 'xlsx')\n return <FileSpreadsheet aria-hidden className=\"ds:size-4\" />;\n if (format === 'pdf') return <FileText aria-hidden className=\"ds:size-4\" />;\n return <Download aria-hidden className=\"ds:size-4\" />;\n }\n\n /** @internal The item shell; engine wrappers decide what `onSelect` does. */\n const ExportMenuItemBase = ({\n format,\n label,\n onSelect,\n disabled,\n description,\n }: TableExportMenuItemBaseProps) => {\n const { t } = useTranslation('ui');\n if (!useContext(ExportMenuMarker)) {\n throw new Error(\n `${prefix}.ExportMenu.Item must be rendered inside ${prefix}.ExportMenu.`,\n );\n }\n return (\n <DropdownMenu.Item\n onSelect={onSelect}\n disabled={disabled}\n description={description}\n >\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {exportIcon(format)}\n <span>{label ?? defaultExportLabel(t, format)}</span>\n </span>\n </DropdownMenu.Item>\n );\n };\n ExportMenuItemBase.displayName = `${prefix}.ExportMenu.Item`;\n\n /* ---- ColumnToggle ------------------------------------------------ */\n\n const ColumnToggle = forwardRef<HTMLButtonElement, TableColumnToggleProps>(\n function ColumnToggle(\n { label, icon, footer, header, intent = 'outline', ...rest },\n ref,\n ) {\n const { t, i18n } = useTranslation('ui');\n const seam = useSeam('ColumnToggle');\n const keyboard = seam.features.keyboardReorder;\n const announces = seam.features.toolbarAnnouncesColumnMoves === true;\n const [open, setOpen] = useState(false);\n // Polite status for engines with no announcer of their own; empty\n // each time the popover opens.\n const [announcement, setAnnouncement] = useState('');\n const version = useSeamVersion(seam, open ? ['columns'] : []);\n const [columns, setColumns] = useState<TableToolbarColumn[]>([]);\n const [draggingColId, setDraggingColId] = useState<string | null>(null);\n const [dragOverColId, setDragOverColId] = useState<string | null>(null);\n const moveButtons = useRef(new Map<string, HTMLButtonElement>());\n const pendingFocus = useRef<{ id: string; dir: 'up' | 'down' } | null>(\n null,\n );\n\n // Refresh the column list whenever the popover opens (picks up\n // columns added, removed or renamed since the last open) and on every\n // column change while it is open.\n // Columns privacy mode removes from view are not listed (design 3.9).\n const readColumns = useCallback(\n () => seam.getColumns().filter((c) => c.hiddenByPrivacy !== true),\n [seam],\n );\n useEffect(() => {\n if (!open) return;\n setColumns(readColumns());\n }, [open, readColumns, version]);\n useEffect(() => {\n if (open) setAnnouncement('');\n }, [open]);\n\n // Keep focus on the moved column's button: React may move its row's\n // DOM node, which drops focus. At an end the other button takes it.\n useLayoutEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n const index = columns.findIndex((c) => c.id === pending.id);\n if (index < 0) return;\n const atEnd =\n pending.dir === 'up' ? index === 0 : index === columns.length - 1;\n const dir = atEnd\n ? pending.dir === 'up'\n ? 'down'\n : 'up'\n : pending.dir;\n moveButtons.current.get(`${pending.id}:${dir}`)?.focus();\n }, [columns]);\n\n const toggleColumn = useCallback(\n (colId: string, nextVisible: boolean) => {\n if (!seam.isReady()) return;\n seam.setColumnVisible(colId, nextVisible);\n // Re-read rather than assume: the engine may refuse the change,\n // and the box must never claim a column is shown when it is not.\n setColumns(readColumns());\n },\n [seam, readColumns],\n );\n\n // Move to the final index the target held, then re-read: the seam\n // applies the pin side of the column that sat there and refuses\n // moves a column may not make.\n const moveTo = useCallback(\n (colId: string, toIndex: number) => {\n if (!seam.isReady()) return;\n const before = seam.getColumns().find((c) => c.id === colId);\n seam.moveColumn(colId, toIndex);\n const after = readColumns();\n setColumns(after);\n if (!announces || !before) return;\n const index = after.findIndex((c) => c.id === colId);\n const moved = after[index];\n if (!moved) return;\n const column = moved.label || colId;\n if (moved.pinned !== before.pinned) {\n setAnnouncement(\n moved.pinned === 'start'\n ? t('dataGrid.announce.columnPinnedStart', { column })\n : moved.pinned === 'end'\n ? t('dataGrid.announce.columnPinnedEnd', { column })\n : t('dataGrid.announce.columnUnpinned', { column }),\n );\n return;\n }\n setAnnouncement(\n t('dataGrid.announce.columnMoved', {\n column,\n position: formatNumber(index + 1, i18n.language),\n total: formatNumber(after.length, i18n.language),\n }),\n );\n },\n [seam, readColumns, announces, t, i18n.language],\n );\n\n const moveColumn = useCallback(\n (fromColId: string, toColId: string) => {\n if (fromColId === toColId) return;\n const toIndex = seam.getColumns().findIndex((c) => c.id === toColId);\n if (toIndex < 0) return;\n moveTo(fromColId, toIndex);\n },\n [seam, moveTo],\n );\n\n const labelText = label ?? t('dataTable.columnToggle');\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={icon ?? <Columns3Cog aria-hidden />}\n tooltip={labelText}\n aria-label={labelText}\n aria-haspopup=\"dialog\"\n {...rest}\n />\n </Popover.Trigger>\n {/* Capped to the space Radix reports below the trigger, and the list\n scrolls inside it: 25+ columns otherwise run past the viewport\n with no way to reach the bottom ones. */}\n <Popover.Content\n size=\"sm\"\n align=\"end\"\n className=\"ds:flex ds:max-h-[var(--radix-popover-content-available-height)] ds:flex-col\"\n >\n <Popover.Heading>{labelText}</Popover.Heading>\n {header ? (\n <div className=\"ds:mb-[var(--spacing-xs)] ds:border-b ds:border-[color:var(--border)] ds:pb-[var(--spacing-sm)]\">\n {header}\n </div>\n ) : null}\n <ul\n className=\"ds:flex ds:min-h-0 ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-y-auto\"\n aria-label={labelText}\n >\n {columns.map((c, index) => {\n const isDragging = draggingColId === c.id;\n const isDragOver =\n dragOverColId === c.id && draggingColId !== c.id;\n return (\n <li\n key={c.id}\n draggable\n onDragStart={(e) => {\n setDraggingColId(c.id);\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', c.id);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setDragOverColId(c.id);\n }}\n onDragLeave={() => {\n setDragOverColId((prev) => (prev === c.id ? null : prev));\n }}\n onDrop={(e) => {\n e.preventDefault();\n const fromColId = e.dataTransfer.getData('text/plain');\n if (fromColId) moveColumn(fromColId, c.id);\n setDraggingColId(null);\n setDragOverColId(null);\n }}\n onDragEnd={() => {\n setDraggingColId(null);\n setDragOverColId(null);\n }}\n className={columnRowVariants({\n dragging: isDragging,\n dragOver: isDragOver,\n })}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:cursor-grab ds:text-[color:var(--muted-foreground)] ds:active:cursor-grabbing\"\n >\n <GripVertical className=\"ds:size-4\" />\n </span>\n <Checkbox\n label={c.label}\n checked={c.visible}\n disabled={c.canHide === false}\n onCheckedChange={(checked) =>\n toggleColumn(c.id, checked === true)\n }\n />\n {keyboard ? (\n <span className=\"ds:ms-auto ds:flex ds:items-center\">\n <IconButton\n ref={(node) => {\n if (node)\n moveButtons.current.set(`${c.id}:up`, node);\n else moveButtons.current.delete(`${c.id}:up`);\n }}\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n icon={<ArrowUp aria-hidden />}\n aria-label={t('dataGrid.toolbar.moveColumnUp', {\n column: c.label,\n })}\n disabled={!canStepColumn(columns, index, index - 1)}\n onClick={() => {\n pendingFocus.current = { id: c.id, dir: 'up' };\n const target = columns[index - 1];\n if (target) moveColumn(c.id, target.id);\n }}\n />\n <IconButton\n ref={(node) => {\n if (node)\n moveButtons.current.set(`${c.id}:down`, node);\n else moveButtons.current.delete(`${c.id}:down`);\n }}\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n icon={<ArrowDown aria-hidden />}\n aria-label={t('dataGrid.toolbar.moveColumnDown', {\n column: c.label,\n })}\n disabled={!canStepColumn(columns, index, index + 1)}\n onClick={() => {\n pendingFocus.current = { id: c.id, dir: 'down' };\n const target = columns[index + 1];\n if (target) moveColumn(c.id, target.id);\n }}\n />\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n {announces ? (\n <span role=\"status\" className=\"ds:sr-only\">\n {announcement}\n </span>\n ) : null}\n {keyboard && seam.resetColumns ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-sm)]\">\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<RotateCcw aria-hidden className=\"ds:size-4\" />}\n onClick={() => {\n seam.resetColumns?.();\n setColumns(readColumns());\n }}\n >\n {t('dataGrid.toolbar.resetColumns')}\n </Button>\n </div>\n ) : null}\n {footer ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </Popover.Content>\n </Popover.Root>\n );\n },\n );\n ColumnToggle.displayName = `${prefix}.ColumnToggle`;\n\n /* ---- BulkAction -------------------------------------------------- */\n\n const BulkAction = forwardRef<HTMLButtonElement, TableBulkActionProps>(\n (\n { label, icon, onAction, variant = 'default', size = 'sm', ...rest },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const seam = useSeam('BulkAction');\n useSeamVersion(seam, ['selection']);\n const selectionCount = seam.getSelectionCount();\n if (selectionCount === 0) return null;\n\n const resolvedIntent =\n variant === 'destructive' ? 'destructive' : 'secondary';\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n intent={resolvedIntent}\n size={size}\n startIcon={sizeIcon(icon)}\n onClick={() => onAction(actionContextOf(seam))}\n aria-label={`${label} (${t('dataTable.bulkAction', { count: selectionCount })})`}\n {...rest}\n >\n <span>{label}</span>\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:opacity-80\"\n >\n {t('dataTable.bulkAction', { count: selectionCount })}\n </span>\n </Button>\n );\n },\n );\n BulkAction.displayName = `${prefix}.BulkAction`;\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [Print, Refresh, ExportMenu, ColumnToggle]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n\n return {\n Root,\n FilterBar,\n Actions,\n Print: PrintPart,\n Refresh: RefreshPart,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ExportMenu,\n ExportMenuItemBase,\n ColumnToggle,\n BulkAction,\n useSeam,\n };\n}\n\n/** @internal One engine's parts. */\nexport type TableToolbarParts = ReturnType<typeof createTableToolbarParts>;\n"],"names":["__iconNode","Columns3Cog","createLucideIcon","TableToolbarContext","createContext","TableToolbarProvider","seam","children","value","useMemo","jsx","useTableToolbarSeam","missingMessage","fallback","ctx","useContext","useSeamVersion","kinds","version","setVersion","useState","key","useEffect","wanted","kind","v","formatShortDate","date","pattern","pad","n","width","token","signed","chipFormatFor","column","formatsValues","language","options","_a","o","formatNumber","day","fromIsoDate","getShortDateFormat","isTextOperator","op","textOperatorText","t","gridOperatorText","describeFilterModel","model","format","m","type","kitWording","operatorText","d","from","to","hasFrom","hasTo","dateFrom","dateTo","range","sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","masksFreeText","c","canStepColumn","columns","target","next","_","i","seen","previous","group","actionContextOf","toolbarRootVariants","cva","toolbarFilterBarVariants","quickSearchSlotVariants","toolbarActionsVariants","columnRowVariants","createTableToolbarParts","names","prefix","useEngineSeam","useSeam","part","Root","forwardRef","props","ref","FilterBar","Actions","withInjectedClick","Print","label","intent","useTranslation","onClick","rest","IconButton","Printer","event","Refresh","onRefresh","RefreshCw","PrintMenuItem","childProps","disabled","DropdownMenu","RefreshMenuItem","PrintPart","RefreshPart","QuickSearch","placeholder","debounceMs","sync","masked","setValue","seenRef","useRef","maskedRef","timerRef","pending","setPending","describedById","useId","inputRef","external","push","edit","hiddenQuery","TextInput","e","Search","jsxs","Fragment","X","FilterChips","i18n","bump","useReducer","columnList","chipText","chips","hostLabel","text","name","quickFilter","quickLabel","quickChip","Tag","Button","FacetFilter","field","reads","local","setLocal","active","apply","opt","isActive","ExportMenuMarker","ExportMenu","Download","defaultExportLabel","exportIcon","FileSpreadsheet","FileText","ExportMenuItemBase","onSelect","description","ColumnToggle","icon","footer","header","keyboard","announces","open","setOpen","announcement","setAnnouncement","setColumns","draggingColId","setDraggingColId","dragOverColId","setDragOverColId","moveButtons","pendingFocus","readColumns","useCallback","useLayoutEffect","index","dir","toggleColumn","colId","nextVisible","moveTo","toIndex","before","after","moved","moveColumn","fromColId","toColId","labelText","Popover","isDragging","isDragOver","prev","GripVertical","Checkbox","checked","ArrowUp","ArrowDown","RotateCcw","BulkAction","onAction","variant","size","selectionCount","leaf"],"mappings":"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","x_google_ignoreList":[0]}
|