@navikt/ds-react 8.10.0 → 8.10.2

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 (79) hide show
  1. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +1 -2
  2. package/cjs/data/table/column-header/DataTableColumnHeader.js +13 -11
  3. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  4. package/cjs/data/table/column-header/useTableColumnResize.d.ts +5 -3
  5. package/cjs/data/table/column-header/useTableColumnResize.js +128 -53
  6. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
  7. package/cjs/data/table/helpers/collectTableRowEntries.d.ts +16 -0
  8. package/cjs/data/table/helpers/collectTableRowEntries.js +27 -0
  9. package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -0
  10. package/cjs/data/table/helpers/table-keyboard.js +3 -3
  11. package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
  12. package/cjs/data/table/hooks/useTableExpansion.d.ts +9 -6
  13. package/cjs/data/table/hooks/useTableExpansion.js +36 -15
  14. package/cjs/data/table/hooks/useTableExpansion.js.map +1 -1
  15. package/cjs/data/table/hooks/useTableItems.d.ts +29 -0
  16. package/cjs/data/table/hooks/useTableItems.js +63 -0
  17. package/cjs/data/table/hooks/useTableItems.js.map +1 -0
  18. package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -3
  19. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  20. package/cjs/data/table/root/DataTableAuto.d.ts +18 -0
  21. package/cjs/data/table/root/DataTableAuto.js +71 -29
  22. package/cjs/data/table/root/DataTableAuto.js.map +1 -1
  23. package/cjs/data/table/root/DataTableRoot.context.d.ts +5 -3
  24. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  25. package/cjs/data/table/root/DataTableRoot.js +7 -4
  26. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  27. package/cjs/data/table/tr/DataTableTr.js +30 -32
  28. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  29. package/cjs/modal/Modal.js +3 -3
  30. package/cjs/modal/Modal.js.map +1 -1
  31. package/cjs/modal/types.d.ts +1 -0
  32. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +1 -2
  33. package/esm/data/table/column-header/DataTableColumnHeader.js +14 -12
  34. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  35. package/esm/data/table/column-header/useTableColumnResize.d.ts +5 -3
  36. package/esm/data/table/column-header/useTableColumnResize.js +129 -54
  37. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
  38. package/esm/data/table/helpers/collectTableRowEntries.d.ts +16 -0
  39. package/esm/data/table/helpers/collectTableRowEntries.js +25 -0
  40. package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -0
  41. package/esm/data/table/helpers/table-keyboard.js +3 -3
  42. package/esm/data/table/helpers/table-keyboard.js.map +1 -1
  43. package/esm/data/table/hooks/useTableExpansion.d.ts +9 -6
  44. package/esm/data/table/hooks/useTableExpansion.js +36 -16
  45. package/esm/data/table/hooks/useTableExpansion.js.map +1 -1
  46. package/esm/data/table/hooks/useTableItems.d.ts +29 -0
  47. package/esm/data/table/hooks/useTableItems.js +58 -0
  48. package/esm/data/table/hooks/useTableItems.js.map +1 -0
  49. package/esm/data/table/hooks/useTableKeyboardNav.js +3 -3
  50. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  51. package/esm/data/table/root/DataTableAuto.d.ts +18 -0
  52. package/esm/data/table/root/DataTableAuto.js +72 -30
  53. package/esm/data/table/root/DataTableAuto.js.map +1 -1
  54. package/esm/data/table/root/DataTableRoot.context.d.ts +5 -3
  55. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  56. package/esm/data/table/root/DataTableRoot.js +7 -4
  57. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  58. package/esm/data/table/tr/DataTableTr.js +32 -34
  59. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  60. package/esm/modal/Modal.js +3 -3
  61. package/esm/modal/Modal.js.map +1 -1
  62. package/esm/modal/types.d.ts +1 -0
  63. package/package.json +7 -7
  64. package/src/data/table/column-header/DataTableColumnHeader.tsx +22 -14
  65. package/src/data/table/column-header/useTableColumnResize.ts +152 -79
  66. package/src/data/table/helpers/collectTableRowEntries.ts +58 -0
  67. package/src/data/table/helpers/table-keyboard.ts +4 -4
  68. package/src/data/table/hooks/__tests__/useTableExpansion.test.tsx +115 -0
  69. package/src/data/table/hooks/__tests__/useTableItems.test.ts +131 -0
  70. package/src/data/table/hooks/useTableExpansion.tsx +63 -22
  71. package/src/data/table/hooks/useTableItems.ts +123 -0
  72. package/src/data/table/hooks/useTableKeyboardNav.ts +3 -3
  73. package/src/data/table/root/DataTableAuto.test.tsx +118 -0
  74. package/src/data/table/root/DataTableAuto.tsx +159 -49
  75. package/src/data/table/root/DataTableRoot.context.ts +4 -2
  76. package/src/data/table/root/DataTableRoot.tsx +20 -13
  77. package/src/data/table/tr/DataTableTr.tsx +48 -47
  78. package/src/modal/Modal.tsx +12 -6
  79. package/src/modal/types.ts +1 -0
@@ -1,4 +1,4 @@
1
- import React, { forwardRef, useCallback } from "react";
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 { useDataTableExpansion } from "../hooks/useTableExpansion";
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 = useCallback(
63
- (event: React.MouseEvent<HTMLTableRowElement>) => {
64
- if (
65
- location !== "tbody" ||
66
- rowId === undefined ||
67
- isInteractiveTarget(event.target) ||
68
- (event.target as HTMLElement | null)?.closest(
69
- "[data-prevent-row-click]",
70
- )
71
- ) {
72
- return;
73
- }
74
-
75
- const selection = window.getSelection();
76
- if (selection && selection.toString().length > 0) {
77
- return;
78
- }
79
-
80
- if (
81
- !disableRowSelectionOnClick &&
82
- selectionState.selection.selectionMode !== "none"
83
- ) {
84
- selectionState.selection.toggleSelection(rowId);
85
- }
86
- onRowClick?.(rowId, event);
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={composeEventHandlers(onClick, handleClick)}
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
- enableExpansion,
129
+ enableDetailsPanel,
135
130
  isAllExpanded,
136
131
  toggleAll,
137
132
  showExpandAll,
138
- } = expansionContext;
133
+ } = useDataTableExpansion();
139
134
 
140
- if (!enableExpansion) {
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={`${tableId}-expansion-${rowId}`}
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/rowspans?
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 }) {
@@ -93,6 +93,7 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
93
93
  style,
94
94
  onClick,
95
95
  onMouseDown,
96
+ size = "medium",
96
97
  ...rest
97
98
  }: ModalProps,
98
99
  ref,
@@ -153,12 +154,17 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
153
154
  const isWidthPreset =
154
155
  typeof width === "string" && ["small", "medium"].includes(width);
155
156
 
156
- const mergedClassName = cl("aksel-modal", className, {
157
- [polyfillClassName]: needPolyfill,
158
- "aksel-modal--autowidth": !width,
159
- [`aksel-modal--${width}`]: isWidthPreset,
160
- "aksel-modal--top": placement === "top" && !needPolyfill,
161
- });
157
+ const mergedClassName = cl(
158
+ "aksel-modal",
159
+ className,
160
+ `aksel-modal--${size}`,
161
+ {
162
+ [polyfillClassName]: needPolyfill,
163
+ "aksel-modal--autowidth": !width,
164
+ [`aksel-modal--width-${width}`]: isWidthPreset,
165
+ "aksel-modal--top": placement === "top" && !needPolyfill,
166
+ },
167
+ );
162
168
 
163
169
  const mergedStyle = {
164
170
  ...style,
@@ -1,6 +1,7 @@
1
1
  interface ModalPropsBase extends React.DialogHTMLAttributes<HTMLDialogElement> {
2
2
  /**
3
3
  * Affects internal padding
4
+ * @default "medium"
4
5
  */
5
6
  size?: "small" | "medium";
6
7
  /**