@rjsf/react-bootstrap 6.0.0-alpha.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/LICENSE.md +201 -0
- package/README.md +111 -0
- package/dist/index.js +940 -0
- package/dist/index.js.map +7 -0
- package/dist/react-bootstrap.esm.js +948 -0
- package/dist/react-bootstrap.esm.js.map +7 -0
- package/dist/react-bootstrap.umd.js +804 -0
- package/lib/AddButton/AddButton.d.ts +2 -0
- package/lib/AddButton/AddButton.js +9 -0
- package/lib/AddButton/AddButton.js.map +1 -0
- package/lib/AddButton/index.d.ts +2 -0
- package/lib/AddButton/index.js +3 -0
- package/lib/AddButton/index.js.map +1 -0
- package/lib/ArrayFieldItemTemplate/ArrayFieldItemTemplate.d.ts +2 -0
- package/lib/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js +15 -0
- package/lib/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js.map +1 -0
- package/lib/ArrayFieldItemTemplate/index.d.ts +2 -0
- package/lib/ArrayFieldItemTemplate/index.js +3 -0
- package/lib/ArrayFieldItemTemplate/index.js.map +1 -0
- package/lib/ArrayFieldTemplate/ArrayFieldTemplate.d.ts +2 -0
- package/lib/ArrayFieldTemplate/ArrayFieldTemplate.js +17 -0
- package/lib/ArrayFieldTemplate/ArrayFieldTemplate.js.map +1 -0
- package/lib/ArrayFieldTemplate/index.d.ts +2 -0
- package/lib/ArrayFieldTemplate/index.js +3 -0
- package/lib/ArrayFieldTemplate/index.js.map +1 -0
- package/lib/BaseInputTemplate/BaseInputTemplate.d.ts +2 -0
- package/lib/BaseInputTemplate/BaseInputTemplate.js +19 -0
- package/lib/BaseInputTemplate/BaseInputTemplate.js.map +1 -0
- package/lib/BaseInputTemplate/index.d.ts +2 -0
- package/lib/BaseInputTemplate/index.js +3 -0
- package/lib/BaseInputTemplate/index.js.map +1 -0
- package/lib/CheckboxWidget/CheckboxWidget.d.ts +2 -0
- package/lib/CheckboxWidget/CheckboxWidget.js +17 -0
- package/lib/CheckboxWidget/CheckboxWidget.js.map +1 -0
- package/lib/CheckboxWidget/index.d.ts +2 -0
- package/lib/CheckboxWidget/index.js +3 -0
- package/lib/CheckboxWidget/index.js.map +1 -0
- package/lib/CheckboxesWidget/CheckboxesWidget.d.ts +2 -0
- package/lib/CheckboxesWidget/CheckboxesWidget.js +24 -0
- package/lib/CheckboxesWidget/CheckboxesWidget.js.map +1 -0
- package/lib/CheckboxesWidget/index.d.ts +2 -0
- package/lib/CheckboxesWidget/index.js +3 -0
- package/lib/CheckboxesWidget/index.js.map +1 -0
- package/lib/DescriptionField/DescriptionField.d.ts +2 -0
- package/lib/DescriptionField/DescriptionField.js +8 -0
- package/lib/DescriptionField/DescriptionField.js.map +1 -0
- package/lib/DescriptionField/index.d.ts +2 -0
- package/lib/DescriptionField/index.js +3 -0
- package/lib/DescriptionField/index.js.map +1 -0
- package/lib/ErrorList/ErrorList.d.ts +2 -0
- package/lib/ErrorList/ErrorList.js +11 -0
- package/lib/ErrorList/ErrorList.js.map +1 -0
- package/lib/ErrorList/index.d.ts +2 -0
- package/lib/ErrorList/index.js +3 -0
- package/lib/ErrorList/index.js.map +1 -0
- package/lib/FieldErrorTemplate/FieldErrorTemplate.d.ts +6 -0
- package/lib/FieldErrorTemplate/FieldErrorTemplate.js +18 -0
- package/lib/FieldErrorTemplate/FieldErrorTemplate.js.map +1 -0
- package/lib/FieldErrorTemplate/index.d.ts +2 -0
- package/lib/FieldErrorTemplate/index.js +3 -0
- package/lib/FieldErrorTemplate/index.js.map +1 -0
- package/lib/FieldHelpTemplate/FieldHelpTemplate.d.ts +6 -0
- package/lib/FieldHelpTemplate/FieldHelpTemplate.js +16 -0
- package/lib/FieldHelpTemplate/FieldHelpTemplate.js.map +1 -0
- package/lib/FieldHelpTemplate/index.d.ts +2 -0
- package/lib/FieldHelpTemplate/index.js +3 -0
- package/lib/FieldHelpTemplate/index.js.map +1 -0
- package/lib/FieldTemplate/FieldTemplate.d.ts +2 -0
- package/lib/FieldTemplate/FieldTemplate.js +12 -0
- package/lib/FieldTemplate/FieldTemplate.js.map +1 -0
- package/lib/FieldTemplate/index.d.ts +2 -0
- package/lib/FieldTemplate/index.js +3 -0
- package/lib/FieldTemplate/index.js.map +1 -0
- package/lib/Form/Form.d.ts +6 -0
- package/lib/Form/Form.js +7 -0
- package/lib/Form/Form.js.map +1 -0
- package/lib/Form/index.d.ts +2 -0
- package/lib/Form/index.js +3 -0
- package/lib/Form/index.js.map +1 -0
- package/lib/IconButton/IconButton.d.ts +7 -0
- package/lib/IconButton/IconButton.js +28 -0
- package/lib/IconButton/IconButton.js.map +1 -0
- package/lib/IconButton/index.d.ts +2 -0
- package/lib/IconButton/index.js +3 -0
- package/lib/IconButton/index.js.map +1 -0
- package/lib/ObjectFieldTemplate/ObjectFieldTemplate.d.ts +2 -0
- package/lib/ObjectFieldTemplate/ObjectFieldTemplate.js +14 -0
- package/lib/ObjectFieldTemplate/ObjectFieldTemplate.js.map +1 -0
- package/lib/ObjectFieldTemplate/index.d.ts +2 -0
- package/lib/ObjectFieldTemplate/index.js +3 -0
- package/lib/ObjectFieldTemplate/index.js.map +1 -0
- package/lib/RadioWidget/RadioWidget.d.ts +2 -0
- package/lib/RadioWidget/RadioWidget.js +18 -0
- package/lib/RadioWidget/RadioWidget.js.map +1 -0
- package/lib/RadioWidget/index.d.ts +2 -0
- package/lib/RadioWidget/index.js +3 -0
- package/lib/RadioWidget/index.js.map +1 -0
- package/lib/RangeWidget/RangeWidget.d.ts +2 -0
- package/lib/RangeWidget/RangeWidget.js +21 -0
- package/lib/RangeWidget/RangeWidget.js.map +1 -0
- package/lib/RangeWidget/index.d.ts +2 -0
- package/lib/RangeWidget/index.js +3 -0
- package/lib/RangeWidget/index.js.map +1 -0
- package/lib/SelectWidget/SelectWidget.d.ts +2 -0
- package/lib/SelectWidget/SelectWidget.js +36 -0
- package/lib/SelectWidget/SelectWidget.js.map +1 -0
- package/lib/SelectWidget/index.d.ts +2 -0
- package/lib/SelectWidget/index.js +3 -0
- package/lib/SelectWidget/index.js.map +1 -0
- package/lib/SubmitButton/SubmitButton.d.ts +2 -0
- package/lib/SubmitButton/SubmitButton.js +11 -0
- package/lib/SubmitButton/SubmitButton.js.map +1 -0
- package/lib/SubmitButton/index.d.ts +2 -0
- package/lib/SubmitButton/index.js +3 -0
- package/lib/SubmitButton/index.js.map +1 -0
- package/lib/Templates/Templates.d.ts +4 -0
- package/lib/Templates/Templates.js +39 -0
- package/lib/Templates/Templates.js.map +1 -0
- package/lib/Templates/index.d.ts +2 -0
- package/lib/Templates/index.js +3 -0
- package/lib/Templates/index.js.map +1 -0
- package/lib/TextareaWidget/TextareaWidget.d.ts +6 -0
- package/lib/TextareaWidget/TextareaWidget.js +11 -0
- package/lib/TextareaWidget/TextareaWidget.js.map +1 -0
- package/lib/TextareaWidget/index.d.ts +2 -0
- package/lib/TextareaWidget/index.js +3 -0
- package/lib/TextareaWidget/index.js.map +1 -0
- package/lib/Theme/Theme.d.ts +5 -0
- package/lib/Theme/Theme.js +10 -0
- package/lib/Theme/Theme.js.map +1 -0
- package/lib/Theme/index.d.ts +2 -0
- package/lib/Theme/index.js +3 -0
- package/lib/Theme/index.js.map +1 -0
- package/lib/TitleField/TitleField.d.ts +2 -0
- package/lib/TitleField/TitleField.js +7 -0
- package/lib/TitleField/TitleField.js.map +1 -0
- package/lib/TitleField/index.d.ts +2 -0
- package/lib/TitleField/index.js +3 -0
- package/lib/TitleField/index.js.map +1 -0
- package/lib/Widgets/Widgets.d.ts +4 -0
- package/lib/Widgets/Widgets.js +18 -0
- package/lib/Widgets/Widgets.js.map +1 -0
- package/lib/Widgets/index.d.ts +2 -0
- package/lib/Widgets/index.js +3 -0
- package/lib/Widgets/index.js.map +1 -0
- package/lib/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.d.ts +2 -0
- package/lib/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js +19 -0
- package/lib/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js.map +1 -0
- package/lib/WrapIfAdditionalTemplate/index.d.ts +2 -0
- package/lib/WrapIfAdditionalTemplate/index.js +3 -0
- package/lib/WrapIfAdditionalTemplate/index.js.map +1 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +98 -0
- package/src/AddButton/AddButton.tsx +21 -0
- package/src/AddButton/index.ts +2 -0
- package/src/ArrayFieldItemTemplate/ArrayFieldItemTemplate.tsx +94 -0
- package/src/ArrayFieldItemTemplate/index.ts +2 -0
- package/src/ArrayFieldTemplate/ArrayFieldTemplate.tsx +86 -0
- package/src/ArrayFieldTemplate/index.ts +2 -0
- package/src/BaseInputTemplate/BaseInputTemplate.tsx +77 -0
- package/src/BaseInputTemplate/index.ts +2 -0
- package/src/CheckboxWidget/CheckboxWidget.tsx +80 -0
- package/src/CheckboxWidget/index.ts +2 -0
- package/src/CheckboxesWidget/CheckboxesWidget.tsx +68 -0
- package/src/CheckboxesWidget/index.ts +2 -0
- package/src/DescriptionField/DescriptionField.tsx +19 -0
- package/src/DescriptionField/index.ts +2 -0
- package/src/ErrorList/ErrorList.tsx +27 -0
- package/src/ErrorList/index.ts +2 -0
- package/src/FieldErrorTemplate/FieldErrorTemplate.tsx +30 -0
- package/src/FieldErrorTemplate/index.ts +2 -0
- package/src/FieldHelpTemplate/FieldHelpTemplate.tsx +23 -0
- package/src/FieldHelpTemplate/index.ts +2 -0
- package/src/FieldTemplate/FieldTemplate.tsx +77 -0
- package/src/FieldTemplate/index.ts +2 -0
- package/src/Form/Form.tsx +15 -0
- package/src/Form/index.ts +2 -0
- package/src/IconButton/IconButton.tsx +62 -0
- package/src/IconButton/index.ts +2 -0
- package/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx +89 -0
- package/src/ObjectFieldTemplate/index.ts +2 -0
- package/src/RadioWidget/RadioWidget.tsx +65 -0
- package/src/RadioWidget/index.ts +2 -0
- package/src/RangeWidget/RangeWidget.tsx +31 -0
- package/src/RangeWidget/index.ts +2 -0
- package/src/SelectWidget/SelectWidget.tsx +91 -0
- package/src/SelectWidget/index.ts +2 -0
- package/src/SubmitButton/SubmitButton.tsx +18 -0
- package/src/SubmitButton/index.ts +2 -0
- package/src/Templates/Templates.ts +45 -0
- package/src/Templates/index.ts +2 -0
- package/src/TextareaWidget/TextareaWidget.tsx +56 -0
- package/src/TextareaWidget/index.ts +2 -0
- package/src/Theme/Theme.tsx +18 -0
- package/src/Theme/index.ts +2 -0
- package/src/TitleField/TitleField.tsx +15 -0
- package/src/TitleField/index.ts +2 -0
- package/src/Widgets/Widgets.ts +24 -0
- package/src/Widgets/index.ts +2 -0
- package/src/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.tsx +79 -0
- package/src/WrapIfAdditionalTemplate/index.ts +2 -0
- package/src/index.ts +8 -0
- package/src/tsconfig.json +23 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ChangeEvent, FocusEvent } from 'react';
|
|
2
|
+
import FormSelect from 'react-bootstrap/FormSelect';
|
|
3
|
+
import {
|
|
4
|
+
ariaDescribedByIds,
|
|
5
|
+
FormContextType,
|
|
6
|
+
enumOptionsIndexForValue,
|
|
7
|
+
enumOptionsValueForIndex,
|
|
8
|
+
RJSFSchema,
|
|
9
|
+
StrictRJSFSchema,
|
|
10
|
+
WidgetProps,
|
|
11
|
+
} from '@rjsf/utils';
|
|
12
|
+
|
|
13
|
+
export default function SelectWidget<
|
|
14
|
+
T = any,
|
|
15
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
16
|
+
F extends FormContextType = any
|
|
17
|
+
>({
|
|
18
|
+
schema,
|
|
19
|
+
id,
|
|
20
|
+
options,
|
|
21
|
+
required,
|
|
22
|
+
disabled,
|
|
23
|
+
readonly,
|
|
24
|
+
value,
|
|
25
|
+
multiple,
|
|
26
|
+
autofocus,
|
|
27
|
+
onChange,
|
|
28
|
+
onBlur,
|
|
29
|
+
onFocus,
|
|
30
|
+
placeholder,
|
|
31
|
+
rawErrors = [],
|
|
32
|
+
}: WidgetProps<T, S, F>) {
|
|
33
|
+
const { enumOptions, enumDisabled, emptyValue: optEmptyValue } = options;
|
|
34
|
+
|
|
35
|
+
const emptyValue = multiple ? [] : '';
|
|
36
|
+
|
|
37
|
+
function getValue(event: FocusEvent | ChangeEvent | any, multiple?: boolean) {
|
|
38
|
+
if (multiple) {
|
|
39
|
+
return [].slice
|
|
40
|
+
.call(event.target.options as any)
|
|
41
|
+
.filter((o: any) => o.selected)
|
|
42
|
+
.map((o: any) => o.value);
|
|
43
|
+
} else {
|
|
44
|
+
return event.target.value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const selectedIndexes = enumOptionsIndexForValue<S>(value, enumOptions, multiple);
|
|
48
|
+
const showPlaceholderOption = !multiple && schema.default === undefined;
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<FormSelect
|
|
52
|
+
id={id}
|
|
53
|
+
name={id}
|
|
54
|
+
value={typeof selectedIndexes === 'undefined' ? emptyValue : selectedIndexes}
|
|
55
|
+
required={required}
|
|
56
|
+
multiple={multiple}
|
|
57
|
+
disabled={disabled || readonly}
|
|
58
|
+
autoFocus={autofocus}
|
|
59
|
+
className={rawErrors.length > 0 ? 'is-invalid' : ''}
|
|
60
|
+
onBlur={
|
|
61
|
+
onBlur &&
|
|
62
|
+
((event: FocusEvent) => {
|
|
63
|
+
const newValue = getValue(event, multiple);
|
|
64
|
+
onBlur(id, enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyValue));
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
onFocus={
|
|
68
|
+
onFocus &&
|
|
69
|
+
((event: FocusEvent) => {
|
|
70
|
+
const newValue = getValue(event, multiple);
|
|
71
|
+
onFocus(id, enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyValue));
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
onChange={(event: ChangeEvent) => {
|
|
75
|
+
const newValue = getValue(event, multiple);
|
|
76
|
+
onChange(enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyValue));
|
|
77
|
+
}}
|
|
78
|
+
aria-describedby={ariaDescribedByIds<T>(id)}
|
|
79
|
+
>
|
|
80
|
+
{showPlaceholderOption && <option value=''>{placeholder}</option>}
|
|
81
|
+
{(enumOptions as any).map(({ value, label }: any, i: number) => {
|
|
82
|
+
const disabled: any = Array.isArray(enumDisabled) && (enumDisabled as any).indexOf(value) != -1;
|
|
83
|
+
return (
|
|
84
|
+
<option key={i} id={label} value={String(i)} disabled={disabled}>
|
|
85
|
+
{label}
|
|
86
|
+
</option>
|
|
87
|
+
);
|
|
88
|
+
})}
|
|
89
|
+
</FormSelect>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Button from 'react-bootstrap/Button';
|
|
2
|
+
import { FormContextType, getSubmitButtonOptions, RJSFSchema, StrictRJSFSchema, SubmitButtonProps } from '@rjsf/utils';
|
|
3
|
+
|
|
4
|
+
export default function SubmitButton<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
|
|
5
|
+
props: SubmitButtonProps<T, S, F>
|
|
6
|
+
) {
|
|
7
|
+
const { submitText, norender, props: submitButtonProps } = getSubmitButtonOptions<T, S, F>(props.uiSchema);
|
|
8
|
+
if (norender) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return (
|
|
12
|
+
<div>
|
|
13
|
+
<Button variant='primary' type='submit' {...submitButtonProps}>
|
|
14
|
+
{submitText}
|
|
15
|
+
</Button>
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import AddButton from '../AddButton';
|
|
2
|
+
import ArrayFieldItemTemplate from '../ArrayFieldItemTemplate';
|
|
3
|
+
import ArrayFieldTemplate from '../ArrayFieldTemplate';
|
|
4
|
+
import BaseInputTemplate from '../BaseInputTemplate/BaseInputTemplate';
|
|
5
|
+
import DescriptionField from '../DescriptionField';
|
|
6
|
+
import ErrorList from '../ErrorList';
|
|
7
|
+
import { CopyButton, MoveDownButton, MoveUpButton, RemoveButton } from '../IconButton';
|
|
8
|
+
import FieldErrorTemplate from '../FieldErrorTemplate';
|
|
9
|
+
import FieldHelpTemplate from '../FieldHelpTemplate';
|
|
10
|
+
import FieldTemplate from '../FieldTemplate';
|
|
11
|
+
import ObjectFieldTemplate from '../ObjectFieldTemplate';
|
|
12
|
+
import SubmitButton from '../SubmitButton';
|
|
13
|
+
import TitleField from '../TitleField';
|
|
14
|
+
import WrapIfAdditionalTemplate from '../WrapIfAdditionalTemplate';
|
|
15
|
+
import { FormContextType, RJSFSchema, StrictRJSFSchema, TemplatesType } from '@rjsf/utils';
|
|
16
|
+
|
|
17
|
+
export function generateTemplates<
|
|
18
|
+
T = any,
|
|
19
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
20
|
+
F extends FormContextType = any
|
|
21
|
+
>(): Partial<TemplatesType<T, S, F>> {
|
|
22
|
+
return {
|
|
23
|
+
ArrayFieldItemTemplate,
|
|
24
|
+
ArrayFieldTemplate,
|
|
25
|
+
BaseInputTemplate,
|
|
26
|
+
ButtonTemplates: {
|
|
27
|
+
AddButton,
|
|
28
|
+
CopyButton,
|
|
29
|
+
MoveDownButton,
|
|
30
|
+
MoveUpButton,
|
|
31
|
+
RemoveButton,
|
|
32
|
+
SubmitButton,
|
|
33
|
+
},
|
|
34
|
+
DescriptionFieldTemplate: DescriptionField,
|
|
35
|
+
ErrorListTemplate: ErrorList,
|
|
36
|
+
FieldErrorTemplate,
|
|
37
|
+
FieldHelpTemplate,
|
|
38
|
+
FieldTemplate,
|
|
39
|
+
ObjectFieldTemplate,
|
|
40
|
+
TitleFieldTemplate: TitleField,
|
|
41
|
+
WrapIfAdditionalTemplate,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default generateTemplates();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ChangeEvent, FocusEvent } from 'react';
|
|
2
|
+
import { ariaDescribedByIds, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjsf/utils';
|
|
3
|
+
import FormControl from 'react-bootstrap/FormControl';
|
|
4
|
+
import InputGroup from 'react-bootstrap/InputGroup';
|
|
5
|
+
|
|
6
|
+
type CustomWidgetProps<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any> = WidgetProps<
|
|
7
|
+
T,
|
|
8
|
+
S,
|
|
9
|
+
F
|
|
10
|
+
> & {
|
|
11
|
+
options: any;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function TextareaWidget<
|
|
15
|
+
T = any,
|
|
16
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
17
|
+
F extends FormContextType = any
|
|
18
|
+
>({
|
|
19
|
+
id,
|
|
20
|
+
placeholder,
|
|
21
|
+
value,
|
|
22
|
+
required,
|
|
23
|
+
disabled,
|
|
24
|
+
autofocus,
|
|
25
|
+
readonly,
|
|
26
|
+
onBlur,
|
|
27
|
+
onFocus,
|
|
28
|
+
onChange,
|
|
29
|
+
options,
|
|
30
|
+
}: CustomWidgetProps<T, S, F>) {
|
|
31
|
+
const _onChange = ({ target: { value } }: ChangeEvent<HTMLTextAreaElement>) =>
|
|
32
|
+
onChange(value === '' ? options.emptyValue : value);
|
|
33
|
+
const _onBlur = ({ target }: FocusEvent<HTMLTextAreaElement>) => onBlur(id, target && target.value);
|
|
34
|
+
const _onFocus = ({ target }: FocusEvent<HTMLTextAreaElement>) => onFocus(id, target && target.value);
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<InputGroup>
|
|
38
|
+
<FormControl
|
|
39
|
+
id={id}
|
|
40
|
+
name={id}
|
|
41
|
+
as='textarea'
|
|
42
|
+
placeholder={placeholder}
|
|
43
|
+
disabled={disabled}
|
|
44
|
+
readOnly={readonly}
|
|
45
|
+
value={value}
|
|
46
|
+
required={required}
|
|
47
|
+
autoFocus={autofocus}
|
|
48
|
+
rows={options.rows || 5}
|
|
49
|
+
onChange={_onChange}
|
|
50
|
+
onBlur={_onBlur}
|
|
51
|
+
onFocus={_onFocus}
|
|
52
|
+
aria-describedby={ariaDescribedByIds<T>(id)}
|
|
53
|
+
/>
|
|
54
|
+
</InputGroup>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ThemeProps } from '@rjsf/core';
|
|
2
|
+
|
|
3
|
+
import { generateTemplates } from '../Templates';
|
|
4
|
+
import { generateWidgets } from '../Widgets';
|
|
5
|
+
import { FormContextType, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';
|
|
6
|
+
|
|
7
|
+
export function generateTheme<
|
|
8
|
+
T = any,
|
|
9
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
10
|
+
F extends FormContextType = any
|
|
11
|
+
>(): ThemeProps<T, S, F> {
|
|
12
|
+
return {
|
|
13
|
+
templates: generateTemplates<T, S, F>(),
|
|
14
|
+
widgets: generateWidgets<T, S, F>(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default generateTheme();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FormContextType, getUiOptions, RJSFSchema, StrictRJSFSchema, TitleFieldProps } from '@rjsf/utils';
|
|
2
|
+
|
|
3
|
+
export default function TitleField<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
|
|
4
|
+
id,
|
|
5
|
+
title,
|
|
6
|
+
uiSchema,
|
|
7
|
+
}: TitleFieldProps<T, S, F>) {
|
|
8
|
+
const uiOptions = getUiOptions<T, S, F>(uiSchema);
|
|
9
|
+
return (
|
|
10
|
+
<div id={id} className='my-1'>
|
|
11
|
+
<h5>{uiOptions.title || title}</h5>
|
|
12
|
+
<hr className='border-0 bg-secondary' style={{ height: '1px' }} />
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import CheckboxWidget from '../CheckboxWidget/CheckboxWidget';
|
|
2
|
+
import CheckboxesWidget from '../CheckboxesWidget/CheckboxesWidget';
|
|
3
|
+
import RadioWidget from '../RadioWidget/RadioWidget';
|
|
4
|
+
import RangeWidget from '../RangeWidget/RangeWidget';
|
|
5
|
+
import SelectWidget from '../SelectWidget/SelectWidget';
|
|
6
|
+
import TextareaWidget from '../TextareaWidget/TextareaWidget';
|
|
7
|
+
import { FormContextType, RegistryWidgetsType, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';
|
|
8
|
+
|
|
9
|
+
export function generateWidgets<
|
|
10
|
+
T = any,
|
|
11
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
12
|
+
F extends FormContextType = any
|
|
13
|
+
>(): RegistryWidgetsType<T, S, F> {
|
|
14
|
+
return {
|
|
15
|
+
CheckboxWidget,
|
|
16
|
+
CheckboxesWidget,
|
|
17
|
+
RadioWidget,
|
|
18
|
+
RangeWidget,
|
|
19
|
+
SelectWidget,
|
|
20
|
+
TextareaWidget,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default generateWidgets();
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { FocusEvent } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ADDITIONAL_PROPERTY_FLAG,
|
|
4
|
+
FormContextType,
|
|
5
|
+
RJSFSchema,
|
|
6
|
+
StrictRJSFSchema,
|
|
7
|
+
TranslatableString,
|
|
8
|
+
WrapIfAdditionalTemplateProps,
|
|
9
|
+
} from '@rjsf/utils';
|
|
10
|
+
|
|
11
|
+
import Row from 'react-bootstrap/Row';
|
|
12
|
+
import Col from 'react-bootstrap/Col';
|
|
13
|
+
import Form from 'react-bootstrap/Form';
|
|
14
|
+
|
|
15
|
+
export default function WrapIfAdditionalTemplate<
|
|
16
|
+
T = any,
|
|
17
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
18
|
+
F extends FormContextType = any
|
|
19
|
+
>({
|
|
20
|
+
classNames,
|
|
21
|
+
style,
|
|
22
|
+
children,
|
|
23
|
+
disabled,
|
|
24
|
+
id,
|
|
25
|
+
label,
|
|
26
|
+
onDropPropertyClick,
|
|
27
|
+
onKeyChange,
|
|
28
|
+
readonly,
|
|
29
|
+
required,
|
|
30
|
+
schema,
|
|
31
|
+
uiSchema,
|
|
32
|
+
registry,
|
|
33
|
+
}: WrapIfAdditionalTemplateProps<T, S, F>) {
|
|
34
|
+
const { templates, translateString } = registry;
|
|
35
|
+
// Button templates are not overridden in the uiSchema
|
|
36
|
+
const { RemoveButton } = templates.ButtonTemplates;
|
|
37
|
+
const keyLabel = translateString(TranslatableString.KeyLabel, [label]);
|
|
38
|
+
const additional = ADDITIONAL_PROPERTY_FLAG in schema;
|
|
39
|
+
|
|
40
|
+
if (!additional) {
|
|
41
|
+
return (
|
|
42
|
+
<div className={classNames} style={style}>
|
|
43
|
+
{children}
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const handleBlur = ({ target }: FocusEvent<HTMLInputElement>) => onKeyChange(target.value);
|
|
49
|
+
const keyId = `${id}-key`;
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<Row className={classNames} style={style} key={keyId}>
|
|
53
|
+
<Col xs={5}>
|
|
54
|
+
<Form.Group>
|
|
55
|
+
<Form.Label htmlFor={keyId}>{keyLabel}</Form.Label>
|
|
56
|
+
<Form.Control
|
|
57
|
+
required={required}
|
|
58
|
+
defaultValue={label}
|
|
59
|
+
disabled={disabled || readonly}
|
|
60
|
+
id={keyId}
|
|
61
|
+
name={keyId}
|
|
62
|
+
onBlur={!readonly ? handleBlur : undefined}
|
|
63
|
+
type='text'
|
|
64
|
+
/>
|
|
65
|
+
</Form.Group>
|
|
66
|
+
</Col>
|
|
67
|
+
<Col xs={5}>{children}</Col>
|
|
68
|
+
<Col xs={2} className='py-4 d-grid gap-2'>
|
|
69
|
+
<RemoveButton
|
|
70
|
+
className='w-100'
|
|
71
|
+
disabled={disabled || readonly}
|
|
72
|
+
onClick={onDropPropertyClick(label)}
|
|
73
|
+
uiSchema={uiSchema}
|
|
74
|
+
registry={registry}
|
|
75
|
+
/>
|
|
76
|
+
</Col>
|
|
77
|
+
</Row>
|
|
78
|
+
);
|
|
79
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Form from './Form/Form';
|
|
2
|
+
|
|
3
|
+
export { default as Form, generateForm } from './Form';
|
|
4
|
+
export { default as Templates, generateTemplates } from './Templates';
|
|
5
|
+
export { default as Theme, generateTheme } from './Theme';
|
|
6
|
+
export { default as Widgets, generateWidgets } from './Widgets';
|
|
7
|
+
|
|
8
|
+
export default Form;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../tsconfig.base.json",
|
|
3
|
+
"include": [
|
|
4
|
+
"./"
|
|
5
|
+
],
|
|
6
|
+
"compilerOptions": {
|
|
7
|
+
"rootDir": "./",
|
|
8
|
+
"outDir": "../lib",
|
|
9
|
+
"baseUrl": "../",
|
|
10
|
+
"jsx": "react-jsx"
|
|
11
|
+
},
|
|
12
|
+
"references": [
|
|
13
|
+
{
|
|
14
|
+
"path": "../../core"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"path": "../../utils"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "../../validator-ajv8"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|