@insticc/genericform 1.0.11 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -3,435 +3,789 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "Demo", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _Demo["default"];
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "Demo2", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _Demo2["default"];
16
+ }
17
+ });
6
18
  exports["default"] = void 0;
7
- var _react = _interopRequireDefault(require("react"));
8
- var _semanticUiReact = require("semantic-ui-react");
9
- var _shallowequal = _interopRequireDefault(require("shallowequal"));
19
+ var _react = require("react");
20
+ var _reactBootstrap = require("react-bootstrap");
21
+ var _CustomAccordion = _interopRequireDefault(require("./FormFields/CustomAccordion"));
10
22
  var _CustomCheckbox = _interopRequireDefault(require("./FormFields/CustomCheckbox"));
23
+ var _CustomCheckboxGroup = _interopRequireDefault(require("./FormFields/CustomCheckboxGroup"));
24
+ var _CustomComponent = _interopRequireDefault(require("./FormFields/CustomComponent"));
11
25
  var _CustomDatePicker = _interopRequireDefault(require("./FormFields/CustomDatePicker"));
12
26
  var _CustomDropdown = _interopRequireDefault(require("./FormFields/CustomDropdown"));
13
27
  var _CustomInput = _interopRequireDefault(require("./FormFields/CustomInput"));
28
+ var _CustomJson = _interopRequireDefault(require("./FormFields/CustomJson"));
14
29
  var _CustomLabel = _interopRequireDefault(require("./FormFields/CustomLabel"));
30
+ var _CustomMultiDropdown = _interopRequireDefault(require("./FormFields/CustomMultiDropdown"));
15
31
  var _CustomNumberInput = _interopRequireDefault(require("./FormFields/CustomNumberInput"));
16
- var _CustomRadioButton = _interopRequireDefault(require("./FormFields/CustomRadioButton"));
32
+ var _CustomRadioGroup = _interopRequireDefault(require("./FormFields/CustomRadioGroup"));
17
33
  var _CustomSearch = _interopRequireDefault(require("./FormFields/CustomSearch"));
34
+ var _CustomSeparator = _interopRequireDefault(require("./FormFields/CustomSeparator"));
18
35
  var _CustomTextArea = _interopRequireDefault(require("./FormFields/CustomTextArea"));
19
- var _MultipleCheckbox = _interopRequireDefault(require("./FormFields/MultipleCheckbox"));
20
- var _MultipleDropdown = _interopRequireDefault(require("./FormFields/MultipleDropdown"));
21
- var _MultipleRadioButton = _interopRequireDefault(require("./FormFields/MultipleRadioButton"));
22
- var _YearDatePicker = _interopRequireDefault(require("./FormFields/YearDatePicker"));
36
+ var _CustomToggle = _interopRequireDefault(require("./FormFields/CustomToggle"));
37
+ var _Demo = _interopRequireDefault(require("./Demo"));
38
+ var _Demo2 = _interopRequireDefault(require("./Demo2"));
23
39
  require("./index.css");
24
40
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
25
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
26
41
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
42
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
43
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
44
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
45
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
27
46
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
28
47
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
29
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
30
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
31
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
32
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
33
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
34
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
35
- function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
36
- function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
37
- function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
38
- function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
39
- function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
40
- function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
41
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
42
- function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
43
- function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
44
- function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
45
48
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
46
49
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
47
50
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
51
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
52
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
53
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
54
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
55
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
56
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } // #region FormFields
48
57
  require('react-datetime/css/react-datetime.css');
49
- var GenericForm = exports["default"] = /*#__PURE__*/function (_React$Component) {
50
- function GenericForm(props) {
51
- var _this;
52
- _classCallCheck(this, GenericForm);
53
- _this = _callSuper(this, GenericForm, [props]);
54
- _defineProperty(_this, "sortFields", function (fields) {
55
- var grouped = {},
56
- ungrouped = [];
57
- fields.forEach(function (field) {
58
- if (field.group) {
59
- if (!grouped[field.group]) {
60
- grouped[field.group] = [];
61
- }
62
- grouped[field.group].push(field);
63
- } else {
64
- ungrouped.push(field);
65
- }
58
+
59
+ // #region Pure helpers
60
+ var sortFieldsFn = function sortFieldsFn(fields) {
61
+ var grouped = {},
62
+ ungrouped = [];
63
+ fields.forEach(function (field) {
64
+ if (field.group) {
65
+ if (!grouped[field.group]) grouped[field.group] = [];
66
+ grouped[field.group].push(field);
67
+ } else ungrouped.push(field);
68
+ });
69
+ return Object.keys(grouped).sort().flatMap(function (g) {
70
+ return grouped[g];
71
+ }).concat(ungrouped);
72
+ };
73
+ var groupByInline = function groupByInline(fields) {
74
+ var groups = [];
75
+ var buffer = [];
76
+ fields.forEach(function (field, index) {
77
+ if (field.inline) {
78
+ buffer.push({
79
+ field: field,
80
+ index: index
66
81
  });
67
- var sortedGroups = Object.keys(grouped).sort();
68
- var sortedFields = sortedGroups.flatMap(function (group) {
69
- return grouped[group];
70
- }).concat(ungrouped);
71
- _this.setState({
72
- sortedFields: sortedFields
82
+ } else {
83
+ if (buffer.length) {
84
+ groups.push({
85
+ type: 'inline',
86
+ fields: buffer
87
+ });
88
+ buffer = [];
89
+ }
90
+ groups.push({
91
+ type: 'single',
92
+ field: field,
93
+ index: index
73
94
  });
95
+ }
96
+ });
97
+ if (buffer.length) groups.push({
98
+ type: 'inline',
99
+ fields: buffer
100
+ });
101
+ return groups;
102
+ };
103
+
104
+ // #region GenericForm Props
105
+ var GenericForm = function GenericForm(_ref) {
106
+ var _ref$externalData = _ref.externalData,
107
+ externalData = _ref$externalData === void 0 ? {} : _ref$externalData,
108
+ _ref$fields = _ref.fields,
109
+ fields = _ref$fields === void 0 ? [] : _ref$fields,
110
+ title = _ref.title,
111
+ titleIcon = _ref.titleIcon,
112
+ _ref$containerStyle = _ref.containerStyle,
113
+ containerStyle = _ref$containerStyle === void 0 ? {} : _ref$containerStyle,
114
+ formStyle = _ref.formStyle,
115
+ _ref$splitForm = _ref.splitForm,
116
+ splitForm = _ref$splitForm === void 0 ? false : _ref$splitForm,
117
+ splitField = _ref.splitField,
118
+ splitGroup = _ref.splitGroup,
119
+ _ref$disableDefaultCo = _ref.disableDefaultContainer,
120
+ disableDefaultContainer = _ref$disableDefaultCo === void 0 ? false : _ref$disableDefaultCo,
121
+ handleSubmit = _ref.handleSubmit,
122
+ onSubmit = _ref.onSubmit,
123
+ onCancel = _ref.onCancel,
124
+ _ref$haveSaveButton = _ref.haveSaveButton,
125
+ haveSaveButton = _ref$haveSaveButton === void 0 ? true : _ref$haveSaveButton,
126
+ _ref$showSubmit = _ref.showSubmit,
127
+ showSubmit = _ref$showSubmit === void 0 ? true : _ref$showSubmit,
128
+ _ref$showCancel = _ref.showCancel,
129
+ showCancel = _ref$showCancel === void 0 ? true : _ref$showCancel,
130
+ _ref$submitText = _ref.submitText,
131
+ submitText = _ref$submitText === void 0 ? 'Save' : _ref$submitText,
132
+ _ref$cancelText = _ref.cancelText,
133
+ cancelText = _ref$cancelText === void 0 ? 'Cancel' : _ref$cancelText,
134
+ _ref$validateOnChange = _ref.validateOnChange,
135
+ validateOnChange = _ref$validateOnChange === void 0 ? true : _ref$validateOnChange,
136
+ _ref$validateOnSubmit = _ref.validateOnSubmit,
137
+ validateOnSubmit = _ref$validateOnSubmit === void 0 ? true : _ref$validateOnSubmit,
138
+ onDataChange = _ref.onDataChange,
139
+ onFieldChange = _ref.onFieldChange,
140
+ handleSearchChange = _ref.handleSearchChange,
141
+ handleResultSelect = _ref.handleResultSelect,
142
+ resultRenderer = _ref.resultRenderer,
143
+ _ref$customActions = _ref.customActions,
144
+ customActions = _ref$customActions === void 0 ? [] : _ref$customActions,
145
+ _ref$enableModal = _ref.enableModal,
146
+ enableModal = _ref$enableModal === void 0 ? false : _ref$enableModal,
147
+ _ref$modalShow = _ref.modalShow,
148
+ modalShow = _ref$modalShow === void 0 ? false : _ref$modalShow,
149
+ _ref$modalSize = _ref.modalSize,
150
+ modalSize = _ref$modalSize === void 0 ? 'lg' : _ref$modalSize;
151
+ var _useState = (0, _react.useState)([]),
152
+ _useState2 = _slicedToArray(_useState, 2),
153
+ sortedFields = _useState2[0],
154
+ setSortedFields = _useState2[1];
155
+ var _useState3 = (0, _react.useState)({}),
156
+ _useState4 = _slicedToArray(_useState3, 2),
157
+ internalFormData = _useState4[0],
158
+ setInternalFormData = _useState4[1];
159
+ var formDataRef = (0, _react.useRef)({});
160
+ var _useState5 = (0, _react.useState)({}),
161
+ _useState6 = _slicedToArray(_useState5, 2),
162
+ errors = _useState6[0],
163
+ setErrors = _useState6[1];
164
+ var _useState7 = (0, _react.useState)(false),
165
+ _useState8 = _slicedToArray(_useState7, 2),
166
+ isSubmitting = _useState8[0],
167
+ setIsSubmitting = _useState8[1];
168
+ var prevFieldValuesRef = (0, _react.useRef)({});
169
+
170
+ // ── Sync fields ─────────────────────────────────────────────────────────────
171
+ (0, _react.useEffect)(function () {
172
+ var prev = prevFieldValuesRef.current;
173
+ var next = {};
174
+ fields.forEach(function (field) {
175
+ if (field.name !== undefined) next[field.name] = field.value;
74
176
  });
75
- _defineProperty(_this, "reRenderDropdown", function (field) {
76
- var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
77
- var list = _this.state.list;
78
- var toReturn = /*#__PURE__*/_react["default"].createElement(_semanticUiReact.Select, {
79
- style: field.inputStyle ? field.inputStyle : {
80
- maxWidth: 350,
81
- display: 'inline-block',
82
- margin: '0 0 1em'
83
- },
84
- clearable: true,
85
- fluid: true,
86
- search: true,
87
- id: "form-input-" + field.name,
88
- name: field.name,
89
- value: field.value,
90
- options: field.options,
91
- onChange: _this.props.handleChange,
92
- disabled: field.disabled,
93
- upward: field.openUpward,
94
- placeholder: field.placeholder || 'Select option'
95
- });
96
- var findList = list.find(function (l) {
97
- return l.name === field.name;
177
+
178
+ // Detect which field.value props actually changed
179
+ var changed = Object.entries(next).filter(function (_ref2) {
180
+ var _ref3 = _slicedToArray(_ref2, 2),
181
+ name = _ref3[0],
182
+ val = _ref3[1];
183
+ return prev[name] !== val;
184
+ });
185
+ prevFieldValuesRef.current = next;
186
+
187
+ // First mount — initialise everything
188
+ if (Object.keys(prev).length === 0) {
189
+ var data = {};
190
+ fields.forEach(function (field) {
191
+ if (field.name && field.value !== undefined) data[field.name] = field.value;
98
192
  });
99
- if (!findList) {
100
- if (update === true) _this.setState({
101
- list: [].concat(_toConsumableArray(list), [{
102
- name: field.name,
103
- value: toReturn,
104
- props: field.options
105
- }])
106
- });
107
- return toReturn;
108
- } else {
109
- if (field.value !== findList.value.props.value) {
110
- if (update === true) _this.setState({
111
- list: list.map(function (l) {
112
- return l.name === field.name ? _objectSpread(_objectSpread({}, l), {}, {
113
- value: toReturn
114
- }) : l;
115
- })
116
- });
117
- return toReturn;
118
- } else if (field.disabled !== findList.value.props.disabled) {
119
- if (update === true) _this.setState({
120
- list: list.map(function (l) {
121
- return l.name === field.name ? _objectSpread(_objectSpread({}, l), {}, {
122
- value: toReturn
123
- }) : l;
124
- })
193
+ setInternalFormData(data);
194
+ formDataRef.current = data;
195
+ setSortedFields(sortFieldsFn(fields));
196
+ return;
197
+ }
198
+
199
+ // Subsequent renders — only merge fields whose .value changed
200
+ if (changed.length > 0) {
201
+ var patch = Object.fromEntries(changed.filter(function (_ref4) {
202
+ var _ref5 = _slicedToArray(_ref4, 2),
203
+ val = _ref5[1];
204
+ return val !== undefined;
205
+ }).map(function (_ref6) {
206
+ var _ref7 = _slicedToArray(_ref6, 2),
207
+ name = _ref7[0],
208
+ val = _ref7[1];
209
+ return [name, val];
210
+ }));
211
+ setInternalFormData(function (prev) {
212
+ var merged = _objectSpread(_objectSpread({}, prev), patch);
213
+ formDataRef.current = merged;
214
+ if (validateOnChange) {
215
+ setErrors(function (prevErrors) {
216
+ var nextErrors = _objectSpread({}, prevErrors);
217
+ Object.keys(patch).forEach(function (name) {
218
+ var field = fields.find(function (f) {
219
+ return f.name === name;
220
+ });
221
+ if (field) nextErrors[name] = validateField(field, patch[name], merged) || undefined;
222
+ });
223
+ return nextErrors;
125
224
  });
126
- return toReturn;
127
225
  }
128
- return findList.value;
129
- }
130
- });
131
- _defineProperty(_this, "renderContent", function () {
132
- var _this$props = _this.props,
133
- divStyle = _this$props.divStyle,
134
- formStyle = _this$props.formStyle,
135
- _this$props$haveSaveB = _this$props.haveSaveButton,
136
- haveSaveButton = _this$props$haveSaveB === void 0 ? true : _this$props$haveSaveB,
137
- handleSubmit = _this$props.handleSubmit,
138
- _this$props$splitForm = _this$props.splitForm,
139
- splitForm = _this$props$splitForm === void 0 ? false : _this$props$splitForm,
140
- splitField = _this$props.splitField,
141
- splitGroup = _this$props.splitGroup;
142
- var sortedFields = _this.state.sortedFields;
143
-
144
- // Group fields by their group name or 'ungrouped'
145
- var groupedFields = {};
146
- sortedFields.forEach(function (field) {
147
- var group = field.group || 'ungrouped';
148
- if (!groupedFields[group]) groupedFields[group] = [];
149
- groupedFields[group].push(field);
226
+ return merged;
150
227
  });
151
- divStyle = divStyle || {
152
- width: '100%'
153
- };
154
- formStyle = formStyle || {
155
- margin: 'auto'
156
- };
228
+ }
229
+ setSortedFields(sortFieldsFn(fields));
230
+ }, [fields]); // eslint-disable-line react-hooks/exhaustive-deps
157
231
 
158
- // Helper: split array of fields by splitField name
159
- var splitByField = function splitByField(fields) {
160
- var index = fields.findIndex(function (f) {
161
- return f.name === splitField;
162
- });
163
- if (index === -1) {
164
- return {
165
- left: fields,
166
- right: []
167
- }; // No splitField found, all on left
232
+ // #region Validation
233
+ var validateField = (0, _react.useCallback)(function (field, value, currentFormData) {
234
+ if (['hr', 'label', 'component', 'accordion'].includes(field.type)) return null;
235
+ var errs = [];
236
+ if (field.required) {
237
+ var empty = value === undefined || value === null || value === '' || Array.isArray(value) && value.length === 0;
238
+ if (empty) errs.push(field.errorMessage || "".concat(typeof field.label === 'string' && field.label || field.displayName || field.name, " is required"));
239
+ }
240
+ if (field.type === 'email' && value && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) errs.push(field.errorMessage || 'Invalid email format');
241
+ if (field.minLength && value && value.length < field.minLength) errs.push(field.errorMessage || "Minimum ".concat(field.minLength, " characters required"));
242
+ if (field.maxLength && value && value.length > field.maxLength) errs.push(field.errorMessage || "Maximum ".concat(field.maxLength, " characters allowed"));
243
+ if (field.min !== undefined && value !== '' && Number(value) < field.min) errs.push(field.errorMessage || "Minimum value is ".concat(field.min));
244
+ if (field.max !== undefined && value !== '' && Number(value) > field.max) errs.push(field.errorMessage || "Maximum value is ".concat(field.max));
245
+ if (typeof field.validate === 'function') {
246
+ var custom = field.validate(value, currentFormData || internalFormData);
247
+ if (custom) errs.push(custom);
248
+ }
249
+ return errs.length ? errs[0] : null;
250
+ }, [internalFormData]);
251
+ var validateForm = (0, _react.useCallback)(function () {
252
+ if (!validateOnSubmit) return true;
253
+ var newErrors = {};
254
+ var isValid = true;
255
+ fields.forEach(function (field) {
256
+ var hidden = typeof field.hide === 'function' ? field.hide(internalFormData, field) : field.hide;
257
+ if (field.name && !hidden) {
258
+ var _internalFormData$fie;
259
+ var err = validateField(field, (_internalFormData$fie = internalFormData[field.name]) !== null && _internalFormData$fie !== void 0 ? _internalFormData$fie : field.value, internalFormData);
260
+ if (err) {
261
+ newErrors[field.name] = err;
262
+ isValid = false;
168
263
  }
169
- return {
170
- left: fields.slice(0, index + 1),
171
- right: fields.slice(index + 1)
172
- };
173
- };
264
+ }
265
+ });
266
+ setErrors(newErrors);
267
+ return isValid;
268
+ }, [fields, internalFormData, validateField, validateOnSubmit]);
174
269
 
175
- // Helper: render list of fields filtering hidden ones
176
- var renderFields = function renderFields(fields) {
177
- return fields.map(function (field) {
178
- if (!field.hide) {
179
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
180
- key: field.name
181
- }, _this.renderField(field));
182
- }
183
- return null;
184
- });
185
- };
270
+ // #region Field handlers
271
+ var handleFieldChange = (0, _react.useCallback)(function (name, value, field) {
272
+ var _field$onChange;
273
+ var next = _objectSpread(_objectSpread({}, formDataRef.current), {}, _defineProperty({}, name, value));
274
+ formDataRef.current = next;
275
+ setInternalFormData(next);
276
+ if (validateOnChange) {
277
+ var err = validateField(field, value, next);
278
+ setErrors(function (e) {
279
+ return _objectSpread(_objectSpread({}, e), {}, _defineProperty({}, name, err || undefined));
280
+ });
281
+ }
282
+ onDataChange === null || onDataChange === void 0 || onDataChange(next);
283
+ field === null || field === void 0 || (_field$onChange = field.onChange) === null || _field$onChange === void 0 || _field$onChange.call(field, value, next);
284
+ }, [validateOnChange, validateField, onDataChange]);
186
285
 
187
- // If splitting is requested and splitField is provided
188
- if (splitForm && splitField) {
189
- if (splitGroup) {
190
- // Split at the group level
191
- var groups = Object.keys(groupedFields).sort();
286
+ /** onChange(name, value) */
287
+ var fieldHandler = (0, _react.useCallback)(function (field) {
288
+ return function (name, value) {
289
+ handleFieldChange(name, value, field);
290
+ onFieldChange === null || onFieldChange === void 0 || onFieldChange({
291
+ name: name,
292
+ value: value
293
+ });
294
+ };
295
+ }, [handleFieldChange, onFieldChange]);
192
296
 
193
- // Find which group contains the splitField
194
- var splitGroupIndex = groups.findIndex(function (group) {
195
- return groupedFields[group].some(function (f) {
196
- return f.name === splitField;
197
- });
198
- });
199
- if (splitGroupIndex === -1) {
200
- // splitField not found, render normal
201
- return /*#__PURE__*/_react["default"].createElement("div", {
202
- style: divStyle
203
- }, /*#__PURE__*/_react["default"].createElement(_semanticUiReact.Form, {
204
- style: formStyle,
205
- onSubmit: handleSubmit
206
- }, groups.map(function (group) {
207
- return /*#__PURE__*/_react["default"].createElement("div", {
208
- key: group
209
- }, group !== 'ungrouped' && /*#__PURE__*/_react["default"].createElement("h2", null, group), renderFields(groupedFields[group]));
210
- })));
211
- }
297
+ /**
298
+ * date / datetime / time / year fields.
299
+ * Datetime calls onChange(momentObj | string, name) — we normalise to a
300
+ * formatted string before storing so the value is always serialisable.
301
+ *
302
+ * Stored value format:
303
+ * type="date" → "DD/MM/YYYY"
304
+ * type="datetime" "DD/MM/YYYY HH:mm"
305
+ * type="time""HH:mm"
306
+ * type="year" → "YYYY"
307
+ */
308
+ var dateFieldHandler = (0, _react.useCallback)(function (field) {
309
+ return function (momentOrString, name) {
310
+ var scalar = momentOrString;
311
+ if (momentOrString && typeof momentOrString.format === "function") {
312
+ switch (field.type) {
313
+ case "year":
314
+ scalar = momentOrString.format("YYYY");
315
+ break;
316
+ case "time":
317
+ scalar = momentOrString.format("HH:mm");
318
+ break;
319
+ case "datetime":
320
+ scalar = momentOrString.format("DD/MM/YYYY HH:mm");
321
+ break;
322
+ default:
323
+ scalar = momentOrString.format("DD/MM/YYYY");
324
+ }
325
+ }
326
+ handleFieldChange(name, scalar, field);
327
+ onFieldChange === null || onFieldChange === void 0 || onFieldChange({
328
+ name: name,
329
+ value: scalar
330
+ });
331
+ };
332
+ }, [handleFieldChange, onFieldChange]);
212
333
 
213
- // Groups for left and right columns
214
- var leftGroups = groups.slice(0, splitGroupIndex + 1);
215
- var rightGroups = groups.slice(splitGroupIndex + 1);
216
- return /*#__PURE__*/_react["default"].createElement("div", {
217
- style: divStyle
218
- }, /*#__PURE__*/_react["default"].createElement(_semanticUiReact.Form, {
219
- style: formStyle,
220
- onSubmit: handleSubmit
221
- }, /*#__PURE__*/_react["default"].createElement("div", {
222
- className: "form-columns"
223
- }, /*#__PURE__*/_react["default"].createElement("div", {
224
- className: "form-column"
225
- }, leftGroups.map(function (group) {
226
- return /*#__PURE__*/_react["default"].createElement("div", {
227
- key: group
228
- }, group !== 'ungrouped' && /*#__PURE__*/_react["default"].createElement("h2", null, group), renderFields(groupedFields[group]));
229
- })), /*#__PURE__*/_react["default"].createElement("div", {
230
- className: "form-column"
231
- }, rightGroups.map(function (group) {
232
- return /*#__PURE__*/_react["default"].createElement("div", {
233
- key: group
234
- }, group !== 'ungrouped' && /*#__PURE__*/_react["default"].createElement("h2", null, group), renderFields(groupedFields[group]));
235
- })))));
334
+ // ── Form submit ─────────────────────────────────────────────────────────────
335
+ var onFormSubmit = (0, _react.useCallback)(/*#__PURE__*/function () {
336
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(e) {
337
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
338
+ while (1) switch (_context.prev = _context.next) {
339
+ case 0:
340
+ e.preventDefault();
341
+ if (validateForm()) {
342
+ _context.next = 3;
343
+ break;
344
+ }
345
+ return _context.abrupt("return");
346
+ case 3:
347
+ if (!handleSubmit) {
348
+ _context.next = 6;
349
+ break;
350
+ }
351
+ handleSubmit(e);
352
+ return _context.abrupt("return");
353
+ case 6:
354
+ if (onSubmit) {
355
+ _context.next = 8;
356
+ break;
357
+ }
358
+ return _context.abrupt("return");
359
+ case 8:
360
+ setIsSubmitting(true);
361
+ _context.prev = 9;
362
+ _context.next = 12;
363
+ return onSubmit(internalFormData);
364
+ case 12:
365
+ _context.next = 17;
366
+ break;
367
+ case 14:
368
+ _context.prev = 14;
369
+ _context.t0 = _context["catch"](9);
370
+ console.error('GenericForm submission error:', _context.t0);
371
+ case 17:
372
+ _context.prev = 17;
373
+ setIsSubmitting(false);
374
+ return _context.finish(17);
375
+ case 20:
376
+ case "end":
377
+ return _context.stop();
236
378
  }
379
+ }, _callee, null, [[9, 14, 17, 20]]);
380
+ }));
381
+ return function (_x) {
382
+ return _ref8.apply(this, arguments);
383
+ };
384
+ }(), [validateForm, handleSubmit, onSubmit, internalFormData]);
237
385
 
238
- // Split inside each group by splitField
239
- return /*#__PURE__*/_react["default"].createElement("div", {
240
- style: divStyle
241
- }, /*#__PURE__*/_react["default"].createElement(_semanticUiReact.Form, {
242
- style: formStyle,
243
- onSubmit: handleSubmit
244
- }, /*#__PURE__*/_react["default"].createElement("div", {
245
- className: "form-columns"
246
- }, /*#__PURE__*/_react["default"].createElement("div", {
247
- className: "form-column"
248
- }, Object.keys(groupedFields).map(function (group) {
249
- var fields = groupedFields[group];
250
- var _splitByField = splitByField(fields),
251
- left = _splitByField.left;
252
- return /*#__PURE__*/_react["default"].createElement("div", {
253
- key: group
254
- }, group !== 'ungrouped' && /*#__PURE__*/_react["default"].createElement("h2", null, group), renderFields(left));
255
- })), /*#__PURE__*/_react["default"].createElement("div", {
256
- className: "form-column"
257
- }, Object.keys(groupedFields).map(function (group) {
258
- var fields = groupedFields[group];
259
- var _splitByField2 = splitByField(fields),
260
- right = _splitByField2.right;
261
- if (right.length === 0) return null;
262
- return /*#__PURE__*/_react["default"].createElement("div", {
263
- key: group
264
- }, group !== 'ungrouped' && /*#__PURE__*/_react["default"].createElement("h2", null, group), renderFields(right));
265
- })))));
386
+ // ── JSON validation ─────────────────────────────────────────────────────────
387
+ var validateJsonField = (0, _react.useCallback)(function (name, rawValue, isMultipleMode, skipTypeCheck, field) {
388
+ var parseStrict = function parseStrict(str) {
389
+ try {
390
+ return JSON.parse(str);
391
+ } catch (_unused) {
392
+ throw new Error(str.includes("'") ? "Use double quotes instead of single quotes" : 'Invalid JSON format');
266
393
  }
267
-
268
- // Default: no split
269
- return /*#__PURE__*/_react["default"].createElement("div", {
270
- style: divStyle
271
- }, /*#__PURE__*/_react["default"].createElement(_semanticUiReact.Form, {
272
- style: formStyle,
273
- onSubmit: handleSubmit
274
- }, Object.keys(groupedFields).map(function (group) {
275
- return /*#__PURE__*/_react["default"].createElement("div", {
276
- key: group
277
- }, group !== 'ungrouped' && /*#__PURE__*/_react["default"].createElement("h2", null, group), renderFields(groupedFields[group]));
278
- })));
394
+ };
395
+ var parsed;
396
+ try {
397
+ if (isMultipleMode) {
398
+ parsed = parseStrict(rawValue);
399
+ } else if (field.datatype === 'object') {
400
+ parsed = parseStrict(rawValue);
401
+ if (_typeof(parsed) !== 'object' || Array.isArray(parsed)) throw new Error('Expected an object');
402
+ } else if (field.datatype === 'number') {
403
+ var n = Number(rawValue);
404
+ if (Number.isNaN(n)) throw new Error('Expected a number');
405
+ parsed = n;
406
+ } else {
407
+ parsed = rawValue;
408
+ }
409
+ } catch (err) {
410
+ setErrors(function (e) {
411
+ return _objectSpread(_objectSpread({}, e), {}, _defineProperty({}, name, err.message));
412
+ });
413
+ return;
414
+ }
415
+ if (isMultipleMode && !Array.isArray(parsed)) {
416
+ setErrors(function (e) {
417
+ return _objectSpread(_objectSpread({}, e), {}, _defineProperty({}, name, "Multiple mode requires a ".concat(field.datatype, " array")));
418
+ });
419
+ return;
420
+ }
421
+ if (!skipTypeCheck && !isMultipleMode && field.datatype) {
422
+ var actual = Array.isArray(parsed) ? 'array' : _typeof(parsed);
423
+ if (actual !== field.datatype) {
424
+ setErrors(function (e) {
425
+ return _objectSpread(_objectSpread({}, e), {}, _defineProperty({}, name, "Expected ".concat(field.datatype, " but got ").concat(actual)));
426
+ });
427
+ return;
428
+ }
429
+ }
430
+ setErrors(function (e) {
431
+ return _objectSpread(_objectSpread({}, e), {}, _defineProperty({}, name, undefined));
279
432
  });
280
- _defineProperty(_this, "renderField", function (field) {
281
- var _this$props2 = _this.props,
282
- handleChange = _this$props2.handleChange,
283
- onChangeTime = _this$props2.onChangeTime,
284
- onChangeYear = _this$props2.onChangeYear,
285
- handleSearchChange = _this$props2.handleSearchChange,
286
- handleResultSelect = _this$props2.handleResultSelect,
287
- resultRenderer = _this$props2.resultRenderer,
288
- handleCheckboxChange = _this$props2.handleCheckboxChange,
289
- handleRadioChange = _this$props2.handleRadioChange,
290
- handleMultipleCheckboxChange = _this$props2.handleMultipleCheckboxChange,
291
- handleMultipleRadioChange = _this$props2.handleMultipleRadioChange;
292
- var componentMap = {
293
- string: _CustomInput["default"],
294
- "int": _CustomNumberInput["default"],
295
- date: _CustomDatePicker["default"],
296
- yearDate: _YearDatePicker["default"],
297
- multipleDropdown: _MultipleDropdown["default"],
298
- search: _CustomSearch["default"],
299
- list: _CustomDropdown["default"],
300
- textArea: _CustomTextArea["default"],
301
- checkbox: _CustomCheckbox["default"],
302
- radioButton: _CustomRadioButton["default"],
303
- multipleCheckboxes: _MultipleCheckbox["default"],
304
- multipleRadioButtons: _MultipleRadioButton["default"],
305
- label: _CustomLabel["default"]
306
- };
307
- var commonProps = {
308
- name: field.name,
309
- displayName: field.displayName,
310
- value: field.value,
311
- disabled: field.disabled,
312
- required: field.required,
313
- style: field.style
314
- };
315
- var additionalProps = {
316
- CustomInput: {
317
- onChange: handleChange,
433
+ if (!field.storeAsString) setInternalFormData(function (prev) {
434
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, parsed));
435
+ });
436
+ }, []);
437
+
438
+ // #region RenderField
439
+ var renderField = (0, _react.useCallback)(function (field) {
440
+ var _internalFormData$fie2;
441
+ var isHidden = typeof field.hide === 'function' ? field.hide(internalFormData, field) : field.hide;
442
+ if (isHidden) return null;
443
+ var error = errors[field.name];
444
+ var value = (_internalFormData$fie2 = internalFormData[field.name]) !== null && _internalFormData$fie2 !== void 0 ? _internalFormData$fie2 : field.value;
445
+
446
+ // Props shared by all interactive fields
447
+ var cp = {
448
+ name: field.name,
449
+ displayName: field.label || field.displayName,
450
+ disabled: field.disabled,
451
+ required: field.required
452
+ };
453
+ var sp = {
454
+ mainDivStyle: field.style,
455
+ labelStyle: field.labelStyle,
456
+ spanStyle: field.spanStyle,
457
+ inputStyle: field.inputStyle,
458
+ tooltipStyle: field.tooltipStyle
459
+ };
460
+ var fp = {
461
+ error: error,
462
+ tooltip: field.tooltip,
463
+ showHelp: field.showHelp,
464
+ helpText: field.helpText
465
+ };
466
+ switch (field.type) {
467
+ // Abstract
468
+ case 'hr':
469
+ return /*#__PURE__*/React.createElement(_CustomSeparator["default"], {
470
+ key: field.name || "sep-".concat(Math.random()),
471
+ mainDivStyle: field.style
472
+ });
473
+ case 'label':
474
+ return /*#__PURE__*/React.createElement(_CustomLabel["default"], _extends({
475
+ key: field.name
476
+ }, cp, {
477
+ mainDivStyle: field.style,
478
+ labelStyle: field.labelStyle
479
+ }));
480
+
481
+ // Simple
482
+ case 'string':
483
+ case 'text':
484
+ case 'email':
485
+ case 'password':
486
+ return /*#__PURE__*/React.createElement(_CustomInput["default"], _extends({
487
+ key: field.name
488
+ }, cp, sp, fp, {
489
+ value: value,
490
+ type: field.type === 'email' ? 'email' : field.type === 'password' ? 'password' : 'text',
491
+ placeholder: field.placeholder,
492
+ onChange: fieldHandler(field),
318
493
  inputStyle: field.inputStyle,
319
494
  className: field.className
320
- },
321
- CustomNumberInput: {
322
- onChange: handleChange,
323
- showHelp: field.showHelp,
324
- helpText: field.helpText,
325
- tooltip: field.tooltip
326
- },
327
- CustomDatePicker: {
328
- onChange: onChangeTime,
329
- tooltip: field.tooltip
330
- },
331
- YearDatePicker: {
332
- onChange: onChangeYear,
333
- currentMaxYear: field.currentMaxYear
334
- },
335
- MultipleDropdown: {
336
- onChange: handleChange,
337
- options: field.options
338
- },
339
- CustomSearch: {
495
+ }));
496
+ case 'int':
497
+ case 'number':
498
+ return /*#__PURE__*/React.createElement(_CustomNumberInput["default"], _extends({
499
+ key: field.name
500
+ }, cp, sp, fp, {
501
+ value: value,
502
+ placeholder: field.placeholder,
503
+ min: field.min,
504
+ max: field.max,
505
+ step: field.step,
506
+ onChange: fieldHandler(field)
507
+ }));
508
+ case 'textArea':
509
+ return /*#__PURE__*/React.createElement(_CustomTextArea["default"], _extends({
510
+ key: field.name
511
+ }, cp, sp, fp, {
512
+ value: value,
513
+ placeholder: field.placeholder,
514
+ rows: field.rows,
515
+ height: field.height,
516
+ onChange: fieldHandler(field)
517
+ }));
518
+
519
+ // Date
520
+ case 'date':
521
+ case 'datetime':
522
+ case 'time':
523
+ case 'year':
524
+ return /*#__PURE__*/React.createElement(_CustomDatePicker["default"], _extends({
525
+ key: field.name
526
+ }, cp, sp, fp, {
527
+ value: value,
528
+ placeholder: field.placeholder,
529
+ onChange: dateFieldHandler(field),
530
+ dateFormat: field.type === 'time' ? false : field.type === 'year' ? 'YYYY' : 'DD/MM/YYYY',
531
+ timeFormat: field.type === 'datetime' || field.type === 'time' ? 'HH:mm' : false
532
+ }));
533
+
534
+ // Option
535
+ case 'select':
536
+ return /*#__PURE__*/React.createElement(_CustomDropdown["default"], _extends({
537
+ key: field.name
538
+ }, cp, sp, fp, {
539
+ value: value,
540
+ options: field.options,
541
+ placeholder: field.placeholder,
542
+ multiple: field.multiple,
543
+ onChange: function onChange(name, val, fullOption) {
544
+ handleFieldChange(name, val, field);
545
+ onFieldChange === null || onFieldChange === void 0 || onFieldChange({
546
+ name: name,
547
+ value: val,
548
+ option: fullOption
549
+ });
550
+ }
551
+ }));
552
+ case 'multipleDropdown':
553
+ return /*#__PURE__*/React.createElement(_CustomMultiDropdown["default"], _extends({
554
+ key: field.name
555
+ }, cp, sp, fp, {
556
+ value: value,
557
+ options: field.options,
558
+ placeholder: field.placeholder,
559
+ onChange: fieldHandler(field)
560
+ }));
561
+ case 'search':
562
+ return /*#__PURE__*/React.createElement(_CustomSearch["default"], _extends({
563
+ key: field.name
564
+ }, cp, sp, fp, {
565
+ value: value,
566
+ options: field.options,
567
+ placeholder: field.placeholder,
568
+ isLoading: field.isLoading,
340
569
  onChange: handleSearchChange,
341
570
  handleResultSelect: handleResultSelect,
342
- resultRenderer: resultRenderer,
343
- isLoading: field.isLoading,
344
- options: field.options
345
- },
346
- CustomDropdown: {
347
- field: field,
348
- reRenderDropdown: _this.reRenderDropdown
349
- },
350
- CustomTextArea: {
351
- onChange: handleChange,
352
- height: field.height,
353
- tooltip: field.tooltip
354
- },
355
- CustomCheckbox: {
356
- onChange: handleCheckboxChange,
357
- checked: field.checked,
358
- showHelp: field.showHelp,
359
- helpText: field.helpText
360
- },
361
- CustomRadioButton: {
362
- onChange: handleRadioChange,
363
- checked: field.checked,
364
- showHelp: field.showHelp,
365
- helpText: field.helpText
366
- },
367
- MultipleCheckbox: {
368
- onChange: handleMultipleCheckboxChange,
571
+ resultRenderer: resultRenderer
572
+ }));
573
+ case 'accordion':
574
+ return /*#__PURE__*/React.createElement(_CustomAccordion["default"], {
575
+ key: field.name,
576
+ name: field.name,
577
+ sections: field.sections,
578
+ defaultOpen: field.defaultOpen,
579
+ activeAllIndex: field.activeAllIndex,
580
+ mainDivStyle: field.style,
581
+ inputStyle: field.inputStyle
582
+ });
583
+ case 'toggle':
584
+ return /*#__PURE__*/React.createElement(_CustomToggle["default"], _extends({
585
+ key: field.name
586
+ }, cp, sp, fp, {
587
+ value: !!value,
588
+ onChange: fieldHandler(field)
589
+ }));
590
+ case 'checkbox':
591
+ return /*#__PURE__*/React.createElement(_CustomCheckbox["default"], _extends({
592
+ key: field.name
593
+ }, cp, sp, fp, {
594
+ checked: !!value,
595
+ onChange: fieldHandler(field),
596
+ onOptionChange: field.onOptionChange
597
+ }));
598
+ case 'checkboxGroup':
599
+ return /*#__PURE__*/React.createElement(_CustomCheckboxGroup["default"], _extends({
600
+ key: field.name
601
+ }, cp, sp, fp, {
602
+ checked: value !== null && value !== void 0 ? value : [],
369
603
  options: field.options,
370
- divStyle: field.divStyle,
371
- labelStyle: field.labelStyle,
372
- checkboxDivStyle: field.checkboxDivStyle
373
- },
374
- MultipleRadioButton: {
375
- onChange: handleMultipleRadioChange,
604
+ onChange: fieldHandler(field),
605
+ onOptionChange: field.onOptionChange
606
+ }));
607
+ case 'radioGroup':
608
+ case 'radioGroupInline':
609
+ return /*#__PURE__*/React.createElement(_CustomRadioGroup["default"], _extends({
610
+ key: field.name
611
+ }, cp, sp, fp, {
612
+ value: value,
376
613
  options: field.options,
377
- divStyle: field.divStyle,
378
- labelStyle: field.labelStyle,
379
- radioButtonDivStyle: field.radioButtonDivStyle,
614
+ inline: field.type === 'radioGroupInline',
615
+ onChange: fieldHandler(field),
616
+ onOptionChange: field.onOptionChange,
617
+ formData: internalFormData
618
+ }));
619
+
620
+ // Other
621
+ case 'component':
622
+ return /*#__PURE__*/React.createElement(_CustomComponent["default"], _extends({
623
+ key: field.name || "cmp-".concat(Math.random())
624
+ }, cp, sp, {
380
625
  component: field.component
381
- },
382
- CustomLabel: {}
383
- };
384
- var Component = componentMap[field.type] || _CustomInput["default"];
385
- return /*#__PURE__*/_react["default"].createElement(Component, _extends({}, commonProps, additionalProps[Component.name] || {}));
626
+ }));
627
+ case 'json':
628
+ return /*#__PURE__*/React.createElement(_CustomJson["default"], _extends({
629
+ key: field.name
630
+ }, cp, sp, fp, {
631
+ value: value,
632
+ datatype: field.datatype,
633
+ allowModeSwitch: field.allowModeSwitch,
634
+ storeAsString: field.storeAsString,
635
+ rows: field.rows,
636
+ onChange: function onChange(name, raw, isMulti) {
637
+ setInternalFormData(function (prev) {
638
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, raw));
639
+ });
640
+ setErrors(function (e) {
641
+ return _objectSpread(_objectSpread({}, e), {}, _defineProperty({}, name, undefined));
642
+ });
643
+ if (raw.trim()) validateJsonField(name, raw, isMulti, true, field);
644
+ },
645
+ onValidate: function onValidate(name, raw, isMulti) {
646
+ return validateJsonField(name, raw, isMulti, false, field);
647
+ }
648
+ }));
649
+ default:
650
+ return /*#__PURE__*/React.createElement(_CustomInput["default"], _extends({
651
+ key: field.name
652
+ }, cp, sp, fp, {
653
+ value: value,
654
+ type: "text",
655
+ placeholder: field.placeholder,
656
+ onChange: fieldHandler(field),
657
+ inputStyle: field.inputStyle,
658
+ className: field.className
659
+ }));
660
+ }
661
+ }, [
662
+ // eslint-disable-line react-hooks/exhaustive-deps
663
+ internalFormData, errors, fieldHandler, fieldHandler, dateFieldHandler, handleSearchChange, handleResultSelect, resultRenderer, validateJsonField]);
664
+
665
+ // #region Grouped fields map
666
+ var groupedFields = (0, _react.useMemo)(function () {
667
+ var map = {};
668
+ sortedFields.forEach(function (field) {
669
+ var g = field.group || 'ungrouped';
670
+ if (!map[g]) map[g] = [];
671
+ map[g].push(field);
386
672
  });
387
- _this.state = {
388
- operations: [{
389
- value: "<",
390
- key: 1,
391
- text: "<"
392
- }, {
393
- value: ">",
394
- key: 2,
395
- text: ">"
396
- }, {
397
- value: "=",
398
- key: 3,
399
- text: "="
400
- }],
401
- list: [{
402
- name: "",
403
- value: "",
404
- options: []
405
- }],
406
- sortedFields: []
673
+ return map;
674
+ }, [sortedFields]);
675
+ var renderFields = function renderFields(fieldList) {
676
+ return groupByInline(fieldList).map(function (group, idx) {
677
+ return group.type === 'inline' ? /*#__PURE__*/React.createElement("div", {
678
+ key: idx,
679
+ className: "ufg-field-row"
680
+ }, group.fields.map(function (_ref9) {
681
+ var field = _ref9.field;
682
+ return renderField(field);
683
+ })) : renderField(group.field);
684
+ });
685
+ };
686
+ var renderGroupSection = function renderGroupSection(g, fieldList) {
687
+ return /*#__PURE__*/React.createElement("div", {
688
+ key: g,
689
+ className: "ufg-form",
690
+ style: formStyle
691
+ }, g !== 'ungrouped' && /*#__PURE__*/React.createElement("h2", null, g), renderFields(fieldList));
692
+ };
693
+ var splitByField = function splitByField(fieldList) {
694
+ var idx = fieldList.findIndex(function (f) {
695
+ return f.name === splitField;
696
+ });
697
+ if (idx === -1) return {
698
+ left: fieldList,
699
+ right: []
407
700
  };
408
- return _this;
409
- }
410
- _inherits(GenericForm, _React$Component);
411
- return _createClass(GenericForm, [{
412
- key: "componentDidMount",
413
- value: function componentDidMount() {
414
- var fields = this.props.fields;
415
- this.sortFields(fields);
416
- }
417
- }, {
418
- key: "componentDidUpdate",
419
- value: function componentDidUpdate(prevProps) {
420
- var _this2 = this;
421
- var fields = this.props.fields;
422
- if (!(0, _shallowequal["default"])(fields, prevProps.fields)) {
423
- fields.forEach(function (element) {
424
- if (element.type === 'list') {
425
- _this2.reRenderDropdown(element, true);
426
- }
701
+ return {
702
+ left: fieldList.slice(0, idx + 1),
703
+ right: fieldList.slice(idx + 1)
704
+ };
705
+ };
706
+ var buildContent = function buildContent() {
707
+ var groups = Object.keys(groupedFields);
708
+ if (splitForm && splitField && splitGroup) {
709
+ var splitIdx = groups.findIndex(function (g) {
710
+ return groupedFields[g].some(function (f) {
711
+ return f.name === splitField;
427
712
  });
428
- this.sortFields(fields);
429
- }
713
+ });
714
+ if (splitIdx === -1) return groups.map(function (g) {
715
+ return renderGroupSection(g, groupedFields[g]);
716
+ });
717
+ return /*#__PURE__*/React.createElement("div", {
718
+ className: "ufg-form-columns"
719
+ }, /*#__PURE__*/React.createElement("div", null, groups.slice(0, splitIdx + 1).map(function (g) {
720
+ return renderGroupSection(g, groupedFields[g]);
721
+ })), /*#__PURE__*/React.createElement("div", null, groups.slice(splitIdx + 1).map(function (g) {
722
+ return renderGroupSection(g, groupedFields[g]);
723
+ })));
430
724
  }
431
- }, {
432
- key: "render",
433
- value: function render() {
434
- return /*#__PURE__*/_react["default"].createElement("div", null, this.renderContent());
725
+ if (splitForm && splitField) {
726
+ return /*#__PURE__*/React.createElement("div", {
727
+ className: "ufg-form-columns"
728
+ }, /*#__PURE__*/React.createElement("div", null, groups.map(function (g) {
729
+ return renderGroupSection(g, splitByField(groupedFields[g]).left);
730
+ })), /*#__PURE__*/React.createElement("div", null, groups.map(function (g) {
731
+ var _splitByField = splitByField(groupedFields[g]),
732
+ right = _splitByField.right;
733
+ return right.length ? renderGroupSection(g, right) : null;
734
+ })));
435
735
  }
436
- }]);
437
- }(_react["default"].Component);
736
+ return groups.map(function (g) {
737
+ return renderGroupSection(g, groupedFields[g]);
738
+ });
739
+ };
740
+
741
+ // #endregion
742
+ // #region Actions bar
743
+ var hasErrors = Object.values(errors).some(Boolean);
744
+ var actionsBar = /*#__PURE__*/React.createElement("div", {
745
+ className: "ufg-actions"
746
+ }, customActions.map(function (action, idx) {
747
+ return /*#__PURE__*/React.createElement("button", {
748
+ key: idx,
749
+ type: "button",
750
+ className: "ufg-button ".concat(action.className || 'ufg-button-secondary'),
751
+ onClick: action.onClick,
752
+ disabled: !!action.disabled,
753
+ style: action.style
754
+ }, action.icon, action.label);
755
+ }), showSubmit && haveSaveButton && /*#__PURE__*/React.createElement("button", {
756
+ type: "submit",
757
+ className: "ufg-button ufg-button-primary",
758
+ disabled: isSubmitting || hasErrors
759
+ }, isSubmitting ? 'Saving…' : submitText), onCancel && showCancel && /*#__PURE__*/React.createElement("button", {
760
+ type: "button",
761
+ className: "ufg-button ufg-button-secondary",
762
+ onClick: onCancel
763
+ }, cancelText));
764
+
765
+ // #endregion
766
+ // #region Form JSX
767
+ var formJSX = /*#__PURE__*/React.createElement("form", {
768
+ className: "ufg-form",
769
+ style: formStyle || {
770
+ margin: 'auto'
771
+ },
772
+ onSubmit: onFormSubmit
773
+ }, buildContent(), actionsBar);
774
+ if (enableModal) {
775
+ return /*#__PURE__*/React.createElement(_reactBootstrap.Modal, {
776
+ show: modalShow,
777
+ onHide: onCancel,
778
+ size: modalSize,
779
+ style: containerStyle
780
+ }, /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Header, {
781
+ closeButton: true
782
+ }, /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Title, null, titleIcon, " ", /*#__PURE__*/React.createElement("span", null, title))), /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Body, null, formJSX));
783
+ }
784
+ return /*#__PURE__*/React.createElement("div", {
785
+ className: disableDefaultContainer ? '' : 'ufg-container',
786
+ style: containerStyle
787
+ }, title && /*#__PURE__*/React.createElement("div", {
788
+ className: "ufg-title"
789
+ }, titleIcon, /*#__PURE__*/React.createElement("span", null, title)), formJSX);
790
+ };
791
+ var _default = exports["default"] = GenericForm;