@react-typed-forms/schemas 1.0.0-dev.17 → 1.0.0-dev.19

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/lib/index.js CHANGED
@@ -1,9 +1,13 @@
1
1
  var React = require('react');
2
2
  var core = require('@react-typed-forms/core');
3
+ var jsonata = require('jsonata');
4
+ var clsx = require('clsx');
3
5
 
4
6
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
5
7
 
6
8
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
9
+ var jsonata__default = /*#__PURE__*/_interopDefaultLegacy(jsonata);
10
+ var clsx__default = /*#__PURE__*/_interopDefaultLegacy(clsx);
7
11
 
8
12
  function _extends() {
9
13
  _extends = Object.assign ? Object.assign.bind() : function (target) {
@@ -19,6 +23,49 @@ function _extends() {
19
23
  };
20
24
  return _extends.apply(this, arguments);
21
25
  }
26
+ function _objectWithoutPropertiesLoose(source, excluded) {
27
+ if (source == null) return {};
28
+ var target = {};
29
+ var sourceKeys = Object.keys(source);
30
+ var key, i;
31
+ for (i = 0; i < sourceKeys.length; i++) {
32
+ key = sourceKeys[i];
33
+ if (excluded.indexOf(key) >= 0) continue;
34
+ target[key] = source[key];
35
+ }
36
+ return target;
37
+ }
38
+ function _unsupportedIterableToArray(o, minLen) {
39
+ if (!o) return;
40
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
41
+ var n = Object.prototype.toString.call(o).slice(8, -1);
42
+ if (n === "Object" && o.constructor) n = o.constructor.name;
43
+ if (n === "Map" || n === "Set") return Array.from(o);
44
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
45
+ }
46
+ function _arrayLikeToArray(arr, len) {
47
+ if (len == null || len > arr.length) len = arr.length;
48
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
49
+ return arr2;
50
+ }
51
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
52
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
53
+ if (it) return (it = it.call(o)).next.bind(it);
54
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
55
+ if (it) o = it;
56
+ var i = 0;
57
+ return function () {
58
+ if (i >= o.length) return {
59
+ done: true
60
+ };
61
+ return {
62
+ done: false,
63
+ value: o[i++]
64
+ };
65
+ };
66
+ }
67
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
68
+ }
22
69
 
23
70
  exports.FieldType = void 0;
24
71
  (function (FieldType) {
@@ -52,10 +99,18 @@ exports.ExpressionType = void 0;
52
99
  ExpressionType["FieldValue"] = "FieldValue";
53
100
  ExpressionType["UserMatch"] = "UserMatch";
54
101
  })(exports.ExpressionType || (exports.ExpressionType = {}));
102
+ exports.AdornmentPlacement = void 0;
103
+ (function (AdornmentPlacement) {
104
+ AdornmentPlacement["ControlStart"] = "ControlStart";
105
+ AdornmentPlacement["ControlEnd"] = "ControlEnd";
106
+ AdornmentPlacement["LabelStart"] = "LabelStart";
107
+ AdornmentPlacement["LabelEnd"] = "LabelEnd";
108
+ })(exports.AdornmentPlacement || (exports.AdornmentPlacement = {}));
55
109
  exports.ControlAdornmentType = void 0;
56
110
  (function (ControlAdornmentType) {
57
111
  ControlAdornmentType["Tooltip"] = "Tooltip";
58
112
  ControlAdornmentType["Accordion"] = "Accordion";
113
+ ControlAdornmentType["HelpText"] = "HelpText";
59
114
  })(exports.ControlAdornmentType || (exports.ControlAdornmentType = {}));
60
115
  exports.DataRenderType = void 0;
61
116
  (function (DataRenderType) {
@@ -68,6 +123,8 @@ exports.DataRenderType = void 0;
68
123
  DataRenderType["Synchronised"] = "Synchronised";
69
124
  DataRenderType["IconSelector"] = "IconSelector";
70
125
  DataRenderType["DateTime"] = "DateTime";
126
+ DataRenderType["Checkbox"] = "Checkbox";
127
+ DataRenderType["Dropdown"] = "Dropdown";
71
128
  })(exports.DataRenderType || (exports.DataRenderType = {}));
72
129
  exports.SyncTextType = void 0;
73
130
  (function (SyncTextType) {
@@ -86,6 +143,16 @@ exports.DisplayDataType = void 0;
86
143
  DisplayDataType["Text"] = "Text";
87
144
  DisplayDataType["Html"] = "Html";
88
145
  })(exports.DisplayDataType || (exports.DisplayDataType = {}));
146
+ exports.ValidatorType = void 0;
147
+ (function (ValidatorType) {
148
+ ValidatorType["Jsonata"] = "Jsonata";
149
+ ValidatorType["Date"] = "Date";
150
+ })(exports.ValidatorType || (exports.ValidatorType = {}));
151
+ exports.DateComparison = void 0;
152
+ (function (DateComparison) {
153
+ DateComparison["NotBefore"] = "NotBefore";
154
+ DateComparison["NotAfter"] = "NotAfter";
155
+ })(exports.DateComparison || (exports.DateComparison = {}));
89
156
  function isDataControlDefinition(x) {
90
157
  return x.type === exports.ControlDefinitionType.Data;
91
158
  }
@@ -131,6 +198,9 @@ function visibility(expr) {
131
198
  expr: expr
132
199
  };
133
200
  }
201
+ function isGridRenderer(options) {
202
+ return options.type === exports.GroupRenderType.Grid;
203
+ }
134
204
 
135
205
  function buildSchema(def) {
136
206
  return Object.entries(def).map(function (x) {
@@ -206,50 +276,6 @@ function defaultCompoundField(field, displayName, collection) {
206
276
  };
207
277
  }
208
278
 
209
- function fieldHasTag(field, tag) {
210
- var _field$tags;
211
- return Boolean((_field$tags = field.tags) == null ? void 0 : _field$tags.includes(tag));
212
- }
213
- function fieldDisplayName(field) {
214
- var _field$displayName;
215
- return (_field$displayName = field.displayName) != null ? _field$displayName : field.field;
216
- }
217
-
218
- var _FormRendererComponentsContext = null;
219
- function FormRendererComponentsContext() {
220
- if (!_FormRendererComponentsContext) {
221
- _FormRendererComponentsContext = React.createContext(undefined);
222
- }
223
- return _FormRendererComponentsContext;
224
- }
225
- function FormRendererProvider(_ref) {
226
- var _effect = core.useComponentTracking();
227
- try {
228
- var value = _ref.value,
229
- children = _ref.children;
230
- var _FormRendererComponen = FormRendererComponentsContext(),
231
- Provider = _FormRendererComponen.Provider;
232
- return /*#__PURE__*/React__default["default"].createElement(Provider, {
233
- value: value,
234
- children: children
235
- });
236
- } finally {
237
- _effect();
238
- }
239
- }
240
- function useFormRendererComponents() {
241
- var c = React.useContext(FormRendererComponentsContext());
242
- if (!c) {
243
- throw "Need to use FormRendererComponentContext.Provider";
244
- }
245
- return c;
246
- }
247
- function isScalarField(sf) {
248
- return !isCompoundField(sf);
249
- }
250
- function isCompoundField(sf) {
251
- return sf.type === exports.FieldType.Compound;
252
- }
253
279
  function applyDefaultValues(v, fields) {
254
280
  if (!v) return defaultValueForFields(fields);
255
281
  var applyValue = fields.filter(function (x) {
@@ -303,18 +329,142 @@ function findField(fields, field) {
303
329
  return x.field === field;
304
330
  });
305
331
  }
332
+ function isScalarField(sf) {
333
+ return !isCompoundField(sf);
334
+ }
335
+ function isCompoundField(sf) {
336
+ return sf.type === exports.FieldType.Compound;
337
+ }
338
+ function isDataControl(c) {
339
+ return c.type === exports.ControlDefinitionType.Data;
340
+ }
341
+ function isGroupControl(c) {
342
+ return c.type === exports.ControlDefinitionType.Group;
343
+ }
344
+ function fieldHasTag(field, tag) {
345
+ var _field$tags;
346
+ return Boolean((_field$tags = field.tags) == null ? void 0 : _field$tags.includes(tag));
347
+ }
348
+ function fieldDisplayName(field) {
349
+ var _field$displayName;
350
+ return (_field$displayName = field.displayName) != null ? _field$displayName : field.field;
351
+ }
352
+ function hasOptions(o) {
353
+ var _o$options$length, _o$options;
354
+ return ((_o$options$length = (_o$options = o.options) == null ? void 0 : _o$options.length) != null ? _o$options$length : 0) > 0;
355
+ }
356
+ function defaultControlForField(sf) {
357
+ if (isCompoundField(sf)) {
358
+ return {
359
+ type: exports.ControlDefinitionType.Group,
360
+ title: sf.displayName,
361
+ compoundField: sf.field,
362
+ groupOptions: {
363
+ type: exports.GroupRenderType.Grid,
364
+ hideTitle: false
365
+ },
366
+ children: sf.children.map(defaultControlForField)
367
+ };
368
+ } else if (isScalarField(sf)) {
369
+ var _sf$tags;
370
+ var htmlEditor = (_sf$tags = sf.tags) == null ? void 0 : _sf$tags.includes("_HtmlEditor");
371
+ return {
372
+ type: exports.ControlDefinitionType.Data,
373
+ title: sf.displayName,
374
+ field: sf.field,
375
+ required: sf.required,
376
+ renderOptions: {
377
+ type: htmlEditor ? exports.DataRenderType.HtmlEditor : exports.DataRenderType.Standard
378
+ }
379
+ };
380
+ }
381
+ throw "Unknown schema field";
382
+ }
383
+ function findReferencedControl(field, control) {
384
+ if (isDataControl(control) && field === control.field) return control;
385
+ if (isGroupControl(control)) {
386
+ if (control.compoundField) return field === control.compoundField ? control : undefined;
387
+ return findReferencedControlInArray(field, control.children);
388
+ }
389
+ return undefined;
390
+ }
391
+ function findReferencedControlInArray(field, controls) {
392
+ for (var _iterator = _createForOfIteratorHelperLoose(controls), _step; !(_step = _iterator()).done;) {
393
+ var c = _step.value;
394
+ var ref = findReferencedControl(field, c);
395
+ if (ref) return ref;
396
+ }
397
+ return undefined;
398
+ }
399
+ function addMissingControls(fields, controls) {
400
+ var changes = fields.flatMap(function (x) {
401
+ if (fieldHasTag(x, "_NoControl")) return [];
402
+ var existing = findReferencedControlInArray(x.field, controls);
403
+ if (!existing || isCompoundField(x)) return {
404
+ field: x,
405
+ existing: existing
406
+ };
407
+ return [];
408
+ });
409
+ var changedCompounds = controls.map(function (x) {
410
+ var ex = changes.find(function (c) {
411
+ return c.existing === x;
412
+ });
413
+ if (!ex) return x;
414
+ var cf = x;
415
+ return _extends({}, cf, {
416
+ children: addMissingControls(ex.field.children, cf.children)
417
+ });
418
+ });
419
+ return changedCompounds.concat(changes.filter(function (x) {
420
+ return !x.existing;
421
+ }).map(function (x) {
422
+ return defaultControlForField(x.field);
423
+ }));
424
+ }
425
+
426
+ var _FormRendererComponentsContext = null;
427
+ function FormRendererComponentsContext() {
428
+ if (!_FormRendererComponentsContext) {
429
+ _FormRendererComponentsContext = React.createContext(undefined);
430
+ }
431
+ return _FormRendererComponentsContext;
432
+ }
433
+ function FormRendererProvider(_ref) {
434
+ var _effect = core.useComponentTracking();
435
+ try {
436
+ var value = _ref.value,
437
+ children = _ref.children;
438
+ var _FormRendererComponen = FormRendererComponentsContext(),
439
+ Provider = _FormRendererComponen.Provider;
440
+ return /*#__PURE__*/React__default["default"].createElement(Provider, {
441
+ value: value,
442
+ children: children
443
+ });
444
+ } finally {
445
+ _effect();
446
+ }
447
+ }
448
+ function useFormRendererComponents() {
449
+ var c = React.useContext(FormRendererComponentsContext());
450
+ if (!c) {
451
+ throw "Need to use FormRendererComponentContext.Provider";
452
+ }
453
+ return c;
454
+ }
306
455
  function controlTitle(title, field) {
307
456
  return title ? title : fieldDisplayName(field);
308
457
  }
309
- function renderControl(definition, formState, hooks, key, wrapChild) {
458
+ function renderControl(definition, formState, hooks, key) {
310
459
  var fields = formState.fields;
311
460
  return visitControlDefinition(definition, {
312
461
  data: function data(def) {
313
462
  var fieldData = findScalarField(fields, def.field);
314
- if (!fieldData) return /*#__PURE__*/React__default["default"].createElement("h1", null, "No schema field for: ", def.field);
463
+ if (!fieldData) return /*#__PURE__*/React__default["default"].createElement("h1", {
464
+ key: key
465
+ }, "No schema field for: ", def.field);
315
466
  return /*#__PURE__*/React__default["default"].createElement(DataRenderer, {
316
467
  key: key,
317
- wrapElem: wrapElem,
318
468
  formState: formState,
319
469
  hooks: hooks,
320
470
  controlDef: def,
@@ -326,8 +476,7 @@ function renderControl(definition, formState, hooks, key, wrapChild) {
326
476
  key: key,
327
477
  hooks: hooks,
328
478
  groupDef: d,
329
- formState: formState,
330
- wrapElem: wrapElem
479
+ formState: formState
331
480
  });
332
481
  },
333
482
  action: function action(d) {
@@ -335,7 +484,6 @@ function renderControl(definition, formState, hooks, key, wrapChild) {
335
484
  key: key,
336
485
  hooks: hooks,
337
486
  formState: formState,
338
- wrapElem: wrapElem,
339
487
  actionDef: d
340
488
  });
341
489
  },
@@ -344,17 +492,12 @@ function renderControl(definition, formState, hooks, key, wrapChild) {
344
492
  key: key,
345
493
  hooks: hooks,
346
494
  formState: formState,
347
- wrapElem: wrapElem,
348
495
  displayDef: d
349
496
  });
350
497
  }
351
498
  }, function () {
352
499
  return /*#__PURE__*/React__default["default"].createElement("h1", null, "Unknown control: ", definition.type);
353
500
  });
354
- function wrapElem(e) {
355
- var _wrapChild;
356
- return (_wrapChild = wrapChild == null ? void 0 : wrapChild(key, e)) != null ? _wrapChild : e;
357
- }
358
501
  }
359
502
  /** @trackControls */
360
503
  function DataRenderer(_ref2) {
@@ -364,17 +507,10 @@ function DataRenderer(_ref2) {
364
507
  var hooks = _ref2.hooks,
365
508
  formState = _ref2.formState,
366
509
  controlDef = _ref2.controlDef,
367
- wrapElem = _ref2.wrapElem,
368
510
  fieldData = _ref2.fieldData;
369
511
  var renderer = useFormRendererComponents();
370
- var props = hooks.useDataProperties(formState, controlDef, fieldData);
371
- var scalarProps = {
372
- formEditState: formState,
373
- field: fieldData,
374
- definition: controlDef,
375
- properties: props
376
- };
377
- return wrapElem(((_props$customRender = props.customRender) != null ? _props$customRender : renderer.renderData)(scalarProps, props.control, false, renderer));
512
+ var props = hooks.useDataProperties(formState, controlDef, fieldData, renderer);
513
+ return ((_props$customRender = props.customRender) != null ? _props$customRender : renderer.renderData)(props);
378
514
  } finally {
379
515
  _effect2();
380
516
  }
@@ -385,15 +521,11 @@ function ActionRenderer(_ref3) {
385
521
  try {
386
522
  var hooks = _ref3.hooks,
387
523
  formState = _ref3.formState,
388
- wrapElem = _ref3.wrapElem,
389
524
  actionDef = _ref3.actionDef;
390
525
  var _useFormRendererCompo = useFormRendererComponents(),
391
526
  renderAction = _useFormRendererCompo.renderAction;
392
527
  var actionControlProperties = hooks.useActionProperties(formState, actionDef);
393
- return wrapElem(renderAction({
394
- definition: actionDef,
395
- properties: actionControlProperties
396
- }));
528
+ return renderAction(actionControlProperties);
397
529
  } finally {
398
530
  _effect3();
399
531
  }
@@ -404,32 +536,10 @@ function GroupRenderer(_ref4) {
404
536
  try {
405
537
  var hooks = _ref4.hooks,
406
538
  formState = _ref4.formState,
407
- groupDef = _ref4.groupDef,
408
- wrapElem = _ref4.wrapElem;
539
+ groupDef = _ref4.groupDef;
409
540
  var renderers = useFormRendererComponents();
410
- var groupProps = hooks.useGroupProperties(formState, groupDef, hooks);
411
- var compoundField = groupDef.compoundField ? findCompoundField(formState.fields, groupDef.compoundField) : undefined;
412
- if (compoundField) {
413
- return wrapElem(renderers.renderCompound({
414
- definition: groupDef,
415
- field: compoundField,
416
- properties: groupProps,
417
- renderChild: function renderChild(k, c, data, wrapChild) {
418
- return renderControl(c, _extends({}, formState, {
419
- fields: compoundField.children,
420
- data: data
421
- }), groupProps.hooks, k, wrapChild);
422
- }
423
- }, formState.data.fields[compoundField.field], renderers));
424
- }
425
- return wrapElem(renderers.renderGroup({
426
- definition: groupDef,
427
- childCount: groupDef.children.length,
428
- properties: groupProps,
429
- renderChild: function renderChild(c, wrapChild) {
430
- return renderControl(groupDef.children[c], formState, groupProps.hooks, c, wrapChild);
431
- }
432
- }));
541
+ var groupProps = hooks.useGroupProperties(formState, groupDef, hooks, renderers);
542
+ return renderers.renderGroup(groupProps);
433
543
  } finally {
434
544
  _effect4();
435
545
  }
@@ -439,16 +549,12 @@ function DisplayRenderer(_ref5) {
439
549
  var _effect5 = core.useComponentTracking();
440
550
  try {
441
551
  var hooks = _ref5.hooks,
442
- wrapElem = _ref5.wrapElem,
443
552
  formState = _ref5.formState,
444
553
  displayDef = _ref5.displayDef;
445
554
  var _useFormRendererCompo2 = useFormRendererComponents(),
446
555
  renderDisplay = _useFormRendererCompo2.renderDisplay;
447
556
  var displayProps = hooks.useDisplayProperties(formState, displayDef);
448
- return wrapElem(renderDisplay({
449
- definition: displayDef,
450
- properties: displayProps
451
- }));
557
+ return renderDisplay(displayProps);
452
558
  } finally {
453
559
  _effect5();
454
560
  }
@@ -461,30 +567,80 @@ function controlForField(field, formState) {
461
567
  function fieldForControl(c) {
462
568
  return isDataControl(c) ? c.field : isGroupControl(c) ? c.compoundField : undefined;
463
569
  }
464
- function isDataControl(c) {
465
- return c.type === exports.ControlDefinitionType.Data;
570
+ var AlwaysVisible = {
571
+ value: true,
572
+ canChange: false
573
+ };
574
+ function createAction(label, onClick, actionId) {
575
+ return {
576
+ definition: {
577
+ type: exports.ControlDefinitionType.Action,
578
+ actionId: actionId != null ? actionId : label,
579
+ title: label
580
+ },
581
+ visible: AlwaysVisible,
582
+ onClick: onClick
583
+ };
466
584
  }
467
- function isGroupControl(c) {
468
- return c.type === exports.ControlDefinitionType.Group;
585
+ function visitControlData(definition, _ref7, cb) {
586
+ var fields = _ref7.fields,
587
+ _data = _ref7.data;
588
+ return visitControlDefinition(definition, {
589
+ data: function data(def) {
590
+ var fieldData = findScalarField(fields, def.field);
591
+ if (!fieldData) return undefined;
592
+ return cb(def, _data.fields[fieldData.field]);
593
+ },
594
+ group: function group(d) {
595
+ if (d.compoundField) {
596
+ var compound = findCompoundField(fields, d.compoundField);
597
+ if (!compound) return;
598
+ fields = compound.children;
599
+ _data = _data.fields[compound.field];
600
+ }
601
+ var childState = {
602
+ fields: fields,
603
+ data: _data
604
+ };
605
+ for (var _iterator = _createForOfIteratorHelperLoose(d.children), _step; !(_step = _iterator()).done;) {
606
+ var c = _step.value;
607
+ var res = visitControlData(c, childState, cb);
608
+ if (res !== undefined) return res;
609
+ }
610
+ return undefined;
611
+ },
612
+ action: function action(d) {
613
+ return undefined;
614
+ },
615
+ display: function display(d) {
616
+ return undefined;
617
+ }
618
+ }, function () {
619
+ return undefined;
620
+ });
469
621
  }
470
622
 
471
- function useDefaultValue(definition, field, formState, useExpression) {
623
+ function useDefaultValue(definition, field, formState, hooks) {
472
624
  var _definition$dynamic;
473
625
  var valueExpression = (_definition$dynamic = definition.dynamic) == null ? void 0 : _definition$dynamic.find(function (x) {
474
626
  return x.type === exports.DynamicPropertyType.DefaultValue;
475
627
  });
476
628
  if (valueExpression) {
477
- return useExpression(valueExpression.expr, formState);
629
+ return hooks.useExpression(valueExpression.expr, formState).value;
478
630
  }
479
631
  return field.defaultValue;
480
632
  }
481
- function useIsControlVisible(definition, formState, useExpression) {
482
- var _definition$dynamic2, _ref2;
633
+ function useIsControlVisible(definition, formState, hooks) {
634
+ var _definition$dynamic2, _ref2, _onlyForTypes$length;
483
635
  var visibleExpression = (_definition$dynamic2 = definition.dynamic) == null ? void 0 : _definition$dynamic2.find(function (x) {
484
636
  return x.type === exports.DynamicPropertyType.Visible;
485
637
  });
486
638
  if (visibleExpression && visibleExpression.expr) {
487
- return Boolean(useExpression(visibleExpression.expr, formState));
639
+ var exprValue = hooks.useExpression(visibleExpression.expr, formState).value;
640
+ return {
641
+ value: Boolean(exprValue),
642
+ canChange: true
643
+ };
488
644
  }
489
645
  var schemaFields = formState.fields;
490
646
  var _useMemo = React.useMemo(function () {
@@ -503,74 +659,886 @@ function useIsControlVisible(definition, formState, useExpression) {
503
659
  compoundField = _useMemo.compoundField;
504
660
  var fieldName = fieldForControl(definition);
505
661
  var onlyForTypes = (_ref2 = fieldName ? findField(schemaFields, fieldName) : undefined) == null ? void 0 : _ref2.onlyForTypes;
506
- return (!compoundField || compoundField.value != null) && (!onlyForTypes || onlyForTypes.length === 0 || Boolean(typeControl.value && onlyForTypes.includes(typeControl.value)));
662
+ var canChange = Boolean(compoundField || ((_onlyForTypes$length = onlyForTypes == null ? void 0 : onlyForTypes.length) != null ? _onlyForTypes$length : 0) > 0);
663
+ var value = (!compoundField || compoundField.value != null) && (!onlyForTypes || onlyForTypes.length === 0 || Boolean(typeControl.value && onlyForTypes.includes(typeControl.value)));
664
+ return {
665
+ value: value,
666
+ canChange: canChange
667
+ };
507
668
  }
508
- function getDefaultScalarControlProperties(definition, field, visible, defaultValue, control, readonly) {
509
- var _definition$required, _ref3;
669
+ function getDefaultScalarControlProperties(definition, field, visible, defaultValue, control, formState) {
670
+ var _definition$renderOpt, _definition$required, _ref3, _formState$readonly;
510
671
  return {
672
+ definition: definition,
673
+ field: field,
511
674
  defaultValue: defaultValue,
512
675
  options: getOptionsForScalarField(field),
676
+ renderOptions: (_definition$renderOpt = definition.renderOptions) != null ? _definition$renderOpt : {
677
+ type: exports.DataRenderType.Standard
678
+ },
513
679
  required: (_definition$required = definition.required) != null ? _definition$required : false,
514
680
  visible: visible,
515
- readonly: (_ref3 = readonly != null ? readonly : definition.readonly) != null ? _ref3 : false,
516
- control: control
681
+ readonly: (_ref3 = (_formState$readonly = formState.readonly) != null ? _formState$readonly : definition.readonly) != null ? _ref3 : false,
682
+ control: control,
683
+ formState: formState
517
684
  };
518
685
  }
519
686
  function getOptionsForScalarField(field) {
520
- var _field$options, _field$restrictions, _opts$length;
521
- var opts = (_field$options = field.options) != null ? _field$options : (_field$restrictions = field.restrictions) == null ? void 0 : _field$restrictions.options;
687
+ var _opts$length;
688
+ var opts = field.options;
522
689
  if ((_opts$length = opts == null ? void 0 : opts.length) != null ? _opts$length : 0 > 0) {
523
690
  return opts;
524
691
  }
525
692
  return undefined;
526
693
  }
527
- var defaultExpressionHook = function defaultExpressionHook(expr, formState) {
528
- switch (expr.type) {
529
- case exports.ExpressionType.FieldValue:
530
- var fvExpr = expr;
531
- return controlForField(fvExpr.field, formState).value === fvExpr.value;
532
- default:
533
- return undefined;
694
+ function createDefaultSchemaHooks() {
695
+ function useExpression(expr, formState) {
696
+ switch (expr.type) {
697
+ case exports.ExpressionType.Jsonata:
698
+ var jExpr = expr;
699
+ var compiledExpr = React.useMemo(function () {
700
+ return jsonata__default["default"](jExpr.expression);
701
+ }, [jExpr.expression]);
702
+ var control = core.useControl();
703
+ core.useControlEffect(function () {
704
+ return formState.data.value;
705
+ }, function (v) {
706
+ try {
707
+ return Promise.resolve(compiledExpr.evaluate(v)).then(function (_compiledExpr$evaluat) {
708
+ control.value = _compiledExpr$evaluat;
709
+ });
710
+ } catch (e) {
711
+ return Promise.reject(e);
712
+ }
713
+ });
714
+ return control;
715
+ case exports.ExpressionType.FieldValue:
716
+ var fvExpr = expr;
717
+ return core.useComputed(function () {
718
+ var fv = controlForField(fvExpr.field, formState).value;
719
+ return Array.isArray(fv) ? fv.includes(fvExpr.value) : fv === fvExpr.value;
720
+ });
721
+ default:
722
+ return core.useControl(undefined);
723
+ }
724
+ }
725
+ function useValidators(formState, isVisible, control, required, validators) {
726
+ if (required) core.useValidator(control, function (v) {
727
+ return isVisible && (v == null || v == "") ? "Please enter a value" : null;
728
+ }, "required");
729
+ validators == null || validators.forEach(function (v, i) {
730
+ switch (v.type) {
731
+ case exports.ValidatorType.Date:
732
+ processDateValidator(v);
733
+ break;
734
+ case exports.ValidatorType.Jsonata:
735
+ var errorMsg = useExpression(v, formState);
736
+ core.useControlEffect(function () {
737
+ return [isVisible, errorMsg.value];
738
+ }, function (_ref4) {
739
+ var isVisible = _ref4[0],
740
+ msg = _ref4[1];
741
+ return control.setError(v.type + i, isVisible ? msg : null);
742
+ }, true);
743
+ break;
744
+ }
745
+ function processDateValidator(dv) {
746
+ var comparisonDate;
747
+ if (dv.fixedDate) {
748
+ comparisonDate = Date.parse(dv.fixedDate);
749
+ } else {
750
+ var nowDate = new Date();
751
+ comparisonDate = Date.UTC(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate());
752
+ if (dv.daysFromCurrent) {
753
+ comparisonDate += dv.daysFromCurrent * 86400000;
754
+ }
755
+ }
756
+ core.useValidator(control, function (v) {
757
+ if (v) {
758
+ var selDate = Date.parse(v);
759
+ var notAfter = dv.comparison === exports.DateComparison.NotAfter;
760
+ if (notAfter ? selDate > comparisonDate : selDate < comparisonDate) {
761
+ return "Date must not be " + (notAfter ? "after" : "before") + " " + new Date(comparisonDate).toDateString();
762
+ }
763
+ }
764
+ return null;
765
+ }, "date" + i);
766
+ }
767
+ });
534
768
  }
535
- };
536
- function createFormEditHooks(useExpression) {
537
769
  return {
538
770
  useExpression: useExpression,
539
- useDataProperties: function useDataProperties(formState, definition, field) {
540
- var visible = useIsControlVisible(definition, formState, useExpression);
541
- var defaultValue = useDefaultValue(definition, field, formState, useExpression);
771
+ useValidators: useValidators
772
+ };
773
+ }
774
+ var defaultFormEditHooks = createFormEditHooks(createDefaultSchemaHooks());
775
+ function createFormEditHooks(schemaHooks) {
776
+ return {
777
+ schemaHooks: schemaHooks,
778
+ useDataProperties: function useDataProperties(formState, definition, field, renderer) {
779
+ var visible = useIsControlVisible(definition, formState, schemaHooks);
780
+ var isVisible = visible.value && !formState.invisible;
781
+ var defaultValue = useDefaultValue(definition, field, formState, schemaHooks);
542
782
  var scalarControl = formState.data.fields[field.field];
543
783
  React.useEffect(function () {
544
- if (!visible) scalarControl.value = null;else if (scalarControl.current.value == null) {
784
+ if (!isVisible) scalarControl.value = null;else if (scalarControl.current.value == null) {
545
785
  scalarControl.value = defaultValue;
546
786
  }
547
- }, [visible, defaultValue]);
548
- return getDefaultScalarControlProperties(definition, field, visible, defaultValue, scalarControl, formState.readonly);
787
+ }, [isVisible, defaultValue]);
788
+ var dataProps = getDefaultScalarControlProperties(definition, field, visible, defaultValue, scalarControl, formState);
789
+ schemaHooks.useValidators(formState, isVisible, scalarControl, dataProps.required, definition.validators);
790
+ React.useEffect(function () {
791
+ var subscription = scalarControl.subscribe(function (c) {
792
+ return c.touched = true;
793
+ }, core.ControlChange.Validate);
794
+ return function () {
795
+ return scalarControl.unsubscribe(subscription);
796
+ };
797
+ }, []);
798
+ if (!field.collection) return dataProps;
799
+ return _extends({}, dataProps, {
800
+ array: defaultArrayRendererProps(scalarControl, field, definition, dataProps.readonly, function (c) {
801
+ return renderer.renderData(_extends({}, dataProps, {
802
+ control: c
803
+ }));
804
+ })
805
+ });
549
806
  },
550
807
  useDisplayProperties: function useDisplayProperties(fs, definition) {
551
- var visible = useIsControlVisible(definition, fs, useExpression);
808
+ var visible = useIsControlVisible(definition, fs, schemaHooks);
552
809
  return {
553
- visible: visible
810
+ visible: visible,
811
+ definition: definition
554
812
  };
555
813
  },
556
- useGroupProperties: function useGroupProperties(fs, definition, hooks) {
557
- var visible = useIsControlVisible(definition, fs, useExpression);
558
- return {
814
+ useGroupProperties: function useGroupProperties(fs, definition, hooks, renderers) {
815
+ var _definition$groupOpti;
816
+ var visible = useIsControlVisible(definition, fs, schemaHooks);
817
+ var field = definition.compoundField ? findCompoundField(fs.fields, definition.compoundField) : undefined;
818
+ var newFs = _extends({}, fs, {
819
+ fields: field ? field.children : fs.fields,
820
+ data: field ? fs.data.fields[field.field] : fs.data,
821
+ invisible: !visible.value || fs.invisible
822
+ });
823
+ var groupProps = {
559
824
  visible: visible,
560
- hooks: hooks
825
+ hooks: hooks,
826
+ hideTitle: (_definition$groupOpti = definition.groupOptions.hideTitle) != null ? _definition$groupOpti : false,
827
+ childCount: definition.children.length,
828
+ renderChild: function renderChild(i) {
829
+ return renderControl(definition.children[i], newFs, hooks, i);
830
+ },
831
+ definition: definition
561
832
  };
833
+ if (field != null && field.collection) {
834
+ return _extends({}, groupProps, {
835
+ array: defaultArrayRendererProps(newFs.data, field, definition, fs.readonly, function (e) {
836
+ return renderers.renderGroup(_extends({}, groupProps, {
837
+ hideTitle: true,
838
+ renderChild: function renderChild(i) {
839
+ return renderControl(definition.children[i], _extends({}, newFs, {
840
+ data: e
841
+ }), hooks, i);
842
+ }
843
+ }));
844
+ })
845
+ });
846
+ }
847
+ return groupProps;
562
848
  },
563
849
  useActionProperties: function useActionProperties(formState, definition) {
564
- var visible = useIsControlVisible(definition, formState, useExpression);
850
+ var visible = useIsControlVisible(definition, formState, schemaHooks);
565
851
  return {
566
852
  visible: visible,
567
- onClick: function onClick() {}
853
+ onClick: function onClick() {},
854
+ definition: definition
855
+ };
856
+ }
857
+ };
858
+ }
859
+ function defaultArrayRendererProps(control, field, definition, readonly, renderElem) {
860
+ var _control$elements$len, _control$elements;
861
+ return {
862
+ control: control,
863
+ childCount: (_control$elements$len = (_control$elements = control.elements) == null ? void 0 : _control$elements.length) != null ? _control$elements$len : 0,
864
+ field: field,
865
+ definition: definition,
866
+ addAction: !readonly ? {
867
+ definition: {
868
+ title: "Add " + controlTitle(definition.title, field),
869
+ type: exports.ControlDefinitionType.Action,
870
+ actionId: "addElement"
871
+ },
872
+ visible: {
873
+ value: true,
874
+ canChange: false
875
+ },
876
+ onClick: function onClick() {
877
+ return core.addElement(control, elementValueForField(field));
878
+ }
879
+ } : undefined,
880
+ removeAction: !readonly ? function (i) {
881
+ return {
882
+ definition: {
883
+ title: "Remove",
884
+ type: exports.ControlDefinitionType.Action,
885
+ actionId: "removeElement"
886
+ },
887
+ visible: {
888
+ value: true,
889
+ canChange: false
890
+ },
891
+ onClick: function onClick() {
892
+ return core.removeElement(control, control.elements[i]);
893
+ }
568
894
  };
895
+ } : undefined,
896
+ childKey: function childKey(i) {
897
+ return control.elements[i].uniqueId;
898
+ },
899
+ renderChild: function renderChild(i) {
900
+ var c = control.elements[i];
901
+ return /*#__PURE__*/React__default["default"].createElement(React.Fragment, {
902
+ key: c.uniqueId
903
+ }, renderElem(c));
569
904
  }
570
905
  };
571
906
  }
907
+ function useControlsWithDefaults(definition, sf) {
908
+ return React.useMemo(function () {
909
+ return definition.children.length ? definition : _extends({}, definition, {
910
+ children: addMissingControls(sf, [])
911
+ });
912
+ }, [sf, definition]);
913
+ }
914
+
915
+ var _excluded = ["control", "convert"],
916
+ _excluded2 = ["errorText", "value", "onChange"],
917
+ _excluded3 = ["state", "options", "className", "convert", "required", "emptyText", "requiredText"];
918
+ function createFormRenderer(customRenderers, defaultRenderers) {
919
+ var _customRenderers$find, _customRenderers$find2;
920
+ if (customRenderers === void 0) {
921
+ customRenderers = [];
922
+ }
923
+ if (defaultRenderers === void 0) {
924
+ defaultRenderers = createClassStyledRenderers();
925
+ }
926
+ var dataRegistrations = customRenderers.filter(isDataRegistration);
927
+ var adornmentRegistrations = customRenderers.filter(isAdornmentRegistration);
928
+ var labelRenderer = (_customRenderers$find = customRenderers.find(isLabelRegistration)) != null ? _customRenderers$find : defaultRenderers.label;
929
+ var renderVisibility = ((_customRenderers$find2 = customRenderers.find(isVisibilityRegistration)) != null ? _customRenderers$find2 : defaultRenderers.visibility).render;
930
+ var formRenderers = {
931
+ renderAction: renderAction,
932
+ renderData: _renderData,
933
+ renderGroup: _renderGroup,
934
+ renderDisplay: renderDisplay,
935
+ renderLabel: renderLabel,
936
+ renderArray: renderArray,
937
+ renderVisibility: renderVisibility,
938
+ renderAdornment: renderAdornment
939
+ };
940
+ function renderAdornment(props) {
941
+ var _adornmentRegistratio;
942
+ var renderer = (_adornmentRegistratio = adornmentRegistrations.find(function (x) {
943
+ return isOneOf(x.adornmentType, props.definition.type);
944
+ })) != null ? _adornmentRegistratio : defaultRenderers.adornment;
945
+ return renderer.render(props);
946
+ }
947
+ function renderArray(props) {
948
+ return defaultRenderers.array.render(props, formRenderers);
949
+ }
950
+ function renderLabel(props, elem) {
951
+ return labelRenderer.render(props, elem, formRenderers);
952
+ }
953
+ function withAdornments(definition, adornments) {
954
+ var _definition$adornment, _definition$adornment2;
955
+ var rAdornments = adornments ? adornments : (_definition$adornment = (_definition$adornment2 = definition.adornments) == null ? void 0 : _definition$adornment2.map(function (x, i) {
956
+ return renderAdornment({
957
+ definition: x,
958
+ key: i
959
+ });
960
+ })) != null ? _definition$adornment : [];
961
+ function combineAdornments(placement) {
962
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, rAdornments.filter(function (x) {
963
+ return x.child && x.child[0] === placement;
964
+ }).map(function (x) {
965
+ return x.child[1];
966
+ }));
967
+ }
968
+ return [rAdornments, combineAdornments, function (mainElem) {
969
+ return !adornments ? mainElem : rAdornments.reduce(function (e, n) {
970
+ var _n$wrap;
971
+ return (_n$wrap = n.wrap == null ? void 0 : n.wrap(e)) != null ? _n$wrap : e;
972
+ }, mainElem);
973
+ }];
974
+ }
975
+ function _renderData(props, adornments) {
976
+ var _dataRegistrations$fi;
977
+ var definition = props.definition,
978
+ renderType = props.renderOptions.type,
979
+ visible = props.visible,
980
+ required = props.required,
981
+ control = props.control,
982
+ field = props.field;
983
+ var options = hasOptions(props);
984
+ var renderer = (_dataRegistrations$fi = dataRegistrations.find(function (x) {
985
+ var _x$collection, _field$collection, _x$options;
986
+ return ((_x$collection = x.collection) != null ? _x$collection : false) === ((_field$collection = field.collection) != null ? _field$collection : false) && ((_x$options = x.options) != null ? _x$options : false) === options && isOneOf(x.schemaType, field.type) && isOneOf(x.renderType, renderType) && (!x.match || x.match(props));
987
+ })) != null ? _dataRegistrations$fi : defaultRenderers.data;
988
+ var _withAdornments = withAdornments(definition, adornments),
989
+ rAdornments = _withAdornments[0],
990
+ renderAdornment = _withAdornments[1],
991
+ wrapElem = _withAdornments[2];
992
+ return wrapElem(renderer.render(props, createLabel, _extends({}, formRenderers, {
993
+ renderData: function renderData(p) {
994
+ return _renderData(p, rAdornments);
995
+ }
996
+ })));
997
+ function createLabel(labelProps) {
998
+ var _labelProps$title;
999
+ return _extends({
1000
+ visible: visible,
1001
+ required: required,
1002
+ control: control,
1003
+ forId: "c" + control.uniqueId,
1004
+ renderAdornment: renderAdornment
1005
+ }, labelProps, {
1006
+ title: (_labelProps$title = labelProps == null ? void 0 : labelProps.title) != null ? _labelProps$title : controlTitle(definition.title, field)
1007
+ });
1008
+ }
1009
+ }
1010
+ function _renderGroup(props, adornments) {
1011
+ var definition = props.definition,
1012
+ visible = props.visible,
1013
+ field = props.field;
1014
+ var _withAdornments2 = withAdornments(props.definition, adornments),
1015
+ rAdornments = _withAdornments2[0],
1016
+ renderAdornment = _withAdornments2[1],
1017
+ wrapElem = _withAdornments2[2];
1018
+ var title = props.hideTitle ? undefined : field ? controlTitle(definition.title, field) : definition.title;
1019
+ return wrapElem(defaultRenderers.group.render(props, createLabel, _extends({}, formRenderers, {
1020
+ renderGroup: function renderGroup(p) {
1021
+ return _renderGroup(p, rAdornments);
1022
+ }
1023
+ })));
1024
+ function createLabel(labelProps) {
1025
+ return _extends({
1026
+ required: false,
1027
+ visible: visible,
1028
+ group: true,
1029
+ renderAdornment: renderAdornment,
1030
+ title: title
1031
+ }, labelProps);
1032
+ }
1033
+ }
1034
+ function renderAction(props, adornments) {
1035
+ var _customRenderers$find3;
1036
+ var renderer = (_customRenderers$find3 = customRenderers.find(isActionRegistration)) != null ? _customRenderers$find3 : defaultRenderers.action;
1037
+ var _withAdornments3 = withAdornments(props.definition, adornments),
1038
+ wrapElem = _withAdornments3[2];
1039
+ return wrapElem(renderer.render(props, formRenderers));
1040
+ }
1041
+ function renderDisplay(props, adornments) {
1042
+ var _withAdornments4 = withAdornments(props.definition, adornments),
1043
+ wrapElem = _withAdornments4[2];
1044
+ return wrapElem(defaultRenderers.display.render(props, formRenderers));
1045
+ }
1046
+ return formRenderers;
1047
+ }
1048
+ function createDefaultActionRenderer(options) {
1049
+ if (options === void 0) {
1050
+ options = {};
1051
+ }
1052
+ function render(_ref, _ref2) {
1053
+ var visible = _ref.visible,
1054
+ onClick = _ref.onClick,
1055
+ title = _ref.definition.title;
1056
+ var renderVisibility = _ref2.renderVisibility;
1057
+ return renderVisibility(visible, /*#__PURE__*/React__default["default"].createElement("button", {
1058
+ className: options.className,
1059
+ onClick: onClick
1060
+ }, title));
1061
+ }
1062
+ return {
1063
+ render: render,
1064
+ type: "action"
1065
+ };
1066
+ }
1067
+ function createDefaultLabelRenderer(options) {
1068
+ if (options === void 0) {
1069
+ options = {
1070
+ requiredElement: /*#__PURE__*/React__default["default"].createElement("span", null, " *")
1071
+ };
1072
+ }
1073
+ return {
1074
+ render: function render(p, elem, _ref3) {
1075
+ var renderVisibility = _ref3.renderVisibility;
1076
+ return renderVisibility(p.visible, /*#__PURE__*/React__default["default"].createElement(DefaultLabelRenderer, _extends({}, p, options, {
1077
+ children: elem
1078
+ })));
1079
+ },
1080
+ type: "label"
1081
+ };
1082
+ }
1083
+ function DefaultLabelRenderer(_ref4) {
1084
+ var _effect = core.useComponentTracking();
1085
+ try {
1086
+ var className = _ref4.className,
1087
+ labelClass = _ref4.labelClass,
1088
+ title = _ref4.title,
1089
+ forId = _ref4.forId,
1090
+ required = _ref4.required,
1091
+ children = _ref4.children,
1092
+ group = _ref4.group,
1093
+ groupLabelClass = _ref4.groupLabelClass,
1094
+ renderAdornment = _ref4.renderAdornment,
1095
+ requiredElement = _ref4.requiredElement;
1096
+ return title ? /*#__PURE__*/React__default["default"].createElement("div", {
1097
+ className: className
1098
+ }, renderAdornment(exports.AdornmentPlacement.LabelStart), /*#__PURE__*/React__default["default"].createElement("label", {
1099
+ htmlFor: forId,
1100
+ className: clsx__default["default"](labelClass, group && groupLabelClass)
1101
+ }, title, required && requiredElement), renderAdornment(exports.AdornmentPlacement.LabelEnd), renderAdornment(exports.AdornmentPlacement.ControlStart), children, renderAdornment(exports.AdornmentPlacement.ControlEnd)) : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, children);
1102
+ } finally {
1103
+ _effect();
1104
+ }
1105
+ }
1106
+ function createDefaultArrayRenderer(options) {
1107
+ var _ref5 = options != null ? options : {},
1108
+ className = _ref5.className,
1109
+ removableClass = _ref5.removableClass,
1110
+ childClass = _ref5.childClass,
1111
+ removableChildClass = _ref5.removableChildClass,
1112
+ removeActionClass = _ref5.removeActionClass,
1113
+ addActionClass = _ref5.addActionClass;
1114
+ function render(_ref6, _ref7) {
1115
+ var childCount = _ref6.childCount,
1116
+ renderChild = _ref6.renderChild,
1117
+ addAction = _ref6.addAction,
1118
+ removeAction = _ref6.removeAction,
1119
+ childKey = _ref6.childKey;
1120
+ var renderAction = _ref7.renderAction;
1121
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1122
+ className: clsx__default["default"](className, removeAction && removableClass)
1123
+ }, Array.from({
1124
+ length: childCount
1125
+ }, function (_, x) {
1126
+ return removeAction ? /*#__PURE__*/React__default["default"].createElement(React.Fragment, {
1127
+ key: childKey(x)
1128
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1129
+ className: clsx__default["default"](childClass, removableChildClass)
1130
+ }, renderChild(x)), /*#__PURE__*/React__default["default"].createElement("div", {
1131
+ className: removeActionClass
1132
+ }, renderAction(removeAction(x)))) : /*#__PURE__*/React__default["default"].createElement("div", {
1133
+ key: childKey(x),
1134
+ className: childClass
1135
+ }, renderChild(x));
1136
+ })), addAction && /*#__PURE__*/React__default["default"].createElement("div", {
1137
+ className: addActionClass
1138
+ }, renderAction(addAction)));
1139
+ }
1140
+ return {
1141
+ render: render,
1142
+ type: "array"
1143
+ };
1144
+ }
1145
+ function createDefaultGroupRenderer(options) {
1146
+ var _ref8 = options != null ? options : {},
1147
+ className = _ref8.className,
1148
+ _ref8$gridStyles = _ref8.gridStyles,
1149
+ gridStyles = _ref8$gridStyles === void 0 ? defaultGridStyles : _ref8$gridStyles,
1150
+ _ref8$defaultGridColu = _ref8.defaultGridColumns,
1151
+ defaultGridColumns = _ref8$defaultGridColu === void 0 ? 2 : _ref8$defaultGridColu,
1152
+ gridClassName = _ref8.gridClassName,
1153
+ standardClassName = _ref8.standardClassName;
1154
+ function defaultGridStyles(_ref9) {
1155
+ var _ref9$columns = _ref9.columns,
1156
+ columns = _ref9$columns === void 0 ? defaultGridColumns : _ref9$columns;
1157
+ return {
1158
+ className: gridClassName,
1159
+ style: {
1160
+ display: "grid",
1161
+ gridTemplateColumns: "repeat(" + columns + ", 1fr)"
1162
+ }
1163
+ };
1164
+ }
1165
+ function render(props, defaultLabel, _ref10) {
1166
+ var renderLabel = _ref10.renderLabel,
1167
+ renderArray = _ref10.renderArray;
1168
+ var childCount = props.childCount,
1169
+ renderChild = props.renderChild,
1170
+ definition = props.definition;
1171
+ return renderLabel(defaultLabel(), props.array ? renderArray(props.array) : renderChildren());
1172
+ function renderChildren() {
1173
+ var groupOptions = definition.groupOptions;
1174
+ var _ref11 = isGridRenderer(groupOptions) ? gridStyles(groupOptions) : {
1175
+ className: standardClassName
1176
+ },
1177
+ style = _ref11.style,
1178
+ gcn = _ref11.className;
1179
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1180
+ className: clsx__default["default"](className, gcn),
1181
+ style: style
1182
+ }, Array.from({
1183
+ length: childCount
1184
+ }, function (_, x) {
1185
+ return renderChild(x);
1186
+ }));
1187
+ }
1188
+ }
1189
+ return {
1190
+ type: "group",
1191
+ render: render
1192
+ };
1193
+ }
1194
+ function createDefaultDisplayRenderer(options) {
1195
+ if (options === void 0) {
1196
+ options = {};
1197
+ }
1198
+ function doRender(_ref12) {
1199
+ var displayData = _ref12.definition.displayData;
1200
+ switch (displayData.type) {
1201
+ case exports.DisplayDataType.Text:
1202
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1203
+ className: options.textClassName
1204
+ }, displayData.text);
1205
+ case exports.DisplayDataType.Html:
1206
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1207
+ className: options.htmlClassName,
1208
+ dangerouslySetInnerHTML: {
1209
+ __html: displayData.html
1210
+ }
1211
+ });
1212
+ default:
1213
+ return /*#__PURE__*/React__default["default"].createElement("h1", null, "Unknown display type: ", displayData.type);
1214
+ }
1215
+ }
1216
+ return {
1217
+ render: function render(p, _ref13) {
1218
+ var renderVisibility = _ref13.renderVisibility;
1219
+ return renderVisibility(p.visible, doRender(p));
1220
+ },
1221
+ type: "display"
1222
+ };
1223
+ }
1224
+ var DefaultBoolOptions = [{
1225
+ name: "Yes",
1226
+ value: true
1227
+ }, {
1228
+ name: "No",
1229
+ value: false
1230
+ }];
1231
+ function createDefaultDataRenderer(options) {
1232
+ var _options$selectOption;
1233
+ if (options === void 0) {
1234
+ options = {};
1235
+ }
1236
+ var selectRenderer = createSelectRenderer((_options$selectOption = options.selectOptions) != null ? _options$selectOption : {});
1237
+ var _optionRenderer$boole = _extends({
1238
+ optionRenderer: selectRenderer,
1239
+ booleanOptions: DefaultBoolOptions
1240
+ }, options),
1241
+ inputClass = _optionRenderer$boole.inputClass,
1242
+ booleanOptions = _optionRenderer$boole.booleanOptions,
1243
+ optionRenderer = _optionRenderer$boole.optionRenderer;
1244
+ return createDataRenderer(function (props, defaultLabel, renderers) {
1245
+ if (props.array) {
1246
+ return renderers.renderArray(props.array);
1247
+ }
1248
+ var renderType = props.renderOptions.type;
1249
+ var fieldType = props.field.type;
1250
+ var isBool = fieldType === exports.FieldType.Bool;
1251
+ if (booleanOptions != null && isBool && props.options == null) {
1252
+ return renderers.renderData(_extends({}, props, {
1253
+ options: booleanOptions
1254
+ }));
1255
+ }
1256
+ if (renderType === exports.DataRenderType.Standard && hasOptions(props)) {
1257
+ return optionRenderer.render(props, defaultLabel, renderers);
1258
+ }
1259
+ switch (renderType) {
1260
+ case exports.DataRenderType.Dropdown:
1261
+ return selectRenderer.render(props, defaultLabel, renderers);
1262
+ }
1263
+ var l = defaultLabel();
1264
+ return renderers.renderLabel(l, renderType === exports.DataRenderType.Checkbox ? /*#__PURE__*/React__default["default"].createElement(core.Fcheckbox, {
1265
+ control: props.control
1266
+ }) : /*#__PURE__*/React__default["default"].createElement(ControlInput, {
1267
+ className: inputClass,
1268
+ id: l.forId,
1269
+ readOnly: props.readonly,
1270
+ control: props.control,
1271
+ convert: createInputConversion(props.field.type)
1272
+ }));
1273
+ });
1274
+ }
1275
+ function ControlInput(_ref14) {
1276
+ var _effect2 = core.useComponentTracking();
1277
+ try {
1278
+ var control = _ref14.control,
1279
+ convert = _ref14.convert,
1280
+ props = _objectWithoutPropertiesLoose(_ref14, _excluded);
1281
+ var _formControlProps = core.formControlProps(control),
1282
+ errorText = _formControlProps.errorText,
1283
+ value = _formControlProps.value,
1284
+ onChange = _formControlProps.onChange,
1285
+ inputProps = _objectWithoutPropertiesLoose(_formControlProps, _excluded2);
1286
+ return /*#__PURE__*/React__default["default"].createElement("input", _extends({}, inputProps, {
1287
+ type: convert[0],
1288
+ value: value == null ? "" : convert[2](value),
1289
+ onChange: function onChange(e) {
1290
+ control.value = convert[1](e.target.value);
1291
+ }
1292
+ }, props));
1293
+ } finally {
1294
+ _effect2();
1295
+ }
1296
+ }
1297
+ function createDefaultAdornmentRenderer(options) {
1298
+ return {
1299
+ type: "adornment",
1300
+ render: function render() {
1301
+ return {};
1302
+ }
1303
+ };
1304
+ }
1305
+ function createDefaultVisibilityRenderer(options) {
1306
+ return {
1307
+ type: "visibility",
1308
+ render: function render(visible, children) {
1309
+ return visible.value ? children : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null);
1310
+ }
1311
+ };
1312
+ }
1313
+ function createDefaultRenderers(options) {
1314
+ if (options === void 0) {
1315
+ options = {};
1316
+ }
1317
+ return {
1318
+ data: createDefaultDataRenderer(options.data),
1319
+ display: createDefaultDisplayRenderer(options.display),
1320
+ action: createDefaultActionRenderer(options.action),
1321
+ array: createDefaultArrayRenderer(options.array),
1322
+ group: createDefaultGroupRenderer(options.group),
1323
+ label: createDefaultLabelRenderer(options.label),
1324
+ visibility: createDefaultVisibilityRenderer(),
1325
+ adornment: createDefaultAdornmentRenderer()
1326
+ };
1327
+ }
1328
+ function createClassStyledRenderers() {
1329
+ return createDefaultRenderers({
1330
+ label: {
1331
+ className: "control"
1332
+ },
1333
+ group: {
1334
+ className: "group"
1335
+ },
1336
+ array: {
1337
+ className: "control-array"
1338
+ },
1339
+ action: {
1340
+ className: "action"
1341
+ },
1342
+ data: {
1343
+ inputClass: "data"
1344
+ },
1345
+ display: {
1346
+ htmlClassName: "html",
1347
+ textClassName: "text"
1348
+ }
1349
+ });
1350
+ }
1351
+ function isAdornmentRegistration(x) {
1352
+ return x.type === "adornment";
1353
+ }
1354
+ function isDataRegistration(x) {
1355
+ return x.type === "data";
1356
+ }
1357
+ function isLabelRegistration(x) {
1358
+ return x.type === "label";
1359
+ }
1360
+ function isActionRegistration(x) {
1361
+ return x.type === "action";
1362
+ }
1363
+ function isVisibilityRegistration(x) {
1364
+ return x.type === "visibility";
1365
+ }
1366
+ function isOneOf(x, v) {
1367
+ return x == null ? true : Array.isArray(x) ? x.includes(v) : v === x;
1368
+ }
1369
+ function createDataRenderer(render, options) {
1370
+ return _extends({
1371
+ type: "data",
1372
+ render: render
1373
+ }, options);
1374
+ }
1375
+ function createDataRendererLabelled(_render, options) {
1376
+ return _extends({
1377
+ type: "data",
1378
+ render: function render(props, defaultLabel, renderers) {
1379
+ var dl = defaultLabel();
1380
+ return renderers.renderLabel(dl, _render(props, dl.forId, renderers));
1381
+ }
1382
+ }, options);
1383
+ }
1384
+ function createLabelRenderer(options) {
1385
+ return _extends({
1386
+ type: "label"
1387
+ }, options);
1388
+ }
1389
+ function createAdornmentRenderer(render, options) {
1390
+ return _extends({
1391
+ type: "adornment"
1392
+ }, options, {
1393
+ render: render
1394
+ });
1395
+ }
1396
+ function createSelectRenderer(options) {
1397
+ if (options === void 0) {
1398
+ options = {};
1399
+ }
1400
+ return createDataRendererLabelled(function (props, id) {
1401
+ return /*#__PURE__*/React__default["default"].createElement(SelectDataRenderer, {
1402
+ className: options.className,
1403
+ state: props.control,
1404
+ id: id,
1405
+ options: props.options,
1406
+ required: props.required,
1407
+ emptyText: options.emptyText,
1408
+ requiredText: options.requiredText,
1409
+ convert: createSelectConversion(props.field.type)
1410
+ });
1411
+ }, {
1412
+ options: true
1413
+ });
1414
+ }
1415
+ function SelectDataRenderer(_ref15) {
1416
+ var _effect3 = core.useComponentTracking();
1417
+ try {
1418
+ var state = _ref15.state,
1419
+ options = _ref15.options,
1420
+ className = _ref15.className,
1421
+ convert = _ref15.convert,
1422
+ required = _ref15.required,
1423
+ _ref15$emptyText = _ref15.emptyText,
1424
+ emptyText = _ref15$emptyText === void 0 ? "N/A" : _ref15$emptyText,
1425
+ _ref15$requiredText = _ref15.requiredText,
1426
+ requiredText = _ref15$requiredText === void 0 ? "<please select>" : _ref15$requiredText,
1427
+ props = _objectWithoutPropertiesLoose(_ref15, _excluded3);
1428
+ var value = state.value,
1429
+ disabled = state.disabled;
1430
+ var _useState = React.useState(!required || value == null),
1431
+ showEmpty = _useState[0];
1432
+ var optionStringMap = React.useMemo(function () {
1433
+ return Object.fromEntries(options.map(function (x) {
1434
+ return [convert(x.value), x.value];
1435
+ }));
1436
+ }, [options]);
1437
+ return /*#__PURE__*/React__default["default"].createElement("select", _extends({}, props, {
1438
+ className: className,
1439
+ onChange: function onChange(v) {
1440
+ return state.value = optionStringMap[v.target.value];
1441
+ },
1442
+ value: convert(value),
1443
+ disabled: disabled
1444
+ }), showEmpty && /*#__PURE__*/React__default["default"].createElement("option", {
1445
+ value: ""
1446
+ }, required ? requiredText : emptyText), options.map(function (x, i) {
1447
+ return /*#__PURE__*/React__default["default"].createElement("option", {
1448
+ key: i,
1449
+ value: convert(x.value),
1450
+ disabled: x.disabled
1451
+ }, x.name);
1452
+ }));
1453
+ } finally {
1454
+ _effect3();
1455
+ }
1456
+ }
1457
+ function createSelectConversion(ft) {
1458
+ switch (ft) {
1459
+ case exports.FieldType.String:
1460
+ case exports.FieldType.Int:
1461
+ case exports.FieldType.Double:
1462
+ return function (a) {
1463
+ return a;
1464
+ };
1465
+ default:
1466
+ return function (a) {
1467
+ var _a$toString;
1468
+ return (_a$toString = a == null ? void 0 : a.toString()) != null ? _a$toString : "";
1469
+ };
1470
+ }
1471
+ }
1472
+ function createInputConversion(ft) {
1473
+ switch (ft) {
1474
+ case exports.FieldType.String:
1475
+ return ["text", function (a) {
1476
+ return a;
1477
+ }, function (a) {
1478
+ return a;
1479
+ }];
1480
+ case exports.FieldType.Bool:
1481
+ return ["text", function (a) {
1482
+ return a === "true";
1483
+ }, function (a) {
1484
+ var _a$toString2;
1485
+ return (_a$toString2 = a == null ? void 0 : a.toString()) != null ? _a$toString2 : "";
1486
+ }];
1487
+ case exports.FieldType.Int:
1488
+ return ["number", function (a) {
1489
+ return a !== "" ? parseInt(a) : null;
1490
+ }, function (a) {
1491
+ return a == null ? "" : a;
1492
+ }];
1493
+ case exports.FieldType.Date:
1494
+ return ["date", function (a) {
1495
+ return a;
1496
+ }, function (a) {
1497
+ return a;
1498
+ }];
1499
+ case exports.FieldType.Double:
1500
+ return ["number", function (a) {
1501
+ return parseFloat(a);
1502
+ }, function (a) {
1503
+ return a;
1504
+ }];
1505
+ default:
1506
+ return ["text", function (a) {
1507
+ return a;
1508
+ }, function (a) {
1509
+ return a;
1510
+ }];
1511
+ }
1512
+ }
1513
+
1514
+ var defaultTailwindTheme = {
1515
+ label: {
1516
+ className: "flex flex-col",
1517
+ groupLabelClass: "font-bold",
1518
+ requiredElement: /*#__PURE__*/React__default["default"].createElement("span", {
1519
+ className: "text-red-500"
1520
+ }, " *")
1521
+ },
1522
+ array: {
1523
+ removableClass: "grid grid-cols-[1fr_auto] items-center gap-x-2",
1524
+ childClass: "grow"
1525
+ },
1526
+ group: {
1527
+ standardClassName: "space-y-4",
1528
+ gridClassName: "gap-x-2 gap-y-4"
1529
+ },
1530
+ action: {
1531
+ className: "bg-primary rounded-lg p-3 text-white"
1532
+ }
1533
+ };
572
1534
 
1535
+ exports.AlwaysVisible = AlwaysVisible;
1536
+ exports.ControlInput = ControlInput;
1537
+ exports.DefaultBoolOptions = DefaultBoolOptions;
1538
+ exports.DefaultLabelRenderer = DefaultLabelRenderer;
573
1539
  exports.FormRendererProvider = FormRendererProvider;
1540
+ exports.SelectDataRenderer = SelectDataRenderer;
1541
+ exports.addMissingControls = addMissingControls;
574
1542
  exports.applyDefaultForField = applyDefaultForField;
575
1543
  exports.applyDefaultValues = applyDefaultValues;
576
1544
  exports.boolField = boolField;
@@ -578,11 +1546,32 @@ exports.buildSchema = buildSchema;
578
1546
  exports.compoundField = compoundField;
579
1547
  exports.controlForField = controlForField;
580
1548
  exports.controlTitle = controlTitle;
1549
+ exports.createAction = createAction;
1550
+ exports.createAdornmentRenderer = createAdornmentRenderer;
1551
+ exports.createDataRenderer = createDataRenderer;
1552
+ exports.createDataRendererLabelled = createDataRendererLabelled;
1553
+ exports.createDefaultActionRenderer = createDefaultActionRenderer;
1554
+ exports.createDefaultAdornmentRenderer = createDefaultAdornmentRenderer;
1555
+ exports.createDefaultArrayRenderer = createDefaultArrayRenderer;
1556
+ exports.createDefaultDataRenderer = createDefaultDataRenderer;
1557
+ exports.createDefaultDisplayRenderer = createDefaultDisplayRenderer;
1558
+ exports.createDefaultGroupRenderer = createDefaultGroupRenderer;
1559
+ exports.createDefaultLabelRenderer = createDefaultLabelRenderer;
1560
+ exports.createDefaultRenderers = createDefaultRenderers;
1561
+ exports.createDefaultSchemaHooks = createDefaultSchemaHooks;
1562
+ exports.createDefaultVisibilityRenderer = createDefaultVisibilityRenderer;
581
1563
  exports.createFormEditHooks = createFormEditHooks;
1564
+ exports.createFormRenderer = createFormRenderer;
1565
+ exports.createInputConversion = createInputConversion;
1566
+ exports.createLabelRenderer = createLabelRenderer;
1567
+ exports.createSelectConversion = createSelectConversion;
1568
+ exports.createSelectRenderer = createSelectRenderer;
582
1569
  exports.dataControl = dataControl;
583
1570
  exports.defaultCompoundField = defaultCompoundField;
584
- exports.defaultExpressionHook = defaultExpressionHook;
1571
+ exports.defaultControlForField = defaultControlForField;
1572
+ exports.defaultFormEditHooks = defaultFormEditHooks;
585
1573
  exports.defaultScalarField = defaultScalarField;
1574
+ exports.defaultTailwindTheme = defaultTailwindTheme;
586
1575
  exports.defaultValueForField = defaultValueForField;
587
1576
  exports.defaultValueForFields = defaultValueForFields;
588
1577
  exports.elementValueForField = elementValueForField;
@@ -595,12 +1584,14 @@ exports.findField = findField;
595
1584
  exports.findScalarField = findScalarField;
596
1585
  exports.getDefaultScalarControlProperties = getDefaultScalarControlProperties;
597
1586
  exports.getOptionsForScalarField = getOptionsForScalarField;
1587
+ exports.hasOptions = hasOptions;
598
1588
  exports.intField = intField;
599
1589
  exports.isActionControlsDefinition = isActionControlsDefinition;
600
1590
  exports.isCompoundField = isCompoundField;
601
1591
  exports.isDataControl = isDataControl;
602
1592
  exports.isDataControlDefinition = isDataControlDefinition;
603
1593
  exports.isDisplayControlsDefinition = isDisplayControlsDefinition;
1594
+ exports.isGridRenderer = isGridRenderer;
604
1595
  exports.isGroupControl = isGroupControl;
605
1596
  exports.isGroupControlsDefinition = isGroupControlsDefinition;
606
1597
  exports.isScalarField = isScalarField;
@@ -609,10 +1600,12 @@ exports.makeScalarField = makeScalarField;
609
1600
  exports.renderControl = renderControl;
610
1601
  exports.stringField = stringField;
611
1602
  exports.stringOptionsField = stringOptionsField;
1603
+ exports.useControlsWithDefaults = useControlsWithDefaults;
612
1604
  exports.useDefaultValue = useDefaultValue;
613
1605
  exports.useFormRendererComponents = useFormRendererComponents;
614
1606
  exports.useIsControlVisible = useIsControlVisible;
615
1607
  exports.visibility = visibility;
1608
+ exports.visitControlData = visitControlData;
616
1609
  exports.visitControlDefinition = visitControlDefinition;
617
1610
  exports.withScalarOptions = withScalarOptions;
618
1611
  //# sourceMappingURL=index.js.map