@arudovwen/react-form-builder
Version:
A complete form builder for react.
74 lines (68 loc) • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = ArithmeticComponentView;
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); }
/* eslint-disable no-unused-vars */
function ArithmeticComponentView({
defaultValue = 0,
onChange,
isReadOnly = false,
mappedFields = [],
resultData = {}
}) {
const [combinedFields, setCombinedFields] = (0, _react.useState)([]);
// ✅ Build combined fields when in edit mode (not read-only)
(0, _react.useEffect)(() => {
if (isReadOnly || !Array.isArray(mappedFields)) return;
const initialFields = mappedFields.map(field => {
const raw = resultData?.[field.field_name] ?? field.value ?? 0;
const numericValue = parseFloat(String(raw).replace(/,/g, '')) || 0;
return {
...field,
value: numericValue
};
});
setCombinedFields(initialFields);
}, [mappedFields, resultData, isReadOnly]);
// ✅ Perform calculation only when not read-only
const calculatedResult = (0, _react.useMemo)(() => {
if (isReadOnly || !combinedFields.length) {
// use previous stored value instead
return parseFloat(String(defaultValue).replace(/,/g, '')) || 0;
}
return combinedFields.reduce((total, {
operation,
value
}, index) => {
const num = parseFloat(value) || 0;
if (index === 0) return num;
switch (operation) {
case '+':
return total + num;
case '-':
return total - num;
case '*':
return total * num;
case '/':
return num === 0 ? NaN : total / num;
default:
return total;
}
}, 0);
}, [combinedFields, isReadOnly, defaultValue]);
// ✅ Notify parent only in edit mode
(0, _react.useEffect)(() => {
if (!isReadOnly && typeof onChange === 'function') {
const safeValue = Number.isFinite(calculatedResult) && !Number.isNaN(calculatedResult) ? calculatedResult.toLocaleString() : '0';
onChange(safeValue);
}
}, [calculatedResult, isReadOnly]);
// ✅ Display value based on mode
const displayValue = Number.isFinite(calculatedResult) && !Number.isNaN(calculatedResult) ? calculatedResult.toLocaleString() : '0';
return /*#__PURE__*/_react.default.createElement("div", {
className: "form-control field-control"
}, displayValue);
}