@react-typed-forms/schemas 10.1.0 → 10.3.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.
@@ -23,3 +23,4 @@ export declare function CheckButtons({ control, options, labelClass, checkClass,
23
23
  setChecked: (c: Control<any>, o: FieldOption, checked: boolean) => void;
24
24
  }): React.JSX.Element;
25
25
  export declare function setIncluded<A>(array: A[], elem: A, included: boolean): A[];
26
+ export declare function createCheckboxRenderer(options?: CheckRendererOptions): import("../renderers").DataRendererRegistration;
@@ -39,6 +39,7 @@ interface DefaultDataRendererOptions {
39
39
  inputClass?: string;
40
40
  displayOnlyClass?: string;
41
41
  selectOptions?: SelectRendererOptions;
42
+ checkboxOptions?: CheckRendererOptions;
42
43
  checkOptions?: CheckRendererOptions;
43
44
  radioOptions?: CheckRendererOptions;
44
45
  checkListOptions?: CheckRendererOptions;
package/lib/index.js CHANGED
@@ -152,63 +152,53 @@ function isDataGroupRenderer(options) {
152
152
  return options.type === exports.DataRenderType.Group;
153
153
  }
154
154
 
155
- function _extends() {
156
- _extends = Object.assign ? Object.assign.bind() : function (target) {
157
- for (var i = 1; i < arguments.length; i++) {
158
- var source = arguments[i];
159
- for (var key in source) {
160
- if (Object.prototype.hasOwnProperty.call(source, key)) {
161
- target[key] = source[key];
162
- }
163
- }
164
- }
165
- return target;
166
- };
167
- return _extends.apply(this, arguments);
168
- }
169
- function _objectWithoutPropertiesLoose(source, excluded) {
170
- if (source == null) return {};
171
- var target = {};
172
- var sourceKeys = Object.keys(source);
173
- var key, i;
174
- for (i = 0; i < sourceKeys.length; i++) {
175
- key = sourceKeys[i];
176
- if (excluded.indexOf(key) >= 0) continue;
177
- target[key] = source[key];
178
- }
179
- return target;
180
- }
181
- function _unsupportedIterableToArray(o, minLen) {
182
- if (!o) return;
183
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
184
- var n = Object.prototype.toString.call(o).slice(8, -1);
185
- if (n === "Object" && o.constructor) n = o.constructor.name;
186
- if (n === "Map" || n === "Set") return Array.from(o);
187
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
188
- }
189
- function _arrayLikeToArray(arr, len) {
190
- if (len == null || len > arr.length) len = arr.length;
191
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
192
- return arr2;
193
- }
194
- function _createForOfIteratorHelperLoose(o, allowArrayLike) {
195
- var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
196
- if (it) return (it = it.call(o)).next.bind(it);
197
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
198
- if (it) o = it;
199
- var i = 0;
155
+ function _arrayLikeToArray(r, a) {
156
+ (null == a || a > r.length) && (a = r.length);
157
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
158
+ return n;
159
+ }
160
+ function _createForOfIteratorHelperLoose(r, e) {
161
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
162
+ if (t) return (t = t.call(r)).next.bind(t);
163
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
164
+ t && (r = t);
165
+ var o = 0;
200
166
  return function () {
201
- if (i >= o.length) return {
202
- done: true
203
- };
204
- return {
205
- done: false,
206
- value: o[i++]
167
+ return o >= r.length ? {
168
+ done: !0
169
+ } : {
170
+ done: !1,
171
+ value: r[o++]
207
172
  };
208
173
  };
209
174
  }
210
175
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
211
176
  }
177
+ function _extends() {
178
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
179
+ for (var e = 1; e < arguments.length; e++) {
180
+ var t = arguments[e];
181
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
182
+ }
183
+ return n;
184
+ }, _extends.apply(null, arguments);
185
+ }
186
+ function _objectWithoutPropertiesLoose(r, e) {
187
+ if (null == r) return {};
188
+ var t = {};
189
+ for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
190
+ if (e.indexOf(n) >= 0) continue;
191
+ t[n] = r[n];
192
+ }
193
+ return t;
194
+ }
195
+ function _unsupportedIterableToArray(r, a) {
196
+ if (r) {
197
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
198
+ var t = {}.toString.call(r).slice(8, -1);
199
+ 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;
200
+ }
201
+ }
212
202
 
213
203
  function applyDefaultValues(v, fields, doneSet) {
214
204
  var _doneSet;
@@ -323,49 +313,100 @@ function defaultControlForField(sf) {
323
313
  }
324
314
  throw "Unknown schema field";
325
315
  }
326
- function findReferencedControl(field, control) {
327
- if (isDataControl(control) && field === control.field) return control;
328
- if (isGroupControl(control)) {
329
- var _control$children;
330
- if (control.compoundField) return field === control.compoundField ? control : undefined;
331
- return findReferencedControlInArray(field, (_control$children = control.children) != null ? _control$children : []);
316
+ function findControlsForCompound(compound, definition) {
317
+ if (isDataControlDefinition(definition) && compound.field === definition.field) {
318
+ return [definition];
332
319
  }
333
- return undefined;
320
+ if (isGroupControlsDefinition(definition)) {
321
+ var _definition$children$, _definition$children;
322
+ if (definition.compoundField === compound.field) return [definition];
323
+ return (_definition$children$ = (_definition$children = definition.children) == null ? void 0 : _definition$children.flatMap(function (d) {
324
+ return findControlsForCompound(compound, d);
325
+ })) != null ? _definition$children$ : [];
326
+ }
327
+ return [];
334
328
  }
335
- function findReferencedControlInArray(field, controls) {
336
- for (var _iterator = _createForOfIteratorHelperLoose(controls), _step; !(_step = _iterator()).done;) {
337
- var c = _step.value;
338
- var ref = findReferencedControl(field, c);
339
- if (ref) return ref;
329
+ function findCompoundGroups(fields, controls) {
330
+ return Object.fromEntries(fields.filter(isCompoundField).map(function (cf) {
331
+ var groups = controls.flatMap(function (x) {
332
+ return findControlsForCompound(cf, x);
333
+ });
334
+ return [cf.field, {
335
+ groups: groups.concat(findNonDataGroups(groups.flatMap(function (x) {
336
+ var _x$children;
337
+ return (_x$children = x.children) != null ? _x$children : [];
338
+ }))),
339
+ children: findCompoundGroups(cf.children, groups.flatMap(function (x) {
340
+ var _x$children2;
341
+ return (_x$children2 = x.children) != null ? _x$children2 : [];
342
+ }))
343
+ }];
344
+ }));
345
+ }
346
+ function existsInGroups(field, lookup) {
347
+ var itself = lookup.groups.find(function (c) {
348
+ var _c$children;
349
+ return (_c$children = c.children) == null ? void 0 : _c$children.find(function (x) {
350
+ return isDataControlDefinition(x) && x.field === field.field || isGroupControlsDefinition(x) && x.compoundField === field.field;
351
+ });
352
+ });
353
+ if (!itself) return [[field, lookup]];
354
+ if (isCompoundField(field)) {
355
+ var childLookup = lookup.children[field.field];
356
+ if (!childLookup) return [[field, lookup]];
357
+ return field.children.flatMap(function (c) {
358
+ return existsInGroups(c, childLookup);
359
+ });
340
360
  }
341
- return undefined;
361
+ return [];
362
+ }
363
+ function findNonDataGroups(controls) {
364
+ return controls.flatMap(function (control) {
365
+ var _control$children2;
366
+ return isGroupControlsDefinition(control) && !control.compoundField ? [control].concat(findNonDataGroups((_control$children2 = control.children) != null ? _control$children2 : [])) : [];
367
+ });
368
+ }
369
+ function cloneChildren(c) {
370
+ var _c$children2;
371
+ if (c.children) return _extends({}, c, {
372
+ children: (_c$children2 = c.children) == null ? void 0 : _c$children2.map(cloneChildren)
373
+ });
374
+ return c;
342
375
  }
343
376
  function addMissingControls(fields, controls) {
344
- var changes = fields.flatMap(function (x) {
345
- if (fieldHasTag(x, "_NoControl")) return [];
346
- var existing = findReferencedControlInArray(x.field, controls);
347
- if (!existing || isCompoundField(x)) return {
348
- field: x,
349
- existing: existing
350
- };
351
- return [];
377
+ controls = controls.map(cloneChildren);
378
+ var rootMapping = findCompoundGroups(fields, controls);
379
+ var rootGroups = findNonDataGroups([{
380
+ type: exports.ControlDefinitionType.Group,
381
+ children: controls
382
+ }]);
383
+ var rootLookup = {
384
+ children: rootMapping,
385
+ groups: rootGroups
386
+ };
387
+ var missingFields = fields.filter(function (x) {
388
+ return !fieldHasTag(x, "_NoControl");
389
+ }).flatMap(function (x) {
390
+ return existsInGroups(x, rootLookup);
352
391
  });
353
- var changedCompounds = controls.map(function (x) {
354
- var _cf$children;
355
- var ex = changes.find(function (c) {
356
- return c.existing === x;
357
- });
358
- if (!ex) return x;
359
- var cf = x;
360
- return _extends({}, cf, {
361
- children: addMissingControls(ex.field.children, (_cf$children = cf.children) != null ? _cf$children : [])
392
+ missingFields.forEach(function (_ref) {
393
+ var _f$tags, _insertGroup;
394
+ var f = _ref[0],
395
+ lookup = _ref[1];
396
+ var groupToAdd = (_f$tags = f.tags) == null ? void 0 : _f$tags.find(function (x) {
397
+ return x.startsWith("_ControlGroup:");
362
398
  });
399
+ var insertGroup = undefined;
400
+ if (groupToAdd) {
401
+ var groupName = groupToAdd.substring(14);
402
+ insertGroup = lookup.groups.find(function (x) {
403
+ return x.title === groupName;
404
+ });
405
+ }
406
+ if (!insertGroup) insertGroup = lookup.groups[0];
407
+ (_insertGroup = insertGroup) == null || (_insertGroup = _insertGroup.children) == null || _insertGroup.push(defaultControlForField(f));
363
408
  });
364
- return changedCompounds.concat(changes.filter(function (x) {
365
- return !x.existing;
366
- }).map(function (x) {
367
- return defaultControlForField(x.field);
368
- }));
409
+ return controls;
369
410
  }
370
411
  function useUpdatedRef(a) {
371
412
  var r = React.useRef(a);
@@ -482,8 +523,8 @@ function cleanDataForSchema(v, fields) {
482
523
  return out;
483
524
  }
484
525
  function getAllReferencedClasses(c, collectExtra) {
485
- var _c$children, _collectExtra;
486
- var childClasses = (_c$children = c.children) == null ? void 0 : _c$children.flatMap(function (x) {
526
+ var _c$children3, _collectExtra;
527
+ var childClasses = (_c$children3 = c.children) == null ? void 0 : _c$children3.flatMap(function (x) {
487
528
  return getAllReferencedClasses(x, collectExtra);
488
529
  });
489
530
  var tc = clsx__default["default"]([c.styleClass, c.layoutClass, c.labelClass].concat((_collectExtra = collectExtra == null ? void 0 : collectExtra(c)) != null ? _collectExtra : []).map(getOverrideClass));
@@ -553,8 +594,8 @@ function makeHook(runHook, state, deps) {
553
594
  }
554
595
  function useDynamicHooks(hooks) {
555
596
  var hookEntries = Object.entries(hooks);
556
- var deps = hookEntries.map(function (_ref) {
557
- var x = _ref[1];
597
+ var deps = hookEntries.map(function (_ref2) {
598
+ var x = _ref2[1];
558
599
  return toDepString(x.deps);
559
600
  }).join(",");
560
601
  var ref = React.useRef({});
@@ -563,9 +604,9 @@ function useDynamicHooks(hooks) {
563
604
  return s[x[0]] = x[1].state;
564
605
  });
565
606
  return React.useCallback(function (p) {
566
- return Object.fromEntries(hookEntries.map(function (_ref2) {
567
- var f = _ref2[0],
568
- hg = _ref2[1];
607
+ return Object.fromEntries(hookEntries.map(function (_ref3) {
608
+ var f = _ref3[0],
609
+ hg = _ref3[1];
569
610
  return [f, hg.runHook(p, ref.current[f])];
570
611
  }));
571
612
  }, [deps]);
@@ -1577,7 +1618,7 @@ function renderControlLayout(props) {
1577
1618
  }
1578
1619
  return {};
1579
1620
  function renderData(c) {
1580
- var _labelText$value3;
1621
+ var _labelText$value3, _c$children$length, _c$children2;
1581
1622
  if (!field) return {
1582
1623
  children: "No schema field for: " + c.field
1583
1624
  };
@@ -1589,7 +1630,7 @@ function renderControlLayout(props) {
1589
1630
  return {
1590
1631
  processLayout: renderer.renderData(rendererProps),
1591
1632
  label: {
1592
- type: exports.LabelType.Control,
1633
+ type: ((_c$children$length = (_c$children2 = c.children) == null ? void 0 : _c$children2.length) != null ? _c$children$length : 0) > 0 ? exports.LabelType.Group : exports.LabelType.Control,
1593
1634
  label: label,
1594
1635
  forId: rendererProps.id,
1595
1636
  required: c.required,
@@ -1755,6 +1796,9 @@ var defaultTailwindTheme = {
1755
1796
  checkOptions: {
1756
1797
  className: "flex items-center gap-4",
1757
1798
  entryClass: "flex gap-1 items-center"
1799
+ },
1800
+ selectOptions: {
1801
+ emptyText: "<select>"
1758
1802
  }
1759
1803
  }
1760
1804
  };
@@ -2117,6 +2161,7 @@ function createCheckListRenderer(options) {
2117
2161
  type: "checkbox"
2118
2162
  }));
2119
2163
  }, {
2164
+ collection: true,
2120
2165
  renderType: exports.DataRenderType.CheckList
2121
2166
  });
2122
2167
  }
@@ -2182,6 +2227,30 @@ function setIncluded(array, elem, included) {
2182
2227
  return e !== elem;
2183
2228
  });
2184
2229
  }
2230
+ function createCheckboxRenderer(options) {
2231
+ if (options === void 0) {
2232
+ options = {};
2233
+ }
2234
+ return createDataRenderer(function (props, renderer) {
2235
+ return function (p) {
2236
+ return _extends({}, p, {
2237
+ label: undefined,
2238
+ children: /*#__PURE__*/React__default["default"].createElement("div", {
2239
+ className: rendererClass(props.className, options.className)
2240
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
2241
+ className: options.entryClass
2242
+ }, /*#__PURE__*/React__default["default"].createElement(core.Fcheckbox, {
2243
+ id: props.id,
2244
+ control: props.control,
2245
+ style: props.style,
2246
+ className: options.checkClass
2247
+ }), p.label && renderer.renderLabel(p.label, undefined, undefined)))
2248
+ });
2249
+ };
2250
+ }, {
2251
+ renderType: exports.DataRenderType.Checkbox
2252
+ });
2253
+ }
2185
2254
 
2186
2255
  function createDefaultActionRenderer(options) {
2187
2256
  if (options === void 0) {
@@ -2265,10 +2334,11 @@ var DefaultBoolOptions = [{
2265
2334
  value: false
2266
2335
  }];
2267
2336
  function createDefaultDataRenderer(options) {
2268
- var _options$radioOptions, _options$checkListOpt;
2337
+ var _options$checkOptions, _options$radioOptions, _options$checkListOpt;
2269
2338
  if (options === void 0) {
2270
2339
  options = {};
2271
2340
  }
2341
+ var checkboxRenderer = createCheckboxRenderer((_options$checkOptions = options.checkOptions) != null ? _options$checkOptions : options.checkboxOptions);
2272
2342
  var selectRenderer = createSelectRenderer(options.selectOptions);
2273
2343
  var radioRenderer = createRadioRenderer((_options$radioOptions = options.radioOptions) != null ? _options$radioOptions : options.checkOptions);
2274
2344
  var checkListRenderer = createCheckListRenderer((_options$checkListOpt = options.checkListOptions) != null ? _options$checkListOpt : options.checkOptions);
@@ -2332,11 +2402,7 @@ function createDefaultDataRenderer(options) {
2332
2402
  case exports.DataRenderType.Radio:
2333
2403
  return radioRenderer.render(props, renderers);
2334
2404
  case exports.DataRenderType.Checkbox:
2335
- return /*#__PURE__*/React__default["default"].createElement(core.Fcheckbox, {
2336
- style: props.style,
2337
- className: props.className,
2338
- control: props.control
2339
- });
2405
+ return checkboxRenderer.render(props, renderers);
2340
2406
  }
2341
2407
  var placeholder = isTextfieldRenderer(renderOptions) ? renderOptions.placeholder : undefined;
2342
2408
  return /*#__PURE__*/React__default["default"].createElement(ControlInput, {
@@ -2404,10 +2470,10 @@ function createDefaultLabelRenderer(options) {
2404
2470
  labelContainer = _requiredElement$labe.labelContainer;
2405
2471
  return {
2406
2472
  render: function render(props, labelStart, labelEnd) {
2407
- return labelContainer( /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, labelStart, /*#__PURE__*/React__default["default"].createElement("label", {
2473
+ return labelContainer( /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("label", {
2408
2474
  htmlFor: props.forId,
2409
2475
  className: rendererClass(props.className, clsx__default["default"](className, props.type === exports.LabelType.Group && groupLabelClass, props.type === exports.LabelType.Control && controlLabelClass))
2410
- }, props.label, props.required && requiredElement), labelEnd));
2476
+ }, labelStart, props.label, props.required && requiredElement), labelEnd));
2411
2477
  },
2412
2478
  type: "label"
2413
2479
  };
@@ -2617,6 +2683,7 @@ exports.createAction = createAction;
2617
2683
  exports.createAdornmentRenderer = createAdornmentRenderer;
2618
2684
  exports.createArrayRenderer = createArrayRenderer;
2619
2685
  exports.createCheckListRenderer = createCheckListRenderer;
2686
+ exports.createCheckboxRenderer = createCheckboxRenderer;
2620
2687
  exports.createDataRenderer = createDataRenderer;
2621
2688
  exports.createDefaultActionRenderer = createDefaultActionRenderer;
2622
2689
  exports.createDefaultAdornmentRenderer = createDefaultAdornmentRenderer;
@@ -2654,12 +2721,16 @@ exports.dynamicReadonly = dynamicReadonly;
2654
2721
  exports.dynamicVisibility = dynamicVisibility;
2655
2722
  exports.elementValueForField = elementValueForField;
2656
2723
  exports.emptyGroupDefinition = emptyGroupDefinition;
2724
+ exports.existsInGroups = existsInGroups;
2657
2725
  exports.fieldDisplayName = fieldDisplayName;
2658
2726
  exports.fieldEqExpr = fieldEqExpr;
2659
2727
  exports.fieldHasTag = fieldHasTag;
2660
2728
  exports.findChildDefinition = findChildDefinition;
2661
2729
  exports.findCompoundField = findCompoundField;
2730
+ exports.findCompoundGroups = findCompoundGroups;
2731
+ exports.findControlsForCompound = findControlsForCompound;
2662
2732
  exports.findField = findField;
2733
+ exports.findNonDataGroups = findNonDataGroups;
2663
2734
  exports.findScalarField = findScalarField;
2664
2735
  exports.getAllReferencedClasses = getAllReferencedClasses;
2665
2736
  exports.getControlData = getControlData;