@economic/taco 14.1.0-EC-86083-poc-array-return.0 → 14.1.0-EC-86083-poc-array-return.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Table3/components/Row/Row.cjs +5 -3
- package/dist/components/Table3/components/Row/Row.cjs.map +1 -1
- package/dist/components/Table3/components/Row/Row.js +5 -3
- package/dist/components/Table3/components/Row/Row.js.map +1 -1
- package/dist/components/Table3/useTable3.cjs.map +1 -1
- package/dist/components/Table3/useTable3.js.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.cjs +4 -4
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Internal/Actions.cjs +12 -5
- package/dist/primitives/Table/Core/components/Columns/Internal/Actions.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Internal/Actions.js +11 -4
- package/dist/primitives/Table/Core/components/Columns/Internal/Actions.js.map +1 -1
- package/dist/primitives/Table/types.cjs.map +1 -1
- package/dist/primitives/Table/types.d.ts +8 -1
- package/dist/primitives/Table/types.js.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActions.cjs +1 -5
- package/dist/primitives/Table/useTableManager/features/useTableRowActions.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActions.d.ts +0 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActions.js +1 -5
- package/dist/primitives/Table/useTableManager/features/useTableRowActions.js.map +1 -1
- package/dist/primitives/Table/useTableManager/util/presets.cjs +2 -2
- package/dist/primitives/Table/useTableManager/util/presets.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/util/presets.js +1 -1
- package/dist/primitives/Table/useTableManager/util/presets.js.map +1 -1
- package/dist/primitives/Table/useTableManager/util/rowActions.cjs +7 -0
- package/dist/primitives/Table/useTableManager/util/rowActions.cjs.map +1 -0
- package/dist/primitives/Table/useTableManager/util/rowActions.d.ts +1 -0
- package/dist/primitives/Table/useTableManager/util/rowActions.js +7 -0
- package/dist/primitives/Table/useTableManager/util/rowActions.js.map +1 -0
- package/dist/primitives/Table/useTableManager/util/setup.cjs +2 -2
- package/dist/primitives/Table/useTableManager/util/setup.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/util/setup.js +1 -1
- package/dist/primitives/Table/useTableManager/util/setup.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,6 +4,7 @@ const React = require("react");
|
|
|
4
4
|
const useLazyEffect = require("../../../../hooks/useLazyEffect.cjs");
|
|
5
5
|
const util = require("../../../../primitives/Table/Core/components/Body/util.cjs");
|
|
6
6
|
const DisplayRow = require("../../../../primitives/Table/Core/components/Row/BuiltIns/DisplayRow.cjs");
|
|
7
|
+
const columns = require("../../../../primitives/Table/useTableManager/util/columns.cjs");
|
|
7
8
|
const dom = require("../../../../utils/dom.cjs");
|
|
8
9
|
const editing = require("../../util/editing.cjs");
|
|
9
10
|
const DiscardChangesConfirmationDialog = require("../Editing/DiscardChangesConfirmationDialog.cjs");
|
|
@@ -30,9 +31,10 @@ function Row(props) {
|
|
|
30
31
|
const handleFocus = React.useCallback(
|
|
31
32
|
(event) => {
|
|
32
33
|
if (tableMeta.editing.isEditing) {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const cellElement = event.target.closest("td");
|
|
35
|
+
const cellIndex = Number(cellElement?.getAttribute("data-cell-index") ?? void 0);
|
|
36
|
+
if (!Number.isNaN(cellIndex) && !columns.isInternalColumn(cellElement?.getAttribute("data-cell-id") ?? "")) {
|
|
37
|
+
tableMeta.editing.setLastFocusedCellIndex(cellIndex);
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Row.cjs","sources":["../../../../../src/components/Table3/components/Row/Row.tsx"],"sourcesContent":["import type { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useAugmentedFocusManager } from '@/primitives/Table/Core/components/Body/util';\nimport type { DisplayRowProps } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { DisplayRow } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { isElementInsideOverlay, setDataFocusAttribute } from '@/utils/dom';\n\nimport { isTemporaryRow } from '../../util/editing';\nimport { DiscardChangesConfirmationDialog } from '../Editing/DiscardChangesConfirmationDialog';\n\nimport { SaveStatus } from './Editing/SaveStatus';\n\nexport function Row<TType = unknown>(props: DisplayRowProps<TType>) {\n const { row, index, table } = props;\n const focusManager = useAugmentedFocusManager();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === index;\n\n // Track validation errors to trigger re-measurement when they change\n const hasErrors = tableMeta.editing.hasRowErrors(row.id);\n\n React.useEffect(() => {\n if (tableMeta.editing.isEditing && isActiveRow && tableMeta.editing.lastFocusedCellIndex === undefined) {\n const element = focusManager.focusFirst();\n if (element) {\n setDataFocusAttribute(element);\n }\n }\n }, [tableMeta.editing.isEditing, tableMeta.rowActive.rowActiveIndex, tableMeta.editing.lastFocusedCellIndex]);\n\n useLazyEffect(() => {\n // this saves any pending changes when a row's active state changes from active to inactive.\n if (tableMeta.editing.isEditing && !isActiveRow) {\n tableMeta.editing.saveChanges(table, row.id);\n }\n }, [isActiveRow]);\n\n const handleFocus = React.useCallback(\n (event: React.FocusEvent<HTMLTableRowElement>) => {\n if (tableMeta.editing.isEditing) {\n const
|
|
1
|
+
{"version":3,"file":"Row.cjs","sources":["../../../../../src/components/Table3/components/Row/Row.tsx"],"sourcesContent":["import type { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useAugmentedFocusManager } from '@/primitives/Table/Core/components/Body/util';\nimport type { DisplayRowProps } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { DisplayRow } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { isInternalColumn } from '@/primitives/Table/useTableManager/util/columns';\nimport { isElementInsideOverlay, setDataFocusAttribute } from '@/utils/dom';\n\nimport { isTemporaryRow } from '../../util/editing';\nimport { DiscardChangesConfirmationDialog } from '../Editing/DiscardChangesConfirmationDialog';\n\nimport { SaveStatus } from './Editing/SaveStatus';\n\nexport function Row<TType = unknown>(props: DisplayRowProps<TType>) {\n const { row, index, table } = props;\n const focusManager = useAugmentedFocusManager();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === index;\n\n // Track validation errors to trigger re-measurement when they change\n const hasErrors = tableMeta.editing.hasRowErrors(row.id);\n\n React.useEffect(() => {\n if (tableMeta.editing.isEditing && isActiveRow && tableMeta.editing.lastFocusedCellIndex === undefined) {\n const element = focusManager.focusFirst();\n if (element) {\n setDataFocusAttribute(element);\n }\n }\n }, [tableMeta.editing.isEditing, tableMeta.rowActive.rowActiveIndex, tableMeta.editing.lastFocusedCellIndex]);\n\n useLazyEffect(() => {\n // this saves any pending changes when a row's active state changes from active to inactive.\n if (tableMeta.editing.isEditing && !isActiveRow) {\n tableMeta.editing.saveChanges(table, row.id);\n }\n }, [isActiveRow]);\n\n const handleFocus = React.useCallback(\n (event: React.FocusEvent<HTMLTableRowElement>) => {\n if (tableMeta.editing.isEditing) {\n const cellElement = event.target.closest('td');\n const cellIndex = Number(cellElement?.getAttribute('data-cell-index') ?? undefined);\n\n // ignore internal cells (e.g. row actions): the last focused data cell must survive clicking\n // a row action, so actions can target the user's position in the row (helpers.editing.lastFocusedCellId)\n if (!Number.isNaN(cellIndex) && !isInternalColumn(cellElement?.getAttribute('data-cell-id') ?? '')) {\n tableMeta.editing.setLastFocusedCellIndex(cellIndex);\n }\n }\n },\n [tableMeta.editing.isEditing, isActiveRow]\n );\n\n const rowStatus = tableMeta.editing.getRowStatus(row.id);\n\n // discard new row\n const [showDiscardDialog, setShowDiscardDialog] = React.useState(false);\n\n function handleDiscard() {\n tableMeta.editing.discardChanges(row.id, table);\n requestAnimationFrame(() => {\n if (isTemporaryRow(row.id)) {\n tableMeta.editing.createRowButtonRef.current?.focus();\n } else {\n focusManager.focusFirst();\n }\n });\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLTableRowElement>) {\n if (props.onKeyDown) {\n props.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented() || event.isPropagationStopped()) {\n return;\n }\n\n if (\n event.key === 'Escape' &&\n tableMeta.editing.hasChanges(row.id) &&\n !isElementInsideOverlay(event.target as HTMLElement)\n ) {\n event.preventDefault();\n event.stopPropagation();\n setShowDiscardDialog(true);\n }\n }\n\n const attributes = {\n 'data-row-editing-invalid': tableMeta.editing.hasRowErrors(row.id)\n ? tableMeta.editing.hasRowErrorsShownInAlert(row.id)\n ? true\n : 'unseen'\n : undefined,\n 'data-row-editing-status': rowStatus,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n\n return (\n <>\n <DisplayRow<TType> {...props} {...attributes} remeasureDependencies={[hasErrors]}>\n {rowStatus === 'saving' || rowStatus === 'saved' ? <SaveStatus rowId={row.id} table={table} /> : null}\n </DisplayRow>\n <DiscardChangesConfirmationDialog\n open={showDiscardDialog}\n onChange={setShowDiscardDialog}\n onDiscard={handleDiscard}\n />\n </>\n );\n}\n"],"names":["useAugmentedFocusManager","setDataFocusAttribute","useLazyEffect","isInternalColumn","isTemporaryRow","isElementInsideOverlay","DisplayRow","SaveStatus","DiscardChangesConfirmationDialog"],"mappings":";;;;;;;;;;;AAeO,SAAS,IAAqB,OAA+B;AAChE,QAAM,EAAE,KAAK,OAAO,MAAA,IAAU;AAC9B,QAAM,eAAeA,KAAAA,yBAAA;AACrB,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAG3D,QAAM,YAAY,UAAU,QAAQ,aAAa,IAAI,EAAE;AAEvD,QAAM,UAAU,MAAM;AAClB,QAAI,UAAU,QAAQ,aAAa,eAAe,UAAU,QAAQ,yBAAyB,QAAW;AACpG,YAAM,UAAU,aAAa,WAAA;AAC7B,UAAI,SAAS;AACTC,YAAAA,sBAAsB,OAAO;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,UAAU,QAAQ,WAAW,UAAU,UAAU,gBAAgB,UAAU,QAAQ,oBAAoB,CAAC;AAE5GC,gBAAAA,cAAc,MAAM;AAEhB,QAAI,UAAU,QAAQ,aAAa,CAAC,aAAa;AAC7C,gBAAU,QAAQ,YAAY,OAAO,IAAI,EAAE;AAAA,IAC/C;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAc,MAAM;AAAA,IACtB,CAAC,UAAiD;AAC9C,UAAI,UAAU,QAAQ,WAAW;AAC7B,cAAM,cAAc,MAAM,OAAO,QAAQ,IAAI;AAC7C,cAAM,YAAY,OAAO,aAAa,aAAa,iBAAiB,KAAK,MAAS;AAIlF,YAAI,CAAC,OAAO,MAAM,SAAS,KAAK,CAACC,yBAAiB,aAAa,aAAa,cAAc,KAAK,EAAE,GAAG;AAChG,oBAAU,QAAQ,wBAAwB,SAAS;AAAA,QACvD;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,UAAU,QAAQ,WAAW,WAAW;AAAA,EAAA;AAG7C,QAAM,YAAY,UAAU,QAAQ,aAAa,IAAI,EAAE;AAGvD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,KAAK;AAEtE,WAAS,gBAAgB;AACrB,cAAU,QAAQ,eAAe,IAAI,IAAI,KAAK;AAC9C,0BAAsB,MAAM;AACxB,UAAIC,QAAAA,eAAe,IAAI,EAAE,GAAG;AACxB,kBAAU,QAAQ,mBAAmB,SAAS,MAAA;AAAA,MAClD,OAAO;AACH,qBAAa,WAAA;AAAA,MACjB;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,WAAS,cAAc,OAAiD;AACpE,QAAI,MAAM,WAAW;AACjB,YAAM,UAAU,KAAK;AAAA,IACzB;AAEA,QAAI,MAAM,mBAAA,KAAwB,MAAM,wBAAwB;AAC5D;AAAA,IACJ;AAEA,QACI,MAAM,QAAQ,YACd,UAAU,QAAQ,WAAW,IAAI,EAAE,KACnC,CAACC,IAAAA,uBAAuB,MAAM,MAAqB,GACrD;AACE,YAAM,eAAA;AACN,YAAM,gBAAA;AACN,2BAAqB,IAAI;AAAA,IAC7B;AAAA,EACJ;AAEA,QAAM,aAAa;AAAA,IACf,4BAA4B,UAAU,QAAQ,aAAa,IAAI,EAAE,IAC3D,UAAU,QAAQ,yBAAyB,IAAI,EAAE,IAC7C,OACA,WACJ;AAAA,IACN,2BAA2B;AAAA,IAC3B,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAGf,SACI,sBAAA,cAAA,MAAA,UAAA,0CACKC,WAAAA,YAAA,EAAmB,GAAG,OAAQ,GAAG,YAAY,uBAAuB,CAAC,SAAS,EAAA,GAC1E,cAAc,YAAY,cAAc,UAAU,sBAAA,cAACC,WAAAA,YAAA,EAAW,OAAO,IAAI,IAAI,MAAA,CAAc,IAAK,IACrG,GACA,sBAAA;AAAA,IAACC,iCAAAA;AAAAA,IAAA;AAAA,MACG,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EAAA,CAEnB;AAER;;"}
|
|
@@ -2,6 +2,7 @@ import React__default from "react";
|
|
|
2
2
|
import { useLazyEffect } from "../../../../hooks/useLazyEffect.js";
|
|
3
3
|
import { useAugmentedFocusManager } from "../../../../primitives/Table/Core/components/Body/util.js";
|
|
4
4
|
import { DisplayRow } from "../../../../primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js";
|
|
5
|
+
import { isInternalColumn } from "../../../../primitives/Table/useTableManager/util/columns.js";
|
|
5
6
|
import { setDataFocusAttribute, isElementInsideOverlay } from "../../../../utils/dom.js";
|
|
6
7
|
import { isTemporaryRow } from "../../util/editing.js";
|
|
7
8
|
import { DiscardChangesConfirmationDialog } from "../Editing/DiscardChangesConfirmationDialog.js";
|
|
@@ -28,9 +29,10 @@ function Row(props) {
|
|
|
28
29
|
const handleFocus = React__default.useCallback(
|
|
29
30
|
(event) => {
|
|
30
31
|
if (tableMeta.editing.isEditing) {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const cellElement = event.target.closest("td");
|
|
33
|
+
const cellIndex = Number(cellElement?.getAttribute("data-cell-index") ?? void 0);
|
|
34
|
+
if (!Number.isNaN(cellIndex) && !isInternalColumn(cellElement?.getAttribute("data-cell-id") ?? "")) {
|
|
35
|
+
tableMeta.editing.setLastFocusedCellIndex(cellIndex);
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Row.js","sources":["../../../../../src/components/Table3/components/Row/Row.tsx"],"sourcesContent":["import type { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useAugmentedFocusManager } from '@/primitives/Table/Core/components/Body/util';\nimport type { DisplayRowProps } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { DisplayRow } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { isElementInsideOverlay, setDataFocusAttribute } from '@/utils/dom';\n\nimport { isTemporaryRow } from '../../util/editing';\nimport { DiscardChangesConfirmationDialog } from '../Editing/DiscardChangesConfirmationDialog';\n\nimport { SaveStatus } from './Editing/SaveStatus';\n\nexport function Row<TType = unknown>(props: DisplayRowProps<TType>) {\n const { row, index, table } = props;\n const focusManager = useAugmentedFocusManager();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === index;\n\n // Track validation errors to trigger re-measurement when they change\n const hasErrors = tableMeta.editing.hasRowErrors(row.id);\n\n React.useEffect(() => {\n if (tableMeta.editing.isEditing && isActiveRow && tableMeta.editing.lastFocusedCellIndex === undefined) {\n const element = focusManager.focusFirst();\n if (element) {\n setDataFocusAttribute(element);\n }\n }\n }, [tableMeta.editing.isEditing, tableMeta.rowActive.rowActiveIndex, tableMeta.editing.lastFocusedCellIndex]);\n\n useLazyEffect(() => {\n // this saves any pending changes when a row's active state changes from active to inactive.\n if (tableMeta.editing.isEditing && !isActiveRow) {\n tableMeta.editing.saveChanges(table, row.id);\n }\n }, [isActiveRow]);\n\n const handleFocus = React.useCallback(\n (event: React.FocusEvent<HTMLTableRowElement>) => {\n if (tableMeta.editing.isEditing) {\n const
|
|
1
|
+
{"version":3,"file":"Row.js","sources":["../../../../../src/components/Table3/components/Row/Row.tsx"],"sourcesContent":["import type { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useAugmentedFocusManager } from '@/primitives/Table/Core/components/Body/util';\nimport type { DisplayRowProps } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { DisplayRow } from '@/primitives/Table/Core/components/Row/BuiltIns/DisplayRow';\nimport { isInternalColumn } from '@/primitives/Table/useTableManager/util/columns';\nimport { isElementInsideOverlay, setDataFocusAttribute } from '@/utils/dom';\n\nimport { isTemporaryRow } from '../../util/editing';\nimport { DiscardChangesConfirmationDialog } from '../Editing/DiscardChangesConfirmationDialog';\n\nimport { SaveStatus } from './Editing/SaveStatus';\n\nexport function Row<TType = unknown>(props: DisplayRowProps<TType>) {\n const { row, index, table } = props;\n const focusManager = useAugmentedFocusManager();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === index;\n\n // Track validation errors to trigger re-measurement when they change\n const hasErrors = tableMeta.editing.hasRowErrors(row.id);\n\n React.useEffect(() => {\n if (tableMeta.editing.isEditing && isActiveRow && tableMeta.editing.lastFocusedCellIndex === undefined) {\n const element = focusManager.focusFirst();\n if (element) {\n setDataFocusAttribute(element);\n }\n }\n }, [tableMeta.editing.isEditing, tableMeta.rowActive.rowActiveIndex, tableMeta.editing.lastFocusedCellIndex]);\n\n useLazyEffect(() => {\n // this saves any pending changes when a row's active state changes from active to inactive.\n if (tableMeta.editing.isEditing && !isActiveRow) {\n tableMeta.editing.saveChanges(table, row.id);\n }\n }, [isActiveRow]);\n\n const handleFocus = React.useCallback(\n (event: React.FocusEvent<HTMLTableRowElement>) => {\n if (tableMeta.editing.isEditing) {\n const cellElement = event.target.closest('td');\n const cellIndex = Number(cellElement?.getAttribute('data-cell-index') ?? undefined);\n\n // ignore internal cells (e.g. row actions): the last focused data cell must survive clicking\n // a row action, so actions can target the user's position in the row (helpers.editing.lastFocusedCellId)\n if (!Number.isNaN(cellIndex) && !isInternalColumn(cellElement?.getAttribute('data-cell-id') ?? '')) {\n tableMeta.editing.setLastFocusedCellIndex(cellIndex);\n }\n }\n },\n [tableMeta.editing.isEditing, isActiveRow]\n );\n\n const rowStatus = tableMeta.editing.getRowStatus(row.id);\n\n // discard new row\n const [showDiscardDialog, setShowDiscardDialog] = React.useState(false);\n\n function handleDiscard() {\n tableMeta.editing.discardChanges(row.id, table);\n requestAnimationFrame(() => {\n if (isTemporaryRow(row.id)) {\n tableMeta.editing.createRowButtonRef.current?.focus();\n } else {\n focusManager.focusFirst();\n }\n });\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLTableRowElement>) {\n if (props.onKeyDown) {\n props.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented() || event.isPropagationStopped()) {\n return;\n }\n\n if (\n event.key === 'Escape' &&\n tableMeta.editing.hasChanges(row.id) &&\n !isElementInsideOverlay(event.target as HTMLElement)\n ) {\n event.preventDefault();\n event.stopPropagation();\n setShowDiscardDialog(true);\n }\n }\n\n const attributes = {\n 'data-row-editing-invalid': tableMeta.editing.hasRowErrors(row.id)\n ? tableMeta.editing.hasRowErrorsShownInAlert(row.id)\n ? true\n : 'unseen'\n : undefined,\n 'data-row-editing-status': rowStatus,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n\n return (\n <>\n <DisplayRow<TType> {...props} {...attributes} remeasureDependencies={[hasErrors]}>\n {rowStatus === 'saving' || rowStatus === 'saved' ? <SaveStatus rowId={row.id} table={table} /> : null}\n </DisplayRow>\n <DiscardChangesConfirmationDialog\n open={showDiscardDialog}\n onChange={setShowDiscardDialog}\n onDiscard={handleDiscard}\n />\n </>\n );\n}\n"],"names":["React"],"mappings":";;;;;;;;;AAeO,SAAS,IAAqB,OAA+B;AAChE,QAAM,EAAE,KAAK,OAAO,MAAA,IAAU;AAC9B,QAAM,eAAe,yBAAA;AACrB,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAG3D,QAAM,YAAY,UAAU,QAAQ,aAAa,IAAI,EAAE;AAEvDA,iBAAM,UAAU,MAAM;AAClB,QAAI,UAAU,QAAQ,aAAa,eAAe,UAAU,QAAQ,yBAAyB,QAAW;AACpG,YAAM,UAAU,aAAa,WAAA;AAC7B,UAAI,SAAS;AACT,8BAAsB,OAAO;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,UAAU,QAAQ,WAAW,UAAU,UAAU,gBAAgB,UAAU,QAAQ,oBAAoB,CAAC;AAE5G,gBAAc,MAAM;AAEhB,QAAI,UAAU,QAAQ,aAAa,CAAC,aAAa;AAC7C,gBAAU,QAAQ,YAAY,OAAO,IAAI,EAAE;AAAA,IAC/C;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcA,eAAM;AAAA,IACtB,CAAC,UAAiD;AAC9C,UAAI,UAAU,QAAQ,WAAW;AAC7B,cAAM,cAAc,MAAM,OAAO,QAAQ,IAAI;AAC7C,cAAM,YAAY,OAAO,aAAa,aAAa,iBAAiB,KAAK,MAAS;AAIlF,YAAI,CAAC,OAAO,MAAM,SAAS,KAAK,CAAC,iBAAiB,aAAa,aAAa,cAAc,KAAK,EAAE,GAAG;AAChG,oBAAU,QAAQ,wBAAwB,SAAS;AAAA,QACvD;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,UAAU,QAAQ,WAAW,WAAW;AAAA,EAAA;AAG7C,QAAM,YAAY,UAAU,QAAQ,aAAa,IAAI,EAAE;AAGvD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,eAAM,SAAS,KAAK;AAEtE,WAAS,gBAAgB;AACrB,cAAU,QAAQ,eAAe,IAAI,IAAI,KAAK;AAC9C,0BAAsB,MAAM;AACxB,UAAI,eAAe,IAAI,EAAE,GAAG;AACxB,kBAAU,QAAQ,mBAAmB,SAAS,MAAA;AAAA,MAClD,OAAO;AACH,qBAAa,WAAA;AAAA,MACjB;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,WAAS,cAAc,OAAiD;AACpE,QAAI,MAAM,WAAW;AACjB,YAAM,UAAU,KAAK;AAAA,IACzB;AAEA,QAAI,MAAM,mBAAA,KAAwB,MAAM,wBAAwB;AAC5D;AAAA,IACJ;AAEA,QACI,MAAM,QAAQ,YACd,UAAU,QAAQ,WAAW,IAAI,EAAE,KACnC,CAAC,uBAAuB,MAAM,MAAqB,GACrD;AACE,YAAM,eAAA;AACN,YAAM,gBAAA;AACN,2BAAqB,IAAI;AAAA,IAC7B;AAAA,EACJ;AAEA,QAAM,aAAa;AAAA,IACf,4BAA4B,UAAU,QAAQ,aAAa,IAAI,EAAE,IAC3D,UAAU,QAAQ,yBAAyB,IAAI,EAAE,IAC7C,OACA,WACJ;AAAA,IACN,2BAA2B;AAAA,IAC3B,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAGf,SACIA,+BAAA,cAAAA,eAAA,UAAA,mDACK,YAAA,EAAmB,GAAG,OAAQ,GAAG,YAAY,uBAAuB,CAAC,SAAS,EAAA,GAC1E,cAAc,YAAY,cAAc,UAAUA,+BAAA,cAAC,YAAA,EAAW,OAAO,IAAI,IAAI,MAAA,CAAc,IAAK,IACrG,GACAA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EAAA,CAEnB;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTable3.cjs","sources":["../../../src/components/Table3/useTable3.tsx"],"sourcesContent":["import type { RowData, Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { LegacyIconButton, useLocalization } from '@/components';\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useTable } from '@/primitives/Table/Core/useTable';\nimport type { TableProps, TableRowActionConfigRenderer, TableRowActionRenderer } from '@/primitives/Table/types';\n\nimport { Cell } from './components/Columns/Cell/Cell';\nimport { DiscardChangesConfirmationDialog } from './components/Editing/DiscardChangesConfirmationDialog';\nimport { Row } from './components/Row/Row';\nimport { useTableEditing } from './features/useTableEditing';\nimport { useTableEditingListener } from './listeners/useTableEditingListener';\nimport type { Table3Props, Table3Ref } from './types';\n\nexport const RENDERERS = {\n row: Row,\n cell: Cell,\n};\n\ndeclare module '@tanstack/table-core' {\n // oxlint-disable-next-line no-unused-vars, typescript/consistent-type-definitions -- module augmentation requires interface (declaration merging)\n interface TableMeta<TData extends RowData> {\n editing: ReturnType<typeof useTableEditing>;\n }\n}\n\ntype Table3Meta = {\n editing: ReturnType<typeof useTableEditing>;\n};\n\n// helpers includes internal rowId and table properties that are intentionally kept off the public type\ntype Table3RowActionHelpers<TType> = Parameters<TableRowActionRenderer<TType>>[1] & {\n rowId: string;\n table: ReactTable<TType>;\n};\n\nexport function useTable3<TType>(props: Table3Props<TType>, ref: React.Ref<Table3Ref>) {\n const { texts } = useLocalization();\n const editing = useTableEditing(\n props.enableEditing,\n props.defaultToggleEditing,\n props.onEditingSave,\n props.onEditingChange,\n props.onEditingCreate,\n props.onEditingDiscard,\n props.rowIdentityAccessor,\n props.validator,\n props.showEditingActions,\n props.onEvent\n );\n\n // this gives me the performance heeby jeebies, but can't think of a better way to internalise the state\n const data: TType[] = React.useMemo(() => {\n if (editing.temporaryRows.length) {\n return (props.data ?? []).concat(editing.temporaryRows as TType[]);\n }\n\n return props.data;\n }, [props.data, editing.temporaryRows.length]);\n\n // Appends save and discard to the consumer's row actions -- extra slots on a legacy array, or ready\n // elements on the end of a config-style function's returned list (rendered by shape in Actions.tsx)\n function withEditingActions(rowActions: Table3Props<TType>['rowActions']) {\n // Cast: these renderers read the internal rowId/table helpers, which are not on the public renderer type\n const editingActions = [\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.save}\n icon=\"tick\"\n disabled={!editing.hasChanges(helpers.rowId) || editing.hasRowErrors(helpers.rowId)}\n onClick={async () => {\n await editing.saveChanges(helpers.table, helpers.rowId);\n }}\n />\n ),\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.clear}\n icon=\"close\"\n disabled={!editing.hasChanges(helpers.rowId)}\n dialog={props => (\n <DiscardChangesConfirmationDialog\n {...props}\n onDiscard={() => {\n editing.discardChanges(helpers.rowId, helpers.table);\n\n if (editing.temporaryRows.length) {\n requestAnimationFrame(() => editing.createRowButtonRef.current?.focus());\n }\n }}\n />\n )}\n />\n ),\n ] as TableRowActionRenderer<TType>[];\n\n if (typeof rowActions === 'function') {\n // Cast: the wrapper mixes the editing-action elements into the returned config list\n return ((row: TType, helpers: Table3RowActionHelpers<TType>) => [\n ...rowActions(row, helpers),\n ...editingActions.map(action => action(row, helpers)),\n ]) as TableRowActionConfigRenderer<TType>;\n }\n\n return (rowActions ?? []).concat(editingActions);\n }\n\n const extendedProps: Table3Props<TType> = {\n ...props,\n data,\n enableRowActions: editing.isEditing && props.showEditingActions ? true : props.enableRowActions,\n // While editing, only add editing actions (and their menu) when showEditingActions is explicitly true\n rowActions:\n editing.isEditing && props.showEditingActions === true ? withEditingActions(props.rowActions) : props.rowActions,\n };\n\n const meta = { editing };\n\n // Cast to TableProps: Table3Props adds editing-specific props on top of TableProps.\n // useTable only needs the base TableProps.\n const table = useTable<TType, Table3Meta>(extendedProps as TableProps<TType>, ref, RENDERERS, meta);\n\n const toggleEditing = (enabled: boolean | undefined) =>\n table.meta.editing.toggleEditing(enabled ?? (editing => !editing), table.instance, table.renderer.scrollToIndex);\n\n // editing state is set earlier, but toggleEditing does other things like sets the active row\n React.useEffect(() => {\n if (props.defaultToggleEditing) {\n toggleEditing(true);\n }\n }, []);\n\n // listeners\n useTableEditingListener<TType>(table.instance, table.ref, table.renderer.scrollToIndex);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled) {\n instance.editing = {\n toggleEditing,\n removeRowChanges: (rowId: string) => table.meta.editing.discardChanges(rowId, table.instance),\n save: (rowId?: string) => table.meta.editing.saveChanges(table.instance, rowId),\n };\n\n if (props.onEditingCreate && instance.editing) {\n instance.editing.createRow = (row: unknown) =>\n table.meta.editing.createRow(table.instance, row as Partial<TType>);\n }\n }\n }\n }, [table.ref.current, table.meta.editing.isEnabled]);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled && instance.editing) {\n instance.editing.forceValidate = async () => await table.meta.editing.forceValidate(table.instance);\n }\n }\n }, [table.meta.editing.forceValidate]);\n\n useLazyEffect(() => {\n if (editing.isEnabled && props.onHasChanges) {\n props.onHasChanges(editing.isDirty);\n }\n }, [editing.isEnabled, editing.isDirty, props.onHasChanges]);\n\n return table;\n}\n"],"names":["Row","Cell","useLocalization","useTableEditing","LegacyIconButton","props","DiscardChangesConfirmationDialog","useTable","editing","useTableEditingListener","useLazyEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTable3.cjs","sources":["../../../src/components/Table3/useTable3.tsx"],"sourcesContent":["import type { RowData, Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { LegacyIconButton, useLocalization } from '@/components';\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useTable } from '@/primitives/Table/Core/useTable';\nimport type { TableProps, TableRowActionConfigRenderer, TableRowActionRenderer } from '@/primitives/Table/types';\n\nimport { Cell } from './components/Columns/Cell/Cell';\nimport { DiscardChangesConfirmationDialog } from './components/Editing/DiscardChangesConfirmationDialog';\nimport { Row } from './components/Row/Row';\nimport { useTableEditing } from './features/useTableEditing';\nimport { useTableEditingListener } from './listeners/useTableEditingListener';\nimport type { Table3Props, Table3Ref } from './types';\n\nexport const RENDERERS = {\n row: Row,\n cell: Cell,\n};\n\ndeclare module '@tanstack/table-core' {\n // oxlint-disable-next-line no-unused-vars, typescript/consistent-type-definitions -- module augmentation requires interface (declaration merging)\n interface TableMeta<TData extends RowData> {\n editing: ReturnType<typeof useTableEditing>;\n }\n}\n\ntype Table3Meta = {\n editing: ReturnType<typeof useTableEditing>;\n};\n\n// helpers includes internal rowId and table properties that are intentionally kept off the public type\ntype Table3RowActionHelpers<TType> = Parameters<TableRowActionRenderer<TType>>[1] & {\n rowId: string;\n table: ReactTable<TType>;\n};\n\nexport function useTable3<TType>(props: Table3Props<TType>, ref: React.Ref<Table3Ref>) {\n const { texts } = useLocalization();\n const editing = useTableEditing(\n props.enableEditing,\n props.defaultToggleEditing,\n props.onEditingSave,\n props.onEditingChange,\n props.onEditingCreate,\n props.onEditingDiscard,\n props.rowIdentityAccessor,\n props.validator,\n props.showEditingActions,\n props.onEvent\n );\n\n // this gives me the performance heeby jeebies, but can't think of a better way to internalise the state\n const data: TType[] = React.useMemo(() => {\n if (editing.temporaryRows.length) {\n return (props.data ?? []).concat(editing.temporaryRows as TType[]);\n }\n\n return props.data;\n }, [props.data, editing.temporaryRows.length]);\n\n // Appends save and discard to the consumer's row actions: extra slots on a legacy array, or ready\n // elements on the end of a config-style function's returned list (rendered by shape in Actions.tsx)\n function withEditingActions(rowActions: Table3Props<TType>['rowActions']) {\n // Cast: these renderers read the internal rowId/table helpers, which are not on the public renderer type\n const editingActions = [\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.save}\n icon=\"tick\"\n disabled={!editing.hasChanges(helpers.rowId) || editing.hasRowErrors(helpers.rowId)}\n onClick={async () => {\n await editing.saveChanges(helpers.table, helpers.rowId);\n }}\n />\n ),\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.clear}\n icon=\"close\"\n disabled={!editing.hasChanges(helpers.rowId)}\n dialog={props => (\n <DiscardChangesConfirmationDialog\n {...props}\n onDiscard={() => {\n editing.discardChanges(helpers.rowId, helpers.table);\n\n if (editing.temporaryRows.length) {\n requestAnimationFrame(() => editing.createRowButtonRef.current?.focus());\n }\n }}\n />\n )}\n />\n ),\n ] as TableRowActionRenderer<TType>[];\n\n if (typeof rowActions === 'function') {\n // Cast: the wrapper mixes the editing-action elements into the returned config list\n return ((row: TType, helpers: Table3RowActionHelpers<TType>) => [\n ...rowActions(row, helpers),\n ...editingActions.map(action => action(row, helpers)),\n ]) as TableRowActionConfigRenderer<TType>;\n }\n\n return (rowActions ?? []).concat(editingActions);\n }\n\n const extendedProps: Table3Props<TType> = {\n ...props,\n data,\n enableRowActions: editing.isEditing && props.showEditingActions ? true : props.enableRowActions,\n // While editing, only add editing actions (and their menu) when showEditingActions is explicitly true\n rowActions:\n editing.isEditing && props.showEditingActions === true ? withEditingActions(props.rowActions) : props.rowActions,\n };\n\n const meta = { editing };\n\n // Cast to TableProps: Table3Props adds editing-specific props on top of TableProps.\n // useTable only needs the base TableProps.\n const table = useTable<TType, Table3Meta>(extendedProps as TableProps<TType>, ref, RENDERERS, meta);\n\n const toggleEditing = (enabled: boolean | undefined) =>\n table.meta.editing.toggleEditing(enabled ?? (editing => !editing), table.instance, table.renderer.scrollToIndex);\n\n // editing state is set earlier, but toggleEditing does other things like sets the active row\n React.useEffect(() => {\n if (props.defaultToggleEditing) {\n toggleEditing(true);\n }\n }, []);\n\n // listeners\n useTableEditingListener<TType>(table.instance, table.ref, table.renderer.scrollToIndex);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled) {\n instance.editing = {\n toggleEditing,\n removeRowChanges: (rowId: string) => table.meta.editing.discardChanges(rowId, table.instance),\n save: (rowId?: string) => table.meta.editing.saveChanges(table.instance, rowId),\n };\n\n if (props.onEditingCreate && instance.editing) {\n instance.editing.createRow = (row: unknown) =>\n table.meta.editing.createRow(table.instance, row as Partial<TType>);\n }\n }\n }\n }, [table.ref.current, table.meta.editing.isEnabled]);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled && instance.editing) {\n instance.editing.forceValidate = async () => await table.meta.editing.forceValidate(table.instance);\n }\n }\n }, [table.meta.editing.forceValidate]);\n\n useLazyEffect(() => {\n if (editing.isEnabled && props.onHasChanges) {\n props.onHasChanges(editing.isDirty);\n }\n }, [editing.isEnabled, editing.isDirty, props.onHasChanges]);\n\n return table;\n}\n"],"names":["Row","Cell","useLocalization","useTableEditing","LegacyIconButton","props","DiscardChangesConfirmationDialog","useTable","editing","useTableEditingListener","useLazyEffect"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTable3.js","sources":["../../../src/components/Table3/useTable3.tsx"],"sourcesContent":["import type { RowData, Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { LegacyIconButton, useLocalization } from '@/components';\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useTable } from '@/primitives/Table/Core/useTable';\nimport type { TableProps, TableRowActionConfigRenderer, TableRowActionRenderer } from '@/primitives/Table/types';\n\nimport { Cell } from './components/Columns/Cell/Cell';\nimport { DiscardChangesConfirmationDialog } from './components/Editing/DiscardChangesConfirmationDialog';\nimport { Row } from './components/Row/Row';\nimport { useTableEditing } from './features/useTableEditing';\nimport { useTableEditingListener } from './listeners/useTableEditingListener';\nimport type { Table3Props, Table3Ref } from './types';\n\nexport const RENDERERS = {\n row: Row,\n cell: Cell,\n};\n\ndeclare module '@tanstack/table-core' {\n // oxlint-disable-next-line no-unused-vars, typescript/consistent-type-definitions -- module augmentation requires interface (declaration merging)\n interface TableMeta<TData extends RowData> {\n editing: ReturnType<typeof useTableEditing>;\n }\n}\n\ntype Table3Meta = {\n editing: ReturnType<typeof useTableEditing>;\n};\n\n// helpers includes internal rowId and table properties that are intentionally kept off the public type\ntype Table3RowActionHelpers<TType> = Parameters<TableRowActionRenderer<TType>>[1] & {\n rowId: string;\n table: ReactTable<TType>;\n};\n\nexport function useTable3<TType>(props: Table3Props<TType>, ref: React.Ref<Table3Ref>) {\n const { texts } = useLocalization();\n const editing = useTableEditing(\n props.enableEditing,\n props.defaultToggleEditing,\n props.onEditingSave,\n props.onEditingChange,\n props.onEditingCreate,\n props.onEditingDiscard,\n props.rowIdentityAccessor,\n props.validator,\n props.showEditingActions,\n props.onEvent\n );\n\n // this gives me the performance heeby jeebies, but can't think of a better way to internalise the state\n const data: TType[] = React.useMemo(() => {\n if (editing.temporaryRows.length) {\n return (props.data ?? []).concat(editing.temporaryRows as TType[]);\n }\n\n return props.data;\n }, [props.data, editing.temporaryRows.length]);\n\n // Appends save and discard to the consumer's row actions -- extra slots on a legacy array, or ready\n // elements on the end of a config-style function's returned list (rendered by shape in Actions.tsx)\n function withEditingActions(rowActions: Table3Props<TType>['rowActions']) {\n // Cast: these renderers read the internal rowId/table helpers, which are not on the public renderer type\n const editingActions = [\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.save}\n icon=\"tick\"\n disabled={!editing.hasChanges(helpers.rowId) || editing.hasRowErrors(helpers.rowId)}\n onClick={async () => {\n await editing.saveChanges(helpers.table, helpers.rowId);\n }}\n />\n ),\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.clear}\n icon=\"close\"\n disabled={!editing.hasChanges(helpers.rowId)}\n dialog={props => (\n <DiscardChangesConfirmationDialog\n {...props}\n onDiscard={() => {\n editing.discardChanges(helpers.rowId, helpers.table);\n\n if (editing.temporaryRows.length) {\n requestAnimationFrame(() => editing.createRowButtonRef.current?.focus());\n }\n }}\n />\n )}\n />\n ),\n ] as TableRowActionRenderer<TType>[];\n\n if (typeof rowActions === 'function') {\n // Cast: the wrapper mixes the editing-action elements into the returned config list\n return ((row: TType, helpers: Table3RowActionHelpers<TType>) => [\n ...rowActions(row, helpers),\n ...editingActions.map(action => action(row, helpers)),\n ]) as TableRowActionConfigRenderer<TType>;\n }\n\n return (rowActions ?? []).concat(editingActions);\n }\n\n const extendedProps: Table3Props<TType> = {\n ...props,\n data,\n enableRowActions: editing.isEditing && props.showEditingActions ? true : props.enableRowActions,\n // While editing, only add editing actions (and their menu) when showEditingActions is explicitly true\n rowActions:\n editing.isEditing && props.showEditingActions === true ? withEditingActions(props.rowActions) : props.rowActions,\n };\n\n const meta = { editing };\n\n // Cast to TableProps: Table3Props adds editing-specific props on top of TableProps.\n // useTable only needs the base TableProps.\n const table = useTable<TType, Table3Meta>(extendedProps as TableProps<TType>, ref, RENDERERS, meta);\n\n const toggleEditing = (enabled: boolean | undefined) =>\n table.meta.editing.toggleEditing(enabled ?? (editing => !editing), table.instance, table.renderer.scrollToIndex);\n\n // editing state is set earlier, but toggleEditing does other things like sets the active row\n React.useEffect(() => {\n if (props.defaultToggleEditing) {\n toggleEditing(true);\n }\n }, []);\n\n // listeners\n useTableEditingListener<TType>(table.instance, table.ref, table.renderer.scrollToIndex);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled) {\n instance.editing = {\n toggleEditing,\n removeRowChanges: (rowId: string) => table.meta.editing.discardChanges(rowId, table.instance),\n save: (rowId?: string) => table.meta.editing.saveChanges(table.instance, rowId),\n };\n\n if (props.onEditingCreate && instance.editing) {\n instance.editing.createRow = (row: unknown) =>\n table.meta.editing.createRow(table.instance, row as Partial<TType>);\n }\n }\n }\n }, [table.ref.current, table.meta.editing.isEnabled]);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled && instance.editing) {\n instance.editing.forceValidate = async () => await table.meta.editing.forceValidate(table.instance);\n }\n }\n }, [table.meta.editing.forceValidate]);\n\n useLazyEffect(() => {\n if (editing.isEnabled && props.onHasChanges) {\n props.onHasChanges(editing.isDirty);\n }\n }, [editing.isEnabled, editing.isDirty, props.onHasChanges]);\n\n return table;\n}\n"],"names":["React","props","editing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTable3.js","sources":["../../../src/components/Table3/useTable3.tsx"],"sourcesContent":["import type { RowData, Table as ReactTable } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { LegacyIconButton, useLocalization } from '@/components';\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { useTable } from '@/primitives/Table/Core/useTable';\nimport type { TableProps, TableRowActionConfigRenderer, TableRowActionRenderer } from '@/primitives/Table/types';\n\nimport { Cell } from './components/Columns/Cell/Cell';\nimport { DiscardChangesConfirmationDialog } from './components/Editing/DiscardChangesConfirmationDialog';\nimport { Row } from './components/Row/Row';\nimport { useTableEditing } from './features/useTableEditing';\nimport { useTableEditingListener } from './listeners/useTableEditingListener';\nimport type { Table3Props, Table3Ref } from './types';\n\nexport const RENDERERS = {\n row: Row,\n cell: Cell,\n};\n\ndeclare module '@tanstack/table-core' {\n // oxlint-disable-next-line no-unused-vars, typescript/consistent-type-definitions -- module augmentation requires interface (declaration merging)\n interface TableMeta<TData extends RowData> {\n editing: ReturnType<typeof useTableEditing>;\n }\n}\n\ntype Table3Meta = {\n editing: ReturnType<typeof useTableEditing>;\n};\n\n// helpers includes internal rowId and table properties that are intentionally kept off the public type\ntype Table3RowActionHelpers<TType> = Parameters<TableRowActionRenderer<TType>>[1] & {\n rowId: string;\n table: ReactTable<TType>;\n};\n\nexport function useTable3<TType>(props: Table3Props<TType>, ref: React.Ref<Table3Ref>) {\n const { texts } = useLocalization();\n const editing = useTableEditing(\n props.enableEditing,\n props.defaultToggleEditing,\n props.onEditingSave,\n props.onEditingChange,\n props.onEditingCreate,\n props.onEditingDiscard,\n props.rowIdentityAccessor,\n props.validator,\n props.showEditingActions,\n props.onEvent\n );\n\n // this gives me the performance heeby jeebies, but can't think of a better way to internalise the state\n const data: TType[] = React.useMemo(() => {\n if (editing.temporaryRows.length) {\n return (props.data ?? []).concat(editing.temporaryRows as TType[]);\n }\n\n return props.data;\n }, [props.data, editing.temporaryRows.length]);\n\n // Appends save and discard to the consumer's row actions: extra slots on a legacy array, or ready\n // elements on the end of a config-style function's returned list (rendered by shape in Actions.tsx)\n function withEditingActions(rowActions: Table3Props<TType>['rowActions']) {\n // Cast: these renderers read the internal rowId/table helpers, which are not on the public renderer type\n const editingActions = [\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.save}\n icon=\"tick\"\n disabled={!editing.hasChanges(helpers.rowId) || editing.hasRowErrors(helpers.rowId)}\n onClick={async () => {\n await editing.saveChanges(helpers.table, helpers.rowId);\n }}\n />\n ),\n (_1, helpers: Table3RowActionHelpers<TType>) => (\n <LegacyIconButton\n aria-label={texts.table3.editing.actions.clear}\n icon=\"close\"\n disabled={!editing.hasChanges(helpers.rowId)}\n dialog={props => (\n <DiscardChangesConfirmationDialog\n {...props}\n onDiscard={() => {\n editing.discardChanges(helpers.rowId, helpers.table);\n\n if (editing.temporaryRows.length) {\n requestAnimationFrame(() => editing.createRowButtonRef.current?.focus());\n }\n }}\n />\n )}\n />\n ),\n ] as TableRowActionRenderer<TType>[];\n\n if (typeof rowActions === 'function') {\n // Cast: the wrapper mixes the editing-action elements into the returned config list\n return ((row: TType, helpers: Table3RowActionHelpers<TType>) => [\n ...rowActions(row, helpers),\n ...editingActions.map(action => action(row, helpers)),\n ]) as TableRowActionConfigRenderer<TType>;\n }\n\n return (rowActions ?? []).concat(editingActions);\n }\n\n const extendedProps: Table3Props<TType> = {\n ...props,\n data,\n enableRowActions: editing.isEditing && props.showEditingActions ? true : props.enableRowActions,\n // While editing, only add editing actions (and their menu) when showEditingActions is explicitly true\n rowActions:\n editing.isEditing && props.showEditingActions === true ? withEditingActions(props.rowActions) : props.rowActions,\n };\n\n const meta = { editing };\n\n // Cast to TableProps: Table3Props adds editing-specific props on top of TableProps.\n // useTable only needs the base TableProps.\n const table = useTable<TType, Table3Meta>(extendedProps as TableProps<TType>, ref, RENDERERS, meta);\n\n const toggleEditing = (enabled: boolean | undefined) =>\n table.meta.editing.toggleEditing(enabled ?? (editing => !editing), table.instance, table.renderer.scrollToIndex);\n\n // editing state is set earlier, but toggleEditing does other things like sets the active row\n React.useEffect(() => {\n if (props.defaultToggleEditing) {\n toggleEditing(true);\n }\n }, []);\n\n // listeners\n useTableEditingListener<TType>(table.instance, table.ref, table.renderer.scrollToIndex);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled) {\n instance.editing = {\n toggleEditing,\n removeRowChanges: (rowId: string) => table.meta.editing.discardChanges(rowId, table.instance),\n save: (rowId?: string) => table.meta.editing.saveChanges(table.instance, rowId),\n };\n\n if (props.onEditingCreate && instance.editing) {\n instance.editing.createRow = (row: unknown) =>\n table.meta.editing.createRow(table.instance, row as Partial<TType>);\n }\n }\n }\n }, [table.ref.current, table.meta.editing.isEnabled]);\n\n React.useEffect(() => {\n const tableRef = table.ref.current as Table3Ref | null;\n\n if (tableRef) {\n const instance = tableRef.instance;\n\n if (table.meta.editing.isEnabled && instance.editing) {\n instance.editing.forceValidate = async () => await table.meta.editing.forceValidate(table.instance);\n }\n }\n }, [table.meta.editing.forceValidate]);\n\n useLazyEffect(() => {\n if (editing.isEnabled && props.onHasChanges) {\n props.onHasChanges(editing.isDirty);\n }\n }, [editing.isEnabled, editing.isDirty, props.onHasChanges]);\n\n return table;\n}\n"],"names":["React","props","editing"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const React = require("react");
|
|
4
|
-
const useTableRowActions = require("../../../../../useTableManager/features/useTableRowActions.cjs");
|
|
5
4
|
const columns = require("../../../../../useTableManager/util/columns.cjs");
|
|
5
|
+
const rowActions = require("../../../../../useTableManager/util/rowActions.cjs");
|
|
6
6
|
const RowContext = require("../../../Row/RowContext.cjs");
|
|
7
7
|
const Actions = require("../../Internal/Actions.cjs");
|
|
8
8
|
const util = require("../util.cjs");
|
|
@@ -33,13 +33,13 @@ function GroupedCell(props) {
|
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
const MemoedGroupedCell = React.memo(function MemoedGroupedCell2(props) {
|
|
36
|
-
const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;
|
|
36
|
+
const { canShowActions, cellRef, children, colSpan, rowActions: rowActions$1, rowId, subRows, table, ...attributes } = props;
|
|
37
37
|
return (
|
|
38
38
|
// pr-1 is needed to align group row actions with row actions in sibling rows, if present
|
|
39
|
-
/* @__PURE__ */ React.createElement("td", { ...attributes, className: "!pr-1", ref: cellRef, style: { gridColumn: `span ${colSpan} / span ${colSpan}` } }, /* @__PURE__ */ React.createElement("span", { className: "grow" }, children),
|
|
39
|
+
/* @__PURE__ */ React.createElement("td", { ...attributes, className: "!pr-1", ref: cellRef, style: { gridColumn: `span ${colSpan} / span ${colSpan}` } }, /* @__PURE__ */ React.createElement("span", { className: "grow" }, children), rowActions.hasRowActions(rowActions$1) && canShowActions ? /* @__PURE__ */ React.createElement(
|
|
40
40
|
Actions.Actions,
|
|
41
41
|
{
|
|
42
|
-
actions: rowActions,
|
|
42
|
+
actions: rowActions$1,
|
|
43
43
|
actionsLength: 4,
|
|
44
44
|
data: subRows,
|
|
45
45
|
isActiveRow: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupedCell.cjs","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable, TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport {
|
|
1
|
+
{"version":3,"file":"GroupedCell.cjs","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable, TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport { isInternalColumn } from '../../../../../useTableManager/util/columns';\nimport { hasRowActions } from '../../../../../useTableManager/util/rowActions';\nimport type { TableCellRendererProps } from '../../../../types';\nimport { RowContext } from '../../../Row/RowContext';\nimport { Actions as RowGroupActions } from '../../Internal/Actions';\nimport { getCellAttributes } from '../util';\n\nexport function GroupedCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, index, isHighlighted } = props;\n const { table } = cell.getContext();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const attributes = getCellAttributes(cell, index, isHighlighted);\n\n const { isHovered, rowIndex } = React.useContext(RowContext);\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const canShowActions = isActiveRow || (isHovered && !tableMeta.rowActive.isHoverStatePaused);\n\n // Set colSpan based on the count of visible cells, including '__actions' and non-internal columns, so that\n // rowGroupActions aligns with rowActions.\n const colSpan =\n cell.row.getVisibleCells().filter(c => c.column.id === '__actions' || !isInternalColumn(c.column.id)).length - 1;\n const subRows = cell.getContext().row.subRows.map(row => row.original);\n\n // using flexRender renders as a react component not a function, and that causes re-render issues for us\n // for example, clicks on buttons in cells no longer works until the row becomes active\n const content = typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : null;\n\n return (\n <MemoedGroupedCell<TType>\n {...attributes}\n canShowActions={canShowActions}\n cellRef={cellRef}\n colSpan={colSpan}\n rowActions={tableMeta.rowGroups.rowActionsForGroup}\n rowId={cell.row.id}\n subRows={subRows}\n table={table}>\n {content}\n </MemoedGroupedCell>\n );\n}\n\ntype MemoedGroupedCellProps<TType = unknown> = React.TdHTMLAttributes<HTMLTableCellElement> & {\n canShowActions: boolean;\n cellRef: React.Ref<HTMLTableCellElement>;\n colSpan: number;\n rowActions?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowId: string;\n subRows: TType[];\n table: ReactTable<TType>;\n};\n\nconst MemoedGroupedCell = React.memo(function MemoedGroupedCell<TType = unknown>(props: MemoedGroupedCellProps<TType>) {\n const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;\n\n return (\n // pr-1 is needed to align group row actions with row actions in sibling rows, if present\n <td {...attributes} className=\"!pr-1\" ref={cellRef} style={{ gridColumn: `span ${colSpan} / span ${colSpan}` }}>\n <span className=\"grow\">{children}</span>\n {hasRowActions(rowActions) && canShowActions ? (\n <RowGroupActions<TType>\n actions={rowActions as any}\n actionsLength={4}\n data={subRows}\n isActiveRow\n rowId={rowId}\n table={table}\n />\n ) : null}\n </td>\n );\n}) as <TType = unknown>(props: MemoedGroupedCellProps<TType>) => React.JSX.Element;\n"],"names":["getCellAttributes","RowContext","isInternalColumn","MemoedGroupedCell","rowActions","hasRowActions","RowGroupActions"],"mappings":";;;;;;;;AAWO,SAAS,YAA6B,OAAsC;AAC/E,QAAM,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,aAAaA,KAAAA,kBAAkB,MAAM,OAAO,aAAa;AAE/D,QAAM,EAAE,WAAW,SAAA,IAAa,MAAM,WAAWC,WAAAA,UAAU;AAC3D,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,iBAAiB,eAAgB,aAAa,CAAC,UAAU,UAAU;AAIzE,QAAM,UACF,KAAK,IAAI,kBAAkB,OAAO,OAAK,EAAE,OAAO,OAAO,eAAe,CAACC,QAAAA,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACnH,QAAM,UAAU,KAAK,WAAA,EAAa,IAAI,QAAQ,IAAI,CAAA,QAAO,IAAI,QAAQ;AAIrE,QAAM,UAAU,OAAO,KAAK,OAAO,UAAU,SAAS,aAAa,KAAK,OAAO,UAAU,KAAK,KAAK,WAAA,CAAY,IAAI;AAEnH,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IACC;AAAA,EAAA;AAGb;AAYA,MAAM,oBAAoB,MAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM,EAAE,gBAAgB,SAAS,UAAU,SAAA,YAASC,cAAY,OAAO,SAAS,OAAO,GAAG,WAAA,IAAe;AAEzG;AAAA;AAAA,IAEI,sBAAA,cAAC,MAAA,EAAI,GAAG,YAAY,WAAU,SAAQ,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,WAAW,OAAO,GAAA,EAAG,GACzG,sBAAA,cAAC,QAAA,EAAK,WAAU,OAAA,GAAQ,QAAS,GAChCC,WAAAA,cAAcD,YAAU,KAAK,iBAC1B,sBAAA;AAAA,MAACE,QAAAA;AAAAA,MAAA;AAAA,QACG,SAASF;AAAAA,QACT,eAAe;AAAA,QACf,MAAM;AAAA,QACN,aAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,IAEJ,IACR;AAAA;AAER,CAAC;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default from "react";
|
|
2
|
-
import { hasRowActions } from "../../../../../useTableManager/features/useTableRowActions.js";
|
|
3
2
|
import { isInternalColumn } from "../../../../../useTableManager/util/columns.js";
|
|
3
|
+
import { hasRowActions } from "../../../../../useTableManager/util/rowActions.js";
|
|
4
4
|
import { RowContext } from "../../../Row/RowContext.js";
|
|
5
5
|
import { Actions } from "../../Internal/Actions.js";
|
|
6
6
|
import { getCellAttributes } from "../util.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupedCell.js","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable, TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport {
|
|
1
|
+
{"version":3,"file":"GroupedCell.js","sources":["../../../../../../../../src/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.tsx"],"sourcesContent":["import type { Table as ReactTable, TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport React from 'react';\n\nimport type { TableRowActionConfigGroupRenderer, TableRowActionGroupRenderer } from '../../../../../types';\nimport { isInternalColumn } from '../../../../../useTableManager/util/columns';\nimport { hasRowActions } from '../../../../../useTableManager/util/rowActions';\nimport type { TableCellRendererProps } from '../../../../types';\nimport { RowContext } from '../../../Row/RowContext';\nimport { Actions as RowGroupActions } from '../../Internal/Actions';\nimport { getCellAttributes } from '../util';\n\nexport function GroupedCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, index, isHighlighted } = props;\n const { table } = cell.getContext();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const attributes = getCellAttributes(cell, index, isHighlighted);\n\n const { isHovered, rowIndex } = React.useContext(RowContext);\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const canShowActions = isActiveRow || (isHovered && !tableMeta.rowActive.isHoverStatePaused);\n\n // Set colSpan based on the count of visible cells, including '__actions' and non-internal columns, so that\n // rowGroupActions aligns with rowActions.\n const colSpan =\n cell.row.getVisibleCells().filter(c => c.column.id === '__actions' || !isInternalColumn(c.column.id)).length - 1;\n const subRows = cell.getContext().row.subRows.map(row => row.original);\n\n // using flexRender renders as a react component not a function, and that causes re-render issues for us\n // for example, clicks on buttons in cells no longer works until the row becomes active\n const content = typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : null;\n\n return (\n <MemoedGroupedCell<TType>\n {...attributes}\n canShowActions={canShowActions}\n cellRef={cellRef}\n colSpan={colSpan}\n rowActions={tableMeta.rowGroups.rowActionsForGroup}\n rowId={cell.row.id}\n subRows={subRows}\n table={table}>\n {content}\n </MemoedGroupedCell>\n );\n}\n\ntype MemoedGroupedCellProps<TType = unknown> = React.TdHTMLAttributes<HTMLTableCellElement> & {\n canShowActions: boolean;\n cellRef: React.Ref<HTMLTableCellElement>;\n colSpan: number;\n rowActions?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowId: string;\n subRows: TType[];\n table: ReactTable<TType>;\n};\n\nconst MemoedGroupedCell = React.memo(function MemoedGroupedCell<TType = unknown>(props: MemoedGroupedCellProps<TType>) {\n const { canShowActions, cellRef, children, colSpan, rowActions, rowId, subRows, table, ...attributes } = props;\n\n return (\n // pr-1 is needed to align group row actions with row actions in sibling rows, if present\n <td {...attributes} className=\"!pr-1\" ref={cellRef} style={{ gridColumn: `span ${colSpan} / span ${colSpan}` }}>\n <span className=\"grow\">{children}</span>\n {hasRowActions(rowActions) && canShowActions ? (\n <RowGroupActions<TType>\n actions={rowActions as any}\n actionsLength={4}\n data={subRows}\n isActiveRow\n rowId={rowId}\n table={table}\n />\n ) : null}\n </td>\n );\n}) as <TType = unknown>(props: MemoedGroupedCellProps<TType>) => React.JSX.Element;\n"],"names":["React","MemoedGroupedCell","RowGroupActions"],"mappings":";;;;;;AAWO,SAAS,YAA6B,OAAsC;AAC/E,QAAM,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,aAAa,kBAAkB,MAAM,OAAO,aAAa;AAE/D,QAAM,EAAE,WAAW,SAAA,IAAaA,eAAM,WAAW,UAAU;AAC3D,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,iBAAiB,eAAgB,aAAa,CAAC,UAAU,UAAU;AAIzE,QAAM,UACF,KAAK,IAAI,kBAAkB,OAAO,OAAK,EAAE,OAAO,OAAO,eAAe,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AACnH,QAAM,UAAU,KAAK,WAAA,EAAa,IAAI,QAAQ,IAAI,CAAA,QAAO,IAAI,QAAQ;AAIrE,QAAM,UAAU,OAAO,KAAK,OAAO,UAAU,SAAS,aAAa,KAAK,OAAO,UAAU,KAAK,KAAK,WAAA,CAAY,IAAI;AAEnH,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,UAAU,UAAU;AAAA,MAChC,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IACC;AAAA,EAAA;AAGb;AAYA,MAAM,oBAAoBA,eAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM,EAAE,gBAAgB,SAAS,UAAU,SAAS,YAAY,OAAO,SAAS,OAAO,GAAG,WAAA,IAAe;AAEzG;AAAA;AAAA,IAEID,+BAAA,cAAC,MAAA,EAAI,GAAG,YAAY,WAAU,SAAQ,KAAK,SAAS,OAAO,EAAE,YAAY,QAAQ,OAAO,WAAW,OAAO,GAAA,EAAG,GACzGA,+BAAA,cAAC,QAAA,EAAK,WAAU,OAAA,GAAQ,QAAS,GAChC,cAAc,UAAU,KAAK,iBAC1BA,+BAAA;AAAA,MAACE;AAAAA,MAAA;AAAA,QACG,SAAS;AAAA,QACT,eAAe;AAAA,QACf,MAAM;AAAA,QACN,aAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,IAEJ,IACR;AAAA;AAER,CAAC;"}
|
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const cn = require("clsx");
|
|
4
4
|
const React = require("react");
|
|
5
|
-
const
|
|
5
|
+
const rowActions = require("../../../../useTableManager/util/rowActions.cjs");
|
|
6
6
|
const RowContext = require("../../Row/RowContext.cjs");
|
|
7
7
|
const Localization = require("../../../../../../components/Provider/Localization.cjs");
|
|
8
8
|
const Shortcut = require("../../../../../../components/Shortcut/Shortcut.cjs");
|
|
9
9
|
const IconButton = require("../../../../../../components/LegacyComponents/IconButton/IconButton.cjs");
|
|
10
10
|
const Menu = require("../../../../../../components/Menu/Menu.cjs");
|
|
11
11
|
function renderRowActionConfig(config, arg) {
|
|
12
|
+
const dataAttributes = config.data ? Object.fromEntries(
|
|
13
|
+
Object.entries(config.data).map(([key, value]) => [key.startsWith("data-") ? key : `data-${key}`, value])
|
|
14
|
+
) : void 0;
|
|
12
15
|
return /* @__PURE__ */ React.createElement(
|
|
13
16
|
IconButton.LegacyIconButton,
|
|
14
17
|
{
|
|
@@ -18,7 +21,8 @@ function renderRowActionConfig(config, arg) {
|
|
|
18
21
|
icon: config.icon,
|
|
19
22
|
disabled: config.disabled,
|
|
20
23
|
shortcut: config.shortcut,
|
|
21
|
-
onClick: (event) => config.onClick(arg, event)
|
|
24
|
+
onClick: (event) => config.onClick(arg, event),
|
|
25
|
+
...dataAttributes
|
|
22
26
|
}
|
|
23
27
|
);
|
|
24
28
|
}
|
|
@@ -31,14 +35,17 @@ function Actions(props) {
|
|
|
31
35
|
table
|
|
32
36
|
};
|
|
33
37
|
if (tableMeta.editing?.isEnabled) {
|
|
38
|
+
const lastFocusedCellIndex = tableMeta.editing.lastFocusedCellIndex;
|
|
34
39
|
helpers.editing = {
|
|
35
40
|
isEditing: tableMeta.editing?.isEditing ?? false,
|
|
41
|
+
// cells stamp their visible index (data-cell-index), so the visible leaf column at that index is the focused column
|
|
42
|
+
lastFocusedCellId: lastFocusedCellIndex === void 0 ? void 0 : table.getVisibleLeafColumns()[lastFocusedCellIndex]?.id,
|
|
36
43
|
removeRowChanges: () => tableMeta.editing.discardChanges(rowId, table),
|
|
37
44
|
save: () => tableMeta.editing.saveChanges(table, rowId)
|
|
38
45
|
};
|
|
39
46
|
}
|
|
40
|
-
const
|
|
41
|
-
const visibleActions =
|
|
47
|
+
const resolvedActions = Array.isArray(actions) ? actions.map((action) => action(data, helpers)) : actions(data, helpers);
|
|
48
|
+
const visibleActions = resolvedActions.filter((result) => !!result).map(
|
|
42
49
|
(result) => React.isValidElement(result) ? result : renderRowActionConfig(result, data)
|
|
43
50
|
);
|
|
44
51
|
let length = actionsLength;
|
|
@@ -104,7 +111,7 @@ const Cell = React.memo(function MemoedCell(context) {
|
|
|
104
111
|
const isResizingColumn = !!table.getState().columnSizingInfo.isResizingColumn;
|
|
105
112
|
const isHoverStatePaused = tableMeta.rowActive.isHoverStatePaused;
|
|
106
113
|
const isRowGrouped = row.getIsGrouped();
|
|
107
|
-
if (!hideRowActions && !isRowGrouped &&
|
|
114
|
+
if (!hideRowActions && !isRowGrouped && rowActions.hasRowActions(actions) && (isActiveRow || isHovered && !isHoverStatePaused && !isResizingColumn)) {
|
|
108
115
|
return /* @__PURE__ */ React.createElement(
|
|
109
116
|
Actions,
|
|
110
117
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.cjs","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Actions.tsx"],"sourcesContent":["import type {\n Table as ReactTable,\n CellContext as ReactTableCellContext,\n TableMeta as ReactTableMeta,\n} from '@tanstack/react-table';\nimport cn from 'clsx';\nimport React from 'react';\n\nimport { LegacyIconButton, Menu, Shortcut, useLocalization } from '@/components';\n\nimport type { TableRowActionConfig, TableRowActionConfigRenderer, TableRowActionRenderer } from '../../../../types';\nimport { hasRowActions } from '../../../../useTableManager/features/useTableRowActions';\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction renderRowActionConfig<TArg>(config: TableRowActionConfig<TArg>, arg: TArg) {\n return (\n <LegacyIconButton\n key={config.key}\n aria-label={config.name}\n tooltip={config.tooltip}\n icon={config.icon}\n disabled={config.disabled}\n shortcut={config.shortcut}\n onClick={event => config.onClick(arg, event)}\n />\n );\n}\n\nexport type ActionsProps<TType = unknown> = {\n actions: TableRowActionRenderer<TType>[] | TableRowActionConfigRenderer<TType>;\n actionsLength: number;\n data: any;\n isActiveRow: boolean;\n rowId: string;\n table: ReactTable<TType>;\n};\nexport function Actions<TType = unknown>(props: ActionsProps<TType>) {\n const { actions, actionsLength, data, isActiveRow, rowId, table } = props;\n const { texts } = useLocalization();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n // we don't want to document passing rowId and table, so it isn't on the type\n const helpers = {\n rowId,\n table,\n } as any;\n\n if (tableMeta.editing?.isEnabled) {\n helpers.editing = {\n isEditing: tableMeta.editing?.isEditing ?? false,\n removeRowChanges: () => tableMeta.editing.discardChanges(rowId, table),\n save: () => tableMeta.editing.saveChanges(table, rowId),\n };\n }\n\n // a config-style function returns the row's whole list; Table3 may append its editing actions as ready elements\n const results: (React.JSX.Element | TableRowActionConfig<TType> | null)[] = Array.isArray(actions)\n ? actions.map(action => action(data, helpers))\n : actions(data, helpers);\n\n const visibleActions = results\n .filter(result => !!result)\n // Cast: TS can't narrow a generic-parameterized union in the negated branch of a type guard\n .map(result =>\n React.isValidElement<any>(result) ? result : renderRowActionConfig(result as TableRowActionConfig<TType>, data)\n );\n\n let length = actionsLength;\n\n // always force the editing actions into a menu when present -- editing is undefined in Report\n if (tableMeta.editing?.isEditing && tableMeta.editing?.showEditingActions) {\n // When editing actions are enabled, there are always 2 editing actions (save and discard)\n // The menu button replaces one of them, so subtract 1\n const lengthWithoutEditingItems = visibleActions.length - 1;\n\n if (lengthWithoutEditingItems < actionsLength) {\n length = lengthWithoutEditingItems;\n }\n }\n\n const handleMenuButtonKeyDown = (event: React.KeyboardEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n const isLastRowActive = tableMeta.rowActive.rowActiveIndex === tableMeta.length - 1;\n\n // normally we handle this on change of active row, but when tabbing out of the last row the active row state stays on the last one\n if (event.key === 'Tab' && isLastRowActive && tableMeta.editing?.isEditing && tableMeta.editing?.hasChanges()) {\n tableMeta.editing.saveChanges(table);\n }\n };\n\n const handleMenuContentKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.stopPropagation();\n }\n };\n\n const actionsOnRow = visibleActions.length === length ? visibleActions : visibleActions.slice(0, length - 1);\n const actionsInMenu = visibleActions.slice(visibleActions.length === length ? length : length - 1);\n\n const className = cn('flex justify-end bg-[inherit] text-right print:hidden');\n\n return (\n <span className={className}>\n {actionsOnRow.map((button, index) => {\n const tooltip = String(button.props.tooltip ?? button.props['aria-label'] ?? '');\n\n return React.cloneElement(button, {\n appearance: 'transparent',\n // config-rendered buttons carry their stable config key; legacy slots fall back to the index\n key: button.key ?? index,\n tabIndex: isActiveRow ? 0 : -1,\n tooltip: button.props.shortcut ? (\n <>\n {tooltip}\n <Shortcut className=\"ml-2\" keys={button.props.shortcut} />\n </>\n ) : (\n tooltip\n ),\n });\n })}\n {actionsInMenu.length ? (\n <LegacyIconButton\n appearance=\"transparent\"\n aria-label={texts.table.columns.actions.tooltip}\n icon=\"more\"\n onKeyDown={handleMenuButtonKeyDown}\n tabIndex={isActiveRow ? 0 : -1}\n menu={menuProps => (\n <Menu {...menuProps}>\n <Menu.Content onKeyDown={handleMenuContentKeyDown}>\n {actionsInMenu.map((action, i) => {\n const key = action.key ?? i;\n const item = (\n <Menu.Item key={key} {...action.props} shortcut={action.props.shortcut}>\n {action.props['aria-label']}\n </Menu.Item>\n );\n\n // add a separator between the editing items, if needed\n const isFirstEditingMenuItem =\n tableMeta.editing?.isEditing &&\n tableMeta.editing?.showEditingActions &&\n actionsInMenu.length > 2 &&\n i === actionsInMenu.length - 2;\n\n if (isFirstEditingMenuItem) {\n return (\n <React.Fragment key={key}>\n <Menu.Separator />\n {item}\n </React.Fragment>\n );\n }\n\n return item;\n })}\n </Menu.Content>\n </Menu>\n )}\n />\n ) : null}\n </span>\n );\n}\n\nfunction Header() {\n return null;\n}\n\nconst Cell = React.memo(function MemoedCell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { row, table } = context;\n const { hideRowActions, isHovered, rowIndex } = React.useContext(RowContext);\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const actions = tableMeta.rowActions.rowActions;\n const actionsLength = tableMeta.rowActions.rowActionsLength;\n\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const isResizingColumn = !!table.getState().columnSizingInfo.isResizingColumn;\n const isHoverStatePaused = tableMeta.rowActive.isHoverStatePaused;\n const isRowGrouped = row.getIsGrouped();\n\n if (\n !hideRowActions &&\n !isRowGrouped &&\n hasRowActions(actions) &&\n (isActiveRow || (isHovered && !isHoverStatePaused && !isResizingColumn))\n ) {\n return (\n <Actions<TType>\n actions={actions}\n actionsLength={actionsLength}\n data={row.original}\n isActiveRow={isActiveRow}\n rowId={row.id}\n table={table}\n />\n );\n }\n\n return null;\n}) as <TType = unknown>(context: ReactTableCellContext<TType, unknown>) => React.JSX.Element;\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n meta: {\n align: 'right',\n className: cn(\n 'right-0 overflow-hidden !px-0 !pr-1 print:opacity-0 [table_&]:group-[[data-row-active=\"true\"]]/row:sticky',\n 'group-[[data-row-active=\"true\"][data-selected=\"false\"]]/row:text-gray-200',\n 'group-[[data-row-selected=\"true\"]]/row:text-blue-100',\n 'group-[[data-row-selected=\"false\"]:hover]/row:text-gray-100',\n 'shadow-[-6px_0px_6px_var(--table-row-actions-shadow)]'\n ),\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n },\n};\n"],"names":["LegacyIconButton","useLocalization","Shortcut","Menu","RowContext","hasRowActions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Actions.cjs","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Actions.tsx"],"sourcesContent":["import type {\n Table as ReactTable,\n CellContext as ReactTableCellContext,\n TableMeta as ReactTableMeta,\n} from '@tanstack/react-table';\nimport cn from 'clsx';\nimport React from 'react';\n\nimport { LegacyIconButton, Menu, Shortcut, useLocalization } from '@/components';\n\nimport type { TableRowActionConfig, TableRowActionConfigRenderer, TableRowActionRenderer } from '../../../../types';\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { hasRowActions } from '../../../../useTableManager/util/rowActions';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction renderRowActionConfig<TArg>(config: TableRowActionConfig<TArg>, arg: TArg) {\n const dataAttributes = config.data\n ? Object.fromEntries(\n Object.entries(config.data).map(([key, value]) => [key.startsWith('data-') ? key : `data-${key}`, value])\n )\n : undefined;\n\n return (\n <LegacyIconButton\n key={config.key}\n aria-label={config.name}\n tooltip={config.tooltip}\n icon={config.icon}\n disabled={config.disabled}\n shortcut={config.shortcut}\n onClick={event => config.onClick(arg, event)}\n {...dataAttributes}\n />\n );\n}\n\nexport type ActionsProps<TType = unknown> = {\n actions: TableRowActionRenderer<TType>[] | TableRowActionConfigRenderer<TType>;\n actionsLength: number;\n data: any;\n isActiveRow: boolean;\n rowId: string;\n table: ReactTable<TType>;\n};\nexport function Actions<TType = unknown>(props: ActionsProps<TType>) {\n const { actions, actionsLength, data, isActiveRow, rowId, table } = props;\n const { texts } = useLocalization();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n // we don't want to document passing rowId and table, so it isn't on the type\n const helpers = {\n rowId,\n table,\n } as any;\n\n if (tableMeta.editing?.isEnabled) {\n const lastFocusedCellIndex = tableMeta.editing.lastFocusedCellIndex;\n\n helpers.editing = {\n isEditing: tableMeta.editing?.isEditing ?? false,\n // cells stamp their visible index (data-cell-index), so the visible leaf column at that index is the focused column\n lastFocusedCellId:\n lastFocusedCellIndex === undefined ? undefined : table.getVisibleLeafColumns()[lastFocusedCellIndex]?.id,\n removeRowChanges: () => tableMeta.editing.discardChanges(rowId, table),\n save: () => tableMeta.editing.saveChanges(table, rowId),\n };\n }\n\n // a config-style function returns the row's whole list; Table3 may append its editing actions as ready elements\n const resolvedActions: (React.JSX.Element | TableRowActionConfig<TType> | null)[] = Array.isArray(actions)\n ? actions.map(action => action(data, helpers))\n : actions(data, helpers);\n\n const visibleActions = resolvedActions\n .filter(result => !!result)\n // Cast: TS can't narrow a generic-parameterized union in the negated branch of a type guard\n .map(result =>\n React.isValidElement<any>(result) ? result : renderRowActionConfig(result as TableRowActionConfig<TType>, data)\n );\n\n let length = actionsLength;\n\n // always force the editing actions into a menu when present -- editing is undefined in Report\n if (tableMeta.editing?.isEditing && tableMeta.editing?.showEditingActions) {\n // When editing actions are enabled, there are always 2 editing actions (save and discard)\n // The menu button replaces one of them, so subtract 1\n const lengthWithoutEditingItems = visibleActions.length - 1;\n\n if (lengthWithoutEditingItems < actionsLength) {\n length = lengthWithoutEditingItems;\n }\n }\n\n const handleMenuButtonKeyDown = (event: React.KeyboardEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n const isLastRowActive = tableMeta.rowActive.rowActiveIndex === tableMeta.length - 1;\n\n // normally we handle this on change of active row, but when tabbing out of the last row the active row state stays on the last one\n if (event.key === 'Tab' && isLastRowActive && tableMeta.editing?.isEditing && tableMeta.editing?.hasChanges()) {\n tableMeta.editing.saveChanges(table);\n }\n };\n\n const handleMenuContentKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.stopPropagation();\n }\n };\n\n const actionsOnRow = visibleActions.length === length ? visibleActions : visibleActions.slice(0, length - 1);\n const actionsInMenu = visibleActions.slice(visibleActions.length === length ? length : length - 1);\n\n const className = cn('flex justify-end bg-[inherit] text-right print:hidden');\n\n return (\n <span className={className}>\n {actionsOnRow.map((button, index) => {\n const tooltip = String(button.props.tooltip ?? button.props['aria-label'] ?? '');\n\n return React.cloneElement(button, {\n appearance: 'transparent',\n // config-rendered buttons carry their stable config key; legacy slots fall back to the index\n key: button.key ?? index,\n tabIndex: isActiveRow ? 0 : -1,\n tooltip: button.props.shortcut ? (\n <>\n {tooltip}\n <Shortcut className=\"ml-2\" keys={button.props.shortcut} />\n </>\n ) : (\n tooltip\n ),\n });\n })}\n {actionsInMenu.length ? (\n <LegacyIconButton\n appearance=\"transparent\"\n aria-label={texts.table.columns.actions.tooltip}\n icon=\"more\"\n onKeyDown={handleMenuButtonKeyDown}\n tabIndex={isActiveRow ? 0 : -1}\n menu={menuProps => (\n <Menu {...menuProps}>\n <Menu.Content onKeyDown={handleMenuContentKeyDown}>\n {actionsInMenu.map((action, i) => {\n const key = action.key ?? i;\n const item = (\n <Menu.Item key={key} {...action.props} shortcut={action.props.shortcut}>\n {action.props['aria-label']}\n </Menu.Item>\n );\n\n // add a separator between the editing items, if needed\n const isFirstEditingMenuItem =\n tableMeta.editing?.isEditing &&\n tableMeta.editing?.showEditingActions &&\n actionsInMenu.length > 2 &&\n i === actionsInMenu.length - 2;\n\n if (isFirstEditingMenuItem) {\n return (\n <React.Fragment key={key}>\n <Menu.Separator />\n {item}\n </React.Fragment>\n );\n }\n\n return item;\n })}\n </Menu.Content>\n </Menu>\n )}\n />\n ) : null}\n </span>\n );\n}\n\nfunction Header() {\n return null;\n}\n\nconst Cell = React.memo(function MemoedCell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { row, table } = context;\n const { hideRowActions, isHovered, rowIndex } = React.useContext(RowContext);\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const actions = tableMeta.rowActions.rowActions;\n const actionsLength = tableMeta.rowActions.rowActionsLength;\n\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const isResizingColumn = !!table.getState().columnSizingInfo.isResizingColumn;\n const isHoverStatePaused = tableMeta.rowActive.isHoverStatePaused;\n const isRowGrouped = row.getIsGrouped();\n\n if (\n !hideRowActions &&\n !isRowGrouped &&\n hasRowActions(actions) &&\n (isActiveRow || (isHovered && !isHoverStatePaused && !isResizingColumn))\n ) {\n return (\n <Actions<TType>\n actions={actions}\n actionsLength={actionsLength}\n data={row.original}\n isActiveRow={isActiveRow}\n rowId={row.id}\n table={table}\n />\n );\n }\n\n return null;\n}) as <TType = unknown>(context: ReactTableCellContext<TType, unknown>) => React.JSX.Element;\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n meta: {\n align: 'right',\n className: cn(\n 'right-0 overflow-hidden !px-0 !pr-1 print:opacity-0 [table_&]:group-[[data-row-active=\"true\"]]/row:sticky',\n 'group-[[data-row-active=\"true\"][data-selected=\"false\"]]/row:text-gray-200',\n 'group-[[data-row-selected=\"true\"]]/row:text-blue-100',\n 'group-[[data-row-selected=\"false\"]:hover]/row:text-gray-100',\n 'shadow-[-6px_0px_6px_var(--table-row-actions-shadow)]'\n ),\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n },\n};\n"],"names":["LegacyIconButton","useLocalization","Shortcut","Menu","RowContext","hasRowActions"],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import cn from "clsx";
|
|
2
2
|
import React__default from "react";
|
|
3
|
-
import { hasRowActions } from "../../../../useTableManager/
|
|
3
|
+
import { hasRowActions } from "../../../../useTableManager/util/rowActions.js";
|
|
4
4
|
import { RowContext } from "../../Row/RowContext.js";
|
|
5
5
|
import { useLocalization } from "../../../../../../components/Provider/Localization.js";
|
|
6
6
|
import { Shortcut } from "../../../../../../components/Shortcut/Shortcut.js";
|
|
7
7
|
import { LegacyIconButton } from "../../../../../../components/LegacyComponents/IconButton/IconButton.js";
|
|
8
8
|
import { Menu } from "../../../../../../components/Menu/Menu.js";
|
|
9
9
|
function renderRowActionConfig(config, arg) {
|
|
10
|
+
const dataAttributes = config.data ? Object.fromEntries(
|
|
11
|
+
Object.entries(config.data).map(([key, value]) => [key.startsWith("data-") ? key : `data-${key}`, value])
|
|
12
|
+
) : void 0;
|
|
10
13
|
return /* @__PURE__ */ React__default.createElement(
|
|
11
14
|
LegacyIconButton,
|
|
12
15
|
{
|
|
@@ -16,7 +19,8 @@ function renderRowActionConfig(config, arg) {
|
|
|
16
19
|
icon: config.icon,
|
|
17
20
|
disabled: config.disabled,
|
|
18
21
|
shortcut: config.shortcut,
|
|
19
|
-
onClick: (event) => config.onClick(arg, event)
|
|
22
|
+
onClick: (event) => config.onClick(arg, event),
|
|
23
|
+
...dataAttributes
|
|
20
24
|
}
|
|
21
25
|
);
|
|
22
26
|
}
|
|
@@ -29,14 +33,17 @@ function Actions(props) {
|
|
|
29
33
|
table
|
|
30
34
|
};
|
|
31
35
|
if (tableMeta.editing?.isEnabled) {
|
|
36
|
+
const lastFocusedCellIndex = tableMeta.editing.lastFocusedCellIndex;
|
|
32
37
|
helpers.editing = {
|
|
33
38
|
isEditing: tableMeta.editing?.isEditing ?? false,
|
|
39
|
+
// cells stamp their visible index (data-cell-index), so the visible leaf column at that index is the focused column
|
|
40
|
+
lastFocusedCellId: lastFocusedCellIndex === void 0 ? void 0 : table.getVisibleLeafColumns()[lastFocusedCellIndex]?.id,
|
|
34
41
|
removeRowChanges: () => tableMeta.editing.discardChanges(rowId, table),
|
|
35
42
|
save: () => tableMeta.editing.saveChanges(table, rowId)
|
|
36
43
|
};
|
|
37
44
|
}
|
|
38
|
-
const
|
|
39
|
-
const visibleActions =
|
|
45
|
+
const resolvedActions = Array.isArray(actions) ? actions.map((action) => action(data, helpers)) : actions(data, helpers);
|
|
46
|
+
const visibleActions = resolvedActions.filter((result) => !!result).map(
|
|
40
47
|
(result) => React__default.isValidElement(result) ? result : renderRowActionConfig(result, data)
|
|
41
48
|
);
|
|
42
49
|
let length = actionsLength;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Actions.tsx"],"sourcesContent":["import type {\n Table as ReactTable,\n CellContext as ReactTableCellContext,\n TableMeta as ReactTableMeta,\n} from '@tanstack/react-table';\nimport cn from 'clsx';\nimport React from 'react';\n\nimport { LegacyIconButton, Menu, Shortcut, useLocalization } from '@/components';\n\nimport type { TableRowActionConfig, TableRowActionConfigRenderer, TableRowActionRenderer } from '../../../../types';\nimport { hasRowActions } from '../../../../useTableManager/features/useTableRowActions';\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction renderRowActionConfig<TArg>(config: TableRowActionConfig<TArg>, arg: TArg) {\n return (\n <LegacyIconButton\n key={config.key}\n aria-label={config.name}\n tooltip={config.tooltip}\n icon={config.icon}\n disabled={config.disabled}\n shortcut={config.shortcut}\n onClick={event => config.onClick(arg, event)}\n />\n );\n}\n\nexport type ActionsProps<TType = unknown> = {\n actions: TableRowActionRenderer<TType>[] | TableRowActionConfigRenderer<TType>;\n actionsLength: number;\n data: any;\n isActiveRow: boolean;\n rowId: string;\n table: ReactTable<TType>;\n};\nexport function Actions<TType = unknown>(props: ActionsProps<TType>) {\n const { actions, actionsLength, data, isActiveRow, rowId, table } = props;\n const { texts } = useLocalization();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n // we don't want to document passing rowId and table, so it isn't on the type\n const helpers = {\n rowId,\n table,\n } as any;\n\n if (tableMeta.editing?.isEnabled) {\n helpers.editing = {\n isEditing: tableMeta.editing?.isEditing ?? false,\n removeRowChanges: () => tableMeta.editing.discardChanges(rowId, table),\n save: () => tableMeta.editing.saveChanges(table, rowId),\n };\n }\n\n // a config-style function returns the row's whole list; Table3 may append its editing actions as ready elements\n const results: (React.JSX.Element | TableRowActionConfig<TType> | null)[] = Array.isArray(actions)\n ? actions.map(action => action(data, helpers))\n : actions(data, helpers);\n\n const visibleActions = results\n .filter(result => !!result)\n // Cast: TS can't narrow a generic-parameterized union in the negated branch of a type guard\n .map(result =>\n React.isValidElement<any>(result) ? result : renderRowActionConfig(result as TableRowActionConfig<TType>, data)\n );\n\n let length = actionsLength;\n\n // always force the editing actions into a menu when present -- editing is undefined in Report\n if (tableMeta.editing?.isEditing && tableMeta.editing?.showEditingActions) {\n // When editing actions are enabled, there are always 2 editing actions (save and discard)\n // The menu button replaces one of them, so subtract 1\n const lengthWithoutEditingItems = visibleActions.length - 1;\n\n if (lengthWithoutEditingItems < actionsLength) {\n length = lengthWithoutEditingItems;\n }\n }\n\n const handleMenuButtonKeyDown = (event: React.KeyboardEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n const isLastRowActive = tableMeta.rowActive.rowActiveIndex === tableMeta.length - 1;\n\n // normally we handle this on change of active row, but when tabbing out of the last row the active row state stays on the last one\n if (event.key === 'Tab' && isLastRowActive && tableMeta.editing?.isEditing && tableMeta.editing?.hasChanges()) {\n tableMeta.editing.saveChanges(table);\n }\n };\n\n const handleMenuContentKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.stopPropagation();\n }\n };\n\n const actionsOnRow = visibleActions.length === length ? visibleActions : visibleActions.slice(0, length - 1);\n const actionsInMenu = visibleActions.slice(visibleActions.length === length ? length : length - 1);\n\n const className = cn('flex justify-end bg-[inherit] text-right print:hidden');\n\n return (\n <span className={className}>\n {actionsOnRow.map((button, index) => {\n const tooltip = String(button.props.tooltip ?? button.props['aria-label'] ?? '');\n\n return React.cloneElement(button, {\n appearance: 'transparent',\n // config-rendered buttons carry their stable config key; legacy slots fall back to the index\n key: button.key ?? index,\n tabIndex: isActiveRow ? 0 : -1,\n tooltip: button.props.shortcut ? (\n <>\n {tooltip}\n <Shortcut className=\"ml-2\" keys={button.props.shortcut} />\n </>\n ) : (\n tooltip\n ),\n });\n })}\n {actionsInMenu.length ? (\n <LegacyIconButton\n appearance=\"transparent\"\n aria-label={texts.table.columns.actions.tooltip}\n icon=\"more\"\n onKeyDown={handleMenuButtonKeyDown}\n tabIndex={isActiveRow ? 0 : -1}\n menu={menuProps => (\n <Menu {...menuProps}>\n <Menu.Content onKeyDown={handleMenuContentKeyDown}>\n {actionsInMenu.map((action, i) => {\n const key = action.key ?? i;\n const item = (\n <Menu.Item key={key} {...action.props} shortcut={action.props.shortcut}>\n {action.props['aria-label']}\n </Menu.Item>\n );\n\n // add a separator between the editing items, if needed\n const isFirstEditingMenuItem =\n tableMeta.editing?.isEditing &&\n tableMeta.editing?.showEditingActions &&\n actionsInMenu.length > 2 &&\n i === actionsInMenu.length - 2;\n\n if (isFirstEditingMenuItem) {\n return (\n <React.Fragment key={key}>\n <Menu.Separator />\n {item}\n </React.Fragment>\n );\n }\n\n return item;\n })}\n </Menu.Content>\n </Menu>\n )}\n />\n ) : null}\n </span>\n );\n}\n\nfunction Header() {\n return null;\n}\n\nconst Cell = React.memo(function MemoedCell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { row, table } = context;\n const { hideRowActions, isHovered, rowIndex } = React.useContext(RowContext);\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const actions = tableMeta.rowActions.rowActions;\n const actionsLength = tableMeta.rowActions.rowActionsLength;\n\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const isResizingColumn = !!table.getState().columnSizingInfo.isResizingColumn;\n const isHoverStatePaused = tableMeta.rowActive.isHoverStatePaused;\n const isRowGrouped = row.getIsGrouped();\n\n if (\n !hideRowActions &&\n !isRowGrouped &&\n hasRowActions(actions) &&\n (isActiveRow || (isHovered && !isHoverStatePaused && !isResizingColumn))\n ) {\n return (\n <Actions<TType>\n actions={actions}\n actionsLength={actionsLength}\n data={row.original}\n isActiveRow={isActiveRow}\n rowId={row.id}\n table={table}\n />\n );\n }\n\n return null;\n}) as <TType = unknown>(context: ReactTableCellContext<TType, unknown>) => React.JSX.Element;\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n meta: {\n align: 'right',\n className: cn(\n 'right-0 overflow-hidden !px-0 !pr-1 print:opacity-0 [table_&]:group-[[data-row-active=\"true\"]]/row:sticky',\n 'group-[[data-row-active=\"true\"][data-selected=\"false\"]]/row:text-gray-200',\n 'group-[[data-row-selected=\"true\"]]/row:text-blue-100',\n 'group-[[data-row-selected=\"false\"]:hover]/row:text-gray-100',\n 'shadow-[-6px_0px_6px_var(--table-row-actions-shadow)]'\n ),\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n },\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../../../../../src/primitives/Table/Core/components/Columns/Internal/Actions.tsx"],"sourcesContent":["import type {\n Table as ReactTable,\n CellContext as ReactTableCellContext,\n TableMeta as ReactTableMeta,\n} from '@tanstack/react-table';\nimport cn from 'clsx';\nimport React from 'react';\n\nimport { LegacyIconButton, Menu, Shortcut, useLocalization } from '@/components';\n\nimport type { TableRowActionConfig, TableRowActionConfigRenderer, TableRowActionRenderer } from '../../../../types';\nimport type { useTableManagerInternalColumn } from '../../../../useTableManager/types';\nimport { hasRowActions } from '../../../../useTableManager/util/rowActions';\nimport { RowContext } from '../../Row/RowContext';\n\nfunction renderRowActionConfig<TArg>(config: TableRowActionConfig<TArg>, arg: TArg) {\n const dataAttributes = config.data\n ? Object.fromEntries(\n Object.entries(config.data).map(([key, value]) => [key.startsWith('data-') ? key : `data-${key}`, value])\n )\n : undefined;\n\n return (\n <LegacyIconButton\n key={config.key}\n aria-label={config.name}\n tooltip={config.tooltip}\n icon={config.icon}\n disabled={config.disabled}\n shortcut={config.shortcut}\n onClick={event => config.onClick(arg, event)}\n {...dataAttributes}\n />\n );\n}\n\nexport type ActionsProps<TType = unknown> = {\n actions: TableRowActionRenderer<TType>[] | TableRowActionConfigRenderer<TType>;\n actionsLength: number;\n data: any;\n isActiveRow: boolean;\n rowId: string;\n table: ReactTable<TType>;\n};\nexport function Actions<TType = unknown>(props: ActionsProps<TType>) {\n const { actions, actionsLength, data, isActiveRow, rowId, table } = props;\n const { texts } = useLocalization();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n // we don't want to document passing rowId and table, so it isn't on the type\n const helpers = {\n rowId,\n table,\n } as any;\n\n if (tableMeta.editing?.isEnabled) {\n const lastFocusedCellIndex = tableMeta.editing.lastFocusedCellIndex;\n\n helpers.editing = {\n isEditing: tableMeta.editing?.isEditing ?? false,\n // cells stamp their visible index (data-cell-index), so the visible leaf column at that index is the focused column\n lastFocusedCellId:\n lastFocusedCellIndex === undefined ? undefined : table.getVisibleLeafColumns()[lastFocusedCellIndex]?.id,\n removeRowChanges: () => tableMeta.editing.discardChanges(rowId, table),\n save: () => tableMeta.editing.saveChanges(table, rowId),\n };\n }\n\n // a config-style function returns the row's whole list; Table3 may append its editing actions as ready elements\n const resolvedActions: (React.JSX.Element | TableRowActionConfig<TType> | null)[] = Array.isArray(actions)\n ? actions.map(action => action(data, helpers))\n : actions(data, helpers);\n\n const visibleActions = resolvedActions\n .filter(result => !!result)\n // Cast: TS can't narrow a generic-parameterized union in the negated branch of a type guard\n .map(result =>\n React.isValidElement<any>(result) ? result : renderRowActionConfig(result as TableRowActionConfig<TType>, data)\n );\n\n let length = actionsLength;\n\n // always force the editing actions into a menu when present -- editing is undefined in Report\n if (tableMeta.editing?.isEditing && tableMeta.editing?.showEditingActions) {\n // When editing actions are enabled, there are always 2 editing actions (save and discard)\n // The menu button replaces one of them, so subtract 1\n const lengthWithoutEditingItems = visibleActions.length - 1;\n\n if (lengthWithoutEditingItems < actionsLength) {\n length = lengthWithoutEditingItems;\n }\n }\n\n const handleMenuButtonKeyDown = (event: React.KeyboardEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n const isLastRowActive = tableMeta.rowActive.rowActiveIndex === tableMeta.length - 1;\n\n // normally we handle this on change of active row, but when tabbing out of the last row the active row state stays on the last one\n if (event.key === 'Tab' && isLastRowActive && tableMeta.editing?.isEditing && tableMeta.editing?.hasChanges()) {\n tableMeta.editing.saveChanges(table);\n }\n };\n\n const handleMenuContentKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.stopPropagation();\n }\n };\n\n const actionsOnRow = visibleActions.length === length ? visibleActions : visibleActions.slice(0, length - 1);\n const actionsInMenu = visibleActions.slice(visibleActions.length === length ? length : length - 1);\n\n const className = cn('flex justify-end bg-[inherit] text-right print:hidden');\n\n return (\n <span className={className}>\n {actionsOnRow.map((button, index) => {\n const tooltip = String(button.props.tooltip ?? button.props['aria-label'] ?? '');\n\n return React.cloneElement(button, {\n appearance: 'transparent',\n // config-rendered buttons carry their stable config key; legacy slots fall back to the index\n key: button.key ?? index,\n tabIndex: isActiveRow ? 0 : -1,\n tooltip: button.props.shortcut ? (\n <>\n {tooltip}\n <Shortcut className=\"ml-2\" keys={button.props.shortcut} />\n </>\n ) : (\n tooltip\n ),\n });\n })}\n {actionsInMenu.length ? (\n <LegacyIconButton\n appearance=\"transparent\"\n aria-label={texts.table.columns.actions.tooltip}\n icon=\"more\"\n onKeyDown={handleMenuButtonKeyDown}\n tabIndex={isActiveRow ? 0 : -1}\n menu={menuProps => (\n <Menu {...menuProps}>\n <Menu.Content onKeyDown={handleMenuContentKeyDown}>\n {actionsInMenu.map((action, i) => {\n const key = action.key ?? i;\n const item = (\n <Menu.Item key={key} {...action.props} shortcut={action.props.shortcut}>\n {action.props['aria-label']}\n </Menu.Item>\n );\n\n // add a separator between the editing items, if needed\n const isFirstEditingMenuItem =\n tableMeta.editing?.isEditing &&\n tableMeta.editing?.showEditingActions &&\n actionsInMenu.length > 2 &&\n i === actionsInMenu.length - 2;\n\n if (isFirstEditingMenuItem) {\n return (\n <React.Fragment key={key}>\n <Menu.Separator />\n {item}\n </React.Fragment>\n );\n }\n\n return item;\n })}\n </Menu.Content>\n </Menu>\n )}\n />\n ) : null}\n </span>\n );\n}\n\nfunction Header() {\n return null;\n}\n\nconst Cell = React.memo(function MemoedCell<TType = unknown>(context: ReactTableCellContext<TType, unknown>) {\n const { row, table } = context;\n const { hideRowActions, isHovered, rowIndex } = React.useContext(RowContext);\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const actions = tableMeta.rowActions.rowActions;\n const actionsLength = tableMeta.rowActions.rowActionsLength;\n\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const isResizingColumn = !!table.getState().columnSizingInfo.isResizingColumn;\n const isHoverStatePaused = tableMeta.rowActive.isHoverStatePaused;\n const isRowGrouped = row.getIsGrouped();\n\n if (\n !hideRowActions &&\n !isRowGrouped &&\n hasRowActions(actions) &&\n (isActiveRow || (isHovered && !isHoverStatePaused && !isResizingColumn))\n ) {\n return (\n <Actions<TType>\n actions={actions}\n actionsLength={actionsLength}\n data={row.original}\n isActiveRow={isActiveRow}\n rowId={row.id}\n table={table}\n />\n );\n }\n\n return null;\n}) as <TType = unknown>(context: ReactTableCellContext<TType, unknown>) => React.JSX.Element;\n\nexport const renderer: useTableManagerInternalColumn = {\n header: Header,\n renderer: Cell,\n meta: {\n align: 'right',\n className: cn(\n 'right-0 overflow-hidden !px-0 !pr-1 print:opacity-0 [table_&]:group-[[data-row-active=\"true\"]]/row:sticky',\n 'group-[[data-row-active=\"true\"][data-selected=\"false\"]]/row:text-gray-200',\n 'group-[[data-row-selected=\"true\"]]/row:text-blue-100',\n 'group-[[data-row-selected=\"false\"]:hover]/row:text-gray-100',\n 'shadow-[-6px_0px_6px_var(--table-row-actions-shadow)]'\n ),\n // TODO: remove when table3 is migrated, this satisfies the legacy table3 type\n enableSearch: false,\n header: '',\n },\n};\n"],"names":["React"],"mappings":";;;;;;;;AAeA,SAAS,sBAA4B,QAAoC,KAAW;AAChF,QAAM,iBAAiB,OAAO,OACxB,OAAO;AAAA,IACH,OAAO,QAAQ,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,WAAW,OAAO,IAAI,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC;AAAA,EAAA,IAE5G;AAEN,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAK,OAAO;AAAA,MACZ,cAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,SAAS,CAAA,UAAS,OAAO,QAAQ,KAAK,KAAK;AAAA,MAC1C,GAAG;AAAA,IAAA;AAAA,EAAA;AAGhB;AAUO,SAAS,QAAyB,OAA4B;AACjE,QAAM,EAAE,SAAS,eAAe,MAAM,aAAa,OAAO,UAAU;AACpE,QAAM,EAAE,MAAA,IAAU,gBAAA;AAClB,QAAM,YAAY,MAAM,QAAQ;AAGhC,QAAM,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,EAAA;AAGJ,MAAI,UAAU,SAAS,WAAW;AAC9B,UAAM,uBAAuB,UAAU,QAAQ;AAE/C,YAAQ,UAAU;AAAA,MACd,WAAW,UAAU,SAAS,aAAa;AAAA;AAAA,MAE3C,mBACI,yBAAyB,SAAY,SAAY,MAAM,sBAAA,EAAwB,oBAAoB,GAAG;AAAA,MAC1G,kBAAkB,MAAM,UAAU,QAAQ,eAAe,OAAO,KAAK;AAAA,MACrE,MAAM,MAAM,UAAU,QAAQ,YAAY,OAAO,KAAK;AAAA,IAAA;AAAA,EAE9D;AAGA,QAAM,kBAA8E,MAAM,QAAQ,OAAO,IACnG,QAAQ,IAAI,CAAA,WAAU,OAAO,MAAM,OAAO,CAAC,IAC3C,QAAQ,MAAM,OAAO;AAE3B,QAAM,iBAAiB,gBAClB,OAAO,YAAU,CAAC,CAAC,MAAM,EAEzB;AAAA,IAAI,CAAA,WACDA,eAAM,eAAoB,MAAM,IAAI,SAAS,sBAAsB,QAAuC,IAAI;AAAA,EAAA;AAGtH,MAAI,SAAS;AAGb,MAAI,UAAU,SAAS,aAAa,UAAU,SAAS,oBAAoB;AAGvE,UAAM,4BAA4B,eAAe,SAAS;AAE1D,QAAI,4BAA4B,eAAe;AAC3C,eAAS;AAAA,IACb;AAAA,EACJ;AAEA,QAAM,0BAA0B,CAAC,UAAsE;AACnG,UAAM,kBAAkB,UAAU,UAAU,mBAAmB,UAAU,SAAS;AAGlF,QAAI,MAAM,QAAQ,SAAS,mBAAmB,UAAU,SAAS,aAAa,UAAU,SAAS,WAAA,GAAc;AAC3G,gBAAU,QAAQ,YAAY,KAAK;AAAA,IACvC;AAAA,EACJ;AAEA,QAAM,2BAA2B,CAAC,UAA+C;AAC7E,QAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,cAAc;AACzD,YAAM,gBAAA;AAAA,IACV;AAAA,EACJ;AAEA,QAAM,eAAe,eAAe,WAAW,SAAS,iBAAiB,eAAe,MAAM,GAAG,SAAS,CAAC;AAC3G,QAAM,gBAAgB,eAAe,MAAM,eAAe,WAAW,SAAS,SAAS,SAAS,CAAC;AAEjG,QAAM,YAAY,GAAG,uDAAuD;AAE5E,sDACK,QAAA,EAAK,aACD,aAAa,IAAI,CAAC,QAAQ,UAAU;AACjC,UAAM,UAAU,OAAO,OAAO,MAAM,WAAW,OAAO,MAAM,YAAY,KAAK,EAAE;AAE/E,WAAOA,eAAM,aAAa,QAAQ;AAAA,MAC9B,YAAY;AAAA;AAAA,MAEZ,KAAK,OAAO,OAAO;AAAA,MACnB,UAAU,cAAc,IAAI;AAAA,MAC5B,SAAS,OAAO,MAAM,uFAEb,SACDA,+BAAA,cAAC,UAAA,EAAS,WAAU,QAAO,MAAM,OAAO,MAAM,SAAA,CAAU,CAC5D,IAEA;AAAA,IAAA,CAEP;AAAA,EACL,CAAC,GACA,cAAc,SACXA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,YAAW;AAAA,MACX,cAAY,MAAM,MAAM,QAAQ,QAAQ;AAAA,MACxC,MAAK;AAAA,MACL,WAAW;AAAA,MACX,UAAU,cAAc,IAAI;AAAA,MAC5B,MAAM,CAAA,cACFA,+BAAA,cAAC,MAAA,EAAM,GAAG,aACNA,+BAAA,cAAC,KAAK,SAAL,EAAa,WAAW,yBAAA,GACpB,cAAc,IAAI,CAAC,QAAQ,MAAM;AAC9B,cAAM,MAAM,OAAO,OAAO;AAC1B,cAAM,OACFA,+BAAA,cAAC,KAAK,MAAL,EAAU,KAAW,GAAG,OAAO,OAAO,UAAU,OAAO,MAAM,SAAA,GACzD,OAAO,MAAM,YAAY,CAC9B;AAIJ,cAAM,yBACF,UAAU,SAAS,aACnB,UAAU,SAAS,sBACnB,cAAc,SAAS,KACvB,MAAM,cAAc,SAAS;AAEjC,YAAI,wBAAwB;AACxB,iBACIA,+BAAA,cAACA,eAAM,UAAN,EAAe,IAAA,gDACX,KAAK,WAAL,IAAe,GACf,IACL;AAAA,QAER;AAEA,eAAO;AAAA,MACX,CAAC,CACL,CACJ;AAAA,IAAA;AAAA,EAAA,IAGR,IACR;AAER;AAEA,SAAS,SAAS;AACd,SAAO;AACX;AAEA,MAAM,OAAOA,eAAM,KAAK,SAAS,WAA4B,SAAgD;AACzG,QAAM,EAAE,KAAK,MAAA,IAAU;AACvB,QAAM,EAAE,gBAAgB,WAAW,aAAaA,eAAM,WAAW,UAAU;AAC3E,QAAM,YAAY,MAAM,QAAQ;AAEhC,QAAM,UAAU,UAAU,WAAW;AACrC,QAAM,gBAAgB,UAAU,WAAW;AAE3C,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,mBAAmB,CAAC,CAAC,MAAM,SAAA,EAAW,iBAAiB;AAC7D,QAAM,qBAAqB,UAAU,UAAU;AAC/C,QAAM,eAAe,IAAI,aAAA;AAEzB,MACI,CAAC,kBACD,CAAC,gBACD,cAAc,OAAO,MACpB,eAAgB,aAAa,CAAC,sBAAsB,CAAC,mBACxD;AACE,WACIA,+BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA,MAAM,IAAI;AAAA,QACV;AAAA,QACA,OAAO,IAAI;AAAA,QACX;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AAEA,SAAO;AACX,CAAC;AAEM,MAAM,WAA0C;AAAA,EACnD,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,IACF,OAAO;AAAA,IACP,WAAW;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA;AAAA,IAGJ,cAAc;AAAA,IACd,QAAQ;AAAA,EAAA;AAEhB;"}
|