@fuf-stack/uniform 0.6.0 → 0.8.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/dist/CheckboxGroup/index.cjs +13 -0
- package/dist/CheckboxGroup/index.cjs.map +1 -0
- package/dist/CheckboxGroup/index.d.cts +7 -0
- package/dist/CheckboxGroup/index.d.ts +7 -0
- package/dist/CheckboxGroup/index.js +13 -0
- package/dist/CheckboxGroup/index.js.map +1 -0
- package/dist/CheckboxGroup-BYsQ0A0q.d.cts +32 -0
- package/dist/CheckboxGroup-BYsQ0A0q.d.ts +32 -0
- package/dist/FieldArray/index.cjs +3 -3
- package/dist/FieldArray/index.js +2 -2
- package/dist/Form/index.cjs +3 -3
- package/dist/Form/index.js +2 -2
- package/dist/Input/index.cjs +3 -3
- package/dist/Input/index.js +2 -2
- package/dist/RadioGroup/index.cjs +3 -3
- package/dist/RadioGroup/index.js +2 -2
- package/dist/Select/index.cjs +3 -3
- package/dist/Select/index.js +2 -2
- package/dist/SubmitButton/index.cjs +3 -3
- package/dist/SubmitButton/index.js +2 -2
- package/dist/Switch/index.cjs +3 -3
- package/dist/Switch/index.js +2 -2
- package/dist/TextArea/index.cjs +3 -3
- package/dist/TextArea/index.js +2 -2
- package/dist/{chunk-53AGVLUG.cjs → chunk-3ROKDX67.cjs} +4 -4
- package/dist/{chunk-53AGVLUG.cjs.map → chunk-3ROKDX67.cjs.map} +1 -1
- package/dist/{chunk-57OFVPRD.js → chunk-5I5DGCXC.js} +2 -2
- package/dist/{chunk-XJ3JTLXZ.cjs → chunk-7HXB2552.cjs} +3 -3
- package/dist/{chunk-XJ3JTLXZ.cjs.map → chunk-7HXB2552.cjs.map} +1 -1
- package/dist/{chunk-QD6IQL6U.js → chunk-7ZIHJMDO.js} +2 -2
- package/dist/{chunk-FASB7HG3.cjs → chunk-AASC67WZ.cjs} +3 -3
- package/dist/{chunk-FASB7HG3.cjs.map → chunk-AASC67WZ.cjs.map} +1 -1
- package/dist/{chunk-BCMPSLSG.js → chunk-BNJP47R7.js} +58 -17
- package/dist/chunk-BNJP47R7.js.map +1 -0
- package/dist/{chunk-JFCOC5TW.cjs → chunk-C33YNBBZ.cjs} +23 -41
- package/dist/chunk-C33YNBBZ.cjs.map +1 -0
- package/dist/{chunk-WNESYY6E.cjs → chunk-DBJCKVYN.cjs} +3 -3
- package/dist/{chunk-WNESYY6E.cjs.map → chunk-DBJCKVYN.cjs.map} +1 -1
- package/dist/{chunk-WRYE2CF5.cjs → chunk-DS4ALUMK.cjs} +3 -3
- package/dist/{chunk-WRYE2CF5.cjs.map → chunk-DS4ALUMK.cjs.map} +1 -1
- package/dist/{chunk-OSEU4ZUE.cjs → chunk-DVWR5KIG.cjs} +3 -3
- package/dist/{chunk-OSEU4ZUE.cjs.map → chunk-DVWR5KIG.cjs.map} +1 -1
- package/dist/chunk-EWFS7ZAG.cjs +96 -0
- package/dist/chunk-EWFS7ZAG.cjs.map +1 -0
- package/dist/{chunk-BGSQU5EH.js → chunk-GYD46GIR.js} +2 -2
- package/dist/chunk-J5IMU4UG.cjs +128 -0
- package/dist/chunk-J5IMU4UG.cjs.map +1 -0
- package/dist/{chunk-KC3PZFGE.js → chunk-PHFPS7PC.js} +2 -2
- package/dist/{chunk-YAVU7ZYD.js → chunk-QTDKBHZP.js} +2 -2
- package/dist/{chunk-Y4CFVCUN.js → chunk-TFDWXKS6.js} +22 -40
- package/dist/chunk-TFDWXKS6.js.map +1 -0
- package/dist/{chunk-JR7MAHBR.cjs → chunk-UAPCZKBD.cjs} +3 -3
- package/dist/{chunk-JR7MAHBR.cjs.map → chunk-UAPCZKBD.cjs.map} +1 -1
- package/dist/{chunk-3SSUEUB5.js → chunk-UPMPPGVK.js} +2 -2
- package/dist/{chunk-3K4JQTPQ.js → chunk-XEX4SQAM.js} +2 -2
- package/dist/chunk-ZCHYXHBI.js +96 -0
- package/dist/chunk-ZCHYXHBI.js.map +1 -0
- package/dist/hooks/index.cjs +2 -2
- package/dist/hooks/index.d.cts +10 -9
- package/dist/hooks/index.d.ts +10 -9
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +16 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -14
- package/package.json +9 -4
- package/dist/chunk-BCMPSLSG.js.map +0 -1
- package/dist/chunk-JFCOC5TW.cjs.map +0 -1
- package/dist/chunk-WQRM7G4C.cjs +0 -87
- package/dist/chunk-WQRM7G4C.cjs.map +0 -1
- package/dist/chunk-Y4CFVCUN.js.map +0 -1
- /package/dist/{chunk-57OFVPRD.js.map → chunk-5I5DGCXC.js.map} +0 -0
- /package/dist/{chunk-QD6IQL6U.js.map → chunk-7ZIHJMDO.js.map} +0 -0
- /package/dist/{chunk-BGSQU5EH.js.map → chunk-GYD46GIR.js.map} +0 -0
- /package/dist/{chunk-KC3PZFGE.js.map → chunk-PHFPS7PC.js.map} +0 -0
- /package/dist/{chunk-YAVU7ZYD.js.map → chunk-QTDKBHZP.js.map} +0 -0
- /package/dist/{chunk-3SSUEUB5.js.map → chunk-UPMPPGVK.js.map} +0 -0
- /package/dist/{chunk-3K4JQTPQ.js.map → chunk-XEX4SQAM.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-EWFS7ZAG.cjs","../src/CheckboxGroup/CheckboxGroup.tsx","../src/CheckboxGroup/index.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACbA,gDAA2B;AAE3B;AACE;AACA;AAAiB,gDACZ;AAyD4B,+CAAA;AArBnC,IAAM,cAAA,EAAgB,CAAC;AAAA,EACrB,UAAA,EAAY,KAAA,CAAA;AAAA,EACZ,MAAA,EAAQ,KAAA,CAAA;AAAA,EACR,OAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,MAAA,EAAQ,QAAA,EAAU,KAAA;AACpB,CAAA,EAAA,GAA0B;AACxB,EAAA,MAAM,EAAE,aAAA,EAAe,QAAQ,EAAA,EAAI,8CAAA,CAAe;AAClD,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,OAAO,EAAA,EAAI,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAExE,EAAA,uBACE,6BAAA;AAAA,IAAC,yBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,OAAO,EAAE,CAAA,EAAA,GAAM;AACvD,QAAA,uBACE,6BAAA;AAAA,UAAC,uBAAA;AAAA,UAAA;AAAA,YACC,SAAA;AAAA,YACA,aAAA,EAAa,MAAA;AAAA,YACb,YAAA,EAAc,MAAA,mBAAS,6BAAA,8CAAC,EAAA,EAAqB,MAAA,CAAc,CAAA;AAAA,YAC3D,UAAA,EAAY,QAAA;AAAA,YACZ,SAAA,EAAW,OAAA;AAAA,YACX,UAAA,EAAY,QAAA;AAAA,YACZ,KAAA,EACE,MAAA;AAAA,4BAEE,8BAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,mCAAA,EAAsC,QAAA,EAAU,cAAA,EAAgB,qBAAqB,CAAA,CAAA;AAE/F,gBAAA;AAAA,kBAAA;AACsC,kCAAA;AAAA,gBAAA;AAAA,cAAA;AACzC,YAAA;AAKA,YAAA;AAC8C,cAAA;AACY,cAAA;AAE1D,YAAA;AACE,cAAA;AACA,cAAA;AACF,YAAA;AACJ,YAAA;AACA,YAAA;AAE0B,YAAA;AAEtB,cAAA;AAAC,gBAAA;AAAA,gBAAA;AAEgC,kBAAA;AAChB,kBAAA;AACF,kBAAA;AACwC,oBAAA;AACrD,kBAAA;AAES,kBAAA;AAAA,gBAAA;AAPiB,gBAAA;AAQ5B,cAAA;AAEH,YAAA;AAAA,UAAA;AACH,QAAA;AAEJ,MAAA;AAAA,IAAA;AACF,EAAA;AAEJ;AAEe;ADxBkG;AACA;AElFlG;AFoFkG;AACA;AACA;AACA;AACA","file":"/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-EWFS7ZAG.cjs","sourcesContent":[null,"import { Controller } from 'react-hook-form';\n\nimport {\n Checkbox,\n CheckboxGroup as NextCheckboxGroup,\n} from '@nextui-org/checkbox';\n\nimport { slugify } from '../helpers';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport type CheckboxGroupOption = {\n /** option label */\n label?: React.ReactNode;\n /** option value */\n value: string;\n /** disables the option */\n disabled?: boolean;\n /** HTML data-testid attribute of the option */\n testId?: string;\n};\n\nexport interface CheckboxGroupProps {\n /** CSS class name. ClassName: string | { buttons?: string | { base?: string; active?: string }; base?: string;} */\n className?: string;\n /** label displayed above the Checkboxes */\n label?: React.ReactNode;\n /** Name the Field is registered on the form. */\n name: string;\n /** Checkboxes that should be displayed. */\n options: CheckboxGroupOption[];\n /** sets all buttons disabled */\n disabled?: boolean;\n /** id for internal testing. */\n testId?: string;\n}\n\n/**\n * CheckboxGroup component based on [NextUI CheckboxGroup](https://nextui.org/docs/components/checkbox-group)\n */\nconst CheckboxGroup = ({\n className = undefined,\n label = undefined,\n options,\n disabled = false,\n name,\n testId: _testId = undefined,\n}: CheckboxGroupProps) => {\n const { getFieldState, control } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n return (\n <Controller\n control={control}\n name={name}\n disabled={disabled}\n render={({ field: { onChange, value, ref, onBlur } }) => {\n return (\n <NextCheckboxGroup\n className={className}\n data-testid={testId}\n errorMessage={error && <FieldValidationError error={error} />}\n isDisabled={disabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n label && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label\n className={`text-bold text-ellipsis text-small ${invalid ? 'text-danger' : 'text-foreground-500'}`}\n >\n {label}\n <FieldCopyTestIdButton testId={testId} />\n </label>\n )\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...(options.length === 1\n ? {\n value: [value].filter((v) => v !== undefined),\n onChange: (newValue) => onChange(newValue && newValue[0]),\n }\n : {\n onChange,\n value,\n })}\n onBlur={onBlur}\n ref={ref}\n >\n {options?.map((option) => {\n return (\n <Checkbox\n key={`index_${option.value}`}\n isDisabled={disabled || option.disabled}\n value={option?.value}\n data-testid={slugify(\n `${testId}_option_${option?.testId || option?.value}`,\n )}\n >\n {option?.label}\n </Checkbox>\n );\n })}\n </NextCheckboxGroup>\n );\n }}\n />\n );\n};\n\nexport default CheckboxGroup;\n","import CheckboxGroup from './CheckboxGroup';\n\nexport type { CheckboxGroupProps, CheckboxGroupOption } from './CheckboxGroup';\n\nexport { CheckboxGroup };\n\nexport default CheckboxGroup;\n"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-DBLODROX.js";
|
|
7
7
|
import {
|
|
8
8
|
useFormContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-BNJP47R7.js";
|
|
10
10
|
|
|
11
11
|
// src/Input/Input.tsx
|
|
12
12
|
import { Controller } from "react-hook-form";
|
|
@@ -78,4 +78,4 @@ export {
|
|
|
78
78
|
Input_default,
|
|
79
79
|
Input_default2
|
|
80
80
|
};
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-GYD46GIR.js.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkBBB4FEY6cjs = require('./chunk-BBB4FEY6.cjs');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useFormContext/useFormContext.ts
|
|
6
|
+
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
7
|
+
var _reacthookform = require('react-hook-form');
|
|
8
|
+
|
|
9
|
+
// src/Form/subcomponents/FormContext.tsx
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
13
|
+
var removeNullishFields = (obj) => {
|
|
14
|
+
return JSON.parse(
|
|
15
|
+
JSON.stringify(obj, (_key, value) => {
|
|
16
|
+
return value === null ? void 0 : value;
|
|
17
|
+
})
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
var UniformContext = _react2.default.createContext(void 0);
|
|
21
|
+
var FormProvider = ({
|
|
22
|
+
children,
|
|
23
|
+
initialValues = void 0,
|
|
24
|
+
onSubmit,
|
|
25
|
+
validation = void 0,
|
|
26
|
+
validationTrigger
|
|
27
|
+
}) => {
|
|
28
|
+
const [canSubmit, setCanSubmit] = _react.useState.call(void 0, true);
|
|
29
|
+
const contextValue = _react.useMemo.call(void 0,
|
|
30
|
+
() => ({ canSubmit, setCanSubmit, validation }),
|
|
31
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
32
|
+
[canSubmit]
|
|
33
|
+
);
|
|
34
|
+
const methods = _reacthookform.useForm.call(void 0, {
|
|
35
|
+
defaultValues: initialValues,
|
|
36
|
+
// add validation config when validation schema provided
|
|
37
|
+
...validation ? {
|
|
38
|
+
// set rhf mode
|
|
39
|
+
// see: https://react-hook-form.com/docs/useform#mode
|
|
40
|
+
mode: validationTrigger,
|
|
41
|
+
resolver: async (values) => {
|
|
42
|
+
const { data, errors, ...rest } = await validation.validateAsync(
|
|
43
|
+
removeNullishFields(values)
|
|
44
|
+
);
|
|
45
|
+
return { values: data || {}, errors: errors || {}, ...rest };
|
|
46
|
+
}
|
|
47
|
+
} : {}
|
|
48
|
+
});
|
|
49
|
+
const handleSubmit = async (e) => {
|
|
50
|
+
if (!canSubmit) {
|
|
51
|
+
console.warn(
|
|
52
|
+
"[FormProvider] form submit was canceled canSubmit is false..."
|
|
53
|
+
);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
await methods.handleSubmit(onSubmit)(e);
|
|
57
|
+
};
|
|
58
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UniformContext.Provider, { value: contextValue, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reacthookform.FormProvider, { ...methods, children: children({ handleSubmit }) }) });
|
|
59
|
+
};
|
|
60
|
+
var FormContext_default = FormProvider;
|
|
61
|
+
|
|
62
|
+
// src/hooks/useFormContext/useFormContext.ts
|
|
63
|
+
var recursiveSearchInnerType = (schema) => {
|
|
64
|
+
let currentSchema = schema;
|
|
65
|
+
while (_optionalChain([currentSchema, 'optionalAccess', _ => _._def, 'optionalAccess', _2 => _2.innerType])) {
|
|
66
|
+
currentSchema = currentSchema._def.innerType;
|
|
67
|
+
if (_optionalChain([currentSchema, 'optionalAccess', _3 => _3._def, 'optionalAccess', _4 => _4.typeName]) === "ZodOptional") {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
};
|
|
73
|
+
var recursiveFieldKeySearch = (schema, path) => {
|
|
74
|
+
const [current, ...rest] = path;
|
|
75
|
+
let currentSchema = schema;
|
|
76
|
+
if (_optionalChain([schema, 'optionalAccess', _5 => _5._def, 'optionalAccess', _6 => _6.typeName]) === "ZodOptional") {
|
|
77
|
+
currentSchema = schema.unwrap();
|
|
78
|
+
}
|
|
79
|
+
if (_optionalChain([schema, 'optionalAccess', _7 => _7._def, 'optionalAccess', _8 => _8.typeName]) === "ZodEffects") {
|
|
80
|
+
return recursiveFieldKeySearch(schema._def.schema, path);
|
|
81
|
+
}
|
|
82
|
+
if (_optionalChain([currentSchema, 'optionalAccess', _9 => _9._def, 'optionalAccess', _10 => _10.typeName]) === "ZodIntersection") {
|
|
83
|
+
return (_optionalChain([currentSchema, 'access', _11 => _11._def, 'access', _12 => _12.left, 'optionalAccess', _13 => _13.schema]) ? recursiveFieldKeySearch(currentSchema._def.left.schema, path) : recursiveFieldKeySearch(currentSchema._def.left, path)) || (_optionalChain([currentSchema, 'access', _14 => _14._def, 'access', _15 => _15.right, 'optionalAccess', _16 => _16.schema]) ? recursiveFieldKeySearch(currentSchema._def.right.schema, path) : recursiveFieldKeySearch(currentSchema._def.right, path));
|
|
84
|
+
}
|
|
85
|
+
const shape = _nullishCoalesce(_optionalChain([currentSchema, 'optionalAccess', _17 => _17.shape]), () => ( _optionalChain([currentSchema, 'optionalAccess', _18 => _18.element, 'optionalAccess', _19 => _19.shape])));
|
|
86
|
+
if (shape && shape[current]) {
|
|
87
|
+
if (rest.length === 0) {
|
|
88
|
+
return _optionalChain([shape, 'access', _20 => _20[current], 'optionalAccess', _21 => _21._def, 'optionalAccess', _22 => _22.typeName]) !== "ZodOptional" && recursiveSearchInnerType(shape[current]);
|
|
89
|
+
}
|
|
90
|
+
return recursiveFieldKeySearch(shape[current], rest);
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
};
|
|
94
|
+
var useFormContext = () => {
|
|
95
|
+
const {
|
|
96
|
+
formState,
|
|
97
|
+
// https://react-hook-form.com/docs/useform/getfieldstate
|
|
98
|
+
// for getFieldState a subscription to formState properties is needed!
|
|
99
|
+
getFieldState: getFieldStateOrig,
|
|
100
|
+
...otherMethods
|
|
101
|
+
} = _reacthookform.useFormContext.call(void 0, );
|
|
102
|
+
const uniformContext = _react.useContext.call(void 0, UniformContext);
|
|
103
|
+
const getFieldState = (name, testId) => {
|
|
104
|
+
const fieldPath = typeof name === "string" ? name.replace(/\[\d+\]/g, "").split(".") : name;
|
|
105
|
+
const required = _optionalChain([uniformContext, 'optionalAccess', _23 => _23.validation]) && recursiveFieldKeySearch(uniformContext.validation.schema, fieldPath) || false;
|
|
106
|
+
const { error, ...rest } = getFieldStateOrig(name, formState);
|
|
107
|
+
return {
|
|
108
|
+
...rest,
|
|
109
|
+
error,
|
|
110
|
+
// Ensure correct type for error
|
|
111
|
+
required,
|
|
112
|
+
testId: _chunkBBB4FEY6cjs.slugify.call(void 0, testId || name)
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
...otherMethods,
|
|
117
|
+
...uniformContext,
|
|
118
|
+
getFieldState,
|
|
119
|
+
formState
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
exports.FormContext_default = FormContext_default; exports.recursiveFieldKeySearch = recursiveFieldKeySearch; exports.useFormContext = useFormContext;
|
|
128
|
+
//# sourceMappingURL=chunk-J5IMU4UG.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-J5IMU4UG.cjs","../src/hooks/useFormContext/useFormContext.ts","../src/Form/subcomponents/FormContext.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-J5IMU4UG.cjs","sourcesContent":[null,"import type { VetoSchema } from '@fuf-stack/veto';\nimport type { FieldError } from 'react-hook-form';\n\nimport { useContext } from 'react';\nimport { useFormContext as useHookFormContext } from 'react-hook-form';\n\nimport { UniformContext } from '../../Form/subcomponents/FormContext';\nimport { slugify } from '../../helpers';\n\n/** Checks whether the field is an optional type by recursively checking inner types */\nconst recursiveSearchInnerType = (schema: VetoSchema): boolean => {\n let currentSchema = schema;\n\n // Loop through inner types to find the root type\n while (currentSchema?._def?.innerType) {\n currentSchema = currentSchema._def.innerType;\n if (currentSchema?._def?.typeName === 'ZodOptional') {\n // Stop recursion if optional is found\n return false;\n }\n }\n // If no optional was found, assume it's required\n return true;\n};\n\n/** Recursive search to check whether a field is required or optional */\nexport const recursiveFieldKeySearch = (\n schema: VetoSchema,\n path: string[],\n): boolean | null => {\n const [current, ...rest] = path;\n\n let currentSchema = schema;\n\n // Handle ZodOptional schema: unwrap and continue searching\n if (schema?._def?.typeName === 'ZodOptional') {\n // @ts-expect-error not sure here\n currentSchema = schema.unwrap();\n }\n\n // Handle ZodEffects (transformations or validation effects)\n if (schema?._def?.typeName === 'ZodEffects') {\n // Unwrap and continue\n return recursiveFieldKeySearch(schema._def.schema, path);\n }\n\n // Handle ZodIntersection (intersection types)\n if (currentSchema?._def?.typeName === 'ZodIntersection') {\n return (\n (currentSchema._def.left?.schema\n ? recursiveFieldKeySearch(currentSchema._def.left.schema, path)\n : recursiveFieldKeySearch(currentSchema._def.left, path)) ||\n (currentSchema._def.right?.schema\n ? recursiveFieldKeySearch(currentSchema._def.right.schema, path)\n : recursiveFieldKeySearch(currentSchema._def.right, path))\n );\n }\n\n // Get the shape of an object or elements of an array schema\n // @ts-expect-error not sure here\n const shape = currentSchema?.shape ?? currentSchema?.element?.shape;\n\n if (shape && shape[current]) {\n if (rest.length === 0) {\n // At the end of the path, check if the field is optional\n return (\n shape[current]?._def?.typeName !== 'ZodOptional' &&\n recursiveSearchInnerType(shape[current])\n );\n }\n return recursiveFieldKeySearch(shape[current], rest);\n }\n // Return null if field not found\n return null;\n};\n\n/**\n * Custom hook that extends react-hook-form's useFormContext to add validation and state management.\n */\nexport const useFormContext = () => {\n const {\n formState,\n // https://react-hook-form.com/docs/useform/getfieldstate\n // for getFieldState a subscription to formState properties is needed!\n getFieldState: getFieldStateOrig,\n ...otherMethods\n } = useHookFormContext();\n\n const uniformContext = useContext(UniformContext);\n\n /**\n * Updated getFieldState method which returns:\n * - Whether the field is required by checking the validation schema\n * - Existing field state information (errors, etc.)\n */\n const getFieldState = (name: string, testId?: string) => {\n const fieldPath =\n typeof name === 'string' ? name.replace(/\\[\\d+\\]/g, '').split('.') : name;\n\n // Check if the field is required using the validation schema\n const required =\n (uniformContext?.validation &&\n recursiveFieldKeySearch(uniformContext.validation.schema, fieldPath)) ||\n false;\n\n // Get the original field state (errors, etc.) from react-hook-form\n const { error, ...rest } = getFieldStateOrig(name, formState);\n\n return {\n ...rest,\n error: error as FieldError[] | undefined, // Ensure correct type for error\n required,\n testId: slugify(testId || name),\n };\n };\n\n return {\n ...otherMethods,\n ...uniformContext,\n getFieldState,\n formState,\n };\n};\n","import type { VetoInstance } from '@fuf-stack/veto';\nimport type { ReactNode } from 'react';\nimport type { FieldValues, SubmitHandler } from 'react-hook-form';\n\nimport React, { useMemo, useState } from 'react';\nimport { FormProvider as HookFormProvider, useForm } from 'react-hook-form';\n\n/**\n * recursively removes all fields that are null or undefined before\n * the form data is passed to the veto validation function\n */\nexport const removeNullishFields = (obj: Record<string, unknown>) => {\n return JSON.parse(\n JSON.stringify(obj, (_key, value) => {\n return value === null ? undefined : value;\n }),\n );\n};\n\n/**\n * The `UniformContext` provides the form submission state (`canSubmit`) and the ability to control\n * submission behavior (`setCanSubmit`). Additionally, it may provide an optional `validation` schema\n * (from Veto) for form validation purposes.\n *\n * This context is used by components that need to control or be aware of the form submission state,\n * or that require access to the validation schema for managing validation logic.\n *\n * The context's default value is `undefined` until provided by the `FormProvider` component.\n */\nexport const UniformContext = React.createContext<\n | {\n /** Whether the form can be submitted */\n canSubmit: boolean;\n /** Function to update the form's submission state (enabled/disabled) */\n setCanSubmit: React.Dispatch<React.SetStateAction<boolean>>;\n /** Optional Veto validation schema instance for form validation */\n validation?: VetoInstance;\n }\n | undefined\n>(undefined);\n\n// Define props for the FormProvider component, extending HookForm's props\ninterface FormProviderProps {\n /** children form render function */\n children: (childProps: {\n handleSubmit: (e?: React.BaseSyntheticEvent) => Promise<void>;\n }) => ReactNode;\n /** initial form values */\n initialValues?: FieldValues;\n /** form submit handler */\n onSubmit: SubmitHandler<FieldValues>;\n /** Veto validation schema instance */\n validation?: VetoInstance;\n /** when the validation should be triggered */\n validationTrigger: 'onChange' | 'onBlur' | 'onSubmit' | 'onTouched' | 'all';\n}\n\n/**\n * FormProvider component provides both:\n * 1. The veto validation schema context\n * 2. The form submission control context\n */\nconst FormProvider: React.FC<FormProviderProps> = ({\n children,\n initialValues = undefined,\n onSubmit,\n validation = undefined,\n validationTrigger,\n}) => {\n // Local state to control if form can be submitted\n const [canSubmit, setCanSubmit] = useState(true);\n\n // Memoize the context value to prevent re-renders\n const contextValue = useMemo(\n () => ({ canSubmit, setCanSubmit, validation }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [canSubmit],\n );\n\n // Initialize react hook form\n const methods = useForm({\n defaultValues: initialValues,\n // add validation config when validation schema provided\n ...(validation\n ? {\n // set rhf mode\n // see: https://react-hook-form.com/docs/useform#mode\n mode: validationTrigger,\n resolver: async (values) => {\n const { data, errors, ...rest } = await validation.validateAsync(\n removeNullishFields(values),\n );\n // https://github.com/react-hook-form/resolvers/blob/master/zod/src/zod.ts\n return { values: data || {}, errors: errors || {}, ...rest };\n },\n }\n : {}),\n });\n\n // Create submit handler\n const handleSubmit = async (e?: React.BaseSyntheticEvent) => {\n if (!canSubmit) {\n console.warn(\n '[FormProvider] form submit was canceled canSubmit is false...',\n );\n return;\n }\n await methods.handleSubmit(onSubmit)(e);\n };\n\n return (\n <UniformContext.Provider value={contextValue}>\n {/* Spread all hook form props into HookFormProvider */}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <HookFormProvider {...methods}>\n {children({ handleSubmit })}\n </HookFormProvider>\n </UniformContext.Provider>\n );\n};\n\nexport default FormProvider;\n"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-DBLODROX.js";
|
|
7
7
|
import {
|
|
8
8
|
useFormContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-BNJP47R7.js";
|
|
10
10
|
|
|
11
11
|
// src/TextArea/TextArea.tsx
|
|
12
12
|
import { Controller } from "react-hook-form";
|
|
@@ -73,4 +73,4 @@ export {
|
|
|
73
73
|
TextArea_default,
|
|
74
74
|
TextArea_default2
|
|
75
75
|
};
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
76
|
+
//# sourceMappingURL=chunk-PHFPS7PC.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-DBLODROX.js";
|
|
7
7
|
import {
|
|
8
8
|
useFormContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-BNJP47R7.js";
|
|
10
10
|
|
|
11
11
|
// src/Select/Select.tsx
|
|
12
12
|
import { Controller } from "react-hook-form";
|
|
@@ -236,4 +236,4 @@ export {
|
|
|
236
236
|
Select_default,
|
|
237
237
|
Select_default2
|
|
238
238
|
};
|
|
239
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
//# sourceMappingURL=chunk-QTDKBHZP.js.map
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FormContext_default,
|
|
3
3
|
useFormContext
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BNJP47R7.js";
|
|
5
5
|
import {
|
|
6
6
|
slugify
|
|
7
7
|
} from "./chunk-V46BHM2U.js";
|
|
8
8
|
|
|
9
9
|
// src/Form/Form.tsx
|
|
10
|
-
import { useForm } from "react-hook-form";
|
|
11
10
|
import { cn as cn2 } from "@fuf-stack/pixel-utils";
|
|
12
11
|
|
|
13
12
|
// src/Form/subcomponents/FormDebugViewer.tsx
|
|
@@ -104,13 +103,6 @@ var FormDebugViewer_default = FormDebugViewer;
|
|
|
104
103
|
|
|
105
104
|
// src/Form/Form.tsx
|
|
106
105
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
107
|
-
var removeNullishFields = (obj) => {
|
|
108
|
-
return JSON.parse(
|
|
109
|
-
JSON.stringify(obj, (_key, value) => {
|
|
110
|
-
return value === null ? void 0 : value;
|
|
111
|
-
})
|
|
112
|
-
);
|
|
113
|
-
};
|
|
114
106
|
var Form = ({
|
|
115
107
|
children,
|
|
116
108
|
className = void 0,
|
|
@@ -121,38 +113,28 @@ var Form = ({
|
|
|
121
113
|
validation = void 0,
|
|
122
114
|
validationTrigger = "all"
|
|
123
115
|
}) => {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
116
|
+
return /* @__PURE__ */ jsx2(
|
|
117
|
+
FormContext_default,
|
|
118
|
+
{
|
|
119
|
+
initialValues,
|
|
120
|
+
onSubmit,
|
|
121
|
+
validation,
|
|
122
|
+
validationTrigger,
|
|
123
|
+
children: ({ handleSubmit }) => /* @__PURE__ */ jsxs2("div", { className: "flex w-full flex-row justify-between gap-6", children: [
|
|
124
|
+
/* @__PURE__ */ jsx2(
|
|
125
|
+
"form",
|
|
126
|
+
{
|
|
127
|
+
className: cn2("flex-grow", className),
|
|
128
|
+
"data-testid": slugify(testId || name || ""),
|
|
129
|
+
name,
|
|
130
|
+
onSubmit: handleSubmit,
|
|
131
|
+
children
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
/* @__PURE__ */ jsx2(FormDebugViewer_default, { className: "w-96 flex-shrink" })
|
|
135
|
+
] })
|
|
138
136
|
}
|
|
139
137
|
);
|
|
140
|
-
return (
|
|
141
|
-
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
142
|
-
/* @__PURE__ */ jsx2(FormContext_default, { ...methods, validation, children: /* @__PURE__ */ jsxs2("div", { className: "flex w-full flex-row justify-between gap-6", children: [
|
|
143
|
-
/* @__PURE__ */ jsx2(
|
|
144
|
-
"form",
|
|
145
|
-
{
|
|
146
|
-
className: cn2("flex-grow", className),
|
|
147
|
-
"data-testid": slugify(testId || name || ""),
|
|
148
|
-
name,
|
|
149
|
-
onSubmit: methods.handleSubmit(onSubmit),
|
|
150
|
-
children
|
|
151
|
-
}
|
|
152
|
-
),
|
|
153
|
-
/* @__PURE__ */ jsx2(FormDebugViewer_default, { className: "w-96 flex-shrink" })
|
|
154
|
-
] }) })
|
|
155
|
-
);
|
|
156
138
|
};
|
|
157
139
|
var Form_default = Form;
|
|
158
140
|
|
|
@@ -163,4 +145,4 @@ export {
|
|
|
163
145
|
Form_default,
|
|
164
146
|
Form_default2
|
|
165
147
|
};
|
|
166
|
-
//# sourceMappingURL=chunk-
|
|
148
|
+
//# sourceMappingURL=chunk-TFDWXKS6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Form/Form.tsx","../src/Form/subcomponents/FormDebugViewer.tsx","../src/Form/index.ts"],"sourcesContent":["import type { VetoInstance } from '@fuf-stack/veto';\nimport type { ReactNode } from 'react';\nimport type { FieldValues, SubmitHandler } from 'react-hook-form';\n\nimport { cn } from '@fuf-stack/pixel-utils';\n\nimport { slugify } from '../helpers';\nimport FormProvider from './subcomponents/FormContext';\nimport FormDebugViewer from './subcomponents/FormDebugViewer';\n\nexport interface FormProps {\n /** form children */\n children: ReactNode | ReactNode[];\n /** CSS class name */\n className?: string | string[];\n /** initial form values */\n initialValues?: FieldValues;\n /** name of the form */\n name?: string;\n /** form submit handler */\n onSubmit: SubmitHandler<FieldValues>;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** veto validation schema */\n validation?: VetoInstance;\n /** when the validation should be triggered */\n validationTrigger?: 'onChange' | 'onBlur' | 'onSubmit' | 'onTouched' | 'all';\n}\n\n/**\n * Form component that has to wrap every uniform\n */\nconst Form = ({\n children,\n className = undefined,\n initialValues = undefined,\n name = undefined,\n onSubmit,\n testId = undefined,\n validation = undefined,\n validationTrigger = 'all',\n}: FormProps) => {\n return (\n <FormProvider\n initialValues={initialValues}\n onSubmit={onSubmit}\n validation={validation}\n validationTrigger={validationTrigger}\n >\n {({ handleSubmit }) => (\n <div className=\"flex w-full flex-row justify-between gap-6\">\n <form\n className={cn('flex-grow', className)}\n data-testid={slugify(testId || name || '')}\n name={name}\n onSubmit={handleSubmit}\n >\n {children}\n </form>\n <FormDebugViewer className=\"w-96 flex-shrink\" />\n </div>\n )}\n </FormProvider>\n );\n};\n\nexport default Form;\n","import type { VetoError } from '@fuf-stack/veto';\n\nimport { useEffect, useState } from 'react';\nimport { FaTimes } from 'react-icons/fa';\nimport { FaBug, FaBullseye } from 'react-icons/fa6';\n\nimport { cn } from '@fuf-stack/pixel-utils';\nimport { Button, Card, Json, useLocalStorage } from '@fuf-stack/pixels';\n\nimport { useFormContext } from '../../hooks';\n\ninterface FormDebugViewerProps {\n /** CSS class name */\n className?: string;\n}\n\nconst LOCALSTORAGE_DEBUG_KEY = 'uniform:form-debug-enabled';\nconst LOCALSTORAGE_COPY_TEST_ID_KEY = 'uniform:form-debug-copy-test-id-enabled';\n\n/** Renders a form debug panel with information about the current form state */\nconst FormDebugViewer = ({ className = undefined }: FormDebugViewerProps) => {\n const {\n watch,\n formState: { dirtyFields, isValid, isSubmitting },\n validation,\n } = useFormContext();\n\n const [debug, setDebug] = useLocalStorage(LOCALSTORAGE_DEBUG_KEY, false);\n const [copyTestId, setCopyTestId] = useLocalStorage(\n LOCALSTORAGE_COPY_TEST_ID_KEY,\n false,\n );\n\n const [validationErrors, setValidationErrors] = useState<\n VetoError['errors'] | null\n >(null);\n\n const formValues = watch();\n\n useEffect(\n () => {\n const updateValidationErrors = async () => {\n if (validation) {\n const validateResult = await validation?.validateAsync(formValues);\n setValidationErrors(validateResult?.errors);\n }\n };\n updateValidationErrors();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(formValues)],\n );\n\n if (!debug) {\n return (\n <Button\n ariaLabel=\"Enable form debug mode\"\n onClick={() => setDebug(!debug)}\n className=\"absolute bottom-2.5 right-2.5 w-5 text-default-400\"\n variant=\"light\"\n icon={<FaBug />}\n />\n );\n }\n\n return (\n <Card\n className={cn(className)}\n header={\n <div className=\"flex w-full flex-row justify-between\">\n <span className=\"text-lg\">Debug Mode</span>\n <Button\n icon={<FaTimes className=\"text-danger\" />}\n onClick={() => setDebug(false)}\n size=\"sm\"\n variant=\"flat\"\n />\n </div>\n }\n >\n <Button\n variant={copyTestId ? 'solid' : 'light'}\n icon={<FaBullseye />}\n className=\"mb-4 ml-auto mr-auto\"\n onClick={() => setCopyTestId(!copyTestId)}\n >\n {copyTestId ? 'Hide CopyButton' : 'Show CopyButton'}\n </Button>\n <Json\n value={{\n values: formValues,\n errors: validationErrors,\n dirtyFields,\n isValid,\n isSubmitting,\n }}\n />\n </Card>\n );\n};\nexport default FormDebugViewer;\n","import Form from './Form';\n\nexport type { FormProps } from './Form';\n\nexport { Form };\n\nexport default Form;\n"],"mappings":"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","names":["cn","jsx","jsxs","cn","Form_default"]}
|
|
@@ -6,7 +6,7 @@ var _chunkKMMS4G7Acjs = require('./chunk-KMMS4G7A.cjs');
|
|
|
6
6
|
var _chunkQTL5FREEcjs = require('./chunk-QTL5FREE.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkJ5IMU4UGcjs = require('./chunk-J5IMU4UG.cjs');
|
|
10
10
|
|
|
11
11
|
// src/Switch/Switch.tsx
|
|
12
12
|
var _reacthookform = require('react-hook-form');
|
|
@@ -20,7 +20,7 @@ var Switch = ({
|
|
|
20
20
|
name,
|
|
21
21
|
testId: _testId = void 0
|
|
22
22
|
}) => {
|
|
23
|
-
const { control, getFieldState } =
|
|
23
|
+
const { control, getFieldState } = _chunkJ5IMU4UGcjs.useFormContext.call(void 0, );
|
|
24
24
|
const { error, required, testId, invalid } = getFieldState(name, _testId);
|
|
25
25
|
const { label, getInputProps, getHelperWrapperProps, getErrorMessageProps } = _input.useInput.call(void 0, {
|
|
26
26
|
errorMessage: JSON.stringify(error),
|
|
@@ -78,4 +78,4 @@ var Switch_default2 = Switch_default;
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
exports.Switch_default = Switch_default; exports.Switch_default2 = Switch_default2;
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-UAPCZKBD.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-UAPCZKBD.cjs","../src/Switch/Switch.tsx","../src/Switch/index.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACVA,gDAA2B;AAE3B,0CAAyB;AACzB,4CAAqC;AAkD7B,+CAAA;AA5BR,IAAM,OAAA,EAAS,CAAC;AAAA,EACd,SAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,KAAA,EAAO,OAAA,EAAS,KAAA,CAAA;AAAA,EAChB,IAAA;AAAA,EACA,MAAA,EAAQ,QAAA,EAAU,KAAA;AACpB,CAAA,EAAA,GAAmB;AACjB,EAAA,MAAM,EAAE,OAAA,EAAS,cAAc,EAAA,EAAI,8CAAA,CAAe;AAClD,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAQ,EAAA,EAAI,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAExE,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,qBAAA,EAAuB,qBAAqB,EAAA,EACxE,6BAAA;AAAS,IACP,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,OAAA;AAAA,IACX,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,cAAA,EAAgB,SAAA;AAAA,IAChB,WAAA,EAAa;AAAA,EACf,CAAC,CAAA;AAEH,EAAA,uBACE,6BAAA;AAAA,IAAC,yBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,CAAC;AAAA,QACP,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,SAAS;AAAA,MAC9D,CAAA,EAAA,mBACE,8BAAA,oBAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,8BAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,kBAAA,EAAkB,aAAA,CAAc,CAAA,CAAE,kBAAkB,CAAA;AAAA,YACpD,QAAA;AAAA,YACA,UAAA,EAAY,CAAC,CAAC,KAAA;AAAA,YACd,SAAA;AAAA,YACA,UAAA,EAAY;AAAA,cACV,KAAA,EAAO,CAAA,yCAAA,EAA4C,QAAA,EAAU,cAAA,EAAgB,EAAE,CAAA;AAAA,YAAA;AACjF,YAAA;AACa,YAAA;AACb,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AAEC,cAAA;AAAA,cAAA;AAE2C,8BAAA;AAEL,YAAA;AAAA,UAAA;AAAA,QAAA;AACzC,QAAA;AACC,wBAAA;AAOC,MAAA;AAEJ,IAAA;AAAA,EAAA;AAIR;AAEA;ADnBA;AACA;AEnEA;AFqEA;AACA;AACA;AACA;AACA","file":"/home/runner/work/uniform/uniform/packages/uniform/dist/chunk-UAPCZKBD.cjs","sourcesContent":[null,"import { Controller } from 'react-hook-form';\n\nimport { useInput } from '@nextui-org/input';\nimport { Switch as NextSwitch } from '@nextui-org/switch';\n\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport interface SwitchProps {\n /** CSS class name */\n className: string;\n /** whether the select should be disabled */\n disabled?: boolean;\n /** component displayed next to the switch. */\n label: React.ReactNode;\n /** name the field is registered under */\n name: string;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * Switch component based on [NextUI Switch](https://nextui.org/docs/components/switch)\n */\nconst Switch = ({\n className,\n disabled = false,\n label: _label = undefined,\n name,\n testId: _testId = undefined,\n}: SwitchProps) => {\n const { control, getFieldState } = useFormContext();\n const { error, required, testId, invalid } = getFieldState(name, _testId);\n\n const { label, getInputProps, getHelperWrapperProps, getErrorMessageProps } =\n useInput({\n errorMessage: JSON.stringify(error),\n isInvalid: invalid,\n isRequired: required,\n label: _label,\n labelPlacement: 'outside',\n placeholder: ' ',\n });\n\n return (\n <Controller\n name={name}\n control={control}\n disabled={disabled}\n render={({\n field: { disabled: isDisabled, value, ref, onBlur, onChange },\n }) => (\n <>\n <NextSwitch\n aria-describedby={getInputProps()['aria-describedby']}\n required={required}\n isSelected={!!value}\n className={className}\n classNames={{\n label: `text-bold block text-ellipsis text-small ${invalid ? 'text-danger' : ''}`,\n }}\n data-testid={testId}\n isDisabled={isDisabled}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n ref={ref}\n >\n {label}\n {!!required && !!_label && (\n <span className=\"!text-danger\">{' \\u002A'}</span>\n )}\n <FieldCopyTestIdButton testId={testId} />\n </NextSwitch>\n {error && (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <div {...getHelperWrapperProps()}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <div {...getErrorMessageProps()}>\n <FieldValidationError error={error} />\n </div>\n </div>\n )}\n </>\n )}\n />\n );\n};\n\nexport default Switch;\n","import Switch from './Switch';\n\nexport type { SwitchProps } from './Switch';\n\nexport { Switch };\n\nexport default Switch;\n"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-DBLODROX.js";
|
|
7
7
|
import {
|
|
8
8
|
useFormContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-BNJP47R7.js";
|
|
10
10
|
|
|
11
11
|
// src/Switch/Switch.tsx
|
|
12
12
|
import { Controller } from "react-hook-form";
|
|
@@ -78,4 +78,4 @@ export {
|
|
|
78
78
|
Switch_default,
|
|
79
79
|
Switch_default2
|
|
80
80
|
};
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-UPMPPGVK.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-DBLODROX.js";
|
|
7
7
|
import {
|
|
8
8
|
useFormContext
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-BNJP47R7.js";
|
|
10
10
|
import {
|
|
11
11
|
slugify
|
|
12
12
|
} from "./chunk-V46BHM2U.js";
|
|
@@ -202,4 +202,4 @@ export {
|
|
|
202
202
|
RadioGroup_default,
|
|
203
203
|
RadioGroup_default2
|
|
204
204
|
};
|
|
205
|
-
//# sourceMappingURL=chunk-
|
|
205
|
+
//# sourceMappingURL=chunk-XEX4SQAM.js.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FieldCopyTestIdButton_default
|
|
3
|
+
} from "./chunk-T3CCNJHK.js";
|
|
4
|
+
import {
|
|
5
|
+
FieldValidationError_default
|
|
6
|
+
} from "./chunk-DBLODROX.js";
|
|
7
|
+
import {
|
|
8
|
+
useFormContext
|
|
9
|
+
} from "./chunk-BNJP47R7.js";
|
|
10
|
+
import {
|
|
11
|
+
slugify
|
|
12
|
+
} from "./chunk-V46BHM2U.js";
|
|
13
|
+
|
|
14
|
+
// src/CheckboxGroup/CheckboxGroup.tsx
|
|
15
|
+
import { Controller } from "react-hook-form";
|
|
16
|
+
import {
|
|
17
|
+
Checkbox,
|
|
18
|
+
CheckboxGroup as NextCheckboxGroup
|
|
19
|
+
} from "@nextui-org/checkbox";
|
|
20
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
21
|
+
var CheckboxGroup = ({
|
|
22
|
+
className = void 0,
|
|
23
|
+
label = void 0,
|
|
24
|
+
options,
|
|
25
|
+
disabled = false,
|
|
26
|
+
name,
|
|
27
|
+
testId: _testId = void 0
|
|
28
|
+
}) => {
|
|
29
|
+
const { getFieldState, control } = useFormContext();
|
|
30
|
+
const { error, invalid, required, testId } = getFieldState(name, _testId);
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
Controller,
|
|
33
|
+
{
|
|
34
|
+
control,
|
|
35
|
+
name,
|
|
36
|
+
disabled,
|
|
37
|
+
render: ({ field: { onChange, value, ref, onBlur } }) => {
|
|
38
|
+
return /* @__PURE__ */ jsx(
|
|
39
|
+
NextCheckboxGroup,
|
|
40
|
+
{
|
|
41
|
+
className,
|
|
42
|
+
"data-testid": testId,
|
|
43
|
+
errorMessage: error && /* @__PURE__ */ jsx(FieldValidationError_default, { error }),
|
|
44
|
+
isDisabled: disabled,
|
|
45
|
+
isInvalid: invalid,
|
|
46
|
+
isRequired: required,
|
|
47
|
+
label: label && // eslint-disable-next-line jsx-a11y/label-has-associated-control
|
|
48
|
+
/* @__PURE__ */ jsxs(
|
|
49
|
+
"label",
|
|
50
|
+
{
|
|
51
|
+
className: `text-bold text-ellipsis text-small ${invalid ? "text-danger" : "text-foreground-500"}`,
|
|
52
|
+
children: [
|
|
53
|
+
label,
|
|
54
|
+
/* @__PURE__ */ jsx(FieldCopyTestIdButton_default, { testId })
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
...options.length === 1 ? {
|
|
59
|
+
value: [value].filter((v) => v !== void 0),
|
|
60
|
+
onChange: (newValue) => onChange(newValue && newValue[0])
|
|
61
|
+
} : {
|
|
62
|
+
onChange,
|
|
63
|
+
value
|
|
64
|
+
},
|
|
65
|
+
onBlur,
|
|
66
|
+
ref,
|
|
67
|
+
children: options?.map((option) => {
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
Checkbox,
|
|
70
|
+
{
|
|
71
|
+
isDisabled: disabled || option.disabled,
|
|
72
|
+
value: option?.value,
|
|
73
|
+
"data-testid": slugify(
|
|
74
|
+
`${testId}_option_${option?.testId || option?.value}`
|
|
75
|
+
),
|
|
76
|
+
children: option?.label
|
|
77
|
+
},
|
|
78
|
+
`index_${option.value}`
|
|
79
|
+
);
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
};
|
|
87
|
+
var CheckboxGroup_default = CheckboxGroup;
|
|
88
|
+
|
|
89
|
+
// src/CheckboxGroup/index.ts
|
|
90
|
+
var CheckboxGroup_default2 = CheckboxGroup_default;
|
|
91
|
+
|
|
92
|
+
export {
|
|
93
|
+
CheckboxGroup_default,
|
|
94
|
+
CheckboxGroup_default2
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=chunk-ZCHYXHBI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/CheckboxGroup/CheckboxGroup.tsx","../src/CheckboxGroup/index.ts"],"sourcesContent":["import { Controller } from 'react-hook-form';\n\nimport {\n Checkbox,\n CheckboxGroup as NextCheckboxGroup,\n} from '@nextui-org/checkbox';\n\nimport { slugify } from '../helpers';\nimport { useFormContext } from '../hooks';\nimport { FieldCopyTestIdButton } from '../partials/FieldCopyTestIdButton';\nimport { FieldValidationError } from '../partials/FieldValidationError';\n\nexport type CheckboxGroupOption = {\n /** option label */\n label?: React.ReactNode;\n /** option value */\n value: string;\n /** disables the option */\n disabled?: boolean;\n /** HTML data-testid attribute of the option */\n testId?: string;\n};\n\nexport interface CheckboxGroupProps {\n /** CSS class name. ClassName: string | { buttons?: string | { base?: string; active?: string }; base?: string;} */\n className?: string;\n /** label displayed above the Checkboxes */\n label?: React.ReactNode;\n /** Name the Field is registered on the form. */\n name: string;\n /** Checkboxes that should be displayed. */\n options: CheckboxGroupOption[];\n /** sets all buttons disabled */\n disabled?: boolean;\n /** id for internal testing. */\n testId?: string;\n}\n\n/**\n * CheckboxGroup component based on [NextUI CheckboxGroup](https://nextui.org/docs/components/checkbox-group)\n */\nconst CheckboxGroup = ({\n className = undefined,\n label = undefined,\n options,\n disabled = false,\n name,\n testId: _testId = undefined,\n}: CheckboxGroupProps) => {\n const { getFieldState, control } = useFormContext();\n const { error, invalid, required, testId } = getFieldState(name, _testId);\n\n return (\n <Controller\n control={control}\n name={name}\n disabled={disabled}\n render={({ field: { onChange, value, ref, onBlur } }) => {\n return (\n <NextCheckboxGroup\n className={className}\n data-testid={testId}\n errorMessage={error && <FieldValidationError error={error} />}\n isDisabled={disabled}\n isInvalid={invalid}\n isRequired={required}\n label={\n label && (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label\n className={`text-bold text-ellipsis text-small ${invalid ? 'text-danger' : 'text-foreground-500'}`}\n >\n {label}\n <FieldCopyTestIdButton testId={testId} />\n </label>\n )\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...(options.length === 1\n ? {\n value: [value].filter((v) => v !== undefined),\n onChange: (newValue) => onChange(newValue && newValue[0]),\n }\n : {\n onChange,\n value,\n })}\n onBlur={onBlur}\n ref={ref}\n >\n {options?.map((option) => {\n return (\n <Checkbox\n key={`index_${option.value}`}\n isDisabled={disabled || option.disabled}\n value={option?.value}\n data-testid={slugify(\n `${testId}_option_${option?.testId || option?.value}`,\n )}\n >\n {option?.label}\n </Checkbox>\n );\n })}\n </NextCheckboxGroup>\n );\n }}\n />\n );\n};\n\nexport default CheckboxGroup;\n","import CheckboxGroup from './CheckboxGroup';\n\nexport type { CheckboxGroupProps, CheckboxGroupOption } from './CheckboxGroup';\n\nexport { CheckboxGroup };\n\nexport default CheckboxGroup;\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAE3B;AAAA,EACE;AAAA,EACA,iBAAiB;AAAA,OACZ;AAyD4B,cAOnB,YAPmB;AArBnC,IAAM,gBAAgB,CAAC;AAAA,EACrB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,QAAQ,UAAU;AACpB,MAA0B;AACxB,QAAM,EAAE,eAAe,QAAQ,IAAI,eAAe;AAClD,QAAM,EAAE,OAAO,SAAS,UAAU,OAAO,IAAI,cAAc,MAAM,OAAO;AAExE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,OAAO,KAAK,OAAO,EAAE,MAAM;AACvD,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,eAAa;AAAA,YACb,cAAc,SAAS,oBAAC,gCAAqB,OAAc;AAAA,YAC3D,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,OACE;AAAA,YAEE;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,sCAAsC,UAAU,gBAAgB,qBAAqB;AAAA,gBAE/F;AAAA;AAAA,kBACD,oBAAC,iCAAsB,QAAgB;AAAA;AAAA;AAAA,YACzC;AAAA,YAIH,GAAI,QAAQ,WAAW,IACpB;AAAA,cACE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,MAAM,MAAS;AAAA,cAC5C,UAAU,CAAC,aAAa,SAAS,YAAY,SAAS,CAAC,CAAC;AAAA,YAC1D,IACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACJ;AAAA,YACA;AAAA,YAEC,mBAAS,IAAI,CAAC,WAAW;AACxB,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,YAAY,YAAY,OAAO;AAAA,kBAC/B,OAAO,QAAQ;AAAA,kBACf,eAAa;AAAA,oBACX,GAAG,MAAM,WAAW,QAAQ,UAAU,QAAQ,KAAK;AAAA,kBACrD;AAAA,kBAEC,kBAAQ;AAAA;AAAA,gBAPJ,SAAS,OAAO,KAAK;AAAA,cAQ5B;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;;;ACzGf,IAAOA,yBAAQ;","names":["CheckboxGroup_default"]}
|
package/dist/hooks/index.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkJ5IMU4UGcjs = require('../chunk-J5IMU4UG.cjs');
|
|
5
5
|
require('../chunk-BBB4FEY6.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
exports.recursiveFieldKeySearch =
|
|
9
|
+
exports.recursiveFieldKeySearch = _chunkJ5IMU4UGcjs.recursiveFieldKeySearch; exports.useFormContext = _chunkJ5IMU4UGcjs.useFormContext;
|
|
10
10
|
//# sourceMappingURL=index.cjs.map
|
package/dist/hooks/index.d.cts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import * as react_hook_form from 'react-hook-form';
|
|
2
|
-
import { FieldError } from 'react-hook-form';
|
|
3
1
|
import * as _fuf_stack_veto from '@fuf-stack/veto';
|
|
4
2
|
import { VetoSchema } from '@fuf-stack/veto';
|
|
5
|
-
import * as
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import * as react_hook_form from 'react-hook-form';
|
|
5
|
+
import { FieldError } from 'react-hook-form';
|
|
6
6
|
|
|
7
|
+
/** Recursive search to check whether a field is required or optional */
|
|
7
8
|
declare const recursiveFieldKeySearch: (schema: VetoSchema, path: string[]) => boolean | null;
|
|
8
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Custom hook that extends react-hook-form's useFormContext to add validation and state management.
|
|
11
|
+
*/
|
|
9
12
|
declare const useFormContext: () => {
|
|
10
13
|
getFieldState: (name: string, testId?: string) => {
|
|
11
14
|
error: FieldError[] | undefined;
|
|
@@ -16,12 +19,10 @@ declare const useFormContext: () => {
|
|
|
16
19
|
isTouched: boolean;
|
|
17
20
|
isValidating: boolean;
|
|
18
21
|
};
|
|
19
|
-
validation: {
|
|
20
|
-
schema: _fuf_stack_veto_dist_types_d_DhQiwhXl.a;
|
|
21
|
-
validate: <InputType extends _fuf_stack_veto.VetoInput>(input: InputType) => _fuf_stack_veto.VetoError | _fuf_stack_veto.VetoSuccess<any>;
|
|
22
|
-
validateAsync: <InputType extends _fuf_stack_veto.VetoInput>(input: InputType) => Promise<_fuf_stack_veto.VetoError | _fuf_stack_veto.VetoSuccess<any>>;
|
|
23
|
-
} | undefined;
|
|
24
22
|
formState: react_hook_form.FormState<react_hook_form.FieldValues>;
|
|
23
|
+
canSubmit?: boolean | undefined;
|
|
24
|
+
setCanSubmit?: react.Dispatch<react.SetStateAction<boolean>> | undefined;
|
|
25
|
+
validation?: _fuf_stack_veto.VetoInstance;
|
|
25
26
|
watch: react_hook_form.UseFormWatch<react_hook_form.FieldValues>;
|
|
26
27
|
getValues: react_hook_form.UseFormGetValues<react_hook_form.FieldValues>;
|
|
27
28
|
setError: react_hook_form.UseFormSetError<react_hook_form.FieldValues>;
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import * as react_hook_form from 'react-hook-form';
|
|
2
|
-
import { FieldError } from 'react-hook-form';
|
|
3
1
|
import * as _fuf_stack_veto from '@fuf-stack/veto';
|
|
4
2
|
import { VetoSchema } from '@fuf-stack/veto';
|
|
5
|
-
import * as
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import * as react_hook_form from 'react-hook-form';
|
|
5
|
+
import { FieldError } from 'react-hook-form';
|
|
6
6
|
|
|
7
|
+
/** Recursive search to check whether a field is required or optional */
|
|
7
8
|
declare const recursiveFieldKeySearch: (schema: VetoSchema, path: string[]) => boolean | null;
|
|
8
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Custom hook that extends react-hook-form's useFormContext to add validation and state management.
|
|
11
|
+
*/
|
|
9
12
|
declare const useFormContext: () => {
|
|
10
13
|
getFieldState: (name: string, testId?: string) => {
|
|
11
14
|
error: FieldError[] | undefined;
|
|
@@ -16,12 +19,10 @@ declare const useFormContext: () => {
|
|
|
16
19
|
isTouched: boolean;
|
|
17
20
|
isValidating: boolean;
|
|
18
21
|
};
|
|
19
|
-
validation: {
|
|
20
|
-
schema: _fuf_stack_veto_dist_types_d_DhQiwhXl.a;
|
|
21
|
-
validate: <InputType extends _fuf_stack_veto.VetoInput>(input: InputType) => _fuf_stack_veto.VetoError | _fuf_stack_veto.VetoSuccess<any>;
|
|
22
|
-
validateAsync: <InputType extends _fuf_stack_veto.VetoInput>(input: InputType) => Promise<_fuf_stack_veto.VetoError | _fuf_stack_veto.VetoSuccess<any>>;
|
|
23
|
-
} | undefined;
|
|
24
22
|
formState: react_hook_form.FormState<react_hook_form.FieldValues>;
|
|
23
|
+
canSubmit?: boolean | undefined;
|
|
24
|
+
setCanSubmit?: react.Dispatch<react.SetStateAction<boolean>> | undefined;
|
|
25
|
+
validation?: _fuf_stack_veto.VetoInstance;
|
|
25
26
|
watch: react_hook_form.UseFormWatch<react_hook_form.FieldValues>;
|
|
26
27
|
getValues: react_hook_form.UseFormGetValues<react_hook_form.FieldValues>;
|
|
27
28
|
setError: react_hook_form.UseFormSetError<react_hook_form.FieldValues>;
|