@wallarm-org/design-system 0.62.0 → 0.63.0
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/Breadcrumbs/BreadcrumbsItem.js +1 -0
- package/dist/components/BulkBar/BulkBarSummary.d.ts +4 -14
- package/dist/components/BulkBar/BulkBarSummary.js +15 -46
- package/dist/components/BulkBar/BulkBarSummaryClear.d.ts +7 -0
- package/dist/components/BulkBar/BulkBarSummaryClear.js +25 -0
- package/dist/components/BulkBar/BulkBarSummaryCount.d.ts +13 -0
- package/dist/components/BulkBar/BulkBarSummaryCount.js +18 -0
- package/dist/components/BulkBar/BulkBarSummarySelectAll.d.ts +7 -0
- package/dist/components/BulkBar/BulkBarSummarySelectAll.js +25 -0
- package/dist/components/BulkBar/BulkBarSummarySeparator.d.ts +8 -0
- package/dist/components/BulkBar/BulkBarSummarySeparator.js +12 -0
- package/dist/components/BulkBar/index.d.ts +5 -0
- package/dist/components/BulkBar/index.js +6 -0
- package/dist/components/Calendar/CalendarPresetItem.d.ts +9 -3
- package/dist/components/Calendar/CalendarPresetItem.js +8 -5
- package/dist/components/Calendar/CalendarTrigger.d.ts +12 -3
- package/dist/components/Calendar/CalendarTrigger.js +3 -3
- package/dist/components/Calendar/index.d.ts +1 -1
- package/dist/components/Card/Card.js +2 -0
- package/dist/components/CodeSnippet/CodeSnippetCode.js +9 -2
- package/dist/components/CodeSnippet/CodeSnippetCopyButton.js +1 -1
- package/dist/components/CodeSnippet/CodeSnippetFullscreenButton.js +0 -1
- package/dist/components/CodeSnippet/CodeSnippetRoot.d.ts +8 -1
- package/dist/components/CodeSnippet/CodeSnippetRoot.js +5 -3
- package/dist/components/CodeSnippet/CodeSnippetShowMoreButton.d.ts +12 -0
- package/dist/components/CodeSnippet/{internal/ShowMoreButton.js → CodeSnippetShowMoreButton.js} +15 -9
- package/dist/components/CodeSnippet/CodeSnippetTab.d.ts +3 -6
- package/dist/components/CodeSnippet/CodeSnippetTab.js +5 -7
- package/dist/components/CodeSnippet/CodeSnippetWrapButton.js +0 -1
- package/dist/components/CodeSnippet/InlineCodeSnippet.d.ts +4 -2
- package/dist/components/CodeSnippet/InlineCodeSnippet.js +14 -7
- package/dist/components/CodeSnippet/index.d.ts +2 -1
- package/dist/components/CodeSnippet/index.js +2 -1
- package/dist/components/CodeSnippet/internal/FoldToggle.js +9 -2
- package/dist/components/CodeSnippet/lib/foldUtils.d.ts +6 -0
- package/dist/components/DateRangeInput/DateRangeEndValue.d.ts +9 -2
- package/dist/components/DateRangeInput/DateRangeEndValue.js +3 -2
- package/dist/components/DateRangeInput/DateRangeSegmentGroup.d.ts +12 -1
- package/dist/components/DateRangeInput/DateRangeSegmentGroup.js +24 -6
- package/dist/components/DateRangeInput/DateRangeStartValue.d.ts +11 -4
- package/dist/components/DateRangeInput/DateRangeStartValue.js +3 -2
- package/dist/components/DateRangeInput/index.d.ts +2 -2
- package/dist/components/Drawer/Drawer.d.ts +5 -0
- package/dist/components/Drawer/Drawer.js +3 -1
- package/dist/components/Drawer/DrawerClose.d.ts +3 -2
- package/dist/components/Drawer/DrawerClose.js +6 -3
- package/dist/components/Drawer/DrawerHeader.d.ts +1 -1
- package/dist/components/Drawer/DrawerHeader.js +4 -1
- package/dist/components/Drawer/DrawerResizeHandle.d.ts +7 -2
- package/dist/components/Drawer/DrawerResizeHandle.js +31 -6
- package/dist/components/Drawer/DrawerRoot.d.ts +3 -0
- package/dist/components/Drawer/DrawerRoot.js +3 -1
- package/dist/components/Drawer/DrawerTrigger.d.ts +3 -2
- package/dist/components/Drawer/DrawerTrigger.js +3 -2
- package/dist/components/Drawer/index.d.ts +1 -0
- package/dist/components/DropdownMenu/DropdownMenuCheckboxItem.d.ts +2 -1
- package/dist/components/DropdownMenu/DropdownMenuCheckboxItem.js +2 -2
- package/dist/components/DropdownMenu/DropdownMenuContextTrigger.d.ts +3 -5
- package/dist/components/DropdownMenu/DropdownMenuContextTrigger.js +2 -2
- package/dist/components/DropdownMenu/DropdownMenuItem.d.ts +2 -1
- package/dist/components/DropdownMenu/DropdownMenuItem.js +2 -2
- package/dist/components/DropdownMenu/DropdownMenuRadioGroup.d.ts +2 -1
- package/dist/components/DropdownMenu/DropdownMenuRadioGroup.js +4 -4
- package/dist/components/DropdownMenu/DropdownMenuRadioItem.d.ts +2 -1
- package/dist/components/DropdownMenu/DropdownMenuRadioItem.js +2 -2
- package/dist/components/DropdownMenu/DropdownMenuTrigger.d.ts +3 -5
- package/dist/components/DropdownMenu/DropdownMenuTrigger.js +2 -2
- package/dist/components/DropdownMenu/DropdownMenuTriggerItem.d.ts +4 -4
- package/dist/components/DropdownMenu/DropdownMenuTriggerItem.js +4 -3
- package/dist/components/DropdownMenu/index.d.ts +4 -4
- package/dist/components/NavRail/NavRailItem.d.ts +2 -1
- package/dist/components/NavRail/NavRailItem.js +6 -4
- package/dist/components/Popover/PopoverContent.d.ts +3 -3
- package/dist/components/Popover/PopoverContent.js +4 -8
- package/dist/components/Popover/PopoverTrigger.d.ts +3 -5
- package/dist/components/Popover/PopoverTrigger.js +3 -7
- package/dist/components/Popover/index.d.ts +2 -2
- package/dist/components/SegmentedControl/SegmentedControlItem.d.ts +6 -4
- package/dist/components/SegmentedControl/SegmentedControlItem.js +5 -2
- package/dist/components/SegmentedTabs/SegmentedTabsTrigger.d.ts +5 -3
- package/dist/components/SegmentedTabs/SegmentedTabsTrigger.js +5 -3
- package/dist/components/SegmentedTabs/SegmentedTabsTriggerButton.js +2 -2
- package/dist/components/Select/SelectButton.js +2 -2
- package/dist/components/Select/SelectClearTrigger.d.ts +2 -1
- package/dist/components/Select/SelectClearTrigger.js +2 -2
- package/dist/components/Select/SelectInput/SelectInput.d.ts +4 -1
- package/dist/components/Select/SelectInput/SelectInput.js +3 -2
- package/dist/components/Select/SelectOption.d.ts +2 -1
- package/dist/components/Select/SelectOption.js +2 -2
- package/dist/components/Select/SelectSearchInput.d.ts +3 -2
- package/dist/components/Select/SelectSearchInput.js +3 -2
- package/dist/components/Select/index.d.ts +1 -1
- package/dist/components/Selection/SelectionBulkBar/SelectionBulkBar.d.ts +1 -1
- package/dist/components/Selection/SelectionBulkBar/SelectionBulkBar.js +44 -5
- package/dist/components/Selection/index.d.ts +2 -0
- package/dist/components/Selection/index.js +2 -1
- package/dist/components/Table/Table.js +7 -0
- package/dist/components/Table/TableActionBar/TableActionBar.d.ts +7 -1
- package/dist/components/Table/TableActionBar/TableActionBar.js +6 -2
- package/dist/components/Table/TableActionBar/TableActionBarSelection.d.ts +16 -2
- package/dist/components/Table/TableActionBar/TableActionBarSelection.js +52 -10
- package/dist/components/Table/TableActionBar/index.d.ts +1 -0
- package/dist/components/Table/TableActionBar/index.js +2 -1
- package/dist/components/Table/TableColumnMenu/TableColumnMenu.d.ts +37 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenu.js +139 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuHideItem.d.ts +8 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuHideItem.js +27 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveLeftItem.d.ts +8 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveLeftItem.js +38 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveRightItem.d.ts +8 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuMoveRightItem.js +39 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuPinItem.d.ts +10 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuPinItem.js +31 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuSortItem.d.ts +17 -0
- package/dist/components/Table/TableColumnMenu/TableColumnMenuSortItem.js +33 -0
- package/dist/components/Table/TableColumnMenu/index.d.ts +6 -0
- package/dist/components/Table/TableColumnMenu/index.js +7 -0
- package/dist/components/Table/TableHeadCell.js +17 -18
- package/dist/components/Table/TableInner/TableInner.d.ts +2 -0
- package/dist/components/Table/TableInner/TableInner.js +21 -12
- package/dist/components/Table/TableInner/TableInnerContainer.d.ts +1 -0
- package/dist/components/Table/TableInner/TableInnerContainer.js +5 -3
- package/dist/components/Table/TableInner/TableInnerWindow.d.ts +1 -0
- package/dist/components/Table/TableInner/TableInnerWindow.js +5 -3
- package/dist/components/Table/TableScrollHandler.d.ts +27 -4
- package/dist/components/Table/TableScrollHandler.js +99 -68
- package/dist/components/Table/TableScrollHandlerContext.d.ts +19 -0
- package/dist/components/Table/TableScrollHandlerContext.js +24 -0
- package/dist/components/Table/TableScrollHandlerSlot.d.ts +8 -0
- package/dist/components/Table/TableScrollHandlerSlot.js +18 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenu.d.ts +18 -2
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenu.js +105 -95
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContentContext.d.ts +7 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContentContext.js +9 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContext.d.ts +15 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuContext.js +21 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuItem.d.ts +8 -6
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuItem.js +17 -11
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuReset.d.ts +5 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuReset.js +34 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSearch.d.ts +5 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSearch.js +17 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSlot.d.ts +11 -0
- package/dist/components/Table/TableSettingsMenu/TableSettingsMenuSlot.js +16 -0
- package/dist/components/Table/TableSettingsMenu/index.d.ts +6 -1
- package/dist/components/Table/TableSettingsMenu/index.js +6 -1
- package/dist/components/Table/TableSortTrigger.d.ts +39 -0
- package/dist/components/Table/TableSortTrigger.js +86 -0
- package/dist/components/Table/index.d.ts +6 -2
- package/dist/components/Table/index.js +7 -3
- package/dist/components/Table/lib/collectDirectChildren.d.ts +8 -0
- package/dist/components/Table/lib/collectDirectChildren.js +13 -0
- package/dist/components/Table/lib/containsDirectChild.d.ts +12 -0
- package/dist/components/Table/lib/containsDirectChild.js +12 -0
- package/dist/components/Table/lib/index.d.ts +2 -0
- package/dist/components/Table/lib/index.js +3 -1
- package/dist/components/Tabs/TabsTrigger.d.ts +5 -4
- package/dist/components/Tabs/TabsTrigger.js +3 -2
- package/dist/components/Tag/Tag.js +2 -1
- package/dist/components/Tag/TagClose.d.ts +5 -3
- package/dist/components/Tag/TagClose.js +13 -9
- package/dist/components/Tag/index.d.ts +1 -1
- package/dist/components/Tooltip/Tooltip.js +4 -2
- package/dist/components/Tooltip/TooltipContent.d.ts +4 -4
- package/dist/components/Tooltip/TooltipContent.js +3 -3
- package/dist/components/Tooltip/TooltipTrigger.d.ts +4 -4
- package/dist/components/Tooltip/TooltipTrigger.js +2 -2
- package/dist/components/Tooltip/index.d.ts +2 -2
- package/dist/components/Tour/Tour.d.ts +7 -1
- package/dist/components/Tour/Tour.js +8 -2
- package/dist/components/Tour/TourClose.d.ts +6 -2
- package/dist/components/Tour/TourClose.js +6 -6
- package/dist/components/Tour/TourFooter.js +8 -3
- package/dist/components/Tour/TourInner.d.ts +7 -1
- package/dist/components/Tour/TourInner.js +2 -2
- package/dist/components/Tour/index.d.ts +1 -0
- package/dist/components/Tour/index.js +2 -1
- package/dist/components/Tour/types.d.ts +12 -1
- package/dist/hooks/useCopyTooltip.d.ts +1 -3
- package/dist/hooks/useCopyTooltip.js +1 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/metadata/components.json +30183 -16896
- package/dist/utils/testId.d.ts +4 -1
- package/dist/utils/testId.js +2 -1
- package/package.json +1 -1
- package/dist/components/CodeSnippet/internal/ShowMoreButton.d.ts +0 -2
- package/dist/components/Selection/SelectionBulkBar/SelectionBulkBarSummary.d.ts +0 -2
- package/dist/components/Selection/SelectionBulkBar/SelectionBulkBarSummary.js +0 -18
- package/dist/components/Table/TableHeadCellMenu.d.ts +0 -9
- package/dist/components/Table/TableHeadCellMenu.js +0 -174
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useState } from "react";
|
|
2
|
+
import { cloneElement, useMemo, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
3
4
|
import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
|
|
4
5
|
import { SortableContext, arrayMove, sortableKeyboardCoordinates, verticalListSortingStrategy } from "@dnd-kit/sortable";
|
|
5
|
-
import { isEqual } from "lodash-es";
|
|
6
6
|
import { Settings } from "../../../icons/index.js";
|
|
7
7
|
import { cn } from "../../../utils/cn.js";
|
|
8
8
|
import { useTestId } from "../../../utils/testId.js";
|
|
9
9
|
import { Button } from "../../Button/index.js";
|
|
10
|
-
import { DropdownMenu, DropdownMenuContent, DropdownMenuFooter,
|
|
10
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuFooter, DropdownMenuLabel, DropdownMenuTrigger } from "../../DropdownMenu/index.js";
|
|
11
11
|
import { Separator } from "../../Separator/index.js";
|
|
12
12
|
import { VStack } from "../../Stack/index.js";
|
|
13
13
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../../Tooltip/index.js";
|
|
14
|
-
import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID } from "../lib/index.js";
|
|
14
|
+
import { TABLE_EXPAND_COLUMN_ID, TABLE_SELECT_COLUMN_ID, collectDirectChildren } from "../lib/index.js";
|
|
15
15
|
import { useTableContext } from "../TableContext/index.js";
|
|
16
|
+
import { TableSettingsMenuContentProvider } from "./TableSettingsMenuContentContext.js";
|
|
17
|
+
import { useTableSettingsMenuContext } from "./TableSettingsMenuContext.js";
|
|
16
18
|
import { TableSettingsMenuItem } from "./TableSettingsMenuItem.js";
|
|
19
|
+
import { TableSettingsMenuReset } from "./TableSettingsMenuReset.js";
|
|
20
|
+
import { TableSettingsMenuSearch } from "./TableSettingsMenuSearch.js";
|
|
17
21
|
const DEFAULT_HEADER_HEIGHT = 34;
|
|
18
22
|
const HEADER_HEIGHT_WITH_DESCRIPTION = 50;
|
|
19
|
-
const TableSettingsMenu = ()=>{
|
|
20
|
-
const testId = useTestId('settings-menu');
|
|
23
|
+
const TableSettingsMenu = ({ 'data-testid': testIdProp, children, ...rest })=>{
|
|
24
|
+
const testId = useTestId('settings-menu', testIdProp);
|
|
25
|
+
const { anchorNode } = useTableSettingsMenuContext();
|
|
21
26
|
const ctx = useTableContext();
|
|
22
|
-
const { table,
|
|
27
|
+
const { table, alwaysPinnedLeft, masterColumnId } = ctx;
|
|
23
28
|
const hasTextDescription = table.getAllLeafColumns().some((col)=>col.columnDef.meta?.description?.type === 'text');
|
|
24
29
|
const [search, setSearch] = useState('');
|
|
25
30
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
@@ -47,7 +52,30 @@ const TableSettingsMenu = ()=>{
|
|
|
47
52
|
}, [
|
|
48
53
|
filteredColumns
|
|
49
54
|
]);
|
|
55
|
+
const { searchOverride, resetOverride, itemOverrides } = useMemo(()=>{
|
|
56
|
+
const [search] = collectDirectChildren(children, TableSettingsMenuSearch);
|
|
57
|
+
const [reset] = collectDirectChildren(children, TableSettingsMenuReset);
|
|
58
|
+
const items = new Map(collectDirectChildren(children, TableSettingsMenuItem).map((el)=>[
|
|
59
|
+
el.props.columnId,
|
|
60
|
+
el
|
|
61
|
+
]));
|
|
62
|
+
return {
|
|
63
|
+
searchOverride: search,
|
|
64
|
+
resetOverride: reset,
|
|
65
|
+
itemOverrides: items
|
|
66
|
+
};
|
|
67
|
+
}, [
|
|
68
|
+
children
|
|
69
|
+
]);
|
|
50
70
|
const hasUserPinned = pinnedColumns.some((col)=>col.id !== masterColumnId);
|
|
71
|
+
const renderColumnItem = (col)=>{
|
|
72
|
+
const override = itemOverrides.get(col.id);
|
|
73
|
+
return override ? /*#__PURE__*/ cloneElement(override, {
|
|
74
|
+
key: col.id
|
|
75
|
+
}) : /*#__PURE__*/ jsx(TableSettingsMenuItem, {
|
|
76
|
+
columnId: col.id
|
|
77
|
+
}, col.id);
|
|
78
|
+
};
|
|
51
79
|
const sensors = useSensors(useSensor(PointerSensor, {
|
|
52
80
|
activationConstraint: {
|
|
53
81
|
distance: 5
|
|
@@ -64,101 +92,83 @@ const TableSettingsMenu = ()=>{
|
|
|
64
92
|
const newOrder = arrayMove(currentOrder, oldIndex, newIndex);
|
|
65
93
|
ctx.setColumnOrder(newOrder);
|
|
66
94
|
};
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const { columnVisibility: currentVisibility, columnOrder: currentOrder } = table.getState();
|
|
72
|
-
const effectiveOrder = 0 === currentOrder.length ? defaultColumnOrder : currentOrder;
|
|
73
|
-
const visibilityMatch = !defaultColumnVisibility || isEqual(currentVisibility, defaultColumnVisibility);
|
|
74
|
-
const orderMatch = !defaultColumnOrder || isEqual(effectiveOrder, defaultColumnOrder);
|
|
75
|
-
const isDefaultState = visibilityMatch && orderMatch;
|
|
76
|
-
return /*#__PURE__*/ jsx("div", {
|
|
77
|
-
"data-testid": testId,
|
|
78
|
-
className: cn('absolute top-0 right-0 z-30', 'flex items-start', 'bg-bg-light-primary border rounded-tr-12 border-border-primary-light', 'pl-6 pr-4 py-4', 'rounded-tr-12'),
|
|
79
|
-
style: {
|
|
80
|
-
height: hasTextDescription ? HEADER_HEIGHT_WITH_DESCRIPTION : DEFAULT_HEADER_HEIGHT
|
|
95
|
+
const content = /*#__PURE__*/ jsx(TableSettingsMenuContentProvider, {
|
|
96
|
+
value: {
|
|
97
|
+
search,
|
|
98
|
+
setSearch
|
|
81
99
|
},
|
|
82
|
-
children: /*#__PURE__*/
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
children: /*#__PURE__*/ jsx(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
children:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}, col.id))
|
|
135
|
-
]
|
|
100
|
+
children: /*#__PURE__*/ jsx("div", {
|
|
101
|
+
"data-testid": testId,
|
|
102
|
+
className: cn('absolute top-0 right-0 z-30', 'flex items-start', 'bg-bg-light-primary border rounded-tr-12 border-border-primary-light', 'pl-6 pr-4 py-4', 'rounded-tr-12'),
|
|
103
|
+
style: {
|
|
104
|
+
height: hasTextDescription ? HEADER_HEIGHT_WITH_DESCRIPTION : DEFAULT_HEADER_HEIGHT
|
|
105
|
+
},
|
|
106
|
+
children: /*#__PURE__*/ jsxs(Tooltip, {
|
|
107
|
+
disabled: menuOpen,
|
|
108
|
+
children: [
|
|
109
|
+
/*#__PURE__*/ jsx(TooltipTrigger, {
|
|
110
|
+
asChild: true,
|
|
111
|
+
children: /*#__PURE__*/ jsx("span", {
|
|
112
|
+
className: "inline-flex",
|
|
113
|
+
children: /*#__PURE__*/ jsxs(DropdownMenu, {
|
|
114
|
+
onOpenChange: setMenuOpen,
|
|
115
|
+
children: [
|
|
116
|
+
/*#__PURE__*/ jsx(DropdownMenuTrigger, {
|
|
117
|
+
asChild: true,
|
|
118
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
119
|
+
variant: "outline",
|
|
120
|
+
color: "neutral",
|
|
121
|
+
size: "small",
|
|
122
|
+
className: "shadow-sm",
|
|
123
|
+
"aria-label": "Table settings",
|
|
124
|
+
...rest,
|
|
125
|
+
children: /*#__PURE__*/ jsx(Settings, {})
|
|
126
|
+
})
|
|
127
|
+
}),
|
|
128
|
+
/*#__PURE__*/ jsxs(DropdownMenuContent, {
|
|
129
|
+
className: cn('min-w-256 max-h-[430px]'),
|
|
130
|
+
children: [
|
|
131
|
+
searchOverride ?? /*#__PURE__*/ jsx(TableSettingsMenuSearch, {}),
|
|
132
|
+
/*#__PURE__*/ jsx(VStack, {
|
|
133
|
+
gap: 1,
|
|
134
|
+
children: /*#__PURE__*/ jsx(DndContext, {
|
|
135
|
+
sensors: sensors,
|
|
136
|
+
collisionDetection: closestCenter,
|
|
137
|
+
onDragEnd: handleDragEnd,
|
|
138
|
+
children: /*#__PURE__*/ jsxs(SortableContext, {
|
|
139
|
+
items: filteredColumns.filter((c)=>!alwaysPinnedLeft.includes(c.id)).map((c)=>c.id),
|
|
140
|
+
strategy: verticalListSortingStrategy,
|
|
141
|
+
children: [
|
|
142
|
+
hasUserPinned && /*#__PURE__*/ jsx(DropdownMenuLabel, {
|
|
143
|
+
children: "Pinned"
|
|
144
|
+
}),
|
|
145
|
+
pinnedColumns.map(renderColumnItem),
|
|
146
|
+
hasUserPinned && unpinnedColumns.length > 0 && /*#__PURE__*/ jsx(Separator, {
|
|
147
|
+
spacing: 4
|
|
148
|
+
}),
|
|
149
|
+
unpinnedColumns.map(renderColumnItem)
|
|
150
|
+
]
|
|
151
|
+
})
|
|
136
152
|
})
|
|
153
|
+
}),
|
|
154
|
+
/*#__PURE__*/ jsx(DropdownMenuFooter, {
|
|
155
|
+
children: resetOverride ?? /*#__PURE__*/ jsx(TableSettingsMenuReset, {})
|
|
137
156
|
})
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
color: "neutral",
|
|
143
|
-
size: "small",
|
|
144
|
-
onClick: handleReset,
|
|
145
|
-
disabled: isDefaultState,
|
|
146
|
-
fullWidth: true,
|
|
147
|
-
children: "Reset to default"
|
|
148
|
-
})
|
|
149
|
-
})
|
|
150
|
-
]
|
|
151
|
-
})
|
|
152
|
-
]
|
|
157
|
+
]
|
|
158
|
+
})
|
|
159
|
+
]
|
|
160
|
+
})
|
|
153
161
|
})
|
|
162
|
+
}),
|
|
163
|
+
/*#__PURE__*/ jsx(TooltipContent, {
|
|
164
|
+
children: "Table settings"
|
|
154
165
|
})
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
children: "Table settings"
|
|
158
|
-
})
|
|
159
|
-
]
|
|
166
|
+
]
|
|
167
|
+
})
|
|
160
168
|
})
|
|
161
169
|
});
|
|
170
|
+
if (!anchorNode) return null;
|
|
171
|
+
return /*#__PURE__*/ createPortal(content, anchorNode);
|
|
162
172
|
};
|
|
163
173
|
TableSettingsMenu.displayName = 'TableSettingsMenu';
|
|
164
174
|
export { TableSettingsMenu };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface TableSettingsMenuContentContextValue {
|
|
2
|
+
search: string;
|
|
3
|
+
setSearch: (value: string) => void;
|
|
4
|
+
}
|
|
5
|
+
export declare const TableSettingsMenuContentProvider: import("react").Provider<TableSettingsMenuContentContextValue | null>;
|
|
6
|
+
export declare const useTableSettingsMenuContentContext: () => TableSettingsMenuContentContextValue;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
const TableSettingsMenuContentContext = /*#__PURE__*/ createContext(null);
|
|
3
|
+
const TableSettingsMenuContentProvider = TableSettingsMenuContentContext.Provider;
|
|
4
|
+
const useTableSettingsMenuContentContext = ()=>{
|
|
5
|
+
const ctx = useContext(TableSettingsMenuContentContext);
|
|
6
|
+
if (!ctx) throw new Error('TableSettingsMenu item components must be rendered inside <TableSettingsMenu>');
|
|
7
|
+
return ctx;
|
|
8
|
+
};
|
|
9
|
+
export { TableSettingsMenuContentProvider, useTableSettingsMenuContentContext };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type FC, type ReactNode } from 'react';
|
|
2
|
+
interface TableSettingsMenuContextValue {
|
|
3
|
+
anchorNode: HTMLElement | null;
|
|
4
|
+
setAnchorNode: (node: HTMLElement | null) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Holds the DOM node of the internal settings-menu anchor slot so a
|
|
8
|
+
* consumer-rendered `<TableSettingsMenu>` (declared in `Table` children) can
|
|
9
|
+
* portal its trigger into the correct absolutely-positioned location.
|
|
10
|
+
*/
|
|
11
|
+
export declare const TableSettingsMenuProvider: FC<{
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const useTableSettingsMenuContext: () => TableSettingsMenuContextValue;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo, useState } from "react";
|
|
3
|
+
const TableSettingsMenuContext = /*#__PURE__*/ createContext({
|
|
4
|
+
anchorNode: null,
|
|
5
|
+
setAnchorNode: ()=>{}
|
|
6
|
+
});
|
|
7
|
+
const TableSettingsMenuProvider = ({ children })=>{
|
|
8
|
+
const [anchorNode, setAnchorNode] = useState(null);
|
|
9
|
+
const value = useMemo(()=>({
|
|
10
|
+
anchorNode,
|
|
11
|
+
setAnchorNode
|
|
12
|
+
}), [
|
|
13
|
+
anchorNode
|
|
14
|
+
]);
|
|
15
|
+
return /*#__PURE__*/ jsx(TableSettingsMenuContext.Provider, {
|
|
16
|
+
value: value,
|
|
17
|
+
children: children
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
const useTableSettingsMenuContext = ()=>useContext(TableSettingsMenuContext);
|
|
21
|
+
export { TableSettingsMenuProvider, useTableSettingsMenuContext };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type
|
|
2
|
-
interface TableSettingsMenuItemProps<
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { type SwitchProps } from '../../Switch';
|
|
2
|
+
export interface TableSettingsMenuItemProps extends Omit<SwitchProps, 'checked' | 'onCheckedChange' | 'disabled' | 'children'> {
|
|
3
|
+
/** Column id from the table's column definitions. */
|
|
4
|
+
columnId: string;
|
|
5
5
|
}
|
|
6
|
-
export declare const TableSettingsMenuItem:
|
|
7
|
-
|
|
6
|
+
export declare const TableSettingsMenuItem: {
|
|
7
|
+
({ columnId, className, "data-testid": testIdProp, ...rest }: TableSettingsMenuItemProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
displayName: string;
|
|
9
|
+
};
|
|
@@ -6,17 +6,20 @@ import { cn } from "../../../utils/cn.js";
|
|
|
6
6
|
import { useTestId } from "../../../utils/testId.js";
|
|
7
7
|
import { Switch, SwitchControl, SwitchLabel } from "../../Switch/index.js";
|
|
8
8
|
import { useTableContext } from "../TableContext/index.js";
|
|
9
|
-
const TableSettingsMenuItem = ({
|
|
10
|
-
const { masterColumnId } = useTableContext();
|
|
11
|
-
const
|
|
9
|
+
const TableSettingsMenuItem = ({ columnId, className, 'data-testid': testIdProp, ...rest })=>{
|
|
10
|
+
const { masterColumnId, columnDndEnabled, table } = useTableContext();
|
|
11
|
+
const slotTestId = useTestId('settings-menu-item');
|
|
12
|
+
const switchTestId = useTestId(`settings-menu-item-${columnId}`, testIdProp);
|
|
13
|
+
const column = table.getColumn(columnId);
|
|
14
|
+
const isMasterColumn = column?.id === masterColumnId;
|
|
15
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
16
|
+
id: columnId,
|
|
17
|
+
disabled: isMasterColumn || !columnDndEnabled
|
|
18
|
+
});
|
|
19
|
+
if (!column) return null;
|
|
12
20
|
const isVisible = column.getIsVisible();
|
|
13
21
|
const canHide = column.getCanHide();
|
|
14
22
|
const header = 'string' == typeof column.columnDef.header ? column.columnDef.header : column.id;
|
|
15
|
-
const isMasterColumn = column.id === masterColumnId;
|
|
16
|
-
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
17
|
-
id: column.id,
|
|
18
|
-
disabled: isMasterColumn || !canDrag
|
|
19
|
-
});
|
|
20
23
|
const style = {
|
|
21
24
|
transform: CSS.Transform.toString(transform),
|
|
22
25
|
transition,
|
|
@@ -25,7 +28,7 @@ const TableSettingsMenuItem = ({ column, canDrag })=>{
|
|
|
25
28
|
return /*#__PURE__*/ jsxs("div", {
|
|
26
29
|
ref: setNodeRef,
|
|
27
30
|
style: style,
|
|
28
|
-
"data-testid":
|
|
31
|
+
"data-testid": slotTestId,
|
|
29
32
|
className: cn('relative flex items-center w-full rounded-6 pl-20 pr-8 py-6', 'hover:bg-states-primary-hover transition-colors', 'data-disabled:opacity-50 data-disabled:pointer-events-none'),
|
|
30
33
|
"data-disabled": isMasterColumn || void 0,
|
|
31
34
|
children: [
|
|
@@ -33,13 +36,15 @@ const TableSettingsMenuItem = ({ column, canDrag })=>{
|
|
|
33
36
|
className: cn('absolute left-4 top-1/2 -translate-y-1/2 cursor-grab active:cursor-grabbing text-icon-secondary hover:text-icon-primary data-disabled:opacity-50 data-disabled:pointer-events-none'),
|
|
34
37
|
...attributes,
|
|
35
38
|
...listeners,
|
|
36
|
-
"data-disabled": isMasterColumn || !
|
|
39
|
+
"data-disabled": isMasterColumn || !columnDndEnabled || void 0,
|
|
37
40
|
children: /*#__PURE__*/ jsx(GripVertical, {
|
|
38
41
|
size: "sm"
|
|
39
42
|
})
|
|
40
43
|
}),
|
|
41
44
|
/*#__PURE__*/ jsxs(Switch, {
|
|
42
|
-
|
|
45
|
+
...rest,
|
|
46
|
+
"data-testid": switchTestId,
|
|
47
|
+
className: cn('flex-1', className),
|
|
43
48
|
checked: isVisible,
|
|
44
49
|
onCheckedChange: (details)=>column.toggleVisibility(details.checked),
|
|
45
50
|
disabled: isMasterColumn || !canHide,
|
|
@@ -54,4 +59,5 @@ const TableSettingsMenuItem = ({ column, canDrag })=>{
|
|
|
54
59
|
]
|
|
55
60
|
});
|
|
56
61
|
};
|
|
62
|
+
TableSettingsMenuItem.displayName = 'TableSettingsMenuItem';
|
|
57
63
|
export { TableSettingsMenuItem };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ButtonHTMLAttributes, FC } from 'react';
|
|
2
|
+
import { type TestableProps } from '../../../utils/testId';
|
|
3
|
+
export interface TableSettingsMenuResetProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'color' | 'type'>, TestableProps {
|
|
4
|
+
}
|
|
5
|
+
export declare const TableSettingsMenuReset: FC<TableSettingsMenuResetProps>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { isEqual } from "lodash-es";
|
|
3
|
+
import { useTestId } from "../../../utils/testId.js";
|
|
4
|
+
import { Button } from "../../Button/index.js";
|
|
5
|
+
import { useTableContext } from "../TableContext/index.js";
|
|
6
|
+
const TableSettingsMenuReset = ({ 'data-testid': testIdProp, onClick, ...rest })=>{
|
|
7
|
+
const testId = useTestId('settings-menu-reset', testIdProp);
|
|
8
|
+
const { table, visibilityEnabled, columnDndEnabled, defaultColumnVisibility, defaultColumnOrder, setColumnOrder } = useTableContext();
|
|
9
|
+
const handleClick = (event)=>{
|
|
10
|
+
onClick?.(event);
|
|
11
|
+
if (event.defaultPrevented) return;
|
|
12
|
+
if (defaultColumnVisibility && visibilityEnabled) table.setColumnVisibility(defaultColumnVisibility);
|
|
13
|
+
if (defaultColumnOrder && columnDndEnabled) setColumnOrder(defaultColumnOrder);
|
|
14
|
+
};
|
|
15
|
+
const { columnVisibility: currentVisibility, columnOrder: currentOrder } = table.getState();
|
|
16
|
+
const effectiveOrder = 0 === currentOrder.length ? defaultColumnOrder : currentOrder;
|
|
17
|
+
const visibilityMatch = !defaultColumnVisibility || isEqual(currentVisibility, defaultColumnVisibility);
|
|
18
|
+
const orderMatch = !defaultColumnOrder || isEqual(effectiveOrder, defaultColumnOrder);
|
|
19
|
+
const isDefaultState = visibilityMatch && orderMatch;
|
|
20
|
+
return /*#__PURE__*/ jsx(Button, {
|
|
21
|
+
...rest,
|
|
22
|
+
type: "button",
|
|
23
|
+
"data-testid": testId,
|
|
24
|
+
variant: "ghost",
|
|
25
|
+
color: "neutral",
|
|
26
|
+
size: "small",
|
|
27
|
+
onClick: handleClick,
|
|
28
|
+
disabled: isDefaultState,
|
|
29
|
+
fullWidth: true,
|
|
30
|
+
children: "Reset to default"
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
TableSettingsMenuReset.displayName = 'TableSettingsMenuReset';
|
|
34
|
+
export { TableSettingsMenuReset };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FC, InputHTMLAttributes } from 'react';
|
|
2
|
+
import { type TestableProps } from '../../../utils/testId';
|
|
3
|
+
export interface TableSettingsMenuSearchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange'>, TestableProps {
|
|
4
|
+
}
|
|
5
|
+
export declare const TableSettingsMenuSearch: FC<TableSettingsMenuSearchProps>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useTestId } from "../../../utils/testId.js";
|
|
3
|
+
import { DropdownMenuInput } from "../../DropdownMenu/index.js";
|
|
4
|
+
import { useTableSettingsMenuContentContext } from "./TableSettingsMenuContentContext.js";
|
|
5
|
+
const TableSettingsMenuSearch = ({ 'data-testid': testIdProp, placeholder = 'Search', ...rest })=>{
|
|
6
|
+
const testId = useTestId('settings-menu-search', testIdProp);
|
|
7
|
+
const { search, setSearch } = useTableSettingsMenuContentContext();
|
|
8
|
+
return /*#__PURE__*/ jsx(DropdownMenuInput, {
|
|
9
|
+
...rest,
|
|
10
|
+
"data-testid": testId,
|
|
11
|
+
placeholder: placeholder,
|
|
12
|
+
value: search,
|
|
13
|
+
onChange: (e)=>setSearch(e.target.value)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
TableSettingsMenuSearch.displayName = 'TableSettingsMenuSearch';
|
|
17
|
+
export { TableSettingsMenuSearch };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
interface TableSettingsMenuSlotProps {
|
|
3
|
+
hasConsumerMenu: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Internal anchor for the settings menu. Registers its DOM node with the
|
|
7
|
+
* context so a consumer-rendered `<TableSettingsMenu>` can portal into it, and
|
|
8
|
+
* renders the default menu when the consumer did not supply one.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TableSettingsMenuSlot: FC<TableSettingsMenuSlotProps>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { TableSettingsMenu } from "./TableSettingsMenu.js";
|
|
3
|
+
import { useTableSettingsMenuContext } from "./TableSettingsMenuContext.js";
|
|
4
|
+
const TableSettingsMenuSlot = ({ hasConsumerMenu })=>{
|
|
5
|
+
const { setAnchorNode } = useTableSettingsMenuContext();
|
|
6
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
|
7
|
+
children: [
|
|
8
|
+
/*#__PURE__*/ jsx("div", {
|
|
9
|
+
ref: setAnchorNode
|
|
10
|
+
}),
|
|
11
|
+
!hasConsumerMenu && /*#__PURE__*/ jsx(TableSettingsMenu, {})
|
|
12
|
+
]
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
TableSettingsMenuSlot.displayName = 'TableSettingsMenuSlot';
|
|
16
|
+
export { TableSettingsMenuSlot };
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
export { TableSettingsMenu } from './TableSettingsMenu';
|
|
1
|
+
export { TableSettingsMenu, type TableSettingsMenuProps } from './TableSettingsMenu';
|
|
2
|
+
export { TableSettingsMenuProvider } from './TableSettingsMenuContext';
|
|
3
|
+
export { TableSettingsMenuItem, type TableSettingsMenuItemProps } from './TableSettingsMenuItem';
|
|
4
|
+
export { TableSettingsMenuReset, type TableSettingsMenuResetProps } from './TableSettingsMenuReset';
|
|
5
|
+
export { TableSettingsMenuSearch, type TableSettingsMenuSearchProps, } from './TableSettingsMenuSearch';
|
|
6
|
+
export { TableSettingsMenuSlot } from './TableSettingsMenuSlot';
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import { TableSettingsMenu } from "./TableSettingsMenu.js";
|
|
2
|
-
|
|
2
|
+
import { TableSettingsMenuProvider } from "./TableSettingsMenuContext.js";
|
|
3
|
+
import { TableSettingsMenuItem } from "./TableSettingsMenuItem.js";
|
|
4
|
+
import { TableSettingsMenuReset } from "./TableSettingsMenuReset.js";
|
|
5
|
+
import { TableSettingsMenuSearch } from "./TableSettingsMenuSearch.js";
|
|
6
|
+
import { TableSettingsMenuSlot } from "./TableSettingsMenuSlot.js";
|
|
7
|
+
export { TableSettingsMenu, TableSettingsMenuItem, TableSettingsMenuProvider, TableSettingsMenuReset, TableSettingsMenuSearch, TableSettingsMenuSlot };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import type { Column } from '@tanstack/react-table';
|
|
3
|
+
import { type TestableProps } from '../../utils/testId';
|
|
4
|
+
export interface TableSortTriggerProps<T = unknown> extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'type' | 'children'>, TestableProps {
|
|
5
|
+
/**
|
|
6
|
+
* Column from the header render context — wires the trigger to TanStack's
|
|
7
|
+
* sort state. Pass `header.column` directly:
|
|
8
|
+
*
|
|
9
|
+
* ```tsx
|
|
10
|
+
* header: ({ column }) => (
|
|
11
|
+
* <TableSortTrigger column={column} data-analytics-id='users.sort.name'>
|
|
12
|
+
* Name
|
|
13
|
+
* </TableSortTrigger>
|
|
14
|
+
* )
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
column: Column<T, unknown>;
|
|
18
|
+
/** Label rendered next to the sort icon. Visual styling matches the default header text. */
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Consumer-rendered sort trigger. Replaces the auto-rendered sort icon when
|
|
23
|
+
* present as a direct child of the column's `header` render return — the
|
|
24
|
+
* `TableHeadCell` children-scan suppresses the default `TableSortHandler` and
|
|
25
|
+
* does not wrap the label in its own `<Text>`.
|
|
26
|
+
*
|
|
27
|
+
* All native button attributes (including `data-analytics-id`,
|
|
28
|
+
* `data-analytics-props`, `aria-*`, `id`, `ref`, and any `data-*`) reach the
|
|
29
|
+
* underlying `<button>` so analytics SDKs that walk up via
|
|
30
|
+
* `closest('[data-analytics-id]')` resolve clicks on the icon to the
|
|
31
|
+
* consumer-supplied id.
|
|
32
|
+
*
|
|
33
|
+
* Consumer-passed `onClick` runs first; if it calls `event.preventDefault()`,
|
|
34
|
+
* the internal `toggleSorting` is skipped.
|
|
35
|
+
*/
|
|
36
|
+
export declare const TableSortTrigger: {
|
|
37
|
+
<T>({ column, children, "data-testid": testIdProp, className, onClick, ...rest }: TableSortTriggerProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
displayName: string;
|
|
39
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { MoveDown, MoveUp, MoveVertical } from "../../icons/index.js";
|
|
4
|
+
import { cn } from "../../utils/cn.js";
|
|
5
|
+
import { useTestId } from "../../utils/testId.js";
|
|
6
|
+
import { HStack } from "../Stack/index.js";
|
|
7
|
+
import { Text } from "../Text/index.js";
|
|
8
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "../Tooltip/index.js";
|
|
9
|
+
import { tableHeaderButtonClass } from "./classes.js";
|
|
10
|
+
import { SORT_LABELS, getAlignClass } from "./lib/index.js";
|
|
11
|
+
import { useTableContext } from "./TableContext/index.js";
|
|
12
|
+
const getSortTooltip = (sortType, sortDirection)=>{
|
|
13
|
+
const labels = sortType && SORT_LABELS[sortType] || SORT_LABELS.text;
|
|
14
|
+
const [ascLabel, descLabel] = labels;
|
|
15
|
+
return 'asc' === sortDirection ? descLabel : ascLabel;
|
|
16
|
+
};
|
|
17
|
+
const getAriaLabel = (sortDirection)=>{
|
|
18
|
+
if ('asc' === sortDirection) return 'Sorted ascending';
|
|
19
|
+
if ('desc' === sortDirection) return 'Sorted descending';
|
|
20
|
+
return 'Sort column';
|
|
21
|
+
};
|
|
22
|
+
const renderSortIcon = (sortDirection)=>{
|
|
23
|
+
if ('asc' === sortDirection) return /*#__PURE__*/ jsx(MoveUp, {
|
|
24
|
+
size: "sm"
|
|
25
|
+
});
|
|
26
|
+
if ('desc' === sortDirection) return /*#__PURE__*/ jsx(MoveDown, {
|
|
27
|
+
size: "sm"
|
|
28
|
+
});
|
|
29
|
+
return /*#__PURE__*/ jsx(MoveVertical, {
|
|
30
|
+
size: "sm"
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
const TableSortTrigger = ({ column, children, 'data-testid': testIdProp, className, onClick, ...rest })=>{
|
|
34
|
+
const ctx = useTableContext();
|
|
35
|
+
const testId = useTestId('sort', testIdProp);
|
|
36
|
+
const canSort = ctx.sortingEnabled && column.getCanSort();
|
|
37
|
+
const sortDirection = column.getIsSorted();
|
|
38
|
+
const sortType = column.columnDef.meta?.sortType;
|
|
39
|
+
const tooltipText = getSortTooltip(sortType, sortDirection);
|
|
40
|
+
const isRightAligned = 'text-right' === getAlignClass(column.columnDef.meta);
|
|
41
|
+
const handleClick = useCallback((e)=>{
|
|
42
|
+
onClick?.(e);
|
|
43
|
+
if (e.defaultPrevented) return;
|
|
44
|
+
if (canSort) column.toggleSorting(void 0, e.shiftKey);
|
|
45
|
+
}, [
|
|
46
|
+
canSort,
|
|
47
|
+
column,
|
|
48
|
+
onClick
|
|
49
|
+
]);
|
|
50
|
+
const iconButton = /*#__PURE__*/ jsxs(Tooltip, {
|
|
51
|
+
children: [
|
|
52
|
+
/*#__PURE__*/ jsx(TooltipTrigger, {
|
|
53
|
+
asChild: true,
|
|
54
|
+
children: /*#__PURE__*/ jsx("button", {
|
|
55
|
+
...rest,
|
|
56
|
+
type: "button",
|
|
57
|
+
"data-testid": testId,
|
|
58
|
+
className: cn(tableHeaderButtonClass, className),
|
|
59
|
+
onClick: handleClick,
|
|
60
|
+
"aria-label": getAriaLabel(sortDirection),
|
|
61
|
+
children: renderSortIcon(sortDirection)
|
|
62
|
+
})
|
|
63
|
+
}),
|
|
64
|
+
/*#__PURE__*/ jsx(TooltipContent, {
|
|
65
|
+
children: tooltipText
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
});
|
|
69
|
+
const label = children ? /*#__PURE__*/ jsx(Text, {
|
|
70
|
+
size: "xs",
|
|
71
|
+
weight: "medium",
|
|
72
|
+
truncate: true,
|
|
73
|
+
children: children
|
|
74
|
+
}) : null;
|
|
75
|
+
return /*#__PURE__*/ jsxs(HStack, {
|
|
76
|
+
gap: 2,
|
|
77
|
+
align: "center",
|
|
78
|
+
children: [
|
|
79
|
+
isRightAligned ? iconButton : null,
|
|
80
|
+
label,
|
|
81
|
+
isRightAligned ? null : iconButton
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
TableSortTrigger.displayName = 'TableSortTrigger';
|
|
86
|
+
export { TableSortTrigger };
|