@react-typed-forms/schemas 11.14.1 → 11.16.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.
@@ -1,6 +1,7 @@
1
- import { ArrayRendererRegistration } from "../renderers";
1
+ import { ArrayRendererRegistration, DataRendererRegistration } from "../renderers";
2
2
  import { ActionRendererProps, ArrayRendererProps } from "../controlRender";
3
3
  import React, { ReactNode } from "react";
4
+ export declare function createDefaultArrayDataRenderer(): DataRendererRegistration;
4
5
  export interface DefaultArrayRendererOptions {
5
6
  className?: string;
6
7
  removableClass?: string;
@@ -1,4 +1,4 @@
1
- import React, { CSSProperties, FC, Key, ReactElement, ReactNode } from "react";
1
+ import React, { FC, Key, ReactElement, ReactNode } from "react";
2
2
  import { Control } from "@react-typed-forms/core";
3
3
  import { AdornmentPlacement, ControlAdornment, ControlDefinition, DataControlDefinition, DisplayData, FieldOption, GroupRenderOptions, RenderOptions, SchemaField, SchemaInterface, SchemaValidator } from "./types";
4
4
  import { ControlDataContext, JsonPath } from "./util";
@@ -18,6 +18,9 @@ export interface FormRenderer {
18
18
  }
19
19
  export interface AdornmentProps {
20
20
  adornment: ControlAdornment;
21
+ dataContext?: ControlDataContext;
22
+ parentContext: ControlDataContext;
23
+ useExpr?: UseEvalExpressionHook;
21
24
  designMode?: boolean;
22
25
  }
23
26
  export declare const AppendAdornmentPriority = 0;
@@ -118,7 +121,6 @@ export interface DataRendererProps extends ParentRendererProps {
118
121
  required: boolean;
119
122
  options: FieldOption[] | undefined | null;
120
123
  hidden: boolean;
121
- toArrayProps?: () => ArrayRendererProps;
122
124
  }
123
125
  export interface ActionRendererProps {
124
126
  actionId: string;
@@ -175,7 +177,6 @@ export declare function ControlRenderer({ definition, fields, renderer, options,
175
177
  parentPath?: JsonPath[];
176
178
  }): React.JSX.Element;
177
179
  export declare function defaultDataProps({ definition, field, control, formOptions, style, allowedOptions, schemaInterface, ...props }: DataControlProps): DataRendererProps;
178
- export declare function defaultArrayProps(arrayControl: Control<any[] | undefined | null>, field: SchemaField, required: boolean, style: CSSProperties | undefined, className: string | undefined, renderElement: (elemIndex: number) => ReactNode, min: number | undefined | null, max: number | undefined | null): ArrayRendererProps;
179
180
  export interface ChildRendererOptions {
180
181
  elementIndex?: number;
181
182
  dataContext?: ControlDataContext;
package/lib/index.js CHANGED
@@ -75,6 +75,7 @@ exports.ControlAdornmentType = void 0;
75
75
  ControlAdornmentType["Accordion"] = "Accordion";
76
76
  ControlAdornmentType["HelpText"] = "HelpText";
77
77
  ControlAdornmentType["Icon"] = "Icon";
78
+ ControlAdornmentType["SetField"] = "SetField";
78
79
  })(exports.ControlAdornmentType || (exports.ControlAdornmentType = {}));
79
80
  exports.DataRenderType = void 0;
80
81
  (function (DataRenderType) {
@@ -94,6 +95,7 @@ exports.DataRenderType = void 0;
94
95
  DataRenderType["Group"] = "Group";
95
96
  DataRenderType["NullToggle"] = "NullToggle";
96
97
  DataRenderType["Jsonata"] = "Jsonata";
98
+ DataRenderType["Array"] = "Array";
97
99
  })(exports.DataRenderType || (exports.DataRenderType = {}));
98
100
  exports.SyncTextType = void 0;
99
101
  (function (SyncTextType) {
@@ -167,6 +169,9 @@ function isTextfieldRenderer(options) {
167
169
  function isDataGroupRenderer(options) {
168
170
  return options.type === exports.DataRenderType.Group;
169
171
  }
172
+ function isArrayRenderer(options) {
173
+ return options.type === exports.DataRenderType.Array;
174
+ }
170
175
 
171
176
  function _arrayLikeToArray(r, a) {
172
177
  (null == a || a > r.length) && (a = r.length);
@@ -1570,7 +1575,10 @@ function useControlRenderer(definition, fields, renderer, options) {
1570
1575
  if (parentControl.isNull) return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null);
1571
1576
  var adornments = (_definition$adornment = (_definition$adornment2 = definition.adornments) == null ? void 0 : _definition$adornment2.map(function (x) {
1572
1577
  return renderer.renderAdornment({
1573
- adornment: x
1578
+ adornment: x,
1579
+ dataContext: controlDataContext,
1580
+ parentContext: parentDataContext,
1581
+ useExpr: useExpr
1574
1582
  });
1575
1583
  })) != null ? _definition$adornment : [];
1576
1584
  var labelAndChildren = renderControlLayout({
@@ -1690,7 +1698,7 @@ function ControlRenderer(_ref3) {
1690
1698
  }
1691
1699
  }
1692
1700
  function defaultDataProps(_ref4) {
1693
- var _definition$validator, _allowedOptions$value, _definition$children, _definition$renderOpt2;
1701
+ var _allowedOptions$value, _definition$children, _definition$renderOpt2;
1694
1702
  var definition = _ref4.definition,
1695
1703
  field = _ref4.field,
1696
1704
  control = _ref4.control,
@@ -1700,9 +1708,6 @@ function defaultDataProps(_ref4) {
1700
1708
  _ref4$schemaInterface = _ref4.schemaInterface,
1701
1709
  schemaInterface = _ref4$schemaInterface === void 0 ? defaultSchemaInterface : _ref4$schemaInterface,
1702
1710
  props = _objectWithoutPropertiesLoose(_ref4, _excluded$4);
1703
- var lengthVal = (_definition$validator = definition.validators) == null ? void 0 : _definition$validator.find(function (x) {
1704
- return x.type === exports.ValidatorType.Length;
1705
- });
1706
1711
  var className = cc(definition.styleClass);
1707
1712
  var required = !!definition.required;
1708
1713
  var fieldOptions = schemaInterface.getOptions(field);
@@ -1731,53 +1736,7 @@ function defaultDataProps(_ref4) {
1731
1736
  hidden: !!formOptions.hidden,
1732
1737
  className: className,
1733
1738
  style: style
1734
- }, props, {
1735
- toArrayProps: field.collection && props.elementIndex == null ? function () {
1736
- return defaultArrayProps(control, field, required, style, className, function (elementIndex) {
1737
- var _control$elements$ele, _control$elements;
1738
- return props.renderChild((_control$elements$ele = (_control$elements = control.elements) == null ? void 0 : _control$elements[elementIndex].uniqueId) != null ? _control$elements$ele : elementIndex, {
1739
- type: exports.ControlDefinitionType.Data,
1740
- field: definition.field,
1741
- children: definition.children,
1742
- hideTitle: true
1743
- }, {
1744
- elementIndex: elementIndex,
1745
- dataContext: props.parentContext
1746
- });
1747
- }, lengthVal == null ? void 0 : lengthVal.min, lengthVal == null ? void 0 : lengthVal.max);
1748
- } : undefined
1749
- });
1750
- }
1751
- function defaultArrayProps(arrayControl, field, required, style, className, _renderElement, min, max) {
1752
- var _field$displayName;
1753
- var noun = (_field$displayName = field.displayName) != null ? _field$displayName : field.field;
1754
- return {
1755
- arrayControl: arrayControl,
1756
- required: required,
1757
- addAction: {
1758
- actionId: "add",
1759
- actionText: "Add " + noun,
1760
- onClick: function onClick() {
1761
- return core.addElement(arrayControl, elementValueForField(field));
1762
- }
1763
- },
1764
- removeAction: function removeAction(i) {
1765
- return {
1766
- actionId: "",
1767
- actionText: "Remove",
1768
- onClick: function onClick() {
1769
- return core.removeElement(arrayControl, i);
1770
- }
1771
- };
1772
- },
1773
- renderElement: function renderElement(i) {
1774
- return _renderElement(i);
1775
- },
1776
- className: cc(className),
1777
- style: style,
1778
- min: min,
1779
- max: max
1780
- };
1739
+ }, props);
1781
1740
  }
1782
1741
  function renderControlLayout(props) {
1783
1742
  var c = props.definition,
@@ -1977,6 +1936,9 @@ function isIconAdornment(a) {
1977
1936
  function isAccordionAdornment(a) {
1978
1937
  return a.type === exports.ControlAdornmentType.Accordion;
1979
1938
  }
1939
+ function isSetFieldAdornment(a) {
1940
+ return a.type === exports.ControlAdornmentType.SetField;
1941
+ }
1980
1942
  function createLayoutRenderer(render, options) {
1981
1943
  return _extends({
1982
1944
  type: "layout",
@@ -2377,10 +2339,74 @@ function createInputConversion(ft) {
2377
2339
  }
2378
2340
  }
2379
2341
 
2342
+ function createDefaultArrayDataRenderer() {
2343
+ return createDataRenderer(function (_ref, renderers) {
2344
+ var _definition$validator, _field$displayName;
2345
+ var definition = _ref.definition,
2346
+ control = _ref.control,
2347
+ required = _ref.required,
2348
+ field = _ref.field,
2349
+ renderChild = _ref.renderChild,
2350
+ parentContext = _ref.parentContext,
2351
+ className = _ref.className,
2352
+ style = _ref.style,
2353
+ renderOptions = _ref.renderOptions;
2354
+ var lengthVal = (_definition$validator = definition.validators) == null ? void 0 : _definition$validator.find(function (x) {
2355
+ return x.type === exports.ValidatorType.Length;
2356
+ });
2357
+ var _ref2 = isArrayRenderer(renderOptions) ? renderOptions : {},
2358
+ addText = _ref2.addText,
2359
+ noAdd = _ref2.noAdd,
2360
+ noRemove = _ref2.noRemove,
2361
+ removeText = _ref2.removeText;
2362
+ var childOptions = isArrayRenderer(renderOptions) ? renderOptions.childOptions : undefined;
2363
+ var noun = (_field$displayName = field.displayName) != null ? _field$displayName : field.field;
2364
+ var arrayProps = {
2365
+ arrayControl: control,
2366
+ required: required,
2367
+ addAction: !noAdd ? {
2368
+ actionId: "add",
2369
+ actionText: addText ? addText : "Add " + noun,
2370
+ onClick: function onClick() {
2371
+ return core.addElement(control, elementValueForField(field));
2372
+ }
2373
+ } : undefined,
2374
+ removeAction: !noRemove ? function (i) {
2375
+ return {
2376
+ actionId: "",
2377
+ actionText: removeText ? removeText : "Remove",
2378
+ onClick: function onClick() {
2379
+ return core.removeElement(control, i);
2380
+ }
2381
+ };
2382
+ } : undefined,
2383
+ renderElement: function renderElement(i) {
2384
+ var _control$elements$i$u, _control$elements;
2385
+ return renderChild((_control$elements$i$u = (_control$elements = control.elements) == null ? void 0 : _control$elements[i].uniqueId) != null ? _control$elements$i$u : i, {
2386
+ type: exports.ControlDefinitionType.Data,
2387
+ field: definition.field,
2388
+ children: definition.children,
2389
+ renderOptions: childOptions != null ? childOptions : {
2390
+ type: exports.DataRenderType.Standard
2391
+ },
2392
+ hideTitle: true
2393
+ }, {
2394
+ elementIndex: i,
2395
+ dataContext: parentContext
2396
+ });
2397
+ },
2398
+ className: cc(className),
2399
+ style: style,
2400
+ min: lengthVal == null ? void 0 : lengthVal.min,
2401
+ max: lengthVal == null ? void 0 : lengthVal.max
2402
+ };
2403
+ return renderers.renderArray(arrayProps);
2404
+ });
2405
+ }
2380
2406
  function createDefaultArrayRenderer(options) {
2381
2407
  return {
2382
- render: function render(props, _ref) {
2383
- var renderAction = _ref.renderAction;
2408
+ render: function render(props, _ref3) {
2409
+ var renderAction = _ref3.renderAction;
2384
2410
  return /*#__PURE__*/React__default["default"].createElement(DefaultArrayRenderer, _extends({}, props, options, {
2385
2411
  renderAction: renderAction
2386
2412
  }));
@@ -2833,17 +2859,13 @@ function createDefaultDataRenderer(options) {
2833
2859
  booleanOptions = _optionRenderer$boole.booleanOptions,
2834
2860
  optionRenderer = _optionRenderer$boole.optionRenderer,
2835
2861
  displayOnlyClass = _optionRenderer$boole.displayOnlyClass;
2862
+ var arrayRenderer = createDefaultArrayDataRenderer();
2836
2863
  return createDataRenderer(function (props, renderers) {
2837
- var fieldType = props.field.type;
2864
+ var field = props.field;
2865
+ var fieldType = field.type;
2838
2866
  var renderOptions = props.renderOptions;
2867
+ if (field.collection && props.elementIndex == null) return arrayRenderer.render(props, renderers);
2839
2868
  var renderType = renderOptions.type;
2840
- if (props.toArrayProps && renderType !== exports.DataRenderType.CheckList) {
2841
- return function (p) {
2842
- return _extends({}, p, {
2843
- children: renderers.renderArray(props.toArrayProps())
2844
- });
2845
- };
2846
- }
2847
2869
  if (fieldType === exports.FieldType.Compound) {
2848
2870
  var _ref5;
2849
2871
  var groupOptions = (_ref5 = isDataGroupRenderer(renderOptions) ? renderOptions.groupOptions : undefined) != null ? _ref5 : {
@@ -2912,9 +2934,46 @@ function createDefaultAdornmentRenderer(options) {
2912
2934
  type: "adornment",
2913
2935
  render: function render(_ref6, renderers) {
2914
2936
  var adornment = _ref6.adornment,
2915
- designMode = _ref6.designMode;
2937
+ designMode = _ref6.designMode,
2938
+ parentContext = _ref6.parentContext,
2939
+ useExpr = _ref6.useExpr;
2916
2940
  return {
2917
2941
  apply: function apply(rl) {
2942
+ if (isSetFieldAdornment(adornment) && useExpr) {
2943
+ var setFieldWrapper = function setFieldWrapper(_ref7) {
2944
+ var children = _ref7.children,
2945
+ adornment = _ref7.adornment,
2946
+ parentContext = _ref7.parentContext;
2947
+ var _dynamicHooks = dynamicHooks(parentContext),
2948
+ value = _dynamicHooks.value;
2949
+ var refField = findFieldPath(parentContext.fields, adornment.field);
2950
+ var otherField = refField ? lookupChildControl(parentContext, refField) : undefined;
2951
+ var always = !adornment.defaultOnly;
2952
+ core.useControlEffect(function () {
2953
+ return [value == null ? void 0 : value.value, (otherField == null ? void 0 : otherField.value) == null];
2954
+ }, function (_ref8) {
2955
+ var v = _ref8[0];
2956
+ otherField == null || otherField.setValue(function (x) {
2957
+ return always || x == null ? v : x;
2958
+ });
2959
+ }, true);
2960
+ return children;
2961
+ };
2962
+ var hook = useExpr(adornment.expression, function (x) {
2963
+ return x;
2964
+ });
2965
+ var dynamicHooks = useDynamicHooks({
2966
+ value: hook
2967
+ });
2968
+ var SetFieldWrapper = React.useCallback(setFieldWrapper, [dynamicHooks]);
2969
+ return wrapLayout(function (x) {
2970
+ return /*#__PURE__*/React__default["default"].createElement(SetFieldWrapper, {
2971
+ children: x,
2972
+ parentContext: parentContext,
2973
+ adornment: adornment
2974
+ });
2975
+ })(rl);
2976
+ }
2918
2977
  if (isIconAdornment(adornment)) {
2919
2978
  var _adornment$placement;
2920
2979
  return appendMarkupAt((_adornment$placement = adornment.placement) != null ? _adornment$placement : exports.AdornmentPlacement.ControlStart, /*#__PURE__*/React__default["default"].createElement("i", {
@@ -3222,7 +3281,6 @@ exports.createVisibilityRenderer = createVisibilityRenderer;
3222
3281
  exports.dataControl = dataControl;
3223
3282
  exports.dateField = dateField;
3224
3283
  exports.dateTimeField = dateTimeField;
3225
- exports.defaultArrayProps = defaultArrayProps;
3226
3284
  exports.defaultCompoundField = defaultCompoundField;
3227
3285
  exports.defaultControlForField = defaultControlForField;
3228
3286
  exports.defaultDataProps = defaultDataProps;
@@ -3264,6 +3322,7 @@ exports.htmlDisplayControl = htmlDisplayControl;
3264
3322
  exports.intField = intField;
3265
3323
  exports.isAccordionAdornment = isAccordionAdornment;
3266
3324
  exports.isActionControlsDefinition = isActionControlsDefinition;
3325
+ exports.isArrayRenderer = isArrayRenderer;
3267
3326
  exports.isCompoundField = isCompoundField;
3268
3327
  exports.isControlDisabled = isControlDisabled;
3269
3328
  exports.isControlReadonly = isControlReadonly;
@@ -3278,6 +3337,7 @@ exports.isGroupControl = isGroupControl;
3278
3337
  exports.isGroupControlsDefinition = isGroupControlsDefinition;
3279
3338
  exports.isIconAdornment = isIconAdornment;
3280
3339
  exports.isScalarField = isScalarField;
3340
+ exports.isSetFieldAdornment = isSetFieldAdornment;
3281
3341
  exports.isTextfieldRenderer = isTextfieldRenderer;
3282
3342
  exports.jsonPathString = jsonPathString;
3283
3343
  exports.jsonataExpr = jsonataExpr;