@navikt/ds-react 0.17.14 → 0.17.15

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.
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __rest = (this && this.__rest) || function (s, e) {
26
+ var t = {};
27
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
28
+ t[p] = s[p];
29
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
30
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
31
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
32
+ t[p[i]] = s[p[i]];
33
+ }
34
+ return t;
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const react_1 = __importStar(require("react"));
41
+ const classnames_1 = __importDefault(require("classnames"));
42
+ const Row_1 = __importDefault(require("./Row"));
43
+ const DataCell_1 = __importDefault(require("./DataCell"));
44
+ const react_collapse_1 = require("react-collapse");
45
+ const ds_icons_1 = require("@navikt/ds-icons");
46
+ const __1 = require("..");
47
+ const ExpandableRow = (0, react_1.forwardRef)((_a, ref) => {
48
+ var { className, children, content, togglePlacement = "left", defaultOpen = false, open, onOpenChange } = _a, rest = __rest(_a, ["className", "children", "content", "togglePlacement", "defaultOpen", "open", "onOpenChange"]);
49
+ const [internalOpen, setInternalOpen] = (0, react_1.useState)(defaultOpen);
50
+ const id = `expandable-${(0, __1.useId)()}`;
51
+ const isOpen = open !== null && open !== void 0 ? open : internalOpen;
52
+ return (react_1.default.createElement(react_1.default.Fragment, null,
53
+ react_1.default.createElement(Row_1.default, Object.assign({}, rest, { ref: ref, className: (0, classnames_1.default)("navds-table__expandable-row", className, {
54
+ "navds-table__expandable-row--open": isOpen,
55
+ }) }),
56
+ togglePlacement === "right" && children,
57
+ react_1.default.createElement(DataCell_1.default, { className: (0, classnames_1.default)("navds-table__toggle-expand-cell", {
58
+ "navds-table__toggle-expand-cell--open": isOpen,
59
+ }) },
60
+ react_1.default.createElement("button", { className: "navds-table__toggle-expand-button", "aria-controls": id, "aria-expanded": isOpen, onClick: () => {
61
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(!isOpen);
62
+ if (open === undefined) {
63
+ setInternalOpen((open) => !open);
64
+ }
65
+ } },
66
+ react_1.default.createElement(ds_icons_1.Expand, { className: "navds-table__expandable-icon", title: "Vis mer" }),
67
+ react_1.default.createElement(ds_icons_1.ExpandFilled, { className: "navds-table__expandable-icon navds-table__expandable-icon--filled", title: "Vis mindre" }))),
68
+ togglePlacement === "left" && children),
69
+ react_1.default.createElement("tr", { className: "navds-table__expanded-row", "aria-hidden": !isOpen, id: id },
70
+ react_1.default.createElement("td", { colSpan: 999, className: "navds-table__expanded-row-cell" },
71
+ react_1.default.createElement(react_collapse_1.UnmountClosed, { isOpened: isOpen, theme: {
72
+ collapse: "navds-table__expanded-row-collapse",
73
+ content: "navds-table__expanded-row-content",
74
+ } }, content)))));
75
+ });
76
+ exports.default = ExpandableRow;
@@ -46,6 +46,7 @@ const Row_1 = __importDefault(require("./Row"));
46
46
  const ColumnHeader_1 = __importDefault(require("./ColumnHeader"));
47
47
  const HeaderCell_1 = __importDefault(require("./HeaderCell"));
48
48
  const DataCell_1 = __importDefault(require("./DataCell"));
49
+ const ExpandableRow_1 = __importDefault(require("./ExpandableRow"));
49
50
  exports.TableContext = (0, react_1.createContext)(null);
50
51
  const Table = (0, react_1.forwardRef)((_a, ref) => {
51
52
  var { className, zebraStripes = false, size = "medium", onSortChange, sort } = _a, rest = __rest(_a, ["className", "zebraStripes", "size", "onSortChange", "sort"]);
@@ -60,4 +61,5 @@ Table.Row = Row_1.default;
60
61
  Table.ColumnHeader = ColumnHeader_1.default;
61
62
  Table.HeaderCell = HeaderCell_1.default;
62
63
  Table.DataCell = DataCell_1.default;
64
+ Table.ExpandableRow = ExpandableRow_1.default;
63
65
  exports.default = Table;
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { RowProps } from "./Row";
3
+ interface ExpandableRowProps extends RowProps {
4
+ /**
5
+ * Content of the expanded row
6
+ */
7
+ content: React.ReactNode;
8
+ /**
9
+ * Placement of toggle button
10
+ * @default "left"
11
+ */
12
+ togglePlacement?: "left" | "right";
13
+ /**
14
+ * Opens component if 'true', closes if 'false'
15
+ * Using this props removes automatic control of open-state
16
+ */
17
+ open?: boolean;
18
+ /**
19
+ * Opened state default
20
+ * @default false
21
+ */
22
+ defaultOpen?: boolean;
23
+ /**
24
+ * Change handler for open
25
+ */
26
+ onOpenChange?: (open: boolean) => void;
27
+ }
28
+ export interface ExpandableRowType extends React.ForwardRefExoticComponent<ExpandableRowProps & React.RefAttributes<HTMLTableRowElement>> {
29
+ }
30
+ declare const ExpandableRow: ExpandableRowType;
31
+ export default ExpandableRow;
@@ -0,0 +1,49 @@
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 React, { forwardRef, useState } from "react";
13
+ import cl from "classnames";
14
+ import Row from "./Row";
15
+ import DataCell from "./DataCell";
16
+ import { UnmountClosed } from "react-collapse";
17
+ import { Expand, ExpandFilled } from "@navikt/ds-icons";
18
+ import { useId } from "..";
19
+ const ExpandableRow = forwardRef((_a, ref) => {
20
+ var { className, children, content, togglePlacement = "left", defaultOpen = false, open, onOpenChange } = _a, rest = __rest(_a, ["className", "children", "content", "togglePlacement", "defaultOpen", "open", "onOpenChange"]);
21
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
22
+ const id = `expandable-${useId()}`;
23
+ const isOpen = open !== null && open !== void 0 ? open : internalOpen;
24
+ return (React.createElement(React.Fragment, null,
25
+ React.createElement(Row, Object.assign({}, rest, { ref: ref, className: cl("navds-table__expandable-row", className, {
26
+ "navds-table__expandable-row--open": isOpen,
27
+ }) }),
28
+ togglePlacement === "right" && children,
29
+ React.createElement(DataCell, { className: cl("navds-table__toggle-expand-cell", {
30
+ "navds-table__toggle-expand-cell--open": isOpen,
31
+ }) },
32
+ React.createElement("button", { className: "navds-table__toggle-expand-button", "aria-controls": id, "aria-expanded": isOpen, onClick: () => {
33
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(!isOpen);
34
+ if (open === undefined) {
35
+ setInternalOpen((open) => !open);
36
+ }
37
+ } },
38
+ React.createElement(Expand, { className: "navds-table__expandable-icon", title: "Vis mer" }),
39
+ React.createElement(ExpandFilled, { className: "navds-table__expandable-icon navds-table__expandable-icon--filled", title: "Vis mindre" }))),
40
+ togglePlacement === "left" && children),
41
+ React.createElement("tr", { className: "navds-table__expanded-row", "aria-hidden": !isOpen, id: id },
42
+ React.createElement("td", { colSpan: 999, className: "navds-table__expanded-row-cell" },
43
+ React.createElement(UnmountClosed, { isOpened: isOpen, theme: {
44
+ collapse: "navds-table__expanded-row-collapse",
45
+ content: "navds-table__expanded-row-content",
46
+ } }, content)))));
47
+ });
48
+ export default ExpandableRow;
49
+ //# sourceMappingURL=ExpandableRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpandableRow.js","sourceRoot":"","sources":["../../src/table/ExpandableRow.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,GAAiB,MAAM,OAAO,CAAC;AACtC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC;AAiC3B,MAAM,aAAa,GAAsB,UAAU,CACjD,CACE,EASC,EACD,GAAG,EACH,EAAE;QAXF,EACE,SAAS,EACT,QAAQ,EACR,OAAO,EACP,eAAe,GAAG,MAAM,EACxB,WAAW,GAAG,KAAK,EACnB,IAAI,EACJ,YAAY,OAEb,EADI,IAAI,cART,8FASC,CADQ;IAIT,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,WAAW,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,cAAc,KAAK,EAAE,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,YAAY,CAAC;IAEpC,OAAO,CACL;QACE,oBAAC,GAAG,oBACE,IAAI,IACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,EAAE;gBACtD,mCAAmC,EAAE,MAAM;aAC5C,CAAC;YAED,eAAe,KAAK,OAAO,IAAI,QAAQ;YACxC,oBAAC,QAAQ,IACP,SAAS,EAAE,EAAE,CAAC,iCAAiC,EAAE;oBAC/C,uCAAuC,EAAE,MAAM;iBAChD,CAAC;gBAEF,gCACE,SAAS,EAAC,mCAAmC,mBAC9B,EAAE,mBACF,MAAM,EACrB,OAAO,EAAE,GAAG,EAAE;wBACZ,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,CAAC,MAAM,CAAC,CAAC;wBACxB,IAAI,IAAI,KAAK,SAAS,EAAE;4BACtB,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;yBAClC;oBACH,CAAC;oBAED,oBAAC,MAAM,IACL,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAC,SAAS,GACf;oBACF,oBAAC,YAAY,IACX,SAAS,EAAC,mEAAmE,EAC7E,KAAK,EAAC,YAAY,GAClB,CACK,CACA;YACV,eAAe,KAAK,MAAM,IAAI,QAAQ,CACnC;QACN,4BAAI,SAAS,EAAC,2BAA2B,iBAAc,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;YACpE,4BAAI,OAAO,EAAE,GAAG,EAAE,SAAS,EAAC,gCAAgC;gBAC1D,oBAAC,aAAa,IACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;wBACL,QAAQ,EAAE,oCAAoC;wBAC9C,OAAO,EAAE,mCAAmC;qBAC7C,IAEA,OAAO,CACM,CACb,CACF,CACJ,CACJ,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
2
+ export interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
3
3
  /**
4
4
  * Row is selected
5
5
  * @default false
@@ -5,6 +5,7 @@ import { RowType } from "./Row";
5
5
  import { ColumnHeaderType } from "./ColumnHeader";
6
6
  import { HeaderCellType } from "./HeaderCell";
7
7
  import { DataCellType } from "./DataCell";
8
+ import { ExpandableRowType } from "./ExpandableRow";
8
9
  export interface SortState {
9
10
  orderBy: string;
10
11
  direction: "ascending" | "descending";
@@ -36,6 +37,7 @@ export interface TableType extends React.ForwardRefExoticComponent<TableProps &
36
37
  DataCell: DataCellType;
37
38
  HeaderCell: HeaderCellType;
38
39
  ColumnHeader: ColumnHeaderType;
40
+ ExpandableRow: ExpandableRowType;
39
41
  }
40
42
  export interface TableContextProps {
41
43
  size: "medium" | "small";
@@ -17,6 +17,7 @@ import Row from "./Row";
17
17
  import ColumnHeader from "./ColumnHeader";
18
18
  import HeaderCell from "./HeaderCell";
19
19
  import DataCell from "./DataCell";
20
+ import ExpandableRow from "./ExpandableRow";
20
21
  export const TableContext = createContext(null);
21
22
  const Table = forwardRef((_a, ref) => {
22
23
  var { className, zebraStripes = false, size = "medium", onSortChange, sort } = _a, rest = __rest(_a, ["className", "zebraStripes", "size", "onSortChange", "sort"]);
@@ -31,5 +32,6 @@ Table.Row = Row;
31
32
  Table.ColumnHeader = ColumnHeader;
32
33
  Table.HeaderCell = HeaderCell;
33
34
  Table.DataCell = DataCell;
35
+ Table.ExpandableRow = ExpandableRow;
34
36
  export default Table;
35
37
  //# sourceMappingURL=Table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sourceRoot":"","sources":["../../src/table/Table.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,MAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,IAAkB,MAAM,QAAQ,CAAC;AACxC,OAAO,GAAgB,MAAM,OAAO,CAAC;AACrC,OAAO,YAAkC,MAAM,gBAAgB,CAAC;AAChE,OAAO,UAA8B,MAAM,cAAc,CAAC;AAC1D,OAAO,QAA0B,MAAM,YAAY,CAAC;AA+CpD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAC;AAE1E,MAAM,KAAK,GAAG,UAAU,CACtB,CACE,EAOC,EACD,GAAG,EACH,EAAE;QATF,EACE,SAAS,EACT,YAAY,GAAG,KAAK,EACpB,IAAI,GAAG,QAAQ,EACf,YAAY,EACZ,IAAI,OAEL,EADI,IAAI,cANT,6DAOC,CADQ;IAGN,OAAA,CACH,oBAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;QACxD,+CACM,IAAI,IACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,gBAAgB,IAAI,EAAE,EAAE,SAAS,EAAE;gBAC9D,4BAA4B,EAAE,YAAY;aAC3C,CAAC,IACF,CACoB,CACzB,CAAA;CAAA,CACW,CAAC;AAEf,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AACtB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;AAClB,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;AAChB,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;AAClC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;AAC9B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAE1B,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Table.js","sourceRoot":"","sources":["../../src/table/Table.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,MAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,IAAkB,MAAM,QAAQ,CAAC;AACxC,OAAO,GAAgB,MAAM,OAAO,CAAC;AACrC,OAAO,YAAkC,MAAM,gBAAgB,CAAC;AAChE,OAAO,UAA8B,MAAM,cAAc,CAAC;AAC1D,OAAO,QAA0B,MAAM,YAAY,CAAC;AACpD,OAAO,aAAoC,MAAM,iBAAiB,CAAC;AAgDnE,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAC;AAE1E,MAAM,KAAK,GAAG,UAAU,CACtB,CACE,EAOC,EACD,GAAG,EACH,EAAE;QATF,EACE,SAAS,EACT,YAAY,GAAG,KAAK,EACpB,IAAI,GAAG,QAAQ,EACf,YAAY,EACZ,IAAI,OAEL,EADI,IAAI,cANT,6DAOC,CADQ;IAGN,OAAA,CACH,oBAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;QACxD,+CACM,IAAI,IACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,gBAAgB,IAAI,EAAE,EAAE,SAAS,EAAE;gBAC9D,4BAA4B,EAAE,YAAY;aAC3C,CAAC,IACF,CACoB,CACzB,CAAA;CAAA,CACW,CAAC;AAEf,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AACtB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;AAClB,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;AAChB,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;AAClC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;AAC9B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC1B,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;AAEpC,eAAe,KAAK,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "0.17.14",
3
+ "version": "0.17.15",
4
4
  "private": false,
5
5
  "description": "NAV designsystem react components",
6
6
  "author": "NAV Designsystem team",
@@ -68,5 +68,5 @@
68
68
  "@types/react": "^17.0.30",
69
69
  "react": "^17.0.0"
70
70
  },
71
- "gitHead": "88e2c2b2fee9701bf1cb370538c22c84e448d62a"
71
+ "gitHead": "c80cb199a138566285d516e8c2f5aa3993afb20f"
72
72
  }
@@ -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="Vis mer"
88
+ />
89
+ <ExpandFilled
90
+ className="navds-table__expandable-icon navds-table__expandable-icon--filled"
91
+ title="Vis mindre"
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
@@ -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
+ ];