@react-typed-forms/schemas 11.12.0 → 11.13.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.
@@ -0,0 +1,12 @@
1
+ import { JsonataRenderOptions } from "../types";
2
+ import { ControlDataContext } from "../util";
3
+ import { Control } from "@react-typed-forms/core";
4
+ import React from "react";
5
+ export declare function createJsonataRenderer(className?: string): import("../renderers").DataRendererRegistration;
6
+ export declare function JsonataRenderer({ control, renderOptions: { expression }, readonly, className, dataContext, }: {
7
+ control: Control<any>;
8
+ renderOptions: JsonataRenderOptions;
9
+ className?: string;
10
+ dataContext: ControlDataContext;
11
+ readonly: boolean;
12
+ }): React.JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { DataRendererProps } from "../controlRender";
2
+ import React from "react";
3
+ export declare function createMultilineFieldRenderer(className?: string): import("../renderers").DataRendererRegistration;
4
+ export declare function MultilineTextfield({ control, className }: DataRendererProps): React.JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function createNullToggleRenderer(): import("../renderers").DataRendererRegistration;
@@ -156,6 +156,7 @@ export type CreateDataProps = (controlProps: DataControlProps) => DataRendererPr
156
156
  export interface ControlRenderOptions extends FormContextOptions {
157
157
  useDataHook?: (c: ControlDefinition) => CreateDataProps;
158
158
  actionOnClick?: (actionId: string, actionData: any) => () => void;
159
+ customDisplay?: (customId: string, displayProps: DisplayRendererProps) => ReactNode;
159
160
  useValidationHook?: (validator: SchemaValidator, ctx: ValidationContext) => void;
160
161
  useEvalExpressionHook?: UseEvalExpressionHook;
161
162
  clearHidden?: boolean;
@@ -200,6 +201,7 @@ export interface RenderControlProps {
200
201
  actionOnClick?: (actionId: string, actionData: any) => () => void;
201
202
  schemaInterface?: SchemaInterface;
202
203
  designMode?: boolean;
204
+ customDisplay?: (customId: string, displayProps: DisplayRendererProps) => ReactNode;
203
205
  }
204
206
  export declare function renderControlLayout(props: RenderControlProps): ControlLayoutProps;
205
207
  type MarkupKeys = keyof Omit<RenderedLayout, "errorControl" | "style" | "className" | "wrapLayout">;
@@ -47,6 +47,8 @@ interface DefaultDataRendererOptions {
47
47
  checkListOptions?: CheckRendererOptions;
48
48
  booleanOptions?: FieldOption[];
49
49
  optionRenderer?: DataRendererRegistration;
50
+ multilineClass?: string;
51
+ jsonataClass?: string;
50
52
  }
51
53
  export declare function createDefaultDataRenderer(options?: DefaultDataRendererOptions): DataRendererRegistration;
52
54
  export interface DefaultAccordionRendererOptions {
@@ -70,6 +72,5 @@ interface DefaultLabelRendererOptions {
70
72
  labelContainer?: (children: ReactElement) => ReactElement;
71
73
  }
72
74
  export declare function createDefaultLabelRenderer(options?: DefaultLabelRendererOptions): LabelRendererRegistration;
73
- export declare function createNullToggleRenderer(): DataRendererRegistration;
74
75
  export declare function createDefaultRenderers(options?: DefaultRendererOptions): DefaultRenderers;
75
76
  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, fieldPath?: SchemaField[]): EvalExpressionHook<boolean>;
11
+ export declare function useEvalDisabledHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition, fieldPath?: SchemaField[], elementIndex?: number): 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
@@ -91,6 +91,7 @@ exports.DataRenderType = void 0;
91
91
  DataRenderType["DisplayOnly"] = "DisplayOnly";
92
92
  DataRenderType["Group"] = "Group";
93
93
  DataRenderType["NullToggle"] = "NullToggle";
94
+ DataRenderType["Jsonata"] = "Jsonata";
94
95
  })(exports.DataRenderType || (exports.DataRenderType = {}));
95
96
  exports.SyncTextType = void 0;
96
97
  (function (SyncTextType) {
@@ -110,6 +111,7 @@ exports.DisplayDataType = void 0;
110
111
  DisplayDataType["Text"] = "Text";
111
112
  DisplayDataType["Html"] = "Html";
112
113
  DisplayDataType["Icon"] = "Icon";
114
+ DisplayDataType["Custom"] = "Custom";
113
115
  })(exports.DisplayDataType || (exports.DisplayDataType = {}));
114
116
  exports.ValidatorType = void 0;
115
117
  (function (ValidatorType) {
@@ -502,10 +504,11 @@ function visitControlData(definition, ctx, cb) {
502
504
  return undefined;
503
505
  }
504
506
  }
505
- function lookupChildControl(data, path) {
506
- return lookupChildControlPath(data, path.map(function (x) {
507
+ function lookupChildControl(data, path, element) {
508
+ var fieldPath = path.map(function (x) {
507
509
  return x.field;
508
- }));
510
+ });
511
+ return lookupChildControlPath(data, element == null ? fieldPath : [].concat(fieldPath, [element]));
509
512
  }
510
513
  function lookupChildControlPath(data, jsonPath) {
511
514
  var childPath = [].concat(data.path, jsonPath);
@@ -712,6 +715,12 @@ function intField(displayName, options) {
712
715
  displayName: displayName
713
716
  }, options));
714
717
  }
718
+ function doubleField(displayName, options) {
719
+ return makeScalarField(_extends({
720
+ type: exports.FieldType.Double,
721
+ displayName: displayName
722
+ }, options));
723
+ }
715
724
  function dateField(displayName, options) {
716
725
  return makeScalarField(_extends({
717
726
  type: exports.FieldType.Date,
@@ -1000,18 +1009,19 @@ function useEvalAllowedOptionsHook(useEvalExpressionHook, definition) {
1000
1009
  return core.useControl([]);
1001
1010
  }, undefined);
1002
1011
  }
1003
- function useEvalDisabledHook(useEvalExpressionHook, definition, fieldPath) {
1012
+ function useEvalDisabledHook(useEvalExpressionHook, definition, fieldPath, elementIndex) {
1004
1013
  var dynamicDisabled = useEvalDynamicBoolHook(definition, exports.DynamicPropertyType.Disabled, useEvalExpressionHook);
1005
1014
  return makeDynamicPropertyHook(dynamicDisabled, function (ctx, _ref3) {
1006
1015
  var fieldPath = _ref3.fieldPath;
1007
1016
  return core.useComputed(function () {
1008
1017
  var _dataControl$meta$nul;
1009
- var dataControl = fieldPath && lookupChildControl(ctx, fieldPath);
1018
+ var dataControl = fieldPath && lookupChildControl(ctx, fieldPath, elementIndex);
1010
1019
  var setToNull = (dataControl == null || (_dataControl$meta$nul = dataControl.meta["nullControl"]) == null ? void 0 : _dataControl$meta$nul.value) === false;
1011
1020
  return setToNull || isControlDisabled(definition);
1012
1021
  });
1013
1022
  }, {
1014
- fieldPath: fieldPath
1023
+ fieldPath: fieldPath,
1024
+ elementIndex: elementIndex
1015
1025
  });
1016
1026
  }
1017
1027
  function useEvalDisplayHook(useEvalExpressionHook, definition) {
@@ -1137,6 +1147,7 @@ function useJsonataExpression(jExpr, dataContext, bindings, coerce) {
1137
1147
  return "#$i[" + x + "]";
1138
1148
  });
1139
1149
  var fullExpr = pathString ? pathString + ".(" + jExpr + ")" : jExpr;
1150
+ console.log(fullExpr);
1140
1151
  var compiledExpr = React.useMemo(function () {
1141
1152
  try {
1142
1153
  return jsonata__default["default"](fullExpr);
@@ -1422,7 +1433,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1422
1433
  defaultValueControl: useEvalDefaultValueHook(useExpr, definition, schemaField, elementIndex != null),
1423
1434
  visibleControl: useEvalVisibilityHook(useExpr, definition, fieldPath),
1424
1435
  readonlyControl: useEvalReadonlyHook(useExpr, definition),
1425
- disabledControl: useEvalDisabledHook(useExpr, definition, fieldPath),
1436
+ disabledControl: useEvalDisabledHook(useExpr, definition, fieldPath, elementIndex),
1426
1437
  allowedOptions: useEvalAllowedOptionsHook(useExpr, definition),
1427
1438
  labelText: useEvalLabelText(useExpr, definition),
1428
1439
  actionData: useEvalActionHook(useExpr, definition),
@@ -1578,6 +1589,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1578
1589
  displayControl: displayControl,
1579
1590
  style: customStyle.value,
1580
1591
  allowedOptions: allowedOptions,
1592
+ customDisplay: _options.customDisplay,
1581
1593
  actionDataControl: actionData,
1582
1594
  actionOnClick: _options.actionOnClick,
1583
1595
  useChildVisibility: function useChildVisibility(childDef, context) {
@@ -1763,7 +1775,8 @@ function renderControlLayout(props) {
1763
1775
  labelText = props.labelText,
1764
1776
  parentContext = props.parentContext,
1765
1777
  useChildVisibility = props.useChildVisibility,
1766
- designMode = props.designMode;
1778
+ designMode = props.designMode,
1779
+ customDisplay = props.customDisplay;
1767
1780
  if (isDataControlDefinition(c)) {
1768
1781
  return renderData(c);
1769
1782
  }
@@ -1815,14 +1828,21 @@ function renderControlLayout(props) {
1815
1828
  }
1816
1829
  if (isDisplayControlsDefinition(c)) {
1817
1830
  var _c$displayData;
1831
+ var data = (_c$displayData = c.displayData) != null ? _c$displayData : {};
1832
+ var displayProps = {
1833
+ data: data,
1834
+ className: cc(c.styleClass),
1835
+ style: style,
1836
+ display: displayControl,
1837
+ dataContext: dataContext
1838
+ };
1839
+ if (data.type === exports.DisplayDataType.Custom && customDisplay) {
1840
+ return {
1841
+ children: customDisplay(data.customId, displayProps)
1842
+ };
1843
+ }
1818
1844
  return {
1819
- children: renderer.renderDisplay({
1820
- data: (_c$displayData = c.displayData) != null ? _c$displayData : {},
1821
- className: cc(c.styleClass),
1822
- style: style,
1823
- display: displayControl,
1824
- dataContext: dataContext
1825
- })
1845
+ children: renderer.renderDisplay(displayProps)
1826
1846
  };
1827
1847
  }
1828
1848
  return {};
@@ -2029,7 +2049,8 @@ var defaultTailwindTheme = {
2029
2049
  },
2030
2050
  selectOptions: {
2031
2051
  emptyText: "<select>"
2032
- }
2052
+ },
2053
+ multilineClass: "border p-2 outline-0 whitespace-pre"
2033
2054
  },
2034
2055
  adornment: {
2035
2056
  accordion: {
@@ -2081,6 +2102,8 @@ function DefaultDisplay(_ref) {
2081
2102
  __html: display ? (_display$value = display.value) != null ? _display$value : "" : data.html
2082
2103
  }
2083
2104
  });
2105
+ case exports.DisplayDataType.Custom:
2106
+ return /*#__PURE__*/React__default["default"].createElement("div", null, "Custom display placeholder: ", data.customId);
2084
2107
  default:
2085
2108
  return /*#__PURE__*/React__default["default"].createElement("h1", null, "Unknown display type: ", data.type);
2086
2109
  }
@@ -2561,6 +2584,136 @@ function DefaultAccordion(_ref) {
2561
2584
  }
2562
2585
 
2563
2586
  var _excluded = ["control", "field", "renderOptions"];
2587
+ function createNullToggleRenderer() {
2588
+ return createDataRenderer(function (_ref, renderers) {
2589
+ var _control$meta, _nullControl, _control$meta$_nullCo;
2590
+ var control = _ref.control,
2591
+ field = _ref.field,
2592
+ props = _objectWithoutPropertiesLoose(_ref, _excluded);
2593
+ var nullControl = (_control$meta$_nullCo = (_control$meta = control.meta)[_nullControl = "nullControl"]) != null ? _control$meta$_nullCo : _control$meta[_nullControl] = core.newControl(control.current.value != null);
2594
+ return function (layout) {
2595
+ var newLayout = renderers.renderData(_extends({}, props, {
2596
+ control: nullControl,
2597
+ field: _extends({}, field, {
2598
+ type: exports.FieldType.Bool
2599
+ }),
2600
+ renderOptions: {
2601
+ type: exports.DataRenderType.Checkbox
2602
+ }
2603
+ }))(layout);
2604
+ return _extends({}, newLayout, {
2605
+ children: /*#__PURE__*/React__default["default"].createElement(NullWrapper, {
2606
+ control: control,
2607
+ nullControl: nullControl,
2608
+ children: newLayout.children,
2609
+ readonly: props.readonly,
2610
+ defaultValue: props.definition.defaultValue
2611
+ })
2612
+ });
2613
+ };
2614
+ });
2615
+ }
2616
+ function NullWrapper(_ref2) {
2617
+ var children = _ref2.children,
2618
+ nullControl = _ref2.nullControl,
2619
+ control = _ref2.control,
2620
+ defaultValue = _ref2.defaultValue,
2621
+ readonly = _ref2.readonly;
2622
+ core.useControlEffect(function () {
2623
+ return readonly;
2624
+ }, function (r) {
2625
+ return nullControl.disabled = r;
2626
+ }, true);
2627
+ core.useControlEffect(function () {
2628
+ return nullControl.value;
2629
+ }, function (e) {
2630
+ if (e) {
2631
+ var _nullControl$meta$non;
2632
+ control.value = (_nullControl$meta$non = nullControl.meta["nonNullValue"]) != null ? _nullControl$meta$non : defaultValue;
2633
+ } else {
2634
+ nullControl.meta["nonNullValue"] = control.value;
2635
+ control.value = null;
2636
+ }
2637
+ });
2638
+ return children;
2639
+ }
2640
+
2641
+ function createMultilineFieldRenderer(className) {
2642
+ return createDataRenderer(function (p) {
2643
+ return /*#__PURE__*/React__default["default"].createElement(MultilineTextfield, _extends({}, p, {
2644
+ className: rendererClass(p.className, className)
2645
+ }));
2646
+ });
2647
+ }
2648
+ function MultilineTextfield(_ref) {
2649
+ var _effect = core.useComponentTracking();
2650
+ try {
2651
+ var control = _ref.control,
2652
+ className = _ref.className;
2653
+ var codeRef = React.useRef(null);
2654
+ core.useControlEffect(function () {
2655
+ return control.value;
2656
+ }, function (v) {
2657
+ var c = codeRef.current;
2658
+ if (c && c.textContent !== v) {
2659
+ c.textContent = v;
2660
+ }
2661
+ }, true);
2662
+ return /*#__PURE__*/React__default["default"].createElement("code", {
2663
+ contentEditable: !control.disabled,
2664
+ className: className,
2665
+ onInput: function onInput(t) {
2666
+ return control.value = t.currentTarget.textContent;
2667
+ },
2668
+ ref: codeRef
2669
+ });
2670
+ } finally {
2671
+ _effect();
2672
+ }
2673
+ }
2674
+
2675
+ function createJsonataRenderer(className) {
2676
+ return createDataRenderer(function (p) {
2677
+ return /*#__PURE__*/React__default["default"].createElement(JsonataRenderer, {
2678
+ renderOptions: p.renderOptions,
2679
+ className: rendererClass(p.className, className),
2680
+ dataContext: p.parentContext,
2681
+ control: p.control,
2682
+ readonly: p.readonly
2683
+ });
2684
+ }, {
2685
+ renderType: exports.DataRenderType.Jsonata
2686
+ });
2687
+ }
2688
+ function JsonataRenderer(_ref) {
2689
+ var _effect = core.useComponentTracking();
2690
+ try {
2691
+ var control = _ref.control,
2692
+ expression = _ref.renderOptions.expression,
2693
+ readonly = _ref.readonly,
2694
+ className = _ref.className,
2695
+ dataContext = _ref.dataContext;
2696
+ var rendered = useJsonataExpression(expression, dataContext, function () {
2697
+ return {
2698
+ value: control.value,
2699
+ readonly: readonly,
2700
+ disabled: control.disabled
2701
+ };
2702
+ }, function (v) {
2703
+ return typeof v === "object" ? "error: " + JSON.stringify(v) : v.toString();
2704
+ });
2705
+ console.log(expression);
2706
+ return /*#__PURE__*/React__default["default"].createElement("div", {
2707
+ className: className,
2708
+ dangerouslySetInnerHTML: {
2709
+ __html: rendered.value
2710
+ }
2711
+ });
2712
+ } finally {
2713
+ _effect();
2714
+ }
2715
+ }
2716
+
2564
2717
  function createButtonActionRenderer(actionId, options) {
2565
2718
  if (options === void 0) {
2566
2719
  options = {};
@@ -2649,7 +2802,9 @@ function createDefaultDataRenderer(options) {
2649
2802
  if (options === void 0) {
2650
2803
  options = {};
2651
2804
  }
2805
+ var jsonataRenderer = createJsonataRenderer(options.jsonataClass);
2652
2806
  var nullToggler = createNullToggleRenderer();
2807
+ var multilineRenderer = createMultilineFieldRenderer(options.multilineClass);
2653
2808
  var checkboxRenderer = createCheckboxRenderer((_options$checkOptions = options.checkOptions) != null ? _options$checkOptions : options.checkboxOptions);
2654
2809
  var selectRenderer = createSelectRenderer(options.selectOptions);
2655
2810
  var radioRenderer = createRadioRenderer((_options$radioOptions = options.radioOptions) != null ? _options$radioOptions : options.checkOptions);
@@ -2717,7 +2872,10 @@ function createDefaultDataRenderer(options) {
2717
2872
  return radioRenderer.render(props, renderers);
2718
2873
  case exports.DataRenderType.Checkbox:
2719
2874
  return checkboxRenderer.render(props, renderers);
2875
+ case exports.DataRenderType.Jsonata:
2876
+ return jsonataRenderer.render(props, renderers);
2720
2877
  }
2878
+ if (isTextfieldRenderer(renderOptions) && renderOptions.multiline) return multilineRenderer.render(props, renderers);
2721
2879
  var placeholder = isTextfieldRenderer(renderOptions) ? renderOptions.placeholder : undefined;
2722
2880
  return /*#__PURE__*/React__default["default"].createElement(ControlInput, {
2723
2881
  className: rendererClass(props.className, inputClass),
@@ -2809,52 +2967,6 @@ function createDefaultLabelRenderer(options) {
2809
2967
  type: "label"
2810
2968
  };
2811
2969
  }
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
- }
2858
2970
  function createDefaultRenderers(options) {
2859
2971
  if (options === void 0) {
2860
2972
  options = {};
@@ -3084,7 +3196,6 @@ exports.createGroupRenderer = createGroupRenderer;
3084
3196
  exports.createInputConversion = createInputConversion;
3085
3197
  exports.createLabelRenderer = createLabelRenderer;
3086
3198
  exports.createLayoutRenderer = createLayoutRenderer;
3087
- exports.createNullToggleRenderer = createNullToggleRenderer;
3088
3199
  exports.createRadioRenderer = createRadioRenderer;
3089
3200
  exports.createSelectConversion = createSelectConversion;
3090
3201
  exports.createSelectRenderer = createSelectRenderer;
@@ -3103,6 +3214,7 @@ exports.defaultTailwindTheme = defaultTailwindTheme;
3103
3214
  exports.defaultUseEvalExpressionHook = defaultUseEvalExpressionHook;
3104
3215
  exports.defaultValueForField = defaultValueForField;
3105
3216
  exports.defaultValueForFields = defaultValueForFields;
3217
+ exports.doubleField = doubleField;
3106
3218
  exports.dynamicDefaultValue = dynamicDefaultValue;
3107
3219
  exports.dynamicDisabled = dynamicDisabled;
3108
3220
  exports.dynamicReadonly = dynamicReadonly;