UNPKG

styled-hook-form

Version:

React form library for styled-components based on grommet and react-hook-form

170 lines (169 loc) 8.67 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FormBuilder = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = __importStar(require("react")); const form_1 = __importDefault(require("../form")); const styled_components_1 = __importDefault(require("styled-components")); const types_1 = require("./types"); const react_hook_form_1 = require("react-hook-form"); const layouts_1 = require("./layouts"); const internal_context_1 = require("./internal-context"); const shared_1 = require("./layouts/shared"); const remeda_1 = require("remeda"); const comp_1 = require("../utils/comp"); const internal_form_context_1 = require("../form/internal-form-context"); const StyledFormBuilder = styled_components_1.default.div ``; const FormBuilder = react_1.forwardRef((props, ref) => { let { fields: originalFields, children, onSubmit, className, beforeSubmit, model, rows, columns, areas, options, layout = "GRID", editorWrapComponent, autoSubmitTreshould = 500, formMethods, partialForm } = props, rest = __rest(props, ["fields", "children", "onSubmit", "className", "beforeSubmit", "model", "rows", "columns", "areas", "options", "layout", "editorWrapComponent", "autoSubmitTreshould", "formMethods", "partialForm"]); // eslint-disable-next-line react-hooks/exhaustive-deps const fieldsProp = originalFields !== null && originalFields !== void 0 ? originalFields : []; const internalFormContext = react_1.useContext(internal_form_context_1.InternalFormContext); const formContext = react_hook_form_1.useFormContext(); let fields = react_1.useMemo(() => fieldsProp.filter((f) => f.visible === undefined || (f.visible !== undefined && f.visible)), [fieldsProp]); const getAggValues = react_1.useCallback(() => (Object.assign(Object.assign({}, fields .reduce((p, c) => { var _a, _b; return [ ...p, ...(c.type === types_1.FormFieldType.SubForm ? (_b = (_a = c.formProps) === null || _a === void 0 ? void 0 : _a.fields) !== null && _b !== void 0 ? _b : [] : [c]), ]; }, []) .reduce((p, c) => { if (c.name) { react_hook_form_1.set(p, c.name, c.defaultValue); } return p; }, {})), model)), [fields, model]); const isPartialForm = partialForm === true; let [defaultValues, setDefautValues] = react_1.useState(null); const defaultValueRef = react_1.useRef(null); react_1.useEffect(() => { const _aggValues = getAggValues(); if (!defaultValueRef.current || !remeda_1.equals(comp_1.filterProps(defaultValueRef.current, (key) => defaultValueRef.current[key] !== undefined), comp_1.filterProps(_aggValues, (key) => _aggValues[key] !== undefined))) { setDefautValues(_aggValues); defaultValueRef.current = _aggValues; } }, [getAggValues, model, originalFields]); const handleSubmit = isPartialForm ? () => 0 : (values) => __awaiter(void 0, void 0, void 0, function* () { let shoudlSubmit = beforeSubmit ? beforeSubmit(values) : true; if (shoudlSubmit instanceof Promise) { shoudlSubmit = yield shoudlSubmit; } if (shoudlSubmit) { onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit.call(null, values); } }); let submitTriggers = fields .filter((f) => f.submitTrigger) .map((f) => ({ name: f.name, defaultValue: f.defaultValue })); let changeHandlers = fields .filter((f) => f.onChange) .map((f) => ({ name: f.name, defaultValue: f.defaultValue, handler: f.onChange, })); const items = react_1.useMemo(() => { const _items = fields.map((item, index) => { var _a; return (Object.assign(Object.assign({}, item), { order: (_a = item.order) !== null && _a !== void 0 ? _a : index })); }); _items.sort((a, b) => a.order - b.order); return _items; }, [fields]); const nullLayout = (methods, children) => jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: shared_1.renderChildren(children, methods) }, void 0); const renderLayout = (methods) => layout === "GRID" ? layouts_1.gridLayout({ fields: items, methods, rows, columns, areas, children, options, model, editorWrapComponent, }) : layouts_1.customLayout({ layout, children, options, model, editorWrapComponent, fields: items, methods, }); const formBody = isPartialForm ? react_1.default.createElement(react_1.default.Fragment, {}, items.length ? renderLayout(formContext) : nullLayout(formContext, children)) : react_1.default.createElement(form_1.default, Object.assign(Object.assign({}, rest), { options: Object.assign(Object.assign({}, (options !== null && options !== void 0 ? options : {})), { defaultValues }), formMethods, submitTreshould: autoSubmitTreshould, methodsRef: ref, onSubmit: handleSubmit, autoSubmit: (submitTriggers === null || submitTriggers === void 0 ? void 0 : submitTriggers.length) > 0 ? true : false, autoSubmitFields: submitTriggers || [], changeHandlers: changeHandlers }), (_a) => { var methods = __rest(_a, []); return items.length ? renderLayout(methods) : nullLayout(formContext, children); }); react_1.useEffect(() => { // this would be true if this is a partial form if (internalFormContext && isPartialForm) { if (submitTriggers) { internalFormContext.registerAutoSubmitField(submitTriggers); } if (changeHandlers) { internalFormContext.registerChangeHandler(changeHandlers); } } }, [internalFormContext, submitTriggers, changeHandlers, isPartialForm]); return (jsx_runtime_1.jsx(StyledFormBuilder, Object.assign({ className: className }, { children: jsx_runtime_1.jsx(internal_context_1.InternalContextProvider, Object.assign({ formOptions: options, wrapComponent: editorWrapComponent }, { children: formBody }), void 0) }), void 0)); }); exports.FormBuilder = FormBuilder;