@saas-ui/forms 2.1.3 → 2.2.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/CHANGELOG.md +14 -0
- package/dist/index.d.ts +41 -29
- package/dist/index.js +64 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +65 -48
- package/dist/index.mjs.map +1 -1
- package/dist/yup/index.d.ts +57 -41
- package/dist/yup/index.js.map +1 -1
- package/dist/yup/index.mjs.map +1 -1
- package/dist/zod/index.d.ts +58 -46
- package/dist/zod/index.js +17 -5
- package/dist/zod/index.js.map +1 -1
- package/dist/zod/index.mjs +17 -5
- package/dist/zod/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/create-field.tsx +7 -3
- package/src/default-fields.tsx +12 -4
- package/src/display-field.tsx +4 -3
- package/src/fields.tsx +7 -1
- package/src/index.ts +1 -0
- package/src/layout.tsx +2 -13
- package/src/number-input/number-input.tsx +14 -1
- package/src/types.ts +1 -1
- package/src/use-step-form.tsx +20 -4
package/dist/index.mjs
CHANGED
@@ -90,10 +90,13 @@ var NumberInput = forwardRef((props, ref) => {
|
|
90
90
|
hideStepper,
|
91
91
|
incrementIcon = /* @__PURE__ */ jsx3(ChevronUpIcon, {}),
|
92
92
|
decrementIcon = /* @__PURE__ */ jsx3(ChevronDownIcon, {}),
|
93
|
+
placeholder,
|
94
|
+
fieldProps: _fieldProps,
|
93
95
|
...rest
|
94
96
|
} = props;
|
97
|
+
const fieldProps = { placeholder, ..._fieldProps };
|
95
98
|
return /* @__PURE__ */ jsxs2(ChakraNumberInput, { ...rest, ref, children: [
|
96
|
-
/* @__PURE__ */ jsx3(NumberInputField, {}),
|
99
|
+
/* @__PURE__ */ jsx3(NumberInputField, { ...fieldProps }),
|
97
100
|
!hideStepper && /* @__PURE__ */ jsxs2(NumberInputStepper, { children: [
|
98
101
|
/* @__PURE__ */ jsx3(NumberIncrementStepper, { children: incrementIcon }),
|
99
102
|
/* @__PURE__ */ jsx3(NumberDecrementStepper, { children: decrementIcon })
|
@@ -553,6 +556,7 @@ var withControlledInput = (InputComponent) => {
|
|
553
556
|
return forwardRef7(
|
554
557
|
({ name, rules, ...inputProps }, ref) => {
|
555
558
|
const { control } = useFormContext();
|
559
|
+
const onChange = inputProps.onChange;
|
556
560
|
return /* @__PURE__ */ jsx10(
|
557
561
|
Controller,
|
558
562
|
{
|
@@ -564,7 +568,7 @@ var withControlledInput = (InputComponent) => {
|
|
564
568
|
{
|
565
569
|
...field,
|
566
570
|
...inputProps,
|
567
|
-
onChange: callAllHandlers(
|
571
|
+
onChange: callAllHandlers(onChange, field.onChange),
|
568
572
|
onBlur: callAllHandlers(inputProps.onBlur, field.onBlur),
|
569
573
|
ref: useMergeRefs(ref, _ref)
|
570
574
|
}
|
@@ -579,12 +583,13 @@ var withUncontrolledInput = (InputComponent) => {
|
|
579
583
|
({ name, rules, ...inputProps }, ref) => {
|
580
584
|
const { register } = useFormContext();
|
581
585
|
const { ref: _ref, ...field } = register(name, rules);
|
586
|
+
const onChange = inputProps.onChange;
|
582
587
|
return /* @__PURE__ */ jsx10(
|
583
588
|
InputComponent,
|
584
589
|
{
|
585
590
|
...field,
|
586
591
|
...inputProps,
|
587
|
-
onChange: callAllHandlers(
|
592
|
+
onChange: callAllHandlers(onChange, field.onChange),
|
588
593
|
onBlur: callAllHandlers(inputProps.onBlur, field.onBlur),
|
589
594
|
ref: useMergeRefs(ref, _ref)
|
590
595
|
}
|
@@ -643,9 +648,10 @@ var SwitchField = createField(
|
|
643
648
|
);
|
644
649
|
var SelectField = createField(
|
645
650
|
forwardRef8((props, ref) => {
|
646
|
-
|
647
|
-
|
648
|
-
/* @__PURE__ */ jsx11(
|
651
|
+
const { buttonProps, listProps, ...rest } = props;
|
652
|
+
return /* @__PURE__ */ jsxs6(Select, { ref, ...rest, children: [
|
653
|
+
/* @__PURE__ */ jsx11(SelectButton, { ...buttonProps }),
|
654
|
+
/* @__PURE__ */ jsx11(SelectList, { ...listProps })
|
649
655
|
] });
|
650
656
|
}),
|
651
657
|
{
|
@@ -722,15 +728,10 @@ var Field = React6.forwardRef(
|
|
722
728
|
);
|
723
729
|
|
724
730
|
// src/fields.tsx
|
725
|
-
import * as
|
731
|
+
import * as React9 from "react";
|
726
732
|
|
727
733
|
// src/layout.tsx
|
728
|
-
import
|
729
|
-
import {
|
730
|
-
chakra as chakra2,
|
731
|
-
SimpleGrid,
|
732
|
-
useTheme
|
733
|
-
} from "@chakra-ui/react";
|
734
|
+
import { chakra as chakra2, SimpleGrid, useTheme } from "@chakra-ui/react";
|
734
735
|
import { cx as cx2 } from "@chakra-ui/utils";
|
735
736
|
import { jsx as jsx14 } from "react/jsx-runtime";
|
736
737
|
var FormLayoutItem = ({ children }) => {
|
@@ -752,19 +753,14 @@ var FormLayout = ({ children, ...props }) => {
|
|
752
753
|
{
|
753
754
|
...gridProps,
|
754
755
|
className: cx2("sui-form__layout", props.className),
|
755
|
-
children
|
756
|
-
if (React7.isValidElement(child)) {
|
757
|
-
return /* @__PURE__ */ jsx14(FormLayoutItem, { children: child });
|
758
|
-
}
|
759
|
-
return child;
|
760
|
-
})
|
756
|
+
children
|
761
757
|
}
|
762
758
|
);
|
763
759
|
};
|
764
760
|
FormLayout.displayName = "FormLayout";
|
765
761
|
|
766
762
|
// src/array-field.tsx
|
767
|
-
import * as
|
763
|
+
import * as React8 from "react";
|
768
764
|
import {
|
769
765
|
chakra as chakra3,
|
770
766
|
forwardRef as forwardRef11,
|
@@ -773,7 +769,7 @@ import {
|
|
773
769
|
import { PlusIcon, MinusIcon } from "@saas-ui/core/icons";
|
774
770
|
|
775
771
|
// src/use-array-field.tsx
|
776
|
-
import * as
|
772
|
+
import * as React7 from "react";
|
777
773
|
import {
|
778
774
|
useFieldArray
|
779
775
|
} from "react-hook-form";
|
@@ -808,7 +804,7 @@ var useArrayField = ({
|
|
808
804
|
var useArrayFieldRow = ({ index }) => {
|
809
805
|
const { clearErrors } = useFormContext();
|
810
806
|
const { name, remove, fields } = useArrayFieldContext();
|
811
|
-
|
807
|
+
React7.useEffect(() => {
|
812
808
|
clearErrors(name);
|
813
809
|
}, []);
|
814
810
|
return {
|
@@ -816,7 +812,7 @@ var useArrayFieldRow = ({ index }) => {
|
|
816
812
|
isFirst: index === 0,
|
817
813
|
isLast: index === fields.length - 1,
|
818
814
|
name: `${name}.${index}`,
|
819
|
-
remove:
|
815
|
+
remove: React7.useCallback(() => {
|
820
816
|
clearErrors(name);
|
821
817
|
remove(index);
|
822
818
|
}, [index])
|
@@ -915,7 +911,7 @@ var ArrayFieldRows = ({
|
|
915
911
|
return children(fields);
|
916
912
|
};
|
917
913
|
ArrayFieldRows.displayName = "ArrayFieldRows";
|
918
|
-
var ArrayFieldContainer =
|
914
|
+
var ArrayFieldContainer = React8.forwardRef(
|
919
915
|
({
|
920
916
|
name,
|
921
917
|
defaultValue,
|
@@ -933,7 +929,7 @@ var ArrayFieldContainer = React9.forwardRef(
|
|
933
929
|
min: min || (overrides == null ? void 0 : overrides.min),
|
934
930
|
max: max || (overrides == null ? void 0 : overrides.max)
|
935
931
|
});
|
936
|
-
|
932
|
+
React8.useImperativeHandle(ref, () => context, [ref, context]);
|
937
933
|
return /* @__PURE__ */ jsx15(ArrayFieldProvider, { value: context, children: /* @__PURE__ */ jsx15(BaseField, { name, ...fieldProps, ...overrides, children }) });
|
938
934
|
}
|
939
935
|
);
|
@@ -1002,10 +998,10 @@ var AutoFields = ({
|
|
1002
998
|
const context = useFormContext();
|
1003
999
|
const schema = schemaProp || context.schema;
|
1004
1000
|
const fieldResolver = fieldResolverProp || context.fieldResolver;
|
1005
|
-
const resolver =
|
1006
|
-
const fields =
|
1001
|
+
const resolver = React9.useMemo(() => fieldResolver, [schema, fieldResolver]);
|
1002
|
+
const fields = React9.useMemo(() => resolver == null ? void 0 : resolver.getFields(), [resolver]);
|
1007
1003
|
const form = useFormContext();
|
1008
|
-
|
1004
|
+
React9.useEffect(() => {
|
1009
1005
|
var _a;
|
1010
1006
|
if (focusFirstField && ((_a = fields == null ? void 0 : fields[0]) == null ? void 0 : _a.name)) {
|
1011
1007
|
form.setFocus(fields[0].name);
|
@@ -1026,7 +1022,16 @@ var AutoFields = ({
|
|
1026
1022
|
} else if (type === "object") {
|
1027
1023
|
return /* @__PURE__ */ jsx17(ObjectField, { name, ...fieldProps, children: mapNestedFields2(resolver, name) }, name);
|
1028
1024
|
}
|
1029
|
-
return /* @__PURE__ */ jsx17(
|
1025
|
+
return /* @__PURE__ */ jsx17(
|
1026
|
+
Field,
|
1027
|
+
{
|
1028
|
+
name,
|
1029
|
+
type,
|
1030
|
+
defaultValue,
|
1031
|
+
...fieldProps
|
1032
|
+
},
|
1033
|
+
name
|
1034
|
+
);
|
1030
1035
|
}
|
1031
1036
|
) });
|
1032
1037
|
};
|
@@ -1092,7 +1097,7 @@ var DisplayIf = ({
|
|
1092
1097
|
DisplayIf.displayName = "DisplayIf";
|
1093
1098
|
|
1094
1099
|
// src/step-form.tsx
|
1095
|
-
import * as
|
1100
|
+
import * as React11 from "react";
|
1096
1101
|
import {
|
1097
1102
|
chakra as chakra4,
|
1098
1103
|
Button as Button5
|
@@ -1105,7 +1110,7 @@ import {
|
|
1105
1110
|
} from "@saas-ui/core";
|
1106
1111
|
|
1107
1112
|
// src/use-step-form.tsx
|
1108
|
-
import * as
|
1113
|
+
import * as React10 from "react";
|
1109
1114
|
import { createContext as createContext4 } from "@chakra-ui/react-utils";
|
1110
1115
|
import {
|
1111
1116
|
useStepper,
|
@@ -1116,18 +1121,29 @@ var [StepFormProvider, useStepFormContext] = createContext4({
|
|
1116
1121
|
errorMessage: "useStepFormContext: `context` is undefined. Seems you forgot to wrap step form components in `<StepForm />`"
|
1117
1122
|
});
|
1118
1123
|
function useStepForm(props) {
|
1119
|
-
const {
|
1124
|
+
const {
|
1125
|
+
onChange,
|
1126
|
+
steps: stepsOptions,
|
1127
|
+
resolver,
|
1128
|
+
fieldResolver,
|
1129
|
+
...rest
|
1130
|
+
} = props;
|
1120
1131
|
const stepper = useStepper(rest);
|
1121
|
-
const [options, setOptions] =
|
1132
|
+
const [options, setOptions] = React10.useState(stepsOptions);
|
1122
1133
|
const { activeStep, isLastStep, nextStep } = stepper;
|
1123
|
-
const [steps, updateSteps] =
|
1124
|
-
const
|
1134
|
+
const [steps, updateSteps] = React10.useState({});
|
1135
|
+
const mergedData = React10.useRef({});
|
1136
|
+
const onSubmitStep = React10.useCallback(
|
1125
1137
|
async (data) => {
|
1126
1138
|
var _a, _b;
|
1127
1139
|
try {
|
1128
1140
|
const step = steps[activeStep];
|
1141
|
+
mergedData.current = {
|
1142
|
+
...mergedData.current,
|
1143
|
+
...data
|
1144
|
+
};
|
1129
1145
|
if (isLastStep) {
|
1130
|
-
await ((_a = props.onSubmit) == null ? void 0 : _a.call(props,
|
1146
|
+
await ((_a = props.onSubmit) == null ? void 0 : _a.call(props, mergedData.current));
|
1131
1147
|
updateStep({
|
1132
1148
|
...step,
|
1133
1149
|
isCompleted: true
|
@@ -1140,9 +1156,9 @@ function useStepForm(props) {
|
|
1140
1156
|
} catch (e) {
|
1141
1157
|
}
|
1142
1158
|
},
|
1143
|
-
[steps, activeStep, isLastStep]
|
1159
|
+
[steps, activeStep, isLastStep, mergedData]
|
1144
1160
|
);
|
1145
|
-
const getFormProps =
|
1161
|
+
const getFormProps = React10.useCallback(() => {
|
1146
1162
|
const step = steps[activeStep];
|
1147
1163
|
return {
|
1148
1164
|
onSubmit: onSubmitStep,
|
@@ -1150,10 +1166,11 @@ function useStepForm(props) {
|
|
1150
1166
|
resolver: (step == null ? void 0 : step.schema) ? (
|
1151
1167
|
/* @todo fix resolver type */
|
1152
1168
|
resolver == null ? void 0 : resolver(step.schema)
|
1153
|
-
) : void 0
|
1169
|
+
) : void 0,
|
1170
|
+
fieldResolver: (step == null ? void 0 : step.schema) ? fieldResolver == null ? void 0 : fieldResolver(step.schema) : void 0
|
1154
1171
|
};
|
1155
|
-
}, [steps, onSubmitStep, activeStep]);
|
1156
|
-
const updateStep =
|
1172
|
+
}, [steps, onSubmitStep, activeStep, resolver, fieldResolver]);
|
1173
|
+
const updateStep = React10.useCallback(
|
1157
1174
|
(step) => {
|
1158
1175
|
const stepOptions = options == null ? void 0 : options.find((s) => s.name === step.name);
|
1159
1176
|
updateSteps((steps2) => {
|
@@ -1179,7 +1196,7 @@ function useFormStep(props) {
|
|
1179
1196
|
const { name, schema, resolver, onSubmit } = props;
|
1180
1197
|
const step = useStep({ name });
|
1181
1198
|
const { steps, updateStep } = useStepFormContext();
|
1182
|
-
|
1199
|
+
React10.useEffect(() => {
|
1183
1200
|
updateStep({ name, schema, resolver, onSubmit });
|
1184
1201
|
}, [name, schema]);
|
1185
1202
|
return {
|
@@ -1202,8 +1219,8 @@ var FormStepper = (props) => {
|
|
1202
1219
|
render,
|
1203
1220
|
...rest
|
1204
1221
|
} = props;
|
1205
|
-
const elements =
|
1206
|
-
if (
|
1222
|
+
const elements = React11.Children.map(children, (child) => {
|
1223
|
+
if (React11.isValidElement(child) && (child == null ? void 0 : child.type) === FormStep) {
|
1207
1224
|
const { isCompleted } = useFormStep(child.props);
|
1208
1225
|
return /* @__PURE__ */ jsx19(
|
1209
1226
|
StepsItem,
|
@@ -1219,7 +1236,7 @@ var FormStepper = (props) => {
|
|
1219
1236
|
}
|
1220
1237
|
return child;
|
1221
1238
|
});
|
1222
|
-
const onChange =
|
1239
|
+
const onChange = React11.useCallback((i) => {
|
1223
1240
|
setIndex(i);
|
1224
1241
|
onChangeProp == null ? void 0 : onChangeProp(i);
|
1225
1242
|
}, []);
|
@@ -1316,7 +1333,7 @@ var WatchField = (props) => {
|
|
1316
1333
|
};
|
1317
1334
|
|
1318
1335
|
// src/form.tsx
|
1319
|
-
import * as
|
1336
|
+
import * as React12 from "react";
|
1320
1337
|
import { chakra as chakra5, forwardRef as forwardRef13 } from "@chakra-ui/react";
|
1321
1338
|
import { cx as cx4, runIfFn } from "@chakra-ui/utils";
|
1322
1339
|
import {
|
@@ -1364,8 +1381,8 @@ var Form = forwardRef13(
|
|
1364
1381
|
};
|
1365
1382
|
const methods = useForm(form);
|
1366
1383
|
const { handleSubmit } = methods;
|
1367
|
-
|
1368
|
-
|
1384
|
+
React12.useImperativeHandle(formRef, () => methods, [formRef, methods]);
|
1385
|
+
React12.useEffect(() => {
|
1369
1386
|
let subscription;
|
1370
1387
|
if (onChange) {
|
1371
1388
|
subscription = methods.watch(onChange);
|