@purpurds/table 8.3.1 → 8.4.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.
Files changed (82) hide show
  1. package/dist/LICENSE.txt +205 -35
  2. package/dist/drag-indicator-circle.d.ts +13 -0
  3. package/dist/drag-indicator-circle.d.ts.map +1 -0
  4. package/dist/draggable-table.d.ts +23 -0
  5. package/dist/draggable-table.d.ts.map +1 -0
  6. package/dist/empty-table.d.ts +14 -0
  7. package/dist/empty-table.d.ts.map +1 -0
  8. package/dist/loading-table-rows.d.ts +13 -0
  9. package/dist/loading-table-rows.d.ts.map +1 -0
  10. package/dist/styles.css +1 -1
  11. package/dist/table-body.d.ts +2 -2
  12. package/dist/table-body.d.ts.map +1 -1
  13. package/dist/table-column-header-cell.d.ts +15 -2
  14. package/dist/table-column-header-cell.d.ts.map +1 -1
  15. package/dist/table-content.d.ts +42 -0
  16. package/dist/table-content.d.ts.map +1 -0
  17. package/dist/table-headers.d.ts +28 -0
  18. package/dist/table-headers.d.ts.map +1 -0
  19. package/dist/table-row-cell-skeleton.d.ts +1 -1
  20. package/dist/table-row-cell-skeleton.d.ts.map +1 -1
  21. package/dist/table-row-cell.d.ts +5 -2
  22. package/dist/table-row-cell.d.ts.map +1 -1
  23. package/dist/table-row.d.ts +2 -2
  24. package/dist/table-row.d.ts.map +1 -1
  25. package/dist/table-settings-drawer.d.ts +44 -11
  26. package/dist/table-settings-drawer.d.ts.map +1 -1
  27. package/dist/table.cjs.js +89 -85
  28. package/dist/table.cjs.js.map +1 -1
  29. package/dist/table.d.ts +3 -3
  30. package/dist/table.d.ts.map +1 -1
  31. package/dist/table.es.js +14397 -10195
  32. package/dist/table.es.js.map +1 -1
  33. package/dist/test-utils/helpers.d.ts +1 -0
  34. package/dist/test-utils/helpers.d.ts.map +1 -1
  35. package/dist/types.d.ts +23 -2
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/use-drag-handle.hook.d.ts +15 -0
  38. package/dist/use-drag-handle.hook.d.ts.map +1 -0
  39. package/dist/use-drag-indicator-position.hook.d.ts +19 -0
  40. package/dist/use-drag-indicator-position.hook.d.ts.map +1 -0
  41. package/dist/use-drop-indicator.hook.d.ts +15 -0
  42. package/dist/use-drop-indicator.hook.d.ts.map +1 -0
  43. package/dist/use-element-visibility.hook.d.ts +4 -0
  44. package/dist/use-element-visibility.hook.d.ts.map +1 -0
  45. package/dist/use-table-scroll.hook.d.ts +6 -0
  46. package/dist/use-table-scroll.hook.d.ts.map +1 -0
  47. package/dist/utils/custom-keyboard-coordinates.d.ts +8 -0
  48. package/dist/utils/custom-keyboard-coordinates.d.ts.map +1 -0
  49. package/package.json +27 -23
  50. package/src/drag-indicator-circle.tsx +36 -0
  51. package/src/draggable-table.test.tsx +381 -0
  52. package/src/draggable-table.tsx +191 -0
  53. package/src/empty-table.tsx +54 -0
  54. package/src/loading-table-rows.tsx +41 -0
  55. package/src/table-body.tsx +1 -3
  56. package/src/table-column-header-cell.tsx +135 -64
  57. package/src/table-content-drag.test.tsx +505 -0
  58. package/src/table-content.tsx +165 -0
  59. package/src/table-dnd-integration.test.tsx +425 -0
  60. package/src/table-drag-and-drop.test.tsx +276 -0
  61. package/src/table-headers.tsx +118 -0
  62. package/src/table-row-cell-skeleton.tsx +1 -1
  63. package/src/table-row-cell.test.tsx +2 -1
  64. package/src/table-row-cell.tsx +42 -31
  65. package/src/table-row.tsx +1 -3
  66. package/src/table-settings-drawer.module.scss +165 -2
  67. package/src/table-settings-drawer.test.tsx +0 -99
  68. package/src/table-settings-drawer.tsx +359 -53
  69. package/src/table.module.scss +191 -30
  70. package/src/table.stories.tsx +60 -4
  71. package/src/table.test.tsx +5 -1
  72. package/src/table.tsx +255 -213
  73. package/src/test-utils/helpers.ts +2 -0
  74. package/src/types.ts +25 -2
  75. package/src/use-drag-handle.hook.tsx +60 -0
  76. package/src/use-drag-handle.test.tsx +380 -0
  77. package/src/use-drag-indicator-position.hook.ts +74 -0
  78. package/src/use-drop-indicator.hook.ts +46 -0
  79. package/src/use-element-visibility.hook.ts +28 -0
  80. package/src/use-table-scroll.hook.tsx +30 -0
  81. package/src/utils/custom-keyboard-coordinates.ts +83 -0
  82. package/vitest.setup.ts +1 -1
@@ -0,0 +1,118 @@
1
+ import React from "react";
2
+ import type { UniqueIdentifier } from "@dnd-kit/core";
3
+ import { horizontalListSortingStrategy, SortableContext } from "@dnd-kit/sortable";
4
+ import type { HeaderGroup, Table } from "@tanstack/react-table";
5
+ import type { RowData } from "@tanstack/react-table";
6
+
7
+ import { type SortingAriaLabels, TableColumnHeaderCell } from "./table-column-header-cell";
8
+ import { TableRow } from "./table-row";
9
+
10
+ type StandardTableHeadersProps<TData extends RowData> = {
11
+ headerGroup: HeaderGroup<TData>;
12
+ tanstackTable: Table<TData>;
13
+ tableHasFilters: boolean;
14
+ emptyTable: boolean;
15
+ stickyFirstColumn: boolean;
16
+ stickyHeaders: boolean;
17
+ isScrolled: boolean;
18
+ getStickyColumn: (index: number) => boolean;
19
+ showBorder: (index: number) => boolean;
20
+ enableSorting: boolean;
21
+ sortingAriaLabels?: SortingAriaLabels;
22
+ };
23
+
24
+ export function StandardTableHeaders<TData extends RowData>({
25
+ headerGroup,
26
+ tanstackTable,
27
+ tableHasFilters,
28
+ emptyTable,
29
+ stickyFirstColumn,
30
+ stickyHeaders,
31
+ isScrolled,
32
+ getStickyColumn,
33
+ showBorder,
34
+ enableSorting,
35
+ sortingAriaLabels,
36
+ }: StandardTableHeadersProps<TData>) {
37
+ return (
38
+ <TableRow key={headerGroup.id}>
39
+ {headerGroup.headers.map((header, index) => (
40
+ <TableColumnHeaderCell
41
+ key={header.id}
42
+ header={header}
43
+ tanstackTable={tanstackTable}
44
+ tableHasFilters={tableHasFilters}
45
+ stickyColumn={!emptyTable && stickyFirstColumn && getStickyColumn(index)}
46
+ stickyHeaders={!emptyTable && stickyHeaders}
47
+ isScrolled={isScrolled}
48
+ showBorder={showBorder(index)}
49
+ {...(enableSorting && sortingAriaLabels
50
+ ? { enableSorting, sortingAriaLabels }
51
+ : { enableSorting: false })}
52
+ />
53
+ ))}
54
+ </TableRow>
55
+ );
56
+ }
57
+
58
+ type SortableTableHeadersProps<TData extends RowData> = StandardTableHeadersProps<TData> & {
59
+ columnOrder: string[];
60
+ activeId: UniqueIdentifier | null;
61
+ enableColumnDrag: boolean;
62
+ columnDragAriaLabelsCopy?: Record<string, string>;
63
+ };
64
+
65
+ export function SortableTableHeaders<TData extends RowData>({
66
+ headerGroup,
67
+ tanstackTable,
68
+ tableHasFilters,
69
+ emptyTable,
70
+ stickyFirstColumn,
71
+ stickyHeaders,
72
+ isScrolled,
73
+ getStickyColumn,
74
+ showBorder,
75
+ enableSorting,
76
+ sortingAriaLabels,
77
+ columnOrder,
78
+ activeId,
79
+ enableColumnDrag,
80
+ columnDragAriaLabelsCopy,
81
+ }: SortableTableHeadersProps<TData>) {
82
+ return (
83
+ <TableRow key={headerGroup.id}>
84
+ <SortableContext items={columnOrder} strategy={horizontalListSortingStrategy}>
85
+ {headerGroup.headers.map((header, index) => {
86
+ const isSelectionColumn = header.id === "row-selection" || header.id === "row-toggle";
87
+
88
+ return (
89
+ <TableColumnHeaderCell
90
+ key={header.id}
91
+ header={header}
92
+ tanstackTable={tanstackTable}
93
+ tableHasFilters={tableHasFilters}
94
+ stickyColumn={!emptyTable && stickyFirstColumn && getStickyColumn(index)}
95
+ stickyHeaders={!emptyTable && stickyHeaders}
96
+ isScrolled={isScrolled}
97
+ showBorder={showBorder(index)}
98
+ {...(enableSorting && sortingAriaLabels
99
+ ? { enableSorting, sortingAriaLabels }
100
+ : { enableSorting: false })}
101
+ sortableId={header.id}
102
+ activeId={activeId}
103
+ overlayActive={false}
104
+ {...(!isSelectionColumn && enableColumnDrag && columnDragAriaLabelsCopy
105
+ ? {
106
+ enableColumnDrag: true,
107
+ columnDragAriaLabel: columnDragAriaLabelsCopy.grab,
108
+ }
109
+ : {
110
+ enableColumnDrag: false,
111
+ })}
112
+ />
113
+ );
114
+ })}
115
+ </SortableContext>
116
+ </TableRow>
117
+ );
118
+ }
@@ -55,4 +55,4 @@ const TableRowCellSkeleton = ({
55
55
  );
56
56
  };
57
57
 
58
- export default TableRowCellSkeleton;
58
+ export { TableRowCellSkeleton };
@@ -5,7 +5,7 @@ import { type Cell } from "@tanstack/react-table";
5
5
  import { render, screen } from "@testing-library/react";
6
6
  import { describe, expect, it, vi } from "vitest";
7
7
 
8
- import TableRowCell from "./table-row-cell";
8
+ import { TableRowCell } from "./table-row-cell";
9
9
  import { type CellType } from "./types";
10
10
 
11
11
  describe("Table row cell - Cell types", () => {
@@ -352,6 +352,7 @@ const renderTableRowCell = (
352
352
  isLastRow={true}
353
353
  isFirstCell={false}
354
354
  isLastCell={false}
355
+ enableColumnDrag={false}
355
356
  />
356
357
  </tr>
357
358
  </tbody>
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, useState } from "react";
1
+ import React, { useRef } from "react";
2
2
  import { type Cell, flexRender, type RowData } from "@tanstack/react-table";
3
3
  import c from "classnames/bind";
4
4
 
@@ -18,6 +18,8 @@ import { RowToggleCell } from "./cell-types/row-toggle-cell";
18
18
  import { ToggleCell } from "./cell-types/toggle-cell";
19
19
  import { WarningAlertMessageCell } from "./cell-types/warning-message-cell";
20
20
  import styles from "./table.module.scss";
21
+ import { useDropIndicator } from "./use-drop-indicator.hook";
22
+ import { useElementVisibility } from "./use-element-visibility.hook";
21
23
 
22
24
  const cx = c.bind(styles);
23
25
 
@@ -41,14 +43,17 @@ type TableRowCellProps<TData extends RowData> = {
41
43
  isLastRow: boolean;
42
44
  isFirstCell: boolean;
43
45
  isLastCell: boolean;
46
+ enableColumnDrag: boolean;
47
+ draggingActive?: boolean;
48
+ enableRowDrag?: boolean;
44
49
  } & (EmptyTableCell | TableRowCell<TData>);
45
50
 
46
51
  const rootClassName = "purpur-table-row-cell";
47
52
 
48
53
  const TableRowCell = <TData extends RowData>({
54
+ cell,
49
55
  className,
50
56
  ["data-testid"]: dataTestId,
51
- cell,
52
57
  stickyColumn,
53
58
  children,
54
59
  colSpan = 1,
@@ -57,31 +62,30 @@ const TableRowCell = <TData extends RowData>({
57
62
  isLastRow,
58
63
  isFirstCell,
59
64
  isLastCell,
65
+ enableColumnDrag,
66
+ draggingActive,
67
+ enableRowDrag,
60
68
  }: TableRowCellProps<TData>) => {
61
- const [isVisible, setIsVisible] = useState(false);
62
69
  const elementRef = useRef<HTMLTableCellElement | null>(null);
70
+ const isVisible = useElementVisibility(elementRef, 1);
63
71
 
64
- useEffect(() => {
65
- const currentElement = elementRef.current;
66
- if (!currentElement) {
67
- return;
68
- }
72
+ // Get the column ID
73
+ const columnId = cell?.column.id;
69
74
 
70
- const observer = new IntersectionObserver(
71
- ([entry]) => {
72
- setIsVisible(entry.isIntersecting);
73
- },
74
- { threshold: 1 }
75
- );
75
+ // Use the drop indicator hook
76
+ const dropIndicatorPosition = useDropIndicator({
77
+ itemId: columnId,
78
+ sortableId: columnId, // Use column ID for consistency
79
+ enableDrag: !!enableColumnDrag,
80
+ });
76
81
 
77
- observer.observe(currentElement);
82
+ // We no longer render a portal-based line indicator for body cells.
83
+ // Pseudo-elements (::before/::after) controlled via modifier classes provide the visual line.
84
+ // Row-level drag indicators (if implemented separately) can be re-added here in the future.
78
85
 
79
- return () => {
80
- if (currentElement) {
81
- observer.unobserve(currentElement);
82
- }
83
- };
84
- }, []);
86
+ const isRowSelector =
87
+ cell?.column.columnDef.meta?.cellType === "rowSelection" ||
88
+ cell?.column.columnDef.meta?.cellType === "rowToggle";
85
89
 
86
90
  const classes = cx(className, rootClassName, {
87
91
  [`${rootClassName}__sticky-column`]: stickyColumn,
@@ -92,24 +96,31 @@ const TableRowCell = <TData extends RowData>({
92
96
  (cell?.column.getIsFirstColumn() || isFirstCell) && isVisible && isLastRow,
93
97
  [`${rootClassName}__last-row-last-cell-visible`]:
94
98
  (cell?.column.getIsLastColumn() || isLastCell) && isVisible && isLastRow,
99
+ [`${rootClassName}__column-drag-enabled`]: enableColumnDrag,
100
+ [`${rootClassName}__dragging`]: draggingActive,
101
+ [`${rootClassName}--drop-indicator-before`]:
102
+ !isRowSelector && dropIndicatorPosition === "before",
103
+ [`${rootClassName}--drop-indicator-after`]: !isRowSelector && dropIndicatorPosition === "after",
95
104
  });
96
105
 
97
106
  const cellContent = cell ? getCellContent(cell) : children;
98
107
 
99
108
  return (
100
- <td
101
- ref={elementRef}
102
- data-testid={dataTestId}
103
- className={classes}
104
- key={cell?.column.columnDef?.id}
105
- colSpan={colSpan}
106
- >
107
- {cellContent}
108
- </td>
109
+ <>
110
+ <td
111
+ ref={elementRef}
112
+ data-testid={dataTestId}
113
+ className={classes}
114
+ key={cell?.column.columnDef?.id}
115
+ colSpan={colSpan}
116
+ >
117
+ {cellContent}
118
+ </td>
119
+ </>
109
120
  );
110
121
  };
111
122
 
112
- export default TableRowCell;
123
+ export { TableRowCell };
113
124
 
114
125
  const getCellContent = <TData extends RowData>(cell: Cell<TData, unknown>) => {
115
126
  const { cellType } = cell.column.columnDef.meta ?? {};
package/src/table-row.tsx CHANGED
@@ -13,7 +13,7 @@ type TableRowProps = {
13
13
 
14
14
  const rootClassName = "purpur-table-row";
15
15
 
16
- const TableRow = ({
16
+ export const TableRow = ({
17
17
  children,
18
18
  className,
19
19
  ["data-testid"]: dataTestId,
@@ -26,5 +26,3 @@ const TableRow = ({
26
26
  {children}
27
27
  </tr>
28
28
  );
29
-
30
- export default TableRow;
@@ -1,3 +1,6 @@
1
+ $column-height: 60px;
2
+ $border-width: 1px;
3
+
1
4
  .purpur-table-settings-drawer {
2
5
  $root: &;
3
6
  display: flex;
@@ -6,8 +9,17 @@
6
9
  gap: var(--purpur-spacing-600);
7
10
  align-self: stretch;
8
11
 
12
+ &__visible-columns-header-wrapper {
13
+ display: flex;
14
+ flex-direction: column;
15
+ align-items: flex-start;
16
+ gap: var(--purpur-spacing-100);
17
+ align-self: stretch;
18
+ }
19
+
9
20
  &__general-settings,
10
- &__visible-columns {
21
+ &__visible-columns,
22
+ &__draggable-list {
11
23
  display: flex;
12
24
  flex-direction: column;
13
25
  align-items: flex-start;
@@ -15,12 +27,163 @@
15
27
  align-self: stretch;
16
28
  }
17
29
 
30
+ &__visible-columns {
31
+ #{$root}__toggle {
32
+ display: flex;
33
+ height: $column-height;
34
+ box-sizing: border-box;
35
+ padding: var(--purpur-spacing-25) var(--purpur-spacing-200);
36
+ justify-content: space-between;
37
+ align-items: center;
38
+ align-self: stretch;
39
+
40
+ border-radius: var(--purpur-border-radius-md);
41
+ background: var(--purpur-color-background-secondary);
42
+ }
43
+ }
44
+
45
+ &__visible-columns-header {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: space-between;
49
+ gap: var(--purpur-spacing-200);
50
+ align-self: stretch;
51
+ }
52
+
53
+ &__visible-columns-header-content {
54
+ display: flex;
55
+ align-items: flex-start;
56
+ gap: var(--purpur-spacing-100);
57
+ align-self: stretch;
58
+ }
59
+
18
60
  &__button-group {
19
61
  text-align: center;
20
62
  }
21
63
 
22
- #{$root}__toggle {
64
+ &__toggle {
23
65
  justify-content: space-between;
24
66
  width: 100%;
25
67
  }
68
+
69
+ &__draggable-item {
70
+ position: relative;
71
+ display: flex;
72
+ padding-right: var(--purpur-spacing-200);
73
+ align-items: center;
74
+ gap: var(--purpur-spacing-50);
75
+ align-self: stretch;
76
+ justify-content: space-between;
77
+
78
+ border-radius: var(--purpur-border-radius-md);
79
+ background: var(--purpur-color-background-secondary);
80
+
81
+ &--overlay {
82
+ border: $border-width solid var(--purpur-color-border-weak);
83
+ box-shadow: var(--purpur-shadow-lg);
84
+ }
85
+
86
+ &--dragging {
87
+ opacity: 0.4;
88
+ }
89
+
90
+ &--drop-indicator-before::before,
91
+ &--drop-indicator-after::after {
92
+ content: "";
93
+ position: absolute;
94
+ left: 0;
95
+ right: 0;
96
+ height: 3px;
97
+ background-color: var(--purpur-color-border-interactive-primary);
98
+ z-index: 5;
99
+ pointer-events: none;
100
+ }
101
+
102
+ &--drop-indicator-before::before {
103
+ top: calc(-1 * var(--purpur-spacing-200) / 2);
104
+ transform: translateY(-50%);
105
+ }
106
+
107
+ &--drop-indicator-after::after {
108
+ bottom: calc(-1 * var(--purpur-spacing-200) / 2);
109
+ transform: translateY(50%);
110
+ }
111
+
112
+ &--drop-indicator-before::after,
113
+ &--drop-indicator-after::before {
114
+ content: "";
115
+ position: absolute;
116
+ width: var(--purpur-spacing-150);
117
+ height: var(--purpur-spacing-150);
118
+ background-color: var(--purpur-color-border-interactive-primary);
119
+ border-radius: 50%;
120
+ z-index: 6;
121
+ pointer-events: none;
122
+ left: 0;
123
+ }
124
+
125
+ &--drop-indicator-before::after {
126
+ top: calc(-1 * var(--purpur-spacing-200) / 2);
127
+ transform: translate(-50%, -50%);
128
+ }
129
+
130
+ &--drop-indicator-after::before {
131
+ bottom: calc(-1 * var(--purpur-spacing-200) / 2);
132
+ transform: translate(-50%, 50%);
133
+ }
134
+ }
135
+
136
+ &__draggable-item-content {
137
+ display: flex;
138
+ gap: var(--purpur-spacing-200);
139
+ align-items: center;
140
+ }
141
+
142
+ &__draggable-handle {
143
+ display: flex;
144
+ height: $column-height;
145
+ box-sizing: border-box;
146
+ padding: 0 var(--purpur-spacing-50);
147
+ justify-content: center;
148
+ align-items: center;
149
+ gap: var(--purpur-spacing-100);
150
+ cursor: grab;
151
+ border-right: var(--purpur-border-width-xs) solid var(--purpur-color-border-weak);
152
+
153
+ &:hover {
154
+ border-top-left-radius: calc(var(--purpur-border-radius-md) - $border-width);
155
+ border-bottom-left-radius: calc(var(--purpur-border-radius-md) - $border-width);
156
+ background: var(--purpur-color-background-interactive-transparent-hover);
157
+ }
158
+
159
+ &:focus,
160
+ &:focus-visible {
161
+ outline: var(--purpur-border-width-sm) solid var(--purpur-color-border-interactive-focus);
162
+ border-radius: var(--purpur-border-radius-xs);
163
+ }
164
+
165
+ &--overlay,
166
+ &--overlay:hover {
167
+ cursor: grabbing;
168
+ background: var(--purpur-color-background-interactive-transparent-active);
169
+ }
170
+
171
+ &-icon {
172
+ color: var(--purpur-color-text-weak);
173
+ }
174
+ }
175
+
176
+ &__draggable-item-buttons {
177
+ display: flex;
178
+ align-items: center;
179
+ gap: var(--purpur-spacing-100);
180
+ }
181
+
182
+ &__draggable-list {
183
+ display: flex;
184
+ flex-direction: column;
185
+ align-items: flex-start;
186
+ gap: var(--purpur-spacing-200);
187
+ align-self: stretch;
188
+ }
26
189
  }
@@ -248,103 +248,4 @@ describe("Data Table - Settings drawer", () => {
248
248
  });
249
249
  });
250
250
  });
251
-
252
- describe("Row selection in settings drawer", () => {
253
- const setRowSelectionEnabledMock = vi.fn();
254
-
255
- describe("When row selection is enabled", () => {
256
- let toggleElements: HTMLElement[];
257
- let toggleLabels: HTMLLabelElement[];
258
- let withinGeneralSettings: ReturnType<typeof within>;
259
-
260
- beforeEach(() => {
261
- render(
262
- <TableSettingsDrawer
263
- id="purpur-table-settings-drawer"
264
- isDrawerOpen={true}
265
- columnFiltersEnabled={true}
266
- showColumnFilters={true}
267
- stickyFirstColumn={true}
268
- stickyHeaders={true}
269
- copy={{
270
- ...copy.settingsDrawer,
271
- generalSettings: {
272
- ...copy.settingsDrawer.generalSettings,
273
- toggles: {
274
- ...copy.settingsDrawer.generalSettings.toggles,
275
- rowSelection: "Row selection",
276
- },
277
- },
278
- }}
279
- setDrawerIsOpen={setDrawerIsOpenMock}
280
- setShowColumnFiltersEnabled={setColumnFiltersEnabledMock}
281
- setStickyFirstColumn={setStickyFirstColumnMock}
282
- setStickyHeaders={setStickyHeadersMock}
283
- getAllColumns={getAllColumnsMock}
284
- onResetSettings={onResetSettingsMock}
285
- enableRowSelection={true}
286
- rowSelectionEnabled={true}
287
- setRowSelectionEnabled={setRowSelectionEnabledMock}
288
- />
289
- );
290
-
291
- withinGeneralSettings = within(
292
- screen.getByTestId(Selectors.SETTINGS_DRAWER.GENERAL_SETTINGS)
293
- );
294
- toggleElements = withinGeneralSettings.getAllByTestId(Selectors.SETTINGS_DRAWER.TOGGLE);
295
- toggleLabels = withinGeneralSettings.getAllByTestId(Selectors.SETTINGS_DRAWER.TOGGLE_LABEL);
296
- });
297
-
298
- it("should have 4 toggles including row selection", () => {
299
- expect(toggleElements).toHaveLength(4);
300
- });
301
-
302
- it("should have row selection toggle", () => {
303
- expect(toggleLabels[3]).toHaveTextContent("Row selection");
304
- expect(toggleElements[3]).toHaveAttribute("data-state", "checked");
305
- });
306
-
307
- it("should call setRowSelectionEnabled when toggled", async () => {
308
- await userEvent.click(toggleElements[3]);
309
- expect(setRowSelectionEnabledMock).toHaveBeenCalled();
310
- });
311
- });
312
-
313
- describe("When row selection is not enabled", () => {
314
- beforeEach(() => {
315
- render(
316
- <TableSettingsDrawer
317
- id="purpur-table-settings-drawer"
318
- isDrawerOpen={true}
319
- columnFiltersEnabled={true}
320
- showColumnFilters={true}
321
- stickyFirstColumn={true}
322
- stickyHeaders={true}
323
- copy={copy.settingsDrawer}
324
- setDrawerIsOpen={setDrawerIsOpenMock}
325
- setShowColumnFiltersEnabled={setColumnFiltersEnabledMock}
326
- setStickyFirstColumn={setStickyFirstColumnMock}
327
- setStickyHeaders={setStickyHeadersMock}
328
- getAllColumns={getAllColumnsMock}
329
- onResetSettings={onResetSettingsMock}
330
- enableRowSelection={false}
331
- rowSelectionEnabled={true}
332
- setRowSelectionEnabled={setRowSelectionEnabledMock}
333
- />
334
- );
335
- });
336
-
337
- it("should not show row selection toggle", () => {
338
- const withinGeneralSettings = within(
339
- screen.getByTestId(Selectors.SETTINGS_DRAWER.GENERAL_SETTINGS)
340
- );
341
- const toggleLabels = withinGeneralSettings.getAllByTestId(
342
- Selectors.SETTINGS_DRAWER.TOGGLE_LABEL
343
- );
344
-
345
- expect(toggleLabels).toHaveLength(3);
346
- expect(toggleLabels.map((label) => label.textContent)).not.toContain("Row selection");
347
- });
348
- });
349
- });
350
251
  });