@react-typed-forms/schemas 11.12.1 → 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/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) {
@@ -1145,6 +1147,7 @@ function useJsonataExpression(jExpr, dataContext, bindings, coerce) {
1145
1147
  return "#$i[" + x + "]";
1146
1148
  });
1147
1149
  var fullExpr = pathString ? pathString + ".(" + jExpr + ")" : jExpr;
1150
+ console.log(fullExpr);
1148
1151
  var compiledExpr = React.useMemo(function () {
1149
1152
  try {
1150
1153
  return jsonata__default["default"](fullExpr);
@@ -1586,6 +1589,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1586
1589
  displayControl: displayControl,
1587
1590
  style: customStyle.value,
1588
1591
  allowedOptions: allowedOptions,
1592
+ customDisplay: _options.customDisplay,
1589
1593
  actionDataControl: actionData,
1590
1594
  actionOnClick: _options.actionOnClick,
1591
1595
  useChildVisibility: function useChildVisibility(childDef, context) {
@@ -1771,7 +1775,8 @@ function renderControlLayout(props) {
1771
1775
  labelText = props.labelText,
1772
1776
  parentContext = props.parentContext,
1773
1777
  useChildVisibility = props.useChildVisibility,
1774
- designMode = props.designMode;
1778
+ designMode = props.designMode,
1779
+ customDisplay = props.customDisplay;
1775
1780
  if (isDataControlDefinition(c)) {
1776
1781
  return renderData(c);
1777
1782
  }
@@ -1823,14 +1828,21 @@ function renderControlLayout(props) {
1823
1828
  }
1824
1829
  if (isDisplayControlsDefinition(c)) {
1825
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
+ }
1826
1844
  return {
1827
- children: renderer.renderDisplay({
1828
- data: (_c$displayData = c.displayData) != null ? _c$displayData : {},
1829
- className: cc(c.styleClass),
1830
- style: style,
1831
- display: displayControl,
1832
- dataContext: dataContext
1833
- })
1845
+ children: renderer.renderDisplay(displayProps)
1834
1846
  };
1835
1847
  }
1836
1848
  return {};
@@ -2037,7 +2049,8 @@ var defaultTailwindTheme = {
2037
2049
  },
2038
2050
  selectOptions: {
2039
2051
  emptyText: "<select>"
2040
- }
2052
+ },
2053
+ multilineClass: "border p-2 outline-0 whitespace-pre"
2041
2054
  },
2042
2055
  adornment: {
2043
2056
  accordion: {
@@ -2089,6 +2102,8 @@ function DefaultDisplay(_ref) {
2089
2102
  __html: display ? (_display$value = display.value) != null ? _display$value : "" : data.html
2090
2103
  }
2091
2104
  });
2105
+ case exports.DisplayDataType.Custom:
2106
+ return /*#__PURE__*/React__default["default"].createElement("div", null, "Custom display placeholder: ", data.customId);
2092
2107
  default:
2093
2108
  return /*#__PURE__*/React__default["default"].createElement("h1", null, "Unknown display type: ", data.type);
2094
2109
  }
@@ -2569,6 +2584,136 @@ function DefaultAccordion(_ref) {
2569
2584
  }
2570
2585
 
2571
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
+
2572
2717
  function createButtonActionRenderer(actionId, options) {
2573
2718
  if (options === void 0) {
2574
2719
  options = {};
@@ -2657,7 +2802,9 @@ function createDefaultDataRenderer(options) {
2657
2802
  if (options === void 0) {
2658
2803
  options = {};
2659
2804
  }
2805
+ var jsonataRenderer = createJsonataRenderer(options.jsonataClass);
2660
2806
  var nullToggler = createNullToggleRenderer();
2807
+ var multilineRenderer = createMultilineFieldRenderer(options.multilineClass);
2661
2808
  var checkboxRenderer = createCheckboxRenderer((_options$checkOptions = options.checkOptions) != null ? _options$checkOptions : options.checkboxOptions);
2662
2809
  var selectRenderer = createSelectRenderer(options.selectOptions);
2663
2810
  var radioRenderer = createRadioRenderer((_options$radioOptions = options.radioOptions) != null ? _options$radioOptions : options.checkOptions);
@@ -2725,7 +2872,10 @@ function createDefaultDataRenderer(options) {
2725
2872
  return radioRenderer.render(props, renderers);
2726
2873
  case exports.DataRenderType.Checkbox:
2727
2874
  return checkboxRenderer.render(props, renderers);
2875
+ case exports.DataRenderType.Jsonata:
2876
+ return jsonataRenderer.render(props, renderers);
2728
2877
  }
2878
+ if (isTextfieldRenderer(renderOptions) && renderOptions.multiline) return multilineRenderer.render(props, renderers);
2729
2879
  var placeholder = isTextfieldRenderer(renderOptions) ? renderOptions.placeholder : undefined;
2730
2880
  return /*#__PURE__*/React__default["default"].createElement(ControlInput, {
2731
2881
  className: rendererClass(props.className, inputClass),
@@ -2817,52 +2967,6 @@ function createDefaultLabelRenderer(options) {
2817
2967
  type: "label"
2818
2968
  };
2819
2969
  }
2820
- function createNullToggleRenderer() {
2821
- return createDataRenderer(function (_ref7, renderers) {
2822
- var _control$meta, _nullControl, _control$meta$_nullCo;
2823
- var control = _ref7.control,
2824
- field = _ref7.field,
2825
- props = _objectWithoutPropertiesLoose(_ref7, _excluded);
2826
- var nullControl = (_control$meta$_nullCo = (_control$meta = control.meta)[_nullControl = "nullControl"]) != null ? _control$meta$_nullCo : _control$meta[_nullControl] = core.newControl(control.current.value != null);
2827
- return function (layout) {
2828
- var newLayout = renderers.renderData(_extends({}, props, {
2829
- control: nullControl,
2830
- field: _extends({}, field, {
2831
- type: exports.FieldType.Bool
2832
- }),
2833
- renderOptions: {
2834
- type: exports.DataRenderType.Checkbox
2835
- }
2836
- }))(layout);
2837
- return _extends({}, newLayout, {
2838
- children: /*#__PURE__*/React__default["default"].createElement(NullWrapper, {
2839
- control: control,
2840
- nullControl: nullControl,
2841
- children: newLayout.children,
2842
- defaultValue: props.definition.defaultValue
2843
- })
2844
- });
2845
- };
2846
- });
2847
- }
2848
- function NullWrapper(_ref8) {
2849
- var children = _ref8.children,
2850
- nullControl = _ref8.nullControl,
2851
- control = _ref8.control,
2852
- defaultValue = _ref8.defaultValue;
2853
- core.useControlEffect(function () {
2854
- return nullControl.value;
2855
- }, function (e) {
2856
- if (e) {
2857
- var _nullControl$meta$non;
2858
- control.value = (_nullControl$meta$non = nullControl.meta["nonNullValue"]) != null ? _nullControl$meta$non : defaultValue;
2859
- } else {
2860
- nullControl.meta["nonNullValue"] = control.value;
2861
- control.value = null;
2862
- }
2863
- });
2864
- return children;
2865
- }
2866
2970
  function createDefaultRenderers(options) {
2867
2971
  if (options === void 0) {
2868
2972
  options = {};
@@ -3092,7 +3196,6 @@ exports.createGroupRenderer = createGroupRenderer;
3092
3196
  exports.createInputConversion = createInputConversion;
3093
3197
  exports.createLabelRenderer = createLabelRenderer;
3094
3198
  exports.createLayoutRenderer = createLayoutRenderer;
3095
- exports.createNullToggleRenderer = createNullToggleRenderer;
3096
3199
  exports.createRadioRenderer = createRadioRenderer;
3097
3200
  exports.createSelectConversion = createSelectConversion;
3098
3201
  exports.createSelectRenderer = createSelectRenderer;