@arudovwen/react-form-builder
Version:
A complete form builder for react.
114 lines (111 loc) • 4.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = DataGridOptions;
var _react = _interopRequireWildcard(require("react"));
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); }
function DataGridOptions({
value = [],
onChange,
onGetUrl
}) {
const [dataFields, setDataFields] = (0, _react.useState)(value.length > 0 ? value : [{
id: Date.now(),
field: '',
headerName: '',
type: 'text',
editable: true,
validate: false
}]);
const [url, setUrl] = (0, _react.useState)('');
// Handle input change
const handleChange = (index, key, newValue) => {
const updated = dataFields.map((item, idx) => idx === index ? {
...item,
[key]: newValue
} : item);
setDataFields(updated);
if (onChange) onChange(updated);
};
// Add new column
const addColumn = () => {
const updated = [...dataFields, {
id: Date.now() + Math.random(),
field: '',
headerName: '',
type: 'text',
editable: true,
validate: false
}];
setDataFields(updated);
if (onChange) onChange(updated);
};
// Remove column
const removeColumn = index => {
const updated = dataFields.filter((_, idx) => idx !== index);
setDataFields(updated);
if (onChange) onChange(updated);
};
(0, _react.useEffect)(() => {
onGetUrl(url);
}, [url]);
return /*#__PURE__*/_react.default.createElement("div", {
className: "space-y-2"
}, dataFields.map((field, index) => /*#__PURE__*/_react.default.createElement("div", {
key: field.id
}, /*#__PURE__*/_react.default.createElement("div", {
className: "flex items-center gap-x-4"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "flex-1"
}, /*#__PURE__*/_react.default.createElement("select", {
value: field.type,
onChange: e => handleChange(index, 'type', e.target.value),
className: "w-full px-2 py-1 text-sm border rounded focus:outline-none"
}, /*#__PURE__*/_react.default.createElement("option", {
value: "text"
}, "Text"), /*#__PURE__*/_react.default.createElement("option", {
value: "number"
}, "Number"), /*#__PURE__*/_react.default.createElement("option", {
value: "checkbox"
}, "Checkbox"))), /*#__PURE__*/_react.default.createElement("div", {
className: "flex-1"
}, /*#__PURE__*/_react.default.createElement("input", {
type: "text",
value: field.field,
onChange: e => handleChange(index, 'field', e.target.value),
placeholder: "Field key",
className: "w-full px-2 py-1 text-sm border rounded outline-none ine-none focus:outline-none"
})), /*#__PURE__*/_react.default.createElement("div", {
className: "flex-1"
}, /*#__PURE__*/_react.default.createElement("input", {
type: "text",
value: field.headerName,
onChange: e => handleChange(index, 'headerName', e.target.value),
placeholder: "Header name",
className: "w-full px-2 py-1 text-sm border rounded outline-none focus:outline-none"
})), /*#__PURE__*/_react.default.createElement("label", {
className: "flex items-center mb-0 gap-x-2"
}, /*#__PURE__*/_react.default.createElement("input", {
type: "checkbox",
checked: field.validate,
onChange: e => handleChange(index, 'validate', e.target.checked)
}), "Validate"), /*#__PURE__*/_react.default.createElement("button", {
type: "button",
disabled: dataFields.length === 1,
onClick: () => removeColumn(index),
className: "text-xs text-red-500 focus:outline-none hover:opacity-80 disabled:opacity-40 disabled:cursor-not-allowed"
}, "Remove")), field.validate && /*#__PURE__*/_react.default.createElement("div", {
className: "mt-1"
}, /*#__PURE__*/_react.default.createElement("input", {
placeholder: "Provide validation api url",
className: "w-full px-2 py-1 text-sm border rounded outline-none focus:outline-none",
type: "text",
value: url,
onChange: e => setUrl(e.target.value)
})))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("button", {
type: "button",
onClick: addColumn,
className: "flex items-center mt-2 text-xs font-medium text-gray-700 focuse:outline-none gap-x-1"
}, "Add column")));
}