@navikt/ds-react 4.8.0 → 4.9.1

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/_docs.json CHANGED
@@ -7810,7 +7810,7 @@
7810
7810
  "defaultValue": {
7811
7811
  "value": "false"
7812
7812
  },
7813
- "description": "Disable expansio",
7813
+ "description": "Disable expansion. shadeOnHover will not be visible.",
7814
7814
  "name": "expansionDisabled",
7815
7815
  "parent": {
7816
7816
  "fileName": "src/table/ExpandableRow.tsx",
@@ -7827,6 +7827,27 @@
7827
7827
  "name": "boolean"
7828
7828
  }
7829
7829
  },
7830
+ "expandOnRowClick": {
7831
+ "defaultValue": {
7832
+ "value": "false"
7833
+ },
7834
+ "description": "Makes the whole row clickable",
7835
+ "name": "expandOnRowClick",
7836
+ "parent": {
7837
+ "fileName": "src/table/ExpandableRow.tsx",
7838
+ "name": "ExpandableRowProps"
7839
+ },
7840
+ "declarations": [
7841
+ {
7842
+ "fileName": "src/table/ExpandableRow.tsx",
7843
+ "name": "ExpandableRowProps"
7844
+ }
7845
+ ],
7846
+ "required": false,
7847
+ "type": {
7848
+ "name": "boolean"
7849
+ }
7850
+ },
7830
7851
  "colSpan": {
7831
7852
  "defaultValue": {
7832
7853
  "value": "999"
@@ -14324,7 +14345,7 @@
14324
14345
  },
14325
14346
  "onToggleSelected": {
14326
14347
  "defaultValue": null,
14327
- "description": "Callback function triggered whenever an option is selected or de-selected\n@param option\n@param isSelected\n@returns",
14348
+ "description": "Callback function triggered whenever an option is selected or de-selected\n@param option\n@param isSelected - Whether the option has been selected or unselected\n@param isAddedByUser - Whether the option comes from user input, instead of from the list\n@returns",
14328
14349
  "name": "onToggleSelected",
14329
14350
  "parent": {
14330
14351
  "fileName": "react/src/form/combobox/types.ts",
@@ -14338,7 +14359,7 @@
14338
14359
  ],
14339
14360
  "required": false,
14340
14361
  "type": {
14341
- "name": "((option: string, isSelected: boolean) => void)"
14362
+ "name": "((option: string, isSelected: boolean, isAddedByUser: boolean) => void)"
14342
14363
  }
14343
14364
  },
14344
14365
  "selectedOptions": {
@@ -14777,7 +14798,7 @@
14777
14798
  },
14778
14799
  "onToggleSelected": {
14779
14800
  "defaultValue": null,
14780
- "description": "Callback function triggered whenever an option is selected or de-selected\n@param option\n@param isSelected\n@returns",
14801
+ "description": "Callback function triggered whenever an option is selected or de-selected\n@param option\n@param isSelected - Whether the option has been selected or unselected\n@param isAddedByUser - Whether the option comes from user input, instead of from the list\n@returns",
14781
14802
  "name": "onToggleSelected",
14782
14803
  "parent": {
14783
14804
  "fileName": "react/src/form/combobox/types.ts",
@@ -14791,7 +14812,7 @@
14791
14812
  ],
14792
14813
  "required": false,
14793
14814
  "type": {
14794
- "name": "((option: string, isSelected: boolean) => void)"
14815
+ "name": "((option: string, isSelected: boolean, isAddedByUser: boolean) => void)"
14795
14816
  }
14796
14817
  },
14797
14818
  "selectedOptions": {
@@ -76,7 +76,7 @@ exports.Button = (0, react_1.forwardRef)((_a, ref) => {
76
76
  "navds-button--disabled": disabled !== null && disabled !== void 0 ? disabled : widthOverride,
77
77
  }), style: Object.assign(Object.assign({}, style), { width: widthOverride }), disabled: (disabled !== null && disabled !== void 0 ? disabled : widthOverride) ? true : undefined }), widthOverride ? (react_1.default.createElement(__1.Loader, { size: size })) : (react_1.default.createElement(react_1.default.Fragment, null,
78
78
  icon && iconPosition === "left" && (react_1.default.createElement("span", { className: "navds-button__icon" }, icon)),
79
- children && (react_1.default.createElement(__1.Label, { as: "span", size: size === "medium" ? "medium" : "small", "aria-live": "polite" }, children)),
79
+ children && (react_1.default.createElement(__1.Label, { as: "span", size: size === "medium" ? "medium" : "small" }, children)),
80
80
  icon && iconPosition === "right" && (react_1.default.createElement("span", { className: "navds-button__icon" }, icon))))));
81
81
  });
82
82
  exports.default = exports.Button;
@@ -30,22 +30,26 @@ const clsx_1 = __importDefault(require("clsx"));
30
30
  const react_1 = __importStar(require("react"));
31
31
  const ComboboxWrapper = ({ children, className, hasError, inputProps, inputSize, toggleIsListOpen, toggleListButtonRef, }) => {
32
32
  const wrapperRef = (0, react_1.useRef)(null);
33
+ const [hasFocusWithin, setHasFocusWithin] = (0, react_1.useState)(false);
33
34
  function onFocusInsideWrapper(e) {
34
35
  var _a;
35
36
  if (!((_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.relatedTarget)) &&
36
37
  (toggleListButtonRef === null || toggleListButtonRef === void 0 ? void 0 : toggleListButtonRef.current) !== e.target) {
37
38
  toggleIsListOpen(true);
39
+ setHasFocusWithin(true);
38
40
  }
39
41
  }
40
42
  function onBlurWrapper(e) {
41
43
  var _a;
42
44
  if (!((_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.relatedTarget))) {
43
45
  toggleIsListOpen(false);
46
+ setHasFocusWithin(false);
44
47
  }
45
48
  }
46
49
  return (react_1.default.createElement("div", { ref: wrapperRef, className: (0, clsx_1.default)(className, "navds-form-field", `navds-form-field--${inputSize}`, "navds-search", {
47
50
  "navds-search--error": hasError,
48
51
  "navds-search--disabled": !!inputProps.disabled,
49
- }), onFocus: onFocusInsideWrapper, onBlur: onBlurWrapper }, children));
52
+ "navds-combobox--focused": hasFocusWithin,
53
+ }), onFocus: onFocusInsideWrapper, onBlur: onBlurWrapper, tabIndex: -1 }, children));
50
54
  };
51
55
  exports.default = ComboboxWrapper;
@@ -11,7 +11,7 @@ const filteredOptionsContext_1 = require("./filteredOptionsContext");
11
11
  const selectedOptionsContext_1 = require("../SelectedOptions/selectedOptionsContext");
12
12
  const inputContext_1 = require("../Input/inputContext");
13
13
  const FilteredOptions = () => {
14
- const { inputProps: { id }, size, value, } = (0, inputContext_1.useInputContext)();
14
+ const { clearInput, inputProps: { id }, size, value, } = (0, inputContext_1.useInputContext)();
15
15
  const { allowNewValues, isLoading, isListOpen, filteredOptions, filteredOptionsIndex, filteredOptionsRef, isValueNew, toggleIsListOpen, } = (0, filteredOptionsContext_1.useFilteredOptionsContext)();
16
16
  const { isMultiSelect, selectedOptions, toggleOption } = (0, selectedOptionsContext_1.useSelectedOptionsContext)();
17
17
  return (react_1.default.createElement("ul", { ref: filteredOptionsRef, className: (0, clsx_1.default)("navds-combobox__list", {
@@ -19,7 +19,10 @@ const FilteredOptions = () => {
19
19
  }), id: `${id}-filtered-options`, role: "listbox", tabIndex: -1 },
20
20
  isLoading && (react_1.default.createElement("li", { className: "navds-combobox__list-item--loading", role: "option", "aria-selected": false, id: `${id}-is-loading` },
21
21
  react_1.default.createElement(__1.Loader, { "aria-label": "S\u00F8ker..." }))),
22
- isValueNew && allowNewValues && (react_1.default.createElement("li", { tabIndex: -1, onPointerUp: (event) => toggleOption(value, event), id: `${id}-combobox-new-option`, className: (0, clsx_1.default)("navds-combobox__list-item__new-option", {
22
+ isValueNew && allowNewValues && (react_1.default.createElement("li", { tabIndex: -1, onPointerUp: (event) => {
23
+ toggleOption(value, event);
24
+ clearInput(event);
25
+ }, id: `${id}-combobox-new-option`, className: (0, clsx_1.default)("navds-combobox__list-item__new-option", {
23
26
  "navds-combobox__list-item__new-option--focus": filteredOptionsIndex === -1,
24
27
  }), role: "option", "aria-selected": false },
25
28
  react_1.default.createElement(aksel_icons_1.PlusIcon, { "aria-hidden": true }),
@@ -36,6 +39,7 @@ const FilteredOptions = () => {
36
39
  "navds-combobox__list-item--selected": selectedOptions.includes(option),
37
40
  }), id: `${id}-option-${option.replace(" ", "-")}`, key: option, tabIndex: -1, onPointerUp: (event) => {
38
41
  toggleOption(option, event);
42
+ clearInput(event);
39
43
  if (!isMultiSelect) {
40
44
  toggleIsListOpen(false);
41
45
  }
@@ -40,9 +40,10 @@ const SelectedOptionsProvider = ({ children, value, }) => {
40
40
  const selectedOptions = (0, react_1.useMemo)(() => externalSelectedOptions !== null && externalSelectedOptions !== void 0 ? externalSelectedOptions : [...customOptions, ...internalSelectedOptions], [customOptions, externalSelectedOptions, internalSelectedOptions]);
41
41
  const addSelectedOption = (0, react_1.useCallback)((option) => {
42
42
  var _a;
43
- if (!options
43
+ const isAddedByUser = !options
44
44
  .map((opt) => opt.toLowerCase())
45
- .includes((_a = option === null || option === void 0 ? void 0 : option.toLowerCase) === null || _a === void 0 ? void 0 : _a.call(option))) {
45
+ .includes((_a = option === null || option === void 0 ? void 0 : option.toLowerCase) === null || _a === void 0 ? void 0 : _a.call(option));
46
+ if (isAddedByUser) {
46
47
  allowNewValues && addCustomOption(option);
47
48
  }
48
49
  else if (isMultiSelect) {
@@ -54,16 +55,17 @@ const SelectedOptionsProvider = ({ children, value, }) => {
54
55
  else {
55
56
  setSelectedOptions([option]);
56
57
  }
57
- onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, true);
58
+ onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, true, isAddedByUser);
58
59
  }, [addCustomOption, allowNewValues, isMultiSelect, onToggleSelected, options]);
59
60
  const removeSelectedOption = (0, react_1.useCallback)((option) => {
60
- if (customOptions.includes(option)) {
61
+ const isAddedByUser = customOptions.includes(option);
62
+ if (isAddedByUser) {
61
63
  removeCustomOption(option);
62
64
  }
63
65
  else {
64
66
  setSelectedOptions((prevSelectedOptions) => prevSelectedOptions.filter((selectedOption) => selectedOption !== option));
65
67
  }
66
- onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, false);
68
+ onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, false, isAddedByUser);
67
69
  }, [customOptions, onToggleSelected, removeCustomOption]);
68
70
  const toggleOption = (0, react_1.useCallback)((option, event) => {
69
71
  if (selectedOptions.includes(option)) {
@@ -46,23 +46,35 @@ const DataCell_1 = __importDefault(require("./DataCell"));
46
46
  const Row_1 = __importDefault(require("./Row"));
47
47
  const aksel_icons_1 = require("@navikt/aksel-icons");
48
48
  exports.ExpandableRow = (0, react_1.forwardRef)((_a, ref) => {
49
- var { className, children, content, togglePlacement = "left", defaultOpen = false, open, onOpenChange, expansionDisabled = false, colSpan = 999 } = _a, rest = __rest(_a, ["className", "children", "content", "togglePlacement", "defaultOpen", "open", "onOpenChange", "expansionDisabled", "colSpan"]);
49
+ var { className, children, content, togglePlacement = "left", defaultOpen = false, open, onOpenChange, expansionDisabled = false, expandOnRowClick = false, colSpan = 999 } = _a, rest = __rest(_a, ["className", "children", "content", "togglePlacement", "defaultOpen", "open", "onOpenChange", "expansionDisabled", "expandOnRowClick", "colSpan"]);
50
50
  const [internalOpen, setInternalOpen] = (0, react_1.useState)(defaultOpen);
51
51
  const id = (0, __1.useId)();
52
52
  const isOpen = open !== null && open !== void 0 ? open : internalOpen;
53
+ const expansionHandler = (e) => {
54
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(!isOpen);
55
+ if (open === undefined) {
56
+ setInternalOpen((open) => !open);
57
+ }
58
+ e.stopPropagation();
59
+ };
60
+ const onRowClick = (e) => {
61
+ if (e.target.nodeName === "TD" || e.target.nodeName === "TH") {
62
+ expansionHandler(e);
63
+ }
64
+ };
53
65
  return (react_1.default.createElement(react_1.default.Fragment, null,
54
66
  react_1.default.createElement(Row_1.default, Object.assign({}, rest, { ref: ref, className: (0, clsx_1.default)("navds-table__expandable-row", className, {
55
67
  "navds-table__expandable-row--open": isOpen,
56
- }) }),
68
+ "navds-table__expandable-row--expansion-disabled": expansionDisabled,
69
+ }), onClick: (e) => {
70
+ var _a;
71
+ !expansionDisabled && expandOnRowClick && onRowClick(e);
72
+ (_a = rest === null || rest === void 0 ? void 0 : rest.onClick) === null || _a === void 0 ? void 0 : _a.call(rest, e);
73
+ } }),
57
74
  togglePlacement === "right" && children,
58
75
  react_1.default.createElement(DataCell_1.default, { className: (0, clsx_1.default)("navds-table__toggle-expand-cell", {
59
76
  "navds-table__toggle-expand-cell--open": isOpen,
60
- }) }, !expansionDisabled && (react_1.default.createElement("button", { type: "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
- } },
77
+ }) }, !expansionDisabled && (react_1.default.createElement("button", { type: "button", className: "navds-table__toggle-expand-button", "aria-controls": id, "aria-expanded": isOpen, onClick: expansionHandler },
66
78
  react_1.default.createElement(aksel_icons_1.ChevronDownIcon, { className: "navds-table__expandable-icon", title: isOpen ? "Vis mindre" : "Vis mer" })))),
67
79
  togglePlacement === "left" && children),
68
80
  react_1.default.createElement("tr", { className: "navds-table__expanded-row", "aria-hidden": !isOpen, id: id },
@@ -47,7 +47,7 @@ export const Button = forwardRef((_a, ref) => {
47
47
  "navds-button--disabled": disabled !== null && disabled !== void 0 ? disabled : widthOverride,
48
48
  }), style: Object.assign(Object.assign({}, style), { width: widthOverride }), disabled: (disabled !== null && disabled !== void 0 ? disabled : widthOverride) ? true : undefined }), widthOverride ? (React.createElement(Loader, { size: size })) : (React.createElement(React.Fragment, null,
49
49
  icon && iconPosition === "left" && (React.createElement("span", { className: "navds-button__icon" }, icon)),
50
- children && (React.createElement(Label, { as: "span", size: size === "medium" ? "medium" : "small", "aria-live": "polite" }, children)),
50
+ children && (React.createElement(Label, { as: "span", size: size === "medium" ? "medium" : "small" }, children)),
51
51
  icon && iconPosition === "right" && (React.createElement("span", { className: "navds-button__icon" }, icon))))));
52
52
  });
53
53
  export default Button;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/button/Button.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/button/Button.tsx"],"names":[],"mappings":"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"}
@@ -1,24 +1,28 @@
1
1
  import cl from "clsx";
2
- import React, { useRef } from "react";
2
+ import React, { useRef, useState } from "react";
3
3
  const ComboboxWrapper = ({ children, className, hasError, inputProps, inputSize, toggleIsListOpen, toggleListButtonRef, }) => {
4
4
  const wrapperRef = useRef(null);
5
+ const [hasFocusWithin, setHasFocusWithin] = useState(false);
5
6
  function onFocusInsideWrapper(e) {
6
7
  var _a;
7
8
  if (!((_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.relatedTarget)) &&
8
9
  (toggleListButtonRef === null || toggleListButtonRef === void 0 ? void 0 : toggleListButtonRef.current) !== e.target) {
9
10
  toggleIsListOpen(true);
11
+ setHasFocusWithin(true);
10
12
  }
11
13
  }
12
14
  function onBlurWrapper(e) {
13
15
  var _a;
14
16
  if (!((_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.relatedTarget))) {
15
17
  toggleIsListOpen(false);
18
+ setHasFocusWithin(false);
16
19
  }
17
20
  }
18
21
  return (React.createElement("div", { ref: wrapperRef, className: cl(className, "navds-form-field", `navds-form-field--${inputSize}`, "navds-search", {
19
22
  "navds-search--error": hasError,
20
23
  "navds-search--disabled": !!inputProps.disabled,
21
- }), onFocus: onFocusInsideWrapper, onBlur: onBlurWrapper }, children));
24
+ "navds-combobox--focused": hasFocusWithin,
25
+ }), onFocus: onFocusInsideWrapper, onBlur: onBlurWrapper, tabIndex: -1 }, children));
22
26
  };
23
27
  export default ComboboxWrapper;
24
28
  //# sourceMappingURL=ComboboxWrapper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComboboxWrapper.js","sourceRoot":"","sources":["../../../src/form/combobox/ComboboxWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AActC,MAAM,eAAe,GAAG,CAAC,EACvB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,mBAAmB,GACE,EAAE,EAAE;IACzB,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAEvD,SAAS,oBAAoB,CAAC,CAAC;;QAC7B,IACE,CAAC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;YAC9C,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,OAAO,MAAK,CAAC,CAAC,MAAM,EACzC;YACA,gBAAgB,CAAC,IAAI,CAAC,CAAC;SACxB;IACH,CAAC;IAED,SAAS,aAAa,CAAC,CAAC;;QACtB,IAAI,CAAC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA,EAAE;YAClD,gBAAgB,CAAC,KAAK,CAAC,CAAC;SACzB;IACH,CAAC;IAED,OAAO,CACL,6BACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,EAAE,CACX,SAAS,EACT,kBAAkB,EAClB,qBAAqB,SAAS,EAAE,EAChC,cAAc,EACd;YACE,qBAAqB,EAAE,QAAQ;YAC/B,wBAAwB,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ;SAChD,CACF,EACD,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,aAAa,IAEpB,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ComboboxWrapper.js","sourceRoot":"","sources":["../../../src/form/combobox/ComboboxWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAchD,MAAM,eAAe,GAAG,CAAC,EACvB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,mBAAmB,GACE,EAAE,EAAE;IACzB,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,oBAAoB,CAAC,CAAC;;QAC7B,IACE,CAAC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;YAC9C,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,OAAO,MAAK,CAAC,CAAC,MAAM,EACzC;YACA,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,iBAAiB,CAAC,IAAI,CAAC,CAAC;SACzB;IACH,CAAC;IAED,SAAS,aAAa,CAAC,CAAC;;QACtB,IAAI,CAAC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA,EAAE;YAClD,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,iBAAiB,CAAC,KAAK,CAAC,CAAC;SAC1B;IACH,CAAC;IAED,OAAO,CACL,6BACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,EAAE,CACX,SAAS,EACT,kBAAkB,EAClB,qBAAqB,SAAS,EAAE,EAChC,cAAc,EACd;YACE,qBAAqB,EAAE,QAAQ;YAC/B,wBAAwB,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ;YAC/C,yBAAyB,EAAE,cAAc;SAC1C,CACF,EACD,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,CAAC,CAAC,IAEX,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -6,7 +6,7 @@ import { useFilteredOptionsContext } from "./filteredOptionsContext";
6
6
  import { useSelectedOptionsContext } from "../SelectedOptions/selectedOptionsContext";
7
7
  import { useInputContext } from "../Input/inputContext";
8
8
  const FilteredOptions = () => {
9
- const { inputProps: { id }, size, value, } = useInputContext();
9
+ const { clearInput, inputProps: { id }, size, value, } = useInputContext();
10
10
  const { allowNewValues, isLoading, isListOpen, filteredOptions, filteredOptionsIndex, filteredOptionsRef, isValueNew, toggleIsListOpen, } = useFilteredOptionsContext();
11
11
  const { isMultiSelect, selectedOptions, toggleOption } = useSelectedOptionsContext();
12
12
  return (React.createElement("ul", { ref: filteredOptionsRef, className: cl("navds-combobox__list", {
@@ -14,7 +14,10 @@ const FilteredOptions = () => {
14
14
  }), id: `${id}-filtered-options`, role: "listbox", tabIndex: -1 },
15
15
  isLoading && (React.createElement("li", { className: "navds-combobox__list-item--loading", role: "option", "aria-selected": false, id: `${id}-is-loading` },
16
16
  React.createElement(Loader, { "aria-label": "S\u00F8ker..." }))),
17
- isValueNew && allowNewValues && (React.createElement("li", { tabIndex: -1, onPointerUp: (event) => toggleOption(value, event), id: `${id}-combobox-new-option`, className: cl("navds-combobox__list-item__new-option", {
17
+ isValueNew && allowNewValues && (React.createElement("li", { tabIndex: -1, onPointerUp: (event) => {
18
+ toggleOption(value, event);
19
+ clearInput(event);
20
+ }, id: `${id}-combobox-new-option`, className: cl("navds-combobox__list-item__new-option", {
18
21
  "navds-combobox__list-item__new-option--focus": filteredOptionsIndex === -1,
19
22
  }), role: "option", "aria-selected": false },
20
23
  React.createElement(PlusIcon, { "aria-hidden": true }),
@@ -31,6 +34,7 @@ const FilteredOptions = () => {
31
34
  "navds-combobox__list-item--selected": selectedOptions.includes(option),
32
35
  }), id: `${id}-option-${option.replace(" ", "-")}`, key: option, tabIndex: -1, onPointerUp: (event) => {
33
36
  toggleOption(option, event);
37
+ clearInput(event);
34
38
  if (!isMultiSelect) {
35
39
  toggleIsListOpen(false);
36
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilteredOptions.js","sourceRoot":"","sources":["../../../../src/form/combobox/FilteredOptions/FilteredOptions.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilteredOptions.js","sourceRoot":"","sources":["../../../../src/form/combobox/FilteredOptions/FilteredOptions.tsx"],"names":[],"mappings":"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"}
@@ -11,9 +11,10 @@ export const SelectedOptionsProvider = ({ children, value, }) => {
11
11
  const selectedOptions = useMemo(() => externalSelectedOptions !== null && externalSelectedOptions !== void 0 ? externalSelectedOptions : [...customOptions, ...internalSelectedOptions], [customOptions, externalSelectedOptions, internalSelectedOptions]);
12
12
  const addSelectedOption = useCallback((option) => {
13
13
  var _a;
14
- if (!options
14
+ const isAddedByUser = !options
15
15
  .map((opt) => opt.toLowerCase())
16
- .includes((_a = option === null || option === void 0 ? void 0 : option.toLowerCase) === null || _a === void 0 ? void 0 : _a.call(option))) {
16
+ .includes((_a = option === null || option === void 0 ? void 0 : option.toLowerCase) === null || _a === void 0 ? void 0 : _a.call(option));
17
+ if (isAddedByUser) {
17
18
  allowNewValues && addCustomOption(option);
18
19
  }
19
20
  else if (isMultiSelect) {
@@ -25,16 +26,17 @@ export const SelectedOptionsProvider = ({ children, value, }) => {
25
26
  else {
26
27
  setSelectedOptions([option]);
27
28
  }
28
- onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, true);
29
+ onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, true, isAddedByUser);
29
30
  }, [addCustomOption, allowNewValues, isMultiSelect, onToggleSelected, options]);
30
31
  const removeSelectedOption = useCallback((option) => {
31
- if (customOptions.includes(option)) {
32
+ const isAddedByUser = customOptions.includes(option);
33
+ if (isAddedByUser) {
32
34
  removeCustomOption(option);
33
35
  }
34
36
  else {
35
37
  setSelectedOptions((prevSelectedOptions) => prevSelectedOptions.filter((selectedOption) => selectedOption !== option));
36
38
  }
37
- onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, false);
39
+ onToggleSelected === null || onToggleSelected === void 0 ? void 0 : onToggleSelected(option, false, isAddedByUser);
38
40
  }, [customOptions, onToggleSelected, removeCustomOption]);
39
41
  const toggleOption = useCallback((option, event) => {
40
42
  if (selectedOptions.includes(option)) {
@@ -1 +1 @@
1
- {"version":3,"file":"selectedOptionsContext.js","sourceRoot":"","sources":["../../../../src/form/combobox/SelectedOptions/selectedOptionsContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selectedOptionsContext.js","sourceRoot":"","sources":["../../../../src/form/combobox/SelectedOptions/selectedOptionsContext.tsx"],"names":[],"mappings":"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"}
@@ -75,10 +75,11 @@ export interface ComboboxProps extends FormFieldProps, Omit<InputHTMLAttributes<
75
75
  * Callback function triggered whenever an option is selected or de-selected
76
76
  *
77
77
  * @param option
78
- * @param isSelected
78
+ * @param isSelected - Whether the option has been selected or unselected
79
+ * @param isAddedByUser - Whether the option comes from user input, instead of from the list
79
80
  * @returns
80
81
  */
81
- onToggleSelected?: (option: string, isSelected: boolean) => void;
82
+ onToggleSelected?: (option: string, isSelected: boolean, isAddedByUser: boolean) => void;
82
83
  /**
83
84
  * List of selected options.
84
85
  *
@@ -25,10 +25,15 @@ export interface ExpandableRowProps extends Omit<RowProps, "content"> {
25
25
  */
26
26
  onOpenChange?: (open: boolean) => void;
27
27
  /**
28
- * Disable expansio
28
+ * Disable expansion. shadeOnHover will not be visible.
29
29
  * @default false
30
30
  */
31
31
  expansionDisabled?: boolean;
32
+ /**
33
+ * Makes the whole row clickable
34
+ * @default false
35
+ */
36
+ expandOnRowClick?: boolean;
32
37
  /**
33
38
  * The width of the expanded row's internal cell
34
39
  * @default 999
@@ -17,23 +17,35 @@ import DataCell from "./DataCell";
17
17
  import Row from "./Row";
18
18
  import { ChevronDownIcon } from "@navikt/aksel-icons";
19
19
  export const ExpandableRow = forwardRef((_a, ref) => {
20
- var { className, children, content, togglePlacement = "left", defaultOpen = false, open, onOpenChange, expansionDisabled = false, colSpan = 999 } = _a, rest = __rest(_a, ["className", "children", "content", "togglePlacement", "defaultOpen", "open", "onOpenChange", "expansionDisabled", "colSpan"]);
20
+ var { className, children, content, togglePlacement = "left", defaultOpen = false, open, onOpenChange, expansionDisabled = false, expandOnRowClick = false, colSpan = 999 } = _a, rest = __rest(_a, ["className", "children", "content", "togglePlacement", "defaultOpen", "open", "onOpenChange", "expansionDisabled", "expandOnRowClick", "colSpan"]);
21
21
  const [internalOpen, setInternalOpen] = useState(defaultOpen);
22
22
  const id = useId();
23
23
  const isOpen = open !== null && open !== void 0 ? open : internalOpen;
24
+ const expansionHandler = (e) => {
25
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(!isOpen);
26
+ if (open === undefined) {
27
+ setInternalOpen((open) => !open);
28
+ }
29
+ e.stopPropagation();
30
+ };
31
+ const onRowClick = (e) => {
32
+ if (e.target.nodeName === "TD" || e.target.nodeName === "TH") {
33
+ expansionHandler(e);
34
+ }
35
+ };
24
36
  return (React.createElement(React.Fragment, null,
25
37
  React.createElement(Row, Object.assign({}, rest, { ref: ref, className: cl("navds-table__expandable-row", className, {
26
38
  "navds-table__expandable-row--open": isOpen,
27
- }) }),
39
+ "navds-table__expandable-row--expansion-disabled": expansionDisabled,
40
+ }), onClick: (e) => {
41
+ var _a;
42
+ !expansionDisabled && expandOnRowClick && onRowClick(e);
43
+ (_a = rest === null || rest === void 0 ? void 0 : rest.onClick) === null || _a === void 0 ? void 0 : _a.call(rest, e);
44
+ } }),
28
45
  togglePlacement === "right" && children,
29
46
  React.createElement(DataCell, { className: cl("navds-table__toggle-expand-cell", {
30
47
  "navds-table__toggle-expand-cell--open": isOpen,
31
- }) }, !expansionDisabled && (React.createElement("button", { type: "button", className: "navds-table__toggle-expand-button", "aria-controls": id, "aria-expanded": isOpen, onClick: () => {
32
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(!isOpen);
33
- if (open === undefined) {
34
- setInternalOpen((open) => !open);
35
- }
36
- } },
48
+ }) }, !expansionDisabled && (React.createElement("button", { type: "button", className: "navds-table__toggle-expand-button", "aria-controls": id, "aria-expanded": isOpen, onClick: expansionHandler },
37
49
  React.createElement(ChevronDownIcon, { className: "navds-table__expandable-icon", title: isOpen ? "Vis mindre" : "Vis mer" })))),
38
50
  togglePlacement === "left" && children),
39
51
  React.createElement("tr", { className: "navds-table__expanded-row", "aria-hidden": !isOpen, id: id },
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandableRow.js","sourceRoot":"","sources":["../../src/table/ExpandableRow.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC;AAC3B,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,GAAiB,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA2CtD,MAAM,CAAC,MAAM,aAAa,GAAsB,UAAU,CACxD,CACE,EAWC,EACD,GAAG,EACH,EAAE;QAbF,EACE,SAAS,EACT,QAAQ,EACR,OAAO,EACP,eAAe,GAAG,MAAM,EACxB,WAAW,GAAG,KAAK,EACnB,IAAI,EACJ,YAAY,EACZ,iBAAiB,GAAG,KAAK,EACzB,OAAO,GAAG,GAAG,OAEd,EADI,IAAI,cAVT,8HAWC,CADQ;IAIT,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,WAAW,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,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,IAED,CAAC,iBAAiB,IAAI,CACrB,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,mBAC9B,EAAE,mBACF,MAAM,EACrB,OAAO,EAAE,GAAG,EAAE;oBACZ,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,CAAC,MAAM,CAAC,CAAC;oBACxB,IAAI,IAAI,KAAK,SAAS,EAAE;wBACtB,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;qBAClC;gBACH,CAAC;gBAED,oBAAC,eAAe,IACd,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,GACxC,CACK,CACV,CACQ;YACV,eAAe,KAAK,MAAM,IAAI,QAAQ,CACnC;QACN,4BAAI,SAAS,EAAC,2BAA2B,iBAAc,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;YACpE,4BAAI,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,gCAAgC;gBAC9D,oBAAC,aAAa,IACZ,SAAS,EAAC,oCAAoC,EAC9C,cAAc,EAAC,mCAAmC,EAClD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC3B,QAAQ,EAAE,GAAG,IAEZ,OAAO,CACM,CACb,CACF,CACJ,CACJ,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ExpandableRow.js","sourceRoot":"","sources":["../../src/table/ExpandableRow.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "4.8.0",
3
+ "version": "4.9.1",
4
4
  "description": "Aksel react-components for NAV designsystem",
5
5
  "author": "Aksel | NAV designsystem team",
6
6
  "license": "MIT",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@floating-ui/react": "0.24.1",
41
- "@navikt/aksel-icons": "^4.8.0",
41
+ "@navikt/aksel-icons": "^4.9.1",
42
42
  "@radix-ui/react-tabs": "1.0.0",
43
43
  "@radix-ui/react-toggle-group": "1.0.0",
44
44
  "clsx": "^1.2.1",
@@ -126,11 +126,7 @@ export const Button: OverridableComponent<ButtonProps, HTMLButtonElement> =
126
126
  <span className="navds-button__icon">{icon}</span>
127
127
  )}
128
128
  {children && (
129
- <Label
130
- as="span"
131
- size={size === "medium" ? "medium" : "small"}
132
- aria-live="polite"
133
- >
129
+ <Label as="span" size={size === "medium" ? "medium" : "small"}>
134
130
  {children}
135
131
  </Label>
136
132
  )}
@@ -148,8 +148,9 @@ export const Loading = {
148
148
  </div>
149
149
  ),
150
150
 
151
- args: { chromatic: { disableSnapshot: true } },
152
- chromatic: { disableSnapshot: true },
151
+ parameters: {
152
+ chromatic: { disableSnapshot: true },
153
+ },
153
154
  };
154
155
 
155
156
  export const Icon = () => (
@@ -275,6 +276,7 @@ export const LoadingWithAs = {
275
276
  </div>
276
277
  ),
277
278
 
278
- args: { chromatic: { disableSnapshot: true } },
279
- chromatic: { disableSnapshot: true },
279
+ parameters: {
280
+ chromatic: { disableSnapshot: true },
281
+ },
280
282
  };
@@ -1,5 +1,5 @@
1
1
  import cl from "clsx";
2
- import React, { useRef } from "react";
2
+ import React, { useRef, useState } from "react";
3
3
 
4
4
  type ComboboxWrapperProps = {
5
5
  children: any;
@@ -23,6 +23,7 @@ const ComboboxWrapper = ({
23
23
  toggleListButtonRef,
24
24
  }: ComboboxWrapperProps) => {
25
25
  const wrapperRef = useRef<HTMLDivElement | null>(null);
26
+ const [hasFocusWithin, setHasFocusWithin] = useState(false);
26
27
 
27
28
  function onFocusInsideWrapper(e) {
28
29
  if (
@@ -30,12 +31,14 @@ const ComboboxWrapper = ({
30
31
  toggleListButtonRef?.current !== e.target
31
32
  ) {
32
33
  toggleIsListOpen(true);
34
+ setHasFocusWithin(true);
33
35
  }
34
36
  }
35
37
 
36
38
  function onBlurWrapper(e) {
37
39
  if (!wrapperRef.current?.contains(e.relatedTarget)) {
38
40
  toggleIsListOpen(false);
41
+ setHasFocusWithin(false);
39
42
  }
40
43
  }
41
44
 
@@ -50,10 +53,12 @@ const ComboboxWrapper = ({
50
53
  {
51
54
  "navds-search--error": hasError,
52
55
  "navds-search--disabled": !!inputProps.disabled,
56
+ "navds-combobox--focused": hasFocusWithin,
53
57
  }
54
58
  )}
55
59
  onFocus={onFocusInsideWrapper}
56
60
  onBlur={onBlurWrapper}
61
+ tabIndex={-1}
57
62
  >
58
63
  {children}
59
64
  </div>
@@ -8,6 +8,7 @@ import { useInputContext } from "../Input/inputContext";
8
8
 
9
9
  const FilteredOptions = () => {
10
10
  const {
11
+ clearInput,
11
12
  inputProps: { id },
12
13
  size,
13
14
  value,
@@ -48,7 +49,10 @@ const FilteredOptions = () => {
48
49
  {isValueNew && allowNewValues && (
49
50
  <li
50
51
  tabIndex={-1}
51
- onPointerUp={(event) => toggleOption(value, event)}
52
+ onPointerUp={(event) => {
53
+ toggleOption(value, event);
54
+ clearInput(event);
55
+ }}
52
56
  id={`${id}-combobox-new-option`}
53
57
  className={cl("navds-combobox__list-item__new-option", {
54
58
  "navds-combobox__list-item__new-option--focus":
@@ -88,6 +92,7 @@ const FilteredOptions = () => {
88
92
  tabIndex={-1}
89
93
  onPointerUp={(event) => {
90
94
  toggleOption(option, event);
95
+ clearInput(event);
91
96
  if (!isMultiSelect) {
92
97
  toggleIsListOpen(false);
93
98
  }
@@ -60,11 +60,10 @@ export const SelectedOptionsProvider = ({
60
60
 
61
61
  const addSelectedOption = useCallback(
62
62
  (option: string) => {
63
- if (
64
- !options
65
- .map((opt) => opt.toLowerCase())
66
- .includes(option?.toLowerCase?.())
67
- ) {
63
+ const isAddedByUser = !options
64
+ .map((opt) => opt.toLowerCase())
65
+ .includes(option?.toLowerCase?.());
66
+ if (isAddedByUser) {
68
67
  allowNewValues && addCustomOption(option);
69
68
  } else if (isMultiSelect) {
70
69
  setSelectedOptions((prevSelectedOptions) => [
@@ -74,14 +73,15 @@ export const SelectedOptionsProvider = ({
74
73
  } else {
75
74
  setSelectedOptions([option]);
76
75
  }
77
- onToggleSelected?.(option, true);
76
+ onToggleSelected?.(option, true, isAddedByUser);
78
77
  },
79
78
  [addCustomOption, allowNewValues, isMultiSelect, onToggleSelected, options]
80
79
  );
81
80
 
82
81
  const removeSelectedOption = useCallback(
83
82
  (option: string) => {
84
- if (customOptions.includes(option)) {
83
+ const isAddedByUser = customOptions.includes(option);
84
+ if (isAddedByUser) {
85
85
  removeCustomOption(option);
86
86
  } else {
87
87
  setSelectedOptions((prevSelectedOptions) =>
@@ -90,7 +90,7 @@ export const SelectedOptionsProvider = ({
90
90
  )
91
91
  );
92
92
  }
93
- onToggleSelected?.(option, false);
93
+ onToggleSelected?.(option, false, isAddedByUser);
94
94
  },
95
95
  [customOptions, onToggleSelected, removeCustomOption]
96
96
  );
@@ -82,6 +82,7 @@ export function MultiSelect(props) {
82
82
  label="Komboboks - velg flere"
83
83
  options={props.options}
84
84
  isMultiSelect={props.isMultiSelect}
85
+ size={props.size}
85
86
  />
86
87
  </DemoContainer>
87
88
  );
@@ -90,6 +91,7 @@ export function MultiSelect(props) {
90
91
  MultiSelect.args = {
91
92
  options,
92
93
  isMultiSelect: true,
94
+ size: "medium",
93
95
  };
94
96
 
95
97
  export function MultiSelectWithAddNewOptions(props) {
@@ -78,10 +78,15 @@ export interface ComboboxProps
78
78
  * Callback function triggered whenever an option is selected or de-selected
79
79
  *
80
80
  * @param option
81
- * @param isSelected
81
+ * @param isSelected - Whether the option has been selected or unselected
82
+ * @param isAddedByUser - Whether the option comes from user input, instead of from the list
82
83
  * @returns
83
84
  */
84
- onToggleSelected?: (option: string, isSelected: boolean) => void;
85
+ onToggleSelected?: (
86
+ option: string,
87
+ isSelected: boolean,
88
+ isAddedByUser: boolean
89
+ ) => void;
85
90
  /**
86
91
  * List of selected options.
87
92
  *
@@ -31,10 +31,15 @@ export interface ExpandableRowProps extends Omit<RowProps, "content"> {
31
31
  */
32
32
  onOpenChange?: (open: boolean) => void;
33
33
  /**
34
- * Disable expansio
34
+ * Disable expansion. shadeOnHover will not be visible.
35
35
  * @default false
36
36
  */
37
37
  expansionDisabled?: boolean;
38
+ /**
39
+ * Makes the whole row clickable
40
+ * @default false
41
+ */
42
+ expandOnRowClick?: boolean;
38
43
  /**
39
44
  * The width of the expanded row's internal cell
40
45
  * @default 999
@@ -58,6 +63,7 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
58
63
  open,
59
64
  onOpenChange,
60
65
  expansionDisabled = false,
66
+ expandOnRowClick = false,
61
67
  colSpan = 999,
62
68
  ...rest
63
69
  },
@@ -65,9 +71,22 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
65
71
  ) => {
66
72
  const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);
67
73
  const id = useId();
68
-
69
74
  const isOpen = open ?? internalOpen;
70
75
 
76
+ const expansionHandler = (e) => {
77
+ onOpenChange?.(!isOpen);
78
+ if (open === undefined) {
79
+ setInternalOpen((open) => !open);
80
+ }
81
+ e.stopPropagation();
82
+ };
83
+
84
+ const onRowClick = (e) => {
85
+ if (e.target.nodeName === "TD" || e.target.nodeName === "TH") {
86
+ expansionHandler(e);
87
+ }
88
+ };
89
+
71
90
  return (
72
91
  <>
73
92
  <Row
@@ -75,7 +94,13 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
75
94
  ref={ref}
76
95
  className={cl("navds-table__expandable-row", className, {
77
96
  "navds-table__expandable-row--open": isOpen,
97
+ "navds-table__expandable-row--expansion-disabled":
98
+ expansionDisabled,
78
99
  })}
100
+ onClick={(e) => {
101
+ !expansionDisabled && expandOnRowClick && onRowClick(e);
102
+ rest?.onClick?.(e);
103
+ }}
79
104
  >
80
105
  {togglePlacement === "right" && children}
81
106
  <DataCell
@@ -89,12 +114,7 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
89
114
  className="navds-table__toggle-expand-button"
90
115
  aria-controls={id}
91
116
  aria-expanded={isOpen}
92
- onClick={() => {
93
- onOpenChange?.(!isOpen);
94
- if (open === undefined) {
95
- setInternalOpen((open) => !open);
96
- }
97
- }}
117
+ onClick={expansionHandler}
98
118
  >
99
119
  <ChevronDownIcon
100
120
  className="navds-table__expandable-icon"
@@ -1,6 +1,6 @@
1
1
  import React, { useState } from "react";
2
2
  import { Table } from "..";
3
- import { Link } from "../..";
3
+ import { Button, Checkbox, Link } from "../..";
4
4
 
5
5
  export default {
6
6
  title: "ds-react/Table",
@@ -37,6 +37,7 @@ export const Expandable = () => {
37
37
  };
38
38
 
39
39
  export const ExpandableSmall = () => {
40
+ // eslint-disable-next-line react-hooks/rules-of-hooks
40
41
  const [open, setOpen] = useState(false);
41
42
  return (
42
43
  <Table size="small">
@@ -227,3 +228,63 @@ export const ExpandableOpen = () => {
227
228
  </Table>
228
229
  );
229
230
  };
231
+
232
+ export const ClickableRow = {
233
+ render: () => {
234
+ // eslint-disable-next-line react-hooks/rules-of-hooks
235
+ const [isRowOpen1, setIsRowOpen1] = useState(false);
236
+ // eslint-disable-next-line react-hooks/rules-of-hooks
237
+ const [isRowOpen2, setIsRowOpen2] = useState(false);
238
+
239
+ return (
240
+ <>
241
+ <Table zebraStripes>
242
+ <Table.Header>
243
+ <Table.Row>
244
+ <Table.HeaderCell>Navn</Table.HeaderCell>
245
+ <Table.HeaderCell>Info</Table.HeaderCell>
246
+ <Table.HeaderCell aria-hidden />
247
+ </Table.Row>
248
+ </Table.Header>
249
+ <Table.Body>
250
+ <Table.ExpandableRow
251
+ content={<div>placeholder row 1</div>}
252
+ togglePlacement="right"
253
+ onOpenChange={setIsRowOpen1}
254
+ data-testid="row1"
255
+ open={isRowOpen1}
256
+ expandOnRowClick
257
+ >
258
+ <Table.DataCell>Ola</Table.DataCell>
259
+ <Table.DataCell>
260
+ <Button
261
+ size="xsmall"
262
+ onClick={(e) => {
263
+ alert("Mer info");
264
+ }}
265
+ >
266
+ Mer info
267
+ </Button>
268
+ </Table.DataCell>
269
+ </Table.ExpandableRow>
270
+ <Table.ExpandableRow
271
+ content={<div>placeholder row 2</div>}
272
+ togglePlacement="right"
273
+ onOpenChange={setIsRowOpen2}
274
+ data-testid="row2"
275
+ open={isRowOpen2}
276
+ expandOnRowClick
277
+ >
278
+ <Table.DataCell>Hans</Table.DataCell>
279
+ <Table.DataCell>
280
+ <Checkbox hideLabel size="small">
281
+ Sett
282
+ </Checkbox>
283
+ </Table.DataCell>
284
+ </Table.ExpandableRow>
285
+ </Table.Body>
286
+ </Table>
287
+ </>
288
+ );
289
+ },
290
+ };