@navikt/ds-react 4.5.0 → 4.6.0

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.
Files changed (92) hide show
  1. package/_docs.json +285 -0
  2. package/cjs/date/DateInput.js +9 -4
  3. package/cjs/date/hooks/useDatepicker.js +3 -0
  4. package/cjs/date/hooks/useMonthPicker.js +3 -0
  5. package/cjs/date/hooks/useRangeDatepicker.js +3 -0
  6. package/cjs/form/Fieldset/Fieldset.js +11 -4
  7. package/cjs/form/ReadOnlyIcon.js +15 -0
  8. package/cjs/form/Select.js +23 -3
  9. package/cjs/form/Switch.js +21 -8
  10. package/cjs/form/TextField.js +7 -3
  11. package/cjs/form/Textarea.js +7 -3
  12. package/cjs/form/checkbox/Checkbox.js +7 -2
  13. package/cjs/form/checkbox/CheckboxGroup.js +1 -1
  14. package/cjs/form/checkbox/useCheckbox.js +12 -2
  15. package/cjs/form/radio/Radio.js +3 -2
  16. package/cjs/form/radio/RadioGroup.js +2 -2
  17. package/cjs/form/radio/useRadio.js +12 -2
  18. package/cjs/form/search/Search.js +1 -1
  19. package/cjs/form/useFormField.js +11 -9
  20. package/esm/date/DateInput.js +9 -4
  21. package/esm/date/DateInput.js.map +1 -1
  22. package/esm/date/hooks/useDatepicker.js +3 -0
  23. package/esm/date/hooks/useDatepicker.js.map +1 -1
  24. package/esm/date/hooks/useMonthPicker.js +3 -0
  25. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  26. package/esm/date/hooks/useRangeDatepicker.js +3 -0
  27. package/esm/date/hooks/useRangeDatepicker.js.map +1 -1
  28. package/esm/form/ConfirmationPanel.d.ts +1 -1
  29. package/esm/form/Fieldset/Fieldset.d.ts +5 -0
  30. package/esm/form/Fieldset/Fieldset.js +11 -4
  31. package/esm/form/Fieldset/Fieldset.js.map +1 -1
  32. package/esm/form/Fieldset/useFieldset.d.ts +2 -1
  33. package/esm/form/ReadOnlyIcon.d.ts +5 -0
  34. package/esm/form/ReadOnlyIcon.js +9 -0
  35. package/esm/form/ReadOnlyIcon.js.map +1 -0
  36. package/esm/form/Select.js +23 -3
  37. package/esm/form/Select.js.map +1 -1
  38. package/esm/form/Switch.d.ts +1 -1
  39. package/esm/form/Switch.js +21 -8
  40. package/esm/form/Switch.js.map +1 -1
  41. package/esm/form/TextField.js +7 -3
  42. package/esm/form/TextField.js.map +1 -1
  43. package/esm/form/Textarea.js +7 -3
  44. package/esm/form/Textarea.js.map +1 -1
  45. package/esm/form/checkbox/Checkbox.js +7 -2
  46. package/esm/form/checkbox/Checkbox.js.map +1 -1
  47. package/esm/form/checkbox/CheckboxGroup.js +1 -1
  48. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  49. package/esm/form/checkbox/useCheckbox.d.ts +5 -2
  50. package/esm/form/checkbox/useCheckbox.js +12 -2
  51. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  52. package/esm/form/radio/Radio.d.ts +1 -1
  53. package/esm/form/radio/Radio.js +3 -2
  54. package/esm/form/radio/Radio.js.map +1 -1
  55. package/esm/form/radio/RadioGroup.js +2 -2
  56. package/esm/form/radio/RadioGroup.js.map +1 -1
  57. package/esm/form/radio/useRadio.d.ts +4 -2
  58. package/esm/form/radio/useRadio.js +12 -2
  59. package/esm/form/radio/useRadio.js.map +1 -1
  60. package/esm/form/search/Search.d.ts +1 -1
  61. package/esm/form/search/Search.js +1 -1
  62. package/esm/form/search/Search.js.map +1 -1
  63. package/esm/form/useFormField.d.ts +7 -2
  64. package/esm/form/useFormField.js +11 -9
  65. package/esm/form/useFormField.js.map +1 -1
  66. package/package.json +2 -2
  67. package/src/date/DateInput.tsx +8 -2
  68. package/src/date/datepicker/datepicker.stories.tsx +22 -0
  69. package/src/date/hooks/useDatepicker.tsx +3 -0
  70. package/src/date/hooks/useMonthPicker.tsx +3 -0
  71. package/src/date/hooks/useRangeDatepicker.tsx +3 -0
  72. package/src/form/ConfirmationPanel.tsx +1 -1
  73. package/src/form/Fieldset/Fieldset.tsx +15 -2
  74. package/src/form/ReadOnlyIcon.tsx +20 -0
  75. package/src/form/Select.tsx +28 -2
  76. package/src/form/Switch.tsx +20 -9
  77. package/src/form/TextField.tsx +5 -0
  78. package/src/form/Textarea.tsx +5 -0
  79. package/src/form/checkbox/Checkbox.tsx +7 -1
  80. package/src/form/checkbox/CheckboxGroup.tsx +1 -0
  81. package/src/form/checkbox/checkbox.stories.tsx +35 -1
  82. package/src/form/checkbox/useCheckbox.ts +13 -1
  83. package/src/form/radio/Radio.tsx +4 -3
  84. package/src/form/radio/RadioGroup.tsx +3 -0
  85. package/src/form/radio/radio.stories.tsx +27 -0
  86. package/src/form/radio/useRadio.ts +12 -1
  87. package/src/form/search/Search.tsx +2 -2
  88. package/src/form/stories/select.stories.tsx +17 -0
  89. package/src/form/stories/switch.stories.tsx +14 -0
  90. package/src/form/stories/text-field.stories.tsx +14 -0
  91. package/src/form/stories/textarea.stories.tsx +19 -0
  92. package/src/form/useFormField.ts +25 -3
package/_docs.json CHANGED
@@ -1849,6 +1849,25 @@
1849
1849
  "name": "string"
1850
1850
  }
1851
1851
  },
1852
+ "readOnly": {
1853
+ "defaultValue": null,
1854
+ "description": "Read only-state",
1855
+ "name": "readOnly",
1856
+ "parent": {
1857
+ "fileName": "react/src/form/useFormField.ts",
1858
+ "name": "FormFieldProps"
1859
+ },
1860
+ "declarations": [
1861
+ {
1862
+ "fileName": "react/src/form/useFormField.ts",
1863
+ "name": "FormFieldProps"
1864
+ }
1865
+ ],
1866
+ "required": false,
1867
+ "type": {
1868
+ "name": "boolean"
1869
+ }
1870
+ },
1852
1871
  "className": {
1853
1872
  "defaultValue": null,
1854
1873
  "description": "",
@@ -2068,6 +2087,25 @@
2068
2087
  "name": "string"
2069
2088
  }
2070
2089
  },
2090
+ "readOnly": {
2091
+ "defaultValue": null,
2092
+ "description": "Read only-state",
2093
+ "name": "readOnly",
2094
+ "parent": {
2095
+ "fileName": "react/src/form/useFormField.ts",
2096
+ "name": "FormFieldProps"
2097
+ },
2098
+ "declarations": [
2099
+ {
2100
+ "fileName": "react/src/form/useFormField.ts",
2101
+ "name": "FormFieldProps"
2102
+ }
2103
+ ],
2104
+ "required": false,
2105
+ "type": {
2106
+ "name": "boolean"
2107
+ }
2108
+ },
2071
2109
  "className": {
2072
2110
  "defaultValue": null,
2073
2111
  "description": "",
@@ -2847,6 +2885,44 @@
2847
2885
  }
2848
2886
  }
2849
2887
  },
2888
+ {
2889
+ "filePath": "src/form/ReadOnlyIcon.tsx",
2890
+ "displayName": "ReadOnlyIcon",
2891
+ "props": {
2892
+ "readOnly": {
2893
+ "defaultValue": null,
2894
+ "description": "",
2895
+ "name": "readOnly",
2896
+ "declarations": [
2897
+ {
2898
+ "fileName": "src/form/ReadOnlyIcon.tsx",
2899
+ "name": "TypeLiteral"
2900
+ }
2901
+ ],
2902
+ "required": false,
2903
+ "type": {
2904
+ "name": "boolean"
2905
+ }
2906
+ },
2907
+ "nativeReadOnly": {
2908
+ "defaultValue": {
2909
+ "value": "true"
2910
+ },
2911
+ "description": "",
2912
+ "name": "nativeReadOnly",
2913
+ "declarations": [
2914
+ {
2915
+ "fileName": "src/form/ReadOnlyIcon.tsx",
2916
+ "name": "TypeLiteral"
2917
+ }
2918
+ ],
2919
+ "required": false,
2920
+ "type": {
2921
+ "name": "boolean"
2922
+ }
2923
+ }
2924
+ }
2925
+ },
2850
2926
  {
2851
2927
  "filePath": "src/form/Select.tsx",
2852
2928
  "displayName": "Select",
@@ -3060,6 +3136,25 @@
3060
3136
  "name": "string"
3061
3137
  }
3062
3138
  },
3139
+ "readOnly": {
3140
+ "defaultValue": null,
3141
+ "description": "Read only-state",
3142
+ "name": "readOnly",
3143
+ "parent": {
3144
+ "fileName": "react/src/form/useFormField.ts",
3145
+ "name": "FormFieldProps"
3146
+ },
3147
+ "declarations": [
3148
+ {
3149
+ "fileName": "react/src/form/useFormField.ts",
3150
+ "name": "FormFieldProps"
3151
+ }
3152
+ ],
3153
+ "required": false,
3154
+ "type": {
3155
+ "name": "boolean"
3156
+ }
3157
+ },
3063
3158
  "className": {
3064
3159
  "defaultValue": null,
3065
3160
  "description": "",
@@ -3258,6 +3353,25 @@
3258
3353
  "name": "string"
3259
3354
  }
3260
3355
  },
3356
+ "readOnly": {
3357
+ "defaultValue": null,
3358
+ "description": "Read only-state",
3359
+ "name": "readOnly",
3360
+ "parent": {
3361
+ "fileName": "react/src/form/useFormField.ts",
3362
+ "name": "FormFieldProps"
3363
+ },
3364
+ "declarations": [
3365
+ {
3366
+ "fileName": "react/src/form/useFormField.ts",
3367
+ "name": "FormFieldProps"
3368
+ }
3369
+ ],
3370
+ "required": false,
3371
+ "type": {
3372
+ "name": "boolean"
3373
+ }
3374
+ },
3261
3375
  "className": {
3262
3376
  "defaultValue": null,
3263
3377
  "description": "",
@@ -3532,6 +3646,25 @@
3532
3646
  "name": "string"
3533
3647
  }
3534
3648
  },
3649
+ "readOnly": {
3650
+ "defaultValue": null,
3651
+ "description": "Read only-state",
3652
+ "name": "readOnly",
3653
+ "parent": {
3654
+ "fileName": "react/src/form/useFormField.ts",
3655
+ "name": "FormFieldProps"
3656
+ },
3657
+ "declarations": [
3658
+ {
3659
+ "fileName": "react/src/form/useFormField.ts",
3660
+ "name": "FormFieldProps"
3661
+ }
3662
+ ],
3663
+ "required": false,
3664
+ "type": {
3665
+ "name": "boolean"
3666
+ }
3667
+ },
3535
3668
  "className": {
3536
3669
  "defaultValue": null,
3537
3670
  "description": "",
@@ -3861,6 +3994,25 @@
3861
3994
  "name": "string"
3862
3995
  }
3863
3996
  },
3997
+ "readOnly": {
3998
+ "defaultValue": null,
3999
+ "description": "Read only-state",
4000
+ "name": "readOnly",
4001
+ "parent": {
4002
+ "fileName": "react/src/form/useFormField.ts",
4003
+ "name": "FormFieldProps"
4004
+ },
4005
+ "declarations": [
4006
+ {
4007
+ "fileName": "react/src/form/useFormField.ts",
4008
+ "name": "FormFieldProps"
4009
+ }
4010
+ ],
4011
+ "required": false,
4012
+ "type": {
4013
+ "name": "boolean"
4014
+ }
4015
+ },
3864
4016
  "className": {
3865
4017
  "defaultValue": null,
3866
4018
  "description": "",
@@ -12891,6 +13043,25 @@
12891
13043
  "name": "boolean"
12892
13044
  }
12893
13045
  },
13046
+ "nativeReadOnly": {
13047
+ "defaultValue": null,
13048
+ "description": "",
13049
+ "name": "nativeReadOnly",
13050
+ "parent": {
13051
+ "fileName": "src/form/Fieldset/Fieldset.tsx",
13052
+ "name": "FieldsetProps"
13053
+ },
13054
+ "declarations": [
13055
+ {
13056
+ "fileName": "src/form/Fieldset/Fieldset.tsx",
13057
+ "name": "FieldsetProps"
13058
+ }
13059
+ ],
13060
+ "required": false,
13061
+ "type": {
13062
+ "name": "boolean"
13063
+ }
13064
+ },
12894
13065
  "error": {
12895
13066
  "defaultValue": null,
12896
13067
  "description": "Error message for element",
@@ -13005,6 +13176,25 @@
13005
13176
  "name": "string"
13006
13177
  }
13007
13178
  },
13179
+ "readOnly": {
13180
+ "defaultValue": null,
13181
+ "description": "Read only-state",
13182
+ "name": "readOnly",
13183
+ "parent": {
13184
+ "fileName": "react/src/form/useFormField.ts",
13185
+ "name": "FormFieldProps"
13186
+ },
13187
+ "declarations": [
13188
+ {
13189
+ "fileName": "react/src/form/useFormField.ts",
13190
+ "name": "FormFieldProps"
13191
+ }
13192
+ ],
13193
+ "required": false,
13194
+ "type": {
13195
+ "name": "boolean"
13196
+ }
13197
+ },
13008
13198
  "className": {
13009
13199
  "defaultValue": null,
13010
13200
  "description": "",
@@ -13243,6 +13433,25 @@
13243
13433
  "name": "string"
13244
13434
  }
13245
13435
  },
13436
+ "readOnly": {
13437
+ "defaultValue": null,
13438
+ "description": "Read only-state",
13439
+ "name": "readOnly",
13440
+ "parent": {
13441
+ "fileName": "react/src/form/useFormField.ts",
13442
+ "name": "FormFieldProps"
13443
+ },
13444
+ "declarations": [
13445
+ {
13446
+ "fileName": "react/src/form/useFormField.ts",
13447
+ "name": "FormFieldProps"
13448
+ }
13449
+ ],
13450
+ "required": false,
13451
+ "type": {
13452
+ "name": "boolean"
13453
+ }
13454
+ },
13246
13455
  "className": {
13247
13456
  "defaultValue": null,
13248
13457
  "description": "",
@@ -13403,6 +13612,25 @@
13403
13612
  "name": "boolean"
13404
13613
  }
13405
13614
  },
13615
+ "nativeReadOnly": {
13616
+ "defaultValue": null,
13617
+ "description": "",
13618
+ "name": "nativeReadOnly",
13619
+ "parent": {
13620
+ "fileName": "react/src/form/Fieldset/Fieldset.tsx",
13621
+ "name": "FieldsetProps"
13622
+ },
13623
+ "declarations": [
13624
+ {
13625
+ "fileName": "react/src/form/Fieldset/Fieldset.tsx",
13626
+ "name": "FieldsetProps"
13627
+ }
13628
+ ],
13629
+ "required": false,
13630
+ "type": {
13631
+ "name": "boolean"
13632
+ }
13633
+ },
13406
13634
  "error": {
13407
13635
  "defaultValue": null,
13408
13636
  "description": "Error message for element",
@@ -13517,6 +13745,25 @@
13517
13745
  "name": "string"
13518
13746
  }
13519
13747
  },
13748
+ "readOnly": {
13749
+ "defaultValue": null,
13750
+ "description": "Read only-state",
13751
+ "name": "readOnly",
13752
+ "parent": {
13753
+ "fileName": "react/src/form/useFormField.ts",
13754
+ "name": "FormFieldProps"
13755
+ },
13756
+ "declarations": [
13757
+ {
13758
+ "fileName": "react/src/form/useFormField.ts",
13759
+ "name": "FormFieldProps"
13760
+ }
13761
+ ],
13762
+ "required": false,
13763
+ "type": {
13764
+ "name": "boolean"
13765
+ }
13766
+ },
13520
13767
  "className": {
13521
13768
  "defaultValue": null,
13522
13769
  "description": "",
@@ -14079,6 +14326,25 @@
14079
14326
  "name": "boolean"
14080
14327
  }
14081
14328
  },
14329
+ "nativeReadOnly": {
14330
+ "defaultValue": null,
14331
+ "description": "",
14332
+ "name": "nativeReadOnly",
14333
+ "parent": {
14334
+ "fileName": "react/src/form/Fieldset/Fieldset.tsx",
14335
+ "name": "FieldsetProps"
14336
+ },
14337
+ "declarations": [
14338
+ {
14339
+ "fileName": "react/src/form/Fieldset/Fieldset.tsx",
14340
+ "name": "FieldsetProps"
14341
+ }
14342
+ ],
14343
+ "required": false,
14344
+ "type": {
14345
+ "name": "boolean"
14346
+ }
14347
+ },
14082
14348
  "error": {
14083
14349
  "defaultValue": null,
14084
14350
  "description": "Error message for element",
@@ -14193,6 +14459,25 @@
14193
14459
  "name": "string"
14194
14460
  }
14195
14461
  },
14462
+ "readOnly": {
14463
+ "defaultValue": null,
14464
+ "description": "Read only-state",
14465
+ "name": "readOnly",
14466
+ "parent": {
14467
+ "fileName": "react/src/form/useFormField.ts",
14468
+ "name": "FormFieldProps"
14469
+ },
14470
+ "declarations": [
14471
+ {
14472
+ "fileName": "react/src/form/useFormField.ts",
14473
+ "name": "FormFieldProps"
14474
+ }
14475
+ ],
14476
+ "required": false,
14477
+ "type": {
14478
+ "name": "boolean"
14479
+ }
14480
+ },
14196
14481
  "className": {
14197
14482
  "defaultValue": null,
14198
14483
  "description": "",
@@ -44,6 +44,7 @@ const react_1 = __importStar(require("react"));
44
44
  const __1 = require("..");
45
45
  const useFormField_1 = require("../form/useFormField");
46
46
  const context_1 = require("./context");
47
+ const ReadOnlyIcon_1 = require("../form/ReadOnlyIcon");
47
48
  const DateInput = (0, react_1.forwardRef)((props, ref) => {
48
49
  const { className, hideLabel = false, label, description, variant = "datepicker" } = props, rest = __rest(props, ["className", "hideLabel", "label", "description", "variant"]);
49
50
  const isDatepickerVariant = variant === "datepicker";
@@ -55,22 +56,26 @@ const DateInput = (0, react_1.forwardRef)((props, ref) => {
55
56
  },
56
57
  };
57
58
  const { onOpen, ariaId, open } = (0, context_1.useDateInputContext)();
58
- const { inputProps, size = "medium", inputDescriptionId, errorId, showErrorMsg, hasError, } = (0, useFormField_1.useFormField)(props, conditionalVariables.prefix);
59
+ const { inputProps, size = "medium", inputDescriptionId, errorId, showErrorMsg, hasError, readOnly, } = (0, useFormField_1.useFormField)(props, conditionalVariables.prefix);
59
60
  return (react_1.default.createElement("div", { className: (0, clsx_1.default)(className, "navds-form-field", `navds-form-field--${size}`, "navds-date__field", {
60
61
  "navds-text-field--error": hasError,
61
62
  "navds-date__field--error": hasError,
62
63
  "navds-form-field--disabled": !!inputProps.disabled,
63
64
  "navds-text-field--disabled": !!inputProps.disabled,
65
+ "navds-text-field--readonly": readOnly,
66
+ "navds-date__field--readonly": readOnly,
64
67
  }) },
65
68
  react_1.default.createElement(__1.Label, { htmlFor: inputProps.id, size: size, className: (0, clsx_1.default)("navds-form-field__label", {
66
69
  "navds-sr-only": hideLabel,
67
- }) }, label),
70
+ }) },
71
+ react_1.default.createElement(ReadOnlyIcon_1.ReadOnlyIcon, { readOnly: readOnly }),
72
+ label),
68
73
  !!description && (react_1.default.createElement(__1.BodyShort, { as: "div", className: (0, clsx_1.default)("navds-form-field__description", {
69
74
  "navds-sr-only": hideLabel,
70
75
  }), id: inputDescriptionId, size: size }, description)),
71
76
  react_1.default.createElement("div", { className: "navds-date__field-wrapper" },
72
- react_1.default.createElement("input", Object.assign({ ref: ref }, (0, __1.omit)(rest, ["error", "errorId", "size"]), inputProps, { autoComplete: "off", "aria-controls": ariaId, className: (0, clsx_1.default)("navds-date__field-input", "navds-text-field__input", "navds-body-short", `navds-body-${size}`), size: 14 })),
73
- react_1.default.createElement("button", { disabled: inputProps.disabled, tabIndex: open ? -1 : 0, onClick: () => onOpen(), type: "button", className: "navds-date__field-button" },
77
+ react_1.default.createElement("input", Object.assign({ ref: ref }, (0, __1.omit)(rest, ["error", "errorId", "size"]), inputProps, { autoComplete: "off", "aria-controls": ariaId, readOnly: readOnly, className: (0, clsx_1.default)("navds-date__field-input", "navds-text-field__input", "navds-body-short", `navds-body-${size}`), size: 14 })),
78
+ react_1.default.createElement("button", { disabled: inputProps.disabled || readOnly, tabIndex: readOnly ? -1 : open ? -1 : 0, onClick: () => onOpen(), type: "button", className: "navds-date__field-button" },
74
79
  react_1.default.createElement(aksel_icons_1.CalendarIcon, { pointerEvents: "none", title: open
75
80
  ? conditionalVariables.iconTitle.close
76
81
  : conditionalVariables.iconTitle.open }))),
@@ -71,6 +71,9 @@ const useDatepicker = (opt = {}) => {
71
71
  setInputValue(date ? (0, utils_1.formatDateForInput)(date, locale, "date", inputFormat) : "");
72
72
  };
73
73
  const handleFocus = (e) => {
74
+ if (e.target.readOnly) {
75
+ return;
76
+ }
74
77
  !open && openOnFocus && handleOpen(true);
75
78
  let day = (0, utils_1.parseDate)(e.target.value, today, locale, "date", allowTwoDigitYear);
76
79
  if ((0, utils_1.isValidDate)(day)) {
@@ -77,6 +77,9 @@ const useMonthpicker = (opt = {}) => {
77
77
  };
78
78
  const handleFocus = (e) => {
79
79
  var _a;
80
+ if (e.target.readOnly) {
81
+ return;
82
+ }
80
83
  !open && openOnFocus && handleOpen(true);
81
84
  let day = (0, utils_1.parseDate)(e.target.value, today, locale, "month", allowTwoDigitYear);
82
85
  const isBefore = getIsBefore({ fromDate, date: day });
@@ -151,6 +151,9 @@ const useRangeDatepicker = (opt = {}) => {
151
151
  setValidation(initialValidation(range, opt));
152
152
  };
153
153
  const handleFocus = (e, src) => {
154
+ if (e.target.readOnly) {
155
+ return;
156
+ }
154
157
  !open && openOnFocus && setOpen(true);
155
158
  let day = (0, utils_1.parseDate)(e.target.value, today, locale, "date", allowTwoDigitYear);
156
159
  if ((0, utils_1.isValidDate)(day)) {
@@ -42,12 +42,13 @@ const clsx_1 = __importDefault(require("clsx"));
42
42
  const react_1 = __importStar(require("react"));
43
43
  const __1 = require("../..");
44
44
  const useFieldset_1 = require("./useFieldset");
45
+ const ReadOnlyIcon_1 = require("../ReadOnlyIcon");
45
46
  exports.FieldsetContext = react_1.default.createContext(null);
46
47
  exports.Fieldset = (0, react_1.forwardRef)((props, ref) => {
47
48
  var _a, _b, _c;
48
- const { inputProps, errorId, showErrorMsg, hasError, size, inputDescriptionId, } = (0, useFieldset_1.useFieldset)(props);
49
+ const { inputProps, errorId, showErrorMsg, hasError, size, readOnly, inputDescriptionId, } = (0, useFieldset_1.useFieldset)(props);
49
50
  const fieldset = (0, react_1.useContext)(exports.FieldsetContext);
50
- const { children, className, errorPropagation = true, legend, description, hideLegend } = props, rest = __rest(props, ["children", "className", "errorPropagation", "legend", "description", "hideLegend"]);
51
+ const { children, className, errorPropagation = true, legend, description, hideLegend, nativeReadOnly = true } = props, rest = __rest(props, ["children", "className", "errorPropagation", "legend", "description", "hideLegend", "nativeReadOnly"]);
51
52
  return (react_1.default.createElement(exports.FieldsetContext.Provider, { value: {
52
53
  error: errorPropagation ? (_a = props.error) !== null && _a !== void 0 ? _a : fieldset === null || fieldset === void 0 ? void 0 : fieldset.error : undefined,
53
54
  errorId: (0, clsx_1.default)({
@@ -56,11 +57,17 @@ exports.Fieldset = (0, react_1.forwardRef)((props, ref) => {
56
57
  }),
57
58
  size,
58
59
  disabled: (_c = props.disabled) !== null && _c !== void 0 ? _c : false,
60
+ readOnly,
59
61
  } },
60
- react_1.default.createElement("fieldset", Object.assign({}, (0, __1.omit)(rest, ["errorId", "error", "size"]), inputProps, { ref: ref, className: (0, clsx_1.default)(className, "navds-fieldset", `navds-fieldset--${size}`, { "navds-fieldset--error": hasError }) }),
62
+ react_1.default.createElement("fieldset", Object.assign({}, (0, __1.omit)(rest, ["errorId", "error", "size", "readOnly"]), inputProps, { ref: ref, className: (0, clsx_1.default)(className, "navds-fieldset", `navds-fieldset--${size}`, {
63
+ "navds-fieldset--error": hasError,
64
+ "navds-fieldset--readonly": readOnly,
65
+ }) }),
61
66
  react_1.default.createElement(__1.Label, { size: size, as: "legend", className: (0, clsx_1.default)("navds-fieldset__legend", {
62
67
  "navds-sr-only": !!hideLegend,
63
- }) }, legend),
68
+ }) },
69
+ react_1.default.createElement(ReadOnlyIcon_1.ReadOnlyIcon, { readOnly: readOnly, nativeReadOnly: nativeReadOnly }),
70
+ legend),
64
71
  !!description && (react_1.default.createElement(__1.BodyShort, { className: (0, clsx_1.default)("navds-fieldset__description", {
65
72
  "navds-sr-only": !!hideLegend,
66
73
  }), id: inputDescriptionId, size: size !== null && size !== void 0 ? size : "medium", as: "div" }, props.description)),
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ReadOnlyIcon = void 0;
7
+ const aksel_icons_1 = require("@navikt/aksel-icons");
8
+ const react_1 = __importDefault(require("react"));
9
+ const ReadOnlyIcon = ({ readOnly, nativeReadOnly = true, }) => {
10
+ if (readOnly) {
11
+ return (react_1.default.createElement(aksel_icons_1.PadlockLockedFillIcon, Object.assign({}, (nativeReadOnly ? { "aria-hidden": true } : { title: "readonly" }), { className: "navds-form-field__readonly-icon" })));
12
+ }
13
+ return null;
14
+ };
15
+ exports.ReadOnlyIcon = ReadOnlyIcon;
@@ -43,6 +43,7 @@ const react_1 = __importStar(require("react"));
43
43
  const aksel_icons_1 = require("@navikt/aksel-icons");
44
44
  const __1 = require("..");
45
45
  const useFormField_1 = require("./useFormField");
46
+ const ReadOnlyIcon_1 = require("./ReadOnlyIcon");
46
47
  /**
47
48
  * A component that displays a select input field.
48
49
  *
@@ -60,20 +61,39 @@ const useFormField_1 = require("./useFormField");
60
61
  * ```
61
62
  */
62
63
  exports.Select = (0, react_1.forwardRef)((props, ref) => {
63
- const { inputProps, errorId, showErrorMsg, hasError, size, inputDescriptionId, } = (0, useFormField_1.useFormField)(props, "textField");
64
+ const { inputProps, errorId, showErrorMsg, hasError, size, inputDescriptionId, readOnly, } = (0, useFormField_1.useFormField)(props, "select");
64
65
  const { children, label, className, description, htmlSize, hideLabel = false, style } = props, rest = __rest(props, ["children", "label", "className", "description", "htmlSize", "hideLabel", "style"]);
66
+ const readOnlyEventHandlers = {
67
+ onMouseDown: (evt) => {
68
+ // NOTE: does not prevent click
69
+ if (readOnly) {
70
+ evt.preventDefault();
71
+ // focus on the element as per readonly input behavior
72
+ evt.target.focus();
73
+ }
74
+ },
75
+ onKeyDown: (evt) => {
76
+ if (readOnly &&
77
+ ["ArrowDown", "ArrowUp", "ArrowRight", "ArrowLeft", " "].includes(evt.key)) {
78
+ evt.preventDefault();
79
+ }
80
+ },
81
+ };
65
82
  return (react_1.default.createElement("div", { className: (0, clsx_1.default)(className, "navds-form-field", `navds-form-field--${size}`, {
66
83
  "navds-form-field--disabled": !!inputProps.disabled,
67
84
  "navds-select--error": hasError,
85
+ "navds-select--readonly": readOnly,
68
86
  }) },
69
87
  react_1.default.createElement(__1.Label, { htmlFor: inputProps.id, size: size, className: (0, clsx_1.default)("navds-form-field__label", {
70
88
  "navds-sr-only": hideLabel,
71
- }) }, label),
89
+ }) },
90
+ react_1.default.createElement(ReadOnlyIcon_1.ReadOnlyIcon, { readOnly: readOnly, nativeReadOnly: false }),
91
+ label),
72
92
  !!description && (react_1.default.createElement(__1.BodyShort, { className: (0, clsx_1.default)("navds-form-field__description", {
73
93
  "navds-sr-only": hideLabel,
74
94
  }), id: inputDescriptionId, size: size, as: "div" }, description)),
75
95
  react_1.default.createElement("div", { className: "navds-select__container", style: style },
76
- react_1.default.createElement("select", Object.assign({}, (0, __1.omit)(rest, ["error", "errorId", "size"]), inputProps, { ref: ref, className: (0, clsx_1.default)("navds-select__input", "navds-body-short", `navds-body--${size !== null && size !== void 0 ? size : "medium"}`), size: props.htmlSize }), children),
96
+ react_1.default.createElement("select", Object.assign({}, (0, __1.omit)(rest, ["error", "errorId", "size", "readOnly"]), inputProps, readOnlyEventHandlers, { ref: ref, className: (0, clsx_1.default)("navds-select__input", "navds-body-short", `navds-body--${size !== null && size !== void 0 ? size : "medium"}`), size: props.htmlSize }), children),
77
97
  react_1.default.createElement(aksel_icons_1.ChevronDownIcon, { className: "navds-select__chevron", "aria-hidden": true })),
78
98
  react_1.default.createElement("div", { className: "navds-form-field__error", id: errorId, "aria-relevant": "additions removals", "aria-live": "polite" }, showErrorMsg && (react_1.default.createElement(__1.ErrorMessage, { size: size }, props.error)))));
79
99
  });
@@ -42,6 +42,7 @@ const clsx_1 = __importDefault(require("clsx"));
42
42
  const react_1 = __importStar(require("react"));
43
43
  const __1 = require("..");
44
44
  const useFormField_1 = require("./useFormField");
45
+ const ReadOnlyIcon_1 = require("./ReadOnlyIcon");
45
46
  const SelectedIcon = () => (react_1.default.createElement("svg", { width: "12", height: "10", viewBox: "0 0 12 10", fill: "none", xmlns: "http://www.w3.org/2000/svg", focusable: false, role: "img", "aria-hidden": true, "aria-label": "Deaktiver valg" },
46
47
  react_1.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M11.2674 0.647802C11.8762 1.20971 11.9141 2.1587 11.3522 2.76743L5.35221 9.26743C5.07531 9.56739 4.68813 9.74155 4.27998 9.74971C3.87184 9.75787 3.478 9.59933 3.18934 9.31067L0.68934 6.81067C0.103553 6.22488 0.103553 5.27513 0.68934 4.68935C1.27513 4.10356 2.22487 4.10356 2.81066 4.68935L4.20673 6.08541L9.14779 0.732587C9.7097 0.123856 10.6587 0.0858967 11.2674 0.647802Z", fill: "currentColor" })));
47
48
  /**
@@ -52,26 +53,36 @@ const SelectedIcon = () => (react_1.default.createElement("svg", { width: "12",
52
53
  *
53
54
  * @example
54
55
  * ```jsx
55
- * <Switch>Slå notifikasjoner</Switch>
56
+ * <Switch>Varsle med SMS</Switch>
56
57
  * ```
57
58
  */
58
59
  exports.Switch = (0, react_1.forwardRef)((props, ref) => {
59
60
  var _a, _b, _c;
60
- const { inputProps, size } = (0, useFormField_1.useFormField)(props, "switch");
61
+ const { inputProps, size, readOnly } = (0, useFormField_1.useFormField)(props, "switch");
61
62
  const { children, className, description, hideLabel = false, loading, checked: checkedProp, defaultChecked, position = "left" } = props, rest = __rest(props, ["children", "className", "description", "hideLabel", "loading", "checked", "defaultChecked", "position"]);
62
63
  const [checked, setChecked] = (0, react_1.useState)((_a = defaultChecked !== null && defaultChecked !== void 0 ? defaultChecked : checkedProp) !== null && _a !== void 0 ? _a : false);
63
64
  (0, react_1.useEffect)(() => {
64
65
  checkedProp !== undefined && setChecked(checkedProp);
65
66
  }, [checkedProp]);
66
- const handleChange = (e) => {
67
- setChecked(e.target.checked);
68
- props.onChange && props.onChange(e);
69
- };
70
67
  return (react_1.default.createElement("div", { className: (0, clsx_1.default)("navds-switch", props.className, `navds-switch--${size}`, `navds-switch--${position}`, {
71
68
  "navds-switch--loading": loading,
72
69
  "navds-switch--disabled": (_b = inputProps.disabled) !== null && _b !== void 0 ? _b : loading,
70
+ "navds-switch--readonly": readOnly,
73
71
  }) },
74
- react_1.default.createElement("input", Object.assign({}, (0, __1.omit)(rest, ["size"]), (0, __1.omit)(inputProps, ["aria-invalid", "aria-describedby"]), { disabled: (_c = inputProps.disabled) !== null && _c !== void 0 ? _c : loading, checked: checkedProp, defaultChecked: defaultChecked, ref: ref, type: "checkbox", onChange: (e) => handleChange(e), className: (0, clsx_1.default)(className, "navds-switch__input") })),
72
+ react_1.default.createElement("input", Object.assign({}, (0, __1.omit)(rest, ["size", "readOnly"]), (0, __1.omit)(inputProps, ["aria-invalid", "aria-describedby"]), { disabled: (_c = inputProps.disabled) !== null && _c !== void 0 ? _c : loading, checked: checkedProp, defaultChecked: defaultChecked, ref: ref, type: "checkbox", onChange: (e) => {
73
+ if (readOnly) {
74
+ return;
75
+ }
76
+ setChecked(e.target.checked);
77
+ props.onChange && props.onChange(e);
78
+ }, onClick: (e) => {
79
+ var _a;
80
+ if (readOnly) {
81
+ e.preventDefault();
82
+ return;
83
+ }
84
+ (_a = props === null || props === void 0 ? void 0 : props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, e);
85
+ }, className: (0, clsx_1.default)(className, "navds-switch__input") })),
75
86
  react_1.default.createElement("span", { className: "navds-switch__track" },
76
87
  react_1.default.createElement("span", { className: "navds-switch__thumb" }, loading ? (react_1.default.createElement(__1.Loader, { size: "xsmall", "aria-live": "polite" })) : checked ? (react_1.default.createElement(SelectedIcon, null)) : null)),
77
88
  react_1.default.createElement("label", { htmlFor: inputProps.id, className: "navds-switch__label-wrapper" },
@@ -79,7 +90,9 @@ exports.Switch = (0, react_1.forwardRef)((props, ref) => {
79
90
  "navds-sr-only": hideLabel,
80
91
  "navds-switch--with-description": !!description && !hideLabel,
81
92
  }) },
82
- react_1.default.createElement(__1.BodyShort, { as: "div", size: size, className: "navds-switch__label" }, children),
93
+ react_1.default.createElement(__1.BodyShort, { as: "div", size: size, className: "navds-switch__label" },
94
+ react_1.default.createElement(ReadOnlyIcon_1.ReadOnlyIcon, { readOnly: readOnly, nativeReadOnly: false }),
95
+ children),
83
96
  description && (react_1.default.createElement(__1.BodyShort, { size: size, as: "div", className: "navds-form-field__subdescription navds-switch__description" }, description))))));
84
97
  });
85
98
  exports.default = exports.Switch;
@@ -41,6 +41,7 @@ exports.TextField = void 0;
41
41
  const clsx_1 = __importDefault(require("clsx"));
42
42
  const react_1 = __importStar(require("react"));
43
43
  const __1 = require("..");
44
+ const ReadOnlyIcon_1 = require("./ReadOnlyIcon");
44
45
  const useFormField_1 = require("./useFormField");
45
46
  /**
46
47
  * A component that displays a text input field with a label.
@@ -55,19 +56,22 @@ const useFormField_1 = require("./useFormField");
55
56
  */
56
57
  exports.TextField = (0, react_1.forwardRef)((props, ref) => {
57
58
  const { inputProps, errorId, showErrorMsg, hasError, size, inputDescriptionId, } = (0, useFormField_1.useFormField)(props, "textField");
58
- const { label, className, description, htmlSize, hideLabel = false, type = "text" } = props, rest = __rest(props, ["label", "className", "description", "htmlSize", "hideLabel", "type"]);
59
+ const { label, className, description, htmlSize, hideLabel = false, type = "text", readOnly } = props, rest = __rest(props, ["label", "className", "description", "htmlSize", "hideLabel", "type", "readOnly"]);
59
60
  return (react_1.default.createElement("div", { className: (0, clsx_1.default)(className, "navds-form-field", `navds-form-field--${size}`, {
60
61
  "navds-text-field--error": hasError,
61
62
  "navds-text-field--disabled": !!inputProps.disabled,
62
63
  "navds-form-field--disabled": !!inputProps.disabled,
64
+ "navds-text-field--readonly": readOnly,
63
65
  }) },
64
66
  react_1.default.createElement(__1.Label, { htmlFor: inputProps.id, size: size, className: (0, clsx_1.default)("navds-form-field__label", {
65
67
  "navds-sr-only": hideLabel,
66
- }) }, label),
68
+ }) },
69
+ react_1.default.createElement(ReadOnlyIcon_1.ReadOnlyIcon, { readOnly: readOnly }),
70
+ label),
67
71
  !!description && (react_1.default.createElement(__1.BodyShort, { className: (0, clsx_1.default)("navds-form-field__description", {
68
72
  "navds-sr-only": hideLabel,
69
73
  }), id: inputDescriptionId, size: size, as: "div" }, description)),
70
- react_1.default.createElement("input", Object.assign({}, (0, __1.omit)(rest, ["error", "errorId", "size"]), inputProps, { ref: ref, type: type, className: (0, clsx_1.default)("navds-text-field__input", "navds-body-short", `navds-body-${size !== null && size !== void 0 ? size : "medium"}`), size: htmlSize })),
74
+ react_1.default.createElement("input", Object.assign({}, (0, __1.omit)(rest, ["error", "errorId", "size"]), inputProps, { ref: ref, type: type, readOnly: readOnly, className: (0, clsx_1.default)("navds-text-field__input", "navds-body-short", `navds-body-${size !== null && size !== void 0 ? size : "medium"}`), size: htmlSize })),
71
75
  react_1.default.createElement("div", { className: "navds-form-field__error", id: errorId, "aria-relevant": "additions removals", "aria-live": "polite" }, showErrorMsg && (react_1.default.createElement(__1.ErrorMessage, { size: size }, props.error)))));
72
76
  });
73
77
  exports.default = exports.TextField;