@react-typed-forms/schemas 11.12.1 → 11.13.1

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) {
@@ -1586,6 +1588,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1586
1588
  displayControl: displayControl,
1587
1589
  style: customStyle.value,
1588
1590
  allowedOptions: allowedOptions,
1591
+ customDisplay: _options.customDisplay,
1589
1592
  actionDataControl: actionData,
1590
1593
  actionOnClick: _options.actionOnClick,
1591
1594
  useChildVisibility: function useChildVisibility(childDef, context) {
@@ -1771,7 +1774,8 @@ function renderControlLayout(props) {
1771
1774
  labelText = props.labelText,
1772
1775
  parentContext = props.parentContext,
1773
1776
  useChildVisibility = props.useChildVisibility,
1774
- designMode = props.designMode;
1777
+ designMode = props.designMode,
1778
+ customDisplay = props.customDisplay;
1775
1779
  if (isDataControlDefinition(c)) {
1776
1780
  return renderData(c);
1777
1781
  }
@@ -1823,14 +1827,21 @@ function renderControlLayout(props) {
1823
1827
  }
1824
1828
  if (isDisplayControlsDefinition(c)) {
1825
1829
  var _c$displayData;
1830
+ var data = (_c$displayData = c.displayData) != null ? _c$displayData : {};
1831
+ var displayProps = {
1832
+ data: data,
1833
+ className: cc(c.styleClass),
1834
+ style: style,
1835
+ display: displayControl,
1836
+ dataContext: dataContext
1837
+ };
1838
+ if (data.type === exports.DisplayDataType.Custom && customDisplay) {
1839
+ return {
1840
+ children: customDisplay(data.customId, displayProps)
1841
+ };
1842
+ }
1826
1843
  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
- })
1844
+ children: renderer.renderDisplay(displayProps)
1834
1845
  };
1835
1846
  }
1836
1847
  return {};
@@ -2037,7 +2048,8 @@ var defaultTailwindTheme = {
2037
2048
  },
2038
2049
  selectOptions: {
2039
2050
  emptyText: "<select>"
2040
- }
2051
+ },
2052
+ multilineClass: "border p-2 outline-0 whitespace-pre"
2041
2053
  },
2042
2054
  adornment: {
2043
2055
  accordion: {
@@ -2089,6 +2101,8 @@ function DefaultDisplay(_ref) {
2089
2101
  __html: display ? (_display$value = display.value) != null ? _display$value : "" : data.html
2090
2102
  }
2091
2103
  });
2104
+ case exports.DisplayDataType.Custom:
2105
+ return /*#__PURE__*/React__default["default"].createElement("div", null, "Custom display placeholder: ", data.customId);
2092
2106
  default:
2093
2107
  return /*#__PURE__*/React__default["default"].createElement("h1", null, "Unknown display type: ", data.type);
2094
2108
  }
@@ -2569,6 +2583,135 @@ function DefaultAccordion(_ref) {
2569
2583
  }
2570
2584
 
2571
2585
  var _excluded = ["control", "field", "renderOptions"];
2586
+ function createNullToggleRenderer() {
2587
+ return createDataRenderer(function (_ref, renderers) {
2588
+ var _control$meta, _nullControl, _control$meta$_nullCo;
2589
+ var control = _ref.control,
2590
+ field = _ref.field,
2591
+ props = _objectWithoutPropertiesLoose(_ref, _excluded);
2592
+ var nullControl = (_control$meta$_nullCo = (_control$meta = control.meta)[_nullControl = "nullControl"]) != null ? _control$meta$_nullCo : _control$meta[_nullControl] = core.newControl(control.current.value != null);
2593
+ return function (layout) {
2594
+ var newLayout = renderers.renderData(_extends({}, props, {
2595
+ control: nullControl,
2596
+ field: _extends({}, field, {
2597
+ type: exports.FieldType.Bool
2598
+ }),
2599
+ renderOptions: {
2600
+ type: exports.DataRenderType.Checkbox
2601
+ }
2602
+ }))(layout);
2603
+ return _extends({}, newLayout, {
2604
+ children: /*#__PURE__*/React__default["default"].createElement(NullWrapper, {
2605
+ control: control,
2606
+ nullControl: nullControl,
2607
+ children: newLayout.children,
2608
+ readonly: props.readonly,
2609
+ defaultValue: props.definition.defaultValue
2610
+ })
2611
+ });
2612
+ };
2613
+ });
2614
+ }
2615
+ function NullWrapper(_ref2) {
2616
+ var children = _ref2.children,
2617
+ nullControl = _ref2.nullControl,
2618
+ control = _ref2.control,
2619
+ defaultValue = _ref2.defaultValue,
2620
+ readonly = _ref2.readonly;
2621
+ core.useControlEffect(function () {
2622
+ return readonly;
2623
+ }, function (r) {
2624
+ return nullControl.disabled = r;
2625
+ }, true);
2626
+ core.useControlEffect(function () {
2627
+ return nullControl.value;
2628
+ }, function (e) {
2629
+ if (e) {
2630
+ var _nullControl$meta$non;
2631
+ control.value = (_nullControl$meta$non = nullControl.meta["nonNullValue"]) != null ? _nullControl$meta$non : defaultValue;
2632
+ } else {
2633
+ nullControl.meta["nonNullValue"] = control.value;
2634
+ control.value = null;
2635
+ }
2636
+ });
2637
+ return children;
2638
+ }
2639
+
2640
+ function createMultilineFieldRenderer(className) {
2641
+ return createDataRenderer(function (p) {
2642
+ return /*#__PURE__*/React__default["default"].createElement(MultilineTextfield, _extends({}, p, {
2643
+ className: rendererClass(p.className, className)
2644
+ }));
2645
+ });
2646
+ }
2647
+ function MultilineTextfield(_ref) {
2648
+ var _effect = core.useComponentTracking();
2649
+ try {
2650
+ var control = _ref.control,
2651
+ className = _ref.className;
2652
+ var codeRef = React.useRef(null);
2653
+ core.useControlEffect(function () {
2654
+ return control.value;
2655
+ }, function (v) {
2656
+ var c = codeRef.current;
2657
+ if (c && c.textContent !== v) {
2658
+ c.textContent = v;
2659
+ }
2660
+ }, true);
2661
+ return /*#__PURE__*/React__default["default"].createElement("code", {
2662
+ contentEditable: !control.disabled,
2663
+ className: className,
2664
+ onInput: function onInput(t) {
2665
+ return control.value = t.currentTarget.textContent;
2666
+ },
2667
+ ref: codeRef
2668
+ });
2669
+ } finally {
2670
+ _effect();
2671
+ }
2672
+ }
2673
+
2674
+ function createJsonataRenderer(className) {
2675
+ return createDataRenderer(function (p) {
2676
+ return /*#__PURE__*/React__default["default"].createElement(JsonataRenderer, {
2677
+ renderOptions: p.renderOptions,
2678
+ className: rendererClass(p.className, className),
2679
+ dataContext: p.dataContext,
2680
+ control: p.control,
2681
+ readonly: p.readonly
2682
+ });
2683
+ }, {
2684
+ renderType: exports.DataRenderType.Jsonata
2685
+ });
2686
+ }
2687
+ function JsonataRenderer(_ref) {
2688
+ var _effect = core.useComponentTracking();
2689
+ try {
2690
+ var control = _ref.control,
2691
+ expression = _ref.renderOptions.expression,
2692
+ readonly = _ref.readonly,
2693
+ className = _ref.className,
2694
+ dataContext = _ref.dataContext;
2695
+ var rendered = useJsonataExpression(expression, dataContext, function () {
2696
+ return {
2697
+ value: control.value,
2698
+ readonly: readonly,
2699
+ disabled: control.disabled
2700
+ };
2701
+ }, function (v) {
2702
+ return typeof v == null ? "" : typeof v === "object" ? "error: " + JSON.stringify(v) : v.toString();
2703
+ });
2704
+ return /*#__PURE__*/React__default["default"].createElement("div", {
2705
+ className: className,
2706
+ dangerouslySetInnerHTML: {
2707
+ __html: rendered.value
2708
+ }
2709
+ });
2710
+ } finally {
2711
+ _effect();
2712
+ }
2713
+ }
2714
+
2572
2715
  function createButtonActionRenderer(actionId, options) {
2573
2716
  if (options === void 0) {
2574
2717
  options = {};
@@ -2657,7 +2800,9 @@ function createDefaultDataRenderer(options) {
2657
2800
  if (options === void 0) {
2658
2801
  options = {};
2659
2802
  }
2803
+ var jsonataRenderer = createJsonataRenderer(options.jsonataClass);
2660
2804
  var nullToggler = createNullToggleRenderer();
2805
+ var multilineRenderer = createMultilineFieldRenderer(options.multilineClass);
2661
2806
  var checkboxRenderer = createCheckboxRenderer((_options$checkOptions = options.checkOptions) != null ? _options$checkOptions : options.checkboxOptions);
2662
2807
  var selectRenderer = createSelectRenderer(options.selectOptions);
2663
2808
  var radioRenderer = createRadioRenderer((_options$radioOptions = options.radioOptions) != null ? _options$radioOptions : options.checkOptions);
@@ -2725,7 +2870,10 @@ function createDefaultDataRenderer(options) {
2725
2870
  return radioRenderer.render(props, renderers);
2726
2871
  case exports.DataRenderType.Checkbox:
2727
2872
  return checkboxRenderer.render(props, renderers);
2873
+ case exports.DataRenderType.Jsonata:
2874
+ return jsonataRenderer.render(props, renderers);
2728
2875
  }
2876
+ if (isTextfieldRenderer(renderOptions) && renderOptions.multiline) return multilineRenderer.render(props, renderers);
2729
2877
  var placeholder = isTextfieldRenderer(renderOptions) ? renderOptions.placeholder : undefined;
2730
2878
  return /*#__PURE__*/React__default["default"].createElement(ControlInput, {
2731
2879
  className: rendererClass(props.className, inputClass),
@@ -2817,52 +2965,6 @@ function createDefaultLabelRenderer(options) {
2817
2965
  type: "label"
2818
2966
  };
2819
2967
  }
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
2968
  function createDefaultRenderers(options) {
2867
2969
  if (options === void 0) {
2868
2970
  options = {};
@@ -3092,7 +3194,6 @@ exports.createGroupRenderer = createGroupRenderer;
3092
3194
  exports.createInputConversion = createInputConversion;
3093
3195
  exports.createLabelRenderer = createLabelRenderer;
3094
3196
  exports.createLayoutRenderer = createLayoutRenderer;
3095
- exports.createNullToggleRenderer = createNullToggleRenderer;
3096
3197
  exports.createRadioRenderer = createRadioRenderer;
3097
3198
  exports.createSelectConversion = createSelectConversion;
3098
3199
  exports.createSelectRenderer = createSelectRenderer;