@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.
- package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +1 -2
- package/cjs/data/table/column-header/DataTableColumnHeader.js +13 -11
- package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/cjs/data/table/column-header/useTableColumnResize.d.ts +5 -3
- package/cjs/data/table/column-header/useTableColumnResize.js +128 -53
- package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/cjs/data/table/helpers/collectTableRowEntries.d.ts +16 -0
- package/cjs/data/table/helpers/collectTableRowEntries.js +27 -0
- package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -0
- package/cjs/data/table/helpers/table-keyboard.js +3 -3
- package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
- package/cjs/data/table/hooks/useTableExpansion.d.ts +9 -6
- package/cjs/data/table/hooks/useTableExpansion.js +36 -15
- package/cjs/data/table/hooks/useTableExpansion.js.map +1 -1
- package/cjs/data/table/hooks/useTableItems.d.ts +29 -0
- package/cjs/data/table/hooks/useTableItems.js +63 -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/root/DataTableAuto.d.ts +18 -0
- package/cjs/data/table/root/DataTableAuto.js +71 -29
- 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 +7 -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/modal/Modal.js +3 -3
- package/cjs/modal/Modal.js.map +1 -1
- package/cjs/modal/types.d.ts +1 -0
- package/esm/data/table/column-header/DataTableColumnHeader.d.ts +1 -2
- package/esm/data/table/column-header/DataTableColumnHeader.js +14 -12
- package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/esm/data/table/column-header/useTableColumnResize.d.ts +5 -3
- package/esm/data/table/column-header/useTableColumnResize.js +129 -54
- package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/esm/data/table/helpers/collectTableRowEntries.d.ts +16 -0
- package/esm/data/table/helpers/collectTableRowEntries.js +25 -0
- package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -0
- package/esm/data/table/helpers/table-keyboard.js +3 -3
- package/esm/data/table/helpers/table-keyboard.js.map +1 -1
- package/esm/data/table/hooks/useTableExpansion.d.ts +9 -6
- package/esm/data/table/hooks/useTableExpansion.js +36 -16
- package/esm/data/table/hooks/useTableExpansion.js.map +1 -1
- package/esm/data/table/hooks/useTableItems.d.ts +29 -0
- package/esm/data/table/hooks/useTableItems.js +58 -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/root/DataTableAuto.d.ts +18 -0
- package/esm/data/table/root/DataTableAuto.js +72 -30
- 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 -4
- 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/modal/Modal.js +3 -3
- package/esm/modal/Modal.js.map +1 -1
- package/esm/modal/types.d.ts +1 -0
- package/package.json +7 -7
- package/src/data/table/column-header/DataTableColumnHeader.tsx +22 -14
- package/src/data/table/column-header/useTableColumnResize.ts +152 -79
- package/src/data/table/helpers/collectTableRowEntries.ts +58 -0
- package/src/data/table/helpers/table-keyboard.ts +4 -4
- package/src/data/table/hooks/__tests__/useTableExpansion.test.tsx +115 -0
- package/src/data/table/hooks/__tests__/useTableItems.test.ts +131 -0
- package/src/data/table/hooks/useTableExpansion.tsx +63 -22
- package/src/data/table/hooks/useTableItems.ts +123 -0
- package/src/data/table/hooks/useTableKeyboardNav.ts +3 -3
- package/src/data/table/root/DataTableAuto.test.tsx +118 -0
- package/src/data/table/root/DataTableAuto.tsx +159 -49
- package/src/data/table/root/DataTableRoot.context.ts +4 -2
- package/src/data/table/root/DataTableRoot.tsx +20 -13
- package/src/data/table/tr/DataTableTr.tsx +48 -47
- package/src/modal/Modal.tsx +12 -6
- package/src/modal/types.ts +1 -0
|
@@ -9,7 +9,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
-
import React, { forwardRef
|
|
12
|
+
import React, { forwardRef } from "react";
|
|
13
13
|
import { ChevronDownUpIcon, ChevronUpDownIcon, MinusIcon, PlusIcon, } from "@navikt/aksel-icons";
|
|
14
14
|
import { Button } from "../../../button/index.js";
|
|
15
15
|
import { CheckboxInput } from "../../../form/checkbox/checkbox-input/CheckboxInput.js";
|
|
@@ -20,7 +20,7 @@ import { useId } from "../../../utils-external/index.js";
|
|
|
20
20
|
import { cl, composeEventHandlers } from "../../../utils/helpers/index.js";
|
|
21
21
|
import { DataTableBaseCell } from "../base-cell/DataTableBaseCell.js";
|
|
22
22
|
import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader.js";
|
|
23
|
-
import { useDataTableExpansion } from "../hooks/useTableExpansion.js";
|
|
23
|
+
import { getDataTableExpansionId, useDataTableExpansion, } from "../hooks/useTableExpansion.js";
|
|
24
24
|
import { useDataTableContext, useDataTableLocation, } from "../root/DataTableRoot.context.js";
|
|
25
25
|
import { DataTableTd } from "../td/DataTableTd.js";
|
|
26
26
|
const SELECTION_CELL_WIDTH = "50px";
|
|
@@ -32,31 +32,28 @@ const DataTableTr = forwardRef((_a, forwardedRef) => {
|
|
|
32
32
|
const renderFillerCell = layout === "fixed" && children;
|
|
33
33
|
const selected = (_b = selectionState.selection.isRowSelected(rowId !== null && rowId !== void 0 ? rowId : "")) !== null && _b !== void 0 ? _b : selectedProp;
|
|
34
34
|
const isSticky = location === "thead" && stickyHeader;
|
|
35
|
-
const handleClick =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
rowId === undefined ||
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
const handleClick = location === "tbody" && rowId !== undefined
|
|
36
|
+
? (event) => {
|
|
37
|
+
var _a;
|
|
38
|
+
if (rowId === undefined ||
|
|
39
|
+
isInteractiveTarget(event.target) ||
|
|
40
|
+
((_a = event.target) === null || _a === void 0 ? void 0 : _a.closest("[data-prevent-row-click]"))) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const selection = window.getSelection();
|
|
44
|
+
if (selection && selection.toString().length > 0) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!disableRowSelectionOnClick &&
|
|
48
|
+
selectionState.selection.selectionMode !== "none") {
|
|
49
|
+
selectionState.selection.toggleSelection(rowId);
|
|
50
|
+
}
|
|
51
|
+
onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(rowId, event);
|
|
42
52
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
if (!disableRowSelectionOnClick &&
|
|
48
|
-
selectionState.selection.selectionMode !== "none") {
|
|
49
|
-
selectionState.selection.toggleSelection(rowId);
|
|
50
|
-
}
|
|
51
|
-
onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(rowId, event);
|
|
52
|
-
}, [
|
|
53
|
-
disableRowSelectionOnClick,
|
|
54
|
-
location,
|
|
55
|
-
onRowClick,
|
|
56
|
-
rowId,
|
|
57
|
-
selectionState.selection,
|
|
58
|
-
]);
|
|
59
|
-
return (React.createElement("tr", Object.assign({}, rest, { onClick: composeEventHandlers(onClick, handleClick), ref: forwardedRef, className: cl("aksel-data-table__tr", className), "data-selected": selected, "data-sticky": isSticky || undefined }),
|
|
53
|
+
: undefined;
|
|
54
|
+
return (React.createElement("tr", Object.assign({}, rest, {
|
|
55
|
+
// Avoid setting onClick if not needed, since this causes NVDA to announce the row as clickable.
|
|
56
|
+
onClick: (onClick || handleClick) && composeEventHandlers(onClick, handleClick), ref: forwardedRef, className: cl("aksel-data-table__tr", className), "data-selected": selected, "data-sticky": isSticky || undefined }),
|
|
60
57
|
React.createElement(RowExpansionCell, { rowId: rowId }),
|
|
61
58
|
React.createElement(RowSelectionCell, { rowId: rowId }),
|
|
62
59
|
children,
|
|
@@ -65,12 +62,8 @@ const DataTableTr = forwardRef((_a, forwardedRef) => {
|
|
|
65
62
|
function RowExpansionCell({ rowId }) {
|
|
66
63
|
const { tableId, showLoadingSkeletons } = useDataTableContext();
|
|
67
64
|
const { location } = useDataTableLocation();
|
|
68
|
-
const
|
|
69
|
-
if (!
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
const { isExpanded, toggleExpansion, enableExpansion, isAllExpanded, toggleAll, showExpandAll, } = expansionContext;
|
|
73
|
-
if (!enableExpansion) {
|
|
65
|
+
const { isExpanded, isDetailsPanelExpandable, toggleExpansion, enableDetailsPanel, isAllExpanded, toggleAll, showExpandAll, } = useDataTableExpansion();
|
|
66
|
+
if (!enableDetailsPanel) {
|
|
74
67
|
return null;
|
|
75
68
|
}
|
|
76
69
|
if (showLoadingSkeletons) {
|
|
@@ -91,14 +84,19 @@ function RowExpansionCell({ rowId }) {
|
|
|
91
84
|
return null;
|
|
92
85
|
}
|
|
93
86
|
const isRowExpanded = isExpanded(rowId);
|
|
87
|
+
const canExpandRow = isDetailsPanelExpandable(rowId);
|
|
88
|
+
const expansionId = getDataTableExpansionId(tableId, rowId);
|
|
89
|
+
if (!canExpandRow) {
|
|
90
|
+
return React.createElement(DataTableTd, { UNSAFE_isSelection: true, preventRowClick: true });
|
|
91
|
+
}
|
|
94
92
|
return (React.createElement(DataTableTd, { UNSAFE_isSelection: true, preventRowClick: true },
|
|
95
93
|
React.createElement(Button, { variant: "tertiary", "data-color": "neutral", size: "xsmall", onClick: (e) => {
|
|
96
94
|
e.stopPropagation();
|
|
97
95
|
toggleExpansion(rowId);
|
|
98
|
-
}, "aria-expanded": isRowExpanded, "aria-controls":
|
|
96
|
+
}, "aria-expanded": isRowExpanded, "aria-controls": expansionId, "aria-label": isRowExpanded ? "Skjul detaljer" : "Vis detaljer", icon: isRowExpanded ? React.createElement(MinusIcon, { "aria-hidden": true }) : React.createElement(PlusIcon, { "aria-hidden": true }) })));
|
|
99
97
|
}
|
|
100
98
|
/**
|
|
101
|
-
* TODO: How do these cells handle multiple thead rows, or col/
|
|
99
|
+
* TODO: How do these cells handle multiple thead rows, or col/row-spans?
|
|
102
100
|
* TODO: a11y for labels
|
|
103
101
|
*/
|
|
104
102
|
function RowSelectionCell({ rowId }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTableTr.js","sourceRoot":"","sources":["../../../../src/data/table/tr/DataTableTr.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"DataTableTr.js","sourceRoot":"","sources":["../../../../src/data/table/tr/DataTableTr.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAUpC,MAAM,WAAW,GAAG,UAAU,CAC5B,CACE,EAOC,EACD,YAAY,EACZ,EAAE;;QATF,EACE,SAAS,EACT,QAAQ,EACR,QAAQ,EAAE,YAAY,GAAG,KAAK,EAC9B,KAAK,EACL,OAAO,OAER,EADI,IAAI,cANT,yDAOC,CADQ;IAIT,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,cAAc,EACd,UAAU,EACV,0BAA0B,GAC3B,GAAG,mBAAmB,EAAE,CAAC;IAC1B,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAE5C,MAAM,gBAAgB,GAAG,MAAM,KAAK,OAAO,IAAI,QAAQ,CAAC;IAExD,MAAM,QAAQ,GACZ,MAAA,cAAc,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,mCAAI,YAAY,CAAC;IAEtE,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO,IAAI,YAAY,CAAC;IAEtD,MAAM,WAAW,GACf,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS;QACzC,CAAC,CAAC,CAAC,KAA4C,EAAE,EAAE;;YAC/C,IACE,KAAK,KAAK,SAAS;gBACnB,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC;iBACjC,MAAC,KAAK,CAAC,MAA6B,0CAAE,OAAO,CAC3C,0BAA0B,CAC3B,CAAA,EACD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,IACE,CAAC,0BAA0B;gBAC3B,cAAc,CAAC,SAAS,CAAC,aAAa,KAAK,MAAM,EACjD,CAAC;gBACD,cAAc,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;YACD,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QACH,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,CACL,4CACM,IAAI;QACR,gGAAgG;QAChG,OAAO,EACL,CAAC,OAAO,IAAI,WAAW,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,EAExE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,mBACjC,QAAQ,iBACV,QAAQ,IAAI,SAAS;QAElC,oBAAC,gBAAgB,IAAC,KAAK,EAAE,KAAK,GAAI;QAClC,oBAAC,gBAAgB,IAAC,KAAK,EAAE,KAAK,GAAI;QACjC,QAAQ;QACR,gBAAgB,IAAI,CAEnB,iDAEE,SAAS,EAAC,sDAAsD,oCAEhE,CACH,CACE,CACN,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,EAAE,KAAK,EAA+B;IAC9D,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAE5C,MAAM,EACJ,UAAU,EACV,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,aAAa,GACd,GAAG,qBAAqB,EAAE,CAAC;IAE5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,CACL,oBAAC,qBAAqB,IACpB,KAAK,EAAE,oBAAoB,EAC3B,kBAAkB,0CAGlB,CACH,CAAC;QACJ,CAAC;QACD,OAAO,CACL,oBAAC,iBAAiB,IAAC,EAAE,EAAC,IAAI;YACxB,oBAAC,QAAQ,IAAC,OAAO,EAAC,MAAM,GAAG,CACT,CACrB,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3C,OAAO,CACL,oBAAC,qBAAqB,IACpB,KAAK,EAAE,oBAAoB,EAC3B,kBAAkB,0CAGlB,CACH,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,CACL,oBAAC,qBAAqB,IACpB,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAE,oBAAoB,EAC3B,kBAAkB;YAGlB,oBAAC,MAAM,IACL,OAAO,EAAC,UAAU,gBACP,SAAS,EACpB,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,mBACH,aAAa,gBAChB,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,EACjE,IAAI,EACF,aAAa,CAAC,CAAC,CAAC,CACd,oBAAC,iBAAiB,0BAAe,CAClC,CAAC,CAAC,CAAC,CACF,oBAAC,iBAAiB,0BAAe,CAClC,GAEH,CACoB,CACzB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,oBAAC,WAAW,IAAC,kBAAkB,QAAC,eAAe,SAAG,CAAC;IAC5D,CAAC;IAED,OAAO,CACL,oBAAC,WAAW,IAAC,kBAAkB,QAAC,eAAe;QAC7C,oBAAC,MAAM,IACL,OAAO,EAAC,UAAU,gBACP,SAAS,EACpB,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,eAAe,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC,mBACc,aAAa,mBACb,WAAW,gBACd,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,EAC7D,IAAI,EACF,aAAa,CAAC,CAAC,CAAC,oBAAC,SAAS,0BAAe,CAAC,CAAC,CAAC,oBAAC,QAAQ,0BAAe,GAEtE,CACU,CACf,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,EAAE,KAAK,EAA+B;IAC9D,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAC7D,mBAAmB,EAAE,CAAC;IACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IAExB,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,cAAc,CAAC;IAEtD,IAAI,SAAS,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,CACL,oBAAC,qBAAqB,IACpB,KAAK,EAAE,oBAAoB,EAC3B,kBAAkB,yCAElB,QAAQ,EAAE,eAAe,IAAI,OAAO,GACpC,CACH,CAAC;QACJ,CAAC;QAED,OAAO,CACL,oBAAC,iBAAiB,IAAC,EAAE,EAAC,IAAI;YACxB,oBAAC,QAAQ,IAAC,OAAO,EAAC,MAAM,GAAG,CACT,CACrB,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,SAAS,CAAC,aAAa,KAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACnE,MAAM,kBAAkB,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;QAE7D,IAAI,SAAS,GAAG,yBAAyB,CAAC;QAC1C,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC/B,SAAS,GAAG,iCAAiC,CAAC;QAChD,CAAC;QAED,OAAO,CACL,oBAAC,qBAAqB,IACpB,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAE,oBAAoB,EAC3B,kBAAkB,QAClB,QAAQ,EAAE,eAAe,IAAI,OAAO;YAEpC,oBAAC,KAAK,IAAC,OAAO,EAAE,OAAO,EAAE,cAAc,UACpC,SAAS,CACJ;YACR,oBAAC,aAAa,oBAAK,kBAAkB,IAAE,EAAE,EAAE,OAAO,EAAE,OAAO,UAAG,CACxC,CACzB,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,aAAa,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjE,OAAO,CACL,oBAAC,qBAAqB,IACpB,KAAK,EAAE,oBAAoB,EAC3B,kBAAkB,yCAElB,QAAQ,EAAE,eAAe,IAAI,OAAO,GACpC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,CAAC,aAAa,KAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACnE,OAAO,CACL,oBAAC,WAAW,IAAC,kBAAkB,QAAC,QAAQ,EAAE,eAAe,IAAI,OAAO;YAClE,oBAAC,aAAa,oBAAK,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAE,OAAO,UAAG,CACvD,CACf,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,aAAa,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjE,OAAO,CACL,oBAAC,WAAW,IAAC,kBAAkB,QAAC,QAAQ,EAAE,eAAe,IAAI,OAAO;YAClE,oBAAC,UAAU,oBAAK,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAI,CACzC,CACf,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,WAAW;AACX,SAAS,mBAAmB,CAAC,MAA0B;IACrD,OAAO,CAAC,CAAC,CAAC,MAA6B,aAA7B,MAAM,uBAAN,MAAM,CAAyB,OAAO,CAC9C,oCAAoC,CACrC,CAAA,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
package/esm/modal/Modal.js
CHANGED
|
@@ -73,7 +73,7 @@ const polyfillClassName = "aksel-modal--polyfilled";
|
|
|
73
73
|
*/
|
|
74
74
|
export const Modal = forwardRef((_a, ref) => {
|
|
75
75
|
var _b, _c;
|
|
76
|
-
var { header, children, open, onBeforeClose, onCancel, closeOnBackdropClick, width, placement, portal, className, "aria-labelledby": ariaLabelledby, style, onClick, onMouseDown } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "closeOnBackdropClick", "width", "placement", "portal", "className", "aria-labelledby", "style", "onClick", "onMouseDown"]);
|
|
76
|
+
var { header, children, open, onBeforeClose, onCancel, closeOnBackdropClick, width, placement, portal, className, "aria-labelledby": ariaLabelledby, style, onClick, onMouseDown, size = "medium" } = _a, rest = __rest(_a, ["header", "children", "open", "onBeforeClose", "onCancel", "closeOnBackdropClick", "width", "placement", "portal", "className", "aria-labelledby", "style", "onClick", "onMouseDown", "size"]);
|
|
77
77
|
const modalRef = useRef(null);
|
|
78
78
|
const mergedRef = useMergeRefs(modalRef, ref);
|
|
79
79
|
const ariaLabelId = useId();
|
|
@@ -121,10 +121,10 @@ export const Modal = forwardRef((_a, ref) => {
|
|
|
121
121
|
referenceElement: modalRef.current,
|
|
122
122
|
});
|
|
123
123
|
const isWidthPreset = typeof width === "string" && ["small", "medium"].includes(width);
|
|
124
|
-
const mergedClassName = cl("aksel-modal", className, {
|
|
124
|
+
const mergedClassName = cl("aksel-modal", className, `aksel-modal--${size}`, {
|
|
125
125
|
[polyfillClassName]: needPolyfill,
|
|
126
126
|
"aksel-modal--autowidth": !width,
|
|
127
|
-
[`aksel-modal
|
|
127
|
+
[`aksel-modal--width-${width}`]: isWidthPreset,
|
|
128
128
|
"aksel-modal--top": placement === "top" && !needPolyfill,
|
|
129
129
|
});
|
|
130
130
|
const mergedStyle = Object.assign(Object.assign({}, style), (!isWidthPreset ? { width } : {}));
|
package/esm/modal/Modal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/modal/Modal.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAEL,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjE,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAUpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAC7B,CACE,
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/modal/Modal.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAEL,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjE,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAUpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAC7B,CACE,EAiBa,EACb,GAAG,EACH,EAAE;;QAnBF,EACE,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,MAAM,EACN,SAAS,EACT,iBAAiB,EAAE,cAAc,EACjC,KAAK,EACL,OAAO,EACP,WAAW,EACX,IAAI,GAAG,QAAQ,OAEJ,EADR,IAAI,cAhBT,8LAiBC,CADQ;IAIT,MAAM,QAAQ,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,MAAA,WAAW,EAAE,0CAAE,WAAW,CAAC;IAC/C,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;IAEtD,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAErD,IAAI,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,8EAA8E;QAC9E,4DAA4D;QAC5D,0EAA0E;QAC1E,IAAI,YAAY,IAAI,QAAQ,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;YACnD,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEhD,oGAAoG;YACpG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;QACD,wIAAwI;QACxI,2IAA2I;QAC3I,+EAA+E;QAC/E,iEAAiE;QACjE,IAAI,QAAQ,CAAC,OAAO,IAAI,UAAU;YAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IACxE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,SAAS,CAAC,GAAG,EAAE;QACb,iGAAiG;QACjG,wCAAwC;QACxC,sGAAsG;QACtG,IAAI,QAAQ,CAAC,OAAO,IAAI,UAAU,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACzD,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACnC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC/B,CAAC;iBAAM,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1C,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAEvB,aAAa,CAAC;QACZ,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,WAAW;QACjB,gBAAgB,EAAE,QAAQ,CAAC,OAAO;KACnC,CAAC,CAAC;IAEH,MAAM,aAAa,GACjB,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,eAAe,GAAG,EAAE,CACxB,aAAa,EACb,SAAS,EACT,gBAAgB,IAAI,EAAE,EACtB;QACE,CAAC,iBAAiB,CAAC,EAAE,YAAY;QACjC,wBAAwB,EAAE,CAAC,KAAK;QAChC,CAAC,sBAAsB,KAAK,EAAE,CAAC,EAAE,aAAa;QAC9C,kBAAkB,EAAE,SAAS,KAAK,KAAK,IAAI,CAAC,YAAY;KACzD,CACF,CAAC;IAEF,MAAM,WAAW,mCACZ,KAAK,GACL,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACrC,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,CAAmB;QAC/C,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IACH,MAAM,oBAAoB,GAA+C,CACvE,KAAK,EACL,EAAE;QACF,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAG,oBAAoB,IAAI,CAAC,YAAY,CAAC;IAErE;;OAEG;IACH,MAAM,gBAAgB,GAAG,CACvB,QAA6C,EAC7C,EAAE;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAE3D,IACE,eAAe,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;YACnD,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,EACpC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,EAAE,KAAK,KAAK,EAAE,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,iBAAiB,GAAG,CACxB,KAAqD,EACrD,EAAE;QACF,aAAa,IAAI,aAAa,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;IACvE,CAAC,CAAC;IAEF,MAAM,oBAAoB,GACxB,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM;QAC9C,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,cAAc,CAAC;IAErB,MAAM,SAAS,GAAG,CAEhB,gDACM,IAAI,IACR,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAC3D,OAAO,EACL,sBAAsB;YACpB,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,CAAC;YACjD,CAAC,CAAC,OAAO,EAEb,WAAW,EACT,sBAAsB;YACpB,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE,oBAAoB,CAAC;YACzD,CAAC,CAAC,WAAW,qBAEA,oBAAoB,EACrC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YACf;;eAEG;YACH,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,eAAe,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAED,oBAAC,oBAAoB,IACnB,YAAY,EAAE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAC9D,QAAQ,EAAE,QAAQ;YAEjB,MAAM,IAAI,CACT,oBAAC,WAAW;gBACT,MAAM,CAAC,KAAK,IAAI,CACf,oBAAC,MAAM,IAAC,SAAS,EAAC,oBAAoB,IAAE,MAAM,CAAC,KAAK,CAAU,CAC/D;gBACD,oBAAC,OAAO,IACN,IAAI,EAAE,MAAA,MAAM,CAAC,IAAI,mCAAI,QAAQ,EAC7B,KAAK,EAAC,GAAG,EACT,EAAE,EAAE,WAAW;oBAEd,MAAM,CAAC,IAAI,IAAI,CACd,8BAAM,SAAS,EAAC,0BAA0B,IACvC,MAAM,CAAC,IAAI,CACP,CACR;oBACA,MAAM,CAAC,OAAO,CACP,CACE,CACf;YAEA,QAAQ,CACY,CAChB,CACV,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,UAAU;YAAE,OAAO,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CACgB,CAAC;AAEpB,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;AAC3B,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;AACvB,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;AAE3B,eAAe,KAAK,CAAC"}
|
package/esm/modal/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navikt/ds-react",
|
|
3
|
-
"version": "8.10.
|
|
3
|
+
"version": "8.10.2",
|
|
4
4
|
"description": "React components from the Norwegian Labour and Welfare Administration.",
|
|
5
5
|
"author": "Aksel, a team part of the Norwegian Labour and Welfare Administration.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -706,8 +706,8 @@
|
|
|
706
706
|
"dependencies": {
|
|
707
707
|
"@floating-ui/react": "0.27.8",
|
|
708
708
|
"@floating-ui/react-dom": "^2.1.8",
|
|
709
|
-
"@navikt/aksel-icons": "^8.10.
|
|
710
|
-
"@navikt/ds-tokens": "^8.10.
|
|
709
|
+
"@navikt/aksel-icons": "^8.10.2",
|
|
710
|
+
"@navikt/ds-tokens": "^8.10.2",
|
|
711
711
|
"date-fns": "^4.0.0",
|
|
712
712
|
"react-day-picker": "9.14.0"
|
|
713
713
|
},
|
|
@@ -726,15 +726,15 @@
|
|
|
726
726
|
"fast-glob": "3.3.3",
|
|
727
727
|
"jscodeshift": "17.3.0",
|
|
728
728
|
"jsdom": "27.1.0",
|
|
729
|
-
"react": "19.2.
|
|
730
|
-
"react-dom": "19.2.
|
|
729
|
+
"react": "19.2.5",
|
|
730
|
+
"react-dom": "19.2.5",
|
|
731
731
|
"react-router": "^7.13.1",
|
|
732
732
|
"rimraf": "6.1.3",
|
|
733
|
-
"swr": "^2.
|
|
733
|
+
"swr": "^2.4.1",
|
|
734
734
|
"tsc-alias": "1.8.16",
|
|
735
735
|
"tsx": "^4.20.6",
|
|
736
736
|
"typescript": "6.0.2",
|
|
737
|
-
"vitest": "4.1.
|
|
737
|
+
"vitest": "4.1.4"
|
|
738
738
|
},
|
|
739
739
|
"peerDependencies": {
|
|
740
740
|
"@types/react": "^17.0.30 || ^18 || ^19",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { forwardRef,
|
|
1
|
+
import React, { forwardRef, useRef } from "react";
|
|
2
2
|
import {
|
|
3
3
|
ArrowsUpDownIcon,
|
|
4
4
|
CaretLeftCircleFillIcon,
|
|
@@ -49,7 +49,6 @@ const SORT_ICON: Record<SortDirection, React.ElementType | null> = {
|
|
|
49
49
|
/**
|
|
50
50
|
* TODO:
|
|
51
51
|
* - Plan for pinning: Move it into "settings" dialog like here: https://cloudscape.design/examples/react/table.html
|
|
52
|
-
* - Keyboard-nav breaks in headers now because of the resize-handles.
|
|
53
52
|
* Toggling `data-block-keyboard-nav` does not work since the created "grid" does not update when toggling this attribute.
|
|
54
53
|
*/
|
|
55
54
|
const DataTableColumnHeader = forwardRef<
|
|
@@ -76,15 +75,12 @@ const DataTableColumnHeader = forwardRef<
|
|
|
76
75
|
},
|
|
77
76
|
forwardedRef,
|
|
78
77
|
) => {
|
|
79
|
-
const [isOverflowing, setIsOverflowing] = React.useState(false);
|
|
80
78
|
const contentRef = React.useRef<HTMLDivElement>(null);
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
);
|
|
84
|
-
const mergedRef = useMergeRefs(forwardedRef, setThRefState);
|
|
79
|
+
const thRef = useRef<HTMLTableCellElement>(null);
|
|
80
|
+
const mergedRef = useMergeRefs(forwardedRef, thRef);
|
|
85
81
|
|
|
86
82
|
const resizeResult = useTableColumnResize({
|
|
87
|
-
|
|
83
|
+
thRef,
|
|
88
84
|
width,
|
|
89
85
|
defaultWidth,
|
|
90
86
|
minWidth,
|
|
@@ -105,12 +101,6 @@ const DataTableColumnHeader = forwardRef<
|
|
|
105
101
|
data-sortable={sortable}
|
|
106
102
|
style={resizeResult.style}
|
|
107
103
|
aria-sort={sortable ? getAriaSort(sortDirection) : undefined}
|
|
108
|
-
onPointerEnter={() => {
|
|
109
|
-
const el = contentRef.current;
|
|
110
|
-
setIsOverflowing(el ? el.scrollWidth > el.offsetWidth : false);
|
|
111
|
-
console.info("is overflowing", isOverflowing);
|
|
112
|
-
}}
|
|
113
|
-
onPointerLeave={() => setIsOverflowing(false)}
|
|
114
104
|
UNSAFE_isSelection={UNSAFE_isSelection}
|
|
115
105
|
colSpan={colSpan}
|
|
116
106
|
rowSpan={rowSpan}
|
|
@@ -147,8 +137,26 @@ const DataTableColumnHeader = forwardRef<
|
|
|
147
137
|
<button
|
|
148
138
|
{...resizeResult.resizeHandlerProps}
|
|
149
139
|
className="aksel-data-table__th-resize-handle"
|
|
140
|
+
aria-label={
|
|
141
|
+
resizeResult.isResizingWithKeyboard
|
|
142
|
+
? "Bruk pil venstre/høyre"
|
|
143
|
+
: "Endre bredde"
|
|
144
|
+
} // TODO Translate
|
|
150
145
|
data-active={resizeResult.isResizingWithKeyboard}
|
|
146
|
+
data-disable-keyboard-nav={resizeResult.isResizingWithKeyboard}
|
|
151
147
|
data-block-keyboard-nav
|
|
148
|
+
role="slider"
|
|
149
|
+
aria-valuenow={
|
|
150
|
+
typeof resizeResult.style.width === "number"
|
|
151
|
+
? resizeResult.style.width
|
|
152
|
+
: 0
|
|
153
|
+
}
|
|
154
|
+
aria-valuetext={
|
|
155
|
+
typeof resizeResult.style.width === "number" &&
|
|
156
|
+
resizeResult.isResizingWithKeyboard
|
|
157
|
+
? resizeResult.style.width.toString()
|
|
158
|
+
: "" // Needs to be blank when not in keyboard resizing mode to avoid NVDA announcing the value as part of the column heading
|
|
159
|
+
} // Need either this or aria-valuemax to get SR (at least NVDA) to announce the value
|
|
152
160
|
>
|
|
153
161
|
{resizeResult.isResizingWithKeyboard && (
|
|
154
162
|
<>
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { type DOMAttributes, useCallback, useState } from "react";
|
|
1
|
+
import { type DOMAttributes, useCallback, useRef, useState } from "react";
|
|
2
2
|
import { useControllableState } from "../../../utils/hooks";
|
|
3
3
|
import { useDataTableContext } from "../root/DataTableRoot.context";
|
|
4
4
|
|
|
5
5
|
type ColumnWidth = number | string;
|
|
6
6
|
|
|
7
7
|
type ResizeProps = {
|
|
8
|
-
ref: HTMLTableCellElement | null;
|
|
9
8
|
/**
|
|
10
9
|
* Controlled width of the column.
|
|
11
10
|
*
|
|
@@ -42,17 +41,20 @@ type ResizeProps = {
|
|
|
42
41
|
colSpan?: number;
|
|
43
42
|
};
|
|
44
43
|
|
|
45
|
-
type TableColumnResizeArgs = ResizeProps & {
|
|
44
|
+
type TableColumnResizeArgs = ResizeProps & {
|
|
45
|
+
thRef: React.RefObject<HTMLTableCellElement | null>;
|
|
46
|
+
};
|
|
46
47
|
|
|
47
48
|
type TableColumnResizeResult =
|
|
48
49
|
| {
|
|
49
|
-
style
|
|
50
|
+
style: React.CSSProperties;
|
|
50
51
|
resizeHandlerProps: {
|
|
51
52
|
onMouseDown: DOMAttributes<HTMLButtonElement>["onMouseDown"];
|
|
52
53
|
onTouchStart: DOMAttributes<HTMLButtonElement>["onTouchStart"];
|
|
53
54
|
onKeyDown: DOMAttributes<HTMLButtonElement>["onKeyDown"];
|
|
54
55
|
onBlur: DOMAttributes<HTMLButtonElement>["onBlur"];
|
|
55
56
|
onDoubleClick: DOMAttributes<HTMLButtonElement>["onDoubleClick"];
|
|
57
|
+
onClick: DOMAttributes<HTMLButtonElement>["onClick"];
|
|
56
58
|
};
|
|
57
59
|
isResizingWithKeyboard: boolean;
|
|
58
60
|
enabled: true;
|
|
@@ -72,7 +74,7 @@ function useTableColumnResize(
|
|
|
72
74
|
args: TableColumnResizeArgs,
|
|
73
75
|
): TableColumnResizeResult {
|
|
74
76
|
const {
|
|
75
|
-
|
|
77
|
+
thRef,
|
|
76
78
|
width: userWidth,
|
|
77
79
|
defaultWidth,
|
|
78
80
|
onWidthChange,
|
|
@@ -84,6 +86,9 @@ function useTableColumnResize(
|
|
|
84
86
|
|
|
85
87
|
const tableContext = useDataTableContext();
|
|
86
88
|
|
|
89
|
+
const [isResizingWithKeyboard, setIsResizingWithKeyboard] = useState(false);
|
|
90
|
+
const ignoreNextOnClick = useRef(false);
|
|
91
|
+
|
|
87
92
|
const [width, _setWidth] = useControllableState({
|
|
88
93
|
value: userWidth,
|
|
89
94
|
defaultValue: defaultWidth ?? (colSpan ?? 1) * 140,
|
|
@@ -95,69 +100,85 @@ function useTableColumnResize(
|
|
|
95
100
|
onChange: onWidthChange,
|
|
96
101
|
});
|
|
97
102
|
|
|
98
|
-
const [isResizingWithKeyboard, setIsResizingWithKeyboard] = useState(false);
|
|
99
|
-
const [, setIsResizingWithMouse] = useState(false);
|
|
100
|
-
|
|
101
103
|
const setWidth = useCallback(
|
|
102
104
|
(newWidth: number) => {
|
|
103
|
-
const currentWidth = ref?.offsetWidth;
|
|
104
|
-
if (!currentWidth) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
105
|
const min = parseWidth(minWidth) ?? 0;
|
|
109
106
|
const max = parseWidth(maxWidth) ?? Infinity;
|
|
110
107
|
const clamped = Math.min(Math.max(newWidth, min), max);
|
|
108
|
+
_setWidth(clamped);
|
|
109
|
+
},
|
|
110
|
+
[minWidth, maxWidth, _setWidth],
|
|
111
|
+
);
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
const handleOnClick: DOMAttributes<HTMLButtonElement>["onClick"] =
|
|
114
|
+
useCallback(() => {
|
|
115
|
+
// We need to use the onClick event in order to support screen readers properly,
|
|
116
|
+
// since some of them only send a mouse click when pressing enter/space.
|
|
117
|
+
// We detect a "screen reader click" by checking if we had a mouseUp event right before.
|
|
116
118
|
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
+
if (ignoreNextOnClick.current) {
|
|
120
|
+
ignoreNextOnClick.current = false;
|
|
119
121
|
return;
|
|
120
122
|
}
|
|
121
123
|
|
|
122
|
-
|
|
123
|
-
},
|
|
124
|
-
[minWidth, maxWidth, _setWidth, ref],
|
|
125
|
-
);
|
|
124
|
+
setIsResizingWithKeyboard((prev) => !prev);
|
|
125
|
+
}, []);
|
|
126
126
|
|
|
127
127
|
const handleKeyDown: DOMAttributes<HTMLButtonElement>["onKeyDown"] =
|
|
128
128
|
useCallback(
|
|
129
129
|
(event) => {
|
|
130
|
-
if (event.key === "Enter" || event.key === " ") {
|
|
131
|
-
setIsResizingWithKeyboard((prev) => !prev);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
130
|
if (!isResizingWithKeyboard) {
|
|
136
131
|
return;
|
|
137
132
|
}
|
|
133
|
+
const currentWidth = thRef.current?.offsetWidth ?? 0;
|
|
138
134
|
|
|
139
135
|
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
|
|
140
136
|
event.preventDefault();
|
|
141
|
-
|
|
142
|
-
const th = (event.target as HTMLElement).closest(
|
|
143
|
-
"th",
|
|
144
|
-
) as HTMLTableCellElement;
|
|
145
|
-
const startWidth = th.offsetWidth;
|
|
146
|
-
|
|
147
137
|
const delta = event.key === "ArrowRight" ? 20 : -20;
|
|
148
|
-
setWidth(
|
|
138
|
+
setWidth(currentWidth + delta);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (event.key === "Home") {
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
setWidth(0); // will fall back to minWidth
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (event.key === "End") {
|
|
147
|
+
event.preventDefault();
|
|
148
|
+
const autoWidth = getAutoColumnWidth(thRef);
|
|
149
|
+
if (autoWidth && autoWidth > currentWidth) {
|
|
150
|
+
setWidth(autoWidth);
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (event.key === "Escape") {
|
|
155
|
+
setIsResizingWithKeyboard(false);
|
|
149
156
|
}
|
|
150
157
|
},
|
|
151
|
-
[isResizingWithKeyboard, setWidth],
|
|
158
|
+
[isResizingWithKeyboard, setWidth, thRef],
|
|
152
159
|
);
|
|
153
160
|
|
|
154
161
|
const startResize = useCallback(
|
|
155
|
-
(
|
|
156
|
-
|
|
157
|
-
const startWidth = th.offsetWidth;
|
|
162
|
+
(startX: number) => {
|
|
163
|
+
const startWidth = thRef.current?.offsetWidth ?? 0;
|
|
158
164
|
|
|
159
165
|
function onPointerMove(clientX: number) {
|
|
160
|
-
|
|
166
|
+
const currentWidth = thRef.current?.offsetWidth ?? 0;
|
|
167
|
+
const newWidth = startWidth + (clientX - startX);
|
|
168
|
+
|
|
169
|
+
const min = parseWidth(minWidth) ?? 0;
|
|
170
|
+
const max = parseWidth(maxWidth) ?? Infinity;
|
|
171
|
+
|
|
172
|
+
if (newWidth > max) {
|
|
173
|
+
setWidth(newWidth < currentWidth ? newWidth : currentWidth);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (newWidth < min) {
|
|
177
|
+
setWidth(newWidth > currentWidth ? newWidth : currentWidth);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
setWidth(newWidth);
|
|
161
182
|
}
|
|
162
183
|
|
|
163
184
|
function onMouseMove(e: MouseEvent) {
|
|
@@ -172,28 +193,26 @@ function useTableColumnResize(
|
|
|
172
193
|
function cleanup() {
|
|
173
194
|
document.removeEventListener("mousemove", onMouseMove);
|
|
174
195
|
document.removeEventListener("touchmove", onTouchMove);
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
196
|
+
setIsResizingWithKeyboard(false);
|
|
197
|
+
|
|
198
|
+
// We only want onClick to trigger when using the keyboard
|
|
199
|
+
// (we use onClick b.c. keyDown doesn't fire when using a screen reader)
|
|
200
|
+
ignoreNextOnClick.current = true;
|
|
179
201
|
}
|
|
180
202
|
|
|
181
203
|
document.addEventListener("mousemove", onMouseMove);
|
|
182
204
|
document.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
183
|
-
document.addEventListener("mouseup", cleanup);
|
|
184
|
-
document.addEventListener("touchend", cleanup);
|
|
185
|
-
document.addEventListener("touchcancel", cleanup);
|
|
205
|
+
document.addEventListener("mouseup", cleanup, { once: true });
|
|
206
|
+
document.addEventListener("touchend", cleanup, { once: true });
|
|
207
|
+
document.addEventListener("touchcancel", cleanup, { once: true });
|
|
186
208
|
},
|
|
187
|
-
[setWidth],
|
|
209
|
+
[maxWidth, minWidth, setWidth, thRef],
|
|
188
210
|
);
|
|
189
211
|
|
|
190
212
|
const handleMouseDown: DOMAttributes<HTMLButtonElement>["onMouseDown"] =
|
|
191
213
|
useCallback(
|
|
192
214
|
(event) => {
|
|
193
|
-
|
|
194
|
-
"th",
|
|
195
|
-
) as HTMLTableCellElement;
|
|
196
|
-
startResize(th, event.clientX);
|
|
215
|
+
startResize(event.clientX);
|
|
197
216
|
},
|
|
198
217
|
[startResize],
|
|
199
218
|
);
|
|
@@ -201,38 +220,19 @@ function useTableColumnResize(
|
|
|
201
220
|
const handleTouchStart: DOMAttributes<HTMLButtonElement>["onTouchStart"] =
|
|
202
221
|
useCallback(
|
|
203
222
|
(event) => {
|
|
204
|
-
|
|
205
|
-
"th",
|
|
206
|
-
) as HTMLTableCellElement;
|
|
207
|
-
startResize(th, event.touches[0].clientX);
|
|
223
|
+
startResize(event.touches[0].clientX);
|
|
208
224
|
},
|
|
209
225
|
[startResize],
|
|
210
226
|
);
|
|
211
227
|
|
|
212
|
-
|
|
213
|
-
* TODO: Do we even want this?
|
|
214
|
-
* - + 32px padding is hardcoded now, fix this
|
|
215
|
-
* - Need to find widest element in column, not the header itself.
|
|
216
|
-
* - Should doubleclick just reset to defaultWidth? Or add a autoWidth prop.
|
|
217
|
-
*/
|
|
228
|
+
// Auto-size column to fit content on double click. NB: Doesn't work with block content!
|
|
218
229
|
const handleDoubleClick: DOMAttributes<HTMLButtonElement>["onDoubleClick"] =
|
|
219
|
-
useCallback(
|
|
220
|
-
(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const contentEl = th.getElementsByClassName(
|
|
226
|
-
"aksel-data-table__th-content",
|
|
227
|
-
)[0];
|
|
228
|
-
const range = document.createRange();
|
|
229
|
-
range.selectNodeContents(contentEl);
|
|
230
|
-
const contentWidth = range.getBoundingClientRect().width;
|
|
231
|
-
|
|
232
|
-
setWidth(contentWidth + 32);
|
|
233
|
-
},
|
|
234
|
-
[setWidth],
|
|
235
|
-
);
|
|
230
|
+
useCallback(() => {
|
|
231
|
+
const newColumnWidth = getAutoColumnWidth(thRef);
|
|
232
|
+
if (newColumnWidth) {
|
|
233
|
+
setWidth(newColumnWidth);
|
|
234
|
+
}
|
|
235
|
+
}, [setWidth, thRef]);
|
|
236
236
|
|
|
237
237
|
if (tableContext.layout !== "fixed") {
|
|
238
238
|
return {
|
|
@@ -252,6 +252,7 @@ function useTableColumnResize(
|
|
|
252
252
|
onKeyDown: handleKeyDown,
|
|
253
253
|
onBlur: () => setIsResizingWithKeyboard(false),
|
|
254
254
|
onDoubleClick: handleDoubleClick,
|
|
255
|
+
onClick: handleOnClick,
|
|
255
256
|
},
|
|
256
257
|
isResizingWithKeyboard,
|
|
257
258
|
enabled: true,
|
|
@@ -272,5 +273,77 @@ function parseWidth(width: ColumnWidth | undefined): number | undefined {
|
|
|
272
273
|
return undefined;
|
|
273
274
|
}
|
|
274
275
|
|
|
276
|
+
function getAutoColumnWidth(
|
|
277
|
+
thRef: React.RefObject<HTMLTableCellElement | null>,
|
|
278
|
+
) {
|
|
279
|
+
const th = thRef.current!;
|
|
280
|
+
const thContent = th.querySelector(".aksel-data-table__th-content");
|
|
281
|
+
const thPaddingEl = th.querySelector("div");
|
|
282
|
+
const rows = th.closest("table")?.querySelectorAll("tbody tr, tfoot tr");
|
|
283
|
+
if (!thContent || !thPaddingEl || !rows) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Find needed width for header cell
|
|
288
|
+
const contentWidth = thContent.scrollWidth;
|
|
289
|
+
const paddingElStyle = window.getComputedStyle(thPaddingEl);
|
|
290
|
+
const thInlinePadding =
|
|
291
|
+
parseInt(paddingElStyle.paddingLeft, 10) +
|
|
292
|
+
parseInt(paddingElStyle.paddingRight, 10);
|
|
293
|
+
let newColumnWidth = contentWidth + thInlinePadding;
|
|
294
|
+
|
|
295
|
+
// Find column position
|
|
296
|
+
let columnPosition = 1;
|
|
297
|
+
let prevSibling = th.previousElementSibling;
|
|
298
|
+
while (prevSibling) {
|
|
299
|
+
columnPosition += (prevSibling as HTMLTableCellElement).colSpan;
|
|
300
|
+
prevSibling = prevSibling.previousElementSibling;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Find needed width for each cell in column in tbody and tfoot
|
|
304
|
+
const range = document.createRange();
|
|
305
|
+
let skipRows = 0;
|
|
306
|
+
for (const row of rows) {
|
|
307
|
+
// Skip rows where the cell in this column is covered by a rowspan from a previous row
|
|
308
|
+
if (skipRows > 0) {
|
|
309
|
+
skipRows--;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Find cell
|
|
314
|
+
let cell = row.firstChild as HTMLTableCellElement;
|
|
315
|
+
let currentPosition = cell.colSpan;
|
|
316
|
+
while (columnPosition > currentPosition && cell.nextElementSibling) {
|
|
317
|
+
cell = cell.nextElementSibling as HTMLTableCellElement;
|
|
318
|
+
currentPosition += cell.colSpan;
|
|
319
|
+
}
|
|
320
|
+
skipRows = cell.rowSpan - 1;
|
|
321
|
+
|
|
322
|
+
// Find needed width
|
|
323
|
+
const cellContent = cell.firstChild as HTMLElement;
|
|
324
|
+
range.selectNodeContents(cellContent);
|
|
325
|
+
const cellContentWidth = range.getBoundingClientRect().width;
|
|
326
|
+
const contentElStyle = window.getComputedStyle(cellContent);
|
|
327
|
+
const inlinePadding =
|
|
328
|
+
parseInt(contentElStyle.paddingLeft, 10) +
|
|
329
|
+
parseInt(contentElStyle.paddingRight, 10);
|
|
330
|
+
const widthNeededForThisCell =
|
|
331
|
+
(cellContentWidth + inlinePadding) / cell.colSpan;
|
|
332
|
+
if (widthNeededForThisCell > newColumnWidth) {
|
|
333
|
+
newColumnWidth = widthNeededForThisCell;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Make sure new width is not wider than the table container since that would be impractical
|
|
338
|
+
const container = th.closest("div");
|
|
339
|
+
const maxColWidth =
|
|
340
|
+
(container?.offsetWidth || document.documentElement.clientWidth * 0.9) *
|
|
341
|
+
0.95;
|
|
342
|
+
|
|
343
|
+
return newColumnWidth > maxColWidth
|
|
344
|
+
? Math.floor(maxColWidth)
|
|
345
|
+
: Math.ceil(newColumnWidth);
|
|
346
|
+
}
|
|
347
|
+
|
|
275
348
|
export { useTableColumnResize };
|
|
276
349
|
export type { ResizeProps };
|