@react-typed-forms/schemas 11.11.1 → 11.12.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.
@@ -70,5 +70,6 @@ interface DefaultLabelRendererOptions {
70
70
  labelContainer?: (children: ReactElement) => ReactElement;
71
71
  }
72
72
  export declare function createDefaultLabelRenderer(options?: DefaultLabelRendererOptions): LabelRendererRegistration;
73
+ export declare function createNullToggleRenderer(): DataRendererRegistration;
73
74
  export declare function createDefaultRenderers(options?: DefaultRendererOptions): DefaultRenderers;
74
75
  export {};
package/lib/hooks.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare function useEvalVisibilityHook(useEvalExpressionHook: UseEvalExpr
8
8
  export declare function useEvalReadonlyHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition): EvalExpressionHook<boolean>;
9
9
  export declare function useEvalStyleHook(useEvalExpressionHook: UseEvalExpressionHook, property: DynamicPropertyType, definition: ControlDefinition): EvalExpressionHook<React.CSSProperties>;
10
10
  export declare function useEvalAllowedOptionsHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition): EvalExpressionHook<any[]>;
11
- export declare function useEvalDisabledHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition): EvalExpressionHook<boolean>;
11
+ export declare function useEvalDisabledHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition, fieldPath?: SchemaField[]): EvalExpressionHook<boolean>;
12
12
  export declare function useEvalDisplayHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition): DynamicHookGenerator<Control<string | undefined> | undefined, ControlDataContext>;
13
13
  export declare function useEvalDefaultValueHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition, schemaField: SchemaField | undefined, element: boolean): EvalExpressionHook;
14
14
  export declare function defaultEvalHooks(expr: EntityExpression, context: ControlDataContext, coerce: (v: any) => any): Control<any>;
package/lib/index.js CHANGED
@@ -58,6 +58,7 @@ exports.ExpressionType = void 0;
58
58
  ExpressionType["Data"] = "Data";
59
59
  ExpressionType["DataMatch"] = "FieldValue";
60
60
  ExpressionType["UserMatch"] = "UserMatch";
61
+ ExpressionType["NotEmpty"] = "NotEmpty";
61
62
  })(exports.ExpressionType || (exports.ExpressionType = {}));
62
63
  exports.AdornmentPlacement = void 0;
63
64
  (function (AdornmentPlacement) {
@@ -89,6 +90,7 @@ exports.DataRenderType = void 0;
89
90
  DataRenderType["Dropdown"] = "Dropdown";
90
91
  DataRenderType["DisplayOnly"] = "DisplayOnly";
91
92
  DataRenderType["Group"] = "Group";
93
+ DataRenderType["NullToggle"] = "NullToggle";
92
94
  })(exports.DataRenderType || (exports.DataRenderType = {}));
93
95
  exports.SyncTextType = void 0;
94
96
  (function (SyncTextType) {
@@ -197,7 +199,7 @@ function _objectWithoutPropertiesLoose(r, e) {
197
199
  if (null == r) return {};
198
200
  var t = {};
199
201
  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
200
- if (e.indexOf(n) >= 0) continue;
202
+ if (e.includes(n)) continue;
201
203
  t[n] = r[n];
202
204
  }
203
205
  return t;
@@ -998,27 +1000,33 @@ function useEvalAllowedOptionsHook(useEvalExpressionHook, definition) {
998
1000
  return core.useControl([]);
999
1001
  }, undefined);
1000
1002
  }
1001
- function useEvalDisabledHook(useEvalExpressionHook, definition) {
1003
+ function useEvalDisabledHook(useEvalExpressionHook, definition, fieldPath) {
1002
1004
  var dynamicDisabled = useEvalDynamicBoolHook(definition, exports.DynamicPropertyType.Disabled, useEvalExpressionHook);
1003
- return makeDynamicPropertyHook(dynamicDisabled, function () {
1005
+ return makeDynamicPropertyHook(dynamicDisabled, function (ctx, _ref3) {
1006
+ var fieldPath = _ref3.fieldPath;
1004
1007
  return core.useComputed(function () {
1005
- return isControlDisabled(definition);
1008
+ var _dataControl$meta$nul;
1009
+ var dataControl = fieldPath && lookupChildControl(ctx, fieldPath);
1010
+ var setToNull = (dataControl == null || (_dataControl$meta$nul = dataControl.meta["nullControl"]) == null ? void 0 : _dataControl$meta$nul.value) === false;
1011
+ return setToNull || isControlDisabled(definition);
1006
1012
  });
1007
- }, undefined);
1013
+ }, {
1014
+ fieldPath: fieldPath
1015
+ });
1008
1016
  }
1009
1017
  function useEvalDisplayHook(useEvalExpressionHook, definition) {
1010
1018
  return useEvalDynamicHook(definition, exports.DynamicPropertyType.Display, useEvalExpressionHook);
1011
1019
  }
1012
1020
  function useEvalDefaultValueHook(useEvalExpressionHook, definition, schemaField, element) {
1013
1021
  var dynamicValue = useEvalDynamicHook(definition, exports.DynamicPropertyType.DefaultValue, useEvalExpressionHook);
1014
- return makeDynamicPropertyHook(dynamicValue, function (ctx, _ref3) {
1015
- var definition = _ref3.definition,
1016
- schemaField = _ref3.schemaField;
1022
+ return makeDynamicPropertyHook(dynamicValue, function (ctx, _ref4) {
1023
+ var definition = _ref4.definition,
1024
+ schemaField = _ref4.schemaField;
1017
1025
  return core.useComputed(calcDefault);
1018
1026
  function calcDefault() {
1019
- var _ref4 = isDataControlDefinition(definition) ? [definition.required, definition.defaultValue] : [false, undefined],
1020
- required = _ref4[0],
1021
- dcv = _ref4[1];
1027
+ var _ref5 = isDataControlDefinition(definition) ? [definition.required, definition.defaultValue] : [false, undefined],
1028
+ required = _ref5[0],
1029
+ dcv = _ref5[1];
1022
1030
  return dcv != null ? dcv : schemaField ? element ? elementValueForField(schemaField) : defaultValueForField(schemaField, required, true) : undefined;
1023
1031
  }
1024
1032
  }, {
@@ -1051,6 +1059,20 @@ function useDataMatchExpression(fvExpr, fields, data, coerce) {
1051
1059
  return coerce(Array.isArray(fv) ? fv.includes(fvExpr.value) : fv === fvExpr.value);
1052
1060
  });
1053
1061
  }
1062
+ function useNotEmptyExpression(fvExpr, fields, schemaInterface, data, coerce) {
1063
+ if (coerce === void 0) {
1064
+ coerce = function coerce(x) {
1065
+ return x;
1066
+ };
1067
+ }
1068
+ var refField = findFieldPath(fields, fvExpr.field);
1069
+ var otherField = refField ? lookupChildControl(data, refField) : undefined;
1070
+ return core.useCalculatedControl(function () {
1071
+ var fv = otherField == null ? void 0 : otherField.value;
1072
+ var field = refField == null ? void 0 : refField.at(-1);
1073
+ return coerce(field && !schemaInterface.isEmptyValue(field, fv));
1074
+ });
1075
+ }
1054
1076
  function defaultEvalHooks(expr, context, coerce) {
1055
1077
  switch (expr.type) {
1056
1078
  case exports.ExpressionType.Jsonata:
@@ -1059,6 +1081,8 @@ function defaultEvalHooks(expr, context, coerce) {
1059
1081
  return useDataExpression(expr, context.fields, context, coerce);
1060
1082
  case exports.ExpressionType.DataMatch:
1061
1083
  return useDataMatchExpression(expr, context.fields, context, coerce);
1084
+ case exports.ExpressionType.NotEmpty:
1085
+ return useNotEmptyExpression(expr, context.fields, context.schemaInterface, context, coerce);
1062
1086
  default:
1063
1087
  return core.useControl(undefined);
1064
1088
  }
@@ -1373,7 +1397,7 @@ var DefaultSchemaInterface = /*#__PURE__*/function () {
1373
1397
  }();
1374
1398
  var defaultSchemaInterface = new DefaultSchemaInterface();
1375
1399
 
1376
- var _excluded$3 = ["definition", "field", "control", "formOptions", "style", "allowedOptions", "schemaInterface"];
1400
+ var _excluded$4 = ["definition", "field", "control", "formOptions", "style", "allowedOptions", "schemaInterface"];
1377
1401
  var AppendAdornmentPriority = 0;
1378
1402
  var WrapAdornmentPriority = 1000;
1379
1403
  exports.LabelType = void 0;
@@ -1398,7 +1422,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1398
1422
  defaultValueControl: useEvalDefaultValueHook(useExpr, definition, schemaField, elementIndex != null),
1399
1423
  visibleControl: useEvalVisibilityHook(useExpr, definition, fieldPath),
1400
1424
  readonlyControl: useEvalReadonlyHook(useExpr, definition),
1401
- disabledControl: useEvalDisabledHook(useExpr, definition),
1425
+ disabledControl: useEvalDisabledHook(useExpr, definition, fieldPath),
1402
1426
  allowedOptions: useEvalAllowedOptionsHook(useExpr, definition),
1403
1427
  labelText: useEvalLabelText(useExpr, definition),
1404
1428
  actionData: useEvalActionHook(useExpr, definition),
@@ -1466,15 +1490,17 @@ function useControlRenderer(definition, fields, renderer, options) {
1466
1490
  control = _getControlData[1],
1467
1491
  controlDataContext = _getControlData[2];
1468
1492
  core.useControlEffect(function () {
1469
- return [visibility.value, defaultValueControl.value, control == null ? void 0 : control.isNull, isDataControlDefinition(definition) && definition.dontClearHidden, parentControl.isNull, _options.hidden, readonlyControl.value];
1493
+ var _definition$renderOpt;
1494
+ return [visibility.value, defaultValueControl.value, control == null ? void 0 : control.isNull, isDataControlDefinition(definition) && definition.dontClearHidden, isDataControlDefinition(definition) && ((_definition$renderOpt = definition.renderOptions) == null ? void 0 : _definition$renderOpt.type) == exports.DataRenderType.NullToggle, parentControl.isNull, _options.hidden, readonlyControl.value];
1470
1495
  }, function (_ref2) {
1471
1496
  var vc = _ref2[0],
1472
1497
  dv = _ref2[1],
1473
1498
  _ = _ref2[2],
1474
1499
  dontClear = _ref2[3],
1475
- parentNull = _ref2[4],
1476
- hidden = _ref2[5],
1477
- ro = _ref2[6];
1500
+ dontDefault = _ref2[4],
1501
+ parentNull = _ref2[5],
1502
+ hidden = _ref2[6],
1503
+ ro = _ref2[7];
1478
1504
  if (!ro) {
1479
1505
  if (control) {
1480
1506
  if (vc && vc.visible === vc.showing) {
@@ -1482,7 +1508,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1482
1508
  if (_options.clearHidden && !dontClear) {
1483
1509
  control.value = undefined;
1484
1510
  }
1485
- } else control.setValue(function (x) {
1511
+ } else if (!dontDefault) control.setValue(function (x) {
1486
1512
  return x != null ? x : dv;
1487
1513
  });
1488
1514
  }
@@ -1635,7 +1661,7 @@ function ControlRenderer(_ref3) {
1635
1661
  }
1636
1662
  }
1637
1663
  function defaultDataProps(_ref4) {
1638
- var _definition$validator, _allowedOptions$value, _definition$children, _definition$renderOpt;
1664
+ var _definition$validator, _allowedOptions$value, _definition$children, _definition$renderOpt2;
1639
1665
  var definition = _ref4.definition,
1640
1666
  field = _ref4.field,
1641
1667
  control = _ref4.control,
@@ -1644,7 +1670,7 @@ function defaultDataProps(_ref4) {
1644
1670
  allowedOptions = _ref4.allowedOptions,
1645
1671
  _ref4$schemaInterface = _ref4.schemaInterface,
1646
1672
  schemaInterface = _ref4$schemaInterface === void 0 ? defaultSchemaInterface : _ref4$schemaInterface,
1647
- props = _objectWithoutPropertiesLoose(_ref4, _excluded$3);
1673
+ props = _objectWithoutPropertiesLoose(_ref4, _excluded$4);
1648
1674
  var lengthVal = (_definition$validator = definition.validators) == null ? void 0 : _definition$validator.find(function (x) {
1649
1675
  return x.type === exports.ValidatorType.Length;
1650
1676
  });
@@ -1669,7 +1695,7 @@ function defaultDataProps(_ref4) {
1669
1695
  };
1670
1696
  }) : fieldOptions,
1671
1697
  readonly: !!formOptions.readonly,
1672
- renderOptions: (_definition$renderOpt = definition.renderOptions) != null ? _definition$renderOpt : {
1698
+ renderOptions: (_definition$renderOpt2 = definition.renderOptions) != null ? _definition$renderOpt2 : {
1673
1699
  type: "Standard"
1674
1700
  },
1675
1701
  required: required,
@@ -2015,7 +2041,7 @@ var defaultTailwindTheme = {
2015
2041
  }
2016
2042
  };
2017
2043
 
2018
- var _excluded$2 = ["data", "display", "className", "style"];
2044
+ var _excluded$3 = ["data", "display", "className", "style"];
2019
2045
  function createDefaultDisplayRenderer(options) {
2020
2046
  if (options === void 0) {
2021
2047
  options = {};
@@ -2035,7 +2061,7 @@ function DefaultDisplay(_ref) {
2035
2061
  display = _ref.display,
2036
2062
  className = _ref.className,
2037
2063
  style = _ref.style,
2038
- options = _objectWithoutPropertiesLoose(_ref, _excluded$2);
2064
+ options = _objectWithoutPropertiesLoose(_ref, _excluded$3);
2039
2065
  switch (data.type) {
2040
2066
  case exports.DisplayDataType.Icon:
2041
2067
  return /*#__PURE__*/React__default["default"].createElement("i", {
@@ -2121,7 +2147,7 @@ function DefaultVisibility(_ref) {
2121
2147
  }
2122
2148
  }
2123
2149
 
2124
- var _excluded$1 = ["state", "options", "className", "convert", "required", "emptyText", "requiredText", "readonly"];
2150
+ var _excluded$2 = ["state", "options", "className", "convert", "required", "emptyText", "requiredText", "readonly"];
2125
2151
  function createSelectRenderer(options) {
2126
2152
  if (options === void 0) {
2127
2153
  options = {};
@@ -2156,7 +2182,7 @@ function SelectDataRenderer(_ref) {
2156
2182
  _ref$requiredText = _ref.requiredText,
2157
2183
  requiredText = _ref$requiredText === void 0 ? "<please select>" : _ref$requiredText,
2158
2184
  readonly = _ref.readonly,
2159
- props = _objectWithoutPropertiesLoose(_ref, _excluded$1);
2185
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
2160
2186
  var value = state.value,
2161
2187
  disabled = state.disabled;
2162
2188
  var _useState = React.useState(!required || value == null),
@@ -2223,7 +2249,7 @@ function DefaultDisplayOnly(_ref) {
2223
2249
  }
2224
2250
  }
2225
2251
 
2226
- var _excluded = ["control", "convert"],
2252
+ var _excluded$1 = ["control", "convert"],
2227
2253
  _excluded2 = ["errorText", "value", "onChange"];
2228
2254
  function ControlInput(_ref) {
2229
2255
  var _effect = core.useComponentTracking();
@@ -2233,7 +2259,7 @@ function ControlInput(_ref) {
2233
2259
  };
2234
2260
  var control = _ref.control,
2235
2261
  convert = _ref.convert,
2236
- props = _objectWithoutPropertiesLoose(_ref, _excluded);
2262
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$1);
2237
2263
  var _formControlProps = core.formControlProps(control),
2238
2264
  errorText = _formControlProps.errorText,
2239
2265
  value = _formControlProps.value,
@@ -2534,6 +2560,7 @@ function DefaultAccordion(_ref) {
2534
2560
  }
2535
2561
  }
2536
2562
 
2563
+ var _excluded = ["control", "field", "renderOptions"];
2537
2564
  function createButtonActionRenderer(actionId, options) {
2538
2565
  if (options === void 0) {
2539
2566
  options = {};
@@ -2622,6 +2649,7 @@ function createDefaultDataRenderer(options) {
2622
2649
  if (options === void 0) {
2623
2650
  options = {};
2624
2651
  }
2652
+ var nullToggler = createNullToggleRenderer();
2625
2653
  var checkboxRenderer = createCheckboxRenderer((_options$checkOptions = options.checkOptions) != null ? _options$checkOptions : options.checkboxOptions);
2626
2654
  var selectRenderer = createSelectRenderer(options.selectOptions);
2627
2655
  var radioRenderer = createRadioRenderer((_options$radioOptions = options.radioOptions) != null ? _options$radioOptions : options.checkOptions);
@@ -2679,6 +2707,8 @@ function createDefaultDataRenderer(options) {
2679
2707
  return optionRenderer.render(props, renderers);
2680
2708
  }
2681
2709
  switch (renderType) {
2710
+ case exports.DataRenderType.NullToggle:
2711
+ return nullToggler.render(props, renderers);
2682
2712
  case exports.DataRenderType.CheckList:
2683
2713
  return checkListRenderer.render(props, renderers);
2684
2714
  case exports.DataRenderType.Dropdown:
@@ -2779,6 +2809,52 @@ function createDefaultLabelRenderer(options) {
2779
2809
  type: "label"
2780
2810
  };
2781
2811
  }
2812
+ function createNullToggleRenderer() {
2813
+ return createDataRenderer(function (_ref7, renderers) {
2814
+ var _control$meta, _nullControl, _control$meta$_nullCo;
2815
+ var control = _ref7.control,
2816
+ field = _ref7.field,
2817
+ props = _objectWithoutPropertiesLoose(_ref7, _excluded);
2818
+ var nullControl = (_control$meta$_nullCo = (_control$meta = control.meta)[_nullControl = "nullControl"]) != null ? _control$meta$_nullCo : _control$meta[_nullControl] = core.newControl(control.current.value != null);
2819
+ return function (layout) {
2820
+ var newLayout = renderers.renderData(_extends({}, props, {
2821
+ control: nullControl,
2822
+ field: _extends({}, field, {
2823
+ type: exports.FieldType.Bool
2824
+ }),
2825
+ renderOptions: {
2826
+ type: exports.DataRenderType.Checkbox
2827
+ }
2828
+ }))(layout);
2829
+ return _extends({}, newLayout, {
2830
+ children: /*#__PURE__*/React__default["default"].createElement(NullWrapper, {
2831
+ control: control,
2832
+ nullControl: nullControl,
2833
+ children: newLayout.children,
2834
+ defaultValue: props.definition.defaultValue
2835
+ })
2836
+ });
2837
+ };
2838
+ });
2839
+ }
2840
+ function NullWrapper(_ref8) {
2841
+ var children = _ref8.children,
2842
+ nullControl = _ref8.nullControl,
2843
+ control = _ref8.control,
2844
+ defaultValue = _ref8.defaultValue;
2845
+ core.useControlEffect(function () {
2846
+ return nullControl.value;
2847
+ }, function (e) {
2848
+ if (e) {
2849
+ var _nullControl$meta$non;
2850
+ control.value = (_nullControl$meta$non = nullControl.meta["nonNullValue"]) != null ? _nullControl$meta$non : defaultValue;
2851
+ } else {
2852
+ nullControl.meta["nonNullValue"] = control.value;
2853
+ control.value = null;
2854
+ }
2855
+ });
2856
+ return children;
2857
+ }
2782
2858
  function createDefaultRenderers(options) {
2783
2859
  if (options === void 0) {
2784
2860
  options = {};
@@ -3008,6 +3084,7 @@ exports.createGroupRenderer = createGroupRenderer;
3008
3084
  exports.createInputConversion = createInputConversion;
3009
3085
  exports.createLabelRenderer = createLabelRenderer;
3010
3086
  exports.createLayoutRenderer = createLayoutRenderer;
3087
+ exports.createNullToggleRenderer = createNullToggleRenderer;
3011
3088
  exports.createRadioRenderer = createRadioRenderer;
3012
3089
  exports.createSelectConversion = createSelectConversion;
3013
3090
  exports.createSelectRenderer = createSelectRenderer;