@insticc/genericform 1.0.11 → 2.0.1

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/Demo2.js ADDED
@@ -0,0 +1,495 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _react = require("react");
8
+ var _index = _interopRequireDefault(require("./index"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
10
+ 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); }
11
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12
+ 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."); }
13
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
14
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
15
+ 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; }
16
+ 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; }
17
+ 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; }
18
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
19
+ 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); }
20
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
21
+ 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."); }
22
+ 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; } }
23
+ 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; }
24
+ 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; } }
25
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } /**
26
+ * @file Demo2.jsx
27
+ * GenericForm with full external state management.
28
+ *
29
+ * Mount anywhere: <Demo2 />
30
+ */
31
+ // ── Option sets ───────────────────────────────────────────────────────────────
32
+ var COUNTRIES = [{
33
+ value: 'PT',
34
+ text: 'Portugal'
35
+ }, {
36
+ value: 'ES',
37
+ text: 'Spain'
38
+ }, {
39
+ value: 'FR',
40
+ text: 'France'
41
+ }, {
42
+ value: 'DE',
43
+ text: 'Germany'
44
+ }];
45
+ var PRIORITY_OPTIONS = [{
46
+ value: 'low',
47
+ text: 'Low'
48
+ }, {
49
+ value: 'medium',
50
+ text: 'Medium'
51
+ }, {
52
+ value: 'high',
53
+ text: 'High'
54
+ }];
55
+ var CITY_BY_COUNTRY = {
56
+ PT: 'Lisbon',
57
+ ES: 'Madrid',
58
+ FR: 'Paris',
59
+ DE: 'Berlin'
60
+ };
61
+
62
+ // ── Initial values ────────────────────────────────────────────────────────────
63
+ var INITIAL = {
64
+ firstName: '',
65
+ lastName: '',
66
+ email: '',
67
+ age: '',
68
+ country: '',
69
+ city: '',
70
+ priority: 'medium',
71
+ notify: false,
72
+ notifyEmail: '',
73
+ notes: '',
74
+ perms: ['read']
75
+ };
76
+
77
+ // ── Component ─────────────────────────────────────────────────────────────────
78
+ var Demo2 = function Demo2() {
79
+ var _useState = (0, _react.useState)(INITIAL),
80
+ _useState2 = _slicedToArray(_useState, 2),
81
+ formState = _useState2[0],
82
+ setFormState = _useState2[1];
83
+ var _useState3 = (0, _react.useState)([]),
84
+ _useState4 = _slicedToArray(_useState3, 2),
85
+ fieldLog = _useState4[0],
86
+ setFieldLog = _useState4[1];
87
+ var _useState5 = (0, _react.useState)(null),
88
+ _useState6 = _slicedToArray(_useState5, 2),
89
+ submitted = _useState6[0],
90
+ setSubmitted = _useState6[1];
91
+
92
+ // ── Handlers ────────────────────────────────────────────────────────────────
93
+
94
+ // onDataChange — full snapshot; becomes the new formState
95
+ var handleDataChange = (0, _react.useCallback)(function (data) {
96
+ setFormState(data);
97
+ }, []);
98
+
99
+ // onFieldChange — per-field reactions (dependent fields, logging)
100
+ var handleFieldChange = (0, _react.useCallback)(function (_ref) {
101
+ var name = _ref.name,
102
+ value = _ref.value,
103
+ option = _ref.option;
104
+ // Dependent field: auto-fill city when country is selected
105
+ if (name === 'country') {
106
+ setFormState(function (prev) {
107
+ var _CITY_BY_COUNTRY$valu;
108
+ return _objectSpread(_objectSpread({}, prev), {}, {
109
+ city: (_CITY_BY_COUNTRY$valu = CITY_BY_COUNTRY[value]) !== null && _CITY_BY_COUNTRY$valu !== void 0 ? _CITY_BY_COUNTRY$valu : ''
110
+ });
111
+ });
112
+ }
113
+ setFieldLog(function (prev) {
114
+ return [{
115
+ time: new Date().toLocaleTimeString(),
116
+ name: name,
117
+ value: _typeof(value) === 'object' ? JSON.stringify(value) : String(value !== null && value !== void 0 ? value : ''),
118
+ option: option ? JSON.stringify(option) : undefined
119
+ }].concat(_toConsumableArray(prev)).slice(0, 10);
120
+ });
121
+ }, []);
122
+
123
+ // Parent actions that write directly to formState
124
+ var loadProfile = function loadProfile() {
125
+ return setFormState(function (prev) {
126
+ return _objectSpread(_objectSpread({}, prev), {}, {
127
+ firstName: 'Maria',
128
+ lastName: 'Santos',
129
+ email: 'maria@demo.com',
130
+ age: 34,
131
+ country: 'PT',
132
+ city: 'Lisbon',
133
+ priority: 'high',
134
+ notify: true,
135
+ notifyEmail: 'alerts@demo.com'
136
+ });
137
+ });
138
+ };
139
+ var resetForm = function resetForm() {
140
+ return setFormState(INITIAL);
141
+ };
142
+ var clearField = function clearField(name) {
143
+ return setFormState(function (prev) {
144
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, ''));
145
+ });
146
+ };
147
+
148
+ // ── Fields — every value comes from formState ────────────────────────────────
149
+ var fields = [{
150
+ name: 'sep0',
151
+ type: 'hr'
152
+ }, {
153
+ name: 'lbl0',
154
+ type: 'label',
155
+ displayName: 'Personal info'
156
+ }, {
157
+ name: 'firstName',
158
+ type: 'text',
159
+ displayName: 'First name',
160
+ required: true,
161
+ inline: true,
162
+ value: formState.firstName
163
+ }, {
164
+ name: 'lastName',
165
+ type: 'text',
166
+ displayName: 'Last name',
167
+ required: true,
168
+ inline: true,
169
+ value: formState.lastName
170
+ }, {
171
+ name: 'email',
172
+ type: 'email',
173
+ displayName: 'Email',
174
+ required: true,
175
+ value: formState.email,
176
+ validate: function validate(v) {
177
+ return v && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ? 'Invalid email' : null;
178
+ }
179
+ }, {
180
+ name: 'age',
181
+ type: 'int',
182
+ displayName: 'Age',
183
+ value: formState.age,
184
+ min: 0,
185
+ max: 120
186
+ }, {
187
+ name: 'sep1',
188
+ type: 'hr'
189
+ }, {
190
+ name: 'lbl1',
191
+ type: 'label',
192
+ displayName: 'Preferences'
193
+ }, {
194
+ name: 'country',
195
+ type: 'select',
196
+ displayName: 'Country',
197
+ required: true,
198
+ value: formState.country,
199
+ options: COUNTRIES
200
+ }, {
201
+ name: 'city',
202
+ type: 'text',
203
+ displayName: 'City (auto-filled)',
204
+ value: formState.city,
205
+ disabled: true
206
+ }, {
207
+ name: 'priority',
208
+ type: 'radioGroup',
209
+ displayName: 'Priority',
210
+ value: formState.priority,
211
+ options: PRIORITY_OPTIONS
212
+ }, {
213
+ name: 'notify',
214
+ type: 'toggle',
215
+ displayName: 'Enable notifications',
216
+ value: formState.notify
217
+ }, {
218
+ name: 'notifyEmail',
219
+ type: 'email',
220
+ displayName: 'Notification email',
221
+ value: formState.notifyEmail,
222
+ hide: function hide(fd) {
223
+ return !fd.notify;
224
+ },
225
+ validate: function validate(v, fd) {
226
+ return fd.notify && !v ? 'Required when notifications are on' : null;
227
+ }
228
+ }, {
229
+ name: 'sep2',
230
+ type: 'hr'
231
+ }, {
232
+ name: 'notes',
233
+ type: 'textArea',
234
+ displayName: 'Notes',
235
+ value: formState.notes,
236
+ rows: 3,
237
+ maxLength: 500
238
+ }, {
239
+ name: 'sep3',
240
+ type: 'hr'
241
+ }, {
242
+ name: 'lbl3',
243
+ type: 'label',
244
+ displayName: 'Access'
245
+ }, {
246
+ name: 'perms',
247
+ type: 'checkboxGroup',
248
+ displayName: 'Permissions',
249
+ value: formState.perms,
250
+ options: [{
251
+ name: 'read',
252
+ label: 'Read'
253
+ }, {
254
+ name: 'write',
255
+ label: 'Write'
256
+ }, {
257
+ name: 'delete',
258
+ label: 'Delete'
259
+ }]
260
+ }, {
261
+ name: 'sep4',
262
+ type: 'hr'
263
+ }, {
264
+ name: 'lbl4',
265
+ type: 'label',
266
+ displayName: 'Advanced'
267
+ }, {
268
+ name: 'advanced',
269
+ type: 'accordion',
270
+ defaultOpen: false,
271
+ sections: [{
272
+ title: 'Config',
273
+ icon: '⚙️',
274
+ content: /*#__PURE__*/React.createElement("p", {
275
+ style: {
276
+ fontSize: '0.85rem',
277
+ color: '#555'
278
+ }
279
+ }, "Config fields go here.")
280
+ }, {
281
+ title: 'Danger zone',
282
+ icon: '⚠️',
283
+ content: /*#__PURE__*/React.createElement("p", {
284
+ style: {
285
+ fontSize: '0.85rem',
286
+ color: '#db2828'
287
+ }
288
+ }, "Destructive actions.")
289
+ }]
290
+ }];
291
+
292
+ // ── Derived ─────────────────────────────────────────────────────────────────
293
+ var required = ['firstName', 'lastName', 'email', 'country'];
294
+ var filled = required.filter(function (k) {
295
+ return formState[k];
296
+ });
297
+ var pct = Math.round(filled.length / required.length * 100);
298
+
299
+ // ── JSX ─────────────────────────────────────────────────────────────────────
300
+ return /*#__PURE__*/React.createElement("div", {
301
+ style: {
302
+ maxWidth: 960,
303
+ margin: '2rem auto',
304
+ fontFamily: 'sans-serif',
305
+ display: 'grid',
306
+ gridTemplateColumns: '1fr 320px',
307
+ gap: 24,
308
+ alignItems: 'start'
309
+ }
310
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h1", {
311
+ style: {
312
+ fontSize: '1.3rem',
313
+ marginBottom: '0.25rem'
314
+ }
315
+ }, "Demo 2 \u2014 formState as field values"), /*#__PURE__*/React.createElement("p", {
316
+ style: {
317
+ color: '#666',
318
+ fontSize: '0.85rem',
319
+ marginBottom: '1rem'
320
+ }
321
+ }, "Every ", /*#__PURE__*/React.createElement("code", null, "field.value"), " reads from ", /*#__PURE__*/React.createElement("code", null, "formState"), ".", /*#__PURE__*/React.createElement("code", null, "onDataChange"), " keeps it in sync. Parent actions write directly to ", /*#__PURE__*/React.createElement("code", null, "formState"), "."), /*#__PURE__*/React.createElement("div", {
322
+ style: {
323
+ display: 'flex',
324
+ gap: 8,
325
+ marginBottom: '1.25rem',
326
+ flexWrap: 'wrap'
327
+ }
328
+ }, /*#__PURE__*/React.createElement("button", {
329
+ onClick: loadProfile,
330
+ style: {
331
+ padding: '6px 12px',
332
+ fontSize: '0.8rem',
333
+ cursor: 'pointer',
334
+ borderRadius: 5,
335
+ background: '#2185d0',
336
+ color: '#fff',
337
+ border: 'none'
338
+ }
339
+ }, "Load profile"), /*#__PURE__*/React.createElement("button", {
340
+ onClick: function onClick() {
341
+ return clearField('email');
342
+ },
343
+ style: {
344
+ padding: '6px 12px',
345
+ fontSize: '0.8rem',
346
+ cursor: 'pointer',
347
+ borderRadius: 5,
348
+ background: '#fff',
349
+ border: '1px solid #ccc'
350
+ }
351
+ }, "Clear email"), /*#__PURE__*/React.createElement("button", {
352
+ onClick: resetForm,
353
+ style: {
354
+ padding: '6px 12px',
355
+ fontSize: '0.8rem',
356
+ cursor: 'pointer',
357
+ borderRadius: 5,
358
+ background: '#fff',
359
+ border: '1px solid #ccc'
360
+ }
361
+ }, "Reset all")), /*#__PURE__*/React.createElement(_index["default"], {
362
+ title: "User profile",
363
+ fields: fields,
364
+ submitText: "Save profile",
365
+ cancelText: "Reset all",
366
+ validateOnChange: true,
367
+ validateOnSubmit: true,
368
+ onDataChange: handleDataChange,
369
+ onFieldChange: handleFieldChange,
370
+ onSubmit: function onSubmit(data) {
371
+ return setSubmitted(data);
372
+ },
373
+ onCancel: resetForm
374
+ })), /*#__PURE__*/React.createElement("div", {
375
+ style: {
376
+ position: 'sticky',
377
+ top: 16,
378
+ display: 'flex',
379
+ flexDirection: 'column',
380
+ gap: 14
381
+ }
382
+ }, /*#__PURE__*/React.createElement("div", {
383
+ style: {
384
+ background: '#f9f9f9',
385
+ border: '1px solid #e0e0e0',
386
+ borderRadius: 8,
387
+ padding: '12px 14px'
388
+ }
389
+ }, /*#__PURE__*/React.createElement("div", {
390
+ style: {
391
+ fontSize: '0.78rem',
392
+ fontWeight: 600,
393
+ marginBottom: 6,
394
+ color: '#444'
395
+ }
396
+ }, "Required \u2014 ", pct, "%"), /*#__PURE__*/React.createElement("div", {
397
+ style: {
398
+ background: '#e0e0e0',
399
+ borderRadius: 4,
400
+ height: 8,
401
+ overflow: 'hidden'
402
+ }
403
+ }, /*#__PURE__*/React.createElement("div", {
404
+ style: {
405
+ width: "".concat(pct, "%"),
406
+ height: '100%',
407
+ transition: 'width .3s',
408
+ background: pct === 100 ? '#21ba45' : '#2185d0'
409
+ }
410
+ }))), /*#__PURE__*/React.createElement("div", {
411
+ style: {
412
+ background: '#f9f9f9',
413
+ border: '1px solid #e0e0e0',
414
+ borderRadius: 8,
415
+ padding: '12px 14px'
416
+ }
417
+ }, /*#__PURE__*/React.createElement("div", {
418
+ style: {
419
+ fontSize: '0.78rem',
420
+ fontWeight: 600,
421
+ marginBottom: 6,
422
+ color: '#444'
423
+ }
424
+ }, "formState (parent)"), /*#__PURE__*/React.createElement("pre", {
425
+ style: {
426
+ fontSize: '0.7rem',
427
+ maxHeight: 240,
428
+ overflow: 'auto',
429
+ margin: 0,
430
+ color: '#222'
431
+ }
432
+ }, JSON.stringify(formState, null, 2))), /*#__PURE__*/React.createElement("div", {
433
+ style: {
434
+ background: '#f9f9f9',
435
+ border: '1px solid #e0e0e0',
436
+ borderRadius: 8,
437
+ padding: '12px 14px'
438
+ }
439
+ }, /*#__PURE__*/React.createElement("div", {
440
+ style: {
441
+ fontSize: '0.78rem',
442
+ fontWeight: 600,
443
+ marginBottom: 6,
444
+ color: '#444'
445
+ }
446
+ }, "onFieldChange log"), fieldLog.length === 0 ? /*#__PURE__*/React.createElement("p", {
447
+ style: {
448
+ fontSize: '0.75rem',
449
+ color: '#888',
450
+ margin: 0
451
+ }
452
+ }, "No changes yet.") : fieldLog.map(function (e, i) {
453
+ return /*#__PURE__*/React.createElement("div", {
454
+ key: i,
455
+ style: {
456
+ fontSize: '0.7rem',
457
+ borderBottom: '0.5px solid #eee',
458
+ paddingBottom: 3,
459
+ marginBottom: 3
460
+ }
461
+ }, /*#__PURE__*/React.createElement("span", {
462
+ style: {
463
+ color: '#aaa'
464
+ }
465
+ }, e.time), ' ', /*#__PURE__*/React.createElement("strong", null, e.name), " \u2192 ", /*#__PURE__*/React.createElement("code", null, e.value), e.option && /*#__PURE__*/React.createElement("div", {
466
+ style: {
467
+ color: '#888',
468
+ fontSize: '0.65rem'
469
+ }
470
+ }, "option: ", e.option));
471
+ })), submitted && /*#__PURE__*/React.createElement("div", {
472
+ style: {
473
+ background: '#f0f8f0',
474
+ border: '1px solid #b2dfb2',
475
+ borderRadius: 8,
476
+ padding: '12px 14px'
477
+ }
478
+ }, /*#__PURE__*/React.createElement("div", {
479
+ style: {
480
+ fontSize: '0.78rem',
481
+ fontWeight: 600,
482
+ marginBottom: 6,
483
+ color: '#2d6a2d'
484
+ }
485
+ }, "\u2713 Submitted"), /*#__PURE__*/React.createElement("pre", {
486
+ style: {
487
+ fontSize: '0.7rem',
488
+ maxHeight: 200,
489
+ overflow: 'auto',
490
+ margin: 0,
491
+ color: '#222'
492
+ }
493
+ }, JSON.stringify(submitted, null, 2)))));
494
+ };
495
+ var _default = exports["default"] = Demo2;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _propTypes = _interopRequireDefault(require("prop-types"));
8
+ var _react = require("react");
9
+ var _semanticUiReact = require("semantic-ui-react");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
11
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12
+ 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."); }
13
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
14
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
15
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
16
+ 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."); }
17
+ 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; } }
18
+ 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; }
19
+ 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; } }
20
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
21
+ var CustomAccordion = function CustomAccordion(_ref) {
22
+ var name = _ref.name,
23
+ _ref$sections = _ref.sections,
24
+ sections = _ref$sections === void 0 ? [] : _ref$sections,
25
+ _ref$defaultOpen = _ref.defaultOpen,
26
+ defaultOpen = _ref$defaultOpen === void 0 ? false : _ref$defaultOpen,
27
+ _ref$activeAllIndex = _ref.activeAllIndex,
28
+ activeAllIndex = _ref$activeAllIndex === void 0 ? false : _ref$activeAllIndex,
29
+ _ref$mainDivStyle = _ref.mainDivStyle,
30
+ mainDivStyle = _ref$mainDivStyle === void 0 ? {} : _ref$mainDivStyle,
31
+ _ref$inputStyle = _ref.inputStyle,
32
+ inputStyle = _ref$inputStyle === void 0 ? {} : _ref$inputStyle;
33
+ var allIndices = sections.map(function (_, i) {
34
+ return i;
35
+ });
36
+ var _useState = (0, _react.useState)(activeAllIndex ? allIndices : defaultOpen ? [0] : []),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ activeIndex = _useState2[0],
39
+ setActiveIndex = _useState2[1];
40
+ var handleClick = function handleClick(_, _ref2) {
41
+ var index = _ref2.index;
42
+ return setActiveIndex(function (prev) {
43
+ return prev.includes(index) ? prev.filter(function (i) {
44
+ return i !== index;
45
+ }) : [].concat(_toConsumableArray(prev), [index]);
46
+ });
47
+ };
48
+ var renderContent = function renderContent(content) {
49
+ var _content$;
50
+ if (!Array.isArray(content)) return content;
51
+ // Legacy {label, value} row format
52
+ if (content.length > 0 && ((_content$ = content[0]) === null || _content$ === void 0 ? void 0 : _content$.label) !== undefined) {
53
+ return /*#__PURE__*/React.createElement("div", {
54
+ className: "ef-accordion-content"
55
+ }, content.map(function (item, idx) {
56
+ var _item$value;
57
+ return item.label === '---' ? /*#__PURE__*/React.createElement("hr", {
58
+ key: idx
59
+ }) : /*#__PURE__*/React.createElement("div", {
60
+ className: "ef-info-row",
61
+ key: idx
62
+ }, /*#__PURE__*/React.createElement("strong", null, item.label), /*#__PURE__*/React.createElement("span", null, (_item$value = item.value) !== null && _item$value !== void 0 ? _item$value : 'N/A'));
63
+ }));
64
+ }
65
+ return content;
66
+ };
67
+ return /*#__PURE__*/React.createElement("div", {
68
+ id: name,
69
+ style: mainDivStyle
70
+ }, /*#__PURE__*/React.createElement(_semanticUiReact.Accordion, {
71
+ fluid: true,
72
+ styled: true,
73
+ className: "ef-accordion",
74
+ style: inputStyle
75
+ }, sections.map(function (section, index) {
76
+ return /*#__PURE__*/React.createElement("div", {
77
+ key: index
78
+ }, /*#__PURE__*/React.createElement(_semanticUiReact.Accordion.Title, {
79
+ active: activeIndex.includes(index),
80
+ index: index,
81
+ onClick: handleClick
82
+ }, /*#__PURE__*/React.createElement(_semanticUiReact.Icon, {
83
+ name: "dropdown"
84
+ }), section.icon && /*#__PURE__*/React.createElement("span", {
85
+ style: {
86
+ marginRight: 8
87
+ }
88
+ }, section.icon), section.title), /*#__PURE__*/React.createElement(_semanticUiReact.Accordion.Content, {
89
+ active: activeIndex.includes(index)
90
+ }, renderContent(section.content)));
91
+ })));
92
+ };
93
+ CustomAccordion.propTypes = {
94
+ name: _propTypes["default"].string.isRequired,
95
+ sections: _propTypes["default"].arrayOf(_propTypes["default"].shape({
96
+ title: _propTypes["default"].string,
97
+ icon: _propTypes["default"].node,
98
+ content: _propTypes["default"].node
99
+ })),
100
+ accordionStates: _propTypes["default"].object,
101
+ onToggle: _propTypes["default"].func,
102
+ mainDivStyle: _propTypes["default"].object,
103
+ inputStyle: _propTypes["default"].object
104
+ };
105
+ var _default = exports["default"] = CustomAccordion;