@persona/design-system 0.10.2 → 0.10.4
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/CHANGELOG.md +19 -0
- package/dist/{Breadcrumb-BDbY1Ffu.d.mts → Breadcrumb-CA0vAzUN.d.mts} +7 -2
- package/dist/Breadcrumb.d.mts +2 -2
- package/dist/{Breadcrumbs-C2ThOYJ-.d.mts → Breadcrumbs-47jYLqNP.d.mts} +2 -2
- package/dist/{Breadcrumbs-CQUe9VTM.mjs → Breadcrumbs-gRAsKF4R.mjs} +50 -10
- package/dist/Breadcrumbs-gRAsKF4R.mjs.map +1 -0
- package/dist/Breadcrumbs.d.mts +1 -1
- package/dist/{Combobox-BXHCfVpE.mjs → Combobox-CBM-oY-e.mjs} +6 -4
- package/dist/{Combobox-BXHCfVpE.mjs.map → Combobox-CBM-oY-e.mjs.map} +1 -1
- package/dist/{CompactBar-CfrrZ69k.d.mts → CompactBar-D9egXqY_.d.mts} +2 -2
- package/dist/CompactBar.d.mts +1 -1
- package/dist/{ConfigFormGroup-BE3yR_VU.mjs → ConfigFormGroup-CidT_cE9.mjs} +1 -1
- package/dist/{ConfigFormGroup-BE3yR_VU.mjs.map → ConfigFormGroup-CidT_cE9.mjs.map} +1 -1
- package/dist/{ControlBar-D9KflqmH.d.mts → ControlBar-RIz-xjxs.d.mts} +18 -1
- package/dist/ControlBar.d.mts +1 -1
- package/dist/{DataTable-BdKUCgcZ.d.mts → DataTable-D15C5lfd.d.mts} +3 -2
- package/dist/{DataTable-F9R-aQCg.mjs → DataTable-DQ8axNfo.mjs} +7 -7
- package/dist/{DataTable-F9R-aQCg.mjs.map → DataTable-DQ8axNfo.mjs.map} +1 -1
- package/dist/DataTable.d.mts +1 -1
- package/dist/{DatePicker-CkNQjfCN.mjs → DatePicker-D0cvVbzq.mjs} +2 -2
- package/dist/{DatePicker-CkNQjfCN.mjs.map → DatePicker-D0cvVbzq.mjs.map} +1 -1
- package/dist/{FormField-D0y1uRV5.mjs → FormField-C0cd1zVd.mjs} +5 -5
- package/dist/{FormField-D0y1uRV5.mjs.map → FormField-C0cd1zVd.mjs.map} +1 -1
- package/dist/{HoverCopyableField-DkOosH8z.mjs → HoverCopyableField-D-BubaRd.mjs} +2 -2
- package/dist/{HoverCopyableField-DkOosH8z.mjs.map → HoverCopyableField-D-BubaRd.mjs.map} +1 -1
- package/dist/IndexTableLayout.d.mts +4 -4
- package/dist/{Link-BSuXrvTu.mjs → Link-Cf__H8gD.mjs} +1 -1
- package/dist/{Link-BSuXrvTu.mjs.map → Link-Cf__H8gD.mjs.map} +1 -1
- package/dist/{ListBox-BLoJVezh.mjs → ListBox-eoyBHtnJ.mjs} +2 -2
- package/dist/{ListBox-BLoJVezh.mjs.map → ListBox-eoyBHtnJ.mjs.map} +1 -1
- package/dist/{Modal-IJdbLORi.mjs → Modal-kjUptzg1.mjs} +1 -1
- package/dist/{Modal-IJdbLORi.mjs.map → Modal-kjUptzg1.mjs.map} +1 -1
- package/dist/{PageHeader-Czj42pyK.d.mts → PageHeader-CnpDVOck.d.mts} +2 -2
- package/dist/{PageHeader-DJF7nxgN.mjs → PageHeader-D2j2XHD9.mjs} +6 -2
- package/dist/PageHeader-D2j2XHD9.mjs.map +1 -0
- package/dist/PageHeader.d.mts +1 -1
- package/dist/{Pagination-C5ANr9M0.mjs → Pagination-DtK-jbEY.mjs} +2 -2
- package/dist/{Pagination-C5ANr9M0.mjs.map → Pagination-DtK-jbEY.mjs.map} +1 -1
- package/dist/{Pii-G16_b7Yk.mjs → Pii-DueIK287.mjs} +1 -1
- package/dist/{Pii-G16_b7Yk.mjs.map → Pii-DueIK287.mjs.map} +1 -1
- package/dist/{Popover-532iYFek.mjs → Popover-BcII7usF.mjs} +1 -1
- package/dist/{Popover-532iYFek.mjs.map → Popover-BcII7usF.mjs.map} +1 -1
- package/dist/{Select-hnXfPywt.mjs → Select-BJ9ACmRD.mjs} +1 -1
- package/dist/{Select-hnXfPywt.mjs.map → Select-BJ9ACmRD.mjs.map} +1 -1
- package/dist/SelectionCard.d.mts +0 -5
- package/dist/{Spinner-AnIk8d9M.mjs → Spinner-7Camx1vs.mjs} +4 -3
- package/dist/{Spinner-AnIk8d9M.mjs.map → Spinner-7Camx1vs.mjs.map} +1 -1
- package/dist/{Table-CmuWqmVN.mjs → Table-BIDaC0uS.mjs} +2 -2
- package/dist/{Table-CmuWqmVN.mjs.map → Table-BIDaC0uS.mjs.map} +1 -1
- package/dist/{TableBox-BRJunn09.mjs → TableBox-Bn_XZEYd.mjs} +4 -4
- package/dist/{TableBox-BRJunn09.mjs.map → TableBox-Bn_XZEYd.mjs.map} +1 -1
- package/dist/{TableControls-DCtTiWk6.d.mts → TableControls-ETB0Xk5X.d.mts} +3 -2
- package/dist/{TableControls-C5fNNdmT.mjs → TableControls-qxoq5abn.mjs} +102 -60
- package/dist/TableControls-qxoq5abn.mjs.map +1 -0
- package/dist/TableControls.d.mts +1 -1
- package/dist/components/Breadcrumbs/index.d.mts +1 -1
- package/dist/components/Breadcrumbs/index.mjs +1 -1
- package/dist/components/Combobox/index.mjs +1 -1
- package/dist/components/ConfigFormGroup/index.mjs +1 -1
- package/dist/components/DataTable/TableControls/index.d.mts +3 -3
- package/dist/components/DataTable/TableControls/index.mjs +1 -1
- package/dist/components/DataTable/index.d.mts +1 -1
- package/dist/components/DataTable/index.mjs +1 -1
- package/dist/components/DatePicker/index.mjs +1 -1
- package/dist/components/FormField/index.mjs +1 -1
- package/dist/components/HoverCopyableField/index.mjs +1 -1
- package/dist/components/Link/index.mjs +1 -1
- package/dist/components/ListBox/index.mjs +1 -1
- package/dist/components/Modal/index.mjs +1 -1
- package/dist/components/PageHeader/index.d.mts +1 -1
- package/dist/components/PageHeader/index.mjs +1 -1
- package/dist/components/Pagination/index.mjs +1 -1
- package/dist/components/Pii/index.mjs +1 -1
- package/dist/components/Popover/index.mjs +1 -1
- package/dist/components/Select/index.mjs +1 -1
- package/dist/components/SelectionCard/index.mjs +32 -24
- package/dist/components/SelectionCard/index.mjs.map +1 -1
- package/dist/components/SmartTextInput/index.mjs +1 -1
- package/dist/components/Spinner/index.mjs +1 -1
- package/dist/components/Table/index.mjs +1 -1
- package/dist/components/TableBox/index.mjs +1 -1
- package/dist/components/VersionHistory/index.mjs +2 -2
- package/dist/patterns/IndexTableLayout/index.mjs +2 -2
- package/dist/patterns/LayoutLoadingShimmer/index.mjs +2 -2
- package/dist/patterns/WizardModal/index.mjs +1 -1
- package/llms.txt +2 -1
- package/package.json +2 -2
- package/skills/ui-authoring/SKILL.md +8 -0
- package/skills/ui-authoring/STANDARD.md +137 -0
- package/skills/ui-authoring/TOKENS.md +3 -1
- package/skills/ui-authoring/lanes.json +22 -0
- package/dist/Breadcrumbs-CQUe9VTM.mjs.map +0 -1
- package/dist/PageHeader-DJF7nxgN.mjs.map +0 -1
- package/dist/TableControls-C5fNNdmT.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable-F9R-aQCg.mjs","names":["DropdownMenu","Pii","PlusIcon","DropdownMenu","tanstackMemo","DetailComponent","Pagination"],"sources":["../components/DataTable/clientFilterUtils.ts","../components/DataTable/constants.ts","../components/DataTable/FloatingActionBar.tsx","../components/DataTable/helpers.tsx","../components/DataTable/Inserter.tsx","../components/DataTable/useTableColumns.tsx","../components/DataTable/DataTable.tsx"],"sourcesContent":["import type { Column, ColumnFiltersState, Header, RowData, Table } from '@tanstack/react-table';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport type { FilterConfig } from './TableControls/types';\nimport type { ClientFilterConfig } from './types';\n\nexport const getFilterFnName = (filterType: string): string => {\n switch (filterType) {\n case 'select':\n return 'equals';\n case 'multiselect':\n case 'multiselect-alt':\n case 'multiselect-legacy':\n return 'arrIncludesSome';\n case 'input':\n return 'includesString';\n default:\n return 'equals';\n }\n};\n\nconst isEmptyFilterValue = (value: unknown): boolean => {\n return value == null || value === '' || (Array.isArray(value) && value.length === 0);\n};\n\nconst isClientFilterConfig = (filter: unknown): filter is ClientFilterConfig => {\n if (typeof filter !== 'object' || filter === null || !('type' in filter)) {\n return false;\n }\n return filter.type === 'select' || filter.type === 'multiselect' || filter.type === 'input';\n};\n\n/** Converts column-level client filters into controls backed by TanStack's column-filter state. */\nexport const generateClientFilters = <TData extends RowData>(\n columns: Array<{\n id?: string;\n accessor: string;\n header:\n | string\n | ((props: {\n table: Table<TData>;\n header: Header<TData, unknown>;\n column: Column<TData, unknown>;\n }) => React.ReactNode);\n filter?: unknown;\n }>,\n columnFilters: ColumnFiltersState,\n setColumnFilters: Dispatch<SetStateAction<ColumnFiltersState>>,\n): FilterConfig[] => {\n return columns.flatMap((column): FilterConfig[] => {\n const filterConfig = column.filter;\n if (!isClientFilterConfig(filterConfig) || filterConfig.enabled === false) {\n return [];\n }\n\n const columnId = column.id || column.accessor;\n const name = typeof column.header === 'string' ? column.header : columnId;\n const currentValue = columnFilters.find((filter) => filter.id === columnId)?.value;\n const onChange = (value: unknown) => {\n setColumnFilters((previousFilters) => {\n if (isEmptyFilterValue(value)) {\n return previousFilters.filter((filter) => filter.id !== columnId);\n }\n\n const existingFilter = previousFilters.some((filter) => filter.id === columnId);\n if (existingFilter) {\n return previousFilters.map((filter) =>\n filter.id === columnId ? { ...filter, value } : filter,\n );\n }\n\n return [...previousFilters, { id: columnId, value }];\n });\n };\n\n const baseConfig = {\n id: columnId,\n name,\n placeholder: filterConfig.placeholder,\n enabled: true,\n };\n\n switch (filterConfig.type) {\n case 'select':\n return [\n {\n ...baseConfig,\n type: 'select',\n value: (currentValue as string | undefined) ?? '',\n options: filterConfig.options ?? [],\n onChange,\n },\n ];\n case 'multiselect':\n return [\n {\n ...baseConfig,\n type: 'multiselect',\n value: (currentValue as string[] | undefined) ?? [],\n options: filterConfig.options ?? [],\n onChange,\n },\n ];\n case 'input':\n return [\n {\n ...baseConfig,\n type: 'input',\n value: (currentValue as string | undefined) ?? '',\n onChange,\n onDelete: () => onChange(''),\n },\n ];\n default:\n return [];\n }\n });\n};\n","export function getColumnWidths(compact?: boolean) {\n return {\n EXPAND_COLUMN_WIDTH: compact ? 32 : 36,\n SELECT_COLUMN_WIDTH: compact ? 32 : 40,\n ACTION_COLUMN_WIDTH: compact ? 32 : 40,\n NEST_SPACING: compact ? 24 : 32,\n };\n}\n","import styled from 'styled-components';\n\nimport { BorderRadius, Spacing } from '@persona/design-tokens';\nimport { XIcon } from '@persona/icons';\nimport Button, { IconButton } from 'design-system/components/Button';\nimport DropdownMenu from 'design-system/components/DropdownMenu';\nimport { HStack } from 'design-system/components/Stack';\nimport { Paragraph } from 'design-system/components/Text';\nimport { usePDSStrings } from 'design-system/lib/i18n';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { Elevation } from 'design-system/variables/effect';\n\nconst Bar = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n background-color: ${({ theme }) => semanticColor(theme, 'SurfaceElevated', theme.color.background.primary)};\n width: 100%;\n padding: ${Spacing[2]};\n border-radius: ${BorderRadius.Md};\n box-shadow: ${Elevation.Mid};\n gap: ${Spacing[8]};\n min-width: 380px;\n`;\n\ninterface FloatingActionBarProps {\n selectedCount: number;\n onClearSelection: React.MouseEventHandler<HTMLButtonElement>;\n extraContent?: React.ReactNode;\n actions: (\n | {\n label: string;\n variant?: 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n popover?: {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string) => void | Promise<void>;\n };\n onClick: () => void | Promise<void>;\n }\n | {\n 'aria-label': string;\n icon: React.ReactNode;\n variant?: 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n popover?: {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string) => void | Promise<void>;\n };\n onClick: () => void | Promise<void>;\n }\n )[];\n}\n\nconst FloatingActionBar = ({\n selectedCount,\n onClearSelection,\n extraContent,\n actions,\n}: FloatingActionBarProps) => {\n const strings = usePDSStrings();\n return (\n <Bar>\n <HStack align='center'>\n <IconButton size='sm' onClick={onClearSelection} aria-label={strings.clearSelection}>\n <XIcon />\n </IconButton>\n <Paragraph color='primary'>{strings.selectedItems(selectedCount)}</Paragraph>\n </HStack>\n <HStack align='center' spacing={Spacing[2]}>\n {extraContent}\n {actions.map((action, index) => {\n const key = 'label' in action ? action.label : `action-${index}`;\n\n if ('popover' in action) {\n let trigger = null;\n if ('icon' in action && 'aria-label' in action) {\n // Icon-only action\n trigger = (\n <IconButton key={key} size='sm' aria-label={action['aria-label']}>\n {action.icon}\n </IconButton>\n );\n } else {\n trigger = (\n <Button key={key} variant={action.variant || 'basic'} size='sm'>\n {'label' in action ? action.label : ''}\n </Button>\n );\n }\n\n return (\n // Portaled: the bar is absolutely positioned inside the table's\n // scroll container, which clips an inline menu when the table\n // has a sticky header (`overflow: auto`).\n <DropdownMenu key={key} trigger={trigger} align='center' portal>\n {(action.popover?.options ?? []).map((option) => (\n <DropdownMenu.Item\n id={option.value}\n key={option.value}\n onClick={() => action.popover!.onOptionSelect(option.value)}\n >\n {option.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n );\n } else {\n if ('icon' in action && 'aria-label' in action) {\n // Icon-only action\n return (\n <IconButton\n key={key}\n size='sm'\n aria-label={action['aria-label']}\n onClick={action.onClick}\n >\n {action.icon}\n </IconButton>\n );\n } else {\n return (\n <Button\n key={key}\n onClick={action.onClick}\n variant={action.variant || 'basic'}\n size='sm'\n >\n {'label' in action ? action.label : ''}\n </Button>\n );\n }\n }\n })}\n </HStack>\n </Bar>\n );\n};\n\nexport default FloatingActionBar;\n","import { DateTime } from 'luxon';\nimport type { ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport { BorderRadius, Spacing } from '@persona/design-tokens';\nimport { ImageIcon } from '@persona/icons';\nimport Checkbox, { type CheckboxProps } from 'design-system/components/Checkbox';\nimport HoverCopyableField from 'design-system/components/HoverCopyableField';\nimport Link from 'design-system/components/Link';\nimport Pii from 'design-system/components/Pii';\nimport { HStack } from 'design-system/components/Stack';\nimport Sticker from 'design-system/components/Sticker';\nimport { Paragraph, TabularNumber } from 'design-system/components/Text';\nimport {\n DEFAULT_COMMON_STRINGS,\n formatDate,\n formatDateTime,\n type CommonStrings,\n} from 'design-system/lib/i18n';\nimport { semanticColor, semanticOnly } from 'design-system/lib/semanticColor';\n\nimport type {\n DataTableColumnFormat,\n DataTableColumnIDFormat,\n DataTableColumnImageFormat,\n DataTableColumnPiiFormat,\n DataTableColumnStringFormat,\n DateConfig,\n DatetimeConfig,\n RenderValueStickerFormatConfig,\n} from './types';\n\nconst EmptyCellText = styled(Paragraph)`\n ${semanticOnly((tokens) => `color: ${tokens.FgSecondaryStatic};`)}\n`;\n\nexport const renderAsCheckbox = ({\n rowId,\n isChecked,\n onChange,\n onValueChange,\n columnHeader,\n disabled,\n indeterminate,\n strings = DEFAULT_COMMON_STRINGS,\n}: {\n rowId: string;\n isChecked: boolean;\n /**\n * Called when the checkbox is clicked\n * @param e - The event object\n */\n onChange?: CheckboxProps['onChange'];\n /**\n * Called when the checkbox value changes\n * @param rowId - The id of the row\n * @param checked - The new value of the checkbox\n */\n onValueChange?: (rowId: string, checked: boolean) => void;\n columnHeader?: string;\n disabled?: boolean;\n indeterminate?: boolean;\n /** Built-in copy, from `usePDSStrings()`; English when omitted. */\n strings?: Pick<CommonStrings, 'selectRow' | 'selectRowForColumn'>;\n}): ReactNode => {\n const ariaLabel = columnHeader\n ? strings.selectRowForColumn(columnHeader, rowId)\n : strings.selectRow(rowId);\n\n return (\n <Checkbox\n checked={isChecked}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(rowId, e.target.checked);\n }}\n containerProps={{\n onClick: (e) => {\n // Prevent checkbox clicks from triggering row selection\n e.stopPropagation();\n },\n }}\n aria-label={ariaLabel}\n indeterminate={indeterminate}\n disabled={disabled}\n />\n );\n};\n\nexport const renderAsCheckboxHeader = ({\n header,\n isChecked,\n isIndeterminate,\n onChange,\n onValueChange,\n strings = DEFAULT_COMMON_STRINGS,\n}: {\n /**\n * The header text to display to the right of the checkbox\n */\n header?: string;\n isChecked: boolean;\n isIndeterminate: boolean;\n /**\n * Called when the checkbox is clicked\n * @param e - The event object\n */\n onChange?: CheckboxProps['onChange'];\n /**\n * Called when the checkbox value changes\n * @param rowId - The id of the row\n * @param checked - The new value of the checkbox\n */\n onValueChange?: (checked: boolean) => void;\n /** Built-in copy, from `usePDSStrings()`; English when omitted. */\n strings?: Pick<CommonStrings, 'selectAll' | 'selectAllOf'>;\n}): ReactNode => {\n const checkbox = (\n <Checkbox\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.checked);\n }}\n containerProps={{\n onClick: (e) => {\n // Prevent checkbox clicks from triggering column sorting\n e.stopPropagation();\n },\n }}\n aria-label={header ? strings.selectAllOf(header) : strings.selectAll}\n />\n );\n\n if (header) {\n return (\n <HStack spacing={Spacing[3]} align='center'>\n {checkbox}\n <span>{header}</span>\n </HStack>\n );\n }\n\n return checkbox;\n};\n\n// ---------------------------------------------------------------------------\n// Generic PDS cell renderers\n// ---------------------------------------------------------------------------\n\n/**\n * Options the built-in PDS cell renderers read from the provider. `DataTable` fills these in from\n * `usePDSLocale()` / `usePDSStrings()`; direct callers may omit them to get the English output.\n */\nexport interface PDSFormatOptions {\n /** BCP 47 locale. Dates and times keep the historical English format when omitted or en-US. */\n locale?: string;\n strings?: Pick<CommonStrings, 'noImage'>;\n}\n\nexport const renderAsString = (value: unknown): string => {\n if (value == null) {\n return '';\n }\n return typeof value === 'string'\n ? value\n : typeof value === 'object'\n ? JSON.stringify(value, null, 2)\n : String(value);\n};\n\nexport const renderAsDate = (value: unknown, config?: DateConfig, locale?: string): string => {\n if (value == null || typeof value !== 'string') {\n return '';\n }\n const date = DateTime.fromISO(value);\n return date.isValid\n ? formatDate(date, { locale, format: config?.format, showTimeZone: config?.showTimeZone })\n : '';\n};\n\nexport const renderAsDatetime = (\n value: unknown,\n config?: DatetimeConfig,\n locale?: string,\n): string => {\n if (value == null || typeof value !== 'string') {\n return '';\n }\n const date = DateTime.fromISO(value);\n return date.isValid\n ? formatDateTime(date, { locale, format: config?.format, showTimeZone: config?.showTimeZone })\n : '';\n};\n\nexport const renderAsURL = (value: unknown): ReactNode => {\n if (value == null || typeof value !== 'string' || value.length === 0) {\n return '';\n }\n return (\n <Link url={value} target='_blank'>\n {value}\n </Link>\n );\n};\n\nexport const renderAsNumber = (value: unknown): ReactNode => {\n if (value == null) {\n return '';\n }\n return <TabularNumber>{value}</TabularNumber>;\n};\n\nconst createSticker = (\n item: string,\n config?: RenderValueStickerFormatConfig,\n key?: string,\n): ReactNode => {\n const displayLabel = config?.labels?.[item] ?? item;\n const variant = config?.colors?.[item] ?? config?.defaultColor;\n return (\n <Sticker key={key} variant={variant}>\n {displayLabel}\n </Sticker>\n );\n};\n\nexport const renderAsSticker = (\n value: unknown,\n config?: RenderValueStickerFormatConfig,\n): ReactNode => {\n if (value == null) {\n return '';\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '';\n }\n return (\n <span style={{ display: 'flex', flexWrap: 'wrap', gap: '4px', alignItems: 'center' }}>\n {value.map((item, index) =>\n typeof item === 'string' ? createSticker(item, config, `${item}-${index}`) : null,\n )}\n </span>\n );\n }\n if (typeof value !== 'string') {\n return '';\n }\n return createSticker(value, config);\n};\n\n// ---------------------------------------------------------------------------\n// Private primitives used by PDS renderers\n// ---------------------------------------------------------------------------\n\n/** Inline monospace text — private DataTable primitive, avoids the dashboard Typography dep. */\nconst MonoText = styled.span`\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n font-size: 0.875em;\n`;\n\nconst WrappingText = styled.span`\n display: inline-block;\n max-width: 100%;\n word-break: break-word;\n overflow-wrap: break-word;\n`;\n\ntype EmptyImageProps = { $width?: string; $height?: string };\n\nconst EmptyImageContainer = styled.div<EmptyImageProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: ${BorderRadius.Md};\n background-color: ${({ theme }) => semanticColor(theme, 'SurfaceSecondary', theme.color.background.secondary)};\n width: ${({ $width }) => $width ?? '200px'};\n height: ${({ $height }) => $height ?? '144px'};\n svg {\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', theme.color.border.disabled)};\n }\n`;\n\nconst LightweightImg = styled.img<{ $fit?: string }>`\n object-fit: ${({ $fit }) => $fit ?? 'cover'};\n display: block;\n`;\n\n// ---------------------------------------------------------------------------\n// Copyable string renderer (used by 'string' and 'id' formats)\n// ---------------------------------------------------------------------------\n\nexport const renderAsCopyableString = (\n value: unknown,\n config?: DataTableColumnStringFormat['config'] & { emptyText?: string },\n): ReactNode => {\n const valueAsString = renderAsString(value);\n const content = config?.mono ? <MonoText>{valueAsString}</MonoText> : valueAsString;\n\n if (!valueAsString) {\n return <EmptyCellText>{config?.emptyText ?? ''}</EmptyCellText>;\n }\n\n return (\n <WrappingText>\n {config?.copyable ? (\n <HoverCopyableField copyValue={valueAsString}>{content}</HoverCopyableField>\n ) : (\n content\n )}\n </WrappingText>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PII renderer\n// ---------------------------------------------------------------------------\n\nexport const renderAsPii = <TData = unknown>(\n row?: TData,\n config?: DataTableColumnPiiFormat<TData>['config'],\n): ReactNode => {\n if (!config || !row) {\n return '';\n }\n const { isRedacted, piiValue, emptyText } = config;\n const piiValueString = piiValue(row);\n\n if (piiValueString == null || piiValueString.length === 0) {\n return (\n <>\n <EmptyCellText>{emptyText}</EmptyCellText>\n {config.subComponent?.(row)}\n </>\n );\n }\n\n return (\n <>\n <Pii isRedacted={isRedacted(row)}>{piiValueString}</Pii>\n {config.subComponent?.(row)}\n </>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Lightweight image renderer (no Redux / modal / forensics deps)\n// ---------------------------------------------------------------------------\n\nexport const renderAsLightweightImage = (\n value: unknown,\n config?: DataTableColumnImageFormat['config'],\n strings: Pick<CommonStrings, 'noImage'> = DEFAULT_COMMON_STRINGS,\n): ReactNode => {\n const isEmpty = value == null || value === '' || (Array.isArray(value) && value.length === 0);\n\n if (isEmpty) {\n return config?.fallback ? (\n <>{config.fallback}</>\n ) : (\n <EmptyImageContainer\n $width={config?.width}\n $height={config?.height}\n aria-label={config?.alt ?? 'image'}\n >\n <ImageIcon size={24} aria-label={strings.noImage} />\n </EmptyImageContainer>\n );\n }\n\n const src = typeof value === 'string' ? value : '';\n return (\n <LightweightImg\n src={src}\n alt={config?.alt ?? 'image'}\n width={config?.width ?? '200px'}\n height={config?.height ?? '144px'}\n $fit={config?.fit}\n />\n );\n};\n\n/**\n * Default PDS cell renderer. Handles all generic format types built into the design system.\n * Hosts should supply their own `renderFormat` prop to DataTable for format types that require\n * application-specific components (e.g. tags, files, PII masking, status indicators).\n */\nexport const renderAsPDSFormat = <TData = unknown>(\n value: unknown,\n format?: DataTableColumnFormat<TData>,\n row?: TData,\n options: PDSFormatOptions = {},\n): string | ReactNode => {\n switch (format?.type) {\n case 'date':\n return renderAsDate(value, format.config, options.locale);\n case 'datetime':\n return renderAsDatetime(value, format.config, options.locale);\n case 'sticker':\n return renderAsSticker(value, format.config);\n case 'url':\n return renderAsURL(value);\n case 'number':\n return renderAsNumber(value);\n case 'image':\n return renderAsLightweightImage(value, format.config, options.strings);\n case 'checkbox':\n // Checkbox columns are handled specially by the DataTable; this path is unreachable.\n return '';\n case 'id':\n return renderAsCopyableString(value, {\n copyable: true,\n mono: true,\n ...(format as DataTableColumnIDFormat).config,\n });\n case 'pii':\n return renderAsPii<TData>(row, (format as DataTableColumnPiiFormat<TData>).config);\n default:\n return renderAsCopyableString(\n value,\n (format as DataTableColumnStringFormat | undefined)?.config,\n );\n }\n};\n","import { kebabCase } from 'lodash-es';\nimport styled from 'styled-components';\n\nimport { Color } from '@persona/design-tokens';\nimport { PlusIcon } from '@persona/icons/12px';\nimport { TableCell, TableRow } from 'design-system/components/Table';\nimport { isFocused } from 'design-system/lib/pseudoClass';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { Z_INDICES } from 'design-system/lib/zindex';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\nconst InserterTableCell = styled(TableCell)<{ $nestSpacing: number }>`\n padding: 0 !important;\n ${({ $nestSpacing }) => ($nestSpacing ? `padding-left: ${$nestSpacing}px !important` : '')};\n height: 0;\n position: relative;\n border: 0;\n z-index: ${Z_INDICES.withShadow};\n`;\n\nconst AddRowLine = styled.div<{ $nestSpacing: number }>`\n position: absolute;\n top: -1px;\n background-color: ${({ theme }) => semanticColor(theme, 'BorderAccent', theme.color.primary.brand)};\n width: ${({ $nestSpacing }) => ($nestSpacing ? `calc(100% - ${$nestSpacing}px)` : '100%')};\n transition-duration: ${TransitionDuration.Fast};\n transition-property: opacity;\n transition-timing-function: ease-in;\n`;\n\nconst StyledPlusButton = styled.button`\n position: absolute;\n top: -7px;\n left: calc(50% - 8px);\n border-radius: 50%;\n height: 14px;\n width: 14px;\n background-color: ${({ theme }) => semanticColor(theme, 'ActionPrimary', theme.color.primary.brand)};\n color: ${({ theme }) => semanticColor(theme, 'FgInverse', Color.BackgroundButtonInverse)};\n cursor: pointer;\n z-index: ${Z_INDICES.withShadow};\n // TODO: Add a focus style\n\n opacity: 0;\n\n &:hover {\n opacity: 1;\n }\n\n &:hover ~ ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n`;\n\nconst StyledTableRow = styled(TableRow)`\n &${isFocused} {\n box-shadow: none;\n }\n cursor: pointer;\n &:hover > ${AddRowLine}, &:focus > ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n\n &:hover > ${StyledPlusButton}, &:focus > ${StyledPlusButton} {\n opacity: 1;\n }\n`;\n\nconst HoverArea = styled.div<{ $nestSpacing: number }>`\n position: absolute;\n height: 12px;\n top: -6px;\n width: ${({ $nestSpacing }) => ($nestSpacing ? `calc(100% - ${$nestSpacing}px)` : '100%')};\n z-index: ${Z_INDICES.withShadow};\n &:hover ~ ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n\n &:hover ~ ${StyledPlusButton} {\n opacity: 1;\n }\n`;\n\nconst StyledPlusIcon = styled(PlusIcon)`\n position: absolute;\n top: 1px;\n left: 1px;\n`;\n\ninterface InserterProps {\n priorRowLabel: string;\n colSpan: number;\n nestSpacing?: number;\n label?: string;\n onAddRow: () => void;\n}\n\nexport const Inserter: React.FC<InserterProps> = ({\n priorRowLabel,\n colSpan,\n nestSpacing = 0,\n label,\n onAddRow,\n}) => {\n return (\n <StyledTableRow\n onKeyDown={(evt) => {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n evt.stopPropagation();\n onAddRow();\n }\n }}\n tabIndex={0}\n >\n <InserterTableCell colSpan={colSpan} $nestSpacing={nestSpacing}>\n <HoverArea\n $nestSpacing={nestSpacing}\n role='presentation'\n aria-label={label || `Insert a row after ${priorRowLabel}`}\n onClick={onAddRow}\n />\n <StyledPlusButton\n id={`${kebabCase(priorRowLabel)}-inserter`}\n aria-label={label || `Insert a row after ${priorRowLabel}`}\n onClick={onAddRow}\n type='button'\n >\n <StyledPlusIcon color='currentColor' />\n </StyledPlusButton>\n <AddRowLine $nestSpacing={nestSpacing} onClick={onAddRow} />\n </InserterTableCell>\n </StyledTableRow>\n );\n};\n","import {\n type CellContext,\n type ColumnDef,\n createColumnHelper,\n type Row,\n type RowData,\n type Table,\n} from '@tanstack/react-table';\nimport { startCase } from 'lodash-es';\nimport { useCallback, useMemo, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { ChevronDownIcon, ChevronRightIcon, MoreIcon } from '@persona/icons';\nimport Button from 'design-system/components/Button';\nimport { getColumnWidths } from 'design-system/components/DataTable';\nimport type {\n HeadlessFilterConfig,\n RowAction,\n SortProps,\n} from 'design-system/components/DataTable/types';\nimport DropdownMenu from 'design-system/components/DropdownMenu';\nimport { usePDSStrings } from 'design-system/lib/i18n';\nimport { semanticColor } from 'design-system/lib/semanticColor';\n\nimport { renderAsCheckbox, renderAsCheckboxHeader } from './helpers';\nimport type { DataTableColumnFormat, DataTableColumns } from './types';\n\nconst ExpandButton = styled.button`\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n`;\n\nconst ExpandColumnPlaceholder = styled.span`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n`;\n\n/**\n * Host-injected cell format renderer. Dashboard passes its own implementation\n * that handles all format types including tags, files, and status indicators.\n */\nexport type RenderFormatFn<TData = unknown, TFormat extends { type: string } = { type: string }> = (\n value: unknown,\n format?: TFormat,\n row?: TData,\n) => React.ReactNode;\n\nexport interface UseTableColumnsParams<\n TData extends RowData,\n TFormat extends { type: string } = DataTableColumnFormat<TData>,\n TFilter = unknown,\n> {\n columns: DataTableColumns<TData, TFormat, TFilter>;\n data: TData[];\n compact?: boolean;\n sort?: boolean | SortProps;\n clientSearch?: boolean | { placeholder?: string; initialValue?: string };\n clientFiltering?: boolean;\n expandColumnVisibility?: 'auto' | 'always';\n showControls?: boolean;\n enableRowSelection?: boolean;\n enableSubRowSelection?: boolean;\n rowActions?: RowAction[] | ((row: TData) => RowAction[]);\n getRowId?: (row: TData) => string;\n expandedRows: Set<string>;\n toggleRowExpansion: (rowId: string) => void;\n canRowExpand: (rowData: TData) => boolean;\n checkboxColumnStates: Record<string, Set<string>>;\n handleCheckboxCellChange: (columnId: string, rowId: string, checked: boolean) => void;\n handleSelectAllCheckboxCell: (columnId: string, checked: boolean) => void;\n getSelfAndNestedRowIds: (row: TData, indexPath: number[]) => string[];\n handleRowSelectionWithShift: (\n clickedRow: Row<TData>,\n table: Table<TData>,\n checked: boolean,\n isShiftKey: boolean,\n ) => void;\n renderFormat: RenderFormatFn<TData, TFormat>;\n}\n\nexport function useTableColumns<\n TData extends RowData,\n TFormat extends { type: string } = DataTableColumnFormat<TData>,\n TFilter = unknown,\n>({\n columns,\n data,\n compact,\n sort,\n clientSearch,\n clientFiltering,\n expandColumnVisibility = 'auto',\n showControls,\n enableRowSelection = false,\n enableSubRowSelection = true,\n rowActions,\n getRowId,\n expandedRows,\n toggleRowExpansion,\n canRowExpand,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n getSelfAndNestedRowIds,\n handleRowSelectionWithShift,\n renderFormat,\n}: UseTableColumnsParams<TData, TFormat, TFilter>): [\n ColumnDef<TData, any>[],\n { key: string; label: string }[],\n] {\n const { EXPAND_COLUMN_WIDTH, SELECT_COLUMN_WIDTH, ACTION_COLUMN_WIDTH } =\n getColumnWidths(compact);\n const strings = usePDSStrings();\n const stringsRef = useRef(strings);\n stringsRef.current = strings;\n\n // Stable renderer identity: an inline `cell` gets a new identity on each column\n // rebuild, which flexRender treats as a new component type and remounts —\n // closing any open row-actions menu. Read live `rowActions` from a ref instead.\n const rowActionsRef = useRef(rowActions);\n rowActionsRef.current = rowActions;\n const renderActionCell = useCallback((props: CellContext<TData, unknown>) => {\n const currentRowActions = rowActionsRef.current;\n const actions =\n typeof currentRowActions === 'function'\n ? currentRowActions(props.row.original)\n : currentRowActions;\n\n if (!actions || actions.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <Button\n id={`data-table__row-actions-button--${props.row.id}`}\n variant='text'\n width='icon'\n size='sm'\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n aria-label={stringsRef.current.viewRowActions(props.row.index + 1)}\n >\n <MoreIcon />\n </Button>\n }\n portal\n >\n {actions.map(({ label, onClick, ...menuItemProps }, i) => (\n <DropdownMenu.Item\n key={label.toLowerCase().replace(/ /g, '-')}\n id={`data-table__row-actions--${props.row.id}-${i}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick(props.row.id);\n }}\n {...menuItemProps}\n >\n {label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n );\n }, []);\n const hasRowActions = rowActions != null;\n\n return useMemo(() => {\n const columnHelper = createColumnHelper<TData>();\n\n const tableColumns: ColumnDef<TData, any>[] = columns.map((column) => {\n if (typeof column === 'object') {\n const columnHelperOptions: Parameters<typeof columnHelper.accessor>[1] = {\n header: column.header,\n id: column.id || column.accessor,\n // Treats undefined and null as the lowest values for sorting\n sortUndefined: -1,\n meta: {\n align: column.align,\n format: column.format,\n minWidth: column.minWidth,\n width: column.width,\n headerTooltip: column.headerTooltip,\n },\n minSize: column.minWidth,\n };\n\n if (column.renderCell != null) {\n const renderCell = column.renderCell;\n columnHelperOptions.cell = (props) =>\n renderCell({ cellValue: props.getValue(), row: props.row.original });\n // A custom cell renderer controls display only — it does not affect sorting.\n // Honor the column's explicit `enableSorting` opt-in (defaults to off) so\n // server-sortable columns that need custom rendering still expose a sort control.\n columnHelperOptions.enableSorting = sort != null && (column.enableSorting ?? false);\n } else if (column.format?.type === 'checkbox') {\n // Handle checkbox column format\n const columnId = column.id || column.accessor;\n\n // Custom header with select all checkbox\n columnHelperOptions.header = (headerProps) => {\n const columnState = checkboxColumnStates[columnId] || new Set();\n // Select all rows for this column\n const allRowIds = data.flatMap((row, index) => getSelfAndNestedRowIds(row, [index]));\n const isChecked = allRowIds.length > 0 && allRowIds.every((id) => columnState.has(id));\n const isIndeterminate = !isChecked && allRowIds.some((id) => columnState.has(id));\n\n // If column.header is a function, call it with TanStack context props\n if (typeof column.header === 'function') {\n return column.header(headerProps);\n }\n\n return renderAsCheckboxHeader({\n header: column.header,\n isChecked,\n isIndeterminate,\n onValueChange: (checked) => handleSelectAllCheckboxCell(columnId, checked),\n strings,\n });\n };\n\n // Custom cell with individual checkbox\n columnHelperOptions.cell = (props) => {\n const rowId = getRowId ? getRowId(props.row.original) : props.row.id;\n const columnState = checkboxColumnStates[columnId] || new Set();\n const isChecked = columnState.has(rowId);\n\n return renderAsCheckbox({\n rowId,\n isChecked,\n onValueChange: (rowId, checked) => handleCheckboxCellChange(columnId, rowId, checked),\n columnHeader: typeof column.header === 'string' ? column.header : undefined,\n strings,\n });\n };\n\n // Disable sorting for checkbox columns\n columnHelperOptions.enableSorting = false;\n } else {\n // Ensure value is rendered as a string regardless of column value\n columnHelperOptions.cell = (props) =>\n renderFormat(props?.getValue(), column.format, props.row.original);\n // Only enable column sorting if table-level sorting is enabled and column allows it\n columnHelperOptions.enableSorting = sort != null && column.enableSorting;\n }\n\n // Enable global filtering based on clientSearch and column searchable property\n columnHelperOptions.enableGlobalFilter = clientSearch && (column.searchable ?? true);\n // Enable column pinning based on column configuration\n columnHelperOptions.enablePinning = column.pinned ?? false;\n\n // Configure column filtering\n if (clientFiltering && column.filter) {\n const filterConfig = column.filter as Partial<HeadlessFilterConfig>;\n if (filterConfig.enabled !== false) {\n columnHelperOptions.enableColumnFilter = true;\n if (filterConfig.filterFn) {\n columnHelperOptions.filterFn = filterConfig.filterFn;\n }\n }\n }\n\n return columnHelper.accessor(column.accessor, columnHelperOptions);\n }\n\n return columnHelper.accessor(column, {\n header: startCase(column),\n enableGlobalFilter: Boolean(clientSearch),\n enableSorting: sort != null,\n });\n });\n\n if (showControls && enableRowSelection) {\n tableColumns.unshift(\n columnHelper.display({\n id: 'select-col',\n enablePinning: true,\n enableResizing: false,\n size: SELECT_COLUMN_WIDTH,\n meta: {\n width: SELECT_COLUMN_WIDTH,\n },\n header: ({ table }) =>\n renderAsCheckboxHeader({\n isChecked: table.getIsAllRowsSelected(),\n // Show the dash whenever any row is selected (including all rows), since\n // clicking the header in that state deselects everything.\n isIndeterminate: table.getIsSomeRowsSelected() || table.getIsAllRowsSelected(),\n onChange: table.getToggleAllRowsSelectedHandler(),\n strings,\n }),\n cell: ({ row, table }) =>\n renderAsCheckbox({\n rowId: row.id,\n isChecked: row.getIsSelected(),\n onChange: (e) =>\n handleRowSelectionWithShift(\n row,\n table,\n e.target.checked,\n e.nativeEvent instanceof MouseEvent && e.nativeEvent.shiftKey,\n ),\n indeterminate: enableSubRowSelection && row.getIsSomeSelected(),\n disabled: !row.getCanSelect(),\n strings,\n }),\n }),\n );\n }\n\n // Add expansion column when any row can expand, or when forced visible for layout parity\n const showExpandColumn = expandColumnVisibility === 'always' || data.some(canRowExpand);\n if (showExpandColumn) {\n tableColumns.unshift(\n columnHelper.display({\n id: 'expand-col',\n enablePinning: true,\n enableResizing: false,\n size: EXPAND_COLUMN_WIDTH,\n meta: {\n width: EXPAND_COLUMN_WIDTH,\n },\n header: '',\n cell: ({ row }) => {\n const rowData = row.original;\n if (!canRowExpand(rowData)) {\n return <ExpandColumnPlaceholder aria-hidden />;\n }\n\n const rowId = getRowId ? getRowId(rowData) : row.id;\n const isExpanded = expandedRows.has(rowId);\n\n return (\n <ExpandColumnPlaceholder>\n <ExpandButton\n type='button'\n id={`datatable-expand-${rowId}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleRowExpansion(rowId);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n toggleRowExpansion(rowId);\n }\n }}\n aria-label={\n isExpanded ? `Hide details for row ${rowId}` : `View details for row ${rowId}`\n }\n aria-expanded={isExpanded}\n >\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </ExpandButton>\n </ExpandColumnPlaceholder>\n );\n },\n }),\n );\n }\n\n if (hasRowActions) {\n const emptyHeader = () => <></>;\n tableColumns.push(\n columnHelper.display({\n id: 'action-col',\n enableResizing: false,\n size: ACTION_COLUMN_WIDTH,\n meta: {\n width: ACTION_COLUMN_WIDTH,\n },\n header: emptyHeader,\n cell: renderActionCell,\n }),\n );\n }\n\n const columnOptions = columns.map((column) => {\n const key = typeof column === 'object' ? column.id || column.accessor : column;\n const label =\n typeof column === 'object'\n ? typeof column.header === 'string'\n ? column.header\n : key\n : startCase(column);\n\n return {\n key,\n label,\n };\n });\n\n return [tableColumns, columnOptions];\n }, [\n columns,\n enableRowSelection,\n hasRowActions,\n renderActionCell,\n showControls,\n sort,\n clientSearch,\n clientFiltering,\n data,\n canRowExpand,\n expandColumnVisibility,\n expandedRows,\n toggleRowExpansion,\n getRowId,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n handleRowSelectionWithShift,\n renderFormat,\n strings,\n ]);\n}\n","import {\n type Column,\n type ColumnFiltersState,\n type ColumnPinningState,\n type ExpandedState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getMemoOptions,\n getPaginationRowModel,\n getSortedRowModel,\n memo as tanstackMemo,\n type Row,\n type RowData,\n type RowModel,\n type RowSelectionState,\n type Table,\n type TableOptions,\n useReactTable,\n} from '@tanstack/react-table';\nimport {\n type ComponentProps,\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport Pagination, { MIN_PAGE_SIZE } from 'design-system/components/Pagination';\nimport {\n StickyTD,\n StickyTH,\n TableActionTD,\n TableLayout,\n TableTD,\n TableTH,\n TableTR,\n} from 'design-system/components/Table';\nimport { Paragraph } from 'design-system/components/Text';\nimport { TextUnderlineTooltip } from 'design-system/components/Tooltip';\nimport { usePDSLocale, usePDSStrings } from 'design-system/lib/i18n';\nimport { RouterLink } from 'design-system/lib/router';\nimport { Z_INDICES } from 'design-system/lib/zindex';\nimport { focusOutline } from 'design-system/mixins/focus';\nimport { semanticScrollbar } from 'design-system/mixins/scrollbar';\n\nimport { generateClientFilters, getFilterFnName } from './clientFilterUtils';\nimport { getColumnWidths } from './constants';\nimport FloatingActionBar from './FloatingActionBar';\nimport { renderAsPDSFormat } from './helpers';\nimport { Inserter } from './Inserter';\nimport TableControls, {\n isEmptyState,\n isFilterActive,\n TableViewConfigurationDropdown,\n type TableControlsProps,\n} from './TableControls';\nimport type { AttributeColumn, BaseFilterConfig, FilterConfig } from './TableControls/types';\nimport type {\n BulkAction,\n ColumnConfig,\n DataTableColumnFormat,\n DataTableColumns,\n RowAction,\n RowDataWithDetails,\n RowDataWithSubrows,\n RowDataWithSubrowsToAlwaysShowIds,\n RowDataWithTourTarget,\n SortProps,\n} from './types';\nimport { useTableColumns, type RenderFormatFn } from './useTableColumns';\n\n// https://tanstack.com/table/v8/docs/api/core/column-def#meta\ndeclare module '@tanstack/react-table' {\n // oxlint-disable-next-line no-unused-vars -- required for declaration merging\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: 'left' | 'right';\n format?: { type: string };\n minWidth?: number;\n width?: number;\n headerTooltip?: React.ReactNode;\n }\n}\n\nconst forwardedRowLinkClicks = new WeakSet<Event>();\n\nconst TableEmptyState = styled.td`\n vertical-align: middle;\n text-align: center;\n width: 100%;\n height: 176px;\n`;\n\nconst StyledTableLayout = styled(TableLayout)<{ $onAddRow: boolean }>`\n ${({ $onAddRow }) =>\n $onAddRow &&\n css`\n padding-bottom: ${Spacing[3]};\n `}\n`;\n\nconst TableContainer = styled.div<{ $stickyHeader: boolean }>`\n position: relative;\n ${semanticScrollbar}\n\n ${({ $stickyHeader }) =>\n $stickyHeader &&\n css`\n flex-grow: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `}\n`;\n\nconst RowLink = styled(RouterLink)`\n /* Match surrounding cell text. The row is still a link; only URL cells use accent. */\n color: inherit;\n text-decoration: none;\n ${focusOutline}\n\n &:link,\n &:visited,\n &:hover,\n &:active {\n color: inherit;\n }\n`;\n\nconst StyledDataTableControls = styled(TableControls)``;\nexport const DataTableControls = StyledDataTableControls as typeof StyledDataTableControls &\n typeof TableControls;\n\nexport const DataTableContainer = styled.div<{ $stickyHeader: boolean }>`\n ${({ $stickyHeader }) =>\n $stickyHeader &&\n css`\n display: flex;\n flex-direction: column;\n height: 100%;\n `}\n`;\n\nconst StyledTableActionTD = styled(TableActionTD)<{ $nestSpacing?: number }>`\n ${({ $nestSpacing }) => css`\n ${\n $nestSpacing &&\n css`\n position: relative;\n left: ${$nestSpacing}px;\n `\n }\n `}\n`;\n\nconst StyledTableTD = styled(TableTD)<{ $nestSpacing?: number; $isFeatureCol?: boolean }>`\n // Move the cell to the right by the amount of the nest spacing, and\n // add same amount of padding to the right to not overlap with the next cell\n ${({ $nestSpacing, $isFeatureCol }) => css`\n ${\n $nestSpacing &&\n css`\n position: relative;\n left: ${$nestSpacing}px;\n `\n }\n ${\n !$isFeatureCol &&\n css`\n padding-right: ${$nestSpacing}px;\n `\n }\n `}\n`;\n\nconst DetailsTD = styled(TableTD)`\n padding: 0;\n border-top: none;\n border-left: none;\n border-right: none;\n`;\n\nconst StickyDetailsTD = styled(StickyTD)`\n padding: 0;\n border-top: none;\n border-left: none;\n border-right: none;\n`;\n\nconst StickyTDWithGapCoverage = styled(StickyTD)<{ $gapCoverage?: number }>`\n ${({ $gapCoverage }) =>\n $gapCoverage &&\n css`\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: ${-$gapCoverage}px;\n width: ${$gapCoverage}px;\n height: calc(100% + 1px); // +1px to cover the bottom border\n background: inherit;\n }\n `}\n`;\n\nexport const FloatingActionBarContainer = styled.div`\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n`;\n\nconst isServerPagination = (\n pagination: DataTableProps<unknown>['pagination'],\n): pagination is ComponentProps<typeof Pagination> => {\n return typeof pagination === 'object' && !('clientPagination' in pagination);\n};\n\nconst isClientPagination = (\n pagination: DataTableProps<unknown>['pagination'],\n): pagination is ClientPaginationProps => {\n return typeof pagination === 'object' && 'clientPagination' in pagination;\n};\n\nconst isServerSorting = (sort: boolean | SortProps | undefined): sort is SortProps => {\n return typeof sort === 'object';\n};\n\nconst isRowWithDetails = <TData extends RowData>(row: TData): row is RowDataWithDetails<TData> => {\n return row != null && typeof row === 'object' && '_details' in row && row._details != null;\n};\n\nconst isRowWithSubrows = <TData extends RowData>(row: TData): row is RowDataWithSubrows<TData> => {\n return row != null && typeof row === 'object' && 'subrows' in row && row.subrows != null;\n};\n\nconst isRowWithSubrowsToAlwaysShowIds = <TData extends RowData>(\n row: TData,\n): row is RowDataWithSubrowsToAlwaysShowIds<TData> => {\n return (\n row != null &&\n typeof row === 'object' &&\n 'subrowsToAlwaysShowIds' in row &&\n row.subrowsToAlwaysShowIds != null\n );\n};\n\nconst isRowWithTourTarget = <TData extends RowData>(\n row: TData,\n): row is RowDataWithTourTarget<TData> => {\n return (\n row != null &&\n typeof row === 'object' &&\n 'dataTourTarget' in row &&\n typeof row.dataTourTarget === 'string'\n );\n};\n\ntype ClientPaginationProps = {\n clientPagination: true;\n pageSize?: number;\n pageSizeOptions?: number[];\n};\nexport interface DataTableProps<\n TData extends RowData,\n TFilter extends BaseFilterConfig = FilterConfig,\n> {\n /**\n * Data to render.\n * If a row has a _details property that is a function, it will be called\n * with the row data as props.\n * If a row has a _details property that is a React node, it will be rendered as is.\n */\n data: TData[];\n\n /**\n * Columns to display in the table. May be a string or column config object.\n *\n * Strings get converted from camelCase to Start Case.\n */\n columns: DataTableColumns<TData, DataTableColumnFormat<TData>>;\n\n /**\n * Component to render details for expandable rows.\n * Useful if we want to render the same details component for every row.\n * Receives rowData as props.\n */\n detailComponent?: React.ComponentType<{ rowData: TData }>;\n\n /**\n * When `'always'`, the leading expand column is shown even if no rows are expandable.\n * When `'auto'`, the column is omitted unless at least one row can expand. Rows that\n * cannot expand keep an empty spacer in this column so labels stay aligned.\n */\n expandColumnVisibility?: 'auto' | 'always';\n\n /**\n * Whether to display table controls such as search, filters, views, and selection\n */\n showControls?: boolean;\n\n /**\n * Props to pass to the TableControls component\n */\n controls?: TableControlsProps<TFilter>;\n\n /**\n * Custom text to display when the table is empty. Will default to \"No results found\"\n */\n emptyState?: {\n title?: string;\n description?: string;\n };\n\n /**\n * Whether to display pagination controls. If true, will use client-side pagination. If an object,\n * can be either advanced configuration of cleitn paginaton or server-side pagination state..\n */\n pagination?: boolean | ClientPaginationProps | ComponentProps<typeof Pagination>;\n\n /**\n * Whether to display sort controls. If true, will use client-side sorting. If an object, will use server-side sorting.\n */\n sort?: boolean | SortProps;\n\n /**\n * Whether to display the column properties button and popover. Allows control of column visiblity and ordering.\n */\n showColumnProperties?: boolean;\n\n /**\n * Whether to enable sorting removal. If true, will allow sorting to be removed by clicking the sort control.\n */\n enableSortingRemoval?: boolean;\n\n /**\n * Set to true to sort descending first, which is the case for most of our tables.\n */\n sortDescFirst?: boolean;\n\n /**\n * Called when column visibility or ordering is updated. Useful for saving column properties.\n */\n onUpdateColumnProperties?: (newConfiguration: AttributeColumn[]) => void;\n\n /**\n * Whether the table is loading data\n */\n isLoading?: boolean;\n\n /**\n * Whether to enable row selection\n */\n enableRowSelection?: boolean;\n\n /**\n * Whether to enable automatic sub row selection when a parent row is selected\n */\n enableSubRowSelection?: boolean;\n\n /**\n * Define the row id for the given row. Used by row selection and bulk actions.\n */\n getRowId?: (row: TData) => string;\n\n /**\n * Define the aria label for the given row.\n */\n getRowLabel?: (row: TData) => string;\n\n /**\n * Determine if a row can be selected. Used to disable row selection for specific rows.\n */\n getRowSelectable?: (row: TData) => boolean;\n\n /**\n * Makes the row link cell an anchor if provided. Get link for the given row.\n */\n getLinkToRow?: (row: TData) => string;\n\n /**\n * If set, each row will be a link to the given prefix + the row's `id` value.\n * `getLinkToRow` will override this.\n */\n rowLinkPrefix?: string;\n\n /**\n * Column id whose cell contains the row link when `getLinkToRow`/`rowLinkPrefix` is set.\n * Defaults to the first visible non-feature column (not select/expand/action). URL-formatted\n * columns are skipped.\n */\n rowLinkColumnId?: string;\n\n /**\n * Component to use for row links. Defaults to the PDS router-aware link.\n * Pass a custom component (e.g. Next.js Link) to use a different router.\n * The component renders as an inline anchor inside the link cell and receives `to`,\n * `className`, and `children`.\n */\n rowLinkComponent?: React.ElementType;\n\n /**\n * Whether to show the compact variant of the table.\n * Compact tables do not support views.\n */\n compact?: boolean;\n\n /**\n * Disables the row hover highlight. Use for read-only, non-interactive tables where the\n * hover background would misleadingly imply rows are selectable or clickable.\n */\n disableRowHover?: boolean;\n\n /**\n * Title to display in the table.\n */\n title?: string;\n\n /**\n * Whether to make the table header sticky when scrolling vertically.\n * When enabled, the controls and table header will remain visible at the top of the viewport while scrolling through table data.\n * Note that the sticky header styling assumes this component is contained within a parent with `display: flex` and `flex-direction: column`.\n */\n stickyHeader?: boolean;\n\n /**\n * Enable client-side search functionality.\n * Pass an object to configure the search input.\n */\n clientSearch?:\n | boolean\n | {\n placeholder?: string;\n initialValue?: string;\n };\n\n /**\n * Controlled search term for client-side search.\n * When provided, the search input becomes controlled.\n * Use with onSearchTermChange to manage search state externally.\n */\n searchTerm?: string;\n\n /**\n * Called when the search term changes (for controlled search).\n * Only used when searchTerm prop is provided.\n */\n onSearchTermChange?: (searchTerm: string) => void;\n\n /**\n * Whether to use manual filtering. If true, will not use the global filter function 'includesString'.\n */\n manualFiltering?: boolean;\n\n /**\n * Controlled expanded row IDs.\n * When provided, row expansion becomes controlled.\n * Use with onExpandedRowsChange to manage expansion state externally.\n */\n expandedRowIds?: Set<string>;\n\n /**\n * Called when expanded rows change (for controlled expansion).\n * Only used when expandedRowIds prop is provided.\n */\n onExpandedRowsChange?: (expandedRowIds: Set<string>) => void;\n\n /**\n * Enable client-side filtering functionality.\n * Users must explicitly define filter types for columns in TableControls.\n * Generated controls are legacy-only; `controls.filtersV2` does not drive client filtering.\n */\n clientFiltering?: boolean;\n\n /**\n * @internal Not part of the public API surface.\n * Used exclusively by the DashboardDataTable wrapper to share TanStack column-filter\n * state with the dashboard's generateClientFilters adapter.\n * Pass only via the wrapper's any-cast spread — do not use directly.\n * @deprecated Prefer `column.filter` for defining client-side filters.\n */\n columnFilters?: ColumnFiltersState;\n\n /**\n * When true, the empty-state message will read \"No results found. Try changing your filters.\"\n * even when the DataTable's own filter state is empty.\n * Use this when the host manages active server-side filters outside the DataTable\n * (e.g. via an injected filterPanel) so the conditional empty state still reflects those filters.\n */\n hasExternalActiveFilters?: boolean;\n\n /**\n * Called when the column-level filter state changes.\n * Use this to drive an injected filter-panel UI from outside the DataTable,\n * e.g. to feed `generateClientFilters` with the current TanStack filter state.\n */\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n\n /**\n * Host-provided cell format renderer.\n * The PDS built-in handles string, number, date, datetime, url, sticker, image, id, and pii.\n * Pass a custom renderer to handle additional application-specific formats (e.g. tags, files,\n * status indicators) or to override PDS defaults.\n */\n renderFormat?: RenderFormatFn<TData, DataTableColumnFormat<TData>>;\n\n /**\n * Actions to display in each table row.\n * Can be a static array (same actions for all rows) or a function that\n * receives the row data and returns actions specific to that row.\n */\n rowActions?: RowAction[] | ((row: TData) => RowAction[]);\n\n /**\n * Bulk actions to display when there are selected rows.\n * For standard variant, actions will be shown in the table controls.\n * For compact variant, actions will be shown in a floating action bar.\n * If bulkActions are provided in `controls.bulkActions`, they will override the bulkActions prop.\n */\n bulkActions?: BulkAction[];\n\n /**\n * Function that returns available bulk actions based on selected rows.\n * This allows dynamic bulk actions that change based on the selection.\n * Takes precedence over static bulkActions prop.\n */\n getAvailableBulkActions?: (selectedRows: TData[]) => BulkAction[];\n\n /**\n * Callback fired when the set of selected rows changes.\n * Receives the currently selected row data objects.\n */\n onRowSelectionChange?: (selectedRows: TData[]) => void;\n\n /**\n * If present, will display a thin row between rows as UI affordance to add a new row.\n * The row will be added after the row identified by the provided rowId, and the addAsChild flag will\n * indicate if the added row will be a sibling or a child of the referenced row\n * Adding said row will be handled by this `onAddRow` callback.\n */\n onAddRow?: (rowId: string, addAsChild: boolean) => void;\n\n /**\n * Called to determine if a row can be added after the provided row.\n * If not provided, assume true.\n * If this resolves to false, we will hide the inserter row.\n */\n canAddAfterRow?: (row: TData, addAsChild: boolean) => boolean;\n\n /**\n * Called when a row is clicked. If provided, rows will have cursor pointer\n * and clicking a row will call this function with the row id.\n * When omitted, rows that can expand (via `_details` or `detailComponent`) toggle expand/collapse on row click.\n */\n onRowClick?: (rowId: string) => void;\n\n /**\n * The active row id. If provided, the row will be in an active state.\n */\n activeRowId?: string;\n\n /**\n * Called with the ordered ids of the rows currently displayed, reflecting\n * client-side search, filtering, and sorting. Lets a parent step through the\n * on-screen order (e.g. prev/next navigation in a detail panel).\n */\n onDisplayedRowIdsChange?: (rowIds: string[]) => void;\n\n /**\n * Custom left offset in pixels to add to all pinned columns.\n * Useful when the table is nested inside containers that need additional spacing.\n */\n pinnedColumnLeftOffset?: number;\n\n /**\n * When false, the table does not scroll horizontally on its own and an ancestor is expected\n * to. Set this when a host scrolls the table and positions its header or pinned columns\n * against that ancestor, so those offsets are not trapped in the table's own scrollport.\n * Combining this with `stickyHeader` is contradictory: `stickyHeader` gives the table an\n * inner scrollport of its own, which is the thing this prop gives up.\n */\n scrollsHorizontally?: boolean;\n\n /**\n * Custom content to render inside the floating action bar, between the\n * selection count and the action buttons. Only rendered when the floating\n * action bar is visible (compact mode with selected rows).\n */\n floatingBarContent?: React.ReactNode;\n}\n\n// Unit-separator control char; joins row ids into a change-detection key that\n// can't collide with characters found in real row ids.\nconst DISPLAYED_ROW_IDS_SEPARATOR = '\\u001f';\n\n/**\n * The DataTable component is the core of Persona's table experiences.\n *\n * This component implements `@tanstack/react-table` and exposes a simplified, easy to use API.\n *\n * Planned functionality\n * - Column visibility, reordering\n * - Row selection\n * - Cell types (e.g. links, buttons, Stickers)\n *\n * Client-side support\n * - ✅ Sorting\n * - ✅ Search (enable with clientSearch prop)\n * - ✅ Pagination\n * - ✅ Filtering (requires explicit filter configuration in TableControls)\n *\n * Server-side support\n * - ✅ Sorting\n * - ✅ Filtering\n * - ✅ Pagination\n *\n * @example\n * // Basic usage with client-side search\n * <DataTable\n * data={data}\n * columns={columns}\n * showControls={true}\n * clientSearch={{ placeholder: \"Search accounts...\" }}\n * />\n *\n * @example\n * // Column-level search control\n * const columns = [\n * { accessor: 'id', header: 'ID', searchable: false },\n * { accessor: 'name', header: 'Name' }, // searchable by default\n * { accessor: 'email', header: 'Email' },\n * ];\n */\n\nexport const DataTable = <TData extends RowData, TFilter extends BaseFilterConfig = FilterConfig>({\n data,\n columns,\n detailComponent,\n expandColumnVisibility = 'auto',\n showControls,\n controls,\n emptyState,\n isLoading,\n pagination,\n sort,\n sortDescFirst,\n enableSortingRemoval,\n showColumnProperties = false,\n onUpdateColumnProperties,\n enableRowSelection = false,\n enableSubRowSelection = true,\n getRowId,\n getRowLabel,\n getRowSelectable,\n getLinkToRow,\n rowLinkPrefix,\n rowLinkColumnId,\n rowLinkComponent,\n compact,\n disableRowHover,\n title,\n clientSearch = false,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n manualFiltering,\n expandedRowIds: controlledExpandedRowIds,\n onExpandedRowsChange,\n clientFiltering = false,\n columnFilters: controlledColumnFilters,\n hasExternalActiveFilters = false,\n onColumnFiltersChange,\n renderFormat,\n rowActions,\n bulkActions,\n getAvailableBulkActions,\n onRowSelectionChange,\n onAddRow,\n stickyHeader = false,\n canAddAfterRow,\n onRowClick,\n activeRowId,\n onDisplayedRowIdsChange,\n pinnedColumnLeftOffset = 0,\n scrollsHorizontally = true,\n floatingBarContent,\n}: DataTableProps<TData, TFilter>) => {\n const DEFAULT_SEARCH_PLACEHOLDER = 'Search...';\n const { NEST_SPACING, EXPAND_COLUMN_WIDTH } = getColumnWidths(compact);\n const [columnVisibility, setColumnVisibility] = useState(() => {\n const visibility: { [key: string]: boolean } = {};\n columns.forEach((column) => {\n const columnId = typeof column === 'object' ? (column.id ?? column.accessor) : column;\n visibility[columnId] = typeof column === 'object' ? (column.visibility ?? true) : true; // Set default visibility to true if no option is passed in\n });\n return visibility;\n });\n const [columnOrder, setColumnOrder] = useState<string[]>([]);\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n // Tracks the most recently clicked selection checkbox to support shift+click range selection.\n const lastSelectedRowIdRef = useRef<string | null>(null);\n\n // Search term: use controlled state if provided, otherwise use internal state\n const isSearchControlled = controlledSearchTerm != null;\n const [internalSearchTerm, setInternalSearchTerm] = useState<string>(\n typeof clientSearch === 'object' ? clientSearch.initialValue || '' : '',\n );\n const globalFilter = isSearchControlled ? controlledSearchTerm : internalSearchTerm;\n const setGlobalFilter = useCallback(\n (value: string) => {\n if (isSearchControlled) {\n onSearchTermChange?.(value);\n } else {\n setInternalSearchTerm(value);\n }\n },\n [isSearchControlled, onSearchTermChange],\n );\n\n const isColumnFiltersControlled = controlledColumnFilters != null;\n const [internalColumnFilters, setInternalColumnFilters] = useState<ColumnFiltersState>([]);\n const columnFilters = isColumnFiltersControlled ? controlledColumnFilters : internalColumnFilters;\n\n const setColumnFilters = useCallback<Dispatch<SetStateAction<ColumnFiltersState>>>(\n (updater) => {\n const next = typeof updater === 'function' ? updater(columnFilters) : updater;\n if (!isColumnFiltersControlled) {\n setInternalColumnFilters(next);\n }\n onColumnFiltersChange?.(next);\n },\n [columnFilters, isColumnFiltersControlled, onColumnFiltersChange],\n );\n\n // Expanded rows: use controlled state if provided, otherwise use internal state\n const isExpansionControlled = controlledExpandedRowIds != null;\n const [internalExpandedRows, setInternalExpandedRows] = useState<Set<string>>(new Set());\n const expandedRows = isExpansionControlled ? controlledExpandedRowIds : internalExpandedRows;\n const setExpandedRows = useCallback(\n (updater: (prev: Set<string>) => Set<string>) => {\n if (isExpansionControlled) {\n const newValue = updater(expandedRows);\n onExpandedRowsChange?.(newValue);\n } else {\n setInternalExpandedRows(updater);\n }\n },\n [expandedRows, isExpansionControlled, onExpandedRowsChange],\n );\n\n const [checkboxColumnStates, setCheckboxColumnStates] = useState<Record<string, Set<string>>>({});\n\n const orderMap = columnOrder.reduce<{ [key: string]: number }>((acc, columnId, index) => {\n acc[columnId] = index;\n return acc;\n }, {});\n\n /**\n * If basic client pagination is enabled, create a configuration object for client pagination.\n */\n if (pagination === true) {\n pagination = {\n clientPagination: true,\n pageSize: MIN_PAGE_SIZE,\n };\n }\n\n // Helper function to check if a row can be expanded\n const canRowExpand = useCallback(\n (rowData: TData): boolean => {\n if (isRowWithSubrows(rowData)) {\n return rowData.subrows.length > 0;\n }\n if (isRowWithDetails(rowData)) {\n return Boolean(rowData._details);\n }\n return detailComponent != null;\n },\n [detailComponent],\n );\n\n // Calculate initial column pinning state from column configuration\n const initialColumnPinning = useMemo((): ColumnPinningState => {\n const pinnedColumns: string[] = [];\n\n // Check if we have any pinned columns\n const hasPinnedColumns = columns.some((column) => typeof column === 'object' && column.pinned);\n\n if (hasPinnedColumns) {\n // Add special columns first (they should be leftmost)\n const showExpandColumn = expandColumnVisibility === 'always' || data.some(canRowExpand);\n if (showExpandColumn) {\n pinnedColumns.push('expand-col');\n }\n if (showControls && enableRowSelection) {\n pinnedColumns.push('select-col');\n }\n\n // Then add user-defined pinned columns\n columns.forEach((column) => {\n if (typeof column === 'object' && column.pinned) {\n pinnedColumns.push(column.accessor);\n }\n });\n }\n\n return {\n left: pinnedColumns,\n };\n }, [columns, data, canRowExpand, expandColumnVisibility, showControls, enableRowSelection]);\n\n // Helper function to toggle row expansion\n const toggleRowExpansion = useCallback(\n (rowId: string) => {\n setExpandedRows((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(rowId)) {\n newSet.delete(rowId);\n } else {\n newSet.add(rowId);\n }\n return newSet;\n });\n },\n [setExpandedRows],\n );\n\n // Helper function to call onUpdate for checkbox columns\n const dispatchCheckboxCellOnUpdate = useCallback(\n (columnId: string, columnState: Set<string>) => {\n const column = columns.find(\n (col) =>\n typeof col === 'object' && col.accessor === columnId && col.format?.type === 'checkbox',\n );\n if (column && typeof column === 'object' && column.format?.type === 'checkbox') {\n column.format.onUpdate(Array.from(columnState));\n }\n },\n [columns],\n );\n\n // Helper function to handle checkbox column state changes\n const handleCheckboxCellChange = useCallback(\n (columnId: string, rowId: string, checked: boolean) => {\n setCheckboxColumnStates((prev) => {\n const newStates = { ...prev };\n if (!newStates[columnId]) {\n newStates[columnId] = new Set();\n }\n\n const columnState = new Set(newStates[columnId]);\n if (checked) {\n columnState.add(rowId);\n } else {\n columnState.delete(rowId);\n }\n\n newStates[columnId] = columnState;\n dispatchCheckboxCellOnUpdate(columnId, columnState);\n return newStates;\n });\n },\n [dispatchCheckboxCellOnUpdate],\n );\n\n const getSelfAndNestedRowIds = useCallback(\n (row: TData, indexPath: number[]): string[] => {\n const rowId = getRowId ? getRowId(row) : indexPath.join('.');\n if (isRowWithSubrows(row)) {\n return [\n rowId,\n ...(row.subrows ?? [])\n .map((subrow, subrowIndex) =>\n getSelfAndNestedRowIds(subrow, [...indexPath, subrowIndex]),\n )\n .flat(),\n ];\n }\n return [rowId];\n },\n [getRowId],\n );\n\n // Helper function to handle \"select all\" checkbox for a column\n const handleSelectAllCheckboxCell = useCallback(\n (columnId: string, checked: boolean) => {\n setCheckboxColumnStates((prev) => {\n const newStates = { ...prev };\n let columnState: Set<string>;\n\n if (checked) {\n // Select all rows for this column\n const allRowIds = data.flatMap((row, index) => getSelfAndNestedRowIds(row, [index]));\n columnState = new Set(allRowIds);\n } else {\n // Deselect all rows for this column\n columnState = new Set();\n }\n\n newStates[columnId] = columnState;\n dispatchCheckboxCellOnUpdate(columnId, columnState);\n return newStates;\n });\n },\n [data, getRowId, dispatchCheckboxCellOnUpdate],\n );\n\n const tableOptions: Partial<TableOptions<TData>> = useMemo(() => {\n const options: Partial<TableOptions<TData>> = {};\n\n // Client-side pagination\n if (isClientPagination(pagination)) {\n options.getPaginationRowModel = getPaginationRowModel();\n options.initialState = {\n pagination: {\n pageSize: pagination.pageSize,\n },\n };\n } else if (isServerPagination(pagination)) {\n const currentPage = pagination.paginationParams?.['current-page'] || 1;\n const pageSize = pagination.pageSize || MIN_PAGE_SIZE;\n\n options.manualPagination = true;\n options.onPaginationChange = (updaterOrValue) => {\n const oldPageSize = pageSize;\n const oldPageIndex = currentPage - 1;\n\n if (typeof updaterOrValue === 'function') {\n const newPaginationState = updaterOrValue({\n pageSize,\n pageIndex: currentPage - 1,\n });\n\n if (newPaginationState.pageSize !== oldPageSize) {\n pagination.handlePageSizeClick(newPaginationState.pageSize);\n }\n\n if (newPaginationState.pageIndex !== oldPageIndex) {\n pagination.handlePageLinkClick(newPaginationState.pageIndex + 1);\n }\n }\n };\n options.state = {\n pagination: {\n pageSize,\n pageIndex: currentPage - 1,\n },\n };\n options.rowCount = pagination?.paginationParams?.['total-count'];\n options.pageCount = pagination?.paginationParams?.['total-pages'];\n }\n\n if (sort === true) {\n options.getSortedRowModel = getSortedRowModel();\n options.enableSorting = true;\n } else if (isServerSorting(sort)) {\n options.manualSorting = true;\n options.enableSorting = true;\n options.onSortingChange = (updaterOrValue) => {\n if (typeof updaterOrValue === 'function') {\n const newSortingState = updaterOrValue(sort.state);\n sort.handleSortClick(newSortingState);\n }\n };\n\n options.state = {\n ...(options.state ? options.state : {}),\n sorting: sort.state,\n };\n } else {\n options.enableSorting = false;\n }\n\n if (showControls && enableRowSelection) {\n options.enableRowSelection = getRowSelectable\n ? (row) => getRowSelectable(row.original)\n : true;\n options.onRowSelectionChange = setRowSelection;\n }\n\n if (!enableSubRowSelection) {\n options.enableSubRowSelection = false;\n }\n\n // Client-side global filtering\n if (clientSearch) {\n if (manualFiltering) {\n options.manualFiltering = true;\n } else {\n options.getFilteredRowModel = getFilteredRowModel();\n options.globalFilterFn = 'includesString';\n }\n options.onGlobalFilterChange = setGlobalFilter;\n }\n\n // Client-side column filtering\n if (clientFiltering) {\n options.getFilteredRowModel = getFilteredRowModel();\n options.onColumnFiltersChange = setColumnFilters;\n }\n\n // Build column visibility: use explicit values when provided, fall back to state or default\n const columnOptionsVisibility: Record<string, boolean> = {};\n columns.forEach((column) => {\n const columnId = typeof column === 'object' ? column.id || column.accessor : column;\n // Use explicit visibility if provided, otherwise fall back to state value or default true\n if (typeof column === 'object' && 'visibility' in column && column.visibility != null) {\n columnOptionsVisibility[columnId] = column.visibility;\n } else {\n columnOptionsVisibility[columnId] = columnVisibility[columnId] ?? true;\n }\n });\n options.state = { ...options.state, columnVisibility: columnOptionsVisibility };\n\n const expandedState: Record<string, boolean> = {};\n for (const rowId of expandedRows) {\n expandedState[rowId] = true;\n }\n options.state = {\n ...options.state,\n columnOrder,\n rowSelection,\n columnPinning: initialColumnPinning,\n expanded: expandedState,\n ...(clientSearch && { globalFilter }),\n ...(clientFiltering && { columnFilters }),\n };\n options.onColumnVisibilityChange = setColumnVisibility;\n options.onColumnOrderChange = setColumnOrder;\n options.enableSortingRemoval = enableSortingRemoval;\n options.sortDescFirst = sortDescFirst;\n options.enableColumnPinning = initialColumnPinning.left && initialColumnPinning.left.length > 0;\n\n return options;\n }, [\n pagination,\n columnVisibility,\n columnOrder,\n enableRowSelection,\n enableSubRowSelection,\n rowSelection,\n showControls,\n sort,\n enableSortingRemoval,\n sortDescFirst,\n clientSearch,\n globalFilter,\n clientFiltering,\n columnFilters,\n columns,\n initialColumnPinning,\n expandedRows,\n ]);\n\n // Handle row selection from the built-in select column, supporting shift+click range selection.\n // On shift+click, every selectable row between the last clicked row and the current row (in the\n // displayed order) is set to the clicked checkbox's new value.\n const handleRowSelectionWithShift = useCallback(\n (clickedRow: Row<TData>, table: Table<TData>, checked: boolean, isShiftKey: boolean) => {\n const displayedRows = table.getRowModel().rows;\n const currentIndex = displayedRows.findIndex((r) => r.id === clickedRow.id);\n const lastSelectedRowId = lastSelectedRowIdRef.current;\n const lastIndex =\n lastSelectedRowId != null ? displayedRows.findIndex((r) => r.id === lastSelectedRowId) : -1;\n\n if (isShiftKey && lastIndex !== -1 && currentIndex !== -1) {\n const startIndex = Math.min(lastIndex, currentIndex);\n const endIndex = Math.max(lastIndex, currentIndex);\n displayedRows.slice(startIndex, endIndex + 1).forEach((rangeRow) => {\n if (rangeRow.getCanSelect()) {\n rangeRow.toggleSelected(checked);\n }\n });\n } else {\n clickedRow.toggleSelected(checked);\n }\n\n lastSelectedRowIdRef.current = clickedRow.id;\n },\n [],\n );\n\n // Enrich columns with filterFn derived from ClientFilterConfig.type so that\n // the PDS useTableColumns hook sets the correct TanStack filter function.\n const columnsWithFilterFn = useMemo(() => {\n if (!clientFiltering) {\n return columns;\n }\n return columns.map((column) => {\n if (\n typeof column === 'object' &&\n column.filter != null &&\n typeof column.filter === 'object' &&\n 'type' in column.filter &&\n typeof (column.filter as { type: unknown }).type === 'string'\n ) {\n const filterType = (column.filter as { type: string }).type;\n return {\n ...column,\n filter: { ...column.filter, filterFn: getFilterFnName(filterType) },\n };\n }\n return column;\n }) as DataTableColumns<TData>;\n }, [columns, clientFiltering]);\n\n const strings = usePDSStrings();\n const locale = usePDSLocale();\n const defaultRenderFormat = useCallback<RenderFormatFn<TData, DataTableColumnFormat<TData>>>(\n (value, format, row) => renderAsPDSFormat(value, format, row, { locale, strings }),\n [locale, strings],\n );\n\n const [tableColumns, columnOptions] = useTableColumns({\n columns: columnsWithFilterFn,\n data,\n compact,\n sort,\n clientSearch,\n clientFiltering,\n expandColumnVisibility,\n showControls,\n enableRowSelection,\n enableSubRowSelection,\n rowActions,\n getRowId,\n expandedRows,\n toggleRowExpansion,\n canRowExpand,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n getSelfAndNestedRowIds,\n handleRowSelectionWithShift,\n renderFormat: renderFormat ?? defaultRenderFormat,\n });\n\n // Custom getExpandedRowModel and expandRows functions to support showing specific nested rows even if the parent row is not expanded\n // Particularly useful when searching for specific rows and we want to show the nested rows that match the search term,\n // but not the other sibling nested rows. The logic is copied from the tanstack table's implementation, we are just\n // adding the above logic. https://github.com/TanStack/table/blob/v8.20.6/packages/table-core/src/utils/getExpandedRowModel.ts#L4\n const expandRowsCustom = useCallback((rowModel: RowModel<TData>): RowModel<TData> => {\n const expandedRows: Row<TData>[] = [];\n\n const handleRow = (row: Row<TData>) => {\n expandedRows.push(row);\n\n if (row.subRows?.length && row.getIsExpanded()) {\n row.subRows.forEach(handleRow);\n } else if (isRowWithSubrowsToAlwaysShowIds(row.original)) {\n row.subRows\n .filter((subrow) =>\n (\n row.original as RowDataWithSubrowsToAlwaysShowIds<TData>\n ).subrowsToAlwaysShowIds.includes(subrow.id),\n )\n .forEach(handleRow);\n }\n };\n\n rowModel.rows.forEach(handleRow);\n\n return {\n rows: expandedRows,\n flatRows: rowModel.flatRows,\n rowsById: rowModel.rowsById,\n };\n }, []);\n\n function getExpandedRowModelCustom(): (table: Table<TData>) => () => RowModel<TData> {\n return (table) =>\n tanstackMemo(\n () => [\n table.getState().expanded,\n table.getPreExpandedRowModel(),\n table.options.paginateExpandedRows,\n ],\n (\n expanded: ExpandedState,\n rowModel: RowModel<TData>,\n paginateExpandedRows: boolean | undefined,\n ) => {\n if (!rowModel.rows.length || (expanded !== true && !Object.keys(expanded ?? {}).length)) {\n return expandRowsCustom(rowModel);\n }\n\n if (!paginateExpandedRows) {\n // Only expand rows at this point if they are being paginated\n return rowModel;\n }\n\n return expandRowsCustom(rowModel);\n },\n getMemoOptions(table.options, 'debugTable', 'getExpandedRowModel'),\n );\n }\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n getSubRows: (row) => (isRowWithSubrows(row) ? row.subrows : []),\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModelCustom(),\n getRowId,\n ...tableOptions,\n });\n\n // We don't yet support multi-header groups across our products so we can assume there's only one\n const tableHeaderGroup = table.getHeaderGroups()[0];\n\n const unprocessedRows = table.getCoreRowModel().rows;\n const rows = table.getRowModel().rows;\n\n // Keyed on the ordered id list so the callback only fires when the displayed\n // rows actually change, not on every render (rows is a fresh array each time).\n const displayedRowIdsKey = rows.map((row) => row.id).join(DISPLAYED_ROW_IDS_SEPARATOR);\n useEffect(() => {\n onDisplayedRowIdsChange?.(\n displayedRowIdsKey ? displayedRowIdsKey.split(DISPLAYED_ROW_IDS_SEPARATOR) : [],\n );\n }, [displayedRowIdsKey, onDisplayedRowIdsChange]);\n\n // Generate checkbox column states based on table data and column values\n useEffect(() => {\n const states: Record<string, Set<string>> = {};\n\n // Find all checkbox columns from the original columns configuration\n const checkboxColumns = columns.filter(\n (column): column is ColumnConfig<TData> =>\n typeof column === 'object' && column.format?.type === 'checkbox',\n );\n\n // For each checkbox column, initialize its state based on the actual column values in the data\n for (const column of checkboxColumns) {\n const columnId = column.id || column.accessor;\n const checkedRowIds = new Set<string>();\n\n // Use table rows to get the actual row data and check the column values\n const getSelfAndNestedRows = (row: Row<TData>): Row<TData>[] => [\n row,\n ...row.subRows.map(getSelfAndNestedRows).flat(),\n ];\n const rootAndNestedRows = unprocessedRows.flatMap(getSelfAndNestedRows);\n for (const row of rootAndNestedRows) {\n const rowId = row.id;\n const rowData = row.original;\n\n // Get the column value from the row data (use accessor, not custom id)\n const columnValue = rowData[column.accessor as keyof TData];\n\n // If the column value is truthy, consider it checked\n if (columnValue) {\n checkedRowIds.add(rowId);\n }\n }\n\n states[columnId] = checkedRowIds;\n }\n\n setCheckboxColumnStates(states);\n }, [unprocessedRows, columns]);\n\n // Generate search props for TableControls when client search is enabled\n const generatedSearchProps = clientSearch\n ? {\n value: globalFilter,\n handleInput: setGlobalFilter,\n placeholder:\n typeof clientSearch === 'object'\n ? clientSearch.placeholder || DEFAULT_SEARCH_PLACEHOLDER\n : DEFAULT_SEARCH_PLACEHOLDER,\n ...(typeof clientSearch === 'object' && clientSearch),\n }\n : undefined;\n\n const unifiedFilters = useMemo<TFilter[]>(() => {\n const configuredFilters = controls?.filters ?? [];\n if (!clientFiltering) {\n return [...configuredFilters];\n }\n\n const clientFilters = generateClientFilters(\n columns.filter((column): column is ColumnConfig<TData> => typeof column === 'object'),\n columnFilters,\n setColumnFilters,\n );\n return [...configuredFilters, ...(clientFilters as unknown as TFilter[])];\n }, [clientFiltering, columnFilters, columns, controls?.filters, setColumnFilters]);\n\n // Helper function to get common pinning styles\n const getCommonPinningStyles = useCallback(\n (column: Column<TData>) => {\n const isPinned = column.getIsPinned();\n const isLastPinned = isPinned === 'left' && column.getIsLastColumn('left');\n\n return {\n left:\n isPinned === 'left' ? `${column.getStart('left') + pinnedColumnLeftOffset}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n hasRightBorder: isLastPinned,\n };\n },\n [pinnedColumnLeftOffset],\n );\n\n /**\n * Check if the column is a table feature column.\n * Feature columns are special columns set by the table to\n * allow a user to perform an action.\n */\n const isFeatureCol = (columnId: string) => {\n return ['select-col', 'expand-col', 'action-col'].includes(columnId);\n };\n\n const selectedRows = table.getFilteredSelectedRowModel().flatRows;\n\n useEffect(() => {\n onRowSelectionChange?.(selectedRows.map((row) => row.original));\n }, [selectedRows, onRowSelectionChange]);\n\n const actions = useMemo(() => {\n // Use dynamic bulk actions if provided, otherwise fall back to static ones\n const availableActions = getAvailableBulkActions\n ? getAvailableBulkActions(selectedRows.map((row) => row.original))\n : bulkActions || controls?.bulkActions;\n return availableActions?.map((action) => {\n // Create clearSelection callback that actions can call when they're ready\n const clearSelection = () => table.setRowSelection({});\n\n const baseAction = {\n ...action,\n onClick: async () => {\n await action.onClick(\n selectedRows.map((row) => row.id),\n clearSelection,\n );\n },\n };\n\n // Check if action has popover configuration (only on bulkActions, not controls?.bulkActions)\n if ('popover' in action && action.popover) {\n const popoverConfig = action.popover as {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string, selectedRows: string[]) => void | Promise<void>;\n };\n return {\n ...baseAction,\n popover: {\n options: popoverConfig.options,\n onOptionSelect: async (option: string) => {\n await popoverConfig.onOptionSelect(\n option,\n selectedRows.map((row) => row.id),\n );\n table.setRowSelection({});\n },\n },\n };\n }\n\n return baseAction;\n });\n }, [bulkActions, getAvailableBulkActions, selectedRows, table, controls?.bulkActions]);\n\n const shouldShowFloatingActionBar =\n compact && actions && actions.length > 0 && selectedRows.length > 0;\n\n // Check if any filters are active\n const hasGlobalFilter = clientSearch && globalFilter && globalFilter.trim().length > 0;\n const hasFilters =\n columnFilters.length > 0 ||\n (controls?.filterPanel == null &&\n (controls?.filtersV2 != null\n ? controls.filtersV2.initialState != null && !isEmptyState(controls.filtersV2.initialState)\n : unifiedFilters.some(\n (filter) =>\n filter.enabled !== false && isFilterActive(filter, controls?.filterResolver),\n )));\n const hasActiveFilters = hasGlobalFilter || hasFilters || hasExternalActiveFilters;\n\n return (\n <DataTableContainer $stickyHeader={stickyHeader}>\n {showControls && (\n <DataTableControls<TFilter>\n compact={compact}\n title={title}\n propertiesButton={\n showColumnProperties && (\n <TableViewConfigurationDropdown\n disabled={false}\n columnConfiguration={table\n .getVisibleFlatColumns()\n .filter((column) => !isFeatureCol(column.columnDef.id ?? ''))\n .map((column) => ({\n key: column.id,\n label: column.columnDef.header?.toString() || column.id,\n }))\n .sort((a, b) => {\n return (orderMap[a.key] || 0) - (orderMap[b.key] || 0);\n })}\n attributeOptions={columnOptions}\n updateColumnConfiguration={(newConfiguration) => {\n table.getAllColumns().map((column) => {\n column.toggleVisibility(!!newConfiguration.find((c) => c.key === column.id));\n });\n\n setColumnOrder(newConfiguration.map((c) => c.key));\n\n if (onUpdateColumnProperties) {\n onUpdateColumnProperties(newConfiguration);\n }\n }}\n size={compact ? 'sm' : undefined}\n variant={compact ? 'text' : 'basic'}\n />\n )\n }\n selectedRows={table.getFilteredSelectedRowModel().flatRows.map((row) => row.id)}\n onClearSelection={() => table.setRowSelection({})}\n searchProps={generatedSearchProps}\n {...controls}\n bulkActions={actions}\n filters={unifiedFilters}\n />\n )}\n <TableContainer $stickyHeader={stickyHeader}>\n <StyledTableLayout\n $onAddRow={!!onAddRow}\n stickyHeader={stickyHeader}\n containerScrollsHorizontally={scrollsHorizontally}\n headerTR={\n <>\n {tableHeaderGroup.headers.map((header) => {\n const pinningStyles = getCommonPinningStyles(header.column);\n const isPinned = pinningStyles.position === 'sticky';\n const width = header.column.columnDef.meta?.width\n ? `${header.column.columnDef.meta?.width}px`\n : undefined;\n const minWidth = header.column.columnDef.meta?.minWidth\n ? `${header.column.columnDef.meta?.minWidth}px`\n : (width ?? `${header.column.getSize()}px`);\n const thProps = {\n id: header.id,\n sortable: isFeatureCol(header.id) ? false : header.column.getCanSort(),\n onClick: isFeatureCol(header.id)\n ? undefined\n : header.column.getToggleSortingHandler(),\n sortDirection: isFeatureCol(header.id) ? undefined : header.column.getIsSorted(),\n colSpan: header.colSpan,\n align: header.column.columnDef.meta?.align,\n width: header.column.columnDef.meta?.width\n ? `${header.column.columnDef.meta?.width}px`\n : undefined,\n size: (compact ? 'sm' : 'md') as 'sm' | 'md',\n style: {\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n },\n };\n\n if (isPinned) {\n return (\n <StickyTH\n {...thProps}\n key={header.id}\n left={pinningStyles.left ? parseInt(pinningStyles.left) : 0}\n hasRightBorder={pinningStyles.hasRightBorder}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </StickyTH>\n );\n }\n\n return (\n <TableTH {...thProps} key={header.id}>\n {header.column.columnDef.meta?.headerTooltip ? (\n <TextUnderlineTooltip\n side='top'\n tooltip={header.column.columnDef.meta.headerTooltip}\n zIndex={Z_INDICES.topNavTooltip}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </TextUnderlineTooltip>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </TableTH>\n );\n })}\n </>\n }\n nullState={<p>{strings.noResults}</p>}\n isLoading={isLoading}\n size={compact ? 'sm' : undefined}\n >\n {columns.length === 0 ? (\n <TableTR disableHoverBackground>\n <TableEmptyState colSpan={1}>\n <Paragraph size='lg' weight='bold' color='primary'>\n {strings.noColumnsConfigured}\n </Paragraph>\n </TableEmptyState>\n </TableTR>\n ) : rows.length === 0 ? (\n <TableTR disableHoverBackground>\n <TableEmptyState colSpan={tableHeaderGroup.headers.length}>\n <Paragraph size='lg' weight='bold' color='primary'>\n {emptyState?.title ||\n (hasActiveFilters ? strings.noResultsTryFilters : strings.noResults)}\n </Paragraph>\n\n {emptyState?.description && (\n <Paragraph size='md' color='secondary'>\n {emptyState.description}\n </Paragraph>\n )}\n </TableEmptyState>\n </TableTR>\n ) : (\n rows.map((row) => {\n const rowData = row.original;\n const rowId = getRowId ? getRowId(rowData) : row.id;\n const rowLabel = getRowLabel?.(rowData);\n const isExpanded = expandedRows.has(rowId);\n const canExpand = canRowExpand(rowData);\n const rowLinkHref = getLinkToRow\n ? getLinkToRow(row.original)\n : rowLinkPrefix\n ? `${rowLinkPrefix}/${rowId}`\n : undefined;\n // Make the nested row's chevron / checkbox line up with the parent row's first column entry\n const dynamicNestSpacing =\n showControls && enableRowSelection ? NEST_SPACING + 8 : NEST_SPACING;\n\n const visibleCells = row.getVisibleCells();\n const isLinkableCell = (cell: (typeof visibleCells)[number]) =>\n !isFeatureCol(cell.column.id) && cell.column.columnDef.meta?.format?.type !== 'url';\n const rowLinkCellId = rowLinkHref\n ? (visibleCells.find(\n (cell) => cell.column.id === rowLinkColumnId && isLinkableCell(cell),\n )?.column.id ?? visibleCells.find(isLinkableCell)?.column.id)\n : undefined;\n const RowLinkComponent = rowLinkComponent ?? RouterLink;\n const renderCellContent = (cell: (typeof visibleCells)[number]) => {\n const content = flexRender(cell.column.columnDef.cell, cell.getContext());\n\n if (!rowLinkHref || cell.column.id !== rowLinkCellId) {\n return content;\n }\n\n const value = cell.getValue();\n const isEmpty = value == null || value === '';\n\n return (\n <RowLink\n as={RowLinkComponent}\n to={rowLinkHref}\n data-row-link\n aria-label={isEmpty ? rowLabel : undefined}\n >\n {content}\n </RowLink>\n );\n };\n\n let leftMostNonSpecialColumnFound = false;\n const rowElements = visibleCells.map((cell) => {\n const pinningStyles = getCommonPinningStyles(cell.column);\n const isPinned = pinningStyles.position === 'sticky';\n\n if (cell.column.id === 'action-col') {\n return (\n <StyledTableActionTD\n key={cell.id}\n style={{ textAlign: cell.column.columnDef.meta?.align }}\n $nestSpacing={row.depth * dynamicNestSpacing}\n >\n {renderCellContent(cell)}\n </StyledTableActionTD>\n );\n }\n\n if (isPinned) {\n const leftBumpFromNesting = !leftMostNonSpecialColumnFound\n ? row.depth * dynamicNestSpacing\n : 0;\n const width = cell.column.columnDef.meta?.width\n ? `${cell.column.columnDef.meta?.width}px`\n : undefined;\n const minWidth = cell.column.columnDef.meta?.minWidth\n ? `${cell.column.columnDef.meta?.minWidth}px`\n : (width ?? `${cell.column.getSize()}px`);\n\n // Use gap coverage component for expand column, regular StickyTD for others\n const isExpandColumn = cell.column.id === 'expand-col';\n const stickyTableCell = isExpandColumn ? (\n <StickyTDWithGapCoverage\n key={cell.id}\n left={\n (pinningStyles.left ? parseInt(pinningStyles.left) : 0) +\n leftBumpFromNesting\n }\n style={{\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n textAlign: cell.column.columnDef.meta?.align,\n }}\n hasRightBorder={pinningStyles.hasRightBorder}\n $gapCoverage={leftBumpFromNesting}\n >\n {renderCellContent(cell)}\n </StickyTDWithGapCoverage>\n ) : (\n <StickyTD\n key={cell.id}\n left={\n (pinningStyles.left ? parseInt(pinningStyles.left) : 0) +\n leftBumpFromNesting\n }\n style={{\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n textAlign: cell.column.columnDef.meta?.align,\n }}\n hasRightBorder={pinningStyles.hasRightBorder}\n >\n {renderCellContent(cell)}\n </StickyTD>\n );\n\n if (!leftMostNonSpecialColumnFound && !isFeatureCol(cell.column.id)) {\n leftMostNonSpecialColumnFound = true;\n }\n return stickyTableCell;\n }\n\n const tableCell = (\n <StyledTableTD\n key={cell.id}\n style={{ textAlign: cell.column.columnDef.meta?.align }}\n width={isFeatureCol(cell.column.id) ? '1%' : undefined}\n $nestSpacing={\n leftMostNonSpecialColumnFound ? undefined : row.depth * dynamicNestSpacing\n }\n $isFeatureCol={isFeatureCol(cell.column.id)}\n >\n {renderCellContent(cell)}\n </StyledTableTD>\n );\n if (!leftMostNonSpecialColumnFound && !isFeatureCol(cell.column.id)) {\n leftMostNonSpecialColumnFound = true;\n }\n\n return tableCell;\n });\n\n // Determine if row should be active and get active styling\n const isRowActive = rowId === activeRowId;\n const handleRowClick =\n onRowClick != null\n ? () => {\n onRowClick(rowId);\n }\n : canExpand\n ? () => {\n toggleRowExpansion(rowId);\n }\n : undefined;\n\n const handleRowClickWithLink = (event: MouseEvent<HTMLTableRowElement>) => {\n if (forwardedRowLinkClicks.has(event.nativeEvent)) {\n return;\n }\n\n handleRowClick?.();\n\n if (\n !rowLinkHref ||\n event.defaultPrevented ||\n (event.target as Element).closest(\n 'a, button, input, select, textarea, label, [role=\"checkbox\"], [role=\"button\"], [role=\"menuitem\"]',\n )\n ) {\n return;\n }\n\n const link = event.currentTarget.querySelector('a[data-row-link]');\n const ownerWindow = link?.ownerDocument.defaultView;\n\n if (!link || !ownerWindow) {\n return;\n }\n\n const forwardedClick = new ownerWindow.MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n button: event.button,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n });\n forwardedRowLinkClicks.add(forwardedClick);\n link.dispatchEvent(forwardedClick);\n };\n\n const rowProps = {\n 'aria-label': rowLabel,\n onClick: handleRowClickWithLink,\n $isActive: isRowActive,\n disableHoverBackground: disableRowHover,\n css: {\n cursor: rowLinkHref || handleRowClick ? 'pointer' : undefined,\n },\n // Add data-tour-target if present on row data\n ...(isRowWithTourTarget(row.original) && {\n 'data-tour-target': row.original.dataTourTarget,\n }),\n };\n\n const mainRow = (\n <TableTR key={rowId} {...rowProps}>\n {rowElements}\n </TableTR>\n );\n\n const elements = [mainRow];\n\n // Add detail row if expandable and expanded\n if (canExpand && isExpanded) {\n let detailContent: React.ReactNode = null;\n\n if (isRowWithDetails(rowData) && rowData._details) {\n if (typeof rowData._details === 'function') {\n // If it's a function, call it with the row data as props\n detailContent = rowData._details(rowData);\n } else {\n // If it's a React node\n detailContent = rowData._details;\n }\n } else if (detailComponent) {\n const DetailComponent = detailComponent;\n detailContent = <DetailComponent rowData={rowData} />;\n }\n\n if (detailContent) {\n const detailCells = initialColumnPinning?.left?.length ? (\n <>\n <StickyTD colSpan={1} left={pinnedColumnLeftOffset} />\n <StickyDetailsTD\n colSpan={tableHeaderGroup.headers.length - 1}\n left={EXPAND_COLUMN_WIDTH + pinnedColumnLeftOffset}\n >\n {detailContent}\n </StickyDetailsTD>\n </>\n ) : (\n <>\n <TableTD colSpan={1} />\n <DetailsTD colSpan={tableHeaderGroup.headers.length - 1}>\n {detailContent}\n </DetailsTD>\n </>\n );\n\n elements.push(\n <TableTR key={`${row.id}-details`} disableHoverBackground>\n {detailCells}\n </TableTR>,\n );\n }\n }\n\n // Add inserter row if onAddRow prop is provided\n if (\n onAddRow &&\n (!canAddAfterRow ||\n canAddAfterRow?.(rowData, row.getIsExpanded() && isRowWithSubrows(rowData)))\n ) {\n elements.push(\n <Inserter\n key={`${rowId}-inserter`}\n priorRowLabel={`Row ${rowId}`}\n colSpan={tableHeaderGroup.headers.length}\n onAddRow={() =>\n onAddRow(rowId, row.getIsExpanded() && isRowWithSubrows(rowData))\n }\n nestSpacing={row.depth * dynamicNestSpacing}\n />,\n );\n }\n\n return elements;\n })\n )}\n </StyledTableLayout>\n {shouldShowFloatingActionBar && actions && (\n <FloatingActionBarContainer>\n <FloatingActionBar\n selectedCount={selectedRows.length}\n onClearSelection={() => table.setRowSelection({})}\n actions={actions}\n extraContent={floatingBarContent}\n />\n </FloatingActionBarContainer>\n )}\n </TableContainer>\n {pagination && data.length > 0 && (\n <Pagination\n pageSize={table.getState().pagination.pageSize}\n pageSizeOptions={typeof pagination === 'object' ? pagination.pageSizeOptions : undefined}\n showPageSizeSelector={\n isServerPagination(pagination) ? pagination.showPageSizeSelector : undefined\n }\n paginationParams={{\n 'current-page': table.getState().pagination.pageIndex + 1,\n 'total-count': table.getRowCount(),\n 'total-pages': table.getPageCount(),\n }}\n handlePageLinkClick={(pageNumber) => table.setPageIndex(pageNumber - 1)}\n handlePageSizeClick={table.setPageSize}\n onPageChange={isServerPagination(pagination) ? pagination.onPageChange : undefined}\n />\n )}\n </DataTableContainer>\n );\n};\n\nexport default DataTable;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable-DQ8axNfo.mjs","names":["DropdownMenu","Pii","PlusIcon","DropdownMenu","tanstackMemo","DetailComponent","Pagination"],"sources":["../components/DataTable/clientFilterUtils.ts","../components/DataTable/constants.ts","../components/DataTable/FloatingActionBar.tsx","../components/DataTable/helpers.tsx","../components/DataTable/Inserter.tsx","../components/DataTable/useTableColumns.tsx","../components/DataTable/DataTable.tsx"],"sourcesContent":["import type { Column, ColumnFiltersState, Header, RowData, Table } from '@tanstack/react-table';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport type { FilterConfig } from './TableControls/types';\nimport type { ClientFilterConfig } from './types';\n\nexport const getFilterFnName = (filterType: string): string => {\n switch (filterType) {\n case 'select':\n return 'equals';\n case 'multiselect':\n case 'multiselect-alt':\n case 'multiselect-legacy':\n return 'arrIncludesSome';\n case 'input':\n return 'includesString';\n default:\n return 'equals';\n }\n};\n\nconst isEmptyFilterValue = (value: unknown): boolean => {\n return value == null || value === '' || (Array.isArray(value) && value.length === 0);\n};\n\nconst isClientFilterConfig = (filter: unknown): filter is ClientFilterConfig => {\n if (typeof filter !== 'object' || filter === null || !('type' in filter)) {\n return false;\n }\n return filter.type === 'select' || filter.type === 'multiselect' || filter.type === 'input';\n};\n\n/** Converts column-level client filters into controls backed by TanStack's column-filter state. */\nexport const generateClientFilters = <TData extends RowData>(\n columns: Array<{\n id?: string;\n accessor: string;\n header:\n | string\n | ((props: {\n table: Table<TData>;\n header: Header<TData, unknown>;\n column: Column<TData, unknown>;\n }) => React.ReactNode);\n filter?: unknown;\n }>,\n columnFilters: ColumnFiltersState,\n setColumnFilters: Dispatch<SetStateAction<ColumnFiltersState>>,\n): FilterConfig[] => {\n return columns.flatMap((column): FilterConfig[] => {\n const filterConfig = column.filter;\n if (!isClientFilterConfig(filterConfig) || filterConfig.enabled === false) {\n return [];\n }\n\n const columnId = column.id || column.accessor;\n const name = typeof column.header === 'string' ? column.header : columnId;\n const currentValue = columnFilters.find((filter) => filter.id === columnId)?.value;\n const onChange = (value: unknown) => {\n setColumnFilters((previousFilters) => {\n if (isEmptyFilterValue(value)) {\n return previousFilters.filter((filter) => filter.id !== columnId);\n }\n\n const existingFilter = previousFilters.some((filter) => filter.id === columnId);\n if (existingFilter) {\n return previousFilters.map((filter) =>\n filter.id === columnId ? { ...filter, value } : filter,\n );\n }\n\n return [...previousFilters, { id: columnId, value }];\n });\n };\n\n const baseConfig = {\n id: columnId,\n name,\n placeholder: filterConfig.placeholder,\n enabled: true,\n };\n\n switch (filterConfig.type) {\n case 'select':\n return [\n {\n ...baseConfig,\n type: 'select',\n value: (currentValue as string | undefined) ?? '',\n options: filterConfig.options ?? [],\n onChange,\n },\n ];\n case 'multiselect':\n return [\n {\n ...baseConfig,\n type: 'multiselect',\n value: (currentValue as string[] | undefined) ?? [],\n options: filterConfig.options ?? [],\n onChange,\n },\n ];\n case 'input':\n return [\n {\n ...baseConfig,\n type: 'input',\n value: (currentValue as string | undefined) ?? '',\n onChange,\n onDelete: () => onChange(''),\n },\n ];\n default:\n return [];\n }\n });\n};\n","export function getColumnWidths(compact?: boolean) {\n return {\n EXPAND_COLUMN_WIDTH: compact ? 32 : 36,\n SELECT_COLUMN_WIDTH: compact ? 32 : 40,\n ACTION_COLUMN_WIDTH: compact ? 32 : 40,\n NEST_SPACING: compact ? 24 : 32,\n };\n}\n","import styled from 'styled-components';\n\nimport { BorderRadius, Spacing } from '@persona/design-tokens';\nimport { XIcon } from '@persona/icons';\nimport Button, { IconButton } from 'design-system/components/Button';\nimport DropdownMenu from 'design-system/components/DropdownMenu';\nimport { HStack } from 'design-system/components/Stack';\nimport { Paragraph } from 'design-system/components/Text';\nimport { usePDSStrings } from 'design-system/lib/i18n';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { Elevation } from 'design-system/variables/effect';\n\nconst Bar = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n background-color: ${({ theme }) => semanticColor(theme, 'SurfaceElevated', theme.color.background.primary)};\n width: 100%;\n padding: ${Spacing[2]};\n border-radius: ${BorderRadius.Md};\n box-shadow: ${Elevation.Mid};\n gap: ${Spacing[8]};\n min-width: 380px;\n`;\n\ninterface FloatingActionBarProps {\n selectedCount: number;\n onClearSelection: React.MouseEventHandler<HTMLButtonElement>;\n extraContent?: React.ReactNode;\n actions: (\n | {\n label: string;\n variant?: 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n popover?: {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string) => void | Promise<void>;\n };\n onClick: () => void | Promise<void>;\n }\n | {\n 'aria-label': string;\n icon: React.ReactNode;\n variant?: 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n popover?: {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string) => void | Promise<void>;\n };\n onClick: () => void | Promise<void>;\n }\n )[];\n}\n\nconst FloatingActionBar = ({\n selectedCount,\n onClearSelection,\n extraContent,\n actions,\n}: FloatingActionBarProps) => {\n const strings = usePDSStrings();\n return (\n <Bar>\n <HStack align='center'>\n <IconButton size='sm' onClick={onClearSelection} aria-label={strings.clearSelection}>\n <XIcon />\n </IconButton>\n <Paragraph color='primary'>{strings.selectedItems(selectedCount)}</Paragraph>\n </HStack>\n <HStack align='center' spacing={Spacing[2]}>\n {extraContent}\n {actions.map((action, index) => {\n const key = 'label' in action ? action.label : `action-${index}`;\n\n if ('popover' in action) {\n let trigger = null;\n if ('icon' in action && 'aria-label' in action) {\n // Icon-only action\n trigger = (\n <IconButton key={key} size='sm' aria-label={action['aria-label']}>\n {action.icon}\n </IconButton>\n );\n } else {\n trigger = (\n <Button key={key} variant={action.variant || 'basic'} size='sm'>\n {'label' in action ? action.label : ''}\n </Button>\n );\n }\n\n return (\n // Portaled: the bar is absolutely positioned inside the table's\n // scroll container, which clips an inline menu when the table\n // has a sticky header (`overflow: auto`).\n <DropdownMenu key={key} trigger={trigger} align='center' portal>\n {(action.popover?.options ?? []).map((option) => (\n <DropdownMenu.Item\n id={option.value}\n key={option.value}\n onClick={() => action.popover!.onOptionSelect(option.value)}\n >\n {option.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n );\n } else {\n if ('icon' in action && 'aria-label' in action) {\n // Icon-only action\n return (\n <IconButton\n key={key}\n size='sm'\n aria-label={action['aria-label']}\n onClick={action.onClick}\n >\n {action.icon}\n </IconButton>\n );\n } else {\n return (\n <Button\n key={key}\n onClick={action.onClick}\n variant={action.variant || 'basic'}\n size='sm'\n >\n {'label' in action ? action.label : ''}\n </Button>\n );\n }\n }\n })}\n </HStack>\n </Bar>\n );\n};\n\nexport default FloatingActionBar;\n","import { DateTime } from 'luxon';\nimport type { ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport { BorderRadius, Spacing } from '@persona/design-tokens';\nimport { ImageIcon } from '@persona/icons';\nimport Checkbox, { type CheckboxProps } from 'design-system/components/Checkbox';\nimport HoverCopyableField from 'design-system/components/HoverCopyableField';\nimport Link from 'design-system/components/Link';\nimport Pii from 'design-system/components/Pii';\nimport { HStack } from 'design-system/components/Stack';\nimport Sticker from 'design-system/components/Sticker';\nimport { Paragraph, TabularNumber } from 'design-system/components/Text';\nimport {\n DEFAULT_COMMON_STRINGS,\n formatDate,\n formatDateTime,\n type CommonStrings,\n} from 'design-system/lib/i18n';\nimport { semanticColor, semanticOnly } from 'design-system/lib/semanticColor';\n\nimport type {\n DataTableColumnFormat,\n DataTableColumnIDFormat,\n DataTableColumnImageFormat,\n DataTableColumnPiiFormat,\n DataTableColumnStringFormat,\n DateConfig,\n DatetimeConfig,\n RenderValueStickerFormatConfig,\n} from './types';\n\nconst EmptyCellText = styled(Paragraph)`\n ${semanticOnly((tokens) => `color: ${tokens.FgSecondaryStatic};`)}\n`;\n\nexport const renderAsCheckbox = ({\n rowId,\n isChecked,\n onChange,\n onValueChange,\n columnHeader,\n disabled,\n indeterminate,\n strings = DEFAULT_COMMON_STRINGS,\n}: {\n rowId: string;\n isChecked: boolean;\n /**\n * Called when the checkbox is clicked\n * @param e - The event object\n */\n onChange?: CheckboxProps['onChange'];\n /**\n * Called when the checkbox value changes\n * @param rowId - The id of the row\n * @param checked - The new value of the checkbox\n */\n onValueChange?: (rowId: string, checked: boolean) => void;\n columnHeader?: string;\n disabled?: boolean;\n indeterminate?: boolean;\n /** Built-in copy, from `usePDSStrings()`; English when omitted. */\n strings?: Pick<CommonStrings, 'selectRow' | 'selectRowForColumn'>;\n}): ReactNode => {\n const ariaLabel = columnHeader\n ? strings.selectRowForColumn(columnHeader, rowId)\n : strings.selectRow(rowId);\n\n return (\n <Checkbox\n checked={isChecked}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(rowId, e.target.checked);\n }}\n containerProps={{\n onClick: (e) => {\n // Prevent checkbox clicks from triggering row selection\n e.stopPropagation();\n },\n }}\n aria-label={ariaLabel}\n indeterminate={indeterminate}\n disabled={disabled}\n />\n );\n};\n\nexport const renderAsCheckboxHeader = ({\n header,\n isChecked,\n isIndeterminate,\n onChange,\n onValueChange,\n strings = DEFAULT_COMMON_STRINGS,\n}: {\n /**\n * The header text to display to the right of the checkbox\n */\n header?: string;\n isChecked: boolean;\n isIndeterminate: boolean;\n /**\n * Called when the checkbox is clicked\n * @param e - The event object\n */\n onChange?: CheckboxProps['onChange'];\n /**\n * Called when the checkbox value changes\n * @param rowId - The id of the row\n * @param checked - The new value of the checkbox\n */\n onValueChange?: (checked: boolean) => void;\n /** Built-in copy, from `usePDSStrings()`; English when omitted. */\n strings?: Pick<CommonStrings, 'selectAll' | 'selectAllOf'>;\n}): ReactNode => {\n const checkbox = (\n <Checkbox\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.checked);\n }}\n containerProps={{\n onClick: (e) => {\n // Prevent checkbox clicks from triggering column sorting\n e.stopPropagation();\n },\n }}\n aria-label={header ? strings.selectAllOf(header) : strings.selectAll}\n />\n );\n\n if (header) {\n return (\n <HStack spacing={Spacing[3]} align='center'>\n {checkbox}\n <span>{header}</span>\n </HStack>\n );\n }\n\n return checkbox;\n};\n\n// ---------------------------------------------------------------------------\n// Generic PDS cell renderers\n// ---------------------------------------------------------------------------\n\n/**\n * Options the built-in PDS cell renderers read from the provider. `DataTable` fills these in from\n * `usePDSLocale()` / `usePDSStrings()`; direct callers may omit them to get the English output.\n */\nexport interface PDSFormatOptions {\n /** BCP 47 locale. Dates and times keep the historical English format when omitted or en-US. */\n locale?: string;\n strings?: Pick<CommonStrings, 'noImage'>;\n}\n\nexport const renderAsString = (value: unknown): string => {\n if (value == null) {\n return '';\n }\n return typeof value === 'string'\n ? value\n : typeof value === 'object'\n ? JSON.stringify(value, null, 2)\n : String(value);\n};\n\nexport const renderAsDate = (value: unknown, config?: DateConfig, locale?: string): string => {\n if (value == null || typeof value !== 'string') {\n return '';\n }\n const date = DateTime.fromISO(value);\n return date.isValid\n ? formatDate(date, { locale, format: config?.format, showTimeZone: config?.showTimeZone })\n : '';\n};\n\nexport const renderAsDatetime = (\n value: unknown,\n config?: DatetimeConfig,\n locale?: string,\n): string => {\n if (value == null || typeof value !== 'string') {\n return '';\n }\n const date = DateTime.fromISO(value);\n return date.isValid\n ? formatDateTime(date, { locale, format: config?.format, showTimeZone: config?.showTimeZone })\n : '';\n};\n\nexport const renderAsURL = (value: unknown): ReactNode => {\n if (value == null || typeof value !== 'string' || value.length === 0) {\n return '';\n }\n return (\n <Link url={value} target='_blank'>\n {value}\n </Link>\n );\n};\n\nexport const renderAsNumber = (value: unknown): ReactNode => {\n if (value == null) {\n return '';\n }\n return <TabularNumber>{value}</TabularNumber>;\n};\n\nconst createSticker = (\n item: string,\n config?: RenderValueStickerFormatConfig,\n key?: string,\n): ReactNode => {\n const displayLabel = config?.labels?.[item] ?? item;\n const variant = config?.colors?.[item] ?? config?.defaultColor;\n return (\n <Sticker key={key} variant={variant}>\n {displayLabel}\n </Sticker>\n );\n};\n\nexport const renderAsSticker = (\n value: unknown,\n config?: RenderValueStickerFormatConfig,\n): ReactNode => {\n if (value == null) {\n return '';\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '';\n }\n return (\n <span style={{ display: 'flex', flexWrap: 'wrap', gap: '4px', alignItems: 'center' }}>\n {value.map((item, index) =>\n typeof item === 'string' ? createSticker(item, config, `${item}-${index}`) : null,\n )}\n </span>\n );\n }\n if (typeof value !== 'string') {\n return '';\n }\n return createSticker(value, config);\n};\n\n// ---------------------------------------------------------------------------\n// Private primitives used by PDS renderers\n// ---------------------------------------------------------------------------\n\n/** Inline monospace text — private DataTable primitive, avoids the dashboard Typography dep. */\nconst MonoText = styled.span`\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n font-size: 0.875em;\n`;\n\nconst WrappingText = styled.span`\n display: inline-block;\n max-width: 100%;\n word-break: break-word;\n overflow-wrap: break-word;\n`;\n\ntype EmptyImageProps = { $width?: string; $height?: string };\n\nconst EmptyImageContainer = styled.div<EmptyImageProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: ${BorderRadius.Md};\n background-color: ${({ theme }) => semanticColor(theme, 'SurfaceSecondary', theme.color.background.secondary)};\n width: ${({ $width }) => $width ?? '200px'};\n height: ${({ $height }) => $height ?? '144px'};\n svg {\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', theme.color.border.disabled)};\n }\n`;\n\nconst LightweightImg = styled.img<{ $fit?: string }>`\n object-fit: ${({ $fit }) => $fit ?? 'cover'};\n display: block;\n`;\n\n// ---------------------------------------------------------------------------\n// Copyable string renderer (used by 'string' and 'id' formats)\n// ---------------------------------------------------------------------------\n\nexport const renderAsCopyableString = (\n value: unknown,\n config?: DataTableColumnStringFormat['config'] & { emptyText?: string },\n): ReactNode => {\n const valueAsString = renderAsString(value);\n const content = config?.mono ? <MonoText>{valueAsString}</MonoText> : valueAsString;\n\n if (!valueAsString) {\n return <EmptyCellText>{config?.emptyText ?? ''}</EmptyCellText>;\n }\n\n return (\n <WrappingText>\n {config?.copyable ? (\n <HoverCopyableField copyValue={valueAsString}>{content}</HoverCopyableField>\n ) : (\n content\n )}\n </WrappingText>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PII renderer\n// ---------------------------------------------------------------------------\n\nexport const renderAsPii = <TData = unknown>(\n row?: TData,\n config?: DataTableColumnPiiFormat<TData>['config'],\n): ReactNode => {\n if (!config || !row) {\n return '';\n }\n const { isRedacted, piiValue, emptyText } = config;\n const piiValueString = piiValue(row);\n\n if (piiValueString == null || piiValueString.length === 0) {\n return (\n <>\n <EmptyCellText>{emptyText}</EmptyCellText>\n {config.subComponent?.(row)}\n </>\n );\n }\n\n return (\n <>\n <Pii isRedacted={isRedacted(row)}>{piiValueString}</Pii>\n {config.subComponent?.(row)}\n </>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Lightweight image renderer (no Redux / modal / forensics deps)\n// ---------------------------------------------------------------------------\n\nexport const renderAsLightweightImage = (\n value: unknown,\n config?: DataTableColumnImageFormat['config'],\n strings: Pick<CommonStrings, 'noImage'> = DEFAULT_COMMON_STRINGS,\n): ReactNode => {\n const isEmpty = value == null || value === '' || (Array.isArray(value) && value.length === 0);\n\n if (isEmpty) {\n return config?.fallback ? (\n <>{config.fallback}</>\n ) : (\n <EmptyImageContainer\n $width={config?.width}\n $height={config?.height}\n aria-label={config?.alt ?? 'image'}\n >\n <ImageIcon size={24} aria-label={strings.noImage} />\n </EmptyImageContainer>\n );\n }\n\n const src = typeof value === 'string' ? value : '';\n return (\n <LightweightImg\n src={src}\n alt={config?.alt ?? 'image'}\n width={config?.width ?? '200px'}\n height={config?.height ?? '144px'}\n $fit={config?.fit}\n />\n );\n};\n\n/**\n * Default PDS cell renderer. Handles all generic format types built into the design system.\n * Hosts should supply their own `renderFormat` prop to DataTable for format types that require\n * application-specific components (e.g. tags, files, PII masking, status indicators).\n */\nexport const renderAsPDSFormat = <TData = unknown>(\n value: unknown,\n format?: DataTableColumnFormat<TData>,\n row?: TData,\n options: PDSFormatOptions = {},\n): string | ReactNode => {\n switch (format?.type) {\n case 'date':\n return renderAsDate(value, format.config, options.locale);\n case 'datetime':\n return renderAsDatetime(value, format.config, options.locale);\n case 'sticker':\n return renderAsSticker(value, format.config);\n case 'url':\n return renderAsURL(value);\n case 'number':\n return renderAsNumber(value);\n case 'image':\n return renderAsLightweightImage(value, format.config, options.strings);\n case 'checkbox':\n // Checkbox columns are handled specially by the DataTable; this path is unreachable.\n return '';\n case 'id':\n return renderAsCopyableString(value, {\n copyable: true,\n mono: true,\n ...(format as DataTableColumnIDFormat).config,\n });\n case 'pii':\n return renderAsPii<TData>(row, (format as DataTableColumnPiiFormat<TData>).config);\n default:\n return renderAsCopyableString(\n value,\n (format as DataTableColumnStringFormat | undefined)?.config,\n );\n }\n};\n","import { kebabCase } from 'lodash-es';\nimport styled from 'styled-components';\n\nimport { Color } from '@persona/design-tokens';\nimport { PlusIcon } from '@persona/icons/12px';\nimport { TableCell, TableRow } from 'design-system/components/Table';\nimport { isFocused } from 'design-system/lib/pseudoClass';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { Z_INDICES } from 'design-system/lib/zindex';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\nconst InserterTableCell = styled(TableCell)<{ $nestSpacing: number }>`\n padding: 0 !important;\n ${({ $nestSpacing }) => ($nestSpacing ? `padding-left: ${$nestSpacing}px !important` : '')};\n height: 0;\n position: relative;\n border: 0;\n z-index: ${Z_INDICES.withShadow};\n`;\n\nconst AddRowLine = styled.div<{ $nestSpacing: number }>`\n position: absolute;\n top: -1px;\n background-color: ${({ theme }) => semanticColor(theme, 'BorderAccent', theme.color.primary.brand)};\n width: ${({ $nestSpacing }) => ($nestSpacing ? `calc(100% - ${$nestSpacing}px)` : '100%')};\n transition-duration: ${TransitionDuration.Fast};\n transition-property: opacity;\n transition-timing-function: ease-in;\n`;\n\nconst StyledPlusButton = styled.button`\n position: absolute;\n top: -7px;\n left: calc(50% - 8px);\n border-radius: 50%;\n height: 14px;\n width: 14px;\n background-color: ${({ theme }) => semanticColor(theme, 'ActionPrimary', theme.color.primary.brand)};\n color: ${({ theme }) => semanticColor(theme, 'FgInverse', Color.BackgroundButtonInverse)};\n cursor: pointer;\n z-index: ${Z_INDICES.withShadow};\n // TODO: Add a focus style\n\n opacity: 0;\n\n &:hover {\n opacity: 1;\n }\n\n &:hover ~ ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n`;\n\nconst StyledTableRow = styled(TableRow)`\n &${isFocused} {\n box-shadow: none;\n }\n cursor: pointer;\n &:hover > ${AddRowLine}, &:focus > ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n\n &:hover > ${StyledPlusButton}, &:focus > ${StyledPlusButton} {\n opacity: 1;\n }\n`;\n\nconst HoverArea = styled.div<{ $nestSpacing: number }>`\n position: absolute;\n height: 12px;\n top: -6px;\n width: ${({ $nestSpacing }) => ($nestSpacing ? `calc(100% - ${$nestSpacing}px)` : '100%')};\n z-index: ${Z_INDICES.withShadow};\n &:hover ~ ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n\n &:hover ~ ${StyledPlusButton} {\n opacity: 1;\n }\n`;\n\nconst StyledPlusIcon = styled(PlusIcon)`\n position: absolute;\n top: 1px;\n left: 1px;\n`;\n\ninterface InserterProps {\n priorRowLabel: string;\n colSpan: number;\n nestSpacing?: number;\n label?: string;\n onAddRow: () => void;\n}\n\nexport const Inserter: React.FC<InserterProps> = ({\n priorRowLabel,\n colSpan,\n nestSpacing = 0,\n label,\n onAddRow,\n}) => {\n return (\n <StyledTableRow\n onKeyDown={(evt) => {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n evt.stopPropagation();\n onAddRow();\n }\n }}\n tabIndex={0}\n >\n <InserterTableCell colSpan={colSpan} $nestSpacing={nestSpacing}>\n <HoverArea\n $nestSpacing={nestSpacing}\n role='presentation'\n aria-label={label || `Insert a row after ${priorRowLabel}`}\n onClick={onAddRow}\n />\n <StyledPlusButton\n id={`${kebabCase(priorRowLabel)}-inserter`}\n aria-label={label || `Insert a row after ${priorRowLabel}`}\n onClick={onAddRow}\n type='button'\n >\n <StyledPlusIcon color='currentColor' />\n </StyledPlusButton>\n <AddRowLine $nestSpacing={nestSpacing} onClick={onAddRow} />\n </InserterTableCell>\n </StyledTableRow>\n );\n};\n","import {\n type CellContext,\n type ColumnDef,\n createColumnHelper,\n type Row,\n type RowData,\n type Table,\n} from '@tanstack/react-table';\nimport { startCase } from 'lodash-es';\nimport { useCallback, useMemo, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { ChevronDownIcon, ChevronRightIcon, MoreIcon } from '@persona/icons';\nimport Button from 'design-system/components/Button';\nimport { getColumnWidths } from 'design-system/components/DataTable';\nimport type {\n HeadlessFilterConfig,\n RowAction,\n SortProps,\n} from 'design-system/components/DataTable/types';\nimport DropdownMenu from 'design-system/components/DropdownMenu';\nimport { usePDSStrings } from 'design-system/lib/i18n';\nimport { semanticColor } from 'design-system/lib/semanticColor';\n\nimport { renderAsCheckbox, renderAsCheckboxHeader } from './helpers';\nimport type { DataTableColumnFormat, DataTableColumns } from './types';\n\nconst ExpandButton = styled.button`\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n`;\n\nconst ExpandColumnPlaceholder = styled.span`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n`;\n\n/**\n * Host-injected cell format renderer. Dashboard passes its own implementation\n * that handles all format types including tags, files, and status indicators.\n */\nexport type RenderFormatFn<TData = unknown, TFormat extends { type: string } = { type: string }> = (\n value: unknown,\n format?: TFormat,\n row?: TData,\n) => React.ReactNode;\n\nexport interface UseTableColumnsParams<\n TData extends RowData,\n TFormat extends { type: string } = DataTableColumnFormat<TData>,\n TFilter = unknown,\n> {\n columns: DataTableColumns<TData, TFormat, TFilter>;\n data: TData[];\n compact?: boolean;\n sort?: boolean | SortProps;\n clientSearch?: boolean | { placeholder?: string; initialValue?: string };\n clientFiltering?: boolean;\n expandColumnVisibility?: 'auto' | 'always';\n showControls?: boolean;\n enableRowSelection?: boolean;\n enableSubRowSelection?: boolean;\n rowActions?: RowAction[] | ((row: TData) => RowAction[]);\n getRowId?: (row: TData) => string;\n expandedRows: Set<string>;\n toggleRowExpansion: (rowId: string) => void;\n canRowExpand: (rowData: TData) => boolean;\n checkboxColumnStates: Record<string, Set<string>>;\n handleCheckboxCellChange: (columnId: string, rowId: string, checked: boolean) => void;\n handleSelectAllCheckboxCell: (columnId: string, checked: boolean) => void;\n getSelfAndNestedRowIds: (row: TData, indexPath: number[]) => string[];\n handleRowSelectionWithShift: (\n clickedRow: Row<TData>,\n table: Table<TData>,\n checked: boolean,\n isShiftKey: boolean,\n ) => void;\n renderFormat: RenderFormatFn<TData, TFormat>;\n}\n\nexport function useTableColumns<\n TData extends RowData,\n TFormat extends { type: string } = DataTableColumnFormat<TData>,\n TFilter = unknown,\n>({\n columns,\n data,\n compact,\n sort,\n clientSearch,\n clientFiltering,\n expandColumnVisibility = 'auto',\n showControls,\n enableRowSelection = false,\n enableSubRowSelection = true,\n rowActions,\n getRowId,\n expandedRows,\n toggleRowExpansion,\n canRowExpand,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n getSelfAndNestedRowIds,\n handleRowSelectionWithShift,\n renderFormat,\n}: UseTableColumnsParams<TData, TFormat, TFilter>): [\n ColumnDef<TData, any>[],\n { key: string; label: string }[],\n] {\n const { EXPAND_COLUMN_WIDTH, SELECT_COLUMN_WIDTH, ACTION_COLUMN_WIDTH } =\n getColumnWidths(compact);\n const strings = usePDSStrings();\n const stringsRef = useRef(strings);\n stringsRef.current = strings;\n\n // Stable renderer identity: an inline `cell` gets a new identity on each column\n // rebuild, which flexRender treats as a new component type and remounts —\n // closing any open row-actions menu. Read live `rowActions` from a ref instead.\n const rowActionsRef = useRef(rowActions);\n rowActionsRef.current = rowActions;\n const renderActionCell = useCallback((props: CellContext<TData, unknown>) => {\n const currentRowActions = rowActionsRef.current;\n const actions =\n typeof currentRowActions === 'function'\n ? currentRowActions(props.row.original)\n : currentRowActions;\n\n if (!actions || actions.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <Button\n id={`data-table__row-actions-button--${props.row.id}`}\n variant='text'\n width='icon'\n size='sm'\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n aria-label={stringsRef.current.viewRowActions(props.row.index + 1)}\n >\n <MoreIcon />\n </Button>\n }\n portal\n >\n {actions.map(({ label, onClick, ...menuItemProps }, i) => (\n <DropdownMenu.Item\n key={label.toLowerCase().replace(/ /g, '-')}\n id={`data-table__row-actions--${props.row.id}-${i}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick(props.row.id);\n }}\n {...menuItemProps}\n >\n {label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n );\n }, []);\n const hasRowActions = rowActions != null;\n\n return useMemo(() => {\n const columnHelper = createColumnHelper<TData>();\n\n const tableColumns: ColumnDef<TData, any>[] = columns.map((column) => {\n if (typeof column === 'object') {\n const columnHelperOptions: Parameters<typeof columnHelper.accessor>[1] = {\n header: column.header,\n id: column.id || column.accessor,\n // Treats undefined and null as the lowest values for sorting\n sortUndefined: -1,\n meta: {\n align: column.align,\n format: column.format,\n minWidth: column.minWidth,\n width: column.width,\n headerTooltip: column.headerTooltip,\n },\n minSize: column.minWidth,\n };\n\n if (column.renderCell != null) {\n const renderCell = column.renderCell;\n columnHelperOptions.cell = (props) =>\n renderCell({ cellValue: props.getValue(), row: props.row.original });\n // A custom cell renderer controls display only — it does not affect sorting.\n // Honor the column's explicit `enableSorting` opt-in (defaults to off) so\n // server-sortable columns that need custom rendering still expose a sort control.\n columnHelperOptions.enableSorting = sort != null && (column.enableSorting ?? false);\n } else if (column.format?.type === 'checkbox') {\n // Handle checkbox column format\n const columnId = column.id || column.accessor;\n\n // Custom header with select all checkbox\n columnHelperOptions.header = (headerProps) => {\n const columnState = checkboxColumnStates[columnId] || new Set();\n // Select all rows for this column\n const allRowIds = data.flatMap((row, index) => getSelfAndNestedRowIds(row, [index]));\n const isChecked = allRowIds.length > 0 && allRowIds.every((id) => columnState.has(id));\n const isIndeterminate = !isChecked && allRowIds.some((id) => columnState.has(id));\n\n // If column.header is a function, call it with TanStack context props\n if (typeof column.header === 'function') {\n return column.header(headerProps);\n }\n\n return renderAsCheckboxHeader({\n header: column.header,\n isChecked,\n isIndeterminate,\n onValueChange: (checked) => handleSelectAllCheckboxCell(columnId, checked),\n strings,\n });\n };\n\n // Custom cell with individual checkbox\n columnHelperOptions.cell = (props) => {\n const rowId = getRowId ? getRowId(props.row.original) : props.row.id;\n const columnState = checkboxColumnStates[columnId] || new Set();\n const isChecked = columnState.has(rowId);\n\n return renderAsCheckbox({\n rowId,\n isChecked,\n onValueChange: (rowId, checked) => handleCheckboxCellChange(columnId, rowId, checked),\n columnHeader: typeof column.header === 'string' ? column.header : undefined,\n strings,\n });\n };\n\n // Disable sorting for checkbox columns\n columnHelperOptions.enableSorting = false;\n } else {\n // Ensure value is rendered as a string regardless of column value\n columnHelperOptions.cell = (props) =>\n renderFormat(props?.getValue(), column.format, props.row.original);\n // Only enable column sorting if table-level sorting is enabled and column allows it\n columnHelperOptions.enableSorting = sort != null && column.enableSorting;\n }\n\n // Enable global filtering based on clientSearch and column searchable property\n columnHelperOptions.enableGlobalFilter = clientSearch && (column.searchable ?? true);\n // Enable column pinning based on column configuration\n columnHelperOptions.enablePinning = column.pinned ?? false;\n\n // Configure column filtering\n if (clientFiltering && column.filter) {\n const filterConfig = column.filter as Partial<HeadlessFilterConfig>;\n if (filterConfig.enabled !== false) {\n columnHelperOptions.enableColumnFilter = true;\n if (filterConfig.filterFn) {\n columnHelperOptions.filterFn = filterConfig.filterFn;\n }\n }\n }\n\n return columnHelper.accessor(column.accessor, columnHelperOptions);\n }\n\n return columnHelper.accessor(column, {\n header: startCase(column),\n enableGlobalFilter: Boolean(clientSearch),\n enableSorting: sort != null,\n });\n });\n\n if (showControls && enableRowSelection) {\n tableColumns.unshift(\n columnHelper.display({\n id: 'select-col',\n enablePinning: true,\n enableResizing: false,\n size: SELECT_COLUMN_WIDTH,\n meta: {\n width: SELECT_COLUMN_WIDTH,\n },\n header: ({ table }) =>\n renderAsCheckboxHeader({\n isChecked: table.getIsAllRowsSelected(),\n // Show the dash whenever any row is selected (including all rows), since\n // clicking the header in that state deselects everything.\n isIndeterminate: table.getIsSomeRowsSelected() || table.getIsAllRowsSelected(),\n onChange: table.getToggleAllRowsSelectedHandler(),\n strings,\n }),\n cell: ({ row, table }) =>\n renderAsCheckbox({\n rowId: row.id,\n isChecked: row.getIsSelected(),\n onChange: (e) =>\n handleRowSelectionWithShift(\n row,\n table,\n e.target.checked,\n e.nativeEvent instanceof MouseEvent && e.nativeEvent.shiftKey,\n ),\n indeterminate: enableSubRowSelection && row.getIsSomeSelected(),\n disabled: !row.getCanSelect(),\n strings,\n }),\n }),\n );\n }\n\n // Add expansion column when any row can expand, or when forced visible for layout parity\n const showExpandColumn = expandColumnVisibility === 'always' || data.some(canRowExpand);\n if (showExpandColumn) {\n tableColumns.unshift(\n columnHelper.display({\n id: 'expand-col',\n enablePinning: true,\n enableResizing: false,\n size: EXPAND_COLUMN_WIDTH,\n meta: {\n width: EXPAND_COLUMN_WIDTH,\n },\n header: '',\n cell: ({ row }) => {\n const rowData = row.original;\n if (!canRowExpand(rowData)) {\n return <ExpandColumnPlaceholder aria-hidden />;\n }\n\n const rowId = getRowId ? getRowId(rowData) : row.id;\n const isExpanded = expandedRows.has(rowId);\n\n return (\n <ExpandColumnPlaceholder>\n <ExpandButton\n type='button'\n id={`datatable-expand-${rowId}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleRowExpansion(rowId);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n toggleRowExpansion(rowId);\n }\n }}\n aria-label={\n isExpanded ? `Hide details for row ${rowId}` : `View details for row ${rowId}`\n }\n aria-expanded={isExpanded}\n >\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </ExpandButton>\n </ExpandColumnPlaceholder>\n );\n },\n }),\n );\n }\n\n if (hasRowActions) {\n const emptyHeader = () => <></>;\n tableColumns.push(\n columnHelper.display({\n id: 'action-col',\n enableResizing: false,\n size: ACTION_COLUMN_WIDTH,\n meta: {\n width: ACTION_COLUMN_WIDTH,\n },\n header: emptyHeader,\n cell: renderActionCell,\n }),\n );\n }\n\n const columnOptions = columns.map((column) => {\n const key = typeof column === 'object' ? column.id || column.accessor : column;\n const label =\n typeof column === 'object'\n ? typeof column.header === 'string'\n ? column.header\n : key\n : startCase(column);\n\n return {\n key,\n label,\n };\n });\n\n return [tableColumns, columnOptions];\n }, [\n columns,\n enableRowSelection,\n hasRowActions,\n renderActionCell,\n showControls,\n sort,\n clientSearch,\n clientFiltering,\n data,\n canRowExpand,\n expandColumnVisibility,\n expandedRows,\n toggleRowExpansion,\n getRowId,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n handleRowSelectionWithShift,\n renderFormat,\n strings,\n ]);\n}\n","import {\n type Column,\n type ColumnFiltersState,\n type ColumnPinningState,\n type ExpandedState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getMemoOptions,\n getPaginationRowModel,\n getSortedRowModel,\n memo as tanstackMemo,\n type Row,\n type RowData,\n type RowModel,\n type RowSelectionState,\n type Table,\n type TableOptions,\n useReactTable,\n} from '@tanstack/react-table';\nimport {\n type ComponentProps,\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport Pagination, { MIN_PAGE_SIZE } from 'design-system/components/Pagination';\nimport {\n StickyTD,\n StickyTH,\n TableActionTD,\n TableLayout,\n TableTD,\n TableTH,\n TableTR,\n} from 'design-system/components/Table';\nimport { Paragraph } from 'design-system/components/Text';\nimport { TextUnderlineTooltip } from 'design-system/components/Tooltip';\nimport { usePDSLocale, usePDSStrings } from 'design-system/lib/i18n';\nimport { RouterLink } from 'design-system/lib/router';\nimport { Z_INDICES } from 'design-system/lib/zindex';\nimport { focusOutline } from 'design-system/mixins/focus';\nimport { semanticScrollbar } from 'design-system/mixins/scrollbar';\n\nimport { generateClientFilters, getFilterFnName } from './clientFilterUtils';\nimport { getColumnWidths } from './constants';\nimport FloatingActionBar from './FloatingActionBar';\nimport { renderAsPDSFormat } from './helpers';\nimport { Inserter } from './Inserter';\nimport TableControls, {\n isEmptyState,\n isFilterActive,\n TableViewConfigurationDropdown,\n type TableControlsProps,\n} from './TableControls';\nimport type { AttributeColumn, BaseFilterConfig, FilterConfig } from './TableControls/types';\nimport type {\n BulkAction,\n ColumnConfig,\n DataTableColumnFormat,\n DataTableColumns,\n RowAction,\n RowDataWithDetails,\n RowDataWithSubrows,\n RowDataWithSubrowsToAlwaysShowIds,\n RowDataWithTourTarget,\n SortProps,\n} from './types';\nimport { useTableColumns, type RenderFormatFn } from './useTableColumns';\n\n// https://tanstack.com/table/v8/docs/api/core/column-def#meta\ndeclare module '@tanstack/react-table' {\n // oxlint-disable-next-line no-unused-vars -- required for declaration merging\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: 'left' | 'right';\n format?: { type: string };\n minWidth?: number;\n width?: number;\n headerTooltip?: React.ReactNode;\n }\n}\n\nconst forwardedRowLinkClicks = new WeakSet<Event>();\n\nconst TableEmptyState = styled.td`\n vertical-align: middle;\n text-align: center;\n width: 100%;\n height: 176px;\n`;\n\nconst StyledTableLayout = styled(TableLayout)<{ $onAddRow: boolean }>`\n ${({ $onAddRow }) =>\n $onAddRow &&\n css`\n padding-bottom: ${Spacing[3]};\n `}\n`;\n\nconst TableContainer = styled.div<{ $stickyHeader: boolean }>`\n position: relative;\n ${semanticScrollbar}\n\n ${({ $stickyHeader }) =>\n $stickyHeader &&\n css`\n flex-grow: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `}\n`;\n\nconst RowLink = styled(RouterLink)`\n /* Match surrounding cell text. The row is still a link; only URL cells use accent. */\n color: inherit;\n text-decoration: none;\n ${focusOutline}\n\n &:link,\n &:visited,\n &:hover,\n &:active {\n color: inherit;\n }\n`;\n\nconst StyledDataTableControls = styled(TableControls)``;\nexport const DataTableControls = StyledDataTableControls as typeof StyledDataTableControls &\n typeof TableControls;\n\nexport const DataTableContainer = styled.div<{ $stickyHeader: boolean }>`\n ${({ $stickyHeader }) =>\n $stickyHeader &&\n css`\n display: flex;\n flex-direction: column;\n height: 100%;\n `}\n`;\n\nconst StyledTableActionTD = styled(TableActionTD)<{ $nestSpacing?: number }>`\n ${({ $nestSpacing }) => css`\n ${\n $nestSpacing &&\n css`\n position: relative;\n left: ${$nestSpacing}px;\n `\n }\n `}\n`;\n\nconst StyledTableTD = styled(TableTD)<{ $nestSpacing?: number; $isFeatureCol?: boolean }>`\n // Move the cell to the right by the amount of the nest spacing, and\n // add same amount of padding to the right to not overlap with the next cell\n ${({ $nestSpacing, $isFeatureCol }) => css`\n ${\n $nestSpacing &&\n css`\n position: relative;\n left: ${$nestSpacing}px;\n `\n }\n ${\n !$isFeatureCol &&\n css`\n padding-right: ${$nestSpacing}px;\n `\n }\n `}\n`;\n\nconst DetailsTD = styled(TableTD)`\n padding: 0;\n border-top: none;\n border-left: none;\n border-right: none;\n`;\n\nconst StickyDetailsTD = styled(StickyTD)`\n padding: 0;\n border-top: none;\n border-left: none;\n border-right: none;\n`;\n\nconst StickyTDWithGapCoverage = styled(StickyTD)<{ $gapCoverage?: number }>`\n ${({ $gapCoverage }) =>\n $gapCoverage &&\n css`\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: ${-$gapCoverage}px;\n width: ${$gapCoverage}px;\n height: calc(100% + 1px); // +1px to cover the bottom border\n background: inherit;\n }\n `}\n`;\n\nexport const FloatingActionBarContainer = styled.div`\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n`;\n\nconst isServerPagination = (\n pagination: DataTableProps<unknown>['pagination'],\n): pagination is ComponentProps<typeof Pagination> => {\n return typeof pagination === 'object' && !('clientPagination' in pagination);\n};\n\nconst isClientPagination = (\n pagination: DataTableProps<unknown>['pagination'],\n): pagination is ClientPaginationProps => {\n return typeof pagination === 'object' && 'clientPagination' in pagination;\n};\n\nconst isServerSorting = (sort: boolean | SortProps | undefined): sort is SortProps => {\n return typeof sort === 'object';\n};\n\nconst isRowWithDetails = <TData extends RowData>(row: TData): row is RowDataWithDetails<TData> => {\n return row != null && typeof row === 'object' && '_details' in row && row._details != null;\n};\n\nconst isRowWithSubrows = <TData extends RowData>(row: TData): row is RowDataWithSubrows<TData> => {\n return row != null && typeof row === 'object' && 'subrows' in row && row.subrows != null;\n};\n\nconst isRowWithSubrowsToAlwaysShowIds = <TData extends RowData>(\n row: TData,\n): row is RowDataWithSubrowsToAlwaysShowIds<TData> => {\n return (\n row != null &&\n typeof row === 'object' &&\n 'subrowsToAlwaysShowIds' in row &&\n row.subrowsToAlwaysShowIds != null\n );\n};\n\nconst isRowWithTourTarget = <TData extends RowData>(\n row: TData,\n): row is RowDataWithTourTarget<TData> => {\n return (\n row != null &&\n typeof row === 'object' &&\n 'dataTourTarget' in row &&\n typeof row.dataTourTarget === 'string'\n );\n};\n\ntype ClientPaginationProps = {\n clientPagination: true;\n pageSize?: number;\n pageSizeOptions?: number[];\n};\nexport interface DataTableProps<\n TData extends RowData,\n TFilter extends BaseFilterConfig = FilterConfig,\n> {\n /**\n * Data to render.\n * If a row has a _details property that is a function, it will be called\n * with the row data as props.\n * If a row has a _details property that is a React node, it will be rendered as is.\n */\n data: TData[];\n\n /**\n * Columns to display in the table. May be a string or column config object.\n *\n * Strings get converted from camelCase to Start Case.\n */\n columns: DataTableColumns<TData, DataTableColumnFormat<TData>>;\n\n /**\n * Component to render details for expandable rows.\n * Useful if we want to render the same details component for every row.\n * Receives rowData as props.\n */\n detailComponent?: React.ComponentType<{ rowData: TData }>;\n\n /**\n * When `'always'`, the leading expand column is shown even if no rows are expandable.\n * When `'auto'`, the column is omitted unless at least one row can expand. Rows that\n * cannot expand keep an empty spacer in this column so labels stay aligned.\n */\n expandColumnVisibility?: 'auto' | 'always';\n\n /**\n * Whether to display table controls such as search, filters, views, and selection\n */\n showControls?: boolean;\n\n /**\n * Props to pass to the TableControls component\n */\n controls?: TableControlsProps<TFilter>;\n\n /**\n * Custom text to display when the table is empty. Will default to \"No results found\"\n */\n emptyState?: {\n title?: string;\n description?: string;\n };\n\n /**\n * Whether to display pagination controls. If true, will use client-side pagination. If an object,\n * can be either advanced configuration of cleitn paginaton or server-side pagination state..\n */\n pagination?: boolean | ClientPaginationProps | ComponentProps<typeof Pagination>;\n\n /**\n * Whether to display sort controls. If true, will use client-side sorting. If an object, will use server-side sorting.\n */\n sort?: boolean | SortProps;\n\n /**\n * Whether to display the column properties button and popover. Allows control of column visiblity and ordering.\n */\n showColumnProperties?: boolean;\n\n /**\n * Whether to enable sorting removal. If true, will allow sorting to be removed by clicking the sort control.\n */\n enableSortingRemoval?: boolean;\n\n /**\n * Set to true to sort descending first, which is the case for most of our tables.\n */\n sortDescFirst?: boolean;\n\n /**\n * Called when column visibility or ordering is updated. Useful for saving column properties.\n */\n onUpdateColumnProperties?: (newConfiguration: AttributeColumn[]) => void;\n\n /**\n * Whether the table is loading data\n */\n isLoading?: boolean;\n\n /**\n * Whether to enable row selection\n */\n enableRowSelection?: boolean;\n\n /**\n * Whether to enable automatic sub row selection when a parent row is selected\n */\n enableSubRowSelection?: boolean;\n\n /**\n * Define the row id for the given row. Used by row selection and bulk actions.\n */\n getRowId?: (row: TData) => string;\n\n /**\n * Define the aria label for the given row.\n */\n getRowLabel?: (row: TData) => string;\n\n /**\n * Determine if a row can be selected. Used to disable row selection for specific rows.\n */\n getRowSelectable?: (row: TData) => boolean;\n\n /**\n * Makes the row link cell an anchor if provided. Get link for the given row.\n */\n getLinkToRow?: (row: TData) => string;\n\n /**\n * If set, each row will be a link to the given prefix + the row's `id` value.\n * `getLinkToRow` will override this.\n */\n rowLinkPrefix?: string;\n\n /**\n * Column id whose cell contains the row link when `getLinkToRow`/`rowLinkPrefix` is set.\n * Defaults to the first visible non-feature column (not select/expand/action). URL-formatted\n * columns are skipped.\n */\n rowLinkColumnId?: string;\n\n /**\n * Component to use for row links. Defaults to the PDS router-aware link.\n * Pass a custom component (e.g. Next.js Link) to use a different router.\n * The component renders as an inline anchor inside the link cell and receives `to`,\n * `className`, and `children`.\n */\n rowLinkComponent?: React.ElementType;\n\n /**\n * Whether to show the compact variant of the table.\n * Compact tables do not support views.\n */\n compact?: boolean;\n\n /**\n * Disables the row hover highlight. Use for read-only, non-interactive tables where the\n * hover background would misleadingly imply rows are selectable or clickable.\n */\n disableRowHover?: boolean;\n\n /**\n * Title to display in the table.\n */\n title?: string;\n\n /**\n * Whether to make the table header sticky when scrolling vertically.\n * When enabled, the controls and table header will remain visible at the top of the viewport while scrolling through table data.\n * Note that the sticky header styling assumes this component is contained within a parent with `display: flex` and `flex-direction: column`.\n */\n stickyHeader?: boolean;\n\n /**\n * Enable client-side search functionality.\n * Pass an object to configure the search input.\n */\n clientSearch?:\n | boolean\n | {\n placeholder?: string;\n initialValue?: string;\n };\n\n /**\n * Controlled search term for client-side search.\n * When provided, the search input becomes controlled.\n * Use with onSearchTermChange to manage search state externally.\n */\n searchTerm?: string;\n\n /**\n * Called when the search term changes (for controlled search).\n * Only used when searchTerm prop is provided.\n */\n onSearchTermChange?: (searchTerm: string) => void;\n\n /**\n * Whether to use manual filtering. If true, will not use the global filter function 'includesString'.\n */\n manualFiltering?: boolean;\n\n /**\n * Controlled expanded row IDs.\n * When provided, row expansion becomes controlled.\n * Use with onExpandedRowsChange to manage expansion state externally.\n */\n expandedRowIds?: Set<string>;\n\n /**\n * Called when expanded rows change (for controlled expansion).\n * Only used when expandedRowIds prop is provided.\n */\n onExpandedRowsChange?: (expandedRowIds: Set<string>) => void;\n\n /**\n * Enable client-side filtering functionality.\n * Users must explicitly define filter types for columns in TableControls.\n * Generated controls are legacy-only; `controls.filtersV2` does not drive client filtering.\n */\n clientFiltering?: boolean;\n\n /**\n * @internal Not part of the public API surface.\n * Used exclusively by the DashboardDataTable wrapper to share TanStack column-filter\n * state with the dashboard's generateClientFilters adapter.\n * Pass only via the wrapper's any-cast spread — do not use directly.\n * @deprecated Prefer `column.filter` for defining client-side filters.\n */\n columnFilters?: ColumnFiltersState;\n\n /**\n * When true, the empty-state message will read \"No results found. Try changing your filters.\"\n * even when the DataTable's own filter state is empty.\n * Use this when the host manages active server-side filters outside the DataTable\n * (e.g. via an injected filterPanel) so the conditional empty state still reflects those filters.\n */\n hasExternalActiveFilters?: boolean;\n\n /**\n * Called when the column-level filter state changes.\n * Use this to drive an injected filter-panel UI from outside the DataTable,\n * e.g. to feed `generateClientFilters` with the current TanStack filter state.\n */\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n\n /**\n * Host-provided cell format renderer.\n * The PDS built-in handles string, number, date, datetime, url, sticker, image, id, and pii.\n * Pass a custom renderer to handle additional application-specific formats (e.g. tags, files,\n * status indicators) or to override PDS defaults.\n */\n renderFormat?: RenderFormatFn<TData, DataTableColumnFormat<TData>>;\n\n /**\n * Actions to display in each table row.\n * Can be a static array (same actions for all rows) or a function that\n * receives the row data and returns actions specific to that row.\n */\n rowActions?: RowAction[] | ((row: TData) => RowAction[]);\n\n /**\n * Bulk actions to display when there are selected rows.\n * For standard variant, actions will be shown in the table controls.\n * For compact variant, actions will be shown in a floating action bar.\n * If bulkActions are provided in `controls.bulkActions`, they will override the bulkActions prop.\n */\n bulkActions?: BulkAction[];\n\n /**\n * Function that returns available bulk actions based on selected rows.\n * This allows dynamic bulk actions that change based on the selection.\n * Takes precedence over static bulkActions prop.\n */\n getAvailableBulkActions?: (selectedRows: TData[]) => BulkAction[];\n\n /**\n * Callback fired when the set of selected rows changes.\n * Receives the currently selected row data objects.\n */\n onRowSelectionChange?: (selectedRows: TData[]) => void;\n\n /**\n * If present, will display a thin row between rows as UI affordance to add a new row.\n * The row will be added after the row identified by the provided rowId, and the addAsChild flag will\n * indicate if the added row will be a sibling or a child of the referenced row\n * Adding said row will be handled by this `onAddRow` callback.\n */\n onAddRow?: (rowId: string, addAsChild: boolean) => void;\n\n /**\n * Called to determine if a row can be added after the provided row.\n * If not provided, assume true.\n * If this resolves to false, we will hide the inserter row.\n */\n canAddAfterRow?: (row: TData, addAsChild: boolean) => boolean;\n\n /**\n * Called when a row is clicked. If provided, rows will have cursor pointer\n * and clicking a row will call this function with the row id.\n * When omitted, rows that can expand (via `_details` or `detailComponent`) toggle expand/collapse on row click.\n */\n onRowClick?: (rowId: string) => void;\n\n /**\n * The active row id. If provided, the row will be in an active state.\n */\n activeRowId?: string;\n\n /**\n * Called with the ordered ids of the rows currently displayed, reflecting\n * client-side search, filtering, and sorting. Lets a parent step through the\n * on-screen order (e.g. prev/next navigation in a detail panel).\n */\n onDisplayedRowIdsChange?: (rowIds: string[]) => void;\n\n /**\n * Custom left offset in pixels to add to all pinned columns.\n * Useful when the table is nested inside containers that need additional spacing.\n */\n pinnedColumnLeftOffset?: number;\n\n /**\n * When false, the table does not scroll horizontally on its own and an ancestor is expected\n * to. Set this when a host scrolls the table and positions its header or pinned columns\n * against that ancestor, so those offsets are not trapped in the table's own scrollport.\n * Combining this with `stickyHeader` is contradictory: `stickyHeader` gives the table an\n * inner scrollport of its own, which is the thing this prop gives up.\n */\n scrollsHorizontally?: boolean;\n\n /**\n * Custom content to render inside the floating action bar, between the\n * selection count and the action buttons. Only rendered when the floating\n * action bar is visible (compact mode with selected rows).\n */\n floatingBarContent?: React.ReactNode;\n}\n\n// Unit-separator control char; joins row ids into a change-detection key that\n// can't collide with characters found in real row ids.\nconst DISPLAYED_ROW_IDS_SEPARATOR = '\\u001f';\n\n/**\n * The DataTable component is the core of Persona's table experiences.\n *\n * This component implements `@tanstack/react-table` and exposes a simplified, easy to use API.\n *\n * Planned functionality\n * - Column visibility, reordering\n * - Row selection\n * - Cell types (e.g. links, buttons, Stickers)\n *\n * Client-side support\n * - ✅ Sorting\n * - ✅ Search (enable with clientSearch prop)\n * - ✅ Pagination\n * - ✅ Filtering (requires explicit filter configuration in TableControls)\n *\n * Server-side support\n * - ✅ Sorting\n * - ✅ Filtering\n * - ✅ Pagination\n *\n * @example\n * // Basic usage with client-side search\n * <DataTable\n * data={data}\n * columns={columns}\n * showControls={true}\n * clientSearch={{ placeholder: \"Search accounts...\" }}\n * />\n *\n * @example\n * // Column-level search control\n * const columns = [\n * { accessor: 'id', header: 'ID', searchable: false },\n * { accessor: 'name', header: 'Name' }, // searchable by default\n * { accessor: 'email', header: 'Email' },\n * ];\n */\n\nexport const DataTable = <TData extends RowData, TFilter extends BaseFilterConfig = FilterConfig>({\n data,\n columns,\n detailComponent,\n expandColumnVisibility = 'auto',\n showControls,\n controls,\n emptyState,\n isLoading,\n pagination,\n sort,\n sortDescFirst,\n enableSortingRemoval,\n showColumnProperties = false,\n onUpdateColumnProperties,\n enableRowSelection = false,\n enableSubRowSelection = true,\n getRowId,\n getRowLabel,\n getRowSelectable,\n getLinkToRow,\n rowLinkPrefix,\n rowLinkColumnId,\n rowLinkComponent,\n compact,\n disableRowHover,\n title,\n clientSearch = false,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n manualFiltering,\n expandedRowIds: controlledExpandedRowIds,\n onExpandedRowsChange,\n clientFiltering = false,\n columnFilters: controlledColumnFilters,\n hasExternalActiveFilters = false,\n onColumnFiltersChange,\n renderFormat,\n rowActions,\n bulkActions,\n getAvailableBulkActions,\n onRowSelectionChange,\n onAddRow,\n stickyHeader = false,\n canAddAfterRow,\n onRowClick,\n activeRowId,\n onDisplayedRowIdsChange,\n pinnedColumnLeftOffset = 0,\n scrollsHorizontally = true,\n floatingBarContent,\n}: DataTableProps<TData, TFilter>) => {\n const DEFAULT_SEARCH_PLACEHOLDER = 'Search...';\n const { NEST_SPACING, EXPAND_COLUMN_WIDTH } = getColumnWidths(compact);\n const [columnVisibility, setColumnVisibility] = useState(() => {\n const visibility: { [key: string]: boolean } = {};\n columns.forEach((column) => {\n const columnId = typeof column === 'object' ? (column.id ?? column.accessor) : column;\n visibility[columnId] = typeof column === 'object' ? (column.visibility ?? true) : true; // Set default visibility to true if no option is passed in\n });\n return visibility;\n });\n const [columnOrder, setColumnOrder] = useState<string[]>([]);\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n // Tracks the most recently clicked selection checkbox to support shift+click range selection.\n const lastSelectedRowIdRef = useRef<string | null>(null);\n\n // Search term: use controlled state if provided, otherwise use internal state\n const isSearchControlled = controlledSearchTerm != null;\n const [internalSearchTerm, setInternalSearchTerm] = useState<string>(\n typeof clientSearch === 'object' ? clientSearch.initialValue || '' : '',\n );\n const globalFilter = isSearchControlled ? controlledSearchTerm : internalSearchTerm;\n const setGlobalFilter = useCallback(\n (value: string) => {\n if (isSearchControlled) {\n onSearchTermChange?.(value);\n } else {\n setInternalSearchTerm(value);\n }\n },\n [isSearchControlled, onSearchTermChange],\n );\n\n const isColumnFiltersControlled = controlledColumnFilters != null;\n const [internalColumnFilters, setInternalColumnFilters] = useState<ColumnFiltersState>([]);\n const columnFilters = isColumnFiltersControlled ? controlledColumnFilters : internalColumnFilters;\n\n const setColumnFilters = useCallback<Dispatch<SetStateAction<ColumnFiltersState>>>(\n (updater) => {\n const next = typeof updater === 'function' ? updater(columnFilters) : updater;\n if (!isColumnFiltersControlled) {\n setInternalColumnFilters(next);\n }\n onColumnFiltersChange?.(next);\n },\n [columnFilters, isColumnFiltersControlled, onColumnFiltersChange],\n );\n\n // Expanded rows: use controlled state if provided, otherwise use internal state\n const isExpansionControlled = controlledExpandedRowIds != null;\n const [internalExpandedRows, setInternalExpandedRows] = useState<Set<string>>(new Set());\n const expandedRows = isExpansionControlled ? controlledExpandedRowIds : internalExpandedRows;\n const setExpandedRows = useCallback(\n (updater: (prev: Set<string>) => Set<string>) => {\n if (isExpansionControlled) {\n const newValue = updater(expandedRows);\n onExpandedRowsChange?.(newValue);\n } else {\n setInternalExpandedRows(updater);\n }\n },\n [expandedRows, isExpansionControlled, onExpandedRowsChange],\n );\n\n const [checkboxColumnStates, setCheckboxColumnStates] = useState<Record<string, Set<string>>>({});\n\n const orderMap = columnOrder.reduce<{ [key: string]: number }>((acc, columnId, index) => {\n acc[columnId] = index;\n return acc;\n }, {});\n\n /**\n * If basic client pagination is enabled, create a configuration object for client pagination.\n */\n if (pagination === true) {\n pagination = {\n clientPagination: true,\n pageSize: MIN_PAGE_SIZE,\n };\n }\n\n // Helper function to check if a row can be expanded\n const canRowExpand = useCallback(\n (rowData: TData): boolean => {\n if (isRowWithSubrows(rowData)) {\n return rowData.subrows.length > 0;\n }\n if (isRowWithDetails(rowData)) {\n return Boolean(rowData._details);\n }\n return detailComponent != null;\n },\n [detailComponent],\n );\n\n // Calculate initial column pinning state from column configuration\n const initialColumnPinning = useMemo((): ColumnPinningState => {\n const pinnedColumns: string[] = [];\n\n // Check if we have any pinned columns\n const hasPinnedColumns = columns.some((column) => typeof column === 'object' && column.pinned);\n\n if (hasPinnedColumns) {\n // Add special columns first (they should be leftmost)\n const showExpandColumn = expandColumnVisibility === 'always' || data.some(canRowExpand);\n if (showExpandColumn) {\n pinnedColumns.push('expand-col');\n }\n if (showControls && enableRowSelection) {\n pinnedColumns.push('select-col');\n }\n\n // Then add user-defined pinned columns\n columns.forEach((column) => {\n if (typeof column === 'object' && column.pinned) {\n pinnedColumns.push(column.accessor);\n }\n });\n }\n\n return {\n left: pinnedColumns,\n };\n }, [columns, data, canRowExpand, expandColumnVisibility, showControls, enableRowSelection]);\n\n // Helper function to toggle row expansion\n const toggleRowExpansion = useCallback(\n (rowId: string) => {\n setExpandedRows((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(rowId)) {\n newSet.delete(rowId);\n } else {\n newSet.add(rowId);\n }\n return newSet;\n });\n },\n [setExpandedRows],\n );\n\n // Helper function to call onUpdate for checkbox columns\n const dispatchCheckboxCellOnUpdate = useCallback(\n (columnId: string, columnState: Set<string>) => {\n const column = columns.find(\n (col) =>\n typeof col === 'object' && col.accessor === columnId && col.format?.type === 'checkbox',\n );\n if (column && typeof column === 'object' && column.format?.type === 'checkbox') {\n column.format.onUpdate(Array.from(columnState));\n }\n },\n [columns],\n );\n\n // Helper function to handle checkbox column state changes\n const handleCheckboxCellChange = useCallback(\n (columnId: string, rowId: string, checked: boolean) => {\n setCheckboxColumnStates((prev) => {\n const newStates = { ...prev };\n if (!newStates[columnId]) {\n newStates[columnId] = new Set();\n }\n\n const columnState = new Set(newStates[columnId]);\n if (checked) {\n columnState.add(rowId);\n } else {\n columnState.delete(rowId);\n }\n\n newStates[columnId] = columnState;\n dispatchCheckboxCellOnUpdate(columnId, columnState);\n return newStates;\n });\n },\n [dispatchCheckboxCellOnUpdate],\n );\n\n const getSelfAndNestedRowIds = useCallback(\n (row: TData, indexPath: number[]): string[] => {\n const rowId = getRowId ? getRowId(row) : indexPath.join('.');\n if (isRowWithSubrows(row)) {\n return [\n rowId,\n ...(row.subrows ?? [])\n .map((subrow, subrowIndex) =>\n getSelfAndNestedRowIds(subrow, [...indexPath, subrowIndex]),\n )\n .flat(),\n ];\n }\n return [rowId];\n },\n [getRowId],\n );\n\n // Helper function to handle \"select all\" checkbox for a column\n const handleSelectAllCheckboxCell = useCallback(\n (columnId: string, checked: boolean) => {\n setCheckboxColumnStates((prev) => {\n const newStates = { ...prev };\n let columnState: Set<string>;\n\n if (checked) {\n // Select all rows for this column\n const allRowIds = data.flatMap((row, index) => getSelfAndNestedRowIds(row, [index]));\n columnState = new Set(allRowIds);\n } else {\n // Deselect all rows for this column\n columnState = new Set();\n }\n\n newStates[columnId] = columnState;\n dispatchCheckboxCellOnUpdate(columnId, columnState);\n return newStates;\n });\n },\n [data, getRowId, dispatchCheckboxCellOnUpdate],\n );\n\n const tableOptions: Partial<TableOptions<TData>> = useMemo(() => {\n const options: Partial<TableOptions<TData>> = {};\n\n // Client-side pagination\n if (isClientPagination(pagination)) {\n options.getPaginationRowModel = getPaginationRowModel();\n options.initialState = {\n pagination: {\n pageSize: pagination.pageSize,\n },\n };\n } else if (isServerPagination(pagination)) {\n const currentPage = pagination.paginationParams?.['current-page'] || 1;\n const pageSize = pagination.pageSize || MIN_PAGE_SIZE;\n\n options.manualPagination = true;\n options.onPaginationChange = (updaterOrValue) => {\n const oldPageSize = pageSize;\n const oldPageIndex = currentPage - 1;\n\n if (typeof updaterOrValue === 'function') {\n const newPaginationState = updaterOrValue({\n pageSize,\n pageIndex: currentPage - 1,\n });\n\n if (newPaginationState.pageSize !== oldPageSize) {\n pagination.handlePageSizeClick(newPaginationState.pageSize);\n }\n\n if (newPaginationState.pageIndex !== oldPageIndex) {\n pagination.handlePageLinkClick(newPaginationState.pageIndex + 1);\n }\n }\n };\n options.state = {\n pagination: {\n pageSize,\n pageIndex: currentPage - 1,\n },\n };\n options.rowCount = pagination?.paginationParams?.['total-count'];\n options.pageCount = pagination?.paginationParams?.['total-pages'];\n }\n\n if (sort === true) {\n options.getSortedRowModel = getSortedRowModel();\n options.enableSorting = true;\n } else if (isServerSorting(sort)) {\n options.manualSorting = true;\n options.enableSorting = true;\n options.onSortingChange = (updaterOrValue) => {\n if (typeof updaterOrValue === 'function') {\n const newSortingState = updaterOrValue(sort.state);\n sort.handleSortClick(newSortingState);\n }\n };\n\n options.state = {\n ...(options.state ? options.state : {}),\n sorting: sort.state,\n };\n } else {\n options.enableSorting = false;\n }\n\n if (showControls && enableRowSelection) {\n options.enableRowSelection = getRowSelectable\n ? (row) => getRowSelectable(row.original)\n : true;\n options.onRowSelectionChange = setRowSelection;\n }\n\n if (!enableSubRowSelection) {\n options.enableSubRowSelection = false;\n }\n\n // Client-side global filtering\n if (clientSearch) {\n if (manualFiltering) {\n options.manualFiltering = true;\n } else {\n options.getFilteredRowModel = getFilteredRowModel();\n options.globalFilterFn = 'includesString';\n }\n options.onGlobalFilterChange = setGlobalFilter;\n }\n\n // Client-side column filtering\n if (clientFiltering) {\n options.getFilteredRowModel = getFilteredRowModel();\n options.onColumnFiltersChange = setColumnFilters;\n }\n\n // Build column visibility: use explicit values when provided, fall back to state or default\n const columnOptionsVisibility: Record<string, boolean> = {};\n columns.forEach((column) => {\n const columnId = typeof column === 'object' ? column.id || column.accessor : column;\n // Use explicit visibility if provided, otherwise fall back to state value or default true\n if (typeof column === 'object' && 'visibility' in column && column.visibility != null) {\n columnOptionsVisibility[columnId] = column.visibility;\n } else {\n columnOptionsVisibility[columnId] = columnVisibility[columnId] ?? true;\n }\n });\n options.state = { ...options.state, columnVisibility: columnOptionsVisibility };\n\n const expandedState: Record<string, boolean> = {};\n for (const rowId of expandedRows) {\n expandedState[rowId] = true;\n }\n options.state = {\n ...options.state,\n columnOrder,\n rowSelection,\n columnPinning: initialColumnPinning,\n expanded: expandedState,\n ...(clientSearch && { globalFilter }),\n ...(clientFiltering && { columnFilters }),\n };\n options.onColumnVisibilityChange = setColumnVisibility;\n options.onColumnOrderChange = setColumnOrder;\n options.enableSortingRemoval = enableSortingRemoval;\n options.sortDescFirst = sortDescFirst;\n options.enableColumnPinning = initialColumnPinning.left && initialColumnPinning.left.length > 0;\n\n return options;\n }, [\n pagination,\n columnVisibility,\n columnOrder,\n enableRowSelection,\n enableSubRowSelection,\n rowSelection,\n showControls,\n sort,\n enableSortingRemoval,\n sortDescFirst,\n clientSearch,\n globalFilter,\n clientFiltering,\n columnFilters,\n columns,\n initialColumnPinning,\n expandedRows,\n ]);\n\n // Handle row selection from the built-in select column, supporting shift+click range selection.\n // On shift+click, every selectable row between the last clicked row and the current row (in the\n // displayed order) is set to the clicked checkbox's new value.\n const handleRowSelectionWithShift = useCallback(\n (clickedRow: Row<TData>, table: Table<TData>, checked: boolean, isShiftKey: boolean) => {\n const displayedRows = table.getRowModel().rows;\n const currentIndex = displayedRows.findIndex((r) => r.id === clickedRow.id);\n const lastSelectedRowId = lastSelectedRowIdRef.current;\n const lastIndex =\n lastSelectedRowId != null ? displayedRows.findIndex((r) => r.id === lastSelectedRowId) : -1;\n\n if (isShiftKey && lastIndex !== -1 && currentIndex !== -1) {\n const startIndex = Math.min(lastIndex, currentIndex);\n const endIndex = Math.max(lastIndex, currentIndex);\n displayedRows.slice(startIndex, endIndex + 1).forEach((rangeRow) => {\n if (rangeRow.getCanSelect()) {\n rangeRow.toggleSelected(checked);\n }\n });\n } else {\n clickedRow.toggleSelected(checked);\n }\n\n lastSelectedRowIdRef.current = clickedRow.id;\n },\n [],\n );\n\n // Enrich columns with filterFn derived from ClientFilterConfig.type so that\n // the PDS useTableColumns hook sets the correct TanStack filter function.\n const columnsWithFilterFn = useMemo(() => {\n if (!clientFiltering) {\n return columns;\n }\n return columns.map((column) => {\n if (\n typeof column === 'object' &&\n column.filter != null &&\n typeof column.filter === 'object' &&\n 'type' in column.filter &&\n typeof (column.filter as { type: unknown }).type === 'string'\n ) {\n const filterType = (column.filter as { type: string }).type;\n return {\n ...column,\n filter: { ...column.filter, filterFn: getFilterFnName(filterType) },\n };\n }\n return column;\n }) as DataTableColumns<TData>;\n }, [columns, clientFiltering]);\n\n const strings = usePDSStrings();\n const locale = usePDSLocale();\n const defaultRenderFormat = useCallback<RenderFormatFn<TData, DataTableColumnFormat<TData>>>(\n (value, format, row) => renderAsPDSFormat(value, format, row, { locale, strings }),\n [locale, strings],\n );\n\n const [tableColumns, columnOptions] = useTableColumns({\n columns: columnsWithFilterFn,\n data,\n compact,\n sort,\n clientSearch,\n clientFiltering,\n expandColumnVisibility,\n showControls,\n enableRowSelection,\n enableSubRowSelection,\n rowActions,\n getRowId,\n expandedRows,\n toggleRowExpansion,\n canRowExpand,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n getSelfAndNestedRowIds,\n handleRowSelectionWithShift,\n renderFormat: renderFormat ?? defaultRenderFormat,\n });\n\n // Custom getExpandedRowModel and expandRows functions to support showing specific nested rows even if the parent row is not expanded\n // Particularly useful when searching for specific rows and we want to show the nested rows that match the search term,\n // but not the other sibling nested rows. The logic is copied from the tanstack table's implementation, we are just\n // adding the above logic. https://github.com/TanStack/table/blob/v8.20.6/packages/table-core/src/utils/getExpandedRowModel.ts#L4\n const expandRowsCustom = useCallback((rowModel: RowModel<TData>): RowModel<TData> => {\n const expandedRows: Row<TData>[] = [];\n\n const handleRow = (row: Row<TData>) => {\n expandedRows.push(row);\n\n if (row.subRows?.length && row.getIsExpanded()) {\n row.subRows.forEach(handleRow);\n } else if (isRowWithSubrowsToAlwaysShowIds(row.original)) {\n row.subRows\n .filter((subrow) =>\n (\n row.original as RowDataWithSubrowsToAlwaysShowIds<TData>\n ).subrowsToAlwaysShowIds.includes(subrow.id),\n )\n .forEach(handleRow);\n }\n };\n\n rowModel.rows.forEach(handleRow);\n\n return {\n rows: expandedRows,\n flatRows: rowModel.flatRows,\n rowsById: rowModel.rowsById,\n };\n }, []);\n\n function getExpandedRowModelCustom(): (table: Table<TData>) => () => RowModel<TData> {\n return (table) =>\n tanstackMemo(\n () => [\n table.getState().expanded,\n table.getPreExpandedRowModel(),\n table.options.paginateExpandedRows,\n ],\n (\n expanded: ExpandedState,\n rowModel: RowModel<TData>,\n paginateExpandedRows: boolean | undefined,\n ) => {\n if (!rowModel.rows.length || (expanded !== true && !Object.keys(expanded ?? {}).length)) {\n return expandRowsCustom(rowModel);\n }\n\n if (!paginateExpandedRows) {\n // Only expand rows at this point if they are being paginated\n return rowModel;\n }\n\n return expandRowsCustom(rowModel);\n },\n getMemoOptions(table.options, 'debugTable', 'getExpandedRowModel'),\n );\n }\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n getSubRows: (row) => (isRowWithSubrows(row) ? row.subrows : []),\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModelCustom(),\n getRowId,\n ...tableOptions,\n });\n\n // We don't yet support multi-header groups across our products so we can assume there's only one\n const tableHeaderGroup = table.getHeaderGroups()[0];\n\n const unprocessedRows = table.getCoreRowModel().rows;\n const rows = table.getRowModel().rows;\n\n // Keyed on the ordered id list so the callback only fires when the displayed\n // rows actually change, not on every render (rows is a fresh array each time).\n const displayedRowIdsKey = rows.map((row) => row.id).join(DISPLAYED_ROW_IDS_SEPARATOR);\n useEffect(() => {\n onDisplayedRowIdsChange?.(\n displayedRowIdsKey ? displayedRowIdsKey.split(DISPLAYED_ROW_IDS_SEPARATOR) : [],\n );\n }, [displayedRowIdsKey, onDisplayedRowIdsChange]);\n\n // Generate checkbox column states based on table data and column values\n useEffect(() => {\n const states: Record<string, Set<string>> = {};\n\n // Find all checkbox columns from the original columns configuration\n const checkboxColumns = columns.filter(\n (column): column is ColumnConfig<TData> =>\n typeof column === 'object' && column.format?.type === 'checkbox',\n );\n\n // For each checkbox column, initialize its state based on the actual column values in the data\n for (const column of checkboxColumns) {\n const columnId = column.id || column.accessor;\n const checkedRowIds = new Set<string>();\n\n // Use table rows to get the actual row data and check the column values\n const getSelfAndNestedRows = (row: Row<TData>): Row<TData>[] => [\n row,\n ...row.subRows.map(getSelfAndNestedRows).flat(),\n ];\n const rootAndNestedRows = unprocessedRows.flatMap(getSelfAndNestedRows);\n for (const row of rootAndNestedRows) {\n const rowId = row.id;\n const rowData = row.original;\n\n // Get the column value from the row data (use accessor, not custom id)\n const columnValue = rowData[column.accessor as keyof TData];\n\n // If the column value is truthy, consider it checked\n if (columnValue) {\n checkedRowIds.add(rowId);\n }\n }\n\n states[columnId] = checkedRowIds;\n }\n\n setCheckboxColumnStates(states);\n }, [unprocessedRows, columns]);\n\n // Generate search props for TableControls when client search is enabled\n const generatedSearchProps = clientSearch\n ? {\n value: globalFilter,\n handleInput: setGlobalFilter,\n placeholder:\n typeof clientSearch === 'object'\n ? clientSearch.placeholder || DEFAULT_SEARCH_PLACEHOLDER\n : DEFAULT_SEARCH_PLACEHOLDER,\n ...(typeof clientSearch === 'object' && clientSearch),\n }\n : undefined;\n\n const unifiedFilters = useMemo<TFilter[]>(() => {\n const configuredFilters = controls?.filters ?? [];\n if (!clientFiltering) {\n return [...configuredFilters];\n }\n\n const clientFilters = generateClientFilters(\n columns.filter((column): column is ColumnConfig<TData> => typeof column === 'object'),\n columnFilters,\n setColumnFilters,\n );\n return [...configuredFilters, ...(clientFilters as unknown as TFilter[])];\n }, [clientFiltering, columnFilters, columns, controls?.filters, setColumnFilters]);\n\n // Helper function to get common pinning styles\n const getCommonPinningStyles = useCallback(\n (column: Column<TData>) => {\n const isPinned = column.getIsPinned();\n const isLastPinned = isPinned === 'left' && column.getIsLastColumn('left');\n\n return {\n left:\n isPinned === 'left' ? `${column.getStart('left') + pinnedColumnLeftOffset}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n hasRightBorder: isLastPinned,\n };\n },\n [pinnedColumnLeftOffset],\n );\n\n /**\n * Check if the column is a table feature column.\n * Feature columns are special columns set by the table to\n * allow a user to perform an action.\n */\n const isFeatureCol = (columnId: string) => {\n return ['select-col', 'expand-col', 'action-col'].includes(columnId);\n };\n\n const selectedRows = table.getFilteredSelectedRowModel().flatRows;\n\n useEffect(() => {\n onRowSelectionChange?.(selectedRows.map((row) => row.original));\n }, [selectedRows, onRowSelectionChange]);\n\n const actions = useMemo(() => {\n // Use dynamic bulk actions if provided, otherwise fall back to static ones\n const availableActions = getAvailableBulkActions\n ? getAvailableBulkActions(selectedRows.map((row) => row.original))\n : bulkActions || controls?.bulkActions;\n return availableActions?.map((action) => {\n // Create clearSelection callback that actions can call when they're ready\n const clearSelection = () => table.setRowSelection({});\n\n const baseAction = {\n ...action,\n onClick: async () => {\n await action.onClick(\n selectedRows.map((row) => row.id),\n clearSelection,\n );\n },\n };\n\n // Check if action has popover configuration (only on bulkActions, not controls?.bulkActions)\n if ('popover' in action && action.popover) {\n const popoverConfig = action.popover as {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string, selectedRows: string[]) => void | Promise<void>;\n };\n return {\n ...baseAction,\n popover: {\n options: popoverConfig.options,\n onOptionSelect: async (option: string) => {\n await popoverConfig.onOptionSelect(\n option,\n selectedRows.map((row) => row.id),\n );\n table.setRowSelection({});\n },\n },\n };\n }\n\n return baseAction;\n });\n }, [bulkActions, getAvailableBulkActions, selectedRows, table, controls?.bulkActions]);\n\n const shouldShowFloatingActionBar =\n compact && actions && actions.length > 0 && selectedRows.length > 0;\n\n // Check if any filters are active\n const hasGlobalFilter = clientSearch && globalFilter && globalFilter.trim().length > 0;\n const hasFilters =\n columnFilters.length > 0 ||\n (controls?.filterPanel == null &&\n (controls?.filtersV2 != null\n ? controls.filtersV2.initialState != null && !isEmptyState(controls.filtersV2.initialState)\n : unifiedFilters.some(\n (filter) =>\n filter.enabled !== false && isFilterActive(filter, controls?.filterResolver),\n )));\n const hasActiveFilters = hasGlobalFilter || hasFilters || hasExternalActiveFilters;\n\n return (\n <DataTableContainer $stickyHeader={stickyHeader}>\n {showControls && (\n <DataTableControls<TFilter>\n compact={compact}\n title={title}\n propertiesButton={\n showColumnProperties && (\n <TableViewConfigurationDropdown\n disabled={false}\n columnConfiguration={table\n .getVisibleFlatColumns()\n .filter((column) => !isFeatureCol(column.columnDef.id ?? ''))\n .map((column) => ({\n key: column.id,\n label: column.columnDef.header?.toString() || column.id,\n }))\n .sort((a, b) => {\n return (orderMap[a.key] || 0) - (orderMap[b.key] || 0);\n })}\n attributeOptions={columnOptions}\n updateColumnConfiguration={(newConfiguration) => {\n table.getAllColumns().map((column) => {\n column.toggleVisibility(!!newConfiguration.find((c) => c.key === column.id));\n });\n\n setColumnOrder(newConfiguration.map((c) => c.key));\n\n if (onUpdateColumnProperties) {\n onUpdateColumnProperties(newConfiguration);\n }\n }}\n size={compact ? 'sm' : undefined}\n variant={compact ? 'text' : 'basic'}\n />\n )\n }\n selectedRows={table.getFilteredSelectedRowModel().flatRows.map((row) => row.id)}\n onClearSelection={() => table.setRowSelection({})}\n searchProps={generatedSearchProps}\n {...controls}\n bulkActions={actions}\n filters={unifiedFilters}\n />\n )}\n <TableContainer $stickyHeader={stickyHeader}>\n <StyledTableLayout\n $onAddRow={!!onAddRow}\n stickyHeader={stickyHeader}\n containerScrollsHorizontally={scrollsHorizontally}\n headerTR={\n <>\n {tableHeaderGroup.headers.map((header) => {\n const pinningStyles = getCommonPinningStyles(header.column);\n const isPinned = pinningStyles.position === 'sticky';\n const width = header.column.columnDef.meta?.width\n ? `${header.column.columnDef.meta?.width}px`\n : undefined;\n const minWidth = header.column.columnDef.meta?.minWidth\n ? `${header.column.columnDef.meta?.minWidth}px`\n : (width ?? `${header.column.getSize()}px`);\n const thProps = {\n id: header.id,\n sortable: isFeatureCol(header.id) ? false : header.column.getCanSort(),\n onClick: isFeatureCol(header.id)\n ? undefined\n : header.column.getToggleSortingHandler(),\n sortDirection: isFeatureCol(header.id) ? undefined : header.column.getIsSorted(),\n colSpan: header.colSpan,\n align: header.column.columnDef.meta?.align,\n width: header.column.columnDef.meta?.width\n ? `${header.column.columnDef.meta?.width}px`\n : undefined,\n size: (compact ? 'sm' : 'md') as 'sm' | 'md',\n style: {\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n },\n };\n\n if (isPinned) {\n return (\n <StickyTH\n {...thProps}\n key={header.id}\n left={pinningStyles.left ? parseInt(pinningStyles.left) : 0}\n hasRightBorder={pinningStyles.hasRightBorder}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </StickyTH>\n );\n }\n\n return (\n <TableTH {...thProps} key={header.id}>\n {header.column.columnDef.meta?.headerTooltip ? (\n <TextUnderlineTooltip\n side='top'\n tooltip={header.column.columnDef.meta.headerTooltip}\n zIndex={Z_INDICES.topNavTooltip}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </TextUnderlineTooltip>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </TableTH>\n );\n })}\n </>\n }\n nullState={<p>{strings.noResults}</p>}\n isLoading={isLoading}\n size={compact ? 'sm' : undefined}\n >\n {columns.length === 0 ? (\n <TableTR disableHoverBackground>\n <TableEmptyState colSpan={1}>\n <Paragraph size='lg' weight='bold' color='primary'>\n {strings.noColumnsConfigured}\n </Paragraph>\n </TableEmptyState>\n </TableTR>\n ) : rows.length === 0 ? (\n <TableTR disableHoverBackground>\n <TableEmptyState colSpan={tableHeaderGroup.headers.length}>\n <Paragraph size='lg' weight='bold' color='primary'>\n {emptyState?.title ||\n (hasActiveFilters ? strings.noResultsTryFilters : strings.noResults)}\n </Paragraph>\n\n {emptyState?.description && (\n <Paragraph size='md' color='secondary'>\n {emptyState.description}\n </Paragraph>\n )}\n </TableEmptyState>\n </TableTR>\n ) : (\n rows.map((row) => {\n const rowData = row.original;\n const rowId = getRowId ? getRowId(rowData) : row.id;\n const rowLabel = getRowLabel?.(rowData);\n const isExpanded = expandedRows.has(rowId);\n const canExpand = canRowExpand(rowData);\n const rowLinkHref = getLinkToRow\n ? getLinkToRow(row.original)\n : rowLinkPrefix\n ? `${rowLinkPrefix}/${rowId}`\n : undefined;\n // Make the nested row's chevron / checkbox line up with the parent row's first column entry\n const dynamicNestSpacing =\n showControls && enableRowSelection ? NEST_SPACING + 8 : NEST_SPACING;\n\n const visibleCells = row.getVisibleCells();\n const isLinkableCell = (cell: (typeof visibleCells)[number]) =>\n !isFeatureCol(cell.column.id) && cell.column.columnDef.meta?.format?.type !== 'url';\n const rowLinkCellId = rowLinkHref\n ? (visibleCells.find(\n (cell) => cell.column.id === rowLinkColumnId && isLinkableCell(cell),\n )?.column.id ?? visibleCells.find(isLinkableCell)?.column.id)\n : undefined;\n const RowLinkComponent = rowLinkComponent ?? RouterLink;\n const renderCellContent = (cell: (typeof visibleCells)[number]) => {\n const content = flexRender(cell.column.columnDef.cell, cell.getContext());\n\n if (!rowLinkHref || cell.column.id !== rowLinkCellId) {\n return content;\n }\n\n const value = cell.getValue();\n const isEmpty = value == null || value === '';\n\n return (\n <RowLink\n as={RowLinkComponent}\n to={rowLinkHref}\n data-row-link\n aria-label={isEmpty ? rowLabel : undefined}\n >\n {content}\n </RowLink>\n );\n };\n\n let leftMostNonSpecialColumnFound = false;\n const rowElements = visibleCells.map((cell) => {\n const pinningStyles = getCommonPinningStyles(cell.column);\n const isPinned = pinningStyles.position === 'sticky';\n\n if (cell.column.id === 'action-col') {\n return (\n <StyledTableActionTD\n key={cell.id}\n style={{ textAlign: cell.column.columnDef.meta?.align }}\n $nestSpacing={row.depth * dynamicNestSpacing}\n >\n {renderCellContent(cell)}\n </StyledTableActionTD>\n );\n }\n\n if (isPinned) {\n const leftBumpFromNesting = !leftMostNonSpecialColumnFound\n ? row.depth * dynamicNestSpacing\n : 0;\n const width = cell.column.columnDef.meta?.width\n ? `${cell.column.columnDef.meta?.width}px`\n : undefined;\n const minWidth = cell.column.columnDef.meta?.minWidth\n ? `${cell.column.columnDef.meta?.minWidth}px`\n : (width ?? `${cell.column.getSize()}px`);\n\n // Use gap coverage component for expand column, regular StickyTD for others\n const isExpandColumn = cell.column.id === 'expand-col';\n const stickyTableCell = isExpandColumn ? (\n <StickyTDWithGapCoverage\n key={cell.id}\n left={\n (pinningStyles.left ? parseInt(pinningStyles.left) : 0) +\n leftBumpFromNesting\n }\n style={{\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n textAlign: cell.column.columnDef.meta?.align,\n }}\n hasRightBorder={pinningStyles.hasRightBorder}\n $gapCoverage={leftBumpFromNesting}\n >\n {renderCellContent(cell)}\n </StickyTDWithGapCoverage>\n ) : (\n <StickyTD\n key={cell.id}\n left={\n (pinningStyles.left ? parseInt(pinningStyles.left) : 0) +\n leftBumpFromNesting\n }\n style={{\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n textAlign: cell.column.columnDef.meta?.align,\n }}\n hasRightBorder={pinningStyles.hasRightBorder}\n >\n {renderCellContent(cell)}\n </StickyTD>\n );\n\n if (!leftMostNonSpecialColumnFound && !isFeatureCol(cell.column.id)) {\n leftMostNonSpecialColumnFound = true;\n }\n return stickyTableCell;\n }\n\n const tableCell = (\n <StyledTableTD\n key={cell.id}\n style={{ textAlign: cell.column.columnDef.meta?.align }}\n width={isFeatureCol(cell.column.id) ? '1%' : undefined}\n $nestSpacing={\n leftMostNonSpecialColumnFound ? undefined : row.depth * dynamicNestSpacing\n }\n $isFeatureCol={isFeatureCol(cell.column.id)}\n >\n {renderCellContent(cell)}\n </StyledTableTD>\n );\n if (!leftMostNonSpecialColumnFound && !isFeatureCol(cell.column.id)) {\n leftMostNonSpecialColumnFound = true;\n }\n\n return tableCell;\n });\n\n // Determine if row should be active and get active styling\n const isRowActive = rowId === activeRowId;\n const handleRowClick =\n onRowClick != null\n ? () => {\n onRowClick(rowId);\n }\n : canExpand\n ? () => {\n toggleRowExpansion(rowId);\n }\n : undefined;\n\n const handleRowClickWithLink = (event: MouseEvent<HTMLTableRowElement>) => {\n if (forwardedRowLinkClicks.has(event.nativeEvent)) {\n return;\n }\n\n handleRowClick?.();\n\n if (\n !rowLinkHref ||\n event.defaultPrevented ||\n (event.target as Element).closest(\n 'a, button, input, select, textarea, label, [role=\"checkbox\"], [role=\"button\"], [role=\"menuitem\"]',\n )\n ) {\n return;\n }\n\n const link = event.currentTarget.querySelector('a[data-row-link]');\n const ownerWindow = link?.ownerDocument.defaultView;\n\n if (!link || !ownerWindow) {\n return;\n }\n\n const forwardedClick = new ownerWindow.MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n button: event.button,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n });\n forwardedRowLinkClicks.add(forwardedClick);\n link.dispatchEvent(forwardedClick);\n };\n\n const rowProps = {\n 'aria-label': rowLabel,\n onClick: handleRowClickWithLink,\n $isActive: isRowActive,\n disableHoverBackground: disableRowHover,\n css: {\n cursor: rowLinkHref || handleRowClick ? 'pointer' : undefined,\n },\n // Add data-tour-target if present on row data\n ...(isRowWithTourTarget(row.original) && {\n 'data-tour-target': row.original.dataTourTarget,\n }),\n };\n\n const mainRow = (\n <TableTR key={rowId} {...rowProps}>\n {rowElements}\n </TableTR>\n );\n\n const elements = [mainRow];\n\n // Add detail row if expandable and expanded\n if (canExpand && isExpanded) {\n let detailContent: React.ReactNode = null;\n\n if (isRowWithDetails(rowData) && rowData._details) {\n if (typeof rowData._details === 'function') {\n // If it's a function, call it with the row data as props\n detailContent = rowData._details(rowData);\n } else {\n // If it's a React node\n detailContent = rowData._details;\n }\n } else if (detailComponent) {\n const DetailComponent = detailComponent;\n detailContent = <DetailComponent rowData={rowData} />;\n }\n\n if (detailContent) {\n const detailCells = initialColumnPinning?.left?.length ? (\n <>\n <StickyTD colSpan={1} left={pinnedColumnLeftOffset} />\n <StickyDetailsTD\n colSpan={tableHeaderGroup.headers.length - 1}\n left={EXPAND_COLUMN_WIDTH + pinnedColumnLeftOffset}\n >\n {detailContent}\n </StickyDetailsTD>\n </>\n ) : (\n <>\n <TableTD colSpan={1} />\n <DetailsTD colSpan={tableHeaderGroup.headers.length - 1}>\n {detailContent}\n </DetailsTD>\n </>\n );\n\n elements.push(\n <TableTR key={`${row.id}-details`} disableHoverBackground>\n {detailCells}\n </TableTR>,\n );\n }\n }\n\n // Add inserter row if onAddRow prop is provided\n if (\n onAddRow &&\n (!canAddAfterRow ||\n canAddAfterRow?.(rowData, row.getIsExpanded() && isRowWithSubrows(rowData)))\n ) {\n elements.push(\n <Inserter\n key={`${rowId}-inserter`}\n priorRowLabel={`Row ${rowId}`}\n colSpan={tableHeaderGroup.headers.length}\n onAddRow={() =>\n onAddRow(rowId, row.getIsExpanded() && isRowWithSubrows(rowData))\n }\n nestSpacing={row.depth * dynamicNestSpacing}\n />,\n );\n }\n\n return elements;\n })\n )}\n </StyledTableLayout>\n {shouldShowFloatingActionBar && actions && (\n <FloatingActionBarContainer>\n <FloatingActionBar\n selectedCount={selectedRows.length}\n onClearSelection={() => table.setRowSelection({})}\n actions={actions}\n extraContent={floatingBarContent}\n />\n </FloatingActionBarContainer>\n )}\n </TableContainer>\n {pagination && data.length > 0 && (\n <Pagination\n pageSize={table.getState().pagination.pageSize}\n pageSizeOptions={typeof pagination === 'object' ? pagination.pageSizeOptions : undefined}\n showPageSizeSelector={\n isServerPagination(pagination) ? pagination.showPageSizeSelector : undefined\n }\n paginationParams={{\n 'current-page': table.getState().pagination.pageIndex + 1,\n 'total-count': table.getRowCount(),\n 'total-pages': table.getPageCount(),\n }}\n handlePageLinkClick={(pageNumber) => table.setPageIndex(pageNumber - 1)}\n handlePageSizeClick={table.setPageSize}\n onPageChange={isServerPagination(pagination) ? pagination.onPageChange : undefined}\n />\n )}\n </DataTableContainer>\n );\n};\n\nexport default DataTable;\n"],"mappings":"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"}
|