@pk-design/react-tailwind 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/DataTable/DataTable.js +1 -1
- package/dist/cjs/components/DataTable/DataTable.js.map +1 -1
- package/dist/cjs/components/RadioGroup/RadioGroup.js +5 -3
- package/dist/cjs/components/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/es/components/DataTable/DataTable.js +1 -1
- package/dist/es/components/DataTable/DataTable.js.map +1 -1
- package/dist/es/components/RadioGroup/RadioGroup.js +5 -3
- package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/react-tailwind.cjs.js +6 -4
- package/dist/react-tailwind.cjs.js.map +1 -1
- package/dist/react-tailwind.es.js +6 -4
- package/dist/react-tailwind.es.js.map +1 -1
- package/dist/types/components/DataTable/DataTable.types.d.ts +2 -2
- package/package.json +1 -1
|
@@ -134,7 +134,7 @@ function DataTable({ items, columns, sorting = {}, onSort, loading, pagination,
|
|
|
134
134
|
}), isInlineMode && (jsxRuntime.jsx(Table.TableCell, { align: "right", className: buildClassname.buildClassName(densityCellClass, striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40'), onClick: (e) => e.stopPropagation(), children: jsxRuntime.jsx("div", { className: buildClassname.buildClassName('opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5', rowHoverActionClass), "data-testid": `row-hover-actions-${key}`, children: renderActionsContent(item, idx) }) })), isOverlayMode && (jsxRuntime.jsx(Table.TableCell, { align: "right", style: { padding: 0, width: 0, minWidth: 0, maxWidth: 0 }, className: "sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right", onClick: (e) => e.stopPropagation(), children: jsxRuntime.jsx("div", { className: buildClassname.buildClassName('absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap', striped && idx % 2 === 1
|
|
135
135
|
? 'bg-gray-100 dark:bg-gray-800'
|
|
136
136
|
: 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800', rowHoverActionClass), "data-testid": `row-hover-actions-${key}`, children: renderActionsContent(item, idx) }) }))] }, key));
|
|
137
|
-
})) }), footerRow && jsxRuntime.jsx(Table.TableFoot, { children: footerRow })] }) }), pagination && (jsxRuntime.jsx("div", { className: buildClassname.buildClassName(stickyPagination && 'sticky bottom-0 z-20
|
|
137
|
+
})) }), footerRow && jsxRuntime.jsx(Table.TableFoot, { children: footerRow })] }) }), pagination && (jsxRuntime.jsx("div", { className: buildClassname.buildClassName(stickyPagination && 'sticky bottom-0 z-20', paginationContainerClass), children: renderPagination ? (renderPagination(pagination, setPagination)) : (jsxRuntime.jsx(Pagination.Pagination, { ...pagination, ...paginationProps, className: buildClassname.buildClassName('rounded-t-none rounded-b-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800', paginationClass, paginationProps === null || paginationProps === void 0 ? void 0 : paginationProps.className), onChange: setPagination })) }))] }));
|
|
138
138
|
}
|
|
139
139
|
DataTable.displayName = 'DataTable';
|
|
140
140
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.js","sources":["../../../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n EmptyTableRow,\n Table,\n TableBody,\n TableCell,\n TableFoot,\n TableHead,\n TableHeaderCell,\n TableRow,\n} from '../Table'\nimport { buildClassName } from '../../utils/build-classname'\nimport type {\n DataTableProps,\n DataTableColumn,\n DataTableDensity,\n Sorting,\n SortQuery,\n} from './DataTable.types'\nimport { TextContent } from '../TextContent'\nimport { Pagination } from '../Pagination'\nimport { Checkbox } from '../Checkbox'\nimport { Button } from '../Button'\nimport { get } from '../../utils/get'\nimport { updateSortQuery, useRowSelection } from './DataTable.utils'\nimport { getSortIcon } from './DataTable.icons'\n\nconst OVERFLOW_REGEX = /\\boverflow-(x-|y-)?(auto|hidden|scroll|visible|clip)\\b/\nconst NOOP = () => {}\n\nconst DENSITY_CELL_CLASS: Record<DataTableDensity, string> = {\n compact: 'px-2 py-1.5',\n default: '',\n spacious: 'px-4 py-4',\n}\n\nconst autoSortItems = <T,>(items: T[], column: DataTableColumn<T>, sort: Sorting): T[] => {\n const path = column.name\n return [...items].sort((a, b) => {\n const valueA = get(a as Record<string, any>, path)\n const valueB = get(b as Record<string, any>, path)\n\n if (column.type === 'number') {\n const nA = Number(valueA)\n const nB = Number(valueB)\n return sort === 'asc' || sort === '1' ? nA - nB : nB - nA\n }\n\n if (column.type === 'date') {\n const dA = new Date(valueA).getTime()\n const dB = new Date(valueB).getTime()\n return sort === 'asc' || sort === '1' ? dA - dB : dB - dA\n }\n\n const sA = String(valueA).toLowerCase()\n const sB = String(valueB).toLowerCase()\n if (sA < sB) return sort === 'asc' || sort === '1' ? -1 : 1\n if (sA > sB) return sort === 'asc' || sort === '1' ? 1 : -1\n return 0\n })\n}\n\nexport function DataTable<T extends Record<string, any> = Record<string, any>>({\n items,\n columns,\n sorting = {},\n onSort,\n loading,\n pagination,\n setPagination = NOOP,\n emptyMessage = 'No data found',\n containerClass = '',\n wrapperClass = '',\n tableClass = '',\n headClass = '',\n footerRow,\n rowKey = 'id',\n onRowClick,\n rowClass,\n density = 'default',\n striped = false,\n layout = 'auto',\n selectable = false,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n stickyHeader = true,\n stickyPagination = true,\n rowHoverActions,\n renderRowHoverActions,\n rowHoverActionHeader,\n rowHoverActionMode = 'overlay',\n rowHoverActionClass,\n paginationClass,\n paginationContainerClass,\n paginationProps,\n renderPagination,\n}: DataTableProps<T>) {\n const [internalSortingState, setInternalSortingState] = useState<SortQuery>({})\n\n const handleSort = useCallback(\n (column: DataTableColumn<T>) => {\n if (!column.sortable) return\n if (onSort) {\n onSort(column)\n } else {\n setInternalSortingState((prev) => updateSortQuery(prev, column.name, column.type))\n }\n },\n [onSort],\n )\n\n const activeSorting = useMemo(\n () => ({ ...sorting, ...internalSortingState }),\n [sorting, internalSortingState],\n )\n\n const sortedItems: T[] = useMemo(() => {\n if (onSort) return items\n const activeSortKey = Object.keys(activeSorting)[0]\n if (!activeSortKey) return items\n const column = columns.find((c) => c.name === activeSortKey)\n if (!column) return items\n return autoSortItems(items, column, activeSorting[activeSortKey])\n }, [items, columns, onSort, activeSorting])\n\n const getKey = useCallback(\n (item: T, idx: number): string | number =>\n typeof rowKey === 'function' ? rowKey(item) : ((item as any)[rowKey] ?? idx),\n [rowKey],\n )\n\n const getRowClass = useCallback(\n (item: T, idx: number): string =>\n typeof rowClass === 'function' ? rowClass(item, idx) : rowClass || '',\n [rowClass],\n )\n\n const getCellClass = useCallback(\n (column: DataTableColumn<T>, item: T): string =>\n typeof column.cellClass === 'function' ? column.cellClass(item) : column.cellClass || '',\n [],\n )\n\n const { isSelected, toggleRow, toggleAll, allSelected, someSelected } = useRowSelection({\n items: sortedItems,\n getKey,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n })\n\n const hasRowHoverActions = Boolean(rowHoverActions || renderRowHoverActions)\n const isInlineMode = hasRowHoverActions && rowHoverActionMode === 'inline'\n const isOverlayMode = hasRowHoverActions && rowHoverActionMode !== 'inline'\n\n const densityCellClass = DENSITY_CELL_CLASS[density]\n const colSize = columns.length + (selectable ? 1 : 0) + (isInlineMode ? 1 : 0)\n const wrapperHasOverflow = OVERFLOW_REGEX.test(wrapperClass)\n\n const renderActionsContent = useCallback(\n (item: T, idx: number) => {\n if (renderRowHoverActions) return renderRowHoverActions(item, idx)\n if (!rowHoverActions) return null\n return rowHoverActions(item, idx).map((act) => {\n const isDisabled = typeof act.disabled === 'function' ? act.disabled(item) : act.disabled\n const isIconOnly = Boolean(act.icon && !act.label)\n\n return (\n <Button\n key={act.id}\n size=\"xs\"\n theme={act.theme || 'secondary'}\n variant={act.variant || 'plain'}\n disabled={isDisabled}\n title={act.title || (typeof act.label === 'string' ? act.label : undefined)}\n className={buildClassName(\n isIconOnly\n ? 'p-1.5 rounded-full hover:bg-black/5 dark:hover:bg-white/10'\n : 'px-2 py-1',\n act.className,\n )}\n onClick={(e) => {\n e.stopPropagation()\n act.onClick(item, idx, e)\n }}\n >\n {act.icon && <span className=\"shrink-0\">{act.icon}</span>}\n {act.label && <span>{act.label}</span>}\n </Button>\n )\n })\n },\n [renderRowHoverActions, rowHoverActions],\n )\n\n return (\n <div className={buildClassName('w-full rounded-lg relative', containerClass)}>\n <div\n className={buildClassName(\n !wrapperHasOverflow && 'overflow-x-auto',\n 'rounded-lg border border-[var(--ui-border)]',\n wrapperClass,\n pagination && 'rounded-b-none border-b-0',\n )}\n >\n <Table\n className={buildClassName('relative w-full max-w-full h-fit', tableClass)}\n layout={layout}\n >\n <TableHead className={headClass}>\n {selectable && (\n <TableHeaderCell\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected\n }}\n onChange={toggleAll}\n />\n </TableHeaderCell>\n )}\n {columns.map((column) => {\n const sortState = activeSorting[column.name]\n const ariaSortValue = column.sortable\n ? sortState === 'asc' || sortState === '1'\n ? 'ascending'\n : sortState === 'desc' || sortState === '-1'\n ? 'descending'\n : 'none'\n : undefined\n\n return (\n <TableHeaderCell\n key={column.name}\n align={column.headerAlign}\n style={{ width: column.width || 'auto' }}\n aria-sort={ariaSortValue}\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n column.sticky === 'left' &&\n 'sticky left-0 z-30 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-30 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n column.headerClass,\n )}\n >\n <TextContent\n role={column.sortable ? 'button' : undefined}\n tabIndex={column.sortable ? 0 : undefined}\n aria-label={column.sortable ? `Sort by ${column.label}` : undefined}\n className={buildClassName(\n 'group',\n column.sortable &&\n 'inline-flex items-center gap-2 cursor-pointer select-none focus:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 rounded',\n )}\n onClick={() => handleSort(column)}\n onKeyDown={(e) => {\n if (column.sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n handleSort(column)\n }\n }}\n >\n <TextContent className=\"shrink-0\">{column.label}</TextContent>\n {column.sortable ? getSortIcon(activeSorting[column.name]) : null}\n </TextContent>\n </TableHeaderCell>\n )\n })}\n {isInlineMode && (\n <TableHeaderCell\n align=\"right\"\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 text-right w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n {rowHoverActionHeader ?? ''}\n </TableHeaderCell>\n )}\n {isOverlayMode && (\n <TableHeaderCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className={buildClassName(\n 'sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 bg-gray-50 dark:bg-gray-800',\n stickyHeader && 'top-0',\n )}\n >\n {null}\n </TableHeaderCell>\n )}\n </TableHead>\n\n <TableBody loading={loading} colSize={colSize} rowSize={pagination?.limit || 5}>\n {!loading && sortedItems.length === 0 ? (\n <EmptyTableRow colSpan={colSize}>{emptyMessage}</EmptyTableRow>\n ) : (\n sortedItems.map((item, idx) => {\n const key = getKey(item, idx)\n const rowSelectable = !isRowSelectable || isRowSelectable(item)\n\n return (\n <TableRow\n key={key}\n className={buildClassName(\n 'group',\n onRowClick && 'cursor-pointer',\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n getRowClass(item, idx),\n )}\n onClick={onRowClick ? () => onRowClick(item, idx) : undefined}\n >\n {selectable && (\n <TableCell\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n >\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label=\"Select row\"\n checked={isSelected(key)}\n disabled={!rowSelectable}\n onChange={() => toggleRow(key)}\n />\n </span>\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.name}\n align={column.align}\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n column.sticky === 'left' &&\n 'sticky left-0 z-10 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-10 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n getCellClass(column, item),\n )}\n >\n {column.render\n ? column.render(item)\n : ((get(item, column.name) as any) ?? 'Not set')}\n </TableCell>\n ))}\n {isInlineMode && (\n <TableCell\n align=\"right\"\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n {isOverlayMode && (\n <TableCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className=\"sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right\"\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap',\n striped && idx % 2 === 1\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n </TableRow>\n )\n })\n )}\n </TableBody>\n\n {footerRow && <TableFoot>{footerRow}</TableFoot>}\n </Table>\n </div>\n\n {pagination && (\n <div\n className={buildClassName(\n stickyPagination && 'sticky bottom-0 z-20 bg-white dark:bg-gray-800',\n paginationClass,\n paginationContainerClass,\n )}\n >\n {renderPagination ? (\n renderPagination(pagination, setPagination)\n ) : (\n <Pagination\n {...pagination}\n {...paginationProps}\n className={buildClassName(\n 'rounded-t-none rounded-b-lg border border-[var(--ui-border)]',\n stickyPagination && 'sticky bottom-0 z-20 bg-white dark:bg-gray-800',\n paginationProps?.className,\n )}\n onChange={setPagination}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n\nDataTable.displayName = 'DataTable'\n"],"names":["get","useState","useCallback","updateSortQuery","useMemo","useRowSelection","_jsxs","Button","buildClassName","_jsx","Table","TableHead","TableHeaderCell","Checkbox","TextContent","getSortIcon","TableBody","EmptyTableRow","TableRow","TableCell","TableFoot","Pagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.js","sources":["../../../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n EmptyTableRow,\n Table,\n TableBody,\n TableCell,\n TableFoot,\n TableHead,\n TableHeaderCell,\n TableRow,\n} from '../Table'\nimport { buildClassName } from '../../utils/build-classname'\nimport type {\n DataTableProps,\n DataTableColumn,\n DataTableDensity,\n Sorting,\n SortQuery,\n} from './DataTable.types'\nimport { TextContent } from '../TextContent'\nimport { Pagination } from '../Pagination'\nimport { Checkbox } from '../Checkbox'\nimport { Button } from '../Button'\nimport { get } from '../../utils/get'\nimport { updateSortQuery, useRowSelection } from './DataTable.utils'\nimport { getSortIcon } from './DataTable.icons'\n\nconst OVERFLOW_REGEX = /\\boverflow-(x-|y-)?(auto|hidden|scroll|visible|clip)\\b/\nconst NOOP = () => {}\n\nconst DENSITY_CELL_CLASS: Record<DataTableDensity, string> = {\n compact: 'px-2 py-1.5',\n default: '',\n spacious: 'px-4 py-4',\n}\n\nconst autoSortItems = <T,>(items: T[], column: DataTableColumn<T>, sort: Sorting): T[] => {\n const path = column.name\n return [...items].sort((a, b) => {\n const valueA = get(a as Record<string, any>, path)\n const valueB = get(b as Record<string, any>, path)\n\n if (column.type === 'number') {\n const nA = Number(valueA)\n const nB = Number(valueB)\n return sort === 'asc' || sort === '1' ? nA - nB : nB - nA\n }\n\n if (column.type === 'date') {\n const dA = new Date(valueA).getTime()\n const dB = new Date(valueB).getTime()\n return sort === 'asc' || sort === '1' ? dA - dB : dB - dA\n }\n\n const sA = String(valueA).toLowerCase()\n const sB = String(valueB).toLowerCase()\n if (sA < sB) return sort === 'asc' || sort === '1' ? -1 : 1\n if (sA > sB) return sort === 'asc' || sort === '1' ? 1 : -1\n return 0\n })\n}\n\nexport function DataTable<T extends Record<string, any> = Record<string, any>>({\n items,\n columns,\n sorting = {},\n onSort,\n loading,\n pagination,\n setPagination = NOOP,\n emptyMessage = 'No data found',\n containerClass = '',\n wrapperClass = '',\n tableClass = '',\n headClass = '',\n footerRow,\n rowKey = 'id',\n onRowClick,\n rowClass,\n density = 'default',\n striped = false,\n layout = 'auto',\n selectable = false,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n stickyHeader = true,\n stickyPagination = true,\n rowHoverActions,\n renderRowHoverActions,\n rowHoverActionHeader,\n rowHoverActionMode = 'overlay',\n rowHoverActionClass,\n paginationClass,\n paginationContainerClass,\n paginationProps,\n renderPagination,\n}: DataTableProps<T>) {\n const [internalSortingState, setInternalSortingState] = useState<SortQuery>({})\n\n const handleSort = useCallback(\n (column: DataTableColumn<T>) => {\n if (!column.sortable) return\n if (onSort) {\n onSort(column)\n } else {\n setInternalSortingState((prev) => updateSortQuery(prev, column.name, column.type))\n }\n },\n [onSort],\n )\n\n const activeSorting = useMemo(\n () => ({ ...sorting, ...internalSortingState }),\n [sorting, internalSortingState],\n )\n\n const sortedItems: T[] = useMemo(() => {\n if (onSort) return items\n const activeSortKey = Object.keys(activeSorting)[0]\n if (!activeSortKey) return items\n const column = columns.find((c) => c.name === activeSortKey)\n if (!column) return items\n return autoSortItems(items, column, activeSorting[activeSortKey])\n }, [items, columns, onSort, activeSorting])\n\n const getKey = useCallback(\n (item: T, idx: number): string | number =>\n typeof rowKey === 'function' ? rowKey(item) : ((item as any)[rowKey] ?? idx),\n [rowKey],\n )\n\n const getRowClass = useCallback(\n (item: T, idx: number): string =>\n typeof rowClass === 'function' ? rowClass(item, idx) : rowClass || '',\n [rowClass],\n )\n\n const getCellClass = useCallback(\n (column: DataTableColumn<T>, item: T): string =>\n typeof column.cellClass === 'function' ? column.cellClass(item) : column.cellClass || '',\n [],\n )\n\n const { isSelected, toggleRow, toggleAll, allSelected, someSelected } = useRowSelection({\n items: sortedItems,\n getKey,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n })\n\n const hasRowHoverActions = Boolean(rowHoverActions || renderRowHoverActions)\n const isInlineMode = hasRowHoverActions && rowHoverActionMode === 'inline'\n const isOverlayMode = hasRowHoverActions && rowHoverActionMode !== 'inline'\n\n const densityCellClass = DENSITY_CELL_CLASS[density]\n const colSize = columns.length + (selectable ? 1 : 0) + (isInlineMode ? 1 : 0)\n const wrapperHasOverflow = OVERFLOW_REGEX.test(wrapperClass)\n\n const renderActionsContent = useCallback(\n (item: T, idx: number) => {\n if (renderRowHoverActions) return renderRowHoverActions(item, idx)\n if (!rowHoverActions) return null\n return rowHoverActions(item, idx).map((act) => {\n const isDisabled = typeof act.disabled === 'function' ? act.disabled(item) : act.disabled\n const isIconOnly = Boolean(act.icon && !act.label)\n\n return (\n <Button\n key={act.id}\n size=\"xs\"\n theme={act.theme || 'secondary'}\n variant={act.variant || 'plain'}\n disabled={isDisabled}\n title={act.title || (typeof act.label === 'string' ? act.label : undefined)}\n className={buildClassName(\n isIconOnly\n ? 'p-1.5 rounded-full hover:bg-black/5 dark:hover:bg-white/10'\n : 'px-2 py-1',\n act.className,\n )}\n onClick={(e) => {\n e.stopPropagation()\n act.onClick(item, idx, e)\n }}\n >\n {act.icon && <span className=\"shrink-0\">{act.icon}</span>}\n {act.label && <span>{act.label}</span>}\n </Button>\n )\n })\n },\n [renderRowHoverActions, rowHoverActions],\n )\n\n return (\n <div className={buildClassName('w-full rounded-lg relative', containerClass)}>\n <div\n className={buildClassName(\n !wrapperHasOverflow && 'overflow-x-auto',\n 'rounded-lg border border-[var(--ui-border)]',\n wrapperClass,\n pagination && 'rounded-b-none border-b-0',\n )}\n >\n <Table\n className={buildClassName('relative w-full max-w-full h-fit', tableClass)}\n layout={layout}\n >\n <TableHead className={headClass}>\n {selectable && (\n <TableHeaderCell\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected\n }}\n onChange={toggleAll}\n />\n </TableHeaderCell>\n )}\n {columns.map((column) => {\n const sortState = activeSorting[column.name]\n const ariaSortValue = column.sortable\n ? sortState === 'asc' || sortState === '1'\n ? 'ascending'\n : sortState === 'desc' || sortState === '-1'\n ? 'descending'\n : 'none'\n : undefined\n\n return (\n <TableHeaderCell\n key={column.name}\n align={column.headerAlign}\n style={{ width: column.width || 'auto' }}\n aria-sort={ariaSortValue}\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n column.sticky === 'left' &&\n 'sticky left-0 z-30 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-30 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n column.headerClass,\n )}\n >\n <TextContent\n role={column.sortable ? 'button' : undefined}\n tabIndex={column.sortable ? 0 : undefined}\n aria-label={column.sortable ? `Sort by ${column.label}` : undefined}\n className={buildClassName(\n 'group',\n column.sortable &&\n 'inline-flex items-center gap-2 cursor-pointer select-none focus:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 rounded',\n )}\n onClick={() => handleSort(column)}\n onKeyDown={(e) => {\n if (column.sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n handleSort(column)\n }\n }}\n >\n <TextContent className=\"shrink-0\">{column.label}</TextContent>\n {column.sortable ? getSortIcon(activeSorting[column.name]) : null}\n </TextContent>\n </TableHeaderCell>\n )\n })}\n {isInlineMode && (\n <TableHeaderCell\n align=\"right\"\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 text-right w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n {rowHoverActionHeader ?? ''}\n </TableHeaderCell>\n )}\n {isOverlayMode && (\n <TableHeaderCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className={buildClassName(\n 'sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 bg-gray-50 dark:bg-gray-800',\n stickyHeader && 'top-0',\n )}\n >\n {null}\n </TableHeaderCell>\n )}\n </TableHead>\n\n <TableBody loading={loading} colSize={colSize} rowSize={pagination?.limit || 5}>\n {!loading && sortedItems.length === 0 ? (\n <EmptyTableRow colSpan={colSize}>{emptyMessage}</EmptyTableRow>\n ) : (\n sortedItems.map((item, idx) => {\n const key = getKey(item, idx)\n const rowSelectable = !isRowSelectable || isRowSelectable(item)\n\n return (\n <TableRow\n key={key}\n className={buildClassName(\n 'group',\n onRowClick && 'cursor-pointer',\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n getRowClass(item, idx),\n )}\n onClick={onRowClick ? () => onRowClick(item, idx) : undefined}\n >\n {selectable && (\n <TableCell\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n >\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label=\"Select row\"\n checked={isSelected(key)}\n disabled={!rowSelectable}\n onChange={() => toggleRow(key)}\n />\n </span>\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.name}\n align={column.align}\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n column.sticky === 'left' &&\n 'sticky left-0 z-10 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-10 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n getCellClass(column, item),\n )}\n >\n {column.render\n ? column.render(item)\n : ((get(item, column.name) as any) ?? 'Not set')}\n </TableCell>\n ))}\n {isInlineMode && (\n <TableCell\n align=\"right\"\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n {isOverlayMode && (\n <TableCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className=\"sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right\"\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap',\n striped && idx % 2 === 1\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n </TableRow>\n )\n })\n )}\n </TableBody>\n\n {footerRow && <TableFoot>{footerRow}</TableFoot>}\n </Table>\n </div>\n\n {pagination && (\n <div\n className={buildClassName(\n stickyPagination && 'sticky bottom-0 z-20',\n paginationContainerClass,\n )}\n >\n {renderPagination ? (\n renderPagination(pagination, setPagination)\n ) : (\n <Pagination\n {...pagination}\n {...paginationProps}\n className={buildClassName(\n 'rounded-t-none rounded-b-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800',\n paginationClass,\n paginationProps?.className,\n )}\n onChange={setPagination}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n\nDataTable.displayName = 'DataTable'\n"],"names":["get","useState","useCallback","updateSortQuery","useMemo","useRowSelection","_jsxs","Button","buildClassName","_jsx","Table","TableHead","TableHeaderCell","Checkbox","TextContent","getSortIcon","TableBody","EmptyTableRow","TableRow","TableCell","TableFoot","Pagination"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ const COLUMN_GRID_MAP = {
|
|
|
16
16
|
const RadioGroup = (props) => {
|
|
17
17
|
const { name, variant = 'default', size = 'md', theme = 'primary', label, labelClass, labelWrapperClass, labelHint, containerClass, options, value, columns, disabled = false, row, error, showErrorMessage = true, onChange, required, 'aria-describedby': ariaDescribedBy, } = props;
|
|
18
18
|
const groupId = React.useId();
|
|
19
|
+
const groupName = name || groupId;
|
|
19
20
|
const items = React.useMemo(() => {
|
|
20
21
|
var _a;
|
|
21
22
|
return (_a = options === null || options === void 0 ? void 0 : options.map((option) => typeof option === 'string'
|
|
@@ -40,13 +41,14 @@ const RadioGroup = (props) => {
|
|
|
40
41
|
: 'flex flex-col gap-3'), children: items.map((item) => {
|
|
41
42
|
const isSelected = value === item.value;
|
|
42
43
|
const isItemDisabled = disabled || Boolean(item.disabled);
|
|
44
|
+
const radioItemId = `${groupName}-${item.value}`;
|
|
43
45
|
if (isCards) {
|
|
44
|
-
return (jsxRuntime.jsxs("label", { htmlFor:
|
|
46
|
+
return (jsxRuntime.jsxs("label", { htmlFor: radioItemId, className: buildClassname.buildClassName('relative flex items-start gap-3 p-4 rounded-xl border transition-all cursor-pointer select-none min-w-[200px] flex-1', 'focus-within:ring-2 focus-within:ring-[var(--ui-primary-ring)] focus-within:border-[var(--ui-primary)]', isSelected
|
|
45
47
|
? 'border-[var(--ui-primary)] bg-blue-50/40 dark:bg-blue-950/30 ring-2 ring-[var(--ui-primary-ring)]/30'
|
|
46
48
|
: 'border-[var(--ui-border)] bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600', isItemDisabled &&
|
|
47
|
-
'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50'), children: [jsxRuntime.jsx(Radio.Radio, { name:
|
|
49
|
+
'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50'), children: [jsxRuntime.jsx(Radio.Radio, { name: groupName, id: radioItemId, value: item.value, "aria-label": item.label, size: size, theme: theme, checked: isSelected, disabled: isItemDisabled, onChange: onChange, containerClass: "pt-0.5" }), jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [item.icon && (jsxRuntime.jsx("span", { className: "shrink-0 text-gray-500 dark:text-gray-400", children: item.icon })), jsxRuntime.jsx("span", { className: "text-sm font-semibold text-gray-900 dark:text-white truncate", children: item.label })] }), item.description && (jsxRuntime.jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400 font-normal leading-relaxed", children: item.description }))] })] }, item.value));
|
|
48
50
|
}
|
|
49
|
-
return (jsxRuntime.jsx(Radio.Radio, { name:
|
|
51
|
+
return (jsxRuntime.jsx(Radio.Radio, { name: groupName, id: radioItemId, label: item.label, description: item.description, value: item.value, size: size, theme: theme, checked: isSelected, disabled: isItemDisabled, onChange: onChange }, item.value));
|
|
50
52
|
}) }), showErrorMessage && error && (jsxRuntime.jsx("div", { className: "mt-1.5", children: jsxRuntime.jsx(TextContent.TextContent, { error: true, small: true, id: errorId, children: error }) }))] }));
|
|
51
53
|
};
|
|
52
54
|
RadioGroup.displayName = 'RadioGroup';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroup.js","sources":["../../../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { useId, useMemo } from 'react'\nimport { Radio } from '../Radio'\nimport { Label } from '../Label'\nimport { buildClassName } from '../../utils/build-classname'\nimport { TextContent } from '../TextContent'\nimport type { RadioGroupProps } from './RadioGroup.types'\n\nconst COLUMN_GRID_MAP: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-4',\n}\n\nexport const RadioGroup: React.FC<RadioGroupProps> = (props) => {\n const {\n name,\n variant = 'default',\n size = 'md',\n theme = 'primary',\n label,\n labelClass,\n labelWrapperClass,\n labelHint,\n containerClass,\n options,\n value,\n columns,\n disabled = false,\n row,\n error,\n showErrorMessage = true,\n onChange,\n required,\n 'aria-describedby': ariaDescribedBy,\n } = props\n\n const groupId = useId()\n\n const items = useMemo(\n () =>\n options?.map((option) =>\n typeof option === 'string'\n ? {\n label: option,\n value: option,\n description: undefined,\n icon: undefined,\n disabled: undefined,\n }\n : option,\n ) ?? [],\n [options],\n )\n\n const isCards = variant === 'cards'\n const hasError = Boolean(error)\n const labelId = label ? `${groupId}-label` : undefined\n const errorId = groupId && hasError && showErrorMessage ? `${groupId}-error` : undefined\n const describedBy = [ariaDescribedBy, errorId].filter(Boolean).join(' ') || undefined\n\n return (\n <div\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n className={buildClassName(containerClass)}\n >\n {label && (\n <div\n className={buildClassName('flex items-center justify-between mb-3', labelWrapperClass)}\n >\n <Label id={labelId} className={labelClass} aria-required={required}>\n {label}\n </Label>\n {labelHint}\n </div>\n )}\n\n <div\n className={buildClassName(\n columns\n ? buildClassName('grid gap-3', COLUMN_GRID_MAP[columns])\n : row || isCards\n ? 'flex flex-wrap gap-3'\n : 'flex flex-col gap-3',\n )}\n >\n {items.map((item) => {\n const isSelected = value === item.value\n const isItemDisabled = disabled || Boolean(item.disabled)\n\n if (isCards) {\n return (\n <label\n key={item.value}\n htmlFor={
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sources":["../../../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { useId, useMemo } from 'react'\nimport { Radio } from '../Radio'\nimport { Label } from '../Label'\nimport { buildClassName } from '../../utils/build-classname'\nimport { TextContent } from '../TextContent'\nimport type { RadioGroupProps } from './RadioGroup.types'\n\nconst COLUMN_GRID_MAP: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-4',\n}\n\nexport const RadioGroup: React.FC<RadioGroupProps> = (props) => {\n const {\n name,\n variant = 'default',\n size = 'md',\n theme = 'primary',\n label,\n labelClass,\n labelWrapperClass,\n labelHint,\n containerClass,\n options,\n value,\n columns,\n disabled = false,\n row,\n error,\n showErrorMessage = true,\n onChange,\n required,\n 'aria-describedby': ariaDescribedBy,\n } = props\n\n const groupId = useId()\n const groupName = name || groupId\n\n const items = useMemo(\n () =>\n options?.map((option) =>\n typeof option === 'string'\n ? {\n label: option,\n value: option,\n description: undefined,\n icon: undefined,\n disabled: undefined,\n }\n : option,\n ) ?? [],\n [options],\n )\n\n const isCards = variant === 'cards'\n const hasError = Boolean(error)\n const labelId = label ? `${groupId}-label` : undefined\n const errorId = groupId && hasError && showErrorMessage ? `${groupId}-error` : undefined\n const describedBy = [ariaDescribedBy, errorId].filter(Boolean).join(' ') || undefined\n\n return (\n <div\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n className={buildClassName(containerClass)}\n >\n {label && (\n <div\n className={buildClassName('flex items-center justify-between mb-3', labelWrapperClass)}\n >\n <Label id={labelId} className={labelClass} aria-required={required}>\n {label}\n </Label>\n {labelHint}\n </div>\n )}\n\n <div\n className={buildClassName(\n columns\n ? buildClassName('grid gap-3', COLUMN_GRID_MAP[columns])\n : row || isCards\n ? 'flex flex-wrap gap-3'\n : 'flex flex-col gap-3',\n )}\n >\n {items.map((item) => {\n const isSelected = value === item.value\n const isItemDisabled = disabled || Boolean(item.disabled)\n const radioItemId = `${groupName}-${item.value}`\n\n if (isCards) {\n return (\n <label\n key={item.value}\n htmlFor={radioItemId}\n className={buildClassName(\n 'relative flex items-start gap-3 p-4 rounded-xl border transition-all cursor-pointer select-none min-w-[200px] flex-1',\n 'focus-within:ring-2 focus-within:ring-[var(--ui-primary-ring)] focus-within:border-[var(--ui-primary)]',\n isSelected\n ? 'border-[var(--ui-primary)] bg-blue-50/40 dark:bg-blue-950/30 ring-2 ring-[var(--ui-primary-ring)]/30'\n : 'border-[var(--ui-border)] bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600',\n isItemDisabled &&\n 'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50',\n )}\n >\n <Radio\n name={groupName}\n id={radioItemId}\n value={item.value}\n aria-label={item.label}\n size={size}\n theme={theme}\n checked={isSelected}\n disabled={isItemDisabled}\n onChange={onChange}\n containerClass=\"pt-0.5\"\n />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {item.icon && (\n <span className=\"shrink-0 text-gray-500 dark:text-gray-400\">{item.icon}</span>\n )}\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white truncate\">\n {item.label}\n </span>\n </div>\n {item.description && (\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400 font-normal leading-relaxed\">\n {item.description}\n </p>\n )}\n </div>\n </label>\n )\n }\n\n return (\n <Radio\n key={item.value}\n name={groupName}\n id={radioItemId}\n label={item.label}\n description={item.description}\n value={item.value}\n size={size}\n theme={theme}\n checked={isSelected}\n disabled={isItemDisabled}\n onChange={onChange}\n />\n )\n })}\n </div>\n\n {showErrorMessage && error && (\n <div className=\"mt-1.5\">\n <TextContent error small id={errorId}>\n {error}\n </TextContent>\n </div>\n )}\n </div>\n )\n}\n\nRadioGroup.displayName = 'RadioGroup'\n"],"names":["useId","useMemo","_jsxs","buildClassName","_jsx","Label","Radio","TextContent"],"mappings":"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"}
|
|
@@ -132,7 +132,7 @@ function DataTable({ items, columns, sorting = {}, onSort, loading, pagination,
|
|
|
132
132
|
}), isInlineMode && (jsx(TableCell, { align: "right", className: buildClassName(densityCellClass, striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40'), onClick: (e) => e.stopPropagation(), children: jsx("div", { className: buildClassName('opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5', rowHoverActionClass), "data-testid": `row-hover-actions-${key}`, children: renderActionsContent(item, idx) }) })), isOverlayMode && (jsx(TableCell, { align: "right", style: { padding: 0, width: 0, minWidth: 0, maxWidth: 0 }, className: "sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right", onClick: (e) => e.stopPropagation(), children: jsx("div", { className: buildClassName('absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap', striped && idx % 2 === 1
|
|
133
133
|
? 'bg-gray-100 dark:bg-gray-800'
|
|
134
134
|
: 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800', rowHoverActionClass), "data-testid": `row-hover-actions-${key}`, children: renderActionsContent(item, idx) }) }))] }, key));
|
|
135
|
-
})) }), footerRow && jsx(TableFoot, { children: footerRow })] }) }), pagination && (jsx("div", { className: buildClassName(stickyPagination && 'sticky bottom-0 z-20
|
|
135
|
+
})) }), footerRow && jsx(TableFoot, { children: footerRow })] }) }), pagination && (jsx("div", { className: buildClassName(stickyPagination && 'sticky bottom-0 z-20', paginationContainerClass), children: renderPagination ? (renderPagination(pagination, setPagination)) : (jsx(Pagination, { ...pagination, ...paginationProps, className: buildClassName('rounded-t-none rounded-b-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800', paginationClass, paginationProps === null || paginationProps === void 0 ? void 0 : paginationProps.className), onChange: setPagination })) }))] }));
|
|
136
136
|
}
|
|
137
137
|
DataTable.displayName = 'DataTable';
|
|
138
138
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.js","sources":["../../../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n EmptyTableRow,\n Table,\n TableBody,\n TableCell,\n TableFoot,\n TableHead,\n TableHeaderCell,\n TableRow,\n} from '../Table'\nimport { buildClassName } from '../../utils/build-classname'\nimport type {\n DataTableProps,\n DataTableColumn,\n DataTableDensity,\n Sorting,\n SortQuery,\n} from './DataTable.types'\nimport { TextContent } from '../TextContent'\nimport { Pagination } from '../Pagination'\nimport { Checkbox } from '../Checkbox'\nimport { Button } from '../Button'\nimport { get } from '../../utils/get'\nimport { updateSortQuery, useRowSelection } from './DataTable.utils'\nimport { getSortIcon } from './DataTable.icons'\n\nconst OVERFLOW_REGEX = /\\boverflow-(x-|y-)?(auto|hidden|scroll|visible|clip)\\b/\nconst NOOP = () => {}\n\nconst DENSITY_CELL_CLASS: Record<DataTableDensity, string> = {\n compact: 'px-2 py-1.5',\n default: '',\n spacious: 'px-4 py-4',\n}\n\nconst autoSortItems = <T,>(items: T[], column: DataTableColumn<T>, sort: Sorting): T[] => {\n const path = column.name\n return [...items].sort((a, b) => {\n const valueA = get(a as Record<string, any>, path)\n const valueB = get(b as Record<string, any>, path)\n\n if (column.type === 'number') {\n const nA = Number(valueA)\n const nB = Number(valueB)\n return sort === 'asc' || sort === '1' ? nA - nB : nB - nA\n }\n\n if (column.type === 'date') {\n const dA = new Date(valueA).getTime()\n const dB = new Date(valueB).getTime()\n return sort === 'asc' || sort === '1' ? dA - dB : dB - dA\n }\n\n const sA = String(valueA).toLowerCase()\n const sB = String(valueB).toLowerCase()\n if (sA < sB) return sort === 'asc' || sort === '1' ? -1 : 1\n if (sA > sB) return sort === 'asc' || sort === '1' ? 1 : -1\n return 0\n })\n}\n\nexport function DataTable<T extends Record<string, any> = Record<string, any>>({\n items,\n columns,\n sorting = {},\n onSort,\n loading,\n pagination,\n setPagination = NOOP,\n emptyMessage = 'No data found',\n containerClass = '',\n wrapperClass = '',\n tableClass = '',\n headClass = '',\n footerRow,\n rowKey = 'id',\n onRowClick,\n rowClass,\n density = 'default',\n striped = false,\n layout = 'auto',\n selectable = false,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n stickyHeader = true,\n stickyPagination = true,\n rowHoverActions,\n renderRowHoverActions,\n rowHoverActionHeader,\n rowHoverActionMode = 'overlay',\n rowHoverActionClass,\n paginationClass,\n paginationContainerClass,\n paginationProps,\n renderPagination,\n}: DataTableProps<T>) {\n const [internalSortingState, setInternalSortingState] = useState<SortQuery>({})\n\n const handleSort = useCallback(\n (column: DataTableColumn<T>) => {\n if (!column.sortable) return\n if (onSort) {\n onSort(column)\n } else {\n setInternalSortingState((prev) => updateSortQuery(prev, column.name, column.type))\n }\n },\n [onSort],\n )\n\n const activeSorting = useMemo(\n () => ({ ...sorting, ...internalSortingState }),\n [sorting, internalSortingState],\n )\n\n const sortedItems: T[] = useMemo(() => {\n if (onSort) return items\n const activeSortKey = Object.keys(activeSorting)[0]\n if (!activeSortKey) return items\n const column = columns.find((c) => c.name === activeSortKey)\n if (!column) return items\n return autoSortItems(items, column, activeSorting[activeSortKey])\n }, [items, columns, onSort, activeSorting])\n\n const getKey = useCallback(\n (item: T, idx: number): string | number =>\n typeof rowKey === 'function' ? rowKey(item) : ((item as any)[rowKey] ?? idx),\n [rowKey],\n )\n\n const getRowClass = useCallback(\n (item: T, idx: number): string =>\n typeof rowClass === 'function' ? rowClass(item, idx) : rowClass || '',\n [rowClass],\n )\n\n const getCellClass = useCallback(\n (column: DataTableColumn<T>, item: T): string =>\n typeof column.cellClass === 'function' ? column.cellClass(item) : column.cellClass || '',\n [],\n )\n\n const { isSelected, toggleRow, toggleAll, allSelected, someSelected } = useRowSelection({\n items: sortedItems,\n getKey,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n })\n\n const hasRowHoverActions = Boolean(rowHoverActions || renderRowHoverActions)\n const isInlineMode = hasRowHoverActions && rowHoverActionMode === 'inline'\n const isOverlayMode = hasRowHoverActions && rowHoverActionMode !== 'inline'\n\n const densityCellClass = DENSITY_CELL_CLASS[density]\n const colSize = columns.length + (selectable ? 1 : 0) + (isInlineMode ? 1 : 0)\n const wrapperHasOverflow = OVERFLOW_REGEX.test(wrapperClass)\n\n const renderActionsContent = useCallback(\n (item: T, idx: number) => {\n if (renderRowHoverActions) return renderRowHoverActions(item, idx)\n if (!rowHoverActions) return null\n return rowHoverActions(item, idx).map((act) => {\n const isDisabled = typeof act.disabled === 'function' ? act.disabled(item) : act.disabled\n const isIconOnly = Boolean(act.icon && !act.label)\n\n return (\n <Button\n key={act.id}\n size=\"xs\"\n theme={act.theme || 'secondary'}\n variant={act.variant || 'plain'}\n disabled={isDisabled}\n title={act.title || (typeof act.label === 'string' ? act.label : undefined)}\n className={buildClassName(\n isIconOnly\n ? 'p-1.5 rounded-full hover:bg-black/5 dark:hover:bg-white/10'\n : 'px-2 py-1',\n act.className,\n )}\n onClick={(e) => {\n e.stopPropagation()\n act.onClick(item, idx, e)\n }}\n >\n {act.icon && <span className=\"shrink-0\">{act.icon}</span>}\n {act.label && <span>{act.label}</span>}\n </Button>\n )\n })\n },\n [renderRowHoverActions, rowHoverActions],\n )\n\n return (\n <div className={buildClassName('w-full rounded-lg relative', containerClass)}>\n <div\n className={buildClassName(\n !wrapperHasOverflow && 'overflow-x-auto',\n 'rounded-lg border border-[var(--ui-border)]',\n wrapperClass,\n pagination && 'rounded-b-none border-b-0',\n )}\n >\n <Table\n className={buildClassName('relative w-full max-w-full h-fit', tableClass)}\n layout={layout}\n >\n <TableHead className={headClass}>\n {selectable && (\n <TableHeaderCell\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected\n }}\n onChange={toggleAll}\n />\n </TableHeaderCell>\n )}\n {columns.map((column) => {\n const sortState = activeSorting[column.name]\n const ariaSortValue = column.sortable\n ? sortState === 'asc' || sortState === '1'\n ? 'ascending'\n : sortState === 'desc' || sortState === '-1'\n ? 'descending'\n : 'none'\n : undefined\n\n return (\n <TableHeaderCell\n key={column.name}\n align={column.headerAlign}\n style={{ width: column.width || 'auto' }}\n aria-sort={ariaSortValue}\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n column.sticky === 'left' &&\n 'sticky left-0 z-30 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-30 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n column.headerClass,\n )}\n >\n <TextContent\n role={column.sortable ? 'button' : undefined}\n tabIndex={column.sortable ? 0 : undefined}\n aria-label={column.sortable ? `Sort by ${column.label}` : undefined}\n className={buildClassName(\n 'group',\n column.sortable &&\n 'inline-flex items-center gap-2 cursor-pointer select-none focus:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 rounded',\n )}\n onClick={() => handleSort(column)}\n onKeyDown={(e) => {\n if (column.sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n handleSort(column)\n }\n }}\n >\n <TextContent className=\"shrink-0\">{column.label}</TextContent>\n {column.sortable ? getSortIcon(activeSorting[column.name]) : null}\n </TextContent>\n </TableHeaderCell>\n )\n })}\n {isInlineMode && (\n <TableHeaderCell\n align=\"right\"\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 text-right w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n {rowHoverActionHeader ?? ''}\n </TableHeaderCell>\n )}\n {isOverlayMode && (\n <TableHeaderCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className={buildClassName(\n 'sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 bg-gray-50 dark:bg-gray-800',\n stickyHeader && 'top-0',\n )}\n >\n {null}\n </TableHeaderCell>\n )}\n </TableHead>\n\n <TableBody loading={loading} colSize={colSize} rowSize={pagination?.limit || 5}>\n {!loading && sortedItems.length === 0 ? (\n <EmptyTableRow colSpan={colSize}>{emptyMessage}</EmptyTableRow>\n ) : (\n sortedItems.map((item, idx) => {\n const key = getKey(item, idx)\n const rowSelectable = !isRowSelectable || isRowSelectable(item)\n\n return (\n <TableRow\n key={key}\n className={buildClassName(\n 'group',\n onRowClick && 'cursor-pointer',\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n getRowClass(item, idx),\n )}\n onClick={onRowClick ? () => onRowClick(item, idx) : undefined}\n >\n {selectable && (\n <TableCell\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n >\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label=\"Select row\"\n checked={isSelected(key)}\n disabled={!rowSelectable}\n onChange={() => toggleRow(key)}\n />\n </span>\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.name}\n align={column.align}\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n column.sticky === 'left' &&\n 'sticky left-0 z-10 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-10 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n getCellClass(column, item),\n )}\n >\n {column.render\n ? column.render(item)\n : ((get(item, column.name) as any) ?? 'Not set')}\n </TableCell>\n ))}\n {isInlineMode && (\n <TableCell\n align=\"right\"\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n {isOverlayMode && (\n <TableCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className=\"sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right\"\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap',\n striped && idx % 2 === 1\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n </TableRow>\n )\n })\n )}\n </TableBody>\n\n {footerRow && <TableFoot>{footerRow}</TableFoot>}\n </Table>\n </div>\n\n {pagination && (\n <div\n className={buildClassName(\n stickyPagination && 'sticky bottom-0 z-20 bg-white dark:bg-gray-800',\n paginationClass,\n paginationContainerClass,\n )}\n >\n {renderPagination ? (\n renderPagination(pagination, setPagination)\n ) : (\n <Pagination\n {...pagination}\n {...paginationProps}\n className={buildClassName(\n 'rounded-t-none rounded-b-lg border border-[var(--ui-border)]',\n stickyPagination && 'sticky bottom-0 z-20 bg-white dark:bg-gray-800',\n paginationProps?.className,\n )}\n onChange={setPagination}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n\nDataTable.displayName = 'DataTable'\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.js","sources":["../../../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n EmptyTableRow,\n Table,\n TableBody,\n TableCell,\n TableFoot,\n TableHead,\n TableHeaderCell,\n TableRow,\n} from '../Table'\nimport { buildClassName } from '../../utils/build-classname'\nimport type {\n DataTableProps,\n DataTableColumn,\n DataTableDensity,\n Sorting,\n SortQuery,\n} from './DataTable.types'\nimport { TextContent } from '../TextContent'\nimport { Pagination } from '../Pagination'\nimport { Checkbox } from '../Checkbox'\nimport { Button } from '../Button'\nimport { get } from '../../utils/get'\nimport { updateSortQuery, useRowSelection } from './DataTable.utils'\nimport { getSortIcon } from './DataTable.icons'\n\nconst OVERFLOW_REGEX = /\\boverflow-(x-|y-)?(auto|hidden|scroll|visible|clip)\\b/\nconst NOOP = () => {}\n\nconst DENSITY_CELL_CLASS: Record<DataTableDensity, string> = {\n compact: 'px-2 py-1.5',\n default: '',\n spacious: 'px-4 py-4',\n}\n\nconst autoSortItems = <T,>(items: T[], column: DataTableColumn<T>, sort: Sorting): T[] => {\n const path = column.name\n return [...items].sort((a, b) => {\n const valueA = get(a as Record<string, any>, path)\n const valueB = get(b as Record<string, any>, path)\n\n if (column.type === 'number') {\n const nA = Number(valueA)\n const nB = Number(valueB)\n return sort === 'asc' || sort === '1' ? nA - nB : nB - nA\n }\n\n if (column.type === 'date') {\n const dA = new Date(valueA).getTime()\n const dB = new Date(valueB).getTime()\n return sort === 'asc' || sort === '1' ? dA - dB : dB - dA\n }\n\n const sA = String(valueA).toLowerCase()\n const sB = String(valueB).toLowerCase()\n if (sA < sB) return sort === 'asc' || sort === '1' ? -1 : 1\n if (sA > sB) return sort === 'asc' || sort === '1' ? 1 : -1\n return 0\n })\n}\n\nexport function DataTable<T extends Record<string, any> = Record<string, any>>({\n items,\n columns,\n sorting = {},\n onSort,\n loading,\n pagination,\n setPagination = NOOP,\n emptyMessage = 'No data found',\n containerClass = '',\n wrapperClass = '',\n tableClass = '',\n headClass = '',\n footerRow,\n rowKey = 'id',\n onRowClick,\n rowClass,\n density = 'default',\n striped = false,\n layout = 'auto',\n selectable = false,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n stickyHeader = true,\n stickyPagination = true,\n rowHoverActions,\n renderRowHoverActions,\n rowHoverActionHeader,\n rowHoverActionMode = 'overlay',\n rowHoverActionClass,\n paginationClass,\n paginationContainerClass,\n paginationProps,\n renderPagination,\n}: DataTableProps<T>) {\n const [internalSortingState, setInternalSortingState] = useState<SortQuery>({})\n\n const handleSort = useCallback(\n (column: DataTableColumn<T>) => {\n if (!column.sortable) return\n if (onSort) {\n onSort(column)\n } else {\n setInternalSortingState((prev) => updateSortQuery(prev, column.name, column.type))\n }\n },\n [onSort],\n )\n\n const activeSorting = useMemo(\n () => ({ ...sorting, ...internalSortingState }),\n [sorting, internalSortingState],\n )\n\n const sortedItems: T[] = useMemo(() => {\n if (onSort) return items\n const activeSortKey = Object.keys(activeSorting)[0]\n if (!activeSortKey) return items\n const column = columns.find((c) => c.name === activeSortKey)\n if (!column) return items\n return autoSortItems(items, column, activeSorting[activeSortKey])\n }, [items, columns, onSort, activeSorting])\n\n const getKey = useCallback(\n (item: T, idx: number): string | number =>\n typeof rowKey === 'function' ? rowKey(item) : ((item as any)[rowKey] ?? idx),\n [rowKey],\n )\n\n const getRowClass = useCallback(\n (item: T, idx: number): string =>\n typeof rowClass === 'function' ? rowClass(item, idx) : rowClass || '',\n [rowClass],\n )\n\n const getCellClass = useCallback(\n (column: DataTableColumn<T>, item: T): string =>\n typeof column.cellClass === 'function' ? column.cellClass(item) : column.cellClass || '',\n [],\n )\n\n const { isSelected, toggleRow, toggleAll, allSelected, someSelected } = useRowSelection({\n items: sortedItems,\n getKey,\n selectedRowKeys,\n defaultSelectedRowKeys,\n onSelectionChange,\n isRowSelectable,\n })\n\n const hasRowHoverActions = Boolean(rowHoverActions || renderRowHoverActions)\n const isInlineMode = hasRowHoverActions && rowHoverActionMode === 'inline'\n const isOverlayMode = hasRowHoverActions && rowHoverActionMode !== 'inline'\n\n const densityCellClass = DENSITY_CELL_CLASS[density]\n const colSize = columns.length + (selectable ? 1 : 0) + (isInlineMode ? 1 : 0)\n const wrapperHasOverflow = OVERFLOW_REGEX.test(wrapperClass)\n\n const renderActionsContent = useCallback(\n (item: T, idx: number) => {\n if (renderRowHoverActions) return renderRowHoverActions(item, idx)\n if (!rowHoverActions) return null\n return rowHoverActions(item, idx).map((act) => {\n const isDisabled = typeof act.disabled === 'function' ? act.disabled(item) : act.disabled\n const isIconOnly = Boolean(act.icon && !act.label)\n\n return (\n <Button\n key={act.id}\n size=\"xs\"\n theme={act.theme || 'secondary'}\n variant={act.variant || 'plain'}\n disabled={isDisabled}\n title={act.title || (typeof act.label === 'string' ? act.label : undefined)}\n className={buildClassName(\n isIconOnly\n ? 'p-1.5 rounded-full hover:bg-black/5 dark:hover:bg-white/10'\n : 'px-2 py-1',\n act.className,\n )}\n onClick={(e) => {\n e.stopPropagation()\n act.onClick(item, idx, e)\n }}\n >\n {act.icon && <span className=\"shrink-0\">{act.icon}</span>}\n {act.label && <span>{act.label}</span>}\n </Button>\n )\n })\n },\n [renderRowHoverActions, rowHoverActions],\n )\n\n return (\n <div className={buildClassName('w-full rounded-lg relative', containerClass)}>\n <div\n className={buildClassName(\n !wrapperHasOverflow && 'overflow-x-auto',\n 'rounded-lg border border-[var(--ui-border)]',\n wrapperClass,\n pagination && 'rounded-b-none border-b-0',\n )}\n >\n <Table\n className={buildClassName('relative w-full max-w-full h-fit', tableClass)}\n layout={layout}\n >\n <TableHead className={headClass}>\n {selectable && (\n <TableHeaderCell\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected\n }}\n onChange={toggleAll}\n />\n </TableHeaderCell>\n )}\n {columns.map((column) => {\n const sortState = activeSorting[column.name]\n const ariaSortValue = column.sortable\n ? sortState === 'asc' || sortState === '1'\n ? 'ascending'\n : sortState === 'desc' || sortState === '-1'\n ? 'descending'\n : 'none'\n : undefined\n\n return (\n <TableHeaderCell\n key={column.name}\n align={column.headerAlign}\n style={{ width: column.width || 'auto' }}\n aria-sort={ariaSortValue}\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n column.sticky === 'left' &&\n 'sticky left-0 z-30 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-30 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n column.headerClass,\n )}\n >\n <TextContent\n role={column.sortable ? 'button' : undefined}\n tabIndex={column.sortable ? 0 : undefined}\n aria-label={column.sortable ? `Sort by ${column.label}` : undefined}\n className={buildClassName(\n 'group',\n column.sortable &&\n 'inline-flex items-center gap-2 cursor-pointer select-none focus:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 rounded',\n )}\n onClick={() => handleSort(column)}\n onKeyDown={(e) => {\n if (column.sortable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n handleSort(column)\n }\n }}\n >\n <TextContent className=\"shrink-0\">{column.label}</TextContent>\n {column.sortable ? getSortIcon(activeSorting[column.name]) : null}\n </TextContent>\n </TableHeaderCell>\n )\n })}\n {isInlineMode && (\n <TableHeaderCell\n align=\"right\"\n className={buildClassName(\n 'bg-gray-50 dark:bg-gray-800 text-right w-px',\n densityCellClass,\n stickyHeader && 'sticky top-0 z-20 shadow-[0_1px_2px_rgba(0,0,0,0.06)]',\n )}\n >\n {rowHoverActionHeader ?? ''}\n </TableHeaderCell>\n )}\n {isOverlayMode && (\n <TableHeaderCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className={buildClassName(\n 'sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 bg-gray-50 dark:bg-gray-800',\n stickyHeader && 'top-0',\n )}\n >\n {null}\n </TableHeaderCell>\n )}\n </TableHead>\n\n <TableBody loading={loading} colSize={colSize} rowSize={pagination?.limit || 5}>\n {!loading && sortedItems.length === 0 ? (\n <EmptyTableRow colSpan={colSize}>{emptyMessage}</EmptyTableRow>\n ) : (\n sortedItems.map((item, idx) => {\n const key = getKey(item, idx)\n const rowSelectable = !isRowSelectable || isRowSelectable(item)\n\n return (\n <TableRow\n key={key}\n className={buildClassName(\n 'group',\n onRowClick && 'cursor-pointer',\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n getRowClass(item, idx),\n )}\n onClick={onRowClick ? () => onRowClick(item, idx) : undefined}\n >\n {selectable && (\n <TableCell\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n >\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n aria-label=\"Select row\"\n checked={isSelected(key)}\n disabled={!rowSelectable}\n onChange={() => toggleRow(key)}\n />\n </span>\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.name}\n align={column.align}\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n column.sticky === 'left' &&\n 'sticky left-0 z-10 shadow-[2px_0_6px_rgba(0,0,0,0.06)]',\n column.sticky === 'right' &&\n 'sticky right-0 z-10 shadow-[-2px_0_6px_rgba(0,0,0,0.06)]',\n getCellClass(column, item),\n )}\n >\n {column.render\n ? column.render(item)\n : ((get(item, column.name) as any) ?? 'Not set')}\n </TableCell>\n ))}\n {isInlineMode && (\n <TableCell\n align=\"right\"\n className={buildClassName(\n densityCellClass,\n striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n {isOverlayMode && (\n <TableCell\n align=\"right\"\n style={{ padding: 0, width: 0, minWidth: 0, maxWidth: 0 }}\n className=\"sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right\"\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={buildClassName(\n 'absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap',\n striped && idx % 2 === 1\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800',\n rowHoverActionClass,\n )}\n data-testid={`row-hover-actions-${key}`}\n >\n {renderActionsContent(item, idx)}\n </div>\n </TableCell>\n )}\n </TableRow>\n )\n })\n )}\n </TableBody>\n\n {footerRow && <TableFoot>{footerRow}</TableFoot>}\n </Table>\n </div>\n\n {pagination && (\n <div\n className={buildClassName(\n stickyPagination && 'sticky bottom-0 z-20',\n paginationContainerClass,\n )}\n >\n {renderPagination ? (\n renderPagination(pagination, setPagination)\n ) : (\n <Pagination\n {...pagination}\n {...paginationProps}\n className={buildClassName(\n 'rounded-t-none rounded-b-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800',\n paginationClass,\n paginationProps?.className,\n )}\n onChange={setPagination}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n\nDataTable.displayName = 'DataTable'\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ const COLUMN_GRID_MAP = {
|
|
|
14
14
|
const RadioGroup = (props) => {
|
|
15
15
|
const { name, variant = 'default', size = 'md', theme = 'primary', label, labelClass, labelWrapperClass, labelHint, containerClass, options, value, columns, disabled = false, row, error, showErrorMessage = true, onChange, required, 'aria-describedby': ariaDescribedBy, } = props;
|
|
16
16
|
const groupId = useId();
|
|
17
|
+
const groupName = name || groupId;
|
|
17
18
|
const items = useMemo(() => {
|
|
18
19
|
var _a;
|
|
19
20
|
return (_a = options === null || options === void 0 ? void 0 : options.map((option) => typeof option === 'string'
|
|
@@ -38,13 +39,14 @@ const RadioGroup = (props) => {
|
|
|
38
39
|
: 'flex flex-col gap-3'), children: items.map((item) => {
|
|
39
40
|
const isSelected = value === item.value;
|
|
40
41
|
const isItemDisabled = disabled || Boolean(item.disabled);
|
|
42
|
+
const radioItemId = `${groupName}-${item.value}`;
|
|
41
43
|
if (isCards) {
|
|
42
|
-
return (jsxs("label", { htmlFor:
|
|
44
|
+
return (jsxs("label", { htmlFor: radioItemId, className: buildClassName('relative flex items-start gap-3 p-4 rounded-xl border transition-all cursor-pointer select-none min-w-[200px] flex-1', 'focus-within:ring-2 focus-within:ring-[var(--ui-primary-ring)] focus-within:border-[var(--ui-primary)]', isSelected
|
|
43
45
|
? 'border-[var(--ui-primary)] bg-blue-50/40 dark:bg-blue-950/30 ring-2 ring-[var(--ui-primary-ring)]/30'
|
|
44
46
|
: 'border-[var(--ui-border)] bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600', isItemDisabled &&
|
|
45
|
-
'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50'), children: [jsx(Radio, { name:
|
|
47
|
+
'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50'), children: [jsx(Radio, { name: groupName, id: radioItemId, value: item.value, "aria-label": item.label, size: size, theme: theme, checked: isSelected, disabled: isItemDisabled, onChange: onChange, containerClass: "pt-0.5" }), jsxs("div", { className: "flex-1 min-w-0", children: [jsxs("div", { className: "flex items-center gap-2", children: [item.icon && (jsx("span", { className: "shrink-0 text-gray-500 dark:text-gray-400", children: item.icon })), jsx("span", { className: "text-sm font-semibold text-gray-900 dark:text-white truncate", children: item.label })] }), item.description && (jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400 font-normal leading-relaxed", children: item.description }))] })] }, item.value));
|
|
46
48
|
}
|
|
47
|
-
return (jsx(Radio, { name:
|
|
49
|
+
return (jsx(Radio, { name: groupName, id: radioItemId, label: item.label, description: item.description, value: item.value, size: size, theme: theme, checked: isSelected, disabled: isItemDisabled, onChange: onChange }, item.value));
|
|
48
50
|
}) }), showErrorMessage && error && (jsx("div", { className: "mt-1.5", children: jsx(TextContent, { error: true, small: true, id: errorId, children: error }) }))] }));
|
|
49
51
|
};
|
|
50
52
|
RadioGroup.displayName = 'RadioGroup';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroup.js","sources":["../../../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { useId, useMemo } from 'react'\nimport { Radio } from '../Radio'\nimport { Label } from '../Label'\nimport { buildClassName } from '../../utils/build-classname'\nimport { TextContent } from '../TextContent'\nimport type { RadioGroupProps } from './RadioGroup.types'\n\nconst COLUMN_GRID_MAP: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-4',\n}\n\nexport const RadioGroup: React.FC<RadioGroupProps> = (props) => {\n const {\n name,\n variant = 'default',\n size = 'md',\n theme = 'primary',\n label,\n labelClass,\n labelWrapperClass,\n labelHint,\n containerClass,\n options,\n value,\n columns,\n disabled = false,\n row,\n error,\n showErrorMessage = true,\n onChange,\n required,\n 'aria-describedby': ariaDescribedBy,\n } = props\n\n const groupId = useId()\n\n const items = useMemo(\n () =>\n options?.map((option) =>\n typeof option === 'string'\n ? {\n label: option,\n value: option,\n description: undefined,\n icon: undefined,\n disabled: undefined,\n }\n : option,\n ) ?? [],\n [options],\n )\n\n const isCards = variant === 'cards'\n const hasError = Boolean(error)\n const labelId = label ? `${groupId}-label` : undefined\n const errorId = groupId && hasError && showErrorMessage ? `${groupId}-error` : undefined\n const describedBy = [ariaDescribedBy, errorId].filter(Boolean).join(' ') || undefined\n\n return (\n <div\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n className={buildClassName(containerClass)}\n >\n {label && (\n <div\n className={buildClassName('flex items-center justify-between mb-3', labelWrapperClass)}\n >\n <Label id={labelId} className={labelClass} aria-required={required}>\n {label}\n </Label>\n {labelHint}\n </div>\n )}\n\n <div\n className={buildClassName(\n columns\n ? buildClassName('grid gap-3', COLUMN_GRID_MAP[columns])\n : row || isCards\n ? 'flex flex-wrap gap-3'\n : 'flex flex-col gap-3',\n )}\n >\n {items.map((item) => {\n const isSelected = value === item.value\n const isItemDisabled = disabled || Boolean(item.disabled)\n\n if (isCards) {\n return (\n <label\n key={item.value}\n htmlFor={
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sources":["../../../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { useId, useMemo } from 'react'\nimport { Radio } from '../Radio'\nimport { Label } from '../Label'\nimport { buildClassName } from '../../utils/build-classname'\nimport { TextContent } from '../TextContent'\nimport type { RadioGroupProps } from './RadioGroup.types'\n\nconst COLUMN_GRID_MAP: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-4',\n}\n\nexport const RadioGroup: React.FC<RadioGroupProps> = (props) => {\n const {\n name,\n variant = 'default',\n size = 'md',\n theme = 'primary',\n label,\n labelClass,\n labelWrapperClass,\n labelHint,\n containerClass,\n options,\n value,\n columns,\n disabled = false,\n row,\n error,\n showErrorMessage = true,\n onChange,\n required,\n 'aria-describedby': ariaDescribedBy,\n } = props\n\n const groupId = useId()\n const groupName = name || groupId\n\n const items = useMemo(\n () =>\n options?.map((option) =>\n typeof option === 'string'\n ? {\n label: option,\n value: option,\n description: undefined,\n icon: undefined,\n disabled: undefined,\n }\n : option,\n ) ?? [],\n [options],\n )\n\n const isCards = variant === 'cards'\n const hasError = Boolean(error)\n const labelId = label ? `${groupId}-label` : undefined\n const errorId = groupId && hasError && showErrorMessage ? `${groupId}-error` : undefined\n const describedBy = [ariaDescribedBy, errorId].filter(Boolean).join(' ') || undefined\n\n return (\n <div\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n className={buildClassName(containerClass)}\n >\n {label && (\n <div\n className={buildClassName('flex items-center justify-between mb-3', labelWrapperClass)}\n >\n <Label id={labelId} className={labelClass} aria-required={required}>\n {label}\n </Label>\n {labelHint}\n </div>\n )}\n\n <div\n className={buildClassName(\n columns\n ? buildClassName('grid gap-3', COLUMN_GRID_MAP[columns])\n : row || isCards\n ? 'flex flex-wrap gap-3'\n : 'flex flex-col gap-3',\n )}\n >\n {items.map((item) => {\n const isSelected = value === item.value\n const isItemDisabled = disabled || Boolean(item.disabled)\n const radioItemId = `${groupName}-${item.value}`\n\n if (isCards) {\n return (\n <label\n key={item.value}\n htmlFor={radioItemId}\n className={buildClassName(\n 'relative flex items-start gap-3 p-4 rounded-xl border transition-all cursor-pointer select-none min-w-[200px] flex-1',\n 'focus-within:ring-2 focus-within:ring-[var(--ui-primary-ring)] focus-within:border-[var(--ui-primary)]',\n isSelected\n ? 'border-[var(--ui-primary)] bg-blue-50/40 dark:bg-blue-950/30 ring-2 ring-[var(--ui-primary-ring)]/30'\n : 'border-[var(--ui-border)] bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600',\n isItemDisabled &&\n 'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50',\n )}\n >\n <Radio\n name={groupName}\n id={radioItemId}\n value={item.value}\n aria-label={item.label}\n size={size}\n theme={theme}\n checked={isSelected}\n disabled={isItemDisabled}\n onChange={onChange}\n containerClass=\"pt-0.5\"\n />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {item.icon && (\n <span className=\"shrink-0 text-gray-500 dark:text-gray-400\">{item.icon}</span>\n )}\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white truncate\">\n {item.label}\n </span>\n </div>\n {item.description && (\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400 font-normal leading-relaxed\">\n {item.description}\n </p>\n )}\n </div>\n </label>\n )\n }\n\n return (\n <Radio\n key={item.value}\n name={groupName}\n id={radioItemId}\n label={item.label}\n description={item.description}\n value={item.value}\n size={size}\n theme={theme}\n checked={isSelected}\n disabled={isItemDisabled}\n onChange={onChange}\n />\n )\n })}\n </div>\n\n {showErrorMessage && error && (\n <div className=\"mt-1.5\">\n <TextContent error small id={errorId}>\n {error}\n </TextContent>\n </div>\n )}\n </div>\n )\n}\n\nRadioGroup.displayName = 'RadioGroup'\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -1526,7 +1526,7 @@ function DataTable({ items, columns, sorting = {}, onSort, loading, pagination,
|
|
|
1526
1526
|
}), isInlineMode && (jsxRuntime.jsx(TableCell, { align: "right", className: buildClassName(densityCellClass, striped && idx % 2 === 1 && 'bg-gray-50 dark:bg-gray-800/40'), onClick: (e) => e.stopPropagation(), children: jsxRuntime.jsx("div", { className: buildClassName('opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1.5', rowHoverActionClass), "data-testid": `row-hover-actions-${key}`, children: renderActionsContent(item, idx) }) })), isOverlayMode && (jsxRuntime.jsx(TableCell, { align: "right", style: { padding: 0, width: 0, minWidth: 0, maxWidth: 0 }, className: "sticky right-0 z-20 !p-0 !pr-0 !pl-0 !py-0 w-0 max-w-0 min-w-0 border-0 overflow-visible text-right", onClick: (e) => e.stopPropagation(), children: jsxRuntime.jsx("div", { className: buildClassName('absolute right-0 top-0 bottom-0 h-full opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity duration-150 flex items-center justify-end gap-1 px-3 z-30 pointer-events-none group-hover:pointer-events-auto whitespace-nowrap', striped && idx % 2 === 1
|
|
1527
1527
|
? 'bg-gray-100 dark:bg-gray-800'
|
|
1528
1528
|
: 'bg-white group-hover:bg-gray-50 dark:bg-gray-900 dark:group-hover:bg-gray-800', rowHoverActionClass), "data-testid": `row-hover-actions-${key}`, children: renderActionsContent(item, idx) }) }))] }, key));
|
|
1529
|
-
})) }), footerRow && jsxRuntime.jsx(TableFoot, { children: footerRow })] }) }), pagination && (jsxRuntime.jsx("div", { className: buildClassName(stickyPagination && 'sticky bottom-0 z-20
|
|
1529
|
+
})) }), footerRow && jsxRuntime.jsx(TableFoot, { children: footerRow })] }) }), pagination && (jsxRuntime.jsx("div", { className: buildClassName(stickyPagination && 'sticky bottom-0 z-20', paginationContainerClass), children: renderPagination ? (renderPagination(pagination, setPagination)) : (jsxRuntime.jsx(Pagination, { ...pagination, ...paginationProps, className: buildClassName('rounded-t-none rounded-b-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800', paginationClass, paginationProps === null || paginationProps === void 0 ? void 0 : paginationProps.className), onChange: setPagination })) }))] }));
|
|
1530
1530
|
}
|
|
1531
1531
|
DataTable.displayName = 'DataTable';
|
|
1532
1532
|
|
|
@@ -2446,6 +2446,7 @@ const COLUMN_GRID_MAP = {
|
|
|
2446
2446
|
const RadioGroup = (props) => {
|
|
2447
2447
|
const { name, variant = 'default', size = 'md', theme = 'primary', label, labelClass, labelWrapperClass, labelHint, containerClass, options, value, columns, disabled = false, row, error, showErrorMessage = true, onChange, required, 'aria-describedby': ariaDescribedBy, } = props;
|
|
2448
2448
|
const groupId = React.useId();
|
|
2449
|
+
const groupName = name || groupId;
|
|
2449
2450
|
const items = React.useMemo(() => {
|
|
2450
2451
|
var _a;
|
|
2451
2452
|
return (_a = options === null || options === void 0 ? void 0 : options.map((option) => typeof option === 'string'
|
|
@@ -2470,13 +2471,14 @@ const RadioGroup = (props) => {
|
|
|
2470
2471
|
: 'flex flex-col gap-3'), children: items.map((item) => {
|
|
2471
2472
|
const isSelected = value === item.value;
|
|
2472
2473
|
const isItemDisabled = disabled || Boolean(item.disabled);
|
|
2474
|
+
const radioItemId = `${groupName}-${item.value}`;
|
|
2473
2475
|
if (isCards) {
|
|
2474
|
-
return (jsxRuntime.jsxs("label", { htmlFor:
|
|
2476
|
+
return (jsxRuntime.jsxs("label", { htmlFor: radioItemId, className: buildClassName('relative flex items-start gap-3 p-4 rounded-xl border transition-all cursor-pointer select-none min-w-[200px] flex-1', 'focus-within:ring-2 focus-within:ring-[var(--ui-primary-ring)] focus-within:border-[var(--ui-primary)]', isSelected
|
|
2475
2477
|
? 'border-[var(--ui-primary)] bg-blue-50/40 dark:bg-blue-950/30 ring-2 ring-[var(--ui-primary-ring)]/30'
|
|
2476
2478
|
: 'border-[var(--ui-border)] bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600', isItemDisabled &&
|
|
2477
|
-
'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50'), children: [jsxRuntime.jsx(Radio, { name:
|
|
2479
|
+
'opacity-50 cursor-not-allowed pointer-events-none bg-gray-50 dark:bg-gray-800/50'), children: [jsxRuntime.jsx(Radio, { name: groupName, id: radioItemId, value: item.value, "aria-label": item.label, size: size, theme: theme, checked: isSelected, disabled: isItemDisabled, onChange: onChange, containerClass: "pt-0.5" }), jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [item.icon && (jsxRuntime.jsx("span", { className: "shrink-0 text-gray-500 dark:text-gray-400", children: item.icon })), jsxRuntime.jsx("span", { className: "text-sm font-semibold text-gray-900 dark:text-white truncate", children: item.label })] }), item.description && (jsxRuntime.jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400 font-normal leading-relaxed", children: item.description }))] })] }, item.value));
|
|
2478
2480
|
}
|
|
2479
|
-
return (jsxRuntime.jsx(Radio, { name:
|
|
2481
|
+
return (jsxRuntime.jsx(Radio, { name: groupName, id: radioItemId, label: item.label, description: item.description, value: item.value, size: size, theme: theme, checked: isSelected, disabled: isItemDisabled, onChange: onChange }, item.value));
|
|
2480
2482
|
}) }), showErrorMessage && error && (jsxRuntime.jsx("div", { className: "mt-1.5", children: jsxRuntime.jsx(TextContent, { error: true, small: true, id: errorId, children: error }) }))] }));
|
|
2481
2483
|
};
|
|
2482
2484
|
RadioGroup.displayName = 'RadioGroup';
|