@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.
@@ -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
- declare function AltDateTimeWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(props: WidgetProps<T, S, F>): import("react/jsx-runtime").JSX.Element;
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, { showTime: true, ...props });
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,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAE7C;;;;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,QAAQ,WAAK,KAAK,GAAI,CAAC;AAC/C,CAAC;AAED,iBAAiB,CAAC,YAAY,GAAG;IAC/B,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY;IAC/B,QAAQ,EAAE,IAAI;CACf,CAAC"}
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
- declare function AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(props: WidgetProps<T, S, F>): import("react/jsx-runtime").JSX.Element;
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 { useCallback, useEffect, useState } from 'react';
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, value, required, disabled, readonly, label, hideLabel, rawErrors, options, onChange, showTime = false, registry, } = props;
8
+ const { id, required, disabled, readonly, label, hideLabel, rawErrors, options, registry } = props;
13
9
  const { translateString } = registry;
14
- const [state, setState] = useState(parseDateString(value, showTime));
15
- useEffect(() => {
16
- setState(parseDateString(value, showTime));
17
- }, [showTime, value]);
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":"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"}
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 { dataURItoBlob, ariaDescribedByIds, labelValue, } from '@rjsf/utils';
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 handleChange = useCallback((files) => {
15
+ const handleOnChange = useCallback((files) => {
75
16
  if (typeof files === 'object') {
76
- processFiles(multiple ? files : [files]).then((filesInfoEvent) => {
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
- }, [multiple, value, onChange]);
97
- const ValueComponent = useCallback((props) => {
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: () => handleRemoveFile(index), children: file.name }, index))) }));
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
- }, [handleRemoveFile]);
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: handleChange, error: rawErrors && rawErrors.length > 0 ? rawErrors.join('\n') : undefined, ...themeProps, "aria-describedby": ariaDescribedByIds(id) }));
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":"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"}
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.22",
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.22",
68
- "@rjsf/utils": "^6.0.0-beta.22",
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.22",
78
- "@rjsf/snapshot-tests": "^6.0.0-beta.22",
79
- "@rjsf/utils": "^6.0.0-beta.22",
80
- "@rjsf/validator-ajv8": "^6.0.0-beta.22",
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 !help ? null : (
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 showTime {...props} />;
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 [state, setState] = useState(parseDateString(value, showTime));
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
- {getDateElementProps(
91
- state,
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 handleChange = useCallback(
42
+ const handleOnChange = useCallback(
111
43
  (files: any) => {
112
44
  if (typeof files === 'object') {
113
- processFiles(multiple ? files : [files]).then((filesInfoEvent) => {
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
- [multiple, value, onChange],
48
+ [handleChange],
137
49
  );
138
50
 
139
- const ValueComponent = useCallback(
140
- (props: any) => {
141
- const filesInfo = props.value ? extractFileInfo(Array.isArray(props.value) ? props.value : [props.value]) : null;
142
- if (Array.isArray(filesInfo) && filesInfo.length > 0) {
143
- return (
144
- <Pill.Group>
145
- {filesInfo.map((file, index) => (
146
- <Pill key={index} withRemoveButton onRemove={() => handleRemoveFile(index)}>
147
- {file.name}
148
- </Pill>
149
- ))}
150
- </Pill.Group>
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={handleChange}
78
+ onChange={handleOnChange}
171
79
  error={rawErrors && rawErrors.length > 0 ? rawErrors.join('\n') : undefined}
172
80
  {...themeProps}
173
81
  aria-describedby={ariaDescribedByIds(id)}