@arudovwen/react-form-builder
Version:
A complete form builder for react.
77 lines (73 loc) • 3.42 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _reactCurrencyInputField = _interopRequireDefault(require("react-currency-input-field"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
/* eslint-disable no-unused-vars */
const DynamicInputList = ({
initialFields = [],
getValues,
readOnly = false,
tempDefaultValue = {}
}) => {
// Initialize merged fields only once
const [fields, setFields] = (0, _react.useState)([]);
(0, _react.useEffect)(() => {
const tempData = initialFields?.map(field => ({
...field,
value: tempDefaultValue?.[field.key] ?? field.value
}));
setFields(tempData);
}, [initialFields]);
const handleChange = (index, field, newValue) => {
if (readOnly) return;
const updated = [...fields];
updated[index][field] = newValue;
setFields(updated);
// Sync the transformed values immediately on change
const updatedTransformed = updated.reduce((acc, f) => {
if (f.key.trim()) acc[f.key] = f.value;
return acc;
}, {});
// eslint-disable-next-line no-unused-expressions
getValues?.(updatedTransformed);
};
// For debugging or UI preview
const transformedFields = (0, _react.useMemo)(() => fields.reduce((acc, field) => {
if (field.key.trim()) {
acc[field.key] = field.value;
}
return acc;
}, {}), [fields]);
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, fields.map((field, index) => /*#__PURE__*/_react.default.createElement("div", {
key: index,
style: {
marginBottom: 10
}
}, /*#__PURE__*/_react.default.createElement("label", {
className: "block text-sm text-[#686878] darks:!text-white/70 mb-2"
}, field.label), field?.type === 'number' ? /*#__PURE__*/_react.default.createElement(_reactCurrencyInputField.default, {
id: field.key,
placeholder: `Provide ${field.label?.toLowerCase() || 'value'}`,
className: "w-full px-3 py-1 border border-gray-100 rounded outline-none",
decimalsLimit: 6,
defaultValue: field.value,
onValueChange: e => handleChange(index, 'value', e),
disabled: readOnly,
allowNegativeValue: false
}) : /*#__PURE__*/_react.default.createElement("input", {
placeholder: `Provide ${field.label?.toLowerCase() || 'value'}`,
value: field.value,
id: field.key,
name: field.key,
type: field.type,
onChange: e => handleChange(index, 'value', e.target.value),
readOnly: readOnly,
className: "w-full px-3 py-1 border border-gray-100 rounded outline-none"
})))));
};
var _default = exports.default = DynamicInputList;