@wallarm-org/design-system 0.19.0 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Drawer/DrawerHeader.js +1 -1
- package/dist/components/Table/TableBody/TableBodyCell.js +23 -8
- package/dist/components/Table/TableContext/TableProvider.js +19 -6
- package/dist/components/Table/TableContext/types.d.ts +8 -4
- package/dist/components/Table/TablePreviewDrawer.js +14 -10
- package/dist/components/Table/TableRow.js +2 -2
- package/dist/components/Table/hooks/usePreviewCell.d.ts +3 -1
- package/dist/components/Table/hooks/usePreviewCell.js +9 -8
- package/dist/components/Table/index.d.ts +1 -1
- package/dist/components/Table/mocks.d.ts +9 -1
- package/dist/components/Table/mocks.js +19 -3
- package/dist/components/Table/types.d.ts +14 -5
- package/dist/metadata/components.json +7 -19
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@ const DrawerHeader = ({ children, ref })=>{
|
|
|
8
8
|
ref: ref,
|
|
9
9
|
"data-testid": testId,
|
|
10
10
|
"data-slot": "drawer-header",
|
|
11
|
-
className: cn('relative shrink-0 w-full', 'bg-bg-surface-2', 'flex items-
|
|
11
|
+
className: cn('relative shrink-0 w-full', 'bg-bg-surface-2', 'flex items-start justify-between gap-12', 'pt-16 pb-12 pl-24 pr-16', 'rounded-t-12', 'outline-none'),
|
|
12
12
|
children: [
|
|
13
13
|
children,
|
|
14
14
|
/*#__PURE__*/ jsx(DrawerClose, {})
|
|
@@ -2,6 +2,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { flexRender } from "@tanstack/react-table";
|
|
3
3
|
import { cn } from "../../../utils/cn.js";
|
|
4
4
|
import { useTestId } from "../../../utils/testId.js";
|
|
5
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "../../Tooltip/index.js";
|
|
5
6
|
import { usePreviewCell } from "../hooks/index.js";
|
|
6
7
|
import { TABLE_EXPAND_COLUMN_ID, getAlignClass, getExpandBorderClass, getPinningStyles, isLastPinnedLeft, useColumnDnd } from "../lib/index.js";
|
|
7
8
|
import { Td } from "../primitives/index.js";
|
|
@@ -19,18 +20,32 @@ const TableBodyCell = ({ cell, colSpan, className, disablePinnedShadow })=>{
|
|
|
19
20
|
const { canDnd, setNodeRef, dndStyle } = useColumnDnd(column);
|
|
20
21
|
const pinningStyles = getPinningStyles(column);
|
|
21
22
|
const lastLeft = isLastPinnedLeft(column, allLeafColumns, column.id);
|
|
22
|
-
const { isMasterTrigger, isButtonTrigger, isActive, togglePreview } = usePreviewCell(column.id, cell.row.id);
|
|
23
|
+
const { isMasterTrigger, isButtonTrigger, isActive, togglePreview, tooltipText } = usePreviewCell(column.id, cell.row.id);
|
|
23
24
|
const isCut = column.id === masterColumnId || meta?.resizeType === 'cut';
|
|
24
25
|
const content = flexRender(cell.column.columnDef.cell, cell.getContext());
|
|
25
26
|
const hasActions = isButtonTrigger || !!meta?.renderPreviewAction || !!meta?.renderMenuAction;
|
|
26
27
|
const renderContent = ()=>{
|
|
28
|
+
const wrappedContent = tooltipText ? /*#__PURE__*/ jsxs(Tooltip, {
|
|
29
|
+
children: [
|
|
30
|
+
/*#__PURE__*/ jsx(TooltipTrigger, {
|
|
31
|
+
asChild: true,
|
|
32
|
+
children: /*#__PURE__*/ jsx("span", {
|
|
33
|
+
className: "min-w-0 [&>*]:block [&>*]:truncate",
|
|
34
|
+
children: content
|
|
35
|
+
})
|
|
36
|
+
}),
|
|
37
|
+
/*#__PURE__*/ jsx(TooltipContent, {
|
|
38
|
+
children: tooltipText
|
|
39
|
+
})
|
|
40
|
+
]
|
|
41
|
+
}) : /*#__PURE__*/ jsx("span", {
|
|
42
|
+
className: "min-w-0 [&>*]:block [&>*]:truncate",
|
|
43
|
+
children: content
|
|
44
|
+
});
|
|
27
45
|
if (isCut && hasActions) return /*#__PURE__*/ jsxs("div", {
|
|
28
46
|
className: "flex items-center justify-between gap-2",
|
|
29
47
|
children: [
|
|
30
|
-
|
|
31
|
-
className: "min-w-0 [&>*]:block [&>*]:truncate",
|
|
32
|
-
children: content
|
|
33
|
-
}),
|
|
48
|
+
wrappedContent,
|
|
34
49
|
/*#__PURE__*/ jsxs(TableMasterCellActions, {
|
|
35
50
|
children: [
|
|
36
51
|
isButtonTrigger && /*#__PURE__*/ jsx(TablePreviewToggle, {
|
|
@@ -48,13 +63,13 @@ const TableBodyCell = ({ cell, colSpan, className, disablePinnedShadow })=>{
|
|
|
48
63
|
style: {
|
|
49
64
|
minWidth: column.columnDef.size
|
|
50
65
|
},
|
|
51
|
-
children: content
|
|
66
|
+
children: tooltipText ? wrappedContent : content
|
|
52
67
|
});
|
|
53
|
-
return content;
|
|
68
|
+
return tooltipText ? wrappedContent : content;
|
|
54
69
|
};
|
|
55
70
|
return /*#__PURE__*/ jsx(Td, {
|
|
56
71
|
"data-testid": testId,
|
|
57
|
-
className: cn(getAlignClass(meta), getExpandBorderClass(isExpandColumn, cell.row.depth), isCut && 'pr-0', isMasterTrigger && 'cursor-pointer', meta?.cellClassName, className),
|
|
72
|
+
className: cn(getAlignClass(meta), getExpandBorderClass(isExpandColumn, cell.row.depth), isCut && 'pr-0', (isMasterTrigger || tooltipText) && 'cursor-pointer', meta?.cellClassName, className),
|
|
58
73
|
pinned: 'left' === isPinned,
|
|
59
74
|
lastPinnedLeft: disablePinnedShadow ? false : lastLeft,
|
|
60
75
|
expanded: isExpandedToggle,
|
|
@@ -8,7 +8,13 @@ import { useTableState } from "../hooks/index.js";
|
|
|
8
8
|
import { TABLE_EXPAND_COLUMN_ID, TABLE_MIN_COLUMN_WIDTH, TABLE_SELECT_COLUMN_ID, TABLE_SKELETON_ROWS, TABLE_VIRTUALIZATION_OVERSCAN, createExpandColumn, createSelectionColumn } from "../lib/index.js";
|
|
9
9
|
import { TableContext } from "./TableContext.js";
|
|
10
10
|
const TableProvider = (props)=>{
|
|
11
|
-
const { data, columns, isLoading = false, skeletonCount = TABLE_SKELETON_ROWS, children, getRowId, sorting: sortingProp, onSortingChange, rowSelection: rowSelectionProp, onRowSelectionChange, columnSizing: columnSizingProp, onColumnSizingChange, columnPinning: columnPinningProp, onColumnPinningChange, columnOrder: columnOrderProp, onColumnOrderChange, grouping: groupingProp, onGroupingChange, expanded: expandedProp, onExpandedChange, renderGroupRow, getSubRows, renderExpandedRow, columnVisibility: columnVisibilityProp, onColumnVisibilityChange, defaultColumnVisibility, defaultColumnOrder, virtualized, estimateRowHeight, overscan = TABLE_VIRTUALIZATION_OVERSCAN, onEndReached, onEndReachedThreshold,
|
|
11
|
+
const { data, columns, isLoading = false, skeletonCount = TABLE_SKELETON_ROWS, children, getRowId, sorting: sortingProp, onSortingChange, rowSelection: rowSelectionProp, onRowSelectionChange, columnSizing: columnSizingProp, onColumnSizingChange, columnPinning: columnPinningProp, onColumnPinningChange, columnOrder: columnOrderProp, onColumnOrderChange, grouping: groupingProp, onGroupingChange, expanded: expandedProp, onExpandedChange, renderGroupRow, getSubRows, renderExpandedRow, columnVisibility: columnVisibilityProp, onColumnVisibilityChange, defaultColumnVisibility, defaultColumnOrder, virtualized, estimateRowHeight, overscan = TABLE_VIRTUALIZATION_OVERSCAN, onEndReached, onEndReachedThreshold, preview } = props;
|
|
12
|
+
const renderPreviewHeader = preview?.renderHeader;
|
|
13
|
+
const renderPreviewContent = preview?.renderContent;
|
|
14
|
+
const previewTrigger = preview?.trigger ?? 'master';
|
|
15
|
+
const previewTooltipText = preview?.tooltipText ?? 'Open preview';
|
|
16
|
+
const previewRowIdProp = preview?.rowId;
|
|
17
|
+
const onPreviewRowChange = preview?.onRowChange;
|
|
12
18
|
const sortingEnabled = !!onSortingChange;
|
|
13
19
|
const selectionEnabled = !!onRowSelectionChange;
|
|
14
20
|
const resizingEnabled = !!onColumnSizingChange;
|
|
@@ -220,10 +226,14 @@ const TableProvider = (props)=>{
|
|
|
220
226
|
containerRef,
|
|
221
227
|
onEndReached,
|
|
222
228
|
onEndReachedThreshold,
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
229
|
+
preview: {
|
|
230
|
+
rowId: previewRowId,
|
|
231
|
+
setRowId: setPreviewRowId,
|
|
232
|
+
renderHeader: renderPreviewHeader,
|
|
233
|
+
renderContent: renderPreviewContent,
|
|
234
|
+
trigger: previewTrigger,
|
|
235
|
+
tooltipText: previewTooltipText
|
|
236
|
+
}
|
|
227
237
|
}), [
|
|
228
238
|
table,
|
|
229
239
|
isLoading,
|
|
@@ -249,8 +259,11 @@ const TableProvider = (props)=>{
|
|
|
249
259
|
onEndReached,
|
|
250
260
|
onEndReachedThreshold,
|
|
251
261
|
previewRowId,
|
|
262
|
+
setPreviewRowId,
|
|
263
|
+
renderPreviewHeader,
|
|
252
264
|
renderPreviewContent,
|
|
253
|
-
previewTrigger
|
|
265
|
+
previewTrigger,
|
|
266
|
+
previewTooltipText
|
|
254
267
|
]);
|
|
255
268
|
useEffect(()=>{
|
|
256
269
|
if (!selectionEnabled) return;
|
|
@@ -28,10 +28,14 @@ export interface TableContextValue<T> {
|
|
|
28
28
|
containerRef: RefObject<HTMLDivElement | null>;
|
|
29
29
|
onEndReached?: () => void;
|
|
30
30
|
onEndReachedThreshold?: number;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
preview: {
|
|
32
|
+
rowId: string | null;
|
|
33
|
+
setRowId: (id: string | null) => void;
|
|
34
|
+
renderHeader?: (row: Row<T>) => ReactNode;
|
|
35
|
+
renderContent?: (row: Row<T>) => ReactNode;
|
|
36
|
+
trigger: 'master' | 'button';
|
|
37
|
+
tooltipText: string;
|
|
38
|
+
};
|
|
35
39
|
}
|
|
36
40
|
export interface TableProviderProps<T> extends Omit<TableProps<T>, 'children' | 'aria-label'> {
|
|
37
41
|
children: ReactNode;
|
|
@@ -3,17 +3,21 @@ import { useRef } from "react";
|
|
|
3
3
|
import { Drawer, DrawerBody, DrawerContent, DrawerHeader } from "../Drawer/index.js";
|
|
4
4
|
import { useTableContext } from "./TableContext/index.js";
|
|
5
5
|
const TablePreviewDrawer = ()=>{
|
|
6
|
-
const { table,
|
|
7
|
-
const row =
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
6
|
+
const { table, preview: previewCtx } = useTableContext();
|
|
7
|
+
const row = previewCtx.rowId ? table.getRowModel().rowsById[previewCtx.rowId] : void 0;
|
|
8
|
+
const header = row && previewCtx.renderHeader ? previewCtx.renderHeader(row) : void 0;
|
|
9
|
+
const content = row && previewCtx.renderContent ? previewCtx.renderContent(row) : void 0;
|
|
10
|
+
const lastHeaderRef = useRef(null);
|
|
11
|
+
const lastContentRef = useRef(null);
|
|
12
|
+
if (header) lastHeaderRef.current = header;
|
|
13
|
+
if (content) lastContentRef.current = content;
|
|
14
|
+
const displayHeader = header ?? lastHeaderRef.current;
|
|
15
|
+
const displayContent = content ?? lastContentRef.current;
|
|
16
|
+
if (!previewCtx.renderContent) return null;
|
|
13
17
|
return /*#__PURE__*/ jsx(Drawer, {
|
|
14
18
|
open: !!row,
|
|
15
19
|
onOpenChange: (open)=>{
|
|
16
|
-
if (!open)
|
|
20
|
+
if (!open) previewCtx.setRowId(null);
|
|
17
21
|
},
|
|
18
22
|
modal: false,
|
|
19
23
|
overlay: false,
|
|
@@ -21,11 +25,11 @@ const TablePreviewDrawer = ()=>{
|
|
|
21
25
|
width: 960,
|
|
22
26
|
children: /*#__PURE__*/ jsxs(DrawerContent, {
|
|
23
27
|
children: [
|
|
24
|
-
/*#__PURE__*/ jsx(DrawerHeader, {
|
|
28
|
+
displayHeader ?? /*#__PURE__*/ jsx(DrawerHeader, {
|
|
25
29
|
children: /*#__PURE__*/ jsx("span", {})
|
|
26
30
|
}),
|
|
27
31
|
/*#__PURE__*/ jsx(DrawerBody, {
|
|
28
|
-
children:
|
|
32
|
+
children: displayContent
|
|
29
33
|
})
|
|
30
34
|
]
|
|
31
35
|
})
|
|
@@ -12,11 +12,11 @@ const SYSTEM_COLUMN_IDS = new Set([
|
|
|
12
12
|
TABLE_SELECT_COLUMN_ID
|
|
13
13
|
]);
|
|
14
14
|
const TableRowInner = ({ row, ref, 'data-index': dataIndex })=>{
|
|
15
|
-
const { expandingEnabled,
|
|
15
|
+
const { expandingEnabled, preview } = useTableContext();
|
|
16
16
|
const testId = useTestId('row');
|
|
17
17
|
const isGroupParent = row.subRows.length > 0;
|
|
18
18
|
const isSelected = isGroupParent ? row.getIsAllSubRowsSelected() : row.getIsSelected();
|
|
19
|
-
const isPreviewActive =
|
|
19
|
+
const isPreviewActive = preview.rowId === row.id;
|
|
20
20
|
if (isGroupParent) {
|
|
21
21
|
const cells = row.getVisibleCells();
|
|
22
22
|
const systemCells = cells.filter((c)=>SYSTEM_COLUMN_IDS.has(c.column.id));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Encapsulates preview drawer logic for a body cell.
|
|
3
|
-
* Returns flags and a click handler based on `
|
|
3
|
+
* Returns flags and a click handler based on `preview.trigger` mode.
|
|
4
4
|
*/
|
|
5
5
|
export declare const usePreviewCell: <T>(columnId: string, rowId: string) => {
|
|
6
6
|
/** Preview opens by clicking the master cell */
|
|
@@ -11,4 +11,6 @@ export declare const usePreviewCell: <T>(columnId: string, rowId: string) => {
|
|
|
11
11
|
isActive: boolean;
|
|
12
12
|
/** Toggle preview for this row (open/close) */
|
|
13
13
|
togglePreview: () => void;
|
|
14
|
+
/** Tooltip text for master cell hover */
|
|
15
|
+
tooltipText: string | undefined;
|
|
14
16
|
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
2
|
import { useTableContext } from "../TableContext/index.js";
|
|
3
3
|
const usePreviewCell = (columnId, rowId)=>{
|
|
4
|
-
const { masterColumnId,
|
|
4
|
+
const { masterColumnId, preview } = useTableContext();
|
|
5
5
|
const isMasterColumn = columnId === masterColumnId;
|
|
6
|
-
const hasPreview = isMasterColumn && !!
|
|
7
|
-
const isMasterTrigger = hasPreview && 'master' ===
|
|
8
|
-
const isButtonTrigger = hasPreview && 'button' ===
|
|
9
|
-
const isActive =
|
|
6
|
+
const hasPreview = isMasterColumn && !!preview.renderContent;
|
|
7
|
+
const isMasterTrigger = hasPreview && 'master' === preview.trigger;
|
|
8
|
+
const isButtonTrigger = hasPreview && 'button' === preview.trigger;
|
|
9
|
+
const isActive = preview.rowId === rowId;
|
|
10
10
|
const togglePreview = useCallback(()=>{
|
|
11
|
-
|
|
11
|
+
preview.setRowId(isActive ? null : rowId);
|
|
12
12
|
}, [
|
|
13
|
-
|
|
13
|
+
preview.setRowId,
|
|
14
14
|
isActive,
|
|
15
15
|
rowId
|
|
16
16
|
]);
|
|
@@ -18,7 +18,8 @@ const usePreviewCell = (columnId, rowId)=>{
|
|
|
18
18
|
isMasterTrigger,
|
|
19
19
|
isButtonTrigger,
|
|
20
20
|
isActive,
|
|
21
|
-
togglePreview
|
|
21
|
+
togglePreview,
|
|
22
|
+
tooltipText: hasPreview ? preview.tooltipText : void 0
|
|
22
23
|
};
|
|
23
24
|
};
|
|
24
25
|
export { usePreviewCell };
|
|
@@ -5,4 +5,4 @@ export { TableActionBar } from './TableActionBar';
|
|
|
5
5
|
export { TableEmptyState } from './TableEmptyState';
|
|
6
6
|
export { TablePreviewToggle, type TablePreviewToggleProps } from './TablePreviewToggle';
|
|
7
7
|
export { TableSettingsMenu } from './TableSettingsMenu';
|
|
8
|
-
export type { TableAccessorColumnDef, TableCellContext, TableColumnBase, TableColumnDef, TableColumnMeta, TableColumnPinningState, TableColumnSizingState, TableDisplayColumnDef, TableExpandedState, TableGroupingState, TableOnChangeFn, TableProps, TableRow, TableRowSelectionState, TableSortingState, TableUpdater, TableVirtualized, TableVisibilityState, } from './types';
|
|
8
|
+
export type { TableAccessorColumnDef, TableCellContext, TableColumnBase, TableColumnDef, TableColumnMeta, TableColumnPinningState, TableColumnSizingState, TableDisplayColumnDef, TableExpandedState, TableGroupingState, TableOnChangeFn, TablePreview, TableProps, TableRow, TableRowSelectionState, TableSortingState, TableUpdater, TableVirtualized, TableVisibilityState, } from './types';
|
|
@@ -40,10 +40,18 @@ export declare const headerColumnHelper: import(".").TableColumnHelper<SecurityH
|
|
|
40
40
|
export declare const headerColumns: TableColumnDef<SecurityHeaderEntry>[];
|
|
41
41
|
export declare const headerColumnIds: string[];
|
|
42
42
|
export declare const createLargeGroupedData: (groupCount?: number, childrenPerGroup?: number) => SecurityHeaderEntry[];
|
|
43
|
-
/** Shared preview drawer
|
|
43
|
+
/** Shared preview drawer header for security events */
|
|
44
|
+
export declare const renderSecurityPreviewHeader: (row: {
|
|
45
|
+
original: SecurityEvent;
|
|
46
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
47
|
+
/** Preview content for use with header (objectName shown in header) */
|
|
44
48
|
export declare const renderSecurityPreview: (row: {
|
|
45
49
|
original: SecurityEvent;
|
|
46
50
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
/** Preview content for use without header (includes objectName) */
|
|
52
|
+
export declare const renderSecurityPreviewWithTitle: (row: {
|
|
53
|
+
original: SecurityEvent;
|
|
54
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
47
55
|
/** Duplicate securityEvents N times with unique IDs */
|
|
48
56
|
export declare const multiplySecurityEvents: (times?: number) => SecurityEvent[];
|
|
49
57
|
export declare const createLargeSecurityEvents: (count?: number) => SecurityEvent[];
|
|
@@ -4,6 +4,7 @@ import { Check, Copy, Filter, FilterX } from "../../icons/index.js";
|
|
|
4
4
|
import { abbreviateNumber } from "../../utils/abbreviateNumber.js";
|
|
5
5
|
import { Badge } from "../Badge/index.js";
|
|
6
6
|
import { InlineCodeSnippet } from "../CodeSnippet/index.js";
|
|
7
|
+
import { DrawerHeader } from "../Drawer/index.js";
|
|
7
8
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuContextTrigger, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemDescription, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator } from "../DropdownMenu/index.js";
|
|
8
9
|
import { FormatDateTime } from "../FormatDateTime/index.js";
|
|
9
10
|
import { Ip, IpAddress, IpCountry, IpProvider, sourceLabels } from "../Ip/index.js";
|
|
@@ -630,10 +631,17 @@ const createLargeGroupedData = (groupCount = 12, childrenPerGroup = 50)=>Array.f
|
|
|
630
631
|
}))
|
|
631
632
|
};
|
|
632
633
|
});
|
|
633
|
-
const
|
|
634
|
+
const renderSecurityPreviewHeader = (row)=>/*#__PURE__*/ jsx(DrawerHeader, {
|
|
635
|
+
children: /*#__PURE__*/ jsx(Text, {
|
|
636
|
+
size: "lg",
|
|
637
|
+
weight: "medium",
|
|
638
|
+
children: row.original.objectName
|
|
639
|
+
})
|
|
640
|
+
});
|
|
641
|
+
const SecurityPreviewContent = ({ row, showTitle })=>/*#__PURE__*/ jsxs(VStack, {
|
|
634
642
|
gap: 16,
|
|
635
643
|
children: [
|
|
636
|
-
/*#__PURE__*/ jsx(Text, {
|
|
644
|
+
showTitle && /*#__PURE__*/ jsx(Text, {
|
|
637
645
|
size: "lg",
|
|
638
646
|
weight: "medium",
|
|
639
647
|
children: row.original.objectName
|
|
@@ -696,6 +704,14 @@ const renderSecurityPreview = (row)=>/*#__PURE__*/ jsxs(VStack, {
|
|
|
696
704
|
})
|
|
697
705
|
]
|
|
698
706
|
});
|
|
707
|
+
SecurityPreviewContent.displayName = 'SecurityPreviewContent';
|
|
708
|
+
const renderSecurityPreview = (row)=>/*#__PURE__*/ jsx(SecurityPreviewContent, {
|
|
709
|
+
row: row
|
|
710
|
+
});
|
|
711
|
+
const renderSecurityPreviewWithTitle = (row)=>/*#__PURE__*/ jsx(SecurityPreviewContent, {
|
|
712
|
+
row: row,
|
|
713
|
+
showTitle: true
|
|
714
|
+
});
|
|
699
715
|
const multiplySecurityEvents = (times = 4)=>Array.from({
|
|
700
716
|
length: times
|
|
701
717
|
}, (_, batch)=>securityEvents.map((row)=>({
|
|
@@ -951,4 +967,4 @@ const useInfiniteData = ()=>{
|
|
|
951
967
|
fetchNextPage
|
|
952
968
|
};
|
|
953
969
|
};
|
|
954
|
-
export { METHOD_COLORS, createLargeGroupedData, createLargeSecurityEvents, fullFeaturedColumns, groupedHeaderData, headerColumnHelper, headerColumnIds, headerColumns, multiplySecurityEvents, renderSecurityPreview, securityColumnHelper, securityColumnIds, securityColumns, securityEvents, useInfiniteData };
|
|
970
|
+
export { METHOD_COLORS, createLargeGroupedData, createLargeSecurityEvents, fullFeaturedColumns, groupedHeaderData, headerColumnHelper, headerColumnIds, headerColumns, multiplySecurityEvents, renderSecurityPreview, renderSecurityPreviewHeader, renderSecurityPreviewWithTitle, securityColumnHelper, securityColumnIds, securityColumns, securityEvents, useInfiniteData };
|
|
@@ -164,14 +164,23 @@ export interface TableProps<T> extends TestableProps {
|
|
|
164
164
|
onEndReached?: () => void;
|
|
165
165
|
/** Distance from the bottom (in px) to trigger onEndReached (default: 200) */
|
|
166
166
|
onEndReachedThreshold?: number;
|
|
167
|
-
/**
|
|
168
|
-
|
|
167
|
+
/** Preview drawer configuration */
|
|
168
|
+
preview?: TablePreview<T>;
|
|
169
|
+
}
|
|
170
|
+
/** Preview drawer configuration */
|
|
171
|
+
export interface TablePreview<T> {
|
|
172
|
+
/** Render drawer header for a row */
|
|
173
|
+
renderHeader?: (row: TableRow<T>) => ReactNode;
|
|
174
|
+
/** Render drawer content for a row */
|
|
175
|
+
renderContent: (row: TableRow<T>) => ReactNode;
|
|
169
176
|
/** How the preview drawer is triggered:
|
|
170
177
|
* - `'master'` — clicking the master cell toggles the drawer (default)
|
|
171
178
|
* - `'button'` — a toggle button appears in master cell actions on hover */
|
|
172
|
-
|
|
179
|
+
trigger?: 'master' | 'button';
|
|
180
|
+
/** Tooltip text on master cell hover (default: 'Open preview') */
|
|
181
|
+
tooltipText?: string;
|
|
173
182
|
/** Controlled preview row ID. Pass `null` to close. */
|
|
174
|
-
|
|
183
|
+
rowId?: string | null;
|
|
175
184
|
/** Callback when preview row changes (open/close/swap). */
|
|
176
|
-
|
|
185
|
+
onRowChange?: (rowId: string | null) => void;
|
|
177
186
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
3
|
-
"generatedAt": "2026-04-
|
|
2
|
+
"version": "0.19.0",
|
|
3
|
+
"generatedAt": "2026-04-03T12:16:12.332Z",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
6
6
|
"name": "Alert",
|
|
@@ -24039,22 +24039,10 @@
|
|
|
24039
24039
|
"required": false
|
|
24040
24040
|
},
|
|
24041
24041
|
{
|
|
24042
|
-
"name": "
|
|
24043
|
-
"type": "
|
|
24044
|
-
"required": false,
|
|
24045
|
-
"description": "Render preview drawer content for a row."
|
|
24046
|
-
},
|
|
24047
|
-
{
|
|
24048
|
-
"name": "previewTrigger",
|
|
24049
|
-
"type": "\"master\" | \"button\" | undefined",
|
|
24050
|
-
"required": false,
|
|
24051
|
-
"description": "How the preview drawer is triggered:\n - `'master'` — clicking the master cell toggles the drawer (default)\n - `'button'` — a toggle button appears in master cell actions on hover"
|
|
24052
|
-
},
|
|
24053
|
-
{
|
|
24054
|
-
"name": "previewRowId",
|
|
24055
|
-
"type": "string | null | undefined",
|
|
24042
|
+
"name": "preview",
|
|
24043
|
+
"type": "TablePreview<T> | undefined",
|
|
24056
24044
|
"required": false,
|
|
24057
|
-
"description": "
|
|
24045
|
+
"description": "Preview drawer configuration"
|
|
24058
24046
|
}
|
|
24059
24047
|
],
|
|
24060
24048
|
"variants": [
|
|
@@ -24211,11 +24199,11 @@
|
|
|
24211
24199
|
},
|
|
24212
24200
|
{
|
|
24213
24201
|
"name": "MasterCellWithActions",
|
|
24214
|
-
"code": "() => {\n const [sorting, setSorting] = useState<TableSortingState>([]);\n const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n const data = useMemo(() => multiplySecurityEvents(), []);\n\n const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n () =>\n securityColumns.map((col, i) =>\n i === 0\n ? {\n ...col,\n meta: {\n ...col.meta,\n size: 400,\n resizeType: 'resize',\n renderMenuAction: (row: { original: SecurityEvent }) => (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant='ghost' color='neutral' size='small' aria-label='More'>\n <Ellipsis />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem\n onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n >\n <DropdownMenuItemIcon>\n <Copy />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => alert(`Filter: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <Filter />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Show only</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => alert(`Exclude: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <FilterX />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ),\n },\n }\n : col,\n ),\n [],\n );\n\n return (\n <Table\n className='max-w-920'\n data={data}\n columns={columns}\n getRowId={row => row.id}\n sorting={sorting}\n onSortingChange={setSorting}\n columnSizing={columnSizing}\n onColumnSizingChange={setColumnSizing}\n
|
|
24202
|
+
"code": "() => {\n const [sorting, setSorting] = useState<TableSortingState>([]);\n const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n const data = useMemo(() => multiplySecurityEvents(), []);\n\n const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n () =>\n securityColumns.map((col, i) =>\n i === 0\n ? {\n ...col,\n meta: {\n ...col.meta,\n size: 400,\n resizeType: 'resize',\n renderMenuAction: (row: { original: SecurityEvent }) => (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant='ghost' color='neutral' size='small' aria-label='More'>\n <Ellipsis />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem\n onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n >\n <DropdownMenuItemIcon>\n <Copy />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => alert(`Filter: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <Filter />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Show only</DropdownMenuItemText>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => alert(`Exclude: ${row.original.objectName}`)}\n >\n <DropdownMenuItemIcon>\n <FilterX />\n </DropdownMenuItemIcon>\n <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ),\n },\n }\n : col,\n ),\n [],\n );\n\n return (\n <Table\n className='max-w-920'\n data={data}\n columns={columns}\n getRowId={row => row.id}\n sorting={sorting}\n onSortingChange={setSorting}\n columnSizing={columnSizing}\n onColumnSizingChange={setColumnSizing}\n preview={{\n trigger: 'button',\n renderHeader: renderSecurityPreviewHeader,\n renderContent: renderSecurityPreview,\n }}\n />\n );\n}"
|
|
24215
24203
|
},
|
|
24216
24204
|
{
|
|
24217
24205
|
"name": "MasterCellWithPreviewDrawer",
|
|
24218
|
-
"code": "() => {\n const [sorting, setSorting] = useState<TableSortingState>([]);\n\n const data = useMemo(\n () =>\n Array.from({ length: 4 }, (_, batch) =>\n securityEvents.map(row => ({\n ...row,\n id: `${row.id}-${batch}`,\n objectName: batch === 0 ? row.objectName : `${row.objectName} (${batch + 1})`,\n })),\n ).flat(),\n [],\n );\n\n const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n () =>\n securityColumns.map((col, i) =>\n i === 0\n ? {\n ...col,\n cell: ({ row }: { row: { original: SecurityEvent } }) => (\n <Text size='xs'>{row.original.objectName}</Text>\n ),\n }\n : col,\n ),\n [],\n );\n\n return (\n <Table\n className='max-w-920'\n data={data}\n columns={columns}\n getRowId={row => row.id}\n sorting={sorting}\n onSortingChange={setSorting}\n
|
|
24206
|
+
"code": "() => {\n const [sorting, setSorting] = useState<TableSortingState>([]);\n\n const data = useMemo(\n () =>\n Array.from({ length: 4 }, (_, batch) =>\n securityEvents.map(row => ({\n ...row,\n id: `${row.id}-${batch}`,\n objectName: batch === 0 ? row.objectName : `${row.objectName} (${batch + 1})`,\n })),\n ).flat(),\n [],\n );\n\n const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n () =>\n securityColumns.map((col, i) =>\n i === 0\n ? {\n ...col,\n cell: ({ row }: { row: { original: SecurityEvent } }) => (\n <Text size='xs'>{row.original.objectName}</Text>\n ),\n }\n : col,\n ),\n [],\n );\n\n return (\n <Table\n className='max-w-920'\n data={data}\n columns={columns}\n getRowId={row => row.id}\n sorting={sorting}\n onSortingChange={setSorting}\n preview={{ renderContent: renderSecurityPreviewWithTitle }}\n />\n );\n}"
|
|
24219
24207
|
},
|
|
24220
24208
|
{
|
|
24221
24209
|
"name": "FullFeatured",
|