@grandlinex/react-components
Version:
136 lines (135 loc) • 6.15 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importStar(require("react"));
const FormRender_1 = require("./FormRender");
const util_1 = require("../../util");
const LPulse_1 = __importDefault(require("../loading/LPulse"));
const Button_1 = require("../button/Button");
const Grid_1 = require("../Grid/Grid");
const lib_1 = require("../lib");
const FormValidation_1 = require("./FormValidation");
function Form({ title, options, onChange, onSubmit, buttonText, buttonNode, buttonCenter, loading, loadingNode, loadingMessage, defaultState, defaultError, className, compact, }) {
const ui = (0, util_1.useUIContext)();
const [form, setForm] = (0, react_1.useState)(defaultState || (0, FormRender_1.def)(options));
const [spinning, setSpinning] = (0, react_1.useState)(undefined);
const [error, setError] = (0, react_1.useState)(undefined);
const validate = (set) => {
const err = (0, FormValidation_1.requiredFieldValidation)(options, form, ui.translation);
if (set && err) {
setError(err);
}
return err;
};
const updateForm = (key, value) => {
const out = {
...form,
};
out[key] = value;
setForm(out);
if (onChange) {
onChange({
form: out,
setError,
update: setForm,
validateRequired: validate,
changed: { key, value },
clear: () => {
setForm((0, FormRender_1.def)(options));
setError(undefined);
},
});
}
};
const fError = defaultError || error;
const submitForm = () => {
if (onSubmit) {
if (loading) {
setSpinning(true);
}
setError(undefined);
const pre = {};
const fKey = Object.keys(form);
const inpList = (0, FormRender_1.getFormInputs)(options);
for (const key of fKey) {
const opt = inpList?.find((el) => el.key === key)?.beforeSubmit;
if (opt) {
pre[key] = opt(form[key]);
}
else {
pre[key] = form[key];
}
}
onSubmit({
form: pre,
setError,
changed: null,
update: setForm,
validateRequired: validate,
clear: () => {
setForm((0, FormRender_1.def)(options));
setError(undefined);
},
}).then(() => {
if (loading) {
setSpinning(false);
}
});
}
};
return (react_1.default.createElement(Grid_1.Grid, { className: (0, lib_1.classN)(['glx-form', [!!compact, 'glx-form--compact']], className) },
title,
spinning
? loadingNode || react_1.default.createElement(LPulse_1.default, null)
: options.map((el) => {
const elx = el.filter((e) => (e?.showOn ? e.showOn(form) : true));
if (elx.length === 0) {
return null;
}
return (react_1.default.createElement(FormRender_1.FormRow, { key: el.reduce((a, b) => {
if (!b) {
return `${a}_empty`;
}
if (Array.isArray(b)) {
return `${a}_${b.map((dx) => dx.key).join('_')}`;
}
return `${a}_${b.key}`;
}, ''), option: elx, form: form, updateForm: updateForm, submitForm: submitForm, error: fError }));
}),
spinning && loadingMessage ? (react_1.default.createElement("div", { className: "glx-py-12" }, loadingMessage)) : null,
react_1.default.createElement("div", { className: (0, util_1.cnx)('glx-form--row', 'glx-flex-row', 'glx-flex-wrap', 'glx-flex-g-8', [!!buttonCenter, 'glx-flex-center']) }, fError?.global && fError.global.length > 0
? fError.global?.map((er) => {
return (react_1.default.createElement("div", { key: (0, util_1.uuid)(), className: "glx-form--error" },
' ',
react_1.default.createElement("div", null, er),
' '));
})
: null),
onSubmit && !spinning ? (react_1.default.createElement("div", { className: (0, util_1.cnx)('glx-form--button-row', 'glx-flex-row', 'glx-flex-g-4', 'glx-pr-8', [!!buttonCenter, 'glx-flex-center', 'glx-flex-end']) }, buttonNode ? (buttonNode(submitForm)) : (react_1.default.createElement(Button_1.Button, { cancel: true, disabled: spinning || false, onClick: submitForm }, buttonText || ui.translation.get('glx.form.required.submit'))))) : null));
}
exports.default = Form;