@react-typed-forms/schemas 4.1.1 → 5.0.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.
@@ -1,3 +1,3 @@
1
1
  {
2
- "nonCachedDurationMs": 3968.0399519987404
2
+ "nonCachedDurationMs": 3307.499355999753
3
3
  }
@@ -4,7 +4,9 @@ export declare function dataControl(field: string, title?: string | null, option
4
4
  export declare function textDisplayControl(text: string, options?: Partial<DisplayControlDefinition>): DisplayControlDefinition;
5
5
  export declare function htmlDisplayControl(html: string, options?: Partial<DisplayControlDefinition>): DisplayControlDefinition;
6
6
  export declare function dynamicDefaultValue(expr: EntityExpression): DynamicProperty;
7
- export declare function visibility(expr: EntityExpression): DynamicProperty;
7
+ export declare function dynamicReadonly(expr: EntityExpression): DynamicProperty;
8
+ export declare function dynamicVisibility(expr: EntityExpression): DynamicProperty;
9
+ export declare function dynamicDisabled(expr: EntityExpression): DynamicProperty;
8
10
  export declare function fieldEqExpr(field: string, value: any): FieldValueExpression;
9
11
  export declare function jsonataExpr(expression: string): JsonataExpression;
10
12
  export declare function groupedControl(children: ControlDefinition[], title?: string, options?: Partial<GroupedControlsDefinition>): GroupedControlsDefinition;
@@ -2,6 +2,7 @@ import { FC, Key, ReactNode } from "react";
2
2
  import { Control } from "@react-typed-forms/core";
3
3
  import { AdornmentPlacement, ControlAdornment, ControlDefinition, DataControlDefinition, DisplayData, FieldOption, GroupRenderOptions, RenderOptions, SchemaField } from "./types";
4
4
  import { ControlGroupContext } from "./util";
5
+ import { UseEvalExpressionHook } from "./hooks";
5
6
  export interface FormRenderer {
6
7
  renderData: (props: DataRendererProps, asArray: (() => ReactNode) | undefined) => (layout: ControlLayoutProps) => ControlLayoutProps;
7
8
  renderGroup: (props: GroupRendererProps) => ReactNode;
@@ -46,6 +47,7 @@ export interface RenderedLayout {
46
47
  controlEnd?: ReactNode;
47
48
  label?: ReactNode;
48
49
  children?: ReactNode;
50
+ errorControl?: Control<any>;
49
51
  }
50
52
  export interface ControlLayoutProps {
51
53
  label?: LabelRendererProps;
@@ -90,11 +92,13 @@ export interface ControlRenderProps {
90
92
  }
91
93
  export interface FormContextOptions {
92
94
  readonly?: boolean | null;
93
- hidden?: boolean;
95
+ hidden?: boolean | null;
96
+ disabled?: boolean | null;
94
97
  }
95
98
  export type CreateDataProps = (definition: DataControlDefinition, field: SchemaField, groupContext: ControlGroupContext, control: Control<any>, options: FormContextOptions) => DataRendererProps;
96
99
  export interface ControlRenderOptions extends FormContextOptions {
97
100
  useDataHook?: (c: ControlDefinition) => CreateDataProps;
101
+ useEvalExpressionHook?: UseEvalExpressionHook;
98
102
  clearHidden?: boolean;
99
103
  }
100
104
  export declare function useControlRenderer(definition: ControlDefinition, fields: SchemaField[], renderer: FormRenderer, options?: ControlRenderOptions): FC<ControlRenderProps>;
@@ -103,9 +107,9 @@ export declare function getControlData(schemaField: SchemaField | undefined, par
103
107
  export declare const defaultDataProps: CreateDataProps;
104
108
  export type ChildRenderer = (k: Key, childIndex: number, props: ControlRenderProps) => ReactNode;
105
109
  export declare function renderControlLayout(c: ControlDefinition, renderer: FormRenderer, childCount: number, childRenderer: ChildRenderer, dataProps: CreateDataProps, dataOptions: FormContextOptions, groupContext: ControlGroupContext, childControl?: Control<any>, schemaField?: SchemaField): ControlLayoutProps;
106
- export declare function appendMarkup(k: keyof RenderedLayout, markup: ReactNode): (layout: RenderedLayout) => void;
107
- export declare function wrapMarkup(k: keyof RenderedLayout, wrap: (ex: ReactNode) => ReactNode): (layout: RenderedLayout) => void;
108
- export declare function layoutKeyForPlacement(pos: AdornmentPlacement): keyof RenderedLayout;
110
+ export declare function appendMarkup(k: keyof Omit<RenderedLayout, "errorControl">, markup: ReactNode): (layout: RenderedLayout) => void;
111
+ export declare function wrapMarkup(k: keyof Omit<RenderedLayout, "errorControl">, wrap: (ex: ReactNode) => ReactNode): (layout: RenderedLayout) => void;
112
+ export declare function layoutKeyForPlacement(pos: AdornmentPlacement): keyof Omit<RenderedLayout, "errorControl">;
109
113
  export declare function appendMarkupAt(pos: AdornmentPlacement, markup: ReactNode): (layout: RenderedLayout) => void;
110
114
  export declare function wrapMarkupAt(pos: AdornmentPlacement, wrap: (ex: ReactNode) => ReactNode): (layout: RenderedLayout) => void;
111
115
  export declare function renderLayoutParts(props: ControlLayoutProps, renderer: FormRenderer): RenderedLayout;
package/lib/hooks.d.ts CHANGED
@@ -1,9 +1,14 @@
1
- import { ControlDefinition, DynamicPropertyType, SchemaField } from "./types";
1
+ import { ControlDefinition, DynamicPropertyType, EntityExpression, SchemaField } from "./types";
2
2
  import { Control } from "@react-typed-forms/core";
3
3
  import { ControlGroupContext } from "./util";
4
- export declare function useEvalVisibilityHook(definition: ControlDefinition, schemaField?: SchemaField): EvalExpressionHook<boolean>;
5
- export declare function useEvalDefaultValueHook(definition: ControlDefinition, schemaField?: SchemaField): EvalExpressionHook;
4
+ export type UseEvalExpressionHook = (expr: EntityExpression | undefined) => EvalExpressionHook | undefined;
5
+ export declare function useEvalVisibilityHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition, schemaField?: SchemaField): EvalExpressionHook<boolean>;
6
+ export declare function useEvalReadonlyHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition): EvalExpressionHook<boolean>;
7
+ export declare function useEvalDisabledHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition): EvalExpressionHook<boolean>;
8
+ export declare function useEvalDefaultValueHook(useEvalExpressionHook: UseEvalExpressionHook, definition: ControlDefinition, schemaField?: SchemaField): EvalExpressionHook;
6
9
  export type EvalExpressionHook<A = any> = (groupContext: ControlGroupContext) => Control<A | undefined>;
7
- export declare function useEvalDynamicHook(definition: ControlDefinition, type: DynamicPropertyType): EvalExpressionHook | undefined;
10
+ export declare const defaultUseEvalExpressionHook: (expr: EntityExpression | undefined) => EvalExpressionHook | undefined;
11
+ export declare function makeEvalExpressionHook(f: (expr: EntityExpression, context: ControlGroupContext) => Control<any>): (expr: EntityExpression | undefined) => EvalExpressionHook | undefined;
12
+ export declare function useEvalDynamicHook(definition: ControlDefinition, type: DynamicPropertyType, useEvalExpressionHook: (expr: EntityExpression | undefined) => EvalExpressionHook | undefined): EvalExpressionHook | undefined;
8
13
  export declare function matchesType(context: ControlGroupContext, types?: string[] | null): boolean | undefined;
9
14
  export declare function useJsonataExpression(jExpr: string, data: Control<any>): Control<any>;
package/lib/index.js CHANGED
@@ -34,6 +34,8 @@ exports.DynamicPropertyType = void 0;
34
34
  (function (DynamicPropertyType) {
35
35
  DynamicPropertyType["Visible"] = "Visible";
36
36
  DynamicPropertyType["DefaultValue"] = "DefaultValue";
37
+ DynamicPropertyType["Readonly"] = "Readonly";
38
+ DynamicPropertyType["Disabled"] = "Disabled";
37
39
  })(exports.DynamicPropertyType || (exports.DynamicPropertyType = {}));
38
40
  exports.ExpressionType = void 0;
39
41
  (function (ExpressionType) {
@@ -413,6 +415,9 @@ function useUpdatedRef(a) {
413
415
  r.current = a;
414
416
  return r;
415
417
  }
418
+ function isControlReadonly(c) {
419
+ return isDataControl(c) && !!c.readonly;
420
+ }
416
421
  function getTypeField(context) {
417
422
  var _context$groupControl;
418
423
  var typeSchemaField = context.fields.find(function (x) {
@@ -542,12 +547,24 @@ function dynamicDefaultValue(expr) {
542
547
  expr: expr
543
548
  };
544
549
  }
545
- function visibility(expr) {
550
+ function dynamicReadonly(expr) {
551
+ return {
552
+ type: exports.DynamicPropertyType.Readonly,
553
+ expr: expr
554
+ };
555
+ }
556
+ function dynamicVisibility(expr) {
546
557
  return {
547
558
  type: exports.DynamicPropertyType.Visible,
548
559
  expr: expr
549
560
  };
550
561
  }
562
+ function dynamicDisabled(expr) {
563
+ return {
564
+ type: exports.DynamicPropertyType.Disabled,
565
+ expr: expr
566
+ };
567
+ }
551
568
  function fieldEqExpr(field, value) {
552
569
  return {
553
570
  type: exports.ExpressionType.FieldValue,
@@ -610,8 +627,16 @@ function useControlDefinitionForSchema(sf, definition) {
610
627
  }, [sf, definition]);
611
628
  }
612
629
 
613
- function useEvalVisibilityHook(definition, schemaField) {
614
- var dynamicVisibility = useEvalDynamicHook(definition, exports.DynamicPropertyType.Visible);
630
+ function useCalculatedControl(calculate) {
631
+ var c = core.useControl(calculate);
632
+ core.useControlEffect(calculate, function (v) {
633
+ return c.value = v;
634
+ });
635
+ return c;
636
+ }
637
+
638
+ function useEvalVisibilityHook(useEvalExpressionHook, definition, schemaField) {
639
+ var dynamicVisibility = useEvalDynamicHook(definition, exports.DynamicPropertyType.Visible, useEvalExpressionHook);
615
640
  var r = useUpdatedRef(schemaField);
616
641
  return React.useCallback(function (ctx) {
617
642
  var _dynamicVisibility;
@@ -621,8 +646,25 @@ function useEvalVisibilityHook(definition, schemaField) {
621
646
  });
622
647
  }, [dynamicVisibility, r]);
623
648
  }
624
- function useEvalDefaultValueHook(definition, schemaField) {
625
- var dynamicValue = useEvalDynamicHook(definition, exports.DynamicPropertyType.DefaultValue);
649
+ function useEvalReadonlyHook(useEvalExpressionHook, definition) {
650
+ var dynamicReadonly = useEvalDynamicHook(definition, exports.DynamicPropertyType.Readonly, useEvalExpressionHook);
651
+ var r = useUpdatedRef(definition);
652
+ return React.useCallback(function (ctx) {
653
+ if (dynamicReadonly) return dynamicReadonly(ctx);
654
+ return useCalculatedControl(function () {
655
+ return isControlReadonly(r.current);
656
+ });
657
+ }, [dynamicReadonly, r]);
658
+ }
659
+ function useEvalDisabledHook(useEvalExpressionHook, definition) {
660
+ var dynamicDisabled = useEvalDynamicHook(definition, exports.DynamicPropertyType.Disabled, useEvalExpressionHook);
661
+ return React.useCallback(function (ctx) {
662
+ if (dynamicDisabled) return dynamicDisabled(ctx);
663
+ return core.useControl(false);
664
+ }, [dynamicDisabled]);
665
+ }
666
+ function useEvalDefaultValueHook(useEvalExpressionHook, definition, schemaField) {
667
+ var dynamicValue = useEvalDynamicHook(definition, exports.DynamicPropertyType.DefaultValue, useEvalExpressionHook);
626
668
  var r = useUpdatedRef({
627
669
  definition: definition,
628
670
  schemaField: schemaField
@@ -649,24 +691,28 @@ function useFieldValueExpression(fvExpr, fields, data) {
649
691
  return Array.isArray(fv) ? fv.includes(fvExpr.value) : fv === fvExpr.value;
650
692
  });
651
693
  }
652
- function useEvalExpressionHook(expr) {
653
- var r = useUpdatedRef(expr);
654
- var cb = React.useCallback(function (_ref2) {
655
- var groupControl = _ref2.groupControl,
656
- fields = _ref2.fields;
657
- var expr = r.current;
658
- switch (expr.type) {
659
- case exports.ExpressionType.Jsonata:
660
- return useJsonataExpression(expr.expression, groupControl);
661
- case exports.ExpressionType.FieldValue:
662
- return useFieldValueExpression(expr, fields, groupControl);
663
- default:
664
- return core.useControl(undefined);
665
- }
666
- }, [expr == null ? void 0 : expr.type, r]);
667
- return expr ? cb : undefined;
694
+ function defaultEvalHooks(expr, context) {
695
+ switch (expr.type) {
696
+ case exports.ExpressionType.Jsonata:
697
+ return useJsonataExpression(expr.expression, context.groupControl);
698
+ case exports.ExpressionType.FieldValue:
699
+ return useFieldValueExpression(expr, context.fields, context.groupControl);
700
+ default:
701
+ return core.useControl(undefined);
702
+ }
703
+ }
704
+ var defaultUseEvalExpressionHook = makeEvalExpressionHook(defaultEvalHooks);
705
+ function makeEvalExpressionHook(f) {
706
+ return function (expr) {
707
+ var r = useUpdatedRef(expr);
708
+ var cb = React.useCallback(function (ctx) {
709
+ var expr = r.current;
710
+ return f(expr, ctx);
711
+ }, [expr == null ? void 0 : expr.type, r]);
712
+ return expr ? cb : undefined;
713
+ };
668
714
  }
669
- function useEvalDynamicHook(definition, type) {
715
+ function useEvalDynamicHook(definition, type, useEvalExpressionHook) {
670
716
  var _definition$dynamic;
671
717
  var expression = (_definition$dynamic = definition.dynamic) == null ? void 0 : _definition$dynamic.find(function (x) {
672
718
  return x.type === type;
@@ -764,14 +810,17 @@ exports.LabelType = void 0;
764
810
  LabelType[LabelType["Group"] = 1] = "Group";
765
811
  })(exports.LabelType || (exports.LabelType = {}));
766
812
  function useControlRenderer(definition, fields, renderer, options) {
767
- var _options$useDataHook;
813
+ var _options$useDataHook, _options$useEvalExpre;
768
814
  if (options === void 0) {
769
815
  options = {};
770
816
  }
771
817
  var dataProps = (_options$useDataHook = options.useDataHook == null ? void 0 : options.useDataHook(definition)) != null ? _options$useDataHook : defaultDataProps;
818
+ var useExpr = (_options$useEvalExpre = options.useEvalExpressionHook) != null ? _options$useEvalExpre : defaultUseEvalExpressionHook;
772
819
  var schemaField = lookupSchemaField(definition, fields);
773
- var useDefaultValue = useEvalDefaultValueHook(definition, schemaField);
774
- var useIsVisible = useEvalVisibilityHook(definition, schemaField);
820
+ var useDefaultValue = useEvalDefaultValueHook(useExpr, definition, schemaField);
821
+ var useIsVisible = useEvalVisibilityHook(useExpr, definition, schemaField);
822
+ var useIsReadonly = useEvalReadonlyHook(useExpr, definition);
823
+ var useIsDisabled = useEvalDisabledHook(useExpr, definition);
775
824
  var useValidation = useValidationHook(definition);
776
825
  var r = useUpdatedRef({
777
826
  options: options,
@@ -793,6 +842,8 @@ function useControlRenderer(definition, fields, renderer, options) {
793
842
  groupControl: parentControl,
794
843
  fields: _fields
795
844
  };
845
+ var readonlyControl = useIsReadonly(groupContext);
846
+ var disabledControl = useIsDisabled(groupContext);
796
847
  var visibleControl = useIsVisible(groupContext);
797
848
  var visible = visibleControl.current.value;
798
849
  var visibility = core.useControl(function () {
@@ -833,17 +884,21 @@ function useControlRenderer(definition, fields, renderer, options) {
833
884
  }
834
885
  }
835
886
  }, true);
836
- var hidden = core.useComputed(function () {
887
+ var myOptions = useCalculatedControl(function () {
837
888
  var _visibility$fields;
838
- return _options.hidden || !((_visibility$fields = visibility.fields) != null && _visibility$fields.showing.value);
889
+ return {
890
+ hidden: _options.hidden || !((_visibility$fields = visibility.fields) != null && _visibility$fields.showing.value),
891
+ readonly: _options.readonly || readonlyControl.value,
892
+ disabled: _options.disabled || disabledControl.value
893
+ };
839
894
  }).value;
840
- useValidation(control, hidden, groupContext);
841
- var myOptions = _options.hidden !== hidden ? _extends({}, _options, {
842
- hidden: hidden
843
- }) : _options;
895
+ useValidation(control, !!myOptions.hidden, groupContext);
844
896
  var childRenderers = (_c$children$map = (_c$children = c.children) == null ? void 0 : _c$children.map(function (cd) {
845
- return useControlRenderer(cd, childContext.fields, renderer, myOptions);
897
+ return useControlRenderer(cd, childContext.fields, renderer, _extends({}, _options, myOptions));
846
898
  })) != null ? _c$children$map : [];
899
+ React.useEffect(function () {
900
+ if (control && typeof myOptions.disabled === "boolean") control.disabled = myOptions.disabled;
901
+ }, [control, myOptions.disabled]);
847
902
  if (parentControl.isNull) return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null);
848
903
  var adornments = (_definition$adornment = (_definition$adornment2 = definition.adornments) == null ? void 0 : _definition$adornment2.map(function (x) {
849
904
  return renderer.renderAdornment({
@@ -864,7 +919,7 @@ function useControlRenderer(definition, fields, renderer, options) {
864
919
  } finally {
865
920
  stopTracking();
866
921
  }
867
- }, [r, dataProps, useIsVisible, useDefaultValue, useValidation, renderer]);
922
+ }, [r, dataProps, useIsVisible, useDefaultValue, useIsReadonly, useIsDisabled, useValidation, renderer]);
868
923
  Component.displayName = "RenderControl";
869
924
  return Component;
870
925
  }
@@ -934,7 +989,7 @@ var defaultDataProps = function defaultDataProps(definition, field, groupContext
934
989
  field: field,
935
990
  id: "c" + control.uniqueId,
936
991
  options: ((_field$options$length = (_field$options = field.options) == null ? void 0 : _field$options.length) != null ? _field$options$length : 0) === 0 ? null : field.options,
937
- readonly: options.readonly || !!definition.readonly,
992
+ readonly: !!options.readonly,
938
993
  renderOptions: (_definition$renderOpt = definition.renderOptions) != null ? _definition$renderOpt : {
939
994
  type: "Standard"
940
995
  },
@@ -1082,7 +1137,8 @@ function renderLayoutParts(props, renderer) {
1082
1137
  var _props$processLayout, _processed$adornments;
1083
1138
  var processed = (_props$processLayout = props.processLayout == null ? void 0 : props.processLayout(props)) != null ? _props$processLayout : props;
1084
1139
  var layout = {
1085
- children: processed.children
1140
+ children: processed.children,
1141
+ errorControl: processed.errorControl
1086
1142
  };
1087
1143
  ((_processed$adornments = processed.adornments) != null ? _processed$adornments : []).sort(function (a, b) {
1088
1144
  return a.priority - b.priority;
@@ -1450,7 +1506,6 @@ function createDefaultLayoutRenderer(options) {
1450
1506
  }
1451
1507
  return createLayoutRenderer(function (props, renderers) {
1452
1508
  return /*#__PURE__*/React__default["default"].createElement(DefaultLayout, _extends({
1453
- errorControl: props.errorControl,
1454
1509
  layout: renderLayoutParts(props, renderers)
1455
1510
  }, options));
1456
1511
  });
@@ -1696,12 +1751,12 @@ function DefaultLayout(_ref13) {
1696
1751
  try {
1697
1752
  var className = _ref13.className,
1698
1753
  errorClass = _ref13.errorClass,
1699
- errorControl = _ref13.errorControl,
1700
1754
  _ref13$layout = _ref13.layout,
1701
1755
  controlEnd = _ref13$layout.controlEnd,
1702
1756
  controlStart = _ref13$layout.controlStart,
1703
1757
  label = _ref13$layout.label,
1704
- children = _ref13$layout.children;
1758
+ children = _ref13$layout.children,
1759
+ errorControl = _ref13$layout.errorControl;
1705
1760
  var ec = errorControl;
1706
1761
  var errorText = ec && ec.touched ? ec.error : undefined;
1707
1762
  var refCb = React.useCallback(function (e) {
@@ -1790,6 +1845,9 @@ exports.defaultTailwindTheme = defaultTailwindTheme;
1790
1845
  exports.defaultValueForField = defaultValueForField;
1791
1846
  exports.defaultValueForFields = defaultValueForFields;
1792
1847
  exports.dynamicDefaultValue = dynamicDefaultValue;
1848
+ exports.dynamicDisabled = dynamicDisabled;
1849
+ exports.dynamicReadonly = dynamicReadonly;
1850
+ exports.dynamicVisibility = dynamicVisibility;
1793
1851
  exports.elementValueForField = elementValueForField;
1794
1852
  exports.emptyGroupDefinition = emptyGroupDefinition;
1795
1853
  exports.fieldDisplayName = fieldDisplayName;
@@ -1806,6 +1864,7 @@ exports.htmlDisplayControl = htmlDisplayControl;
1806
1864
  exports.intField = intField;
1807
1865
  exports.isActionControlsDefinition = isActionControlsDefinition;
1808
1866
  exports.isCompoundField = isCompoundField;
1867
+ exports.isControlReadonly = isControlReadonly;
1809
1868
  exports.isDataControl = isDataControl;
1810
1869
  exports.isDataControlDefinition = isDataControlDefinition;
1811
1870
  exports.isDisplayControlsDefinition = isDisplayControlsDefinition;
@@ -1827,7 +1886,6 @@ exports.useControlDefinitionForSchema = useControlDefinitionForSchema;
1827
1886
  exports.useControlRenderer = useControlRenderer;
1828
1887
  exports.useUpdatedRef = useUpdatedRef;
1829
1888
  exports.useValidationHook = useValidationHook;
1830
- exports.visibility = visibility;
1831
1889
  exports.visitControlData = visitControlData;
1832
1890
  exports.visitControlDataArray = visitControlDataArray;
1833
1891
  exports.visitControlDefinition = visitControlDefinition;