@rjsf/utils 6.0.0-beta.21 → 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 +237 -2
- package/dist/index.cjs.map +4 -4
- package/dist/utils.esm.js +237 -2
- package/dist/utils.esm.js.map +4 -4
- package/dist/utils.umd.js +226 -2
- package/lib/enums.d.ts +4 -0
- package/lib/enums.js +4 -0
- package/lib/enums.js.map +1 -1
- package/lib/getDateElementProps.d.ts +1 -2
- package/lib/index.d.ts +8 -4
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/nameGenerators.d.ts +13 -0
- package/lib/nameGenerators.js +30 -0
- package/lib/nameGenerators.js.map +1 -0
- package/lib/shouldRenderOptionalField.js.map +1 -1
- package/lib/toFieldPathId.d.ts +4 -2
- package/lib/toFieldPathId.js +10 -3
- package/lib/toFieldPathId.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types.d.ts +70 -30
- package/lib/useAltDateWidgetProps.d.ts +39 -0
- package/lib/useAltDateWidgetProps.js +71 -0
- package/lib/useAltDateWidgetProps.js.map +1 -0
- package/lib/useDeepCompareMemo.d.ts +8 -0
- package/lib/useDeepCompareMemo.js +17 -0
- package/lib/useDeepCompareMemo.js.map +1 -0
- package/lib/useFileWidgetProps.d.ts +29 -0
- package/lib/useFileWidgetProps.js +119 -0
- package/lib/useFileWidgetProps.js.map +1 -0
- package/package.json +1 -1
- package/src/enums.ts +4 -0
- package/src/getDateElementProps.ts +1 -1
- package/src/index.ts +22 -5
- package/src/nameGenerators.ts +43 -0
- package/src/shouldRenderOptionalField.ts +3 -3
- package/src/toFieldPathId.ts +12 -2
- package/src/types.ts +83 -35
- package/src/useAltDateWidgetProps.tsx +163 -0
- package/src/useDeepCompareMemo.ts +17 -0
- package/src/useFileWidgetProps.ts +155 -0
package/dist/index.cjs
CHANGED
|
@@ -41,6 +41,7 @@ __export(index_exports, {
|
|
|
41
41
|
DEFINITIONS_KEY: () => DEFINITIONS_KEY,
|
|
42
42
|
DEPENDENCIES_KEY: () => DEPENDENCIES_KEY,
|
|
43
43
|
DISCRIMINATOR_PATH: () => DISCRIMINATOR_PATH,
|
|
44
|
+
DateElement: () => DateElement,
|
|
44
45
|
ENUM_KEY: () => ENUM_KEY,
|
|
45
46
|
ERRORS_KEY: () => ERRORS_KEY,
|
|
46
47
|
ErrorSchemaBuilder: () => ErrorSchemaBuilder,
|
|
@@ -71,6 +72,7 @@ __export(index_exports, {
|
|
|
71
72
|
allowAdditionalItems: () => allowAdditionalItems,
|
|
72
73
|
ariaDescribedByIds: () => ariaDescribedByIds,
|
|
73
74
|
asNumber: () => asNumber,
|
|
75
|
+
bracketNameGenerator: () => bracketNameGenerator,
|
|
74
76
|
buttonId: () => buttonId,
|
|
75
77
|
canExpand: () => canExpand,
|
|
76
78
|
createErrorHandler: () => createErrorHandler,
|
|
@@ -79,6 +81,7 @@ __export(index_exports, {
|
|
|
79
81
|
dateRangeOptions: () => dateRangeOptions,
|
|
80
82
|
deepEquals: () => deepEquals,
|
|
81
83
|
descriptionId: () => descriptionId,
|
|
84
|
+
dotNotationNameGenerator: () => dotNotationNameGenerator,
|
|
82
85
|
englishStringTranslator: () => englishStringTranslator,
|
|
83
86
|
enumOptionsDeselectValue: () => enumOptionsDeselectValue,
|
|
84
87
|
enumOptionsIndexForValue: () => enumOptionsIndexForValue,
|
|
@@ -151,6 +154,9 @@ __export(index_exports, {
|
|
|
151
154
|
toFieldPathId: () => toFieldPathId,
|
|
152
155
|
toPathSchema: () => toPathSchema,
|
|
153
156
|
unwrapErrorHandler: () => unwrapErrorHandler,
|
|
157
|
+
useAltDateWidgetProps: () => useAltDateWidgetProps,
|
|
158
|
+
useDeepCompareMemo: () => useDeepCompareMemo,
|
|
159
|
+
useFileWidgetProps: () => useFileWidgetProps,
|
|
154
160
|
utcToLocal: () => utcToLocal,
|
|
155
161
|
validationDataMerge: () => validationDataMerge,
|
|
156
162
|
withIdRefPrefix: () => withIdRefPrefix
|
|
@@ -3380,12 +3386,16 @@ function toErrorSchema(errors) {
|
|
|
3380
3386
|
}
|
|
3381
3387
|
|
|
3382
3388
|
// src/toFieldPathId.ts
|
|
3383
|
-
function toFieldPathId(fieldPath, globalFormOptions, parentPath) {
|
|
3389
|
+
function toFieldPathId(fieldPath, globalFormOptions, parentPath, isMultiValue) {
|
|
3384
3390
|
const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
|
|
3385
3391
|
const childPath = fieldPath === "" ? [] : [fieldPath];
|
|
3386
3392
|
const path = basePath ? basePath.concat(...childPath) : childPath;
|
|
3387
3393
|
const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
|
|
3388
|
-
|
|
3394
|
+
let name;
|
|
3395
|
+
if (globalFormOptions.nameGenerator && path.length > 0) {
|
|
3396
|
+
name = globalFormOptions.nameGenerator(path, globalFormOptions.idPrefix, isMultiValue);
|
|
3397
|
+
}
|
|
3398
|
+
return { path, [ID_KEY]: id, ...name !== void 0 && { name } };
|
|
3389
3399
|
}
|
|
3390
3400
|
|
|
3391
3401
|
// src/unwrapErrorHandler.ts
|
|
@@ -3407,6 +3417,209 @@ function unwrapErrorHandler(errorHandler) {
|
|
|
3407
3417
|
}, {});
|
|
3408
3418
|
}
|
|
3409
3419
|
|
|
3420
|
+
// src/useAltDateWidgetProps.tsx
|
|
3421
|
+
var import_react2 = require("react");
|
|
3422
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
3423
|
+
function readyForChange(state) {
|
|
3424
|
+
return Object.values(state).every((value) => value !== -1);
|
|
3425
|
+
}
|
|
3426
|
+
function DateElement(props) {
|
|
3427
|
+
const {
|
|
3428
|
+
className = "form-control",
|
|
3429
|
+
type,
|
|
3430
|
+
range,
|
|
3431
|
+
value,
|
|
3432
|
+
select,
|
|
3433
|
+
rootId,
|
|
3434
|
+
name,
|
|
3435
|
+
disabled,
|
|
3436
|
+
readonly,
|
|
3437
|
+
autofocus,
|
|
3438
|
+
registry,
|
|
3439
|
+
onBlur,
|
|
3440
|
+
onFocus
|
|
3441
|
+
} = props;
|
|
3442
|
+
const id = `${rootId}_${type}`;
|
|
3443
|
+
const { SelectWidget } = registry.widgets;
|
|
3444
|
+
const onChange = (0, import_react2.useCallback)((value2) => select(type, value2), [select, type]);
|
|
3445
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
3446
|
+
SelectWidget,
|
|
3447
|
+
{
|
|
3448
|
+
schema: { type: "integer" },
|
|
3449
|
+
id,
|
|
3450
|
+
name,
|
|
3451
|
+
className,
|
|
3452
|
+
options: { enumOptions: dateRangeOptions(range[0], range[1]) },
|
|
3453
|
+
placeholder: type,
|
|
3454
|
+
value,
|
|
3455
|
+
disabled,
|
|
3456
|
+
readonly,
|
|
3457
|
+
autofocus,
|
|
3458
|
+
onChange,
|
|
3459
|
+
onBlur,
|
|
3460
|
+
onFocus,
|
|
3461
|
+
registry,
|
|
3462
|
+
label: "",
|
|
3463
|
+
"aria-describedby": ariaDescribedByIds(rootId)
|
|
3464
|
+
}
|
|
3465
|
+
);
|
|
3466
|
+
}
|
|
3467
|
+
function useAltDateWidgetProps(props) {
|
|
3468
|
+
const { time = false, disabled = false, readonly = false, options, onChange, value } = props;
|
|
3469
|
+
const [state, setState] = (0, import_react2.useState)(parseDateString(value, time));
|
|
3470
|
+
(0, import_react2.useEffect)(() => {
|
|
3471
|
+
setState(parseDateString(value, time));
|
|
3472
|
+
}, [time, value]);
|
|
3473
|
+
const handleChange = (0, import_react2.useCallback)(
|
|
3474
|
+
(property, value2) => {
|
|
3475
|
+
const nextState = {
|
|
3476
|
+
...state,
|
|
3477
|
+
[property]: typeof value2 === "undefined" ? -1 : value2
|
|
3478
|
+
};
|
|
3479
|
+
if (readyForChange(nextState)) {
|
|
3480
|
+
onChange(toDateString(nextState, time));
|
|
3481
|
+
} else {
|
|
3482
|
+
setState(nextState);
|
|
3483
|
+
}
|
|
3484
|
+
},
|
|
3485
|
+
[state, onChange, time]
|
|
3486
|
+
);
|
|
3487
|
+
const handleClear = (0, import_react2.useCallback)(
|
|
3488
|
+
(event) => {
|
|
3489
|
+
event.preventDefault();
|
|
3490
|
+
if (disabled || readonly) {
|
|
3491
|
+
return;
|
|
3492
|
+
}
|
|
3493
|
+
onChange(void 0);
|
|
3494
|
+
},
|
|
3495
|
+
[disabled, readonly, onChange]
|
|
3496
|
+
);
|
|
3497
|
+
const handleSetNow = (0, import_react2.useCallback)(
|
|
3498
|
+
(event) => {
|
|
3499
|
+
event.preventDefault();
|
|
3500
|
+
if (disabled || readonly) {
|
|
3501
|
+
return;
|
|
3502
|
+
}
|
|
3503
|
+
const nextState = parseDateString((/* @__PURE__ */ new Date()).toJSON(), time);
|
|
3504
|
+
onChange(toDateString(nextState, time));
|
|
3505
|
+
},
|
|
3506
|
+
[disabled, readonly, time, onChange]
|
|
3507
|
+
);
|
|
3508
|
+
const elements = (0, import_react2.useMemo)(
|
|
3509
|
+
() => getDateElementProps(
|
|
3510
|
+
state,
|
|
3511
|
+
time,
|
|
3512
|
+
options.yearsRange,
|
|
3513
|
+
options.format
|
|
3514
|
+
),
|
|
3515
|
+
[state, time, options.yearsRange, options.format]
|
|
3516
|
+
);
|
|
3517
|
+
return { elements, handleChange, handleClear, handleSetNow };
|
|
3518
|
+
}
|
|
3519
|
+
|
|
3520
|
+
// src/useDeepCompareMemo.ts
|
|
3521
|
+
var import_react3 = require("react");
|
|
3522
|
+
var import_isEqual3 = __toESM(require("lodash/isEqual"), 1);
|
|
3523
|
+
function useDeepCompareMemo(newValue) {
|
|
3524
|
+
const valueRef = (0, import_react3.useRef)(newValue);
|
|
3525
|
+
if (!(0, import_isEqual3.default)(newValue, valueRef.current)) {
|
|
3526
|
+
valueRef.current = newValue;
|
|
3527
|
+
}
|
|
3528
|
+
return valueRef.current;
|
|
3529
|
+
}
|
|
3530
|
+
|
|
3531
|
+
// src/useFileWidgetProps.ts
|
|
3532
|
+
var import_react4 = require("react");
|
|
3533
|
+
function addNameToDataURL(dataURL, name) {
|
|
3534
|
+
return dataURL.replace(";base64", `;name=${encodeURIComponent(name)};base64`);
|
|
3535
|
+
}
|
|
3536
|
+
function processFile(file) {
|
|
3537
|
+
const { name, size, type } = file;
|
|
3538
|
+
return new Promise((resolve, reject) => {
|
|
3539
|
+
const reader = new window.FileReader();
|
|
3540
|
+
reader.onerror = reject;
|
|
3541
|
+
reader.onload = (event) => {
|
|
3542
|
+
if (typeof event.target?.result === "string") {
|
|
3543
|
+
resolve({
|
|
3544
|
+
dataURL: addNameToDataURL(event.target.result, name),
|
|
3545
|
+
name,
|
|
3546
|
+
size,
|
|
3547
|
+
type
|
|
3548
|
+
});
|
|
3549
|
+
} else {
|
|
3550
|
+
resolve({
|
|
3551
|
+
dataURL: null,
|
|
3552
|
+
name,
|
|
3553
|
+
size,
|
|
3554
|
+
type
|
|
3555
|
+
});
|
|
3556
|
+
}
|
|
3557
|
+
};
|
|
3558
|
+
reader.readAsDataURL(file);
|
|
3559
|
+
});
|
|
3560
|
+
}
|
|
3561
|
+
function processFiles(files) {
|
|
3562
|
+
return Promise.all(Array.from(files).map(processFile));
|
|
3563
|
+
}
|
|
3564
|
+
function extractFileInfo(dataURLs) {
|
|
3565
|
+
return dataURLs.reduce((acc, dataURL) => {
|
|
3566
|
+
if (!dataURL) {
|
|
3567
|
+
return acc;
|
|
3568
|
+
}
|
|
3569
|
+
try {
|
|
3570
|
+
const { blob, name } = dataURItoBlob(dataURL);
|
|
3571
|
+
return [
|
|
3572
|
+
...acc,
|
|
3573
|
+
{
|
|
3574
|
+
dataURL,
|
|
3575
|
+
name,
|
|
3576
|
+
size: blob.size,
|
|
3577
|
+
type: blob.type
|
|
3578
|
+
}
|
|
3579
|
+
];
|
|
3580
|
+
} catch {
|
|
3581
|
+
return acc;
|
|
3582
|
+
}
|
|
3583
|
+
}, []);
|
|
3584
|
+
}
|
|
3585
|
+
function useFileWidgetProps(value, onChange, multiple = false) {
|
|
3586
|
+
const values = (0, import_react4.useMemo)(() => {
|
|
3587
|
+
if (multiple && value) {
|
|
3588
|
+
return Array.isArray(value) ? value : [value];
|
|
3589
|
+
}
|
|
3590
|
+
return [];
|
|
3591
|
+
}, [value, multiple]);
|
|
3592
|
+
const filesInfo = (0, import_react4.useMemo)(
|
|
3593
|
+
() => Array.isArray(value) ? extractFileInfo(value) : extractFileInfo([value || ""]),
|
|
3594
|
+
[value]
|
|
3595
|
+
);
|
|
3596
|
+
const handleChange = (0, import_react4.useCallback)(
|
|
3597
|
+
(files) => {
|
|
3598
|
+
processFiles(files).then((filesInfoEvent) => {
|
|
3599
|
+
const newValue = filesInfoEvent.map((fileInfo) => fileInfo.dataURL || null);
|
|
3600
|
+
if (multiple) {
|
|
3601
|
+
onChange(values.concat(...newValue));
|
|
3602
|
+
} else {
|
|
3603
|
+
onChange(newValue[0]);
|
|
3604
|
+
}
|
|
3605
|
+
});
|
|
3606
|
+
},
|
|
3607
|
+
[values, multiple, onChange]
|
|
3608
|
+
);
|
|
3609
|
+
const handleRemove = (0, import_react4.useCallback)(
|
|
3610
|
+
(index) => {
|
|
3611
|
+
if (multiple) {
|
|
3612
|
+
const newValue = values.filter((_, i) => i !== index);
|
|
3613
|
+
onChange(newValue);
|
|
3614
|
+
} else {
|
|
3615
|
+
onChange(void 0);
|
|
3616
|
+
}
|
|
3617
|
+
},
|
|
3618
|
+
[values, multiple, onChange]
|
|
3619
|
+
);
|
|
3620
|
+
return { filesInfo, handleChange, handleRemove };
|
|
3621
|
+
}
|
|
3622
|
+
|
|
3410
3623
|
// src/utcToLocal.ts
|
|
3411
3624
|
function utcToLocal(jsonDate) {
|
|
3412
3625
|
if (!jsonDate) {
|
|
@@ -3473,6 +3686,26 @@ function withIdRefPrefix(schemaNode) {
|
|
|
3473
3686
|
return schemaNode;
|
|
3474
3687
|
}
|
|
3475
3688
|
|
|
3689
|
+
// src/nameGenerators.ts
|
|
3690
|
+
var bracketNameGenerator = (path, idPrefix, isMultiValue) => {
|
|
3691
|
+
if (!path || path.length === 0) {
|
|
3692
|
+
return idPrefix;
|
|
3693
|
+
}
|
|
3694
|
+
const baseName = path.reduce((acc, pathUnit, index) => {
|
|
3695
|
+
if (index === 0) {
|
|
3696
|
+
return `${idPrefix}[${String(pathUnit)}]`;
|
|
3697
|
+
}
|
|
3698
|
+
return `${acc}[${String(pathUnit)}]`;
|
|
3699
|
+
}, "");
|
|
3700
|
+
return isMultiValue ? `${baseName}[]` : baseName;
|
|
3701
|
+
};
|
|
3702
|
+
var dotNotationNameGenerator = (path, idPrefix, _isMultiValue) => {
|
|
3703
|
+
if (!path || path.length === 0) {
|
|
3704
|
+
return idPrefix;
|
|
3705
|
+
}
|
|
3706
|
+
return `${idPrefix}.${path.map(String).join(".")}`;
|
|
3707
|
+
};
|
|
3708
|
+
|
|
3476
3709
|
// src/enums.ts
|
|
3477
3710
|
var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
|
|
3478
3711
|
TranslatableString2["ArrayItemTitle"] = "Item";
|
|
@@ -3498,6 +3731,8 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
|
|
|
3498
3731
|
TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
|
|
3499
3732
|
TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
|
|
3500
3733
|
TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
|
|
3734
|
+
TranslatableString2["Type"] = "Type";
|
|
3735
|
+
TranslatableString2["Value"] = "Value";
|
|
3501
3736
|
TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
|
|
3502
3737
|
TranslatableString2["OptionPrefix"] = "Option %1";
|
|
3503
3738
|
TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
|