@navikt/ds-react 0.17.14 → 0.17.17
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/index.js +1 -0
- package/cjs/read-more/ReadMore.js +1 -1
- package/cjs/table/ExpandableRow.js +76 -0
- package/cjs/table/Table.js +2 -0
- package/cjs/tooltip/Tooltip.js +153 -0
- package/cjs/tooltip/index.js +23 -0
- package/cjs/tooltip/package.json +6 -0
- package/cjs/tooltip/portal.js +17 -0
- package/cjs/util/index.js +11 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/read-more/ReadMore.js +1 -1
- package/esm/read-more/ReadMore.js.map +1 -1
- package/esm/table/ExpandableRow.d.ts +31 -0
- package/esm/table/ExpandableRow.js +49 -0
- package/esm/table/ExpandableRow.js.map +1 -0
- package/esm/table/Row.d.ts +1 -1
- package/esm/table/Table.d.ts +2 -0
- package/esm/table/Table.js +2 -0
- package/esm/table/Table.js.map +1 -1
- package/esm/tooltip/Tooltip.d.ts +51 -0
- package/esm/tooltip/Tooltip.js +126 -0
- package/esm/tooltip/Tooltip.js.map +1 -0
- package/esm/tooltip/index.d.ts +2 -0
- package/esm/tooltip/index.js +3 -0
- package/esm/tooltip/index.js.map +1 -0
- package/esm/tooltip/portal.d.ts +5 -0
- package/esm/tooltip/portal.js +13 -0
- package/esm/tooltip/portal.js.map +1 -0
- package/esm/util/index.d.ts +1 -0
- package/esm/util/index.js +9 -0
- package/esm/util/index.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +1 -0
- package/src/read-more/ReadMore.tsx +1 -0
- package/src/table/ExpandableRow.tsx +115 -0
- package/src/table/Row.tsx +1 -1
- package/src/table/Table.tsx +3 -0
- package/src/table/stories/table-expandable.stories.tsx +201 -0
- package/src/tooltip/Tooltip.tsx +301 -0
- package/src/tooltip/index.ts +2 -0
- package/src/tooltip/portal.tsx +15 -0
- package/src/tooltip/tooltip.stories.tsx +144 -0
- package/src/util/index.ts +14 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import cl from "classnames";
|
|
13
|
+
import React, { cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
14
|
+
import { composeEventHandlers, Detail, useEventListener } from "..";
|
|
15
|
+
import { useFloating, arrow as flArrow, shift, autoUpdate, flip, hide, } from "@floating-ui/react-dom";
|
|
16
|
+
import mergeRefs from "react-merge-refs";
|
|
17
|
+
import Portal from "./portal";
|
|
18
|
+
import { useId } from "../util";
|
|
19
|
+
const Tooltip = forwardRef((_a, ref) => {
|
|
20
|
+
var { children, className, arrow: _arrow = true, placement: _placement = "top", open, defaultOpen = false, offset: _offset, content, delay = 150, id, keys, maxChar = 80 } = _a, rest = __rest(_a, ["children", "className", "arrow", "placement", "open", "defaultOpen", "offset", "content", "delay", "id", "keys", "maxChar"]);
|
|
21
|
+
const arrowRef = useRef(null);
|
|
22
|
+
const [isOpen, setIsOpen] = useState(defaultOpen);
|
|
23
|
+
const openTimerRef = useRef(0);
|
|
24
|
+
const leaveTimerRef = useRef(0);
|
|
25
|
+
const isMouseDownRef = useRef(false);
|
|
26
|
+
const ariaId = useId(id);
|
|
27
|
+
const { x, y, update, placement, refs, middlewareData: { arrow: { x: arrowX, y: arrowY } = {}, hide: { referenceHidden } = {}, }, } = useFloating({
|
|
28
|
+
placement: _placement,
|
|
29
|
+
middleware: [
|
|
30
|
+
shift(),
|
|
31
|
+
flip({ padding: 5, fallbackPlacements: ["bottom", "top"] }),
|
|
32
|
+
flArrow({ element: arrowRef, padding: 5 }),
|
|
33
|
+
hide(),
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
/* https://floating-ui.com/docs/react-dom#updating */
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!refs.reference.current || !refs.floating.current) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Only call this when the floating element is rendered
|
|
42
|
+
return autoUpdate(refs.reference.current, refs.floating.current, update);
|
|
43
|
+
}, [refs.reference, refs.floating, update, open, isOpen]);
|
|
44
|
+
const handleOpen = useCallback(() => {
|
|
45
|
+
window.clearTimeout(openTimerRef.current);
|
|
46
|
+
window.clearTimeout(leaveTimerRef.current);
|
|
47
|
+
setIsOpen(true);
|
|
48
|
+
}, [setIsOpen]);
|
|
49
|
+
const handleDelayedOpen = useCallback(() => {
|
|
50
|
+
window.clearTimeout(openTimerRef.current);
|
|
51
|
+
window.clearTimeout(leaveTimerRef.current);
|
|
52
|
+
openTimerRef.current = window.setTimeout(() => {
|
|
53
|
+
setIsOpen(true);
|
|
54
|
+
}, delay);
|
|
55
|
+
}, [delay, setIsOpen]);
|
|
56
|
+
const handleClose = useCallback(() => {
|
|
57
|
+
window.clearTimeout(openTimerRef.current);
|
|
58
|
+
leaveTimerRef.current = window.setTimeout(() => {
|
|
59
|
+
setIsOpen(false);
|
|
60
|
+
}, 50);
|
|
61
|
+
}, [setIsOpen]);
|
|
62
|
+
const handleMouseUp = useCallback(() => (isMouseDownRef.current = false), []);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
65
|
+
return () => window.clearTimeout(openTimerRef.current);
|
|
66
|
+
}, []);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
return () => document.removeEventListener("mouseup", handleMouseUp);
|
|
69
|
+
}, [handleMouseUp]);
|
|
70
|
+
useEventListener("keydown", useCallback((e) => e.key === "Escape" && handleClose(), [handleClose]), document);
|
|
71
|
+
/* https://floating-ui.com/docs/react-dom#stable-ref-prop */
|
|
72
|
+
const stableRef = useMemo(() => mergeRefs([ref, refs.floating]), [
|
|
73
|
+
ref,
|
|
74
|
+
refs.floating,
|
|
75
|
+
]);
|
|
76
|
+
if (!children ||
|
|
77
|
+
(children === null || children === void 0 ? void 0 : children.type) === React.Fragment ||
|
|
78
|
+
children === React.Fragment) {
|
|
79
|
+
console.error("<Tooltip> children needs to be a single ReactElement and not <React.Fragment/>/<></>");
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
if ((content === null || content === void 0 ? void 0 : content.length) > maxChar) {
|
|
83
|
+
console.error(`Because of strict accessibility concers we encourage all Tooltips to have less than 80 characters. Can be overwritten with the maxChar-prop`);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return (React.createElement(React.Fragment, null,
|
|
87
|
+
cloneElement(children, Object.assign(Object.assign({}, children.props), { "aria-describedby": open || isOpen
|
|
88
|
+
? cl(ariaId, children === null || children === void 0 ? void 0 : children.props["aria-describedby"])
|
|
89
|
+
: children === null || children === void 0 ? void 0 : children.props["aria-describedby"], ref: mergeRefs([children.ref, refs.reference]), onMouseEnter: composeEventHandlers(children.props.onMouseEnter, handleDelayedOpen), onMouseLeave: composeEventHandlers(children.props.onMouseLeave, handleClose), onMouseDown: composeEventHandlers(children.props.onMouseDown, () => {
|
|
90
|
+
isMouseDownRef.current = true;
|
|
91
|
+
document.addEventListener("mouseup", handleMouseUp, { once: true });
|
|
92
|
+
}), onFocus: composeEventHandlers(children.props.onFocus, () => !isMouseDownRef.current && handleOpen()), onBlur: composeEventHandlers(children.props.onBlur, handleClose) })),
|
|
93
|
+
(open !== null && open !== void 0 ? open : isOpen) && (React.createElement(Portal, null,
|
|
94
|
+
React.createElement("div", Object.assign({ ref: stableRef }, rest, { onMouseEnter: handleOpen, onMouseLeave: handleClose, role: "tooltip", id: ariaId, style: {
|
|
95
|
+
position: "absolute",
|
|
96
|
+
top: y !== null && y !== void 0 ? y : "",
|
|
97
|
+
left: x !== null && x !== void 0 ? x : "",
|
|
98
|
+
visibility: referenceHidden ? "hidden" : "visible",
|
|
99
|
+
}, "data-side": placement, className: cl("navds-tooltip", "navds-detail navds-detail--small", className) }),
|
|
100
|
+
React.createElement("div", { className: "navds-tooltip__inner", style: {
|
|
101
|
+
[{
|
|
102
|
+
top: "marginBottom",
|
|
103
|
+
right: "marginLeft",
|
|
104
|
+
bottom: "marginTop",
|
|
105
|
+
left: "marginRight",
|
|
106
|
+
}[placement]]: _offset ? _offset : _arrow ? 10 : 2,
|
|
107
|
+
} },
|
|
108
|
+
content,
|
|
109
|
+
keys && (React.createElement("span", { className: "navds-tooltip__keys" }, keys.map((key) => (React.createElement(Detail, { size: "small", as: "kbd", key: key, className: "navds-tooltip__key" }, key))))),
|
|
110
|
+
_arrow && (React.createElement("div", { ref: (node) => {
|
|
111
|
+
arrowRef.current = node;
|
|
112
|
+
}, className: "navds-tooltip__arrow", style: {
|
|
113
|
+
left: arrowX != null ? `${arrowX}px` : "",
|
|
114
|
+
top: arrowY != null ? `${arrowY}px` : "",
|
|
115
|
+
right: "",
|
|
116
|
+
bottom: "",
|
|
117
|
+
[{
|
|
118
|
+
top: "bottom",
|
|
119
|
+
right: "left",
|
|
120
|
+
bottom: "top",
|
|
121
|
+
left: "right",
|
|
122
|
+
}[placement]]: "-3.5px",
|
|
123
|
+
} }))))))));
|
|
124
|
+
});
|
|
125
|
+
export default Tooltip;
|
|
126
|
+
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sourceRoot":"","sources":["../../src/tooltip/Tooltip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tooltip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/* https://github.com/radix-ui/primitives/blob/main/packages/react/portal/src/Portal.tsx */
|
|
2
|
+
import ReactDOM from "react-dom";
|
|
3
|
+
const Portal = ({ children }) => {
|
|
4
|
+
var _a;
|
|
5
|
+
const hostElement = (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) === null || _a === void 0 ? void 0 : _a.body;
|
|
6
|
+
if (hostElement) {
|
|
7
|
+
return ReactDOM.createPortal(children, hostElement);
|
|
8
|
+
}
|
|
9
|
+
// bail out of ssr
|
|
10
|
+
return null;
|
|
11
|
+
};
|
|
12
|
+
export default Portal;
|
|
13
|
+
//# sourceMappingURL=portal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/tooltip/portal.tsx"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;;IAC9B,MAAM,WAAW,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,0CAAE,IAAI,CAAC;IAE/C,IAAI,WAAW,EAAE;QACf,OAAO,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;KACrD;IAED,kBAAkB;IAClB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/esm/util/index.d.ts
CHANGED
|
@@ -6,3 +6,4 @@ export interface ListenerT {
|
|
|
6
6
|
removeEventListener(name: string, handler: (event?: any) => void, ...args: any[]): any;
|
|
7
7
|
}
|
|
8
8
|
export declare const useEventListener: <T extends ListenerT>(name: Parameters<ListenerT["addEventListener"]>[0], handler: Parameters<ListenerT["addEventListener"]>[1], target?: Window | T | null) => void;
|
|
9
|
+
export declare const composeEventHandlers: <E>(originalEventHandler?: ((event: E) => void) | undefined, ourEventHandler?: ((event: E) => void) | undefined) => (event: E) => void;
|
package/esm/util/index.js
CHANGED
|
@@ -16,4 +16,13 @@ export const useEventListener = (name, handler, target = window) => {
|
|
|
16
16
|
};
|
|
17
17
|
}, [name, handler, target]);
|
|
18
18
|
};
|
|
19
|
+
/* https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx */
|
|
20
|
+
export const composeEventHandlers = (originalEventHandler, ourEventHandler) => {
|
|
21
|
+
return function handleEvent(event) {
|
|
22
|
+
originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);
|
|
23
|
+
if (!event.defaultPrevented) {
|
|
24
|
+
return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
};
|
|
19
28
|
//# sourceMappingURL=index.js.map
|
package/esm/util/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;KAChB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACvC,MAAM,CACL,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,iCAClB,GAAG,KACN,CAAC,GAAG,CAAC,EAAE,KAAK,IACZ,EACF,EAAE,CACH,CAAC;AAgBN,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAkD,EAClD,OAAqD,EACrD,SAA4B,MAAM,EAC5B,EAAE;IACR,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;QACD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;KAChB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACvC,MAAM,CACL,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,iCAClB,GAAG,KACN,CAAC,GAAG,CAAC,EAAE,KAAK,IACZ,EACF,EAAE,CACH,CAAC;AAgBN,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAkD,EAClD,OAAqD,EACrD,SAA4B,MAAM,EAC5B,EAAE;IACR,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;QACD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,oBAAyC,EACzC,eAAoC,EACpC,EAAE;IACF,OAAO,SAAS,WAAW,CAAC,KAAQ;QAClC,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,KAAK,CAAC,CAAC;QAE9B,IAAI,CAAG,KAA2B,CAAC,gBAAgB,EAAE;YACnD,OAAO,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAG,KAAK,CAAC,CAAC;SACjC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navikt/ds-react",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.17",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "NAV designsystem react components",
|
|
6
6
|
"author": "NAV Designsystem team",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"test": "jest"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
+
"@floating-ui/react-dom": "0.6.0",
|
|
37
38
|
"@material-ui/core": "^4.12.3",
|
|
38
39
|
"@navikt/ds-icons": "^0.8.6",
|
|
39
40
|
"@popperjs/core": "^2.10.1",
|
|
@@ -68,5 +69,5 @@
|
|
|
68
69
|
"@types/react": "^17.0.30",
|
|
69
70
|
"react": "^17.0.0"
|
|
70
71
|
},
|
|
71
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "fcbd614a3444afa7fd07c0c133cc754206e5f106"
|
|
72
73
|
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React, { forwardRef, useState } from "react";
|
|
2
|
+
import cl from "classnames";
|
|
3
|
+
import Row, { RowProps } from "./Row";
|
|
4
|
+
import DataCell from "./DataCell";
|
|
5
|
+
import { UnmountClosed } from "react-collapse";
|
|
6
|
+
import { Expand, ExpandFilled } from "@navikt/ds-icons";
|
|
7
|
+
import { useId } from "..";
|
|
8
|
+
|
|
9
|
+
interface ExpandableRowProps extends RowProps {
|
|
10
|
+
/**
|
|
11
|
+
* Content of the expanded row
|
|
12
|
+
*/
|
|
13
|
+
content: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Placement of toggle button
|
|
16
|
+
* @default "left"
|
|
17
|
+
*/
|
|
18
|
+
togglePlacement?: "left" | "right";
|
|
19
|
+
/**
|
|
20
|
+
* Opens component if 'true', closes if 'false'
|
|
21
|
+
* Using this props removes automatic control of open-state
|
|
22
|
+
*/
|
|
23
|
+
open?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Opened state default
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
defaultOpen?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Change handler for open
|
|
31
|
+
*/
|
|
32
|
+
onOpenChange?: (open: boolean) => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ExpandableRowType
|
|
36
|
+
extends React.ForwardRefExoticComponent<
|
|
37
|
+
ExpandableRowProps & React.RefAttributes<HTMLTableRowElement>
|
|
38
|
+
> {}
|
|
39
|
+
|
|
40
|
+
const ExpandableRow: ExpandableRowType = forwardRef(
|
|
41
|
+
(
|
|
42
|
+
{
|
|
43
|
+
className,
|
|
44
|
+
children,
|
|
45
|
+
content,
|
|
46
|
+
togglePlacement = "left",
|
|
47
|
+
defaultOpen = false,
|
|
48
|
+
open,
|
|
49
|
+
onOpenChange,
|
|
50
|
+
...rest
|
|
51
|
+
},
|
|
52
|
+
ref
|
|
53
|
+
) => {
|
|
54
|
+
const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);
|
|
55
|
+
const id = `expandable-${useId()}`;
|
|
56
|
+
|
|
57
|
+
const isOpen = open ?? internalOpen;
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<>
|
|
61
|
+
<Row
|
|
62
|
+
{...rest}
|
|
63
|
+
ref={ref}
|
|
64
|
+
className={cl("navds-table__expandable-row", className, {
|
|
65
|
+
"navds-table__expandable-row--open": isOpen,
|
|
66
|
+
})}
|
|
67
|
+
>
|
|
68
|
+
{togglePlacement === "right" && children}
|
|
69
|
+
<DataCell
|
|
70
|
+
className={cl("navds-table__toggle-expand-cell", {
|
|
71
|
+
"navds-table__toggle-expand-cell--open": isOpen,
|
|
72
|
+
})}
|
|
73
|
+
>
|
|
74
|
+
<button
|
|
75
|
+
className="navds-table__toggle-expand-button"
|
|
76
|
+
aria-controls={id}
|
|
77
|
+
aria-expanded={isOpen}
|
|
78
|
+
onClick={() => {
|
|
79
|
+
onOpenChange?.(!isOpen);
|
|
80
|
+
if (open === undefined) {
|
|
81
|
+
setInternalOpen((open) => !open);
|
|
82
|
+
}
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
<Expand
|
|
86
|
+
className="navds-table__expandable-icon"
|
|
87
|
+
title={isOpen ? "Vis mindre" : "Vis mer"}
|
|
88
|
+
/>
|
|
89
|
+
<ExpandFilled
|
|
90
|
+
className="navds-table__expandable-icon navds-table__expandable-icon--filled"
|
|
91
|
+
title={isOpen ? "Vis mindre" : "Vis mer"}
|
|
92
|
+
/>
|
|
93
|
+
</button>
|
|
94
|
+
</DataCell>
|
|
95
|
+
{togglePlacement === "left" && children}
|
|
96
|
+
</Row>
|
|
97
|
+
<tr className="navds-table__expanded-row" aria-hidden={!isOpen} id={id}>
|
|
98
|
+
<td colSpan={999} className="navds-table__expanded-row-cell">
|
|
99
|
+
<UnmountClosed
|
|
100
|
+
isOpened={isOpen}
|
|
101
|
+
theme={{
|
|
102
|
+
collapse: "navds-table__expanded-row-collapse",
|
|
103
|
+
content: "navds-table__expanded-row-content",
|
|
104
|
+
}}
|
|
105
|
+
>
|
|
106
|
+
{content}
|
|
107
|
+
</UnmountClosed>
|
|
108
|
+
</td>
|
|
109
|
+
</tr>
|
|
110
|
+
</>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
export default ExpandableRow;
|
package/src/table/Row.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { forwardRef } from "react";
|
|
2
2
|
import cl from "classnames";
|
|
3
3
|
|
|
4
|
-
interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
|
|
4
|
+
export interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
|
|
5
5
|
/**
|
|
6
6
|
* Row is selected
|
|
7
7
|
* @default false
|
package/src/table/Table.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import Row, { RowType } from "./Row";
|
|
|
6
6
|
import ColumnHeader, { ColumnHeaderType } from "./ColumnHeader";
|
|
7
7
|
import HeaderCell, { HeaderCellType } from "./HeaderCell";
|
|
8
8
|
import DataCell, { DataCellType } from "./DataCell";
|
|
9
|
+
import ExpandableRow, { ExpandableRowType } from "./ExpandableRow";
|
|
9
10
|
|
|
10
11
|
export interface SortState {
|
|
11
12
|
orderBy: string;
|
|
@@ -44,6 +45,7 @@ export interface TableType
|
|
|
44
45
|
DataCell: DataCellType;
|
|
45
46
|
HeaderCell: HeaderCellType;
|
|
46
47
|
ColumnHeader: ColumnHeaderType;
|
|
48
|
+
ExpandableRow: ExpandableRowType;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
export interface TableContextProps {
|
|
@@ -84,5 +86,6 @@ Table.Row = Row;
|
|
|
84
86
|
Table.ColumnHeader = ColumnHeader;
|
|
85
87
|
Table.HeaderCell = HeaderCell;
|
|
86
88
|
Table.DataCell = DataCell;
|
|
89
|
+
Table.ExpandableRow = ExpandableRow;
|
|
87
90
|
|
|
88
91
|
export default Table;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Table } from "..";
|
|
3
|
+
import { Link } from "../..";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: "ds-react/table",
|
|
7
|
+
component: Table,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const Expandable = () => {
|
|
11
|
+
const [open, setOpen] = useState(false);
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
<Table>
|
|
16
|
+
<Table.Header>
|
|
17
|
+
<Table.Row>
|
|
18
|
+
{columns.map(({ key, name }) => (
|
|
19
|
+
<Table.HeaderCell key={key}>{name}</Table.HeaderCell>
|
|
20
|
+
))}
|
|
21
|
+
<Table.HeaderCell />
|
|
22
|
+
</Table.Row>
|
|
23
|
+
</Table.Header>
|
|
24
|
+
<Table.Body>
|
|
25
|
+
{data.map((data) => (
|
|
26
|
+
<Table.ExpandableRow
|
|
27
|
+
content={data.content}
|
|
28
|
+
key={data.name}
|
|
29
|
+
togglePlacement="right"
|
|
30
|
+
>
|
|
31
|
+
{columns.map(({ key }) => (
|
|
32
|
+
<Table.DataCell key={key}>{data[key]}</Table.DataCell>
|
|
33
|
+
))}
|
|
34
|
+
</Table.ExpandableRow>
|
|
35
|
+
))}
|
|
36
|
+
</Table.Body>
|
|
37
|
+
</Table>
|
|
38
|
+
<h2>defaultOpen/controlled + small</h2>
|
|
39
|
+
<Table size="small">
|
|
40
|
+
<Table.Header>
|
|
41
|
+
<Table.Row>
|
|
42
|
+
<Table.HeaderCell />
|
|
43
|
+
{columns.map(({ key, name }) => (
|
|
44
|
+
<Table.HeaderCell key={key}>{name}</Table.HeaderCell>
|
|
45
|
+
))}
|
|
46
|
+
</Table.Row>
|
|
47
|
+
</Table.Header>
|
|
48
|
+
<Table.Body>
|
|
49
|
+
{data.slice(0, 1).map((data) => (
|
|
50
|
+
<Table.ExpandableRow
|
|
51
|
+
content={data.content}
|
|
52
|
+
key={data.name}
|
|
53
|
+
defaultOpen
|
|
54
|
+
>
|
|
55
|
+
{columns.map(({ key }) => (
|
|
56
|
+
<Table.DataCell key={key}>{data[key]}</Table.DataCell>
|
|
57
|
+
))}
|
|
58
|
+
</Table.ExpandableRow>
|
|
59
|
+
))}
|
|
60
|
+
{data.slice(1, 2).map((data) => (
|
|
61
|
+
<Table.ExpandableRow
|
|
62
|
+
content={data.content}
|
|
63
|
+
key={data.name}
|
|
64
|
+
open={open}
|
|
65
|
+
onOpenChange={(open) => setOpen(open)}
|
|
66
|
+
>
|
|
67
|
+
{columns.map(({ key }) => (
|
|
68
|
+
<Table.DataCell key={key}>{data[key]}</Table.DataCell>
|
|
69
|
+
))}
|
|
70
|
+
</Table.ExpandableRow>
|
|
71
|
+
))}
|
|
72
|
+
</Table.Body>
|
|
73
|
+
</Table>
|
|
74
|
+
</>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const columns = [
|
|
79
|
+
{
|
|
80
|
+
name: "Navn",
|
|
81
|
+
key: "name",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "Favoritt dyr",
|
|
85
|
+
key: "animal",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: "Favoritt farge",
|
|
89
|
+
key: "color",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "Minst favoritt dyr",
|
|
93
|
+
key: "leastAnimal",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "Minst favoritt farge",
|
|
97
|
+
key: "leastColor",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "Status",
|
|
101
|
+
key: "status",
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
const data = [
|
|
106
|
+
{
|
|
107
|
+
name: "Ola Conny Brakkestad",
|
|
108
|
+
animal: "Ku",
|
|
109
|
+
color: "Brun",
|
|
110
|
+
leastAnimal: "Sel",
|
|
111
|
+
leastColor: "Lyseblå",
|
|
112
|
+
status: "Inaktiv",
|
|
113
|
+
content: (
|
|
114
|
+
<>
|
|
115
|
+
Ola Conny Brakkestad sier "hei". Her er litt innhold med en{" "}
|
|
116
|
+
<Link href="#">link.</Link>
|
|
117
|
+
</>
|
|
118
|
+
),
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
{
|
|
122
|
+
name: "Henriette Kristensen",
|
|
123
|
+
animal: "Bjørn",
|
|
124
|
+
color: "Hvit",
|
|
125
|
+
leastAnimal: "Grevling",
|
|
126
|
+
leastColor: "Transparent",
|
|
127
|
+
status: <Link href="http://example.com">Hissig</Link>,
|
|
128
|
+
content: (
|
|
129
|
+
<>
|
|
130
|
+
Henriette Kristensen sier "hei". Her er litt innhold med en{" "}
|
|
131
|
+
<Link href="http://example.com">lenke</Link>. I forhold til en betydelig
|
|
132
|
+
avveining synliggjøres potensialet med sikte på satsingsområdet. Gitt en
|
|
133
|
+
manglende avveining synliggjøres instrumentet på bakgrunn av forholdene.
|
|
134
|
+
Under hensyntagen til en inkluderende avveining stimuleres resultatene
|
|
135
|
+
med henblikk på løsningen. På grunn av en integrert organisasjon
|
|
136
|
+
initieres kunnskapene eller sagt på en annen måte: evalueringen. Grunnet
|
|
137
|
+
en gjeldende målsetting dokumenteres relasjonene hva angår egenarten.
|
|
138
|
+
</>
|
|
139
|
+
),
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
{
|
|
143
|
+
name: "Suki Clydesdale",
|
|
144
|
+
animal: "Sel",
|
|
145
|
+
color: "Grønn",
|
|
146
|
+
leastAnimal: "Serval",
|
|
147
|
+
leastColor: "Rosa",
|
|
148
|
+
status: "Deaktivert",
|
|
149
|
+
content: (
|
|
150
|
+
<>
|
|
151
|
+
Suki Clydesdale sier "hei". Her er litt innhold med en{" "}
|
|
152
|
+
<Link href="http://example.com">link</Link>.
|
|
153
|
+
</>
|
|
154
|
+
),
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
{
|
|
158
|
+
name: "Hans-Hermann Hoppe",
|
|
159
|
+
animal: "Mudkip",
|
|
160
|
+
color: "Oransje",
|
|
161
|
+
leastAnimal: "Skare",
|
|
162
|
+
leastColor: "Hvit",
|
|
163
|
+
status: <Link href="#">Starter</Link>,
|
|
164
|
+
content: (
|
|
165
|
+
<>
|
|
166
|
+
Hans-Hermann Hoppe sier "hei". Her er litt innhold med en{" "}
|
|
167
|
+
<Link href="http://example.com">link</Link>.
|
|
168
|
+
</>
|
|
169
|
+
),
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
{
|
|
173
|
+
name: "Max Kraft",
|
|
174
|
+
animal: "Løve",
|
|
175
|
+
color: "Blå",
|
|
176
|
+
leastAnimal: "Hund",
|
|
177
|
+
leastColor: "Cyan",
|
|
178
|
+
status: <Link href="#">Eksplodert</Link>,
|
|
179
|
+
content: (
|
|
180
|
+
<>
|
|
181
|
+
Max Kraft sier "hei". Her er litt innhold med en{" "}
|
|
182
|
+
<Link href="http://example.com">link</Link>.
|
|
183
|
+
</>
|
|
184
|
+
),
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
{
|
|
188
|
+
name: "Pat Ole",
|
|
189
|
+
animal: "Bjørnedyr",
|
|
190
|
+
color: "Gul",
|
|
191
|
+
leastAnimal: "Meitemark",
|
|
192
|
+
leastColor: "Svart",
|
|
193
|
+
status: <Link href="#">Gunstig</Link>,
|
|
194
|
+
content: (
|
|
195
|
+
<>
|
|
196
|
+
Pat Ole sier "hei". Her er litt innhold med en{" "}
|
|
197
|
+
<Link href="http://example.com">lenke</Link>.
|
|
198
|
+
</>
|
|
199
|
+
),
|
|
200
|
+
},
|
|
201
|
+
];
|