@rjsf/mantine 6.0.0-beta.22 → 6.0.0-beta.23
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/index.cjs +78 -210
- package/dist/index.cjs.map +4 -4
- package/dist/mantine.esm.js +78 -212
- package/dist/mantine.esm.js.map +4 -4
- package/dist/mantine.umd.js +85 -216
- package/lib/templates/FieldHelpTemplate.js +4 -1
- package/lib/templates/FieldHelpTemplate.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/widgets/DateTime/AltDateTimeWidget.d.ts +1 -7
- package/lib/widgets/DateTime/AltDateTimeWidget.js +1 -6
- package/lib/widgets/DateTime/AltDateTimeWidget.js.map +1 -1
- package/lib/widgets/DateTime/AltDateWidget.d.ts +1 -7
- package/lib/widgets/DateTime/AltDateWidget.js +6 -39
- package/lib/widgets/DateTime/AltDateWidget.js.map +1 -1
- package/lib/widgets/FileWidget.js +9 -87
- package/lib/widgets/FileWidget.js.map +1 -1
- package/package.json +7 -7
- package/src/templates/FieldHelpTemplate.tsx +5 -1
- package/src/widgets/DateTime/AltDateTimeWidget.tsx +1 -8
- package/src/widgets/DateTime/AltDateWidget.tsx +6 -71
- package/src/widgets/FileWidget.tsx +20 -112
|
@@ -4,10 +4,4 @@ import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjs
|
|
|
4
4
|
*
|
|
5
5
|
* @param props - The `WidgetProps` for this component
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
declare namespace AltDateTimeWidget {
|
|
9
|
-
var defaultProps: {
|
|
10
|
-
showTime: boolean;
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export default AltDateTimeWidget;
|
|
7
|
+
export default function AltDateTimeWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(props: WidgetProps<T, S, F>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import _AltDateWidget from './AltDateWidget';
|
|
3
2
|
/** The `AltDateTimeWidget` is an alternative widget for rendering datetime properties.
|
|
4
3
|
* It uses the AltDateWidget for rendering, with the `time` prop set to true by default.
|
|
5
4
|
*
|
|
@@ -7,10 +6,6 @@ import _AltDateWidget from './AltDateWidget';
|
|
|
7
6
|
*/
|
|
8
7
|
export default function AltDateTimeWidget(props) {
|
|
9
8
|
const { AltDateWidget } = props.registry.widgets;
|
|
10
|
-
return _jsx(AltDateWidget, {
|
|
9
|
+
return _jsx(AltDateWidget, { time: true, ...props });
|
|
11
10
|
}
|
|
12
|
-
AltDateTimeWidget.defaultProps = {
|
|
13
|
-
..._AltDateWidget === null || _AltDateWidget === void 0 ? void 0 : _AltDateWidget.defaultProps,
|
|
14
|
-
showTime: true,
|
|
15
|
-
};
|
|
16
11
|
//# sourceMappingURL=AltDateTimeWidget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AltDateTimeWidget.js","sourceRoot":"","sources":["../../../src/widgets/DateTime/AltDateTimeWidget.tsx"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"AltDateTimeWidget.js","sourceRoot":"","sources":["../../../src/widgets/DateTime/AltDateTimeWidget.tsx"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAIvC,KAA2B;IAC3B,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;IACjD,OAAO,KAAC,aAAa,IAAC,IAAI,WAAK,KAAK,GAAI,CAAC;AAC3C,CAAC"}
|
|
@@ -2,10 +2,4 @@ import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjs
|
|
|
2
2
|
/** The `AltDateWidget` is an alternative widget for rendering date properties.
|
|
3
3
|
* @param props - The `WidgetProps` for this component
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
declare namespace AltDateWidget {
|
|
7
|
-
var defaultProps: {
|
|
8
|
-
showTime: boolean;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export default AltDateWidget;
|
|
5
|
+
export default function AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(props: WidgetProps<T, S, F>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,51 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { ariaDescribedByIds, dateRangeOptions, parseDateString, toDateString, getDateElementProps, titleId, TranslatableString, } from '@rjsf/utils';
|
|
2
|
+
import { ariaDescribedByIds, dateRangeOptions, titleId, TranslatableString, useAltDateWidgetProps, } from '@rjsf/utils';
|
|
4
3
|
import { Flex, Box, Group, Button, Select, Input } from '@mantine/core';
|
|
5
|
-
function readyForChange(state) {
|
|
6
|
-
return Object.values(state).every((value) => value !== -1);
|
|
7
|
-
}
|
|
8
4
|
/** The `AltDateWidget` is an alternative widget for rendering date properties.
|
|
9
5
|
* @param props - The `WidgetProps` for this component
|
|
10
6
|
*/
|
|
11
7
|
export default function AltDateWidget(props) {
|
|
12
|
-
const { id,
|
|
8
|
+
const { id, required, disabled, readonly, label, hideLabel, rawErrors, options, registry } = props;
|
|
13
9
|
const { translateString } = registry;
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const handleChange = useCallback((property, nextValue) => {
|
|
19
|
-
const nextState = {
|
|
20
|
-
...state,
|
|
21
|
-
[property]: typeof nextValue === 'undefined' ? -1 : nextValue,
|
|
22
|
-
};
|
|
23
|
-
if (readyForChange(nextState)) {
|
|
24
|
-
onChange(toDateString(nextState, showTime));
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
setState(nextState);
|
|
28
|
-
}
|
|
29
|
-
}, [state, onChange, showTime]);
|
|
30
|
-
const handleSetNow = useCallback(() => {
|
|
31
|
-
if (!disabled && !readonly) {
|
|
32
|
-
const nextState = parseDateString(new Date().toJSON(), showTime);
|
|
33
|
-
onChange(toDateString(nextState, showTime));
|
|
34
|
-
}
|
|
35
|
-
}, [disabled, readonly, showTime, onChange]);
|
|
36
|
-
const handleClear = useCallback(() => {
|
|
37
|
-
if (!disabled && !readonly) {
|
|
38
|
-
onChange('');
|
|
39
|
-
}
|
|
40
|
-
}, [disabled, readonly, onChange]);
|
|
41
|
-
return (_jsxs(_Fragment, { children: [!hideLabel && !!label && (_jsx(Input.Label, { id: titleId(id), required: required, children: label })), _jsxs(Flex, { gap: 'xs', align: 'center', wrap: 'nowrap', children: [getDateElementProps(state, showTime, options.yearsRange, options.format).map((elemProps, i) => {
|
|
42
|
-
const elemId = id + '_' + elemProps.type;
|
|
43
|
-
return (_jsx(Box, { children: _jsx(Select, { id: elemId, name: elemId, placeholder: elemProps.type, disabled: disabled || readonly, data: dateRangeOptions(elemProps.range[0], elemProps.range[1]).map((item) => item.value.toString()), value: !elemProps.value || elemProps.value < 0 ? null : elemProps.value.toString(), onChange: (v) => handleChange(elemProps.type, v), searchable: false, allowDeselect: false, comboboxProps: { withinPortal: false }, "aria-describedby": ariaDescribedByIds(elemId) }) }, i));
|
|
10
|
+
const { elements, handleChange, handleClear, handleSetNow } = useAltDateWidgetProps(props);
|
|
11
|
+
return (_jsxs(_Fragment, { children: [!hideLabel && !!label && (_jsx(Input.Label, { id: titleId(id), required: required, children: label })), _jsxs(Flex, { gap: 'xs', align: 'center', wrap: 'nowrap', children: [elements.map((elemProps, i) => {
|
|
12
|
+
const elemId = `${id}_${elemProps.type}`;
|
|
13
|
+
return (_jsx(Box, { children: _jsx(Select, { id: elemId, name: elemId, placeholder: elemProps.type, disabled: disabled || readonly, data: dateRangeOptions(elemProps.range[0], elemProps.range[1]).map((item) => item.value.toString()), value: !elemProps.value || elemProps.value < 0 ? null : elemProps.value.toString(), onChange: (v) => handleChange(elemProps.type, v || undefined), searchable: false, allowDeselect: false, comboboxProps: { withinPortal: false }, "aria-describedby": ariaDescribedByIds(elemId) }) }, i));
|
|
44
14
|
}), _jsxs(Group, { wrap: 'nowrap', gap: 3, children: [(options.hideNowButton !== 'undefined' ? !options.hideNowButton : true) && (_jsx(Button, { variant: 'subtle', size: 'xs', onClick: handleSetNow, children: translateString(TranslatableString.NowLabel) })), (options.hideClearButton !== 'undefined' ? !options.hideClearButton : true) && (_jsx(Button, { variant: 'subtle', size: 'xs', onClick: handleClear, children: translateString(TranslatableString.ClearLabel) }))] })] }), rawErrors &&
|
|
45
15
|
(rawErrors === null || rawErrors === void 0 ? void 0 : rawErrors.length) > 0 &&
|
|
46
16
|
rawErrors.map((error, index) => (_jsx(Input.Error, { children: error }, `alt-date-widget-input-errors-${index}`)))] }));
|
|
47
17
|
}
|
|
48
|
-
AltDateWidget.defaultProps = {
|
|
49
|
-
showTime: false,
|
|
50
|
-
};
|
|
51
18
|
//# sourceMappingURL=AltDateWidget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AltDateWidget.js","sourceRoot":"","sources":["../../../src/widgets/DateTime/AltDateWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AltDateWidget.js","sourceRoot":"","sources":["../../../src/widgets/DateTime/AltDateWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,68 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { ariaDescribedByIds, labelValue, useFileWidgetProps, } from '@rjsf/utils';
|
|
4
4
|
import { FileInput, Pill } from '@mantine/core';
|
|
5
5
|
import { cleanupOptions } from '../utils';
|
|
6
|
-
function addNameToDataURL(dataURL, name) {
|
|
7
|
-
if (dataURL === null) {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
return dataURL.replace(';base64', `;name=${encodeURIComponent(name)};base64`);
|
|
11
|
-
}
|
|
12
|
-
function processFile(file) {
|
|
13
|
-
const { name, size, type } = file;
|
|
14
|
-
return new Promise((resolve, reject) => {
|
|
15
|
-
const reader = new window.FileReader();
|
|
16
|
-
reader.onerror = reject;
|
|
17
|
-
reader.onload = (event) => {
|
|
18
|
-
var _a;
|
|
19
|
-
if (typeof ((_a = event.target) === null || _a === void 0 ? void 0 : _a.result) === 'string') {
|
|
20
|
-
resolve({
|
|
21
|
-
dataURL: addNameToDataURL(event.target.result, name),
|
|
22
|
-
name,
|
|
23
|
-
size,
|
|
24
|
-
type,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
resolve({
|
|
29
|
-
dataURL: null,
|
|
30
|
-
name,
|
|
31
|
-
size,
|
|
32
|
-
type,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
reader.readAsDataURL(file);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function processFiles(files) {
|
|
40
|
-
return Promise.all(Array.from(files).map(processFile));
|
|
41
|
-
}
|
|
42
|
-
function extractFileInfo(dataURLs) {
|
|
43
|
-
return dataURLs.reduce((acc, dataURL) => {
|
|
44
|
-
if (!dataURL) {
|
|
45
|
-
return acc;
|
|
46
|
-
}
|
|
47
|
-
try {
|
|
48
|
-
const { blob, name } = dataURItoBlob(dataURL);
|
|
49
|
-
return [
|
|
50
|
-
...acc,
|
|
51
|
-
{
|
|
52
|
-
dataURL,
|
|
53
|
-
name: name,
|
|
54
|
-
size: blob.size,
|
|
55
|
-
type: blob.type,
|
|
56
|
-
},
|
|
57
|
-
];
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
console.log(e);
|
|
61
|
-
// Invalid dataURI, so just ignore it.
|
|
62
|
-
return acc;
|
|
63
|
-
}
|
|
64
|
-
}, []);
|
|
65
|
-
}
|
|
66
6
|
/**
|
|
67
7
|
* The `FileWidget` is a widget for rendering file upload fields.
|
|
68
8
|
*
|
|
@@ -70,37 +10,19 @@ function extractFileInfo(dataURLs) {
|
|
|
70
10
|
*/
|
|
71
11
|
export default function FileWidget(props) {
|
|
72
12
|
const { id, name, value, placeholder, required, disabled, readonly, autofocus, label, hideLabel, rawErrors, options, multiple, onChange, } = props;
|
|
13
|
+
const { filesInfo, handleChange, handleRemove } = useFileWidgetProps(value, onChange, multiple);
|
|
73
14
|
const themeProps = cleanupOptions(options);
|
|
74
|
-
const
|
|
15
|
+
const handleOnChange = useCallback((files) => {
|
|
75
16
|
if (typeof files === 'object') {
|
|
76
|
-
|
|
77
|
-
const newValue = filesInfoEvent.map((fileInfo) => fileInfo.dataURL);
|
|
78
|
-
if (multiple) {
|
|
79
|
-
onChange(value.concat(newValue));
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
onChange(newValue[0]);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return;
|
|
87
|
-
}, [multiple, value, onChange]);
|
|
88
|
-
const handleRemoveFile = useCallback((index) => {
|
|
89
|
-
if (multiple) {
|
|
90
|
-
const newValue = value.filter((_, i) => i !== index);
|
|
91
|
-
onChange(newValue);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
onChange(undefined);
|
|
17
|
+
handleChange(files);
|
|
95
18
|
}
|
|
96
|
-
}, [
|
|
97
|
-
const ValueComponent = useCallback((
|
|
98
|
-
const filesInfo = props.value ? extractFileInfo(Array.isArray(props.value) ? props.value : [props.value]) : null;
|
|
19
|
+
}, [handleChange]);
|
|
20
|
+
const ValueComponent = useCallback(() => {
|
|
99
21
|
if (Array.isArray(filesInfo) && filesInfo.length > 0) {
|
|
100
|
-
return (_jsx(Pill.Group, { children: filesInfo.map((file, index) => (_jsx(Pill, { withRemoveButton: true, onRemove: () =>
|
|
22
|
+
return (_jsx(Pill.Group, { children: filesInfo.map((file, index) => (_jsx(Pill, { withRemoveButton: true, onRemove: () => handleRemove(index), children: file.name }, index))) }));
|
|
101
23
|
}
|
|
102
24
|
return null;
|
|
103
|
-
}, [
|
|
104
|
-
return (_jsx(FileInput, { id: id, name: name, value: value || '', placeholder: placeholder || undefined, required: required, disabled: disabled || readonly, autoFocus: autofocus, label: labelValue(label || undefined, hideLabel, false), multiple: !!multiple, valueComponent: ValueComponent, onChange:
|
|
25
|
+
}, [handleRemove, filesInfo]);
|
|
26
|
+
return (_jsx(FileInput, { id: id, name: name, value: value || '', placeholder: placeholder || undefined, required: required, disabled: disabled || readonly, autoFocus: autofocus, label: labelValue(label || undefined, hideLabel, false), multiple: !!multiple, valueComponent: ValueComponent, onChange: handleOnChange, error: rawErrors && rawErrors.length > 0 ? rawErrors.join('\n') : undefined, ...themeProps, "aria-describedby": ariaDescribedByIds(id) }));
|
|
105
27
|
}
|
|
106
28
|
//# sourceMappingURL=FileWidget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileWidget.js","sourceRoot":"","sources":["../../src/widgets/FileWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"FileWidget.js","sourceRoot":"","sources":["../../src/widgets/FileWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EACL,kBAAkB,EAElB,UAAU,EAGV,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,KAA2B;IAE3B,MAAM,EACJ,EAAE,EACF,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,KAAK,EACL,SAAS,EACT,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,GACT,GAAG,KAAK,CAAC;IACV,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChG,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAAU,EAAE,EAAE;QACb,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,CACL,KAAC,IAAI,CAAC,KAAK,cACR,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9B,KAAC,IAAI,IAAa,gBAAgB,QAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,YACnE,IAAI,CAAC,IAAI,IADD,KAAK,CAET,CACR,CAAC,GACS,CACd,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,KAAC,SAAS,IACR,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,WAAW,EAAE,WAAW,IAAI,SAAS,EACrC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAC9B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,EACvD,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,KACvE,UAAU,sBACI,kBAAkB,CAAC,EAAE,CAAC,GACxC,CACH,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rjsf/mantine",
|
|
3
|
-
"version": "6.0.0-beta.
|
|
3
|
+
"version": "6.0.0-beta.23",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"@mantine/core": ">=8",
|
|
65
65
|
"@mantine/dates": ">=8",
|
|
66
66
|
"@mantine/hooks": ">=8",
|
|
67
|
-
"@rjsf/core": "^6.0.0-beta.
|
|
68
|
-
"@rjsf/utils": "^6.0.0-beta.
|
|
67
|
+
"@rjsf/core": "^6.0.0-beta.23",
|
|
68
|
+
"@rjsf/utils": "^6.0.0-beta.23",
|
|
69
69
|
"react": ">=18"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
@@ -74,10 +74,10 @@
|
|
|
74
74
|
"@mantine/hooks": "^8.3.1",
|
|
75
75
|
"@restart/hooks": "^0.6.2",
|
|
76
76
|
"@restart/ui": "^1.9.4",
|
|
77
|
-
"@rjsf/core": "^6.0.0-beta.
|
|
78
|
-
"@rjsf/snapshot-tests": "^6.0.0-beta.
|
|
79
|
-
"@rjsf/utils": "^6.0.0-beta.
|
|
80
|
-
"@rjsf/validator-ajv8": "^6.0.0-beta.
|
|
77
|
+
"@rjsf/core": "^6.0.0-beta.23",
|
|
78
|
+
"@rjsf/snapshot-tests": "^6.0.0-beta.23",
|
|
79
|
+
"@rjsf/utils": "^6.0.0-beta.23",
|
|
80
|
+
"@rjsf/validator-ajv8": "^6.0.0-beta.23",
|
|
81
81
|
"eslint": "^8.57.1",
|
|
82
82
|
"uncontrollable": "^9.0.0"
|
|
83
83
|
},
|
|
@@ -12,9 +12,13 @@ export default function FieldHelpTemplate<
|
|
|
12
12
|
>(props: FieldHelpProps<T, S, F>) {
|
|
13
13
|
const { fieldPathId, help } = props;
|
|
14
14
|
|
|
15
|
+
if (!help) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
15
19
|
const id = helpId(fieldPathId);
|
|
16
20
|
|
|
17
|
-
return
|
|
21
|
+
return (
|
|
18
22
|
<Text id={id} size='sm' my='xs' c='dimmed'>
|
|
19
23
|
{help}
|
|
20
24
|
</Text>
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjsf/utils';
|
|
2
2
|
|
|
3
|
-
import _AltDateWidget from './AltDateWidget';
|
|
4
|
-
|
|
5
3
|
/** The `AltDateTimeWidget` is an alternative widget for rendering datetime properties.
|
|
6
4
|
* It uses the AltDateWidget for rendering, with the `time` prop set to true by default.
|
|
7
5
|
*
|
|
@@ -13,10 +11,5 @@ export default function AltDateTimeWidget<
|
|
|
13
11
|
F extends FormContextType = any,
|
|
14
12
|
>(props: WidgetProps<T, S, F>) {
|
|
15
13
|
const { AltDateWidget } = props.registry.widgets;
|
|
16
|
-
return <AltDateWidget
|
|
14
|
+
return <AltDateWidget time {...props} />;
|
|
17
15
|
}
|
|
18
|
-
|
|
19
|
-
AltDateTimeWidget.defaultProps = {
|
|
20
|
-
..._AltDateWidget?.defaultProps,
|
|
21
|
-
showTime: true,
|
|
22
|
-
};
|
|
@@ -1,25 +1,17 @@
|
|
|
1
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
2
1
|
import {
|
|
3
2
|
ariaDescribedByIds,
|
|
4
3
|
dateRangeOptions,
|
|
5
|
-
parseDateString,
|
|
6
|
-
toDateString,
|
|
7
|
-
getDateElementProps,
|
|
8
4
|
titleId,
|
|
9
5
|
DateObject,
|
|
10
|
-
type DateElementFormat,
|
|
11
6
|
FormContextType,
|
|
12
7
|
RJSFSchema,
|
|
13
8
|
StrictRJSFSchema,
|
|
14
9
|
TranslatableString,
|
|
10
|
+
useAltDateWidgetProps,
|
|
15
11
|
WidgetProps,
|
|
16
12
|
} from '@rjsf/utils';
|
|
17
13
|
import { Flex, Box, Group, Button, Select, Input } from '@mantine/core';
|
|
18
14
|
|
|
19
|
-
function readyForChange(state: DateObject) {
|
|
20
|
-
return Object.values(state).every((value) => value !== -1);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
15
|
/** The `AltDateWidget` is an alternative widget for rendering date properties.
|
|
24
16
|
* @param props - The `WidgetProps` for this component
|
|
25
17
|
*/
|
|
@@ -28,57 +20,9 @@ export default function AltDateWidget<
|
|
|
28
20
|
S extends StrictRJSFSchema = RJSFSchema,
|
|
29
21
|
F extends FormContextType = any,
|
|
30
22
|
>(props: WidgetProps<T, S, F>) {
|
|
31
|
-
const {
|
|
32
|
-
id,
|
|
33
|
-
value,
|
|
34
|
-
required,
|
|
35
|
-
disabled,
|
|
36
|
-
readonly,
|
|
37
|
-
label,
|
|
38
|
-
hideLabel,
|
|
39
|
-
rawErrors,
|
|
40
|
-
options,
|
|
41
|
-
onChange,
|
|
42
|
-
showTime = false,
|
|
43
|
-
registry,
|
|
44
|
-
} = props;
|
|
45
|
-
|
|
23
|
+
const { id, required, disabled, readonly, label, hideLabel, rawErrors, options, registry } = props;
|
|
46
24
|
const { translateString } = registry;
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
setState(parseDateString(value, showTime));
|
|
51
|
-
}, [showTime, value]);
|
|
52
|
-
|
|
53
|
-
const handleChange = useCallback(
|
|
54
|
-
(property: keyof DateObject, nextValue: any) => {
|
|
55
|
-
const nextState = {
|
|
56
|
-
...state,
|
|
57
|
-
[property]: typeof nextValue === 'undefined' ? -1 : nextValue,
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
if (readyForChange(nextState)) {
|
|
61
|
-
onChange(toDateString(nextState, showTime));
|
|
62
|
-
} else {
|
|
63
|
-
setState(nextState);
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
[state, onChange, showTime],
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
const handleSetNow = useCallback(() => {
|
|
70
|
-
if (!disabled && !readonly) {
|
|
71
|
-
const nextState = parseDateString(new Date().toJSON(), showTime);
|
|
72
|
-
onChange(toDateString(nextState, showTime));
|
|
73
|
-
}
|
|
74
|
-
}, [disabled, readonly, showTime, onChange]);
|
|
75
|
-
|
|
76
|
-
const handleClear = useCallback(() => {
|
|
77
|
-
if (!disabled && !readonly) {
|
|
78
|
-
onChange('');
|
|
79
|
-
}
|
|
80
|
-
}, [disabled, readonly, onChange]);
|
|
81
|
-
|
|
25
|
+
const { elements, handleChange, handleClear, handleSetNow } = useAltDateWidgetProps(props);
|
|
82
26
|
return (
|
|
83
27
|
<>
|
|
84
28
|
{!hideLabel && !!label && (
|
|
@@ -87,13 +31,8 @@ export default function AltDateWidget<
|
|
|
87
31
|
</Input.Label>
|
|
88
32
|
)}
|
|
89
33
|
<Flex gap='xs' align='center' wrap='nowrap'>
|
|
90
|
-
{
|
|
91
|
-
|
|
92
|
-
showTime,
|
|
93
|
-
options.yearsRange as [number, number] | undefined,
|
|
94
|
-
options.format as DateElementFormat | undefined,
|
|
95
|
-
).map((elemProps, i) => {
|
|
96
|
-
const elemId = id + '_' + elemProps.type;
|
|
34
|
+
{elements.map((elemProps, i) => {
|
|
35
|
+
const elemId = `${id}_${elemProps.type}`;
|
|
97
36
|
return (
|
|
98
37
|
<Box key={i}>
|
|
99
38
|
<Select
|
|
@@ -103,7 +42,7 @@ export default function AltDateWidget<
|
|
|
103
42
|
disabled={disabled || readonly}
|
|
104
43
|
data={dateRangeOptions<S>(elemProps.range[0], elemProps.range[1]).map((item) => item.value.toString())}
|
|
105
44
|
value={!elemProps.value || elemProps.value < 0 ? null : elemProps.value.toString()}
|
|
106
|
-
onChange={(v) => handleChange(elemProps.type as keyof DateObject, v)}
|
|
45
|
+
onChange={(v) => handleChange(elemProps.type as keyof DateObject, v || undefined)}
|
|
107
46
|
searchable={false}
|
|
108
47
|
allowDeselect={false}
|
|
109
48
|
comboboxProps={{ withinPortal: false }}
|
|
@@ -133,7 +72,3 @@ export default function AltDateWidget<
|
|
|
133
72
|
</>
|
|
134
73
|
);
|
|
135
74
|
}
|
|
136
|
-
|
|
137
|
-
AltDateWidget.defaultProps = {
|
|
138
|
-
showTime: false,
|
|
139
|
-
};
|
|
@@ -1,85 +1,17 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
import {
|
|
3
|
-
dataURItoBlob,
|
|
4
3
|
ariaDescribedByIds,
|
|
5
4
|
FormContextType,
|
|
6
5
|
labelValue,
|
|
7
6
|
RJSFSchema,
|
|
8
7
|
StrictRJSFSchema,
|
|
8
|
+
useFileWidgetProps,
|
|
9
9
|
WidgetProps,
|
|
10
10
|
} from '@rjsf/utils';
|
|
11
11
|
import { FileInput, Pill } from '@mantine/core';
|
|
12
12
|
|
|
13
13
|
import { cleanupOptions } from '../utils';
|
|
14
14
|
|
|
15
|
-
function addNameToDataURL(dataURL: string, name: string) {
|
|
16
|
-
if (dataURL === null) {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
return dataURL.replace(';base64', `;name=${encodeURIComponent(name)};base64`);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
type FileInfoType = {
|
|
23
|
-
dataURL?: string | null;
|
|
24
|
-
name: string;
|
|
25
|
-
size: number;
|
|
26
|
-
type: string;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
function processFile(file: File): Promise<FileInfoType> {
|
|
30
|
-
const { name, size, type } = file;
|
|
31
|
-
return new Promise((resolve, reject) => {
|
|
32
|
-
const reader = new window.FileReader();
|
|
33
|
-
reader.onerror = reject;
|
|
34
|
-
reader.onload = (event) => {
|
|
35
|
-
if (typeof event.target?.result === 'string') {
|
|
36
|
-
resolve({
|
|
37
|
-
dataURL: addNameToDataURL(event.target.result, name),
|
|
38
|
-
name,
|
|
39
|
-
size,
|
|
40
|
-
type,
|
|
41
|
-
});
|
|
42
|
-
} else {
|
|
43
|
-
resolve({
|
|
44
|
-
dataURL: null,
|
|
45
|
-
name,
|
|
46
|
-
size,
|
|
47
|
-
type,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
reader.readAsDataURL(file);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function processFiles(files: FileList) {
|
|
56
|
-
return Promise.all(Array.from(files).map(processFile));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function extractFileInfo(dataURLs: string[]): FileInfoType[] {
|
|
60
|
-
return dataURLs.reduce((acc, dataURL) => {
|
|
61
|
-
if (!dataURL) {
|
|
62
|
-
return acc;
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
const { blob, name } = dataURItoBlob(dataURL);
|
|
66
|
-
return [
|
|
67
|
-
...acc,
|
|
68
|
-
{
|
|
69
|
-
dataURL,
|
|
70
|
-
name: name,
|
|
71
|
-
size: blob.size,
|
|
72
|
-
type: blob.type,
|
|
73
|
-
},
|
|
74
|
-
];
|
|
75
|
-
} catch (e) {
|
|
76
|
-
console.log(e);
|
|
77
|
-
// Invalid dataURI, so just ignore it.
|
|
78
|
-
return acc;
|
|
79
|
-
}
|
|
80
|
-
}, [] as FileInfoType[]);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
15
|
/**
|
|
84
16
|
* The `FileWidget` is a widget for rendering file upload fields.
|
|
85
17
|
*
|
|
@@ -104,56 +36,32 @@ export default function FileWidget<T = any, S extends StrictRJSFSchema = RJSFSch
|
|
|
104
36
|
multiple,
|
|
105
37
|
onChange,
|
|
106
38
|
} = props;
|
|
107
|
-
|
|
39
|
+
const { filesInfo, handleChange, handleRemove } = useFileWidgetProps(value, onChange, multiple);
|
|
108
40
|
const themeProps = cleanupOptions(options);
|
|
109
41
|
|
|
110
|
-
const
|
|
42
|
+
const handleOnChange = useCallback(
|
|
111
43
|
(files: any) => {
|
|
112
44
|
if (typeof files === 'object') {
|
|
113
|
-
|
|
114
|
-
const newValue = filesInfoEvent.map((fileInfo) => fileInfo.dataURL);
|
|
115
|
-
if (multiple) {
|
|
116
|
-
onChange(value.concat(newValue));
|
|
117
|
-
} else {
|
|
118
|
-
onChange(newValue[0]);
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
return;
|
|
123
|
-
},
|
|
124
|
-
[multiple, value, onChange],
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
const handleRemoveFile = useCallback(
|
|
128
|
-
(index: number) => {
|
|
129
|
-
if (multiple) {
|
|
130
|
-
const newValue = value.filter((_: any, i: number) => i !== index);
|
|
131
|
-
onChange(newValue);
|
|
132
|
-
} else {
|
|
133
|
-
onChange(undefined);
|
|
45
|
+
handleChange(files);
|
|
134
46
|
}
|
|
135
47
|
},
|
|
136
|
-
[
|
|
48
|
+
[handleChange],
|
|
137
49
|
);
|
|
138
50
|
|
|
139
|
-
const ValueComponent = useCallback(
|
|
140
|
-
(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
return null;
|
|
154
|
-
},
|
|
155
|
-
[handleRemoveFile],
|
|
156
|
-
);
|
|
51
|
+
const ValueComponent = useCallback(() => {
|
|
52
|
+
if (Array.isArray(filesInfo) && filesInfo.length > 0) {
|
|
53
|
+
return (
|
|
54
|
+
<Pill.Group>
|
|
55
|
+
{filesInfo.map((file, index) => (
|
|
56
|
+
<Pill key={index} withRemoveButton onRemove={() => handleRemove(index)}>
|
|
57
|
+
{file.name}
|
|
58
|
+
</Pill>
|
|
59
|
+
))}
|
|
60
|
+
</Pill.Group>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}, [handleRemove, filesInfo]);
|
|
157
65
|
|
|
158
66
|
return (
|
|
159
67
|
<FileInput
|
|
@@ -167,7 +75,7 @@ export default function FileWidget<T = any, S extends StrictRJSFSchema = RJSFSch
|
|
|
167
75
|
label={labelValue(label || undefined, hideLabel, false)}
|
|
168
76
|
multiple={!!multiple}
|
|
169
77
|
valueComponent={ValueComponent}
|
|
170
|
-
onChange={
|
|
78
|
+
onChange={handleOnChange}
|
|
171
79
|
error={rawErrors && rawErrors.length > 0 ? rawErrors.join('\n') : undefined}
|
|
172
80
|
{...themeProps}
|
|
173
81
|
aria-describedby={ariaDescribedByIds(id)}
|