@economic/taco 14.1.0-EC-86083-poc-array-return.0 → 14.1.0-EC-86083-poc-array-return.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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
|
@@ -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":";;;;;;;;;;;;AAeO,MAAM,YAAY;AAAA,EACrB,KAAKA,IAAAA;AAAAA,EACL,MAAMC,KAAAA;AACV;AAmBO,SAAS,UAAiB,OAA2B,KAA2B;AACnF,QAAM,EAAE,MAAA,IAAUC,6BAAA;AAClB,QAAM,UAAUC,gBAAAA;AAAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAIV,QAAM,OAAgB,MAAM,QAAQ,MAAM;AACtC,QAAI,QAAQ,cAAc,QAAQ;AAC9B,cAAQ,MAAM,QAAQ,CAAA,GAAI,OAAO,QAAQ,aAAwB;AAAA,IACrE;AAEA,WAAO,MAAM;AAAA,EACjB,GAAG,CAAC,MAAM,MAAM,QAAQ,cAAc,MAAM,CAAC;AAI7C,WAAS,mBAAmB,YAA8C;AAEtE,UAAM,iBAAiB;AAAA,MACnB,CAAC,IAAI,YACD,sBAAA;AAAA,QAACC,WAAAA;AAAAA,QAAA;AAAA,UACG,cAAY,MAAM,OAAO,QAAQ,QAAQ;AAAA,UACzC,MAAK;AAAA,UACL,UAAU,CAAC,QAAQ,WAAW,QAAQ,KAAK,KAAK,QAAQ,aAAa,QAAQ,KAAK;AAAA,UAClF,SAAS,YAAY;AACjB,kBAAM,QAAQ,YAAY,QAAQ,OAAO,QAAQ,KAAK;AAAA,UAC1D;AAAA,QAAA;AAAA,MAAA;AAAA,MAGR,CAAC,IAAI,YACD,sBAAA;AAAA,QAACA,WAAAA;AAAAA,QAAA;AAAA,UACG,cAAY,MAAM,OAAO,QAAQ,QAAQ;AAAA,UACzC,MAAK;AAAA,UACL,UAAU,CAAC,QAAQ,WAAW,QAAQ,KAAK;AAAA,UAC3C,QAAQ,CAAAC,WACJ,sBAAA;AAAA,YAACC,iCAAAA;AAAAA,YAAA;AAAA,cACI,GAAGD;AAAAA,cACJ,WAAW,MAAM;AACb,wBAAQ,eAAe,QAAQ,OAAO,QAAQ,KAAK;AAEnD,oBAAI,QAAQ,cAAc,QAAQ;AAC9B,wCAAsB,MAAM,QAAQ,mBAAmB,SAAS,OAAO;AAAA,gBAC3E;AAAA,cACJ;AAAA,YAAA;AAAA,UAAA;AAAA,QACJ;AAAA,MAAA;AAAA,IAER;AAIR,QAAI,OAAO,eAAe,YAAY;AAElC,cAAQ,CAAC,KAAY,YAA2C;AAAA,QAC5D,GAAG,WAAW,KAAK,OAAO;AAAA,QAC1B,GAAG,eAAe,IAAI,YAAU,OAAO,KAAK,OAAO,CAAC;AAAA,MAAA;AAAA,IAE5D;AAEA,YAAQ,cAAc,IAAI,OAAO,cAAc;AAAA,EACnD;AAEA,QAAM,gBAAoC;AAAA,IACtC,GAAG;AAAA,IACH;AAAA,IACA,kBAAkB,QAAQ,aAAa,MAAM,qBAAqB,OAAO,MAAM;AAAA;AAAA,IAE/E,YACI,QAAQ,aAAa,MAAM,uBAAuB,OAAO,mBAAmB,MAAM,UAAU,IAAI,MAAM;AAAA,EAAA;AAG9G,QAAM,OAAO,EAAE,QAAA;AAIf,QAAM,QAAQE,SAAAA,SAA4B,eAAoC,KAAK,WAAW,IAAI;AAElG,QAAM,gBAAgB,CAAC,YACnB,MAAM,KAAK,QAAQ,cAAc,YAAY,CAAAC,aAAW,CAACA,WAAU,MAAM,UAAU,MAAM,SAAS,aAAa;AAGnH,QAAM,UAAU,MAAM;AAClB,QAAI,MAAM,sBAAsB;AAC5B,oBAAc,IAAI;AAAA,IACtB;AAAA,EACJ,GAAG,CAAA,CAAE;AAGLC,0BAAAA,wBAA+B,MAAM,UAAU,MAAM,KAAK,MAAM,SAAS,aAAa;AAEtF,QAAM,UAAU,MAAM;AAClB,UAAM,WAAW,MAAM,IAAI;AAE3B,QAAI,UAAU;AACV,YAAM,WAAW,SAAS;AAE1B,UAAI,MAAM,KAAK,QAAQ,WAAW;AAC9B,iBAAS,UAAU;AAAA,UACf;AAAA,UACA,kBAAkB,CAAC,UAAkB,MAAM,KAAK,QAAQ,eAAe,OAAO,MAAM,QAAQ;AAAA,UAC5F,MAAM,CAAC,UAAmB,MAAM,KAAK,QAAQ,YAAY,MAAM,UAAU,KAAK;AAAA,QAAA;AAGlF,YAAI,MAAM,mBAAmB,SAAS,SAAS;AAC3C,mBAAS,QAAQ,YAAY,CAAC,QAC1B,MAAM,KAAK,QAAQ,UAAU,MAAM,UAAU,GAAqB;AAAA,QAC1E;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,IAAI,SAAS,MAAM,KAAK,QAAQ,SAAS,CAAC;AAEpD,QAAM,UAAU,MAAM;AAClB,UAAM,WAAW,MAAM,IAAI;AAE3B,QAAI,UAAU;AACV,YAAM,WAAW,SAAS;AAE1B,UAAI,MAAM,KAAK,QAAQ,aAAa,SAAS,SAAS;AAClD,iBAAS,QAAQ,gBAAgB,YAAY,MAAM,MAAM,KAAK,QAAQ,cAAc,MAAM,QAAQ;AAAA,MACtG;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,KAAK,QAAQ,aAAa,CAAC;AAErCC,gBAAAA,cAAc,MAAM;AAChB,QAAI,QAAQ,aAAa,MAAM,cAAc;AACzC,YAAM,aAAa,QAAQ,OAAO;AAAA,IACtC;AAAA,EACJ,GAAG,CAAC,QAAQ,WAAW,QAAQ,SAAS,MAAM,YAAY,CAAC;AAE3D,SAAO;AACX;;;"}
|
|
@@ -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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sources":["../../../src/primitives/Table/types.ts"],"sourcesContent":["import type {\n ColumnFilter as ReactTableColumnFilter,\n ColumnFiltersState as ReactTableColumnFilterState,\n ColumnOrderState as ReactTableColumnOrderState,\n ColumnPinningState as ReactTableColumnPinningState,\n ColumnSort as ReactTableColumnSort,\n ColumnSizingState as ReactTableColumnSizingState,\n VisibilityState as ReactTableColumnVisibilityState,\n SortingState as ReactTableSortingState,\n BuiltInAggregationFn as ReactTableBuiltInAggregationFn,\n BuiltInSortingFn as ReactTableBuiltInSortingFn,\n} from '@tanstack/react-table';\n\nimport type { IconName, MenuItemProps } from '@/components';\nimport type { DotNotationPaths, FontSize, FontSizes, DotNotationPathValue } from '@/types';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\nexport type TableRef = HTMLTableElement & {\n instance: {\n resetFiltering: () => void;\n resetPagination: () => Promise<void>;\n resetRowExpansion: () => void;\n resetRowSelection: () => void;\n resetSorting: () => void;\n };\n};\n\n// filtering\nexport enum TableFilterComparator {\n Contains = 0,\n DoesNotContain = 1,\n IsEqualTo = 2,\n IsNotEqualTo = 3,\n IsGreaterThan = 4,\n IsLessThan = 5,\n IsBetween = 6,\n IsEmpty = 7,\n IsNotEmpty = 8,\n IsLessThanOrEqualTo = 9,\n IsGreaterThanOrEqualTo = 10,\n HasAnyOf = 11,\n HasAllOf = 12,\n HasNoneOf = 13,\n IsOneOf = 14,\n IsNoneOf = 15,\n}\nexport type TableFilterValue = {\n comparator: TableFilterComparator;\n value: any;\n};\nexport type TableFilter = {\n id: string;\n value: TableFilterValue;\n};\n\n// columns\nexport type TableColumnAlignment = 'left' | 'center' | 'right';\nexport type TableColumnClassNameHandler<TType = unknown> = string | ((row: TType) => string | undefined);\nexport type TableColumnDataType =\n // base\n | 'text'\n | 'boolean'\n // dates\n | 'date'\n | 'time'\n | 'datetime'\n // numbers\n | 'number'\n | 'amount'\n | 'percentage';\nexport type TableColumnFilter = ReactTableColumnFilter;\nexport type TableColumnMenu = ((columnId: string) => React.ReactNode | null)[];\nexport type TableColumnRendererArgs<TType, TValue> = TValue extends undefined\n ? { formattedValue: undefined; row: TType; value: undefined }\n : { formattedValue: string; row: TType; value: TValue };\nexport type TableColumnRenderer<TType, TValue = unknown> = (\n args: TableColumnRendererArgs<TType, TValue>\n) => React.JSX.Element | string | number | unknown | null;\nexport type TableColumnRendererAggregate<TType, TValue = unknown> = (\n args: TableColumnRendererArgs<TType, TValue>\n) => React.JSX.Element | string | number | unknown | null;\nexport type TableColumnRendererControl<TType = unknown> =\n | ((props: TableColumnRendererControlProps, row?: TType, filterState?: TableFilter[]) => React.JSX.Element | null)\n | 'datepicker'\n | 'input'\n | 'switch'\n | 'checkbox'\n | 'textarea';\nexport type TableColumnRendererControlProps = {\n className?: string;\n disabled?: boolean;\n fontSize?: FontSize;\n invalid?: boolean;\n onBlur?: (value: any) => void;\n onKeyDown?: React.KeyboardEventHandler;\n onFocus?: React.FocusEventHandler;\n readOnly?: boolean;\n ref: React.Ref<HTMLElement>;\n setValue: (value: any) => void;\n value: any;\n};\nexport type TableColumnRendererHeader = string | React.JSX.Element;\nexport type TableColumnRendererFooter<TType> = (rows: TType[]) => React.JSX.Element | string | number | null;\nexport type TableColumnSort = ReactTableColumnSort;\nexport type TableColumnSortDirection = 'asc' | 'desc';\nexport type TableColumnSortFn<TType = unknown> =\n ((rowA: TType, rowB: TType, columnId: string) => -1 | 0 | 1) | ReactTableBuiltInSortingFn | 'auto';\nexport type TableColumnWidth = number | 'grow';\n\n// rows\nexport type TableRowActionRenderer<TType = unknown> = (\n row: TType,\n helpers: {\n editing?: {\n isEditing: boolean;\n removeRowChanges: () => Promise<void>;\n save: () => Promise<boolean>;\n };\n }\n) => React.JSX.Element | null;\n\nexport type TableRowActionGroupRenderer<TType = unknown> = (rows: TType[]) => React.JSX.Element | null;\n\nexport type TableRowActionConfig<TArg = unknown> = {\n key: string;\n /** aria-label, and the label shown when this action overflows into the \"more\" menu */\n name: string;\n /** Overrides the on-row tooltip text; falls back to `name` when omitted */\n tooltip?: string;\n icon: IconName;\n shortcut?: string | KeyDownHandlerOptions;\n /** Visible but inert -- to hide the action entirely, omit it from the returned array instead */\n disabled?: boolean;\n onClick: (arg: TArg, event: React.MouseEvent) => void;\n};\n// A declarative alternative to an array of renderers: one function computing the whole per-row action\n// list, receiving the same helpers as TableRowActionRenderer\nexport type TableRowActionConfigRenderer<TType = unknown> = (\n row: TType,\n helpers: Parameters<TableRowActionRenderer<TType>>[1]\n) => TableRowActionConfig<TType>[];\nexport type TableRowActionConfigGroupRenderer<TType = unknown> = (rows: TType[]) => TableRowActionConfig<TType[]>[];\n\nexport type TableRowClickHandler<TType = unknown> = (row: TType) => void;\nexport type TableRowDragHandler<TType = unknown> = (\n rows: TType[],\n showPlaceholder: (text: string) => void,\n setDataTransfer: (data: string) => void\n) => void;\nexport type TableRowDropHandler<TType = unknown> = (event: React.DragEvent, row: TType) => void;\nexport type TableRowGotoHandler = (\n column: string,\n query: string,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined\n) => Promise<number>;\nexport type TableRowHeight = 'short' | 'medium' | 'tall' | 'extra-tall';\nexport type TableRowActiveHandler<TType = unknown> = (row: TType | undefined) => void;\nexport type TableRowSelectHandler<TType = unknown> = (rows: TType[], ids: string[]) => void;\nexport type TableRowWithMetaData<TType = unknown> = TType & {\n _meta?: {\n layout?: 'heading' | 'summary' | 'item';\n };\n};\n\n// shortcuts\nexport type TableShortcutHandlerFn<TType = unknown> = (row: TType) => void;\nexport type TableShortcutHandlerObject<TType = unknown> = {\n handler: TableShortcutHandlerFn<TType>;\n meta?: boolean;\n shift?: boolean;\n};\n\n// table\nexport type TableSortHandler = (sorting: TableColumnSort[]) => Promise<void> | void;\nexport type TableFilterHandler = (filters: TableColumnFilter[], hiddenColumns: string[]) => Promise<void> | void;\nexport type TableSearchHandler = (search: string | undefined, hiddenColumns: string[]) => Promise<void> | void;\nexport type TableFontSize = keyof typeof FontSizes;\nexport type TablePreset = 'complex' | 'list' | 'simple';\nexport type TableRowExpansionRenderer<TType = unknown> = (row: TType) => (() => React.JSX.Element) | null;\nexport type TableScrollToIndexHandler = (index: number, options?: { align: 'start' | 'center' | 'end' | 'auto' }) => void;\nexport type TableServerLoadPageHandler = (\n pageIndex: number,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n hiddenColumns: string[],\n search: string | undefined\n) => Promise<void>;\nexport type TableServerLoadAllHandler = (\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n hiddenColumns: string[],\n search: string | undefined\n) => Promise<void>;\n// discards the currently loaded pages and loads the first page again, using the last used\n// sorting, filters, hidden columns and search\nexport type TableServerResetPaginationHandler = () => Promise<void>;\nexport type TableSettingsHandler = (settings: TableSettings) => void | Promise<void>;\nexport type TablePrintSettings = {\n allRows: boolean;\n orientation: 'portrait' | 'landscape';\n size: 'A3' | 'A4' | 'A5' | 'letter' | 'legal';\n splitGroups: boolean;\n};\nexport type TablePrintHandler = (settings: TableSettings, printSettings: TablePrintSettings) => Promise<void>;\nexport type TableShortcuts<TType = unknown> = Record<string, TableShortcutHandlerFn<TType> | TableShortcutHandlerObject<TType>>;\nexport type TableCustomSettingsRenderer = (props: TableSettings) => React.ReactElement<MenuItemProps>[];\nexport type TableEmptyStateReason = 'empty' | 'filtering' | 'searching';\nexport type TableEmptyStateRenderer = (props: { reason: TableEmptyStateReason }) => React.JSX.Element | null;\nexport type TableEvent = 'editing-mode';\nexport type TableEventHandler = (event: TableEvent, data?: object) => void;\n\n// settings\nexport type TableSettings = {\n columnFilters?: ReactTableColumnFilterState;\n columnOrder?: ReactTableColumnOrderState;\n columnPinning?: ReactTableColumnPinningState;\n columnSizing?: ReactTableColumnSizingState;\n columnVisibility?: ReactTableColumnVisibilityState;\n excludeUnmatchedRecordsInSearch?: boolean;\n fontSize?: TableFontSize;\n rowHeight?: TableRowHeight;\n searchQuery?: string;\n sorting?: ReactTableSortingState;\n};\nexport type TableEnableSettingsOptions = {\n columnOrder: boolean;\n columnPinning: boolean;\n columnSizing: boolean;\n columnVisibility: boolean;\n excludeUnmatchedRecordsInSearch: boolean;\n fontSize: boolean;\n grouping: boolean;\n rowHeight: boolean;\n sorting: boolean;\n};\n\n// props\nexport type TableConditionalRowProp<TType = unknown> = boolean | ((row: TType) => boolean);\nexport type TableFeatureProps<TType = unknown> = {\n // react-table built-in\n enableFiltering?: boolean;\n enableSearch?: boolean;\n enableSorting?: boolean;\n enableColumnFreezing?: boolean;\n enableColumnHiding?: boolean;\n enableColumnResizing?: boolean;\n enableRowExpansion?: boolean;\n enableRowExpansionAll?: boolean;\n enableRowSelection?: TableConditionalRowProp<TType>;\n\n // custom -- common between all table types\n enableColumnOrdering?: boolean;\n enableFontSize?: boolean;\n enableFooter?: boolean;\n enablePrinting?: boolean;\n enableRowActions?: boolean;\n enableRowActive?: boolean;\n enableRowClick?: TableConditionalRowProp<TType>;\n enableRowDrag?: boolean;\n enableRowDrop?: boolean;\n enableRowGoto?: boolean;\n enableRowHeight?: boolean;\n enableSaveSettings?: boolean | Partial<TableEnableSettingsOptions>;\n enableSaveSettingsLocally?: boolean;\n};\n\nexport type TableChild = React.JSX.Element | React.JSX.Element[] | boolean | null | undefined;\n\n// Base props\ntype TableCommonBaseProps<TType = unknown> = TableFeatureProps<TType> & {\n children: TableChild | TableChild[];\n data: TType[];\n id: string;\n\n // misc\n customSettings?: TableCustomSettingsRenderer;\n defaultColumnFreezingIndex?: number;\n defaultRowActiveIndex?: number;\n defaultRowGroupColumnId?: keyof TType;\n defaultSettings?: TableSettings;\n emptyState?: TableEmptyStateRenderer;\n enableLocalKeyboardShortcuts?: boolean;\n preset?: TablePreset;\n rowActions?: TableRowActionRenderer<TType>[] | TableRowActionConfigRenderer<TType>;\n rowActionsForGroup?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowActionsLength?: number;\n rowExpansionRenderer?: TableRowExpansionRenderer<TType>;\n shortcuts?: TableShortcuts<TType>;\n toolbarLeft?: React.JSX.Element;\n toolbarRight?: React.JSX.Element;\n toolbarPanel?: React.JSX.Element;\n\n // handlers\n onEvent?: TableEventHandler;\n onRowActive?: TableRowActiveHandler<TType>;\n onRowClick?: TableRowClickHandler<TType>;\n onRowDrag?: TableRowDragHandler<TType>;\n onRowDrop?: TableRowDropHandler<TType>;\n onRowGoto?: TableRowGotoHandler;\n onRowSelect?: TableRowSelectHandler<TType>;\n\n // state change handlers\n onChangeFilter?: TableFilterHandler;\n onChangeSearch?: TableSearchHandler;\n onChangeSettings?: TableSettingsHandler;\n onChangeSort?: TableSortHandler;\n onPrint?: TablePrintHandler;\n};\n\n// Branch 1: Client-side without controlled selection\n// selectedRows is 'never' to force TypeScript to require rowIdentityAccessor when selectedRows is used\ntype TableClientPropsBase<TType = unknown> = TableCommonBaseProps<TType> & {\n length?: never;\n loadAll?: never;\n loadPage?: never;\n pageSize?: never;\n pages?: never;\n resetPagination?: never;\n _experimentalDataLoader2?: never;\n\n rowIdentityAccessor?: keyof TType;\n selectedRows?: never;\n};\n\n// Branch 2: Server-side without controlled selection\ntype TableServerPropsBase<TType = unknown> = TableCommonBaseProps<TType> & {\n length: number | undefined;\n loadAll: TableServerLoadAllHandler;\n loadPage: TableServerLoadPageHandler;\n pageSize?: number;\n pages?: number[];\n resetPagination?: TableServerResetPaginationHandler;\n _experimentalDataLoader2?: boolean;\n\n rowIdentityAccessor?: keyof TType;\n selectedRows?: never;\n};\n\n// Branch 3: Client-side with controlled selection\n// Both rowIdentityAccessor and selectedRows are required\ntype TableClientPropsWithSelection<TType = unknown> = TableCommonBaseProps<TType> & {\n length?: never;\n loadAll?: never;\n loadPage?: never;\n pageSize?: never;\n pages?: never;\n resetPagination?: never;\n _experimentalDataLoader2?: never;\n\n rowIdentityAccessor: keyof TType;\n selectedRows: string[];\n};\n\n// Branch 4: Server-side with controlled selection\n// Both rowIdentityAccessor and selectedRows are required\ntype TableServerPropsWithSelection<TType = unknown> = TableCommonBaseProps<TType> & {\n length: number | undefined;\n loadAll: TableServerLoadAllHandler;\n loadPage: TableServerLoadPageHandler;\n pageSize?: number;\n pages?: number[];\n resetPagination?: TableServerResetPaginationHandler;\n _experimentalDataLoader2?: boolean;\n\n rowIdentityAccessor: keyof TType;\n selectedRows: string[];\n};\n\n// Discriminated union: providing selectedRows forces TypeScript to use branches 3/4, which require rowIdentityAccessor\nexport type TableClientProps<TType = unknown> = TableClientPropsBase<TType> | TableClientPropsWithSelection<TType>;\nexport type TableServerProps<TType = unknown> = TableServerPropsBase<TType> | TableServerPropsWithSelection<TType>;\n\n// For backward compatibility (used by hooks/internals that don't care about the constraint)\nexport type TableCommonProps<TType = unknown> = TableCommonBaseProps<TType> & {\n rowIdentityAccessor?: keyof TType;\n selectedRows?: string[];\n};\n\nexport type TableProps<TType = unknown> = TableClientProps<TType> | TableServerProps<TType>;\n\nexport type TableColumnDataTypeOptions = {\n currency?: string;\n decimals?: number;\n useGrouping?: boolean;\n};\n\nexport type TableColumnDataTypeOptionsHandler<TType = unknown, TOptions = TableColumnDataTypeOptions> =\n TOptions | ((row: TType) => TOptions);\n\nexport type TableColumnDataTypeProps<TType = unknown> =\n // number should allow currency, decimals and useGrouping\n | {\n dataType?: 'number';\n dataTypeOptions?: TableColumnDataTypeOptionsHandler<\n TType,\n Pick<TableColumnDataTypeOptions, 'currency' | 'decimals' | 'useGrouping'>\n >;\n }\n // amount should allow currency\n | {\n dataType?: 'amount';\n dataTypeOptions?: TableColumnDataTypeOptionsHandler<TType, Pick<TableColumnDataTypeOptions, 'currency'>>;\n }\n // percentage should allow decimals and useGrouping\n | {\n dataType?: 'percentage';\n dataTypeOptions?: TableColumnDataTypeOptionsHandler<\n TType,\n Pick<TableColumnDataTypeOptions, 'decimals' | 'useGrouping'>\n >;\n }\n // others should not allow options\n | {\n dataType?: Omit<TableColumnDataType, 'number' | 'amount' | 'percentage'>;\n dataTypeOptions?: never;\n };\n\nexport type TableColumnIdentifierProps<TType = unknown> =\n // type correctly if an accessor is provided\n | {\n [Key in DotNotationPaths<TType>]: {\n accessor: Key;\n id?: string;\n renderer?: TableColumnRenderer<TType, DotNotationPathValue<TType, Key>> | undefined;\n aggregate?: TableColumnRendererAggregate<TType, DotNotationPathValue<TType, Key>> | undefined;\n };\n }[DotNotationPaths<TType>]\n // otherwise fall back to unknown\n | {\n accessor?: never;\n id: string;\n renderer?: TableColumnRenderer<TType, undefined> | undefined;\n aggregate?: TableColumnRendererAggregate<TType, undefined> | undefined;\n };\n\nexport type TableColumnProps<TType = unknown> = TableColumnIdentifierProps<TType> &\n TableColumnDataTypeProps<TType> & {\n // renderers - some that require Key are below, to ensure correct typing\n control?: TableColumnRendererControl<TType> | undefined;\n footer?: TableColumnRendererFooter<TType> | undefined;\n header: TableColumnRendererHeader;\n // options\n /** Aggregation function to be used when the column is part of a grouped row */\n aggregationFn?: 'auto' | ReactTableBuiltInAggregationFn;\n align?: TableColumnAlignment;\n className?: TableColumnClassNameHandler<TType>;\n dataType?: TableColumnDataType;\n defaultHidden?: boolean;\n defaultWidth?: TableColumnWidth;\n emptyState?: React.ReactNode;\n enableEditing?: boolean;\n enableFiltering?: boolean;\n enableGrouping?: boolean;\n enableHiding?: boolean;\n enableOrdering?: boolean;\n enablePrinting?: boolean;\n enableResizing?: boolean;\n enableSearch?: boolean;\n enableSorting?: boolean;\n enableTruncate?: boolean;\n filters?: TableFilterComparator[];\n headerClassName?: string;\n menu?: TableColumnMenu;\n minWidth?: number;\n sort?: TableColumnSortDirection;\n sortFn?: TableColumnSortFn<TType>;\n tooltip?: string;\n };\n\nexport type TableGroupProps = {\n children: (React.JSX.Element | boolean | null | undefined)[];\n header: string;\n id: string;\n};\n\nexport type TableTexts = {\n columns: {\n actions: {\n tooltip: string;\n };\n drag: {\n tooltip: string;\n };\n expansion: {\n collapse: string;\n collapseAll: string;\n expand: string;\n expandAll: string;\n };\n menu: {\n editFilter: string;\n filter: string;\n freezeFirstColumn: string;\n freezeUptoColumn: string;\n gotoRow: string;\n hideColumn: string;\n unfreezeColumns: string;\n sorting: string;\n sortingOrder: {\n ascending: string;\n descending: string;\n unsorted: string;\n };\n };\n resize: {\n tooltip: string;\n };\n select: {\n deselect: string;\n deselectAll: string;\n select: string;\n selectAll: string;\n };\n };\n columnSettings: {\n button: string;\n noResults: string;\n search: string;\n tooltip: string;\n };\n filters: {\n button: string;\n buttons: {\n addFilter: string;\n clearFilters: string;\n cancel: string;\n clear: string;\n apply: string;\n };\n comparators: {\n contains: string;\n doesNotContain: string;\n isEqualTo: string;\n isNotEqualTo: string;\n isGreaterThan: string;\n isLessThan: string;\n isBetween: string;\n isOneOf: string;\n isNoneOf: string;\n isEmpty: string;\n isNotEmpty: string;\n isBefore: string;\n isAfter: string;\n isLessThanOrEqualTo: string;\n isGreaterThanOrEqualTo: string;\n isOnOrBefore: string;\n isOnOrAfter: string;\n hasAnyOf: string;\n hasAllOf: string;\n hasNoneOf: string;\n };\n conditions: {\n and: string;\n where: string;\n };\n emptyFilter: {\n condition: string;\n value: string;\n };\n hiddenColumn: string;\n hiddenGroupedColumn: string;\n tooltip: string;\n total: string;\n };\n fontSize: {\n tooltip: string;\n sizes: {\n small: string;\n medium: string;\n large: string;\n };\n };\n footer: {\n summary: {\n count: string;\n records: string;\n selected: string;\n };\n };\n print: {\n error: string;\n loading: string;\n tooltip: string;\n warningDialog: {\n title: string;\n description: string;\n checkboxVisibilityLabel: string;\n cancelButtonText: string;\n printButtonText: string;\n };\n settingsDialog: {\n title: string;\n size: string;\n sizeA5: string;\n sizeA4: string;\n sizeA3: string;\n sizeLetter: string;\n sizeLegal: string;\n orientation: string;\n orientationLandscape: string;\n orientationPortrait: string;\n rows: string;\n rowsAll: string;\n rowsSelected: string;\n layout: string;\n layoutSplitGroups: string;\n };\n };\n rowHeight: {\n tooltip: string;\n sizes: {\n short: string;\n medium: string;\n tall: string;\n extraTall: string;\n };\n };\n search: {\n excludeUnmatchedResults: string;\n placeholder: string;\n };\n otherOptions: {\n tooltip: string;\n };\n};\n"],"names":["TableFilterComparator"],"mappings":";;AA4BO,IAAK,0CAAAA,2BAAL;AACHA,yBAAAA,uBAAA,cAAW,CAAA,IAAX;AACAA,yBAAAA,uBAAA,oBAAiB,CAAA,IAAjB;AACAA,yBAAAA,uBAAA,eAAY,CAAA,IAAZ;AACAA,yBAAAA,uBAAA,kBAAe,CAAA,IAAf;AACAA,yBAAAA,uBAAA,mBAAgB,CAAA,IAAhB;AACAA,yBAAAA,uBAAA,gBAAa,CAAA,IAAb;AACAA,yBAAAA,uBAAA,eAAY,CAAA,IAAZ;AACAA,yBAAAA,uBAAA,aAAU,CAAA,IAAV;AACAA,yBAAAA,uBAAA,gBAAa,CAAA,IAAb;AACAA,yBAAAA,uBAAA,yBAAsB,CAAA,IAAtB;AACAA,yBAAAA,uBAAA,4BAAyB,EAAA,IAAzB;AACAA,yBAAAA,uBAAA,cAAW,EAAA,IAAX;AACAA,yBAAAA,uBAAA,cAAW,EAAA,IAAX;AACAA,yBAAAA,uBAAA,eAAY,EAAA,IAAZ;AACAA,yBAAAA,uBAAA,aAAU,EAAA,IAAV;AACAA,yBAAAA,uBAAA,cAAW,EAAA,IAAX;AAhBQ,SAAAA;AAAA,GAAA,yBAAA,CAAA,CAAA;;"}
|
|
1
|
+
{"version":3,"file":"types.cjs","sources":["../../../src/primitives/Table/types.ts"],"sourcesContent":["import type {\n ColumnFilter as ReactTableColumnFilter,\n ColumnFiltersState as ReactTableColumnFilterState,\n ColumnOrderState as ReactTableColumnOrderState,\n ColumnPinningState as ReactTableColumnPinningState,\n ColumnSort as ReactTableColumnSort,\n ColumnSizingState as ReactTableColumnSizingState,\n VisibilityState as ReactTableColumnVisibilityState,\n SortingState as ReactTableSortingState,\n BuiltInAggregationFn as ReactTableBuiltInAggregationFn,\n BuiltInSortingFn as ReactTableBuiltInSortingFn,\n} from '@tanstack/react-table';\n\nimport type { IconName, MenuItemProps } from '@/components';\nimport type { DotNotationPaths, FontSize, FontSizes, DotNotationPathValue } from '@/types';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\nexport type TableRef = HTMLTableElement & {\n instance: {\n resetFiltering: () => void;\n resetPagination: () => Promise<void>;\n resetRowExpansion: () => void;\n resetRowSelection: () => void;\n resetSorting: () => void;\n };\n};\n\n// filtering\nexport enum TableFilterComparator {\n Contains = 0,\n DoesNotContain = 1,\n IsEqualTo = 2,\n IsNotEqualTo = 3,\n IsGreaterThan = 4,\n IsLessThan = 5,\n IsBetween = 6,\n IsEmpty = 7,\n IsNotEmpty = 8,\n IsLessThanOrEqualTo = 9,\n IsGreaterThanOrEqualTo = 10,\n HasAnyOf = 11,\n HasAllOf = 12,\n HasNoneOf = 13,\n IsOneOf = 14,\n IsNoneOf = 15,\n}\nexport type TableFilterValue = {\n comparator: TableFilterComparator;\n value: any;\n};\nexport type TableFilter = {\n id: string;\n value: TableFilterValue;\n};\n\n// columns\nexport type TableColumnAlignment = 'left' | 'center' | 'right';\nexport type TableColumnClassNameHandler<TType = unknown> = string | ((row: TType) => string | undefined);\nexport type TableColumnDataType =\n // base\n | 'text'\n | 'boolean'\n // dates\n | 'date'\n | 'time'\n | 'datetime'\n // numbers\n | 'number'\n | 'amount'\n | 'percentage';\nexport type TableColumnFilter = ReactTableColumnFilter;\nexport type TableColumnMenu = ((columnId: string) => React.ReactNode | null)[];\nexport type TableColumnRendererArgs<TType, TValue> = TValue extends undefined\n ? { formattedValue: undefined; row: TType; value: undefined }\n : { formattedValue: string; row: TType; value: TValue };\nexport type TableColumnRenderer<TType, TValue = unknown> = (\n args: TableColumnRendererArgs<TType, TValue>\n) => React.JSX.Element | string | number | unknown | null;\nexport type TableColumnRendererAggregate<TType, TValue = unknown> = (\n args: TableColumnRendererArgs<TType, TValue>\n) => React.JSX.Element | string | number | unknown | null;\nexport type TableColumnRendererControl<TType = unknown> =\n | ((props: TableColumnRendererControlProps, row?: TType, filterState?: TableFilter[]) => React.JSX.Element | null)\n | 'datepicker'\n | 'input'\n | 'switch'\n | 'checkbox'\n | 'textarea';\nexport type TableColumnRendererControlProps = {\n className?: string;\n disabled?: boolean;\n fontSize?: FontSize;\n invalid?: boolean;\n onBlur?: (value: any) => void;\n onKeyDown?: React.KeyboardEventHandler;\n onFocus?: React.FocusEventHandler;\n readOnly?: boolean;\n ref: React.Ref<HTMLElement>;\n setValue: (value: any) => void;\n value: any;\n};\nexport type TableColumnRendererHeader = string | React.JSX.Element;\nexport type TableColumnRendererFooter<TType> = (rows: TType[]) => React.JSX.Element | string | number | null;\nexport type TableColumnSort = ReactTableColumnSort;\nexport type TableColumnSortDirection = 'asc' | 'desc';\nexport type TableColumnSortFn<TType = unknown> =\n ((rowA: TType, rowB: TType, columnId: string) => -1 | 0 | 1) | ReactTableBuiltInSortingFn | 'auto';\nexport type TableColumnWidth = number | 'grow';\n\n// rows\nexport type TableRowActionRenderer<TType = unknown> = (\n row: TType,\n helpers: {\n editing?: {\n isEditing: boolean;\n /** Column id of the cell that most recently held focus in the row, e.g. for actions that duplicate the row and restore the user's position */\n lastFocusedCellId?: string;\n removeRowChanges: () => Promise<void>;\n save: () => Promise<boolean>;\n };\n }\n) => React.JSX.Element | null;\n\nexport type TableRowActionGroupRenderer<TType = unknown> = (rows: TType[]) => React.JSX.Element | null;\n\nexport type TableRowActionConfig<TArg = unknown> = {\n key: string;\n /** aria-label, and the label shown when this action overflows into the \"more\" menu */\n name: string;\n /** Overrides the on-row tooltip text; falls back to `name` when omitted */\n tooltip?: string;\n icon: IconName;\n shortcut?: string | KeyDownHandlerOptions;\n /** Visible but inert; to hide the action entirely, omit it from the returned array instead */\n disabled?: boolean;\n /**\n * Extra data-* attributes rendered on the action and carried onto its overflow menu item,\n * e.g. analytics or test hooks. Keys may be given with or without the data- prefix\n */\n data?: Record<string, string>;\n onClick: (arg: TArg, event: React.MouseEvent) => void;\n};\n// A declarative alternative to an array of renderers: one function computing the whole per-row action\n// list, receiving the same helpers as TableRowActionRenderer\nexport type TableRowActionConfigRenderer<TType = unknown> = (\n row: TType,\n helpers: Parameters<TableRowActionRenderer<TType>>[1]\n) => TableRowActionConfig<TType>[];\nexport type TableRowActionConfigGroupRenderer<TType = unknown> = (rows: TType[]) => TableRowActionConfig<TType[]>[];\n\nexport type TableRowClickHandler<TType = unknown> = (row: TType) => void;\nexport type TableRowDragHandler<TType = unknown> = (\n rows: TType[],\n showPlaceholder: (text: string) => void,\n setDataTransfer: (data: string) => void\n) => void;\nexport type TableRowDropHandler<TType = unknown> = (event: React.DragEvent, row: TType) => void;\nexport type TableRowGotoHandler = (\n column: string,\n query: string,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined\n) => Promise<number>;\nexport type TableRowHeight = 'short' | 'medium' | 'tall' | 'extra-tall';\nexport type TableRowActiveHandler<TType = unknown> = (row: TType | undefined) => void;\nexport type TableRowSelectHandler<TType = unknown> = (rows: TType[], ids: string[]) => void;\nexport type TableRowWithMetaData<TType = unknown> = TType & {\n _meta?: {\n layout?: 'heading' | 'summary' | 'item';\n };\n};\n\n// shortcuts\nexport type TableShortcutHandlerFn<TType = unknown> = (row: TType) => void;\nexport type TableShortcutHandlerObject<TType = unknown> = {\n handler: TableShortcutHandlerFn<TType>;\n meta?: boolean;\n shift?: boolean;\n};\n\n// table\nexport type TableSortHandler = (sorting: TableColumnSort[]) => Promise<void> | void;\nexport type TableFilterHandler = (filters: TableColumnFilter[], hiddenColumns: string[]) => Promise<void> | void;\nexport type TableSearchHandler = (search: string | undefined, hiddenColumns: string[]) => Promise<void> | void;\nexport type TableFontSize = keyof typeof FontSizes;\nexport type TablePreset = 'complex' | 'list' | 'simple';\nexport type TableRowExpansionRenderer<TType = unknown> = (row: TType) => (() => React.JSX.Element) | null;\nexport type TableScrollToIndexHandler = (index: number, options?: { align: 'start' | 'center' | 'end' | 'auto' }) => void;\nexport type TableServerLoadPageHandler = (\n pageIndex: number,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n hiddenColumns: string[],\n search: string | undefined\n) => Promise<void>;\nexport type TableServerLoadAllHandler = (\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n hiddenColumns: string[],\n search: string | undefined\n) => Promise<void>;\n// discards the currently loaded pages and loads the first page again, using the last used\n// sorting, filters, hidden columns and search\nexport type TableServerResetPaginationHandler = () => Promise<void>;\nexport type TableSettingsHandler = (settings: TableSettings) => void | Promise<void>;\nexport type TablePrintSettings = {\n allRows: boolean;\n orientation: 'portrait' | 'landscape';\n size: 'A3' | 'A4' | 'A5' | 'letter' | 'legal';\n splitGroups: boolean;\n};\nexport type TablePrintHandler = (settings: TableSettings, printSettings: TablePrintSettings) => Promise<void>;\nexport type TableShortcuts<TType = unknown> = Record<string, TableShortcutHandlerFn<TType> | TableShortcutHandlerObject<TType>>;\nexport type TableCustomSettingsRenderer = (props: TableSettings) => React.ReactElement<MenuItemProps>[];\nexport type TableEmptyStateReason = 'empty' | 'filtering' | 'searching';\nexport type TableEmptyStateRenderer = (props: { reason: TableEmptyStateReason }) => React.JSX.Element | null;\nexport type TableEvent = 'editing-mode';\nexport type TableEventHandler = (event: TableEvent, data?: object) => void;\n\n// settings\nexport type TableSettings = {\n columnFilters?: ReactTableColumnFilterState;\n columnOrder?: ReactTableColumnOrderState;\n columnPinning?: ReactTableColumnPinningState;\n columnSizing?: ReactTableColumnSizingState;\n columnVisibility?: ReactTableColumnVisibilityState;\n excludeUnmatchedRecordsInSearch?: boolean;\n fontSize?: TableFontSize;\n rowHeight?: TableRowHeight;\n searchQuery?: string;\n sorting?: ReactTableSortingState;\n};\nexport type TableEnableSettingsOptions = {\n columnOrder: boolean;\n columnPinning: boolean;\n columnSizing: boolean;\n columnVisibility: boolean;\n excludeUnmatchedRecordsInSearch: boolean;\n fontSize: boolean;\n grouping: boolean;\n rowHeight: boolean;\n sorting: boolean;\n};\n\n// props\nexport type TableConditionalRowProp<TType = unknown> = boolean | ((row: TType) => boolean);\nexport type TableFeatureProps<TType = unknown> = {\n // react-table built-in\n enableFiltering?: boolean;\n enableSearch?: boolean;\n enableSorting?: boolean;\n enableColumnFreezing?: boolean;\n enableColumnHiding?: boolean;\n enableColumnResizing?: boolean;\n enableRowExpansion?: boolean;\n enableRowExpansionAll?: boolean;\n enableRowSelection?: TableConditionalRowProp<TType>;\n\n // custom -- common between all table types\n enableColumnOrdering?: boolean;\n enableFontSize?: boolean;\n enableFooter?: boolean;\n enablePrinting?: boolean;\n enableRowActions?: boolean;\n enableRowActive?: boolean;\n enableRowClick?: TableConditionalRowProp<TType>;\n enableRowDrag?: boolean;\n enableRowDrop?: boolean;\n enableRowGoto?: boolean;\n enableRowHeight?: boolean;\n enableSaveSettings?: boolean | Partial<TableEnableSettingsOptions>;\n enableSaveSettingsLocally?: boolean;\n};\n\nexport type TableChild = React.JSX.Element | React.JSX.Element[] | boolean | null | undefined;\n\n// Base props\ntype TableCommonBaseProps<TType = unknown> = TableFeatureProps<TType> & {\n children: TableChild | TableChild[];\n data: TType[];\n id: string;\n\n // misc\n customSettings?: TableCustomSettingsRenderer;\n defaultColumnFreezingIndex?: number;\n defaultRowActiveIndex?: number;\n defaultRowGroupColumnId?: keyof TType;\n defaultSettings?: TableSettings;\n emptyState?: TableEmptyStateRenderer;\n enableLocalKeyboardShortcuts?: boolean;\n preset?: TablePreset;\n rowActions?: TableRowActionRenderer<TType>[] | TableRowActionConfigRenderer<TType>;\n rowActionsForGroup?: TableRowActionGroupRenderer<TType>[] | TableRowActionConfigGroupRenderer<TType>;\n rowActionsLength?: number;\n rowExpansionRenderer?: TableRowExpansionRenderer<TType>;\n shortcuts?: TableShortcuts<TType>;\n toolbarLeft?: React.JSX.Element;\n toolbarRight?: React.JSX.Element;\n toolbarPanel?: React.JSX.Element;\n\n // handlers\n onEvent?: TableEventHandler;\n onRowActive?: TableRowActiveHandler<TType>;\n onRowClick?: TableRowClickHandler<TType>;\n onRowDrag?: TableRowDragHandler<TType>;\n onRowDrop?: TableRowDropHandler<TType>;\n onRowGoto?: TableRowGotoHandler;\n onRowSelect?: TableRowSelectHandler<TType>;\n\n // state change handlers\n onChangeFilter?: TableFilterHandler;\n onChangeSearch?: TableSearchHandler;\n onChangeSettings?: TableSettingsHandler;\n onChangeSort?: TableSortHandler;\n onPrint?: TablePrintHandler;\n};\n\n// Branch 1: Client-side without controlled selection\n// selectedRows is 'never' to force TypeScript to require rowIdentityAccessor when selectedRows is used\ntype TableClientPropsBase<TType = unknown> = TableCommonBaseProps<TType> & {\n length?: never;\n loadAll?: never;\n loadPage?: never;\n pageSize?: never;\n pages?: never;\n resetPagination?: never;\n _experimentalDataLoader2?: never;\n\n rowIdentityAccessor?: keyof TType;\n selectedRows?: never;\n};\n\n// Branch 2: Server-side without controlled selection\ntype TableServerPropsBase<TType = unknown> = TableCommonBaseProps<TType> & {\n length: number | undefined;\n loadAll: TableServerLoadAllHandler;\n loadPage: TableServerLoadPageHandler;\n pageSize?: number;\n pages?: number[];\n resetPagination?: TableServerResetPaginationHandler;\n _experimentalDataLoader2?: boolean;\n\n rowIdentityAccessor?: keyof TType;\n selectedRows?: never;\n};\n\n// Branch 3: Client-side with controlled selection\n// Both rowIdentityAccessor and selectedRows are required\ntype TableClientPropsWithSelection<TType = unknown> = TableCommonBaseProps<TType> & {\n length?: never;\n loadAll?: never;\n loadPage?: never;\n pageSize?: never;\n pages?: never;\n resetPagination?: never;\n _experimentalDataLoader2?: never;\n\n rowIdentityAccessor: keyof TType;\n selectedRows: string[];\n};\n\n// Branch 4: Server-side with controlled selection\n// Both rowIdentityAccessor and selectedRows are required\ntype TableServerPropsWithSelection<TType = unknown> = TableCommonBaseProps<TType> & {\n length: number | undefined;\n loadAll: TableServerLoadAllHandler;\n loadPage: TableServerLoadPageHandler;\n pageSize?: number;\n pages?: number[];\n resetPagination?: TableServerResetPaginationHandler;\n _experimentalDataLoader2?: boolean;\n\n rowIdentityAccessor: keyof TType;\n selectedRows: string[];\n};\n\n// Discriminated union: providing selectedRows forces TypeScript to use branches 3/4, which require rowIdentityAccessor\nexport type TableClientProps<TType = unknown> = TableClientPropsBase<TType> | TableClientPropsWithSelection<TType>;\nexport type TableServerProps<TType = unknown> = TableServerPropsBase<TType> | TableServerPropsWithSelection<TType>;\n\n// For backward compatibility (used by hooks/internals that don't care about the constraint)\nexport type TableCommonProps<TType = unknown> = TableCommonBaseProps<TType> & {\n rowIdentityAccessor?: keyof TType;\n selectedRows?: string[];\n};\n\nexport type TableProps<TType = unknown> = TableClientProps<TType> | TableServerProps<TType>;\n\nexport type TableColumnDataTypeOptions = {\n currency?: string;\n decimals?: number;\n useGrouping?: boolean;\n};\n\nexport type TableColumnDataTypeOptionsHandler<TType = unknown, TOptions = TableColumnDataTypeOptions> =\n TOptions | ((row: TType) => TOptions);\n\nexport type TableColumnDataTypeProps<TType = unknown> =\n // number should allow currency, decimals and useGrouping\n | {\n dataType?: 'number';\n dataTypeOptions?: TableColumnDataTypeOptionsHandler<\n TType,\n Pick<TableColumnDataTypeOptions, 'currency' | 'decimals' | 'useGrouping'>\n >;\n }\n // amount should allow currency\n | {\n dataType?: 'amount';\n dataTypeOptions?: TableColumnDataTypeOptionsHandler<TType, Pick<TableColumnDataTypeOptions, 'currency'>>;\n }\n // percentage should allow decimals and useGrouping\n | {\n dataType?: 'percentage';\n dataTypeOptions?: TableColumnDataTypeOptionsHandler<\n TType,\n Pick<TableColumnDataTypeOptions, 'decimals' | 'useGrouping'>\n >;\n }\n // others should not allow options\n | {\n dataType?: Omit<TableColumnDataType, 'number' | 'amount' | 'percentage'>;\n dataTypeOptions?: never;\n };\n\nexport type TableColumnIdentifierProps<TType = unknown> =\n // type correctly if an accessor is provided\n | {\n [Key in DotNotationPaths<TType>]: {\n accessor: Key;\n id?: string;\n renderer?: TableColumnRenderer<TType, DotNotationPathValue<TType, Key>> | undefined;\n aggregate?: TableColumnRendererAggregate<TType, DotNotationPathValue<TType, Key>> | undefined;\n };\n }[DotNotationPaths<TType>]\n // otherwise fall back to unknown\n | {\n accessor?: never;\n id: string;\n renderer?: TableColumnRenderer<TType, undefined> | undefined;\n aggregate?: TableColumnRendererAggregate<TType, undefined> | undefined;\n };\n\nexport type TableColumnProps<TType = unknown> = TableColumnIdentifierProps<TType> &\n TableColumnDataTypeProps<TType> & {\n // renderers - some that require Key are below, to ensure correct typing\n control?: TableColumnRendererControl<TType> | undefined;\n footer?: TableColumnRendererFooter<TType> | undefined;\n header: TableColumnRendererHeader;\n // options\n /** Aggregation function to be used when the column is part of a grouped row */\n aggregationFn?: 'auto' | ReactTableBuiltInAggregationFn;\n align?: TableColumnAlignment;\n className?: TableColumnClassNameHandler<TType>;\n dataType?: TableColumnDataType;\n defaultHidden?: boolean;\n defaultWidth?: TableColumnWidth;\n emptyState?: React.ReactNode;\n enableEditing?: boolean;\n enableFiltering?: boolean;\n enableGrouping?: boolean;\n enableHiding?: boolean;\n enableOrdering?: boolean;\n enablePrinting?: boolean;\n enableResizing?: boolean;\n enableSearch?: boolean;\n enableSorting?: boolean;\n enableTruncate?: boolean;\n filters?: TableFilterComparator[];\n headerClassName?: string;\n menu?: TableColumnMenu;\n minWidth?: number;\n sort?: TableColumnSortDirection;\n sortFn?: TableColumnSortFn<TType>;\n tooltip?: string;\n };\n\nexport type TableGroupProps = {\n children: (React.JSX.Element | boolean | null | undefined)[];\n header: string;\n id: string;\n};\n\nexport type TableTexts = {\n columns: {\n actions: {\n tooltip: string;\n };\n drag: {\n tooltip: string;\n };\n expansion: {\n collapse: string;\n collapseAll: string;\n expand: string;\n expandAll: string;\n };\n menu: {\n editFilter: string;\n filter: string;\n freezeFirstColumn: string;\n freezeUptoColumn: string;\n gotoRow: string;\n hideColumn: string;\n unfreezeColumns: string;\n sorting: string;\n sortingOrder: {\n ascending: string;\n descending: string;\n unsorted: string;\n };\n };\n resize: {\n tooltip: string;\n };\n select: {\n deselect: string;\n deselectAll: string;\n select: string;\n selectAll: string;\n };\n };\n columnSettings: {\n button: string;\n noResults: string;\n search: string;\n tooltip: string;\n };\n filters: {\n button: string;\n buttons: {\n addFilter: string;\n clearFilters: string;\n cancel: string;\n clear: string;\n apply: string;\n };\n comparators: {\n contains: string;\n doesNotContain: string;\n isEqualTo: string;\n isNotEqualTo: string;\n isGreaterThan: string;\n isLessThan: string;\n isBetween: string;\n isOneOf: string;\n isNoneOf: string;\n isEmpty: string;\n isNotEmpty: string;\n isBefore: string;\n isAfter: string;\n isLessThanOrEqualTo: string;\n isGreaterThanOrEqualTo: string;\n isOnOrBefore: string;\n isOnOrAfter: string;\n hasAnyOf: string;\n hasAllOf: string;\n hasNoneOf: string;\n };\n conditions: {\n and: string;\n where: string;\n };\n emptyFilter: {\n condition: string;\n value: string;\n };\n hiddenColumn: string;\n hiddenGroupedColumn: string;\n tooltip: string;\n total: string;\n };\n fontSize: {\n tooltip: string;\n sizes: {\n small: string;\n medium: string;\n large: string;\n };\n };\n footer: {\n summary: {\n count: string;\n records: string;\n selected: string;\n };\n };\n print: {\n error: string;\n loading: string;\n tooltip: string;\n warningDialog: {\n title: string;\n description: string;\n checkboxVisibilityLabel: string;\n cancelButtonText: string;\n printButtonText: string;\n };\n settingsDialog: {\n title: string;\n size: string;\n sizeA5: string;\n sizeA4: string;\n sizeA3: string;\n sizeLetter: string;\n sizeLegal: string;\n orientation: string;\n orientationLandscape: string;\n orientationPortrait: string;\n rows: string;\n rowsAll: string;\n rowsSelected: string;\n layout: string;\n layoutSplitGroups: string;\n };\n };\n rowHeight: {\n tooltip: string;\n sizes: {\n short: string;\n medium: string;\n tall: string;\n extraTall: string;\n };\n };\n search: {\n excludeUnmatchedResults: string;\n placeholder: string;\n };\n otherOptions: {\n tooltip: string;\n };\n};\n"],"names":["TableFilterComparator"],"mappings":";;AA4BO,IAAK,0CAAAA,2BAAL;AACHA,yBAAAA,uBAAA,cAAW,CAAA,IAAX;AACAA,yBAAAA,uBAAA,oBAAiB,CAAA,IAAjB;AACAA,yBAAAA,uBAAA,eAAY,CAAA,IAAZ;AACAA,yBAAAA,uBAAA,kBAAe,CAAA,IAAf;AACAA,yBAAAA,uBAAA,mBAAgB,CAAA,IAAhB;AACAA,yBAAAA,uBAAA,gBAAa,CAAA,IAAb;AACAA,yBAAAA,uBAAA,eAAY,CAAA,IAAZ;AACAA,yBAAAA,uBAAA,aAAU,CAAA,IAAV;AACAA,yBAAAA,uBAAA,gBAAa,CAAA,IAAb;AACAA,yBAAAA,uBAAA,yBAAsB,CAAA,IAAtB;AACAA,yBAAAA,uBAAA,4BAAyB,EAAA,IAAzB;AACAA,yBAAAA,uBAAA,cAAW,EAAA,IAAX;AACAA,yBAAAA,uBAAA,cAAW,EAAA,IAAX;AACAA,yBAAAA,uBAAA,eAAY,EAAA,IAAZ;AACAA,yBAAAA,uBAAA,aAAU,EAAA,IAAV;AACAA,yBAAAA,uBAAA,cAAW,EAAA,IAAX;AAhBQ,SAAAA;AAAA,GAAA,yBAAA,CAAA,CAAA;;"}
|
|
@@ -76,6 +76,8 @@ export type TableColumnWidth = number | 'grow';
|
|
|
76
76
|
export type TableRowActionRenderer<TType = unknown> = (row: TType, helpers: {
|
|
77
77
|
editing?: {
|
|
78
78
|
isEditing: boolean;
|
|
79
|
+
/** Column id of the cell that most recently held focus in the row, e.g. for actions that duplicate the row and restore the user's position */
|
|
80
|
+
lastFocusedCellId?: string;
|
|
79
81
|
removeRowChanges: () => Promise<void>;
|
|
80
82
|
save: () => Promise<boolean>;
|
|
81
83
|
};
|
|
@@ -89,8 +91,13 @@ export type TableRowActionConfig<TArg = unknown> = {
|
|
|
89
91
|
tooltip?: string;
|
|
90
92
|
icon: IconName;
|
|
91
93
|
shortcut?: string | KeyDownHandlerOptions;
|
|
92
|
-
/** Visible but inert
|
|
94
|
+
/** Visible but inert; to hide the action entirely, omit it from the returned array instead */
|
|
93
95
|
disabled?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Extra data-* attributes rendered on the action and carried onto its overflow menu item,
|
|
98
|
+
* e.g. analytics or test hooks. Keys may be given with or without the data- prefix
|
|
99
|
+
*/
|
|
100
|
+
data?: Record<string, string>;
|
|
94
101
|
onClick: (arg: TArg, event: React.MouseEvent) => void;
|
|
95
102
|
};
|
|
96
103
|
export type TableRowActionConfigRenderer<TType = unknown> = (row: TType, helpers: Parameters<TableRowActionRenderer<TType>>[1]) => TableRowActionConfig<TType>[];
|