@navikt/ds-react 8.10.1 → 8.10.3
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/cjs/data/table/column-header/DataTableColumnHeader.d.ts +1 -1
- package/cjs/data/table/column-header/DataTableColumnHeader.js +16 -11
- package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/cjs/data/table/column-header/useTableColumnResize.d.ts +28 -4
- package/cjs/data/table/column-header/useTableColumnResize.js +144 -53
- package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/cjs/data/table/helpers/collectTableRowEntries.d.ts +24 -0
- package/cjs/data/table/helpers/collectTableRowEntries.js +35 -0
- package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -0
- package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +46 -0
- package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js +112 -0
- package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js.map +1 -0
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +3 -2
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +43 -19
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
- package/cjs/data/table/helpers/selection/selection.types.d.ts +1 -0
- package/cjs/data/table/helpers/table-keyboard.d.ts +1 -2
- package/cjs/data/table/helpers/table-keyboard.js +1 -5
- package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
- package/cjs/data/table/hooks/useTableExpansion.d.ts +7 -6
- package/cjs/data/table/hooks/useTableExpansion.js +42 -15
- package/cjs/data/table/hooks/useTableExpansion.js.map +1 -1
- package/cjs/data/table/hooks/useTableItems.d.ts +33 -0
- package/cjs/data/table/hooks/useTableItems.js +74 -0
- package/cjs/data/table/hooks/useTableItems.js.map +1 -0
- package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -3
- package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
- package/cjs/data/table/hooks/useTableSelection.d.ts +3 -2
- package/cjs/data/table/hooks/useTableSelection.js +5 -4
- package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
- package/cjs/data/table/root/DataTable.types.d.ts +5 -4
- package/cjs/data/table/root/DataTableAuto.d.ts +27 -1
- package/cjs/data/table/root/DataTableAuto.js +92 -50
- package/cjs/data/table/root/DataTableAuto.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.context.d.ts +5 -3
- package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.js +6 -4
- package/cjs/data/table/root/DataTableRoot.js.map +1 -1
- package/cjs/data/table/tr/DataTableTr.js +30 -32
- package/cjs/data/table/tr/DataTableTr.js.map +1 -1
- package/cjs/form/checkbox/Checkbox.js +1 -0
- package/cjs/form/checkbox/Checkbox.js.map +1 -1
- package/cjs/form/radio/Radio.js +7 -1
- package/cjs/form/radio/Radio.js.map +1 -1
- package/cjs/modal/types.d.ts +8 -4
- package/esm/data/table/column-header/DataTableColumnHeader.d.ts +1 -1
- package/esm/data/table/column-header/DataTableColumnHeader.js +17 -12
- package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/esm/data/table/column-header/useTableColumnResize.d.ts +28 -4
- package/esm/data/table/column-header/useTableColumnResize.js +145 -54
- package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/esm/data/table/helpers/collectTableRowEntries.d.ts +24 -0
- package/esm/data/table/helpers/collectTableRowEntries.js +33 -0
- package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -0
- package/esm/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +46 -0
- package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js +109 -0
- package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js.map +1 -0
- package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +3 -2
- package/esm/data/table/helpers/selection/getMultipleSelectProps.js +43 -19
- package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
- package/esm/data/table/helpers/selection/selection.types.d.ts +1 -0
- package/esm/data/table/helpers/table-keyboard.d.ts +1 -2
- package/esm/data/table/helpers/table-keyboard.js +1 -5
- package/esm/data/table/helpers/table-keyboard.js.map +1 -1
- package/esm/data/table/hooks/useTableExpansion.d.ts +7 -6
- package/esm/data/table/hooks/useTableExpansion.js +42 -16
- package/esm/data/table/hooks/useTableExpansion.js.map +1 -1
- package/esm/data/table/hooks/useTableItems.d.ts +33 -0
- package/esm/data/table/hooks/useTableItems.js +69 -0
- package/esm/data/table/hooks/useTableItems.js.map +1 -0
- package/esm/data/table/hooks/useTableKeyboardNav.js +3 -3
- package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
- package/esm/data/table/hooks/useTableSelection.d.ts +3 -2
- package/esm/data/table/hooks/useTableSelection.js +5 -4
- package/esm/data/table/hooks/useTableSelection.js.map +1 -1
- package/esm/data/table/root/DataTable.types.d.ts +5 -4
- package/esm/data/table/root/DataTableAuto.d.ts +27 -1
- package/esm/data/table/root/DataTableAuto.js +94 -52
- package/esm/data/table/root/DataTableAuto.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.context.d.ts +5 -3
- package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.js +7 -5
- package/esm/data/table/root/DataTableRoot.js.map +1 -1
- package/esm/data/table/tr/DataTableTr.js +32 -34
- package/esm/data/table/tr/DataTableTr.js.map +1 -1
- package/esm/form/checkbox/Checkbox.js +1 -0
- package/esm/form/checkbox/Checkbox.js.map +1 -1
- package/esm/form/radio/Radio.js +7 -1
- package/esm/form/radio/Radio.js.map +1 -1
- package/esm/modal/types.d.ts +8 -4
- package/package.json +7 -7
- package/src/data/table/column-header/DataTableColumnHeader.tsx +26 -14
- package/src/data/table/column-header/useTableColumnResize.ts +209 -80
- package/src/data/table/helpers/collectTableRowEntries.ts +90 -0
- package/src/data/table/helpers/selection/SelectionSubtreeHelper.test.ts +66 -0
- package/src/data/table/helpers/selection/SelectionSubtreeHelper.ts +162 -0
- package/src/data/table/helpers/selection/getMultipleSelectProps.ts +57 -20
- package/src/data/table/helpers/selection/selection.types.ts +1 -0
- package/src/data/table/helpers/table-keyboard.ts +1 -6
- package/src/data/table/hooks/__tests__/useTableItems.test.ts +145 -0
- package/src/data/table/hooks/__tests__/useTableSelection.test.ts +132 -21
- package/src/data/table/hooks/useTableExpansion.tsx +68 -22
- package/src/data/table/hooks/useTableItems.ts +146 -0
- package/src/data/table/hooks/useTableKeyboardNav.ts +3 -3
- package/src/data/table/hooks/useTableSelection.ts +10 -6
- package/src/data/table/root/DataTable.types.ts +5 -4
- package/src/data/table/root/DataTableAuto.test.tsx +244 -0
- package/src/data/table/root/DataTableAuto.tsx +260 -141
- package/src/data/table/root/DataTableRoot.context.ts +4 -2
- package/src/data/table/root/DataTableRoot.tsx +22 -16
- package/src/data/table/tr/DataTableTr.tsx +48 -47
- package/src/form/checkbox/Checkbox.tsx +1 -0
- package/src/form/radio/Radio.tsx +7 -1
- package/src/modal/types.ts +8 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { forwardRef
|
|
1
|
+
import React, { forwardRef } from "react";
|
|
2
2
|
import {
|
|
3
3
|
ChevronDownUpIcon,
|
|
4
4
|
ChevronUpDownIcon,
|
|
@@ -14,7 +14,10 @@ import { useId } from "../../../utils-external";
|
|
|
14
14
|
import { cl, composeEventHandlers } from "../../../utils/helpers";
|
|
15
15
|
import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
|
|
16
16
|
import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
|
|
17
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
getDataTableExpansionId,
|
|
19
|
+
useDataTableExpansion,
|
|
20
|
+
} from "../hooks/useTableExpansion";
|
|
18
21
|
import {
|
|
19
22
|
useDataTableContext,
|
|
20
23
|
useDataTableLocation,
|
|
@@ -59,45 +62,41 @@ const DataTableTr = forwardRef<HTMLTableRowElement, DataTableTrProps>(
|
|
|
59
62
|
|
|
60
63
|
const isSticky = location === "thead" && stickyHeader;
|
|
61
64
|
|
|
62
|
-
const handleClick =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
disableRowSelectionOnClick,
|
|
90
|
-
location,
|
|
91
|
-
onRowClick,
|
|
92
|
-
rowId,
|
|
93
|
-
selectionState.selection,
|
|
94
|
-
],
|
|
95
|
-
);
|
|
65
|
+
const handleClick =
|
|
66
|
+
location === "tbody" && rowId !== undefined
|
|
67
|
+
? (event: React.MouseEvent<HTMLTableRowElement>) => {
|
|
68
|
+
if (
|
|
69
|
+
rowId === undefined ||
|
|
70
|
+
isInteractiveTarget(event.target) ||
|
|
71
|
+
(event.target as HTMLElement | null)?.closest(
|
|
72
|
+
"[data-prevent-row-click]",
|
|
73
|
+
)
|
|
74
|
+
) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const selection = window.getSelection();
|
|
79
|
+
if (selection && selection.toString().length > 0) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (
|
|
84
|
+
!disableRowSelectionOnClick &&
|
|
85
|
+
selectionState.selection.selectionMode !== "none"
|
|
86
|
+
) {
|
|
87
|
+
selectionState.selection.toggleSelection(rowId);
|
|
88
|
+
}
|
|
89
|
+
onRowClick?.(rowId, event);
|
|
90
|
+
}
|
|
91
|
+
: undefined;
|
|
96
92
|
|
|
97
93
|
return (
|
|
98
94
|
<tr
|
|
99
95
|
{...rest}
|
|
100
|
-
onClick
|
|
96
|
+
// Avoid setting onClick if not needed, since this causes NVDA to announce the row as clickable.
|
|
97
|
+
onClick={
|
|
98
|
+
(onClick || handleClick) && composeEventHandlers(onClick, handleClick)
|
|
99
|
+
}
|
|
101
100
|
ref={forwardedRef}
|
|
102
101
|
className={cl("aksel-data-table__tr", className)}
|
|
103
102
|
data-selected={selected}
|
|
@@ -122,22 +121,18 @@ const DataTableTr = forwardRef<HTMLTableRowElement, DataTableTrProps>(
|
|
|
122
121
|
function RowExpansionCell({ rowId }: { rowId?: string | number }) {
|
|
123
122
|
const { tableId, showLoadingSkeletons } = useDataTableContext();
|
|
124
123
|
const { location } = useDataTableLocation();
|
|
125
|
-
const expansionContext = useDataTableExpansion(false);
|
|
126
|
-
|
|
127
|
-
if (!expansionContext) {
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
124
|
|
|
131
125
|
const {
|
|
132
126
|
isExpanded,
|
|
127
|
+
isDetailsPanelExpandable,
|
|
133
128
|
toggleExpansion,
|
|
134
|
-
|
|
129
|
+
enableDetailsPanel,
|
|
135
130
|
isAllExpanded,
|
|
136
131
|
toggleAll,
|
|
137
132
|
showExpandAll,
|
|
138
|
-
} =
|
|
133
|
+
} = useDataTableExpansion();
|
|
139
134
|
|
|
140
|
-
if (!
|
|
135
|
+
if (!enableDetailsPanel) {
|
|
141
136
|
return null;
|
|
142
137
|
}
|
|
143
138
|
|
|
@@ -202,6 +197,12 @@ function RowExpansionCell({ rowId }: { rowId?: string | number }) {
|
|
|
202
197
|
}
|
|
203
198
|
|
|
204
199
|
const isRowExpanded = isExpanded(rowId);
|
|
200
|
+
const canExpandRow = isDetailsPanelExpandable(rowId);
|
|
201
|
+
const expansionId = getDataTableExpansionId(tableId, rowId);
|
|
202
|
+
|
|
203
|
+
if (!canExpandRow) {
|
|
204
|
+
return <DataTableTd UNSAFE_isSelection preventRowClick />;
|
|
205
|
+
}
|
|
205
206
|
|
|
206
207
|
return (
|
|
207
208
|
<DataTableTd UNSAFE_isSelection preventRowClick>
|
|
@@ -214,7 +215,7 @@ function RowExpansionCell({ rowId }: { rowId?: string | number }) {
|
|
|
214
215
|
toggleExpansion(rowId);
|
|
215
216
|
}}
|
|
216
217
|
aria-expanded={isRowExpanded}
|
|
217
|
-
aria-controls={
|
|
218
|
+
aria-controls={expansionId}
|
|
218
219
|
aria-label={isRowExpanded ? "Skjul detaljer" : "Vis detaljer"}
|
|
219
220
|
icon={
|
|
220
221
|
isRowExpanded ? <MinusIcon aria-hidden /> : <PlusIcon aria-hidden />
|
|
@@ -225,7 +226,7 @@ function RowExpansionCell({ rowId }: { rowId?: string | number }) {
|
|
|
225
226
|
}
|
|
226
227
|
|
|
227
228
|
/**
|
|
228
|
-
* TODO: How do these cells handle multiple thead rows, or col/
|
|
229
|
+
* TODO: How do these cells handle multiple thead rows, or col/row-spans?
|
|
229
230
|
* TODO: a11y for labels
|
|
230
231
|
*/
|
|
231
232
|
function RowSelectionCell({ rowId }: { rowId?: string | number }) {
|
package/src/form/radio/Radio.tsx
CHANGED
|
@@ -24,7 +24,13 @@ export const Radio = forwardRef<HTMLInputElement, RadioProps>(
|
|
|
24
24
|
>
|
|
25
25
|
<RadioInput
|
|
26
26
|
ref={forwardedRef}
|
|
27
|
-
{...omit(props, [
|
|
27
|
+
{...omit(props, [
|
|
28
|
+
"children",
|
|
29
|
+
"size",
|
|
30
|
+
"description",
|
|
31
|
+
"readOnly",
|
|
32
|
+
"className",
|
|
33
|
+
])}
|
|
28
34
|
{...omit(inputProps, ["aria-invalid", "aria-describedby"])}
|
|
29
35
|
aria-describedby={
|
|
30
36
|
cl(inputProps["aria-describedby"], {
|
package/src/modal/types.ts
CHANGED
|
@@ -39,7 +39,8 @@ interface ModalPropsBase extends React.DialogHTMLAttributes<HTMLDialogElement> {
|
|
|
39
39
|
/**
|
|
40
40
|
* Called when the user tries to close the modal by one of the built-in methods.
|
|
41
41
|
* Used if you want to ask the user for confirmation before closing.
|
|
42
|
-
*
|
|
42
|
+
*
|
|
43
|
+
* **NB:** Will not always be called when pressing Esc. See `onCancel` for more info.
|
|
43
44
|
* @returns Whether to close the modal or not
|
|
44
45
|
*/
|
|
45
46
|
onBeforeClose?: () => boolean;
|
|
@@ -52,7 +53,8 @@ interface ModalPropsBase extends React.DialogHTMLAttributes<HTMLDialogElement> {
|
|
|
52
53
|
onCancel?: React.ReactEventHandler<HTMLDialogElement>;
|
|
53
54
|
/**
|
|
54
55
|
* Whether to close when clicking on the backdrop.
|
|
55
|
-
*
|
|
56
|
+
*
|
|
57
|
+
* **NB:** Users may click outside by accident. Don't use if closing can cause data loss, or the modal contains important info.
|
|
56
58
|
* @default false
|
|
57
59
|
*/
|
|
58
60
|
closeOnBackdropClick?: boolean;
|
|
@@ -77,13 +79,15 @@ interface ModalPropsBase extends React.DialogHTMLAttributes<HTMLDialogElement> {
|
|
|
77
79
|
/**
|
|
78
80
|
* ID of the element that labels the modal.
|
|
79
81
|
* No need to set this manually if the `header` prop is used. A reference to `header.heading` will be created automatically.
|
|
80
|
-
*
|
|
82
|
+
*
|
|
83
|
+
* **NB:** If not using `header`, you should set either `aria-labelledby` or `aria-label`.
|
|
81
84
|
*/
|
|
82
85
|
"aria-labelledby"?: string;
|
|
83
86
|
/**
|
|
84
87
|
* String value that labels the modal.
|
|
85
88
|
* No need to set this if the `header` prop is used.
|
|
86
|
-
*
|
|
89
|
+
*
|
|
90
|
+
* **NB:** If not using `header`, you should set either `aria-labelledby` or `aria-label`.
|
|
87
91
|
*/
|
|
88
92
|
"aria-label"?: string;
|
|
89
93
|
}
|