@navikt/ds-react 5.17.2 → 5.17.3
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/form/Textarea.js
CHANGED
|
@@ -43,6 +43,7 @@ const react_1 = __importStar(require("react"));
|
|
|
43
43
|
const typography_1 = require("../typography");
|
|
44
44
|
const util_1 = require("../util");
|
|
45
45
|
const TextareaAutoSize_1 = __importDefault(require("../util/TextareaAutoSize"));
|
|
46
|
+
const composeEventHandlers_1 = require("../util/composeEventHandlers");
|
|
46
47
|
const hooks_1 = require("../util/hooks");
|
|
47
48
|
const ReadOnlyIcon_1 = require("./ReadOnlyIcon");
|
|
48
49
|
const TextareaCounter_1 = __importDefault(require("./TextareaCounter"));
|
|
@@ -64,7 +65,7 @@ exports.Textarea = (0, react_1.forwardRef)((props, ref) => {
|
|
|
64
65
|
const { label, className, description, maxLength, hideLabel = false, resize, UNSAFE_autoScrollbar, i18n, readOnly } = props, rest = __rest(props, ["label", "className", "description", "maxLength", "hideLabel", "resize", "UNSAFE_autoScrollbar", "i18n", "readOnly"]);
|
|
65
66
|
const maxLengthId = (0, hooks_1.useId)();
|
|
66
67
|
const hasMaxLength = maxLength !== undefined && maxLength > 0;
|
|
67
|
-
const [
|
|
68
|
+
const [uncontrolledValue, setUncontrolledValue] = (0, react_1.useState)((_a = props === null || props === void 0 ? void 0 : props.defaultValue) !== null && _a !== void 0 ? _a : "");
|
|
68
69
|
const getMinRows = () => {
|
|
69
70
|
let rows = (rest === null || rest === void 0 ? void 0 : rest.minRows) ? rest === null || rest === void 0 ? void 0 : rest.minRows : 3;
|
|
70
71
|
if (size === "small") {
|
|
@@ -92,12 +93,12 @@ exports.Textarea = (0, react_1.forwardRef)((props, ref) => {
|
|
|
92
93
|
"navds-sr-only": hideLabel,
|
|
93
94
|
}), id: inputDescriptionId, size: size, as: "div" }, description)),
|
|
94
95
|
react_1.default.createElement("div", { className: "navds-textarea__wrapper" },
|
|
95
|
-
react_1.default.createElement(TextareaAutoSize_1.default, Object.assign({}, (0, util_1.omit)(rest, ["error", "errorId", "size"]), inputProps, { onChange: (
|
|
96
|
-
?
|
|
97
|
-
:
|
|
96
|
+
react_1.default.createElement(TextareaAutoSize_1.default, Object.assign({}, (0, util_1.omit)(rest, ["error", "errorId", "size"]), inputProps, { onChange: (0, composeEventHandlers_1.composeEventHandlers)(props.onChange, props.value === undefined
|
|
97
|
+
? (e) => setUncontrolledValue(e.target.value)
|
|
98
|
+
: undefined), minRows: getMinRows(), autoScrollbar: UNSAFE_autoScrollbar, ref: ref, readOnly: readOnly, className: (0, clsx_1.default)("navds-textarea__input", "navds-body-short", `navds-body-short--${size !== null && size !== void 0 ? size : "medium"}`) }, (describedBy ? { "aria-describedby": describedBy } : {}))),
|
|
98
99
|
hasMaxLength && !readOnly && !inputProps.disabled && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
99
100
|
react_1.default.createElement("span", { id: maxLengthId, className: "navds-sr-only" }, `Tekstområde med plass til ${maxLength} tegn.`),
|
|
100
|
-
react_1.default.createElement(TextareaCounter_1.default, { maxLength: maxLength, currentLength: (_c = (_b = props.value) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c :
|
|
101
|
+
react_1.default.createElement(TextareaCounter_1.default, { maxLength: maxLength, currentLength: (_c = (_b = props.value) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : uncontrolledValue.length, size: size, i18n: i18n })))),
|
|
101
102
|
react_1.default.createElement("div", { className: "navds-form-field__error", id: errorId, "aria-relevant": "additions removals", "aria-live": "polite" }, showErrorMsg && (react_1.default.createElement(typography_1.ErrorMessage, { size: size }, props.error)))));
|
|
102
103
|
});
|
|
103
104
|
exports.default = exports.Textarea;
|
package/esm/form/Textarea.js
CHANGED
|
@@ -14,6 +14,7 @@ import React, { forwardRef, useState } from "react";
|
|
|
14
14
|
import { BodyShort, ErrorMessage, Label } from "../typography";
|
|
15
15
|
import { omit } from "../util";
|
|
16
16
|
import TextareaAutosize from "../util/TextareaAutoSize";
|
|
17
|
+
import { composeEventHandlers } from "../util/composeEventHandlers";
|
|
17
18
|
import { useId } from "../util/hooks";
|
|
18
19
|
import { ReadOnlyIcon } from "./ReadOnlyIcon";
|
|
19
20
|
import Counter from "./TextareaCounter";
|
|
@@ -35,7 +36,7 @@ export const Textarea = forwardRef((props, ref) => {
|
|
|
35
36
|
const { label, className, description, maxLength, hideLabel = false, resize, UNSAFE_autoScrollbar, i18n, readOnly } = props, rest = __rest(props, ["label", "className", "description", "maxLength", "hideLabel", "resize", "UNSAFE_autoScrollbar", "i18n", "readOnly"]);
|
|
36
37
|
const maxLengthId = useId();
|
|
37
38
|
const hasMaxLength = maxLength !== undefined && maxLength > 0;
|
|
38
|
-
const [
|
|
39
|
+
const [uncontrolledValue, setUncontrolledValue] = useState((_a = props === null || props === void 0 ? void 0 : props.defaultValue) !== null && _a !== void 0 ? _a : "");
|
|
39
40
|
const getMinRows = () => {
|
|
40
41
|
let rows = (rest === null || rest === void 0 ? void 0 : rest.minRows) ? rest === null || rest === void 0 ? void 0 : rest.minRows : 3;
|
|
41
42
|
if (size === "small") {
|
|
@@ -63,12 +64,12 @@ export const Textarea = forwardRef((props, ref) => {
|
|
|
63
64
|
"navds-sr-only": hideLabel,
|
|
64
65
|
}), id: inputDescriptionId, size: size, as: "div" }, description)),
|
|
65
66
|
React.createElement("div", { className: "navds-textarea__wrapper" },
|
|
66
|
-
React.createElement(TextareaAutosize, Object.assign({}, omit(rest, ["error", "errorId", "size"]), inputProps, { onChange: (
|
|
67
|
-
?
|
|
68
|
-
:
|
|
67
|
+
React.createElement(TextareaAutosize, Object.assign({}, omit(rest, ["error", "errorId", "size"]), inputProps, { onChange: composeEventHandlers(props.onChange, props.value === undefined
|
|
68
|
+
? (e) => setUncontrolledValue(e.target.value)
|
|
69
|
+
: undefined), minRows: getMinRows(), autoScrollbar: UNSAFE_autoScrollbar, ref: ref, readOnly: readOnly, className: cl("navds-textarea__input", "navds-body-short", `navds-body-short--${size !== null && size !== void 0 ? size : "medium"}`) }, (describedBy ? { "aria-describedby": describedBy } : {}))),
|
|
69
70
|
hasMaxLength && !readOnly && !inputProps.disabled && (React.createElement(React.Fragment, null,
|
|
70
71
|
React.createElement("span", { id: maxLengthId, className: "navds-sr-only" }, `Tekstområde med plass til ${maxLength} tegn.`),
|
|
71
|
-
React.createElement(Counter, { maxLength: maxLength, currentLength: (_c = (_b = props.value) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c :
|
|
72
|
+
React.createElement(Counter, { maxLength: maxLength, currentLength: (_c = (_b = props.value) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : uncontrolledValue.length, size: size, i18n: i18n })))),
|
|
72
73
|
React.createElement("div", { className: "navds-form-field__error", id: errorId, "aria-relevant": "additions removals", "aria-live": "polite" }, showErrorMsg && (React.createElement(ErrorMessage, { size: size }, props.error)))));
|
|
73
74
|
});
|
|
74
75
|
export default Textarea;
|
package/esm/form/Textarea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sourceRoot":"","sources":["../../src/form/Textarea.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,gBAAgB,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,OAAO,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAkB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0D9D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;;IACb,MAAM,EACJ,UAAU,EACV,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,kBAAkB,GACnB,GAAG,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpC,MAAM,EACJ,KAAK,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,GAAG,KAAK,EACjB,MAAM,EACN,oBAAoB,EACpB,IAAI,EACJ,QAAQ,KAEN,KAAK,EADJ,IAAI,UACL,KAAK,EAXH,qHAWL,CAAQ,CAAC;IAEV,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC;IAE9D,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"Textarea.js","sourceRoot":"","sources":["../../src/form/Textarea.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": "5.17.
|
|
3
|
+
"version": "5.17.3",
|
|
4
4
|
"description": "Aksel react-components for NAV designsystem",
|
|
5
5
|
"author": "Aksel | NAV designsystem team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@floating-ui/react": "0.25.4",
|
|
41
|
-
"@navikt/aksel-icons": "^5.17.
|
|
42
|
-
"@navikt/ds-tokens": "^5.17.
|
|
41
|
+
"@navikt/aksel-icons": "^5.17.3",
|
|
42
|
+
"@navikt/ds-tokens": "^5.17.3",
|
|
43
43
|
"@radix-ui/react-tabs": "1.0.0",
|
|
44
44
|
"@radix-ui/react-toggle-group": "1.0.0",
|
|
45
45
|
"clsx": "^1.2.1",
|
package/src/form/Textarea.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import React, { forwardRef, useState } from "react";
|
|
|
3
3
|
import { BodyShort, ErrorMessage, Label } from "../typography";
|
|
4
4
|
import { omit } from "../util";
|
|
5
5
|
import TextareaAutosize from "../util/TextareaAutoSize";
|
|
6
|
+
import { composeEventHandlers } from "../util/composeEventHandlers";
|
|
6
7
|
import { useId } from "../util/hooks";
|
|
7
8
|
import { ReadOnlyIcon } from "./ReadOnlyIcon";
|
|
8
9
|
import Counter from "./TextareaCounter";
|
|
@@ -102,7 +103,7 @@ export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
102
103
|
const maxLengthId = useId();
|
|
103
104
|
const hasMaxLength = maxLength !== undefined && maxLength > 0;
|
|
104
105
|
|
|
105
|
-
const [
|
|
106
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(
|
|
106
107
|
props?.defaultValue ?? "",
|
|
107
108
|
);
|
|
108
109
|
|
|
@@ -161,11 +162,12 @@ export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
161
162
|
<TextareaAutosize
|
|
162
163
|
{...omit(rest, ["error", "errorId", "size"])}
|
|
163
164
|
{...inputProps}
|
|
164
|
-
onChange={(
|
|
165
|
-
props.onChange
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
onChange={composeEventHandlers(
|
|
166
|
+
props.onChange,
|
|
167
|
+
props.value === undefined
|
|
168
|
+
? (e) => setUncontrolledValue(e.target.value)
|
|
169
|
+
: undefined,
|
|
170
|
+
)}
|
|
169
171
|
minRows={getMinRows()}
|
|
170
172
|
autoScrollbar={UNSAFE_autoScrollbar}
|
|
171
173
|
ref={ref}
|
|
@@ -184,7 +186,7 @@ export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
184
186
|
</span>
|
|
185
187
|
<Counter
|
|
186
188
|
maxLength={maxLength}
|
|
187
|
-
currentLength={props.value?.length ??
|
|
189
|
+
currentLength={props.value?.length ?? uncontrolledValue.length}
|
|
188
190
|
size={size}
|
|
189
191
|
i18n={i18n}
|
|
190
192
|
/>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Meta, StoryFn, StoryObj } from "@storybook/react";
|
|
2
|
+
import { expect, userEvent, within } from "@storybook/test";
|
|
2
3
|
import React, { useState } from "react";
|
|
3
4
|
import { Button } from "../../button";
|
|
4
5
|
import { Modal } from "../../modal";
|
|
@@ -125,6 +126,24 @@ export const Resize: StoryFn = () => {
|
|
|
125
126
|
return <Textarea resize label="Ipsum enim quis culpa" />;
|
|
126
127
|
};
|
|
127
128
|
|
|
129
|
+
export const OnChange: StoryFn = () => {
|
|
130
|
+
return (
|
|
131
|
+
<Textarea
|
|
132
|
+
label="Ipsum enim quis culpa"
|
|
133
|
+
onChange={console.log}
|
|
134
|
+
maxLength={50}
|
|
135
|
+
/>
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
OnChange.play = async ({ canvasElement }) => {
|
|
139
|
+
const canvas = within(canvasElement);
|
|
140
|
+
const input = canvas.getByLabelText("Ipsum enim quis culpa");
|
|
141
|
+
userEvent.click(input);
|
|
142
|
+
await userEvent.type(input, "Aute fugiat ut culpa");
|
|
143
|
+
const text = canvas.getByText("30 tegn igjen");
|
|
144
|
+
expect(text).toBeVisible();
|
|
145
|
+
};
|
|
146
|
+
|
|
128
147
|
export const Controlled: StoryFn = () => {
|
|
129
148
|
const [value, setValue] = useState("");
|
|
130
149
|
return (
|