@onewelcome/react-lib-components 8.5.0 → 8.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 (208) hide show
  1. package/dist/cjs/Form/Checkbox/Checkbox.cjs.js +1 -1
  2. package/dist/cjs/Form/Checkbox/Checkbox.cjs.js.map +1 -1
  3. package/dist/cjs/Form/Checkbox/Checkbox.module.scss.cjs.js +1 -1
  4. package/dist/cjs/Form/Fieldset/Fieldset.cjs.js +1 -1
  5. package/dist/cjs/Form/Fieldset/Fieldset.cjs.js.map +1 -1
  6. package/dist/cjs/Form/FileUpload/FileItem/FileItem.cjs.js +1 -1
  7. package/dist/cjs/Form/FileUpload/FileItem/FileItem.cjs.js.map +1 -1
  8. package/dist/cjs/Form/FileUpload/FileItem/FileItem.module.scss.cjs.js +1 -1
  9. package/dist/cjs/Form/FileUpload/FileUpload.cjs.js +1 -1
  10. package/dist/cjs/Form/FileUpload/FileUpload.cjs.js.map +1 -1
  11. package/dist/cjs/Form/FileUpload/FileUpload.module.scss.cjs.js +1 -1
  12. package/dist/cjs/Form/FormHelperText/FormHelperText.module.scss.cjs.js +1 -1
  13. package/dist/cjs/Form/Input/Input.cjs.js +1 -1
  14. package/dist/cjs/Form/Input/Input.cjs.js.map +1 -1
  15. package/dist/cjs/Form/Input/Input.module.scss.cjs.js +1 -1
  16. package/dist/cjs/Form/Radio/Radio.cjs.js +1 -1
  17. package/dist/cjs/Form/Radio/Radio.cjs.js.map +1 -1
  18. package/dist/cjs/Form/Radio/Radio.module.scss.cjs.js +1 -1
  19. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.cjs.js +1 -1
  20. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.cjs.js.map +1 -1
  21. package/dist/cjs/Form/Select/MultiSelect/MultiSelect.module.scss.cjs.js +1 -1
  22. package/dist/cjs/Form/Select/MultiSelect/SelectedOptions.module.scss.cjs.js +1 -1
  23. package/dist/cjs/Form/Select/MultiSelect/useArrowNavigation.cjs.js +1 -1
  24. package/dist/cjs/Form/Select/MultiSelect/useArrowNavigation.cjs.js.map +1 -1
  25. package/dist/cjs/Form/Select/MultiSelect/useMultiSelect.cjs.js +2 -0
  26. package/dist/cjs/Form/Select/MultiSelect/useMultiSelect.cjs.js.map +1 -0
  27. package/dist/cjs/Form/Select/Select.interfaces.cjs.js +2 -0
  28. package/dist/cjs/Form/Select/Select.interfaces.cjs.js.map +1 -0
  29. package/dist/cjs/Form/Select/SingleSelect/Select.cjs.js +1 -1
  30. package/dist/cjs/Form/Select/SingleSelect/Select.cjs.js.map +1 -1
  31. package/dist/cjs/Form/Select/SingleSelect/Select.module.scss.cjs.js +1 -1
  32. package/dist/cjs/Form/Select/SingleSelect/useArrowNavigation.cjs.js +1 -1
  33. package/dist/cjs/Form/Select/SingleSelect/useArrowNavigation.cjs.js.map +1 -1
  34. package/dist/cjs/Form/Select/useSelectPositionList.cjs.js +1 -1
  35. package/dist/cjs/Form/Select/useSelectPositionList.cjs.js.map +1 -1
  36. package/dist/cjs/Form/Textarea/Textarea.cjs.js +1 -1
  37. package/dist/cjs/Form/Textarea/Textarea.cjs.js.map +1 -1
  38. package/dist/cjs/Form/Textarea/Textarea.module.scss.cjs.js +1 -1
  39. package/dist/cjs/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.cjs.js +1 -1
  40. package/dist/cjs/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.cjs.js.map +1 -1
  41. package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.cjs.js +1 -1
  42. package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.cjs.js.map +1 -1
  43. package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.module.scss.cjs.js +1 -1
  44. package/dist/cjs/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.cjs.js +1 -1
  45. package/dist/cjs/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.cjs.js.map +1 -1
  46. package/dist/cjs/Form/Wrapper/RadioWrapper/RadioWrapper.cjs.js +1 -1
  47. package/dist/cjs/Form/Wrapper/RadioWrapper/RadioWrapper.cjs.js.map +1 -1
  48. package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.cjs.js +1 -1
  49. package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.cjs.js.map +1 -1
  50. package/dist/cjs/Form/Wrapper/TextareaWrapper/TextareaWrapper.cjs.js +1 -1
  51. package/dist/cjs/Form/Wrapper/TextareaWrapper/TextareaWrapper.cjs.js.map +1 -1
  52. package/dist/cjs/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss.cjs.js +1 -1
  53. package/dist/cjs/Form/Wrapper/Wrapper/Wrapper.module.scss.cjs.js +1 -1
  54. package/dist/cjs/_BaseStyling_/BaseStyling.cjs.js +1 -1
  55. package/dist/cjs/_BaseStyling_/BaseStyling.cjs.js.map +1 -1
  56. package/dist/cjs/src/components/Form/Checkbox/Checkbox.d.ts +1 -1
  57. package/dist/cjs/src/components/Form/Fieldset/Fieldset.d.ts +1 -1
  58. package/dist/cjs/src/components/Form/FileUpload/FileItem/FileItem.d.ts +1 -1
  59. package/dist/cjs/src/components/Form/FileUpload/FileUpload.d.ts +6 -1
  60. package/dist/cjs/src/components/Form/Input/Input.d.ts +2 -1
  61. package/dist/cjs/src/components/Form/Radio/Radio.d.ts +1 -1
  62. package/dist/cjs/src/components/Form/Select/MultiSelect/MultiSelect.d.ts +1 -1
  63. package/dist/cjs/src/components/Form/Select/MultiSelect/useArrowNavigation.d.ts +2 -1
  64. package/dist/cjs/src/components/Form/Select/MultiSelect/useMultiSelect.d.ts +16 -0
  65. package/dist/cjs/src/components/Form/Select/MultiSelect/useMultiSelect.test.d.ts +1 -0
  66. package/dist/cjs/src/components/Form/Select/Select.interfaces.d.ts +6 -4
  67. package/dist/cjs/src/components/Form/Select/SingleSelect/Select.d.ts +1 -1
  68. package/dist/cjs/src/components/Form/Select/SingleSelect/useArrowNavigation.d.ts +1 -1
  69. package/dist/cjs/src/components/Form/Select/useSelectPositionList.d.ts +2 -2
  70. package/dist/cjs/src/components/Form/Textarea/Textarea.d.ts +2 -1
  71. package/dist/cjs/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.d.ts +1 -1
  72. package/dist/cjs/src/components/Form/Wrapper/InputWrapper/InputWrapper.d.ts +1 -1
  73. package/dist/cjs/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.d.ts +1 -1
  74. package/dist/cjs/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.d.ts +1 -1
  75. package/dist/cjs/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +1 -1
  76. package/dist/cjs/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.d.ts +2 -1
  77. package/dist/cjs/src/components/_BaseStyling_/BaseStyling.d.ts +2 -0
  78. package/dist/cjs/src/components/withReadOnly.d.ts +8 -0
  79. package/dist/cjs/src/components/withReadOnly.test.d.ts +1 -0
  80. package/dist/cjs/src/index.cjs.js +1 -1
  81. package/dist/cjs/src/index.d.ts +1 -0
  82. package/dist/cjs/src/util/unitTestUtils.d.ts +12 -0
  83. package/dist/cjs/withReadOnly.cjs.js +2 -0
  84. package/dist/cjs/withReadOnly.cjs.js.map +1 -0
  85. package/dist/esm/Form/Checkbox/Checkbox.esm.js +2 -1
  86. package/dist/esm/Form/Checkbox/Checkbox.esm.js.map +1 -1
  87. package/dist/esm/Form/Checkbox/Checkbox.module.scss.esm.js +1 -1
  88. package/dist/esm/Form/Fieldset/Fieldset.esm.js +2 -1
  89. package/dist/esm/Form/Fieldset/Fieldset.esm.js.map +1 -1
  90. package/dist/esm/Form/FileUpload/FileItem/FileItem.esm.js +10 -3
  91. package/dist/esm/Form/FileUpload/FileItem/FileItem.esm.js.map +1 -1
  92. package/dist/esm/Form/FileUpload/FileItem/FileItem.module.scss.esm.js +1 -1
  93. package/dist/esm/Form/FileUpload/FileUpload.esm.js +9 -6
  94. package/dist/esm/Form/FileUpload/FileUpload.esm.js.map +1 -1
  95. package/dist/esm/Form/FileUpload/FileUpload.module.scss.esm.js +2 -2
  96. package/dist/esm/Form/FormHelperText/FormHelperText.module.scss.esm.js +1 -1
  97. package/dist/esm/Form/Input/Input.esm.js +7 -5
  98. package/dist/esm/Form/Input/Input.esm.js.map +1 -1
  99. package/dist/esm/Form/Input/Input.module.scss.esm.js +2 -2
  100. package/dist/esm/Form/Radio/Radio.esm.js +2 -1
  101. package/dist/esm/Form/Radio/Radio.esm.js.map +1 -1
  102. package/dist/esm/Form/Radio/Radio.module.scss.esm.js +1 -1
  103. package/dist/esm/Form/Select/MultiSelect/MultiSelect.esm.js +24 -13
  104. package/dist/esm/Form/Select/MultiSelect/MultiSelect.esm.js.map +1 -1
  105. package/dist/esm/Form/Select/MultiSelect/MultiSelect.module.scss.esm.js +2 -2
  106. package/dist/esm/Form/Select/MultiSelect/SelectedOptions.module.scss.esm.js +1 -1
  107. package/dist/esm/Form/Select/MultiSelect/useArrowNavigation.esm.js +4 -1
  108. package/dist/esm/Form/Select/MultiSelect/useArrowNavigation.esm.js.map +1 -1
  109. package/dist/esm/Form/Select/MultiSelect/useMultiSelect.esm.js +63 -0
  110. package/dist/esm/Form/Select/MultiSelect/useMultiSelect.esm.js.map +1 -0
  111. package/dist/esm/Form/Select/Select.interfaces.esm.js +23 -0
  112. package/dist/esm/Form/Select/Select.interfaces.esm.js.map +1 -0
  113. package/dist/esm/Form/Select/SingleSelect/Select.esm.js +20 -15
  114. package/dist/esm/Form/Select/SingleSelect/Select.esm.js.map +1 -1
  115. package/dist/esm/Form/Select/SingleSelect/Select.module.scss.esm.js +2 -2
  116. package/dist/esm/Form/Select/SingleSelect/useArrowNavigation.esm.js +4 -1
  117. package/dist/esm/Form/Select/SingleSelect/useArrowNavigation.esm.js.map +1 -1
  118. package/dist/esm/Form/Select/useSelectPositionList.esm.js +5 -4
  119. package/dist/esm/Form/Select/useSelectPositionList.esm.js.map +1 -1
  120. package/dist/esm/Form/Textarea/Textarea.esm.js +12 -5
  121. package/dist/esm/Form/Textarea/Textarea.esm.js.map +1 -1
  122. package/dist/esm/Form/Textarea/Textarea.module.scss.esm.js +1 -1
  123. package/dist/esm/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.esm.js +4 -1
  124. package/dist/esm/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.esm.js.map +1 -1
  125. package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.esm.js +4 -2
  126. package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.esm.js.map +1 -1
  127. package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.module.scss.esm.js +1 -1
  128. package/dist/esm/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.esm.js +3 -2
  129. package/dist/esm/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.esm.js.map +1 -1
  130. package/dist/esm/Form/Wrapper/RadioWrapper/RadioWrapper.esm.js +17 -10
  131. package/dist/esm/Form/Wrapper/RadioWrapper/RadioWrapper.esm.js.map +1 -1
  132. package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.esm.js +5 -2
  133. package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.esm.js.map +1 -1
  134. package/dist/esm/Form/Wrapper/TextareaWrapper/TextareaWrapper.esm.js +20 -10
  135. package/dist/esm/Form/Wrapper/TextareaWrapper/TextareaWrapper.esm.js.map +1 -1
  136. package/dist/esm/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss.esm.js +2 -2
  137. package/dist/esm/Form/Wrapper/Wrapper/Wrapper.module.scss.esm.js +1 -1
  138. package/dist/esm/_BaseStyling_/BaseStyling.esm.js +2 -0
  139. package/dist/esm/_BaseStyling_/BaseStyling.esm.js.map +1 -1
  140. package/dist/esm/src/components/Form/Checkbox/Checkbox.d.ts +1 -1
  141. package/dist/esm/src/components/Form/Fieldset/Fieldset.d.ts +1 -1
  142. package/dist/esm/src/components/Form/FileUpload/FileItem/FileItem.d.ts +1 -1
  143. package/dist/esm/src/components/Form/FileUpload/FileUpload.d.ts +6 -1
  144. package/dist/esm/src/components/Form/Input/Input.d.ts +2 -1
  145. package/dist/esm/src/components/Form/Radio/Radio.d.ts +1 -1
  146. package/dist/esm/src/components/Form/Select/MultiSelect/MultiSelect.d.ts +1 -1
  147. package/dist/esm/src/components/Form/Select/MultiSelect/useArrowNavigation.d.ts +2 -1
  148. package/dist/esm/src/components/Form/Select/MultiSelect/useMultiSelect.d.ts +16 -0
  149. package/dist/esm/src/components/Form/Select/MultiSelect/useMultiSelect.test.d.ts +1 -0
  150. package/dist/esm/src/components/Form/Select/Select.interfaces.d.ts +6 -4
  151. package/dist/esm/src/components/Form/Select/SingleSelect/Select.d.ts +1 -1
  152. package/dist/esm/src/components/Form/Select/SingleSelect/useArrowNavigation.d.ts +1 -1
  153. package/dist/esm/src/components/Form/Select/useSelectPositionList.d.ts +2 -2
  154. package/dist/esm/src/components/Form/Textarea/Textarea.d.ts +2 -1
  155. package/dist/esm/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.d.ts +1 -1
  156. package/dist/esm/src/components/Form/Wrapper/InputWrapper/InputWrapper.d.ts +1 -1
  157. package/dist/esm/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.d.ts +1 -1
  158. package/dist/esm/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.d.ts +1 -1
  159. package/dist/esm/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +1 -1
  160. package/dist/esm/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.d.ts +2 -1
  161. package/dist/esm/src/components/_BaseStyling_/BaseStyling.d.ts +2 -0
  162. package/dist/esm/src/components/withReadOnly.d.ts +8 -0
  163. package/dist/esm/src/components/withReadOnly.test.d.ts +1 -0
  164. package/dist/esm/src/index.d.ts +1 -0
  165. package/dist/esm/src/index.esm.js +1 -0
  166. package/dist/esm/src/index.esm.js.map +1 -1
  167. package/dist/esm/src/util/unitTestUtils.d.ts +12 -0
  168. package/dist/esm/withReadOnly.esm.js +70 -0
  169. package/dist/esm/withReadOnly.esm.js.map +1 -0
  170. package/package.json +15 -15
  171. package/src/components/Form/Checkbox/Checkbox.module.scss +70 -0
  172. package/src/components/Form/Checkbox/Checkbox.tsx +2 -1
  173. package/src/components/Form/Fieldset/Fieldset.tsx +2 -1
  174. package/src/components/Form/FileUpload/FileItem/FileItem.module.scss +16 -0
  175. package/src/components/Form/FileUpload/FileItem/FileItem.tsx +17 -3
  176. package/src/components/Form/FileUpload/FileUpload.module.scss +57 -1
  177. package/src/components/Form/FileUpload/FileUpload.tsx +16 -6
  178. package/src/components/Form/FormHelperText/FormHelperText.module.scss +4 -0
  179. package/src/components/Form/Input/Input.module.scss +26 -0
  180. package/src/components/Form/Input/Input.tsx +10 -1
  181. package/src/components/Form/Radio/Radio.module.scss +46 -0
  182. package/src/components/Form/Radio/Radio.tsx +2 -1
  183. package/src/components/Form/Select/MultiSelect/MultiSelect.module.scss +35 -1
  184. package/src/components/Form/Select/MultiSelect/MultiSelect.tsx +41 -26
  185. package/src/components/Form/Select/MultiSelect/SelectedOptions.module.scss +8 -0
  186. package/src/components/Form/Select/MultiSelect/useArrowNavigation.ts +6 -1
  187. package/src/components/Form/Select/MultiSelect/useMultiSelect.tsx +98 -0
  188. package/src/components/Form/Select/Select.interfaces.ts +6 -4
  189. package/src/components/Form/Select/SingleSelect/Select.module.scss +60 -1
  190. package/src/components/Form/Select/SingleSelect/Select.tsx +30 -25
  191. package/src/components/Form/Select/SingleSelect/useArrowNavigation.ts +6 -1
  192. package/src/components/Form/Select/useSelectPositionList.ts +4 -4
  193. package/src/components/Form/Textarea/Textarea.module.scss +24 -0
  194. package/src/components/Form/Textarea/Textarea.tsx +24 -3
  195. package/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +4 -1
  196. package/src/components/Form/Wrapper/InputWrapper/InputWrapper.module.scss +14 -0
  197. package/src/components/Form/Wrapper/InputWrapper/InputWrapper.tsx +4 -2
  198. package/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.tsx +3 -1
  199. package/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +17 -12
  200. package/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +6 -1
  201. package/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss +43 -0
  202. package/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +45 -20
  203. package/src/components/Form/Wrapper/Wrapper/Wrapper.module.scss +6 -0
  204. package/src/components/_BaseStyling_/BaseStyling.tsx +4 -0
  205. package/src/components/withReadOnly.tsx +112 -0
  206. package/src/index.ts +1 -0
  207. package/src/mixins.module.scss +6 -0
  208. package/src/util/unitTestUtils.ts +32 -0
@@ -30,6 +30,7 @@ import {
30
30
  Props as FormSelectorWrapperProps
31
31
  } from "../FormSelectorWrapper/FormSelectorWrapper";
32
32
  import { FormSelector } from "../form.interfaces";
33
+ import { withReadOnly } from "../../withReadOnly";
33
34
 
34
35
  const isToggle = (children: ReactNode) => !!(children as ReactElement)?.props?.["data-toggle"];
35
36
 
@@ -182,4 +183,4 @@ const CheckboxComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
182
183
  );
183
184
  };
184
185
 
185
- export const Checkbox = React.forwardRef(CheckboxComponent);
186
+ export const Checkbox = withReadOnly(React.forwardRef(CheckboxComponent));
@@ -32,6 +32,7 @@ import { FormHelperText } from "../FormHelperText/FormHelperText";
32
32
  import { InputWrapper } from "../Wrapper/InputWrapper/InputWrapper";
33
33
  import { SelectWrapper } from "../Wrapper/SelectWrapper/SelectWrapper";
34
34
  import { TextareaWrapper } from "../Wrapper/TextareaWrapper/TextareaWrapper";
35
+ import { withReadOnly } from "../../withReadOnly";
35
36
 
36
37
  export interface Props extends ComponentPropsWithRef<"fieldset"> {
37
38
  children?: ReactElement | ReactElement[];
@@ -123,4 +124,4 @@ const FieldsetComponent: ForwardRefRenderFunction<HTMLFieldSetElement, Props> =
123
124
  );
124
125
  };
125
126
 
126
- export const Fieldset = React.forwardRef(FieldsetComponent);
127
+ export const Fieldset = withReadOnly(React.forwardRef(FieldsetComponent));
@@ -186,4 +186,20 @@
186
186
  .file-subtitle {
187
187
  margin-left: 0;
188
188
  }
189
+
190
+ &[data-readonlyview="true"] {
191
+ & .file-list-container {
192
+ & p {
193
+ & span {
194
+ &:before {
195
+ color: var(--font-family);
196
+ }
197
+ }
198
+ }
199
+
200
+ & button {
201
+ visibility: hidden;
202
+ }
203
+ }
204
+ }
189
205
  }
@@ -22,6 +22,7 @@ import { ProgressBar } from "../../../ProgressBar/ProgressBar";
22
22
  import { FileType } from "../FileUpload";
23
23
  import { Button } from "../../../Button/Button";
24
24
  import { Link } from "../../../Link/Link";
25
+ import { withReadOnly } from "../../../withReadOnly";
25
26
  export type UploadProgress = "uploading" | "completed" | "error" | "readonly" | "retry";
26
27
 
27
28
  export interface Props extends ComponentPropsWithRef<"div"> {
@@ -62,7 +63,8 @@ const FileItemComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
62
63
  progress,
63
64
  downloadFileLink,
64
65
  totalPercentage,
65
- onRequestedFileAction
66
+ onRequestedFileAction,
67
+ ...rest
66
68
  }: Props,
67
69
  ref
68
70
  ) => {
@@ -213,8 +215,20 @@ const FileItemComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
213
215
  );
214
216
  };
215
217
 
218
+ const restPropsWithoutPointerEvents = () => {
219
+ let props = rest;
220
+ delete rest?.style?.pointerEvents;
221
+ return props;
222
+ };
223
+
216
224
  return (
217
- <div ref={ref} className={classes["file-item-wrapper"]} aria-label={`${name}-wrapper`}>
225
+ <div
226
+ ref={ref}
227
+ className={classes["file-item-wrapper"]}
228
+ aria-label={`${name}-wrapper`}
229
+ tabIndex={0}
230
+ {...restPropsWithoutPointerEvents()}
231
+ >
218
232
  <div className={classes["file-list-container"]}>
219
233
  {status !== ACTION_STATUS.UPLOADING && getUploadedFileInfo()}
220
234
 
@@ -240,4 +254,4 @@ const FileItemComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
240
254
  );
241
255
  };
242
256
 
243
- export const FileItem = React.forwardRef(FileItemComponent);
257
+ export const FileItem = withReadOnly(React.forwardRef(FileItemComponent));
@@ -80,6 +80,58 @@
80
80
  & {
81
81
  @include transition(all, 0.2s, ease-in-out);
82
82
  }
83
+
84
+ &[data-readonlyview="true"]:has(.file-list) {
85
+ .required {
86
+ &:after {
87
+ display: none;
88
+ }
89
+ }
90
+
91
+ ul {
92
+ li {
93
+ p {
94
+ span[data-icon] {
95
+ &:before {
96
+ color: var(--color-blue-grey900);
97
+ }
98
+ }
99
+ }
100
+
101
+ button {
102
+ visibility: hidden;
103
+ }
104
+ }
105
+ }
106
+
107
+ .upload-button-wrapper {
108
+ display: none;
109
+ }
110
+ }
111
+
112
+ &[data-readonlyview="true"]:not(:has(.file-list)) {
113
+ .upload-button-wrapper {
114
+ min-height: 4.5rem;
115
+
116
+ & .file-select {
117
+ border: 0;
118
+
119
+ & p {
120
+ color: var(--read-only-text-color);
121
+ }
122
+ }
123
+
124
+ & .file-upload-btn {
125
+ display: none;
126
+ }
127
+ }
128
+
129
+ .required {
130
+ &:after {
131
+ display: none;
132
+ }
133
+ }
134
+ }
83
135
  }
84
136
 
85
137
  .upload-button-wrapper {
@@ -88,7 +140,6 @@
88
140
 
89
141
  &.drag-active {
90
142
  .outline {
91
- pointer-events: none;
92
143
  position: absolute;
93
144
  margin: 0;
94
145
  padding: 0;
@@ -134,6 +185,11 @@
134
185
  }
135
186
  }
136
187
 
188
+ .file-selector-helper-text {
189
+ color: var(--greyed-out);
190
+ display: block;
191
+ }
192
+
137
193
  .file-select {
138
194
  display: flex;
139
195
  align-items: center;
@@ -29,6 +29,7 @@ import { Typography } from "../../Typography/Typography";
29
29
  import classes from "./FileUpload.module.scss";
30
30
  import { useDetermineStatusIcon } from "../../../hooks/useDetermineStatusIcon";
31
31
  import { Label } from "../Label/Label";
32
+ import { withReadOnly } from "../../withReadOnly";
32
33
 
33
34
  type FileUploadType = Omit<InputProps, "onDrop" | "type" | "onChange" | "suffix" | "prefix">;
34
35
  export type FileType = Omit<FileConfig, "onRequestedFileAction"> &
@@ -43,6 +44,9 @@ export interface Props extends FileUploadType {
43
44
  maxFileSizeInBytes?: number;
44
45
  selectButtonText?: string;
45
46
  dragAndDropText?: string;
47
+ /**
48
+ * @deprecated use the `helperText` prop instead
49
+ */
46
50
  subText?: string;
47
51
  onDragOver?: DragEventHandler;
48
52
  onDragEnter?: DragEventHandler;
@@ -54,6 +58,8 @@ export interface Props extends FileUploadType {
54
58
  isRequired?: boolean;
55
59
  invalidDropErrorMessage?: string;
56
60
  noMultipleFileDropErrorMessage?: string;
61
+ readOnlyViewMessage?: string;
62
+ helperText?: string;
57
63
  }
58
64
 
59
65
  const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
@@ -71,11 +77,12 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
71
77
  onChange,
72
78
  dragAndDropText = "Drag and drop or",
73
79
  selectButtonText = "Browse file",
80
+ readOnlyViewMessage = "No file uploaded",
74
81
  onDragOver,
75
82
  onDragLeave,
76
83
  wrapperProps,
77
84
  onDrop,
78
- subText,
85
+ subText, // @deprecated
79
86
  onRequestedFileAction,
80
87
  exceedingMaxSizeErrorText,
81
88
  fileList,
@@ -83,6 +90,7 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
83
90
  isRequired = true,
84
91
  invalidDropErrorMessage = "Invalid file format. Supported formats are: $accept.",
85
92
  noMultipleFileDropErrorMessage = "You can upload only a single file.",
93
+ helperText = subText,
86
94
  ...rest
87
95
  }: Props,
88
96
  ref
@@ -98,6 +106,7 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
98
106
  let errorTextClass = [classes["file-selector-sub-text"]];
99
107
  dragActive && dropzoneContainerClassNames.push(classes["drag-active"]);
100
108
  const hasError = inputError || error || errorMsg;
109
+ const readOnlyView = rest["data-readonlyview"];
101
110
  if (hasError) {
102
111
  const errorClass = classes["error"];
103
112
  dropzoneClassNames.push(errorClass);
@@ -231,7 +240,7 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
231
240
  return (
232
241
  <div className={classes["file-upload-wrapper"]} {...wrapperProps}>
233
242
  <div className={classes["dropzone-wrapper"]}>
234
- <div className={dropzoneClassNames.join(" ")}>
243
+ <div className={dropzoneClassNames.join(" ")} data-readonlyview={readOnlyView}>
235
244
  <Label ref={labelRef} className={`${labelClasses.join(" ")}`} htmlFor={inputId}>
236
245
  {title}
237
246
  </Label>
@@ -258,10 +267,11 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
258
267
  onDragOver={e => !disabled && handleOnDragOver(e)}
259
268
  onDragLeave={e => !disabled && handleOnDragLeave(e)}
260
269
  onDrop={e => !disabled && handleOnDrop(e)}
270
+ tabIndex={readOnlyView ? 0 : -1}
261
271
  >
262
272
  <div className={classes["file-select"]}>
263
273
  <Typography variant="body" className={"drag-and-drop-text"}>
264
- {dragAndDropText}
274
+ {readOnlyView ? readOnlyViewMessage : dragAndDropText}
265
275
  </Typography>
266
276
 
267
277
  <div className={classes["file-upload-btn"]}>
@@ -293,9 +303,9 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
293
303
  {errorMsg}
294
304
  </Typography>
295
305
  )}
296
- {subText && (
306
+ {helperText && (
297
307
  <Typography variant={"sub-text"} className={subTextClass.join(" ")}>
298
- {subText}
308
+ {helperText}
299
309
  </Typography>
300
310
  )}
301
311
  </div>
@@ -303,4 +313,4 @@ const FileUploadComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
303
313
  );
304
314
  };
305
315
 
306
- export const FileUpload = React.forwardRef(FileUploadComponent);
316
+ export const FileUpload = withReadOnly(React.forwardRef(FileUploadComponent));
@@ -26,3 +26,7 @@ div.disabled {
26
26
  div.error {
27
27
  color: var(--error);
28
28
  }
29
+
30
+ [data-readonlyview="true"] div.form-helper-text {
31
+ display: none;
32
+ }
@@ -94,6 +94,32 @@
94
94
  [data-icon-status="error"] {
95
95
  color: var(--error);
96
96
  }
97
+
98
+ &[data-readonlyview="true"] {
99
+ color: var(--read-only-text-color);
100
+
101
+ & .Input-module {
102
+ border-color: var(--read-only-border-color);
103
+ }
104
+
105
+ & span.outline {
106
+ color: var(--read-only-text-color);
107
+ border-color: var(--read-only-border-color);
108
+ background-color: var(--color-white);
109
+
110
+ &.focus {
111
+ border-color: var(--read-only-border-color);
112
+ }
113
+ }
114
+
115
+ &:hover {
116
+ & .outline {
117
+ color: var(--read-only-text-color);
118
+ background-color: var(--color-white);
119
+ border-color: var(--read-only-border-color);
120
+ }
121
+ }
122
+ }
97
123
  }
98
124
 
99
125
  .input {
@@ -28,6 +28,7 @@ import readyclasses from "../../../readyclasses.module.scss";
28
28
  import { FormElement } from "../form.interfaces";
29
29
  import { useDetermineStatusIcon } from "../../../hooks/useDetermineStatusIcon";
30
30
  import { MergeElementProps } from "../../../interfaces";
31
+ import { withReadOnly } from "../../withReadOnly";
31
32
 
32
33
  export const dateTypes = ["date", "time", "datetime-local"] as const;
33
34
 
@@ -51,6 +52,7 @@ export type Props = MergeElementProps<
51
52
  type: Type;
52
53
  suffix?: ReactNode;
53
54
  prefix?: ReactNode;
55
+ readOnlyView?: boolean;
54
56
  }
55
57
  >;
56
58
 
@@ -69,6 +71,7 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
69
71
  disabled,
70
72
  onFocus,
71
73
  onBlur,
74
+ readOnlyView,
72
75
  ...rest
73
76
  }: Props,
74
77
  ref: Ref<HTMLInputElement>
@@ -106,13 +109,16 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
106
109
  success && wrapperClasses.push(classes["success"]);
107
110
 
108
111
  const icon = useDetermineStatusIcon({ success, error });
112
+ const readOnlyMode = rest["data-readonlyview"] as boolean;
109
113
 
110
114
  return (
111
115
  <div
112
116
  ref={inputWrapperRef}
113
117
  {...wrapperProps}
114
118
  style={{ ...style }}
119
+ data-readonlyview={readOnlyMode}
115
120
  className={`${classes["input-wrapper"]} ${wrapperClasses.join(" ")}`}
121
+ tabIndex={readOnlyMode ? 0 : -1}
116
122
  >
117
123
  {prefix && (
118
124
  <div data-prefix className={classes["prefix"]}>
@@ -122,6 +128,8 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
122
128
  <input
123
129
  {...rest}
124
130
  ref={ref}
131
+ aria-readonly={readOnlyMode}
132
+ readOnly={readOnlyMode}
125
133
  onFocus={event => {
126
134
  setFocus(true);
127
135
  onFocus?.(event);
@@ -136,6 +144,7 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
136
144
  disabled={disabled}
137
145
  className={inputClassNames.join(" ")}
138
146
  spellCheck={rest.spellCheck ?? false}
147
+ tabIndex={readOnlyMode ? -1 : 0}
139
148
  />
140
149
  {icon}
141
150
  {suffix && (
@@ -149,4 +158,4 @@ const InputComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
149
158
  );
150
159
  };
151
160
 
152
- export const Input = React.forwardRef(InputComponent);
161
+ export const Input = withReadOnly(React.forwardRef(InputComponent));
@@ -143,3 +143,49 @@
143
143
  color: var(--disabled);
144
144
  pointer-events: none;
145
145
  }
146
+
147
+ [data-readonlyview="true"] {
148
+ & .radio-wrapper {
149
+ color: var(--read-only-text-color);
150
+
151
+ & span.input {
152
+ color: var(--read-only-text-color);
153
+ cursor: not-allowed;
154
+
155
+ &:before {
156
+ outline: 1px solid var(--read-only-border-color);
157
+ outline-offset: -1px;
158
+ border-radius: 50%;
159
+ }
160
+ }
161
+ }
162
+
163
+ label {
164
+ user-select: text;
165
+ }
166
+ }
167
+
168
+ input[type="radio"] {
169
+ &[data-readonlyview="true"] {
170
+ & ~ span.input {
171
+ color: var(--read-only-text-color);
172
+ cursor: not-allowed;
173
+
174
+ &:before {
175
+ outline: 1px solid var(--read-only-border-color);
176
+ outline-offset: -1px;
177
+ border-radius: 50%;
178
+ }
179
+ }
180
+
181
+ & ~ label {
182
+ user-select: text;
183
+ pointer-events: none;
184
+ }
185
+
186
+ & :focus-visible {
187
+ outline: 2px solid var(--color-focus);
188
+ outline-offset: 2px;
189
+ }
190
+ }
191
+ }
@@ -24,6 +24,7 @@ import {
24
24
  FormSelectorWrapper,
25
25
  Props as FormSelectorWrapperProps
26
26
  } from "../FormSelectorWrapper/FormSelectorWrapper";
27
+ import { withReadOnly } from "../../withReadOnly";
27
28
 
28
29
  export interface Props extends ComponentPropsWithRef<"input">, Omit<FormSelector, "success"> {
29
30
  children: string;
@@ -127,4 +128,4 @@ const RadioComponent: ForwardRefRenderFunction<HTMLInputElement, Props> = (
127
128
  );
128
129
  };
129
130
 
130
- export const Radio = React.forwardRef(RadioComponent);
131
+ export const Radio = withReadOnly(React.forwardRef(RadioComponent));
@@ -96,6 +96,10 @@ $listItemHeight: 2.5rem;
96
96
  }
97
97
  }
98
98
 
99
+ .list-wrapper-container {
100
+ position: relative;
101
+ }
102
+
99
103
  .list-wrapper {
100
104
  border-color: var(--light-grey-border);
101
105
  border-style: var(--input-border-style);
@@ -106,7 +110,6 @@ $listItemHeight: 2.5rem;
106
110
  box-shadow: 0px 8px 10px 0px #01053224;
107
111
  position: absolute;
108
112
  z-index: variables.$select-z-index;
109
- top: 44px;
110
113
  left: 0;
111
114
  width: 100%;
112
115
  overflow: auto;
@@ -255,3 +258,34 @@ $listItemHeight: 2.5rem;
255
258
  }
256
259
  }
257
260
  }
261
+
262
+ [data-readonlyview="true"] {
263
+ & .custom-select {
264
+ color: var(--read-only-text-color);
265
+ border-color: var(--read-only-border-color);
266
+ background-color: var(--color-white);
267
+
268
+ &.error,
269
+ &.success {
270
+ border-color: var(--read-only-border-color);
271
+ }
272
+
273
+ button {
274
+ pointer-events: none;
275
+ }
276
+ }
277
+
278
+ & .status {
279
+ .chevron-icon {
280
+ visibility: hidden;
281
+ }
282
+ }
283
+
284
+ &:hover:not(.disabled):not(.expanded):not(.error) {
285
+ .custom-select:not(:focus) {
286
+ color: var(--read-only-text-color);
287
+ border-color: var(--read-only-border-color);
288
+ background-color: var(--color-white);
289
+ }
290
+ }
291
+ }
@@ -30,13 +30,14 @@ import { useDetermineStatusIcon } from "../../../../hooks/useDetermineStatusIcon
30
30
  import readyclasses from "../../../../readyclasses.module.scss";
31
31
  import { escapeRegExp, filterProps, generateID } from "../../../../util/helper";
32
32
  import { Icon, Icons } from "../../../Icon/Icon";
33
- import { MultiSelectProps } from "../Select.interfaces";
33
+ import { MultiSelectProps, Position } from "../Select.interfaces";
34
34
  import { useAddNewBtn } from "../useAddNewBtn";
35
35
  import { useSelectPositionList } from "../useSelectPositionList";
36
36
  import { SelectButton } from "./SelectButton";
37
37
  import { Display, SelectedOptions } from "./SelectedOptions";
38
38
  import { useArrowNavigation } from "./useArrowNavigation";
39
39
  import { useSearch } from "./useSearch";
40
+ import { withReadOnly } from "../../../withReadOnly";
40
41
 
41
42
  const getOptionId = (multiSelectId: string, optionIndex: number) =>
42
43
  `${multiSelectId}_option${optionIndex}`;
@@ -62,6 +63,7 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
62
63
  onChange,
63
64
  addNew,
64
65
  search = { enabled: true, renderThreshold: 0, searchPlaceholder: "Search item" },
66
+ isReadOnlyView,
65
67
  ...rest
66
68
  }: MultiSelectProps,
67
69
  ref
@@ -135,6 +137,7 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
135
137
  };
136
138
 
137
139
  const customSelectButtonRef = useRef<HTMLButtonElement>(null);
140
+ const readOnlyView = !!rest["data-readonlyview"] || isReadOnlyView;
138
141
  const { onArrowNavigation } = useArrowNavigation({
139
142
  expanded,
140
143
  setExpanded,
@@ -144,7 +147,8 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
144
147
  addBtnRef,
145
148
  searchInputRef,
146
149
  customSelectButtonRef,
147
- onClose: resetSearchState
150
+ onClose: resetSearchState,
151
+ isReadOnlyView: readOnlyView
148
152
  });
149
153
 
150
154
  const { listPosition, opacity, optionsListMaxHeight, setListPosition, setOpacity } =
@@ -274,7 +278,7 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
274
278
  (event: MouseEvent) => !(event.target as Element).closest(".custom-select") && expanded,
275
279
  () => {
276
280
  setExpanded(false);
277
- setListPosition({ top: 0, bottom: "initial" });
281
+ setListPosition(Position.Below);
278
282
  setOpacity(0);
279
283
  },
280
284
  expanded
@@ -288,10 +292,41 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
288
292
  success && additionalClasses.push(classes.success);
289
293
 
290
294
  const onSelectButtonClick = () => {
295
+ if (rest["data-readonlyview"] || isReadOnlyView) {
296
+ return;
297
+ }
291
298
  setExpanded(expanded => !expanded);
292
299
  setShouldClick(false);
293
300
  };
294
301
 
302
+ const optionsElement = (
303
+ <div className={`list-wrapper-container ${classes["list-wrapper-container"]}`}>
304
+ <div
305
+ ref={optionListReference}
306
+ className={`list-wrapper ${classes["list-wrapper"]}`}
307
+ style={{
308
+ display: expanded ? "block" : "none",
309
+ opacity: opacity,
310
+ maxHeight: optionsListMaxHeight.wrapper,
311
+ pointerEvents: expanded ? "auto" : "none",
312
+ top: listPosition === Position.Below ? "4px" : "initial",
313
+ bottom: listPosition === Position.Above ? "4px" : "initial"
314
+ }}
315
+ >
316
+ <ul
317
+ id={getListboxId(multiSelectId.current)}
318
+ className={addNewBtnOptionsContainerClassName}
319
+ role="listbox"
320
+ aria-multiselectable="true"
321
+ style={{ maxHeight: optionsListMaxHeight.list }}
322
+ >
323
+ {renderOptions()}
324
+ </ul>
325
+ {renderAddNew()}
326
+ </div>
327
+ </div>
328
+ );
329
+
295
330
  /** The native select is purely for external form libraries. We use it to emit an onChange with native select event object so they know exactly what's happening. */
296
331
  return (
297
332
  <Fragment>
@@ -317,6 +352,7 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
317
352
  onKeyDown={onArrowNavigation}
318
353
  className={`custom-select ${classes.select} ${additionalClasses.join(" ")}`}
319
354
  >
355
+ {listPosition === Position.Above ? optionsElement : undefined}
320
356
  <div
321
357
  className={`${classes["custom-select"]} ${additionalClasses.join(" ")} `}
322
358
  style={{ display: "flex" }}
@@ -350,31 +386,10 @@ const MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSel
350
386
  </div>
351
387
  <div className={classes["status"]}>{icon || renderChevronIcon()}</div>
352
388
  </div>
353
- <div
354
- ref={optionListReference}
355
- className={`list-wrapper ${classes["list-wrapper"]}`}
356
- style={{
357
- display: expanded ? "block" : "none",
358
- opacity: opacity,
359
- maxHeight: optionsListMaxHeight.wrapper,
360
- pointerEvents: expanded ? "auto" : "none",
361
- ...listPosition
362
- }}
363
- >
364
- <ul
365
- id={getListboxId(multiSelectId.current)}
366
- className={addNewBtnOptionsContainerClassName}
367
- role="listbox"
368
- aria-multiselectable="true"
369
- style={{ maxHeight: optionsListMaxHeight.list }}
370
- >
371
- {renderOptions()}
372
- </ul>
373
- {renderAddNew()}
374
- </div>
389
+ {listPosition === Position.Below ? optionsElement : undefined}
375
390
  </div>
376
391
  </Fragment>
377
392
  );
378
393
  };
379
394
 
380
- export const MultiSelect = React.forwardRef(MultiSelectComponent);
395
+ export const MultiSelect = withReadOnly(React.forwardRef(MultiSelectComponent));
@@ -29,3 +29,11 @@
29
29
  cursor: pointer;
30
30
  }
31
31
  }
32
+
33
+ [data-readonlyview="true"] {
34
+ .tag {
35
+ .remove-btn {
36
+ display: none;
37
+ }
38
+ }
39
+ }
@@ -24,6 +24,7 @@ interface UseArrowNavigationParams {
24
24
  searchInputRef: React.RefObject<HTMLInputElement>;
25
25
  customSelectButtonRef: React.RefObject<HTMLButtonElement>;
26
26
  onClose: () => void;
27
+ isReadOnlyView?: boolean;
27
28
  }
28
29
 
29
30
  /** @scope .*/
@@ -36,9 +37,13 @@ export const useArrowNavigation = ({
36
37
  addBtnRef,
37
38
  searchInputRef,
38
39
  customSelectButtonRef,
39
- onClose
40
+ onClose,
41
+ isReadOnlyView = false
40
42
  }: UseArrowNavigationParams) => {
41
43
  const onArrowNavigation = (event: React.KeyboardEvent) => {
44
+ if (isReadOnlyView) {
45
+ return;
46
+ }
42
47
  const codesToPreventDefault = ["ArrowDown", "ArrowUp", "Escape", "End", "Home"];
43
48
  const hasAddBtn = !!addBtnRef?.current;
44
49
  const childrenCountWithAddButton = childrenCount + (hasAddBtn ? 1 : 0);