@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.
- package/dist/cjs/Form/Checkbox/Checkbox.cjs.js +1 -1
- package/dist/cjs/Form/Checkbox/Checkbox.cjs.js.map +1 -1
- package/dist/cjs/Form/Checkbox/Checkbox.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Fieldset/Fieldset.cjs.js +1 -1
- package/dist/cjs/Form/Fieldset/Fieldset.cjs.js.map +1 -1
- package/dist/cjs/Form/FileUpload/FileItem/FileItem.cjs.js +1 -1
- package/dist/cjs/Form/FileUpload/FileItem/FileItem.cjs.js.map +1 -1
- package/dist/cjs/Form/FileUpload/FileItem/FileItem.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/FileUpload/FileUpload.cjs.js +1 -1
- package/dist/cjs/Form/FileUpload/FileUpload.cjs.js.map +1 -1
- package/dist/cjs/Form/FileUpload/FileUpload.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/FormHelperText/FormHelperText.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Input/Input.cjs.js +1 -1
- package/dist/cjs/Form/Input/Input.cjs.js.map +1 -1
- package/dist/cjs/Form/Input/Input.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Radio/Radio.cjs.js +1 -1
- package/dist/cjs/Form/Radio/Radio.cjs.js.map +1 -1
- package/dist/cjs/Form/Radio/Radio.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Select/MultiSelect/MultiSelect.cjs.js +1 -1
- package/dist/cjs/Form/Select/MultiSelect/MultiSelect.cjs.js.map +1 -1
- package/dist/cjs/Form/Select/MultiSelect/MultiSelect.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Select/MultiSelect/SelectedOptions.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Select/MultiSelect/useArrowNavigation.cjs.js +1 -1
- package/dist/cjs/Form/Select/MultiSelect/useArrowNavigation.cjs.js.map +1 -1
- package/dist/cjs/Form/Select/MultiSelect/useMultiSelect.cjs.js +2 -0
- package/dist/cjs/Form/Select/MultiSelect/useMultiSelect.cjs.js.map +1 -0
- package/dist/cjs/Form/Select/Select.interfaces.cjs.js +2 -0
- package/dist/cjs/Form/Select/Select.interfaces.cjs.js.map +1 -0
- package/dist/cjs/Form/Select/SingleSelect/Select.cjs.js +1 -1
- package/dist/cjs/Form/Select/SingleSelect/Select.cjs.js.map +1 -1
- package/dist/cjs/Form/Select/SingleSelect/Select.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Select/SingleSelect/useArrowNavigation.cjs.js +1 -1
- package/dist/cjs/Form/Select/SingleSelect/useArrowNavigation.cjs.js.map +1 -1
- package/dist/cjs/Form/Select/useSelectPositionList.cjs.js +1 -1
- package/dist/cjs/Form/Select/useSelectPositionList.cjs.js.map +1 -1
- package/dist/cjs/Form/Textarea/Textarea.cjs.js +1 -1
- package/dist/cjs/Form/Textarea/Textarea.cjs.js.map +1 -1
- package/dist/cjs/Form/Textarea/Textarea.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.cjs.js.map +1 -1
- package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.cjs.js.map +1 -1
- package/dist/cjs/Form/Wrapper/InputWrapper/InputWrapper.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.cjs.js.map +1 -1
- package/dist/cjs/Form/Wrapper/RadioWrapper/RadioWrapper.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/RadioWrapper/RadioWrapper.cjs.js.map +1 -1
- package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/SelectWrapper/SelectWrapper.cjs.js.map +1 -1
- package/dist/cjs/Form/Wrapper/TextareaWrapper/TextareaWrapper.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/TextareaWrapper/TextareaWrapper.cjs.js.map +1 -1
- package/dist/cjs/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss.cjs.js +1 -1
- package/dist/cjs/Form/Wrapper/Wrapper/Wrapper.module.scss.cjs.js +1 -1
- package/dist/cjs/_BaseStyling_/BaseStyling.cjs.js +1 -1
- package/dist/cjs/_BaseStyling_/BaseStyling.cjs.js.map +1 -1
- package/dist/cjs/src/components/Form/Checkbox/Checkbox.d.ts +1 -1
- package/dist/cjs/src/components/Form/Fieldset/Fieldset.d.ts +1 -1
- package/dist/cjs/src/components/Form/FileUpload/FileItem/FileItem.d.ts +1 -1
- package/dist/cjs/src/components/Form/FileUpload/FileUpload.d.ts +6 -1
- package/dist/cjs/src/components/Form/Input/Input.d.ts +2 -1
- package/dist/cjs/src/components/Form/Radio/Radio.d.ts +1 -1
- package/dist/cjs/src/components/Form/Select/MultiSelect/MultiSelect.d.ts +1 -1
- package/dist/cjs/src/components/Form/Select/MultiSelect/useArrowNavigation.d.ts +2 -1
- package/dist/cjs/src/components/Form/Select/MultiSelect/useMultiSelect.d.ts +16 -0
- package/dist/cjs/src/components/Form/Select/MultiSelect/useMultiSelect.test.d.ts +1 -0
- package/dist/cjs/src/components/Form/Select/Select.interfaces.d.ts +6 -4
- package/dist/cjs/src/components/Form/Select/SingleSelect/Select.d.ts +1 -1
- package/dist/cjs/src/components/Form/Select/SingleSelect/useArrowNavigation.d.ts +1 -1
- package/dist/cjs/src/components/Form/Select/useSelectPositionList.d.ts +2 -2
- package/dist/cjs/src/components/Form/Textarea/Textarea.d.ts +2 -1
- package/dist/cjs/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.d.ts +1 -1
- package/dist/cjs/src/components/Form/Wrapper/InputWrapper/InputWrapper.d.ts +1 -1
- package/dist/cjs/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.d.ts +1 -1
- package/dist/cjs/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.d.ts +1 -1
- package/dist/cjs/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +1 -1
- package/dist/cjs/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.d.ts +2 -1
- package/dist/cjs/src/components/_BaseStyling_/BaseStyling.d.ts +2 -0
- package/dist/cjs/src/components/withReadOnly.d.ts +8 -0
- package/dist/cjs/src/components/withReadOnly.test.d.ts +1 -0
- package/dist/cjs/src/index.cjs.js +1 -1
- package/dist/cjs/src/index.d.ts +1 -0
- package/dist/cjs/src/util/unitTestUtils.d.ts +12 -0
- package/dist/cjs/withReadOnly.cjs.js +2 -0
- package/dist/cjs/withReadOnly.cjs.js.map +1 -0
- package/dist/esm/Form/Checkbox/Checkbox.esm.js +2 -1
- package/dist/esm/Form/Checkbox/Checkbox.esm.js.map +1 -1
- package/dist/esm/Form/Checkbox/Checkbox.module.scss.esm.js +1 -1
- package/dist/esm/Form/Fieldset/Fieldset.esm.js +2 -1
- package/dist/esm/Form/Fieldset/Fieldset.esm.js.map +1 -1
- package/dist/esm/Form/FileUpload/FileItem/FileItem.esm.js +10 -3
- package/dist/esm/Form/FileUpload/FileItem/FileItem.esm.js.map +1 -1
- package/dist/esm/Form/FileUpload/FileItem/FileItem.module.scss.esm.js +1 -1
- package/dist/esm/Form/FileUpload/FileUpload.esm.js +9 -6
- package/dist/esm/Form/FileUpload/FileUpload.esm.js.map +1 -1
- package/dist/esm/Form/FileUpload/FileUpload.module.scss.esm.js +2 -2
- package/dist/esm/Form/FormHelperText/FormHelperText.module.scss.esm.js +1 -1
- package/dist/esm/Form/Input/Input.esm.js +7 -5
- package/dist/esm/Form/Input/Input.esm.js.map +1 -1
- package/dist/esm/Form/Input/Input.module.scss.esm.js +2 -2
- package/dist/esm/Form/Radio/Radio.esm.js +2 -1
- package/dist/esm/Form/Radio/Radio.esm.js.map +1 -1
- package/dist/esm/Form/Radio/Radio.module.scss.esm.js +1 -1
- package/dist/esm/Form/Select/MultiSelect/MultiSelect.esm.js +24 -13
- package/dist/esm/Form/Select/MultiSelect/MultiSelect.esm.js.map +1 -1
- package/dist/esm/Form/Select/MultiSelect/MultiSelect.module.scss.esm.js +2 -2
- package/dist/esm/Form/Select/MultiSelect/SelectedOptions.module.scss.esm.js +1 -1
- package/dist/esm/Form/Select/MultiSelect/useArrowNavigation.esm.js +4 -1
- package/dist/esm/Form/Select/MultiSelect/useArrowNavigation.esm.js.map +1 -1
- package/dist/esm/Form/Select/MultiSelect/useMultiSelect.esm.js +63 -0
- package/dist/esm/Form/Select/MultiSelect/useMultiSelect.esm.js.map +1 -0
- package/dist/esm/Form/Select/Select.interfaces.esm.js +23 -0
- package/dist/esm/Form/Select/Select.interfaces.esm.js.map +1 -0
- package/dist/esm/Form/Select/SingleSelect/Select.esm.js +20 -15
- package/dist/esm/Form/Select/SingleSelect/Select.esm.js.map +1 -1
- package/dist/esm/Form/Select/SingleSelect/Select.module.scss.esm.js +2 -2
- package/dist/esm/Form/Select/SingleSelect/useArrowNavigation.esm.js +4 -1
- package/dist/esm/Form/Select/SingleSelect/useArrowNavigation.esm.js.map +1 -1
- package/dist/esm/Form/Select/useSelectPositionList.esm.js +5 -4
- package/dist/esm/Form/Select/useSelectPositionList.esm.js.map +1 -1
- package/dist/esm/Form/Textarea/Textarea.esm.js +12 -5
- package/dist/esm/Form/Textarea/Textarea.esm.js.map +1 -1
- package/dist/esm/Form/Textarea/Textarea.module.scss.esm.js +1 -1
- package/dist/esm/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.esm.js +4 -1
- package/dist/esm/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.esm.js.map +1 -1
- package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.esm.js +4 -2
- package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.esm.js.map +1 -1
- package/dist/esm/Form/Wrapper/InputWrapper/InputWrapper.module.scss.esm.js +1 -1
- package/dist/esm/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.esm.js +3 -2
- package/dist/esm/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.esm.js.map +1 -1
- package/dist/esm/Form/Wrapper/RadioWrapper/RadioWrapper.esm.js +17 -10
- package/dist/esm/Form/Wrapper/RadioWrapper/RadioWrapper.esm.js.map +1 -1
- package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.esm.js +5 -2
- package/dist/esm/Form/Wrapper/SelectWrapper/SelectWrapper.esm.js.map +1 -1
- package/dist/esm/Form/Wrapper/TextareaWrapper/TextareaWrapper.esm.js +20 -10
- package/dist/esm/Form/Wrapper/TextareaWrapper/TextareaWrapper.esm.js.map +1 -1
- package/dist/esm/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss.esm.js +2 -2
- package/dist/esm/Form/Wrapper/Wrapper/Wrapper.module.scss.esm.js +1 -1
- package/dist/esm/_BaseStyling_/BaseStyling.esm.js +2 -0
- package/dist/esm/_BaseStyling_/BaseStyling.esm.js.map +1 -1
- package/dist/esm/src/components/Form/Checkbox/Checkbox.d.ts +1 -1
- package/dist/esm/src/components/Form/Fieldset/Fieldset.d.ts +1 -1
- package/dist/esm/src/components/Form/FileUpload/FileItem/FileItem.d.ts +1 -1
- package/dist/esm/src/components/Form/FileUpload/FileUpload.d.ts +6 -1
- package/dist/esm/src/components/Form/Input/Input.d.ts +2 -1
- package/dist/esm/src/components/Form/Radio/Radio.d.ts +1 -1
- package/dist/esm/src/components/Form/Select/MultiSelect/MultiSelect.d.ts +1 -1
- package/dist/esm/src/components/Form/Select/MultiSelect/useArrowNavigation.d.ts +2 -1
- package/dist/esm/src/components/Form/Select/MultiSelect/useMultiSelect.d.ts +16 -0
- package/dist/esm/src/components/Form/Select/MultiSelect/useMultiSelect.test.d.ts +1 -0
- package/dist/esm/src/components/Form/Select/Select.interfaces.d.ts +6 -4
- package/dist/esm/src/components/Form/Select/SingleSelect/Select.d.ts +1 -1
- package/dist/esm/src/components/Form/Select/SingleSelect/useArrowNavigation.d.ts +1 -1
- package/dist/esm/src/components/Form/Select/useSelectPositionList.d.ts +2 -2
- package/dist/esm/src/components/Form/Textarea/Textarea.d.ts +2 -1
- package/dist/esm/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.d.ts +1 -1
- package/dist/esm/src/components/Form/Wrapper/InputWrapper/InputWrapper.d.ts +1 -1
- package/dist/esm/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.d.ts +1 -1
- package/dist/esm/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.d.ts +1 -1
- package/dist/esm/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +1 -1
- package/dist/esm/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.d.ts +2 -1
- package/dist/esm/src/components/_BaseStyling_/BaseStyling.d.ts +2 -0
- package/dist/esm/src/components/withReadOnly.d.ts +8 -0
- package/dist/esm/src/components/withReadOnly.test.d.ts +1 -0
- package/dist/esm/src/index.d.ts +1 -0
- package/dist/esm/src/index.esm.js +1 -0
- package/dist/esm/src/index.esm.js.map +1 -1
- package/dist/esm/src/util/unitTestUtils.d.ts +12 -0
- package/dist/esm/withReadOnly.esm.js +70 -0
- package/dist/esm/withReadOnly.esm.js.map +1 -0
- package/package.json +15 -15
- package/src/components/Form/Checkbox/Checkbox.module.scss +70 -0
- package/src/components/Form/Checkbox/Checkbox.tsx +2 -1
- package/src/components/Form/Fieldset/Fieldset.tsx +2 -1
- package/src/components/Form/FileUpload/FileItem/FileItem.module.scss +16 -0
- package/src/components/Form/FileUpload/FileItem/FileItem.tsx +17 -3
- package/src/components/Form/FileUpload/FileUpload.module.scss +57 -1
- package/src/components/Form/FileUpload/FileUpload.tsx +16 -6
- package/src/components/Form/FormHelperText/FormHelperText.module.scss +4 -0
- package/src/components/Form/Input/Input.module.scss +26 -0
- package/src/components/Form/Input/Input.tsx +10 -1
- package/src/components/Form/Radio/Radio.module.scss +46 -0
- package/src/components/Form/Radio/Radio.tsx +2 -1
- package/src/components/Form/Select/MultiSelect/MultiSelect.module.scss +35 -1
- package/src/components/Form/Select/MultiSelect/MultiSelect.tsx +41 -26
- package/src/components/Form/Select/MultiSelect/SelectedOptions.module.scss +8 -0
- package/src/components/Form/Select/MultiSelect/useArrowNavigation.ts +6 -1
- package/src/components/Form/Select/MultiSelect/useMultiSelect.tsx +98 -0
- package/src/components/Form/Select/Select.interfaces.ts +6 -4
- package/src/components/Form/Select/SingleSelect/Select.module.scss +60 -1
- package/src/components/Form/Select/SingleSelect/Select.tsx +30 -25
- package/src/components/Form/Select/SingleSelect/useArrowNavigation.ts +6 -1
- package/src/components/Form/Select/useSelectPositionList.ts +4 -4
- package/src/components/Form/Textarea/Textarea.module.scss +24 -0
- package/src/components/Form/Textarea/Textarea.tsx +24 -3
- package/src/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +4 -1
- package/src/components/Form/Wrapper/InputWrapper/InputWrapper.module.scss +14 -0
- package/src/components/Form/Wrapper/InputWrapper/InputWrapper.tsx +4 -2
- package/src/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.tsx +3 -1
- package/src/components/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +17 -12
- package/src/components/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +6 -1
- package/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss +43 -0
- package/src/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +45 -20
- package/src/components/Form/Wrapper/Wrapper/Wrapper.module.scss +6 -0
- package/src/components/_BaseStyling_/BaseStyling.tsx +4 -0
- package/src/components/withReadOnly.tsx +112 -0
- package/src/index.ts +1 -0
- package/src/mixins.module.scss +6 -0
- 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
|
|
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
|
-
{
|
|
306
|
+
{helperText && (
|
|
297
307
|
<Typography variant={"sub-text"} className={subTextClass.join(" ")}>
|
|
298
|
-
{
|
|
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));
|
|
@@ -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(
|
|
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
|
-
|
|
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));
|
|
@@ -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);
|