@react-typed-forms/schemas 8.0.0 → 8.1.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.
@@ -31,7 +31,7 @@ export interface ArrayRendererProps {
31
31
  elementCount: number;
32
32
  renderElement: (elemIndex: number) => ReactNode;
33
33
  elementKey: (elemIndex: number) => Key;
34
- arrayControl?: Control<any[] | undefined | null>;
34
+ arrayControl: Control<any[] | undefined | null>;
35
35
  className?: string;
36
36
  style?: React.CSSProperties;
37
37
  }
@@ -78,6 +78,7 @@ export interface LabelRendererProps {
78
78
  label: ReactNode;
79
79
  required?: boolean | null;
80
80
  forId?: string;
81
+ className?: string;
81
82
  }
82
83
  export interface DisplayRendererProps {
83
84
  data: DisplayData;
@@ -169,12 +170,13 @@ export interface RenderControlProps {
169
170
  formOptions: FormContextOptions;
170
171
  dataContext: ControlDataContext;
171
172
  control?: Control<any>;
173
+ labelText?: Control<string | null | undefined>;
172
174
  schemaField?: SchemaField;
173
175
  displayControl?: Control<string | undefined>;
174
176
  style?: React.CSSProperties;
175
177
  allowedOptions?: Control<any[] | undefined>;
176
178
  }
177
- export declare function renderControlLayout({ definition: c, renderer, renderChild: childRenderer, control: childControl, schemaField, dataContext, formOptions: dataOptions, createDataProps: dataProps, displayControl, style, allowedOptions, }: RenderControlProps): ControlLayoutProps;
179
+ export declare function renderControlLayout({ definition: c, renderer, renderChild: childRenderer, control: childControl, schemaField, dataContext, formOptions: dataOptions, createDataProps: dataProps, displayControl, style, labelText, allowedOptions, }: RenderControlProps): ControlLayoutProps;
178
180
  export declare function appendMarkup(k: keyof Omit<RenderedLayout, "errorControl" | "style" | "className">, markup: ReactNode): (layout: RenderedLayout) => void;
179
181
  export declare function wrapMarkup(k: keyof Omit<RenderedLayout, "errorControl" | "style" | "className">, wrap: (ex: ReactNode) => ReactNode): (layout: RenderedLayout) => void;
180
182
  export declare function layoutKeyForPlacement(pos: AdornmentPlacement): keyof Omit<RenderedLayout, "errorControl" | "style" | "className">;
package/lib/hooks.d.ts CHANGED
@@ -19,3 +19,4 @@ export declare function useEvalDynamicHook(definition: ControlDefinition, type:
19
19
  export declare function matchesType(context: ControlDataContext, types?: string[] | null): boolean | undefined;
20
20
  export declare function hideDisplayOnly(context: ControlDataContext, field: SchemaField, definition: ControlDefinition, schemaInterface: SchemaInterface): boolean | undefined;
21
21
  export declare function useJsonataExpression(jExpr: string, dataContext: DataContext, bindings?: () => Record<string, any>): Control<any>;
22
+ export declare function useEvalLabelText(useExpr: UseEvalExpressionHook, definition: ControlDefinition): EvalExpressionHook<string | null>;
package/lib/index.js CHANGED
@@ -40,6 +40,7 @@ exports.DynamicPropertyType = void 0;
40
40
  DynamicPropertyType["Style"] = "Style";
41
41
  DynamicPropertyType["LayoutStyle"] = "LayoutStyle";
42
42
  DynamicPropertyType["AllowedOptions"] = "AllowedOptions";
43
+ DynamicPropertyType["Label"] = "Label";
43
44
  })(exports.DynamicPropertyType || (exports.DynamicPropertyType = {}));
44
45
  exports.ExpressionType = void 0;
45
46
  (function (ExpressionType) {
@@ -560,17 +561,18 @@ function cleanDataForSchema(v, fields) {
560
561
  function getAllReferencedClasses(c) {
561
562
  var _c$children;
562
563
  var childClasses = (_c$children = c.children) == null ? void 0 : _c$children.flatMap(getAllReferencedClasses);
563
- var tc = clsx__default["default"](c.styleClass, c.layoutClass);
564
+ var tc = clsx__default["default"](getOverrideClass(c.styleClass), getOverrideClass(c.layoutClass), getOverrideClass(c.labelClass));
564
565
  if (childClasses && !tc) return childClasses;
565
566
  if (!tc) return [];
566
567
  if (childClasses) return [tc].concat(childClasses);
567
568
  return [tc];
568
569
  }
569
- function jsonPathString(jsonPath) {
570
+ function jsonPathString(jsonPath, customIndex) {
570
571
  var out = "";
571
572
  jsonPath.forEach(function (v, i) {
572
573
  if (typeof v === "number") {
573
- out += "[" + v + "]";
574
+ var _customIndex;
575
+ out += (_customIndex = customIndex == null ? void 0 : customIndex(v)) != null ? _customIndex : "[" + v + "]";
574
576
  } else {
575
577
  if (i > 0) out += ".";
576
578
  out += v;
@@ -588,6 +590,17 @@ function findChildDefinition(parent, childPath) {
588
590
  }
589
591
  return parent.children[childPath];
590
592
  }
593
+ function getOverrideClass(className) {
594
+ if (className && className.startsWith("@ ")) {
595
+ return className.substring(2);
596
+ }
597
+ return className;
598
+ }
599
+ function rendererClass(controlClass, globalClass) {
600
+ var oc = getOverrideClass(controlClass);
601
+ if (oc === controlClass) return clsx__default["default"](controlClass, globalClass);
602
+ return oc ? oc : undefined;
603
+ }
591
604
 
592
605
  function dataControl(field, title, options) {
593
606
  return _extends({
@@ -913,7 +926,9 @@ function hideDisplayOnly(context, field, definition, schemaInterface) {
913
926
  return displayOptions && !displayOptions.emptyText && schemaInterface.isEmptyValue(field, (_lookupChildControl = lookupChildControl(context, field.field)) == null ? void 0 : _lookupChildControl.value);
914
927
  }
915
928
  function useJsonataExpression(jExpr, dataContext, bindings) {
916
- var pathString = jsonPathString(dataContext.path);
929
+ var pathString = jsonPathString(dataContext.path, function (x) {
930
+ return "#$i[" + x + "]";
931
+ });
917
932
  var fullExpr = pathString ? pathString + ".(" + jExpr + ")" : jExpr;
918
933
  var compiledExpr = React.useMemo(function () {
919
934
  try {
@@ -967,6 +982,15 @@ function useJsonataExpression(jExpr, dataContext, bindings) {
967
982
  }, [compiledExpr]);
968
983
  return control;
969
984
  }
985
+ function useEvalLabelText(useExpr, definition) {
986
+ var dynamicValue = useEvalDynamicHook(definition, exports.DynamicPropertyType.Label, useExpr);
987
+ return React.useCallback(function (ctx) {
988
+ if (dynamicValue) {
989
+ return dynamicValue(ctx);
990
+ }
991
+ return core.useControl(null);
992
+ }, [dynamicValue]);
993
+ }
970
994
 
971
995
  function useValidationHook(definition) {
972
996
  var _definition$validator, _definition$validator2;
@@ -1073,6 +1097,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1073
1097
  var useIsReadonly = useEvalReadonlyHook(useExpr, definition);
1074
1098
  var useIsDisabled = useEvalDisabledHook(useExpr, definition);
1075
1099
  var useAllowedOptions = useEvalAllowedOptionsHook(useExpr, definition);
1100
+ var useLabelText = useEvalLabelText(useExpr, definition);
1076
1101
  var useCustomStyle = useEvalStyleHook(useExpr, exports.DynamicPropertyType.Style, definition);
1077
1102
  var useLayoutStyle = useEvalStyleHook(useExpr, exports.DynamicPropertyType.LayoutStyle, definition);
1078
1103
  var useDynamicDisplay = useEvalDisplayHook(useExpr, definition);
@@ -1107,6 +1132,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1107
1132
  var displayControl = useDynamicDisplay(parentDataContext);
1108
1133
  var customStyle = useCustomStyle(parentDataContext).value;
1109
1134
  var layoutStyle = useLayoutStyle(parentDataContext).value;
1135
+ var labelText = useLabelText(parentDataContext);
1110
1136
  var visible = visibleControl.current.value;
1111
1137
  var visibility = core.useControl(function () {
1112
1138
  return visible != null ? {
@@ -1188,6 +1214,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1188
1214
  formOptions: myOptions,
1189
1215
  dataContext: controlDataContext,
1190
1216
  control: displayControl != null ? displayControl : control,
1217
+ labelText: labelText,
1191
1218
  schemaField: _schemaField,
1192
1219
  displayControl: displayControl,
1193
1220
  style: customStyle,
@@ -1204,7 +1231,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1204
1231
  } finally {
1205
1232
  stopTracking();
1206
1233
  }
1207
- }, [r, dataProps, useIsVisible, useDefaultValue, useIsReadonly, useIsDisabled, useCustomStyle, useLayoutStyle, useAllowedOptions, useDynamicDisplay, useValidation, renderer, schemaInterface]);
1234
+ }, [r, dataProps, useIsVisible, useDefaultValue, useIsReadonly, useIsDisabled, useCustomStyle, useLayoutStyle, useAllowedOptions, useLabelText, useDynamicDisplay, useValidation, renderer, schemaInterface]);
1208
1235
  Component.displayName = "RenderControl";
1209
1236
  return Component;
1210
1237
  }
@@ -1335,12 +1362,13 @@ function renderControlLayout(_ref5) {
1335
1362
  dataProps = _ref5.createDataProps,
1336
1363
  displayControl = _ref5.displayControl,
1337
1364
  style = _ref5.style,
1365
+ labelText = _ref5.labelText,
1338
1366
  allowedOptions = _ref5.allowedOptions;
1339
1367
  if (isDataControlDefinition(c)) {
1340
1368
  return renderData(c);
1341
1369
  }
1342
1370
  if (isGroupControlsDefinition(c)) {
1343
- var _c$groupOptions2;
1371
+ var _labelText$value, _c$groupOptions2;
1344
1372
  if (c.compoundField) {
1345
1373
  var _c$groupOptions;
1346
1374
  return renderData(dataControl(c.compoundField, c.title, {
@@ -1351,17 +1379,18 @@ function renderControlLayout(_ref5) {
1351
1379
  return {
1352
1380
  processLayout: renderer.renderGroup(groupProps(c, childRenderer, dataContext, c.styleClass, style)),
1353
1381
  label: {
1354
- label: c.title,
1382
+ label: (_labelText$value = labelText == null ? void 0 : labelText.value) != null ? _labelText$value : c.title,
1383
+ className: cc(c.labelClass),
1355
1384
  type: exports.LabelType.Group,
1356
1385
  hide: (_c$groupOptions2 = c.groupOptions) == null ? void 0 : _c$groupOptions2.hideTitle
1357
1386
  }
1358
1387
  };
1359
1388
  }
1360
1389
  if (isActionControlsDefinition(c)) {
1361
- var _c$title;
1390
+ var _ref6, _labelText$value2;
1362
1391
  return {
1363
1392
  children: renderer.renderAction({
1364
- actionText: (_c$title = c.title) != null ? _c$title : c.actionId,
1393
+ actionText: (_ref6 = (_labelText$value2 = labelText == null ? void 0 : labelText.value) != null ? _labelText$value2 : c.title) != null ? _ref6 : c.actionId,
1365
1394
  actionId: c.actionId,
1366
1395
  onClick: function onClick() {},
1367
1396
  className: cc(c.styleClass),
@@ -1382,6 +1411,7 @@ function renderControlLayout(_ref5) {
1382
1411
  }
1383
1412
  return {};
1384
1413
  function renderData(c, elemIndex) {
1414
+ var _labelText$value3;
1385
1415
  if (!schemaField) return {
1386
1416
  children: "No schema field for: " + c.field
1387
1417
  };
@@ -1405,15 +1435,16 @@ function renderControlLayout(_ref5) {
1405
1435
  return renderLayoutParts(renderData(c, ei), renderer).children;
1406
1436
  } : undefined
1407
1437
  });
1408
- var labelText = !c.hideTitle ? controlTitle(c.title, schemaField) : undefined;
1438
+ var label = !c.hideTitle ? controlTitle((_labelText$value3 = labelText == null ? void 0 : labelText.value) != null ? _labelText$value3 : c.title, schemaField) : undefined;
1409
1439
  return {
1410
1440
  processLayout: renderer.renderData(props),
1411
1441
  label: {
1412
1442
  type: exports.LabelType.Control,
1413
- label: labelText,
1443
+ label: label,
1414
1444
  forId: props.id,
1415
1445
  required: c.required,
1416
- hide: c.hideTitle
1446
+ hide: c.hideTitle,
1447
+ className: cc(c.labelClass)
1417
1448
  },
1418
1449
  errorControl: childControl
1419
1450
  };
@@ -1449,13 +1480,13 @@ function wrapMarkupAt(pos, wrap) {
1449
1480
  }
1450
1481
  function renderLayoutParts(props, renderer) {
1451
1482
  var _props$processLayout;
1452
- var _ref6 = (_props$processLayout = props.processLayout == null ? void 0 : props.processLayout(props)) != null ? _props$processLayout : props,
1453
- className = _ref6.className,
1454
- children = _ref6.children,
1455
- style = _ref6.style,
1456
- errorControl = _ref6.errorControl,
1457
- label = _ref6.label,
1458
- adornments = _ref6.adornments;
1483
+ var _ref7 = (_props$processLayout = props.processLayout == null ? void 0 : props.processLayout(props)) != null ? _props$processLayout : props,
1484
+ className = _ref7.className,
1485
+ children = _ref7.children,
1486
+ style = _ref7.style,
1487
+ errorControl = _ref7.errorControl,
1488
+ label = _ref7.label,
1489
+ adornments = _ref7.adornments;
1459
1490
  var layout = {
1460
1491
  children: children,
1461
1492
  errorControl: errorControl,
@@ -1605,12 +1636,13 @@ function createDefaultLabelRenderer(options) {
1605
1636
  var _options = options,
1606
1637
  className = _options.className,
1607
1638
  groupLabelClass = _options.groupLabelClass,
1639
+ controlLabelClass = _options.controlLabelClass,
1608
1640
  requiredElement = _options.requiredElement;
1609
1641
  return {
1610
1642
  render: function render(props, labelStart, labelEnd) {
1611
1643
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, labelStart, /*#__PURE__*/React__default["default"].createElement("label", {
1612
1644
  htmlFor: props.forId,
1613
- className: clsx__default["default"](className, props.type === exports.LabelType.Group && groupLabelClass)
1645
+ className: rendererClass(props.className, clsx__default["default"](className, props.type === exports.LabelType.Group && groupLabelClass, props.type === exports.LabelType.Control && controlLabelClass))
1614
1646
  }, props.label, props.required && requiredElement), labelEnd);
1615
1647
  },
1616
1648
  type: "label"
@@ -1701,7 +1733,7 @@ function createDefaultGroupRenderer(options) {
1701
1733
  return function (cp) {
1702
1734
  return _extends({}, cp, {
1703
1735
  children: /*#__PURE__*/React__default["default"].createElement("div", {
1704
- className: clsx__default["default"](props.className, className, gcn),
1736
+ className: rendererClass(props.className, clsx__default["default"](className, gcn)),
1705
1737
  style: style
1706
1738
  }, children == null ? void 0 : children.map(function (c, i) {
1707
1739
  return renderChild(i, i);
@@ -1738,17 +1770,17 @@ function DefaultDisplay(_ref8) {
1738
1770
  case exports.DisplayDataType.Icon:
1739
1771
  return /*#__PURE__*/React__default["default"].createElement("i", {
1740
1772
  style: style,
1741
- className: clsx__default["default"](className, display ? display.value : data.iconClass)
1773
+ className: clsx__default["default"](getOverrideClass(className), display ? display.value : data.iconClass)
1742
1774
  });
1743
1775
  case exports.DisplayDataType.Text:
1744
1776
  return /*#__PURE__*/React__default["default"].createElement("div", {
1745
1777
  style: style,
1746
- className: clsx__default["default"](className, options.textClassName)
1778
+ className: rendererClass(className, options.textClassName)
1747
1779
  }, display ? display.value : data.text);
1748
1780
  case exports.DisplayDataType.Html:
1749
1781
  return /*#__PURE__*/React__default["default"].createElement("div", {
1750
1782
  style: style,
1751
- className: clsx__default["default"](className, options.htmlClassName),
1783
+ className: rendererClass(className, options.htmlClassName),
1752
1784
  dangerouslySetInnerHTML: {
1753
1785
  __html: display ? (_display$value = display.value) != null ? _display$value : "" : data.html
1754
1786
  }
@@ -1836,7 +1868,7 @@ function createDefaultDataRenderer(options) {
1836
1868
  className: props.className,
1837
1869
  control: props.control
1838
1870
  }) : /*#__PURE__*/React__default["default"].createElement(ControlInput, {
1839
- className: clsx__default["default"](props.className, inputClass),
1871
+ className: rendererClass(props.className, inputClass),
1840
1872
  style: props.style,
1841
1873
  id: props.id,
1842
1874
  readOnly: props.readonly,
@@ -1859,7 +1891,7 @@ function DefaultDisplayOnly(_ref9) {
1859
1891
  var text = (_ref10 = schemaInterface.isEmptyValue(field, v) ? emptyText : schemaInterface.textValue(field, v)) != null ? _ref10 : "";
1860
1892
  return /*#__PURE__*/React__default["default"].createElement("div", {
1861
1893
  style: style,
1862
- className: className
1894
+ className: rendererClass(className)
1863
1895
  }, text);
1864
1896
  } finally {
1865
1897
  _effect2();
@@ -1929,7 +1961,7 @@ function createDefaultLayoutRenderer(options) {
1929
1961
  }
1930
1962
  return createLayoutRenderer(function (props, renderers) {
1931
1963
  var layout = renderLayoutParts(_extends({}, props, {
1932
- className: clsx__default["default"](props.className, options.className)
1964
+ className: rendererClass(props.className, options.className)
1933
1965
  }), renderers);
1934
1966
  return {
1935
1967
  children: /*#__PURE__*/React__default["default"].createElement(DefaultLayout, _extends({
@@ -2042,7 +2074,7 @@ function createSelectRenderer(options) {
2042
2074
  }
2043
2075
  return createDataRenderer(function (props, asArray) {
2044
2076
  return /*#__PURE__*/React__default["default"].createElement(SelectDataRenderer, {
2045
- className: clsx__default["default"](props.className, options.className),
2077
+ className: rendererClass(props.className, options.className),
2046
2078
  state: props.control,
2047
2079
  id: props.id,
2048
2080
  options: props.options,
@@ -2190,7 +2222,6 @@ function DefaultLayout(_ref15) {
2190
2222
  var _effect6 = core.useComponentTracking();
2191
2223
  try {
2192
2224
  var errorClass = _ref15.errorClass,
2193
- className = _ref15.className,
2194
2225
  _ref15$layout = _ref15.layout,
2195
2226
  controlEnd = _ref15$layout.controlEnd,
2196
2227
  controlStart = _ref15$layout.controlStart,
@@ -2308,6 +2339,7 @@ exports.findScalarField = findScalarField;
2308
2339
  exports.getAllReferencedClasses = getAllReferencedClasses;
2309
2340
  exports.getControlData = getControlData;
2310
2341
  exports.getDisplayOnlyOptions = getDisplayOnlyOptions;
2342
+ exports.getOverrideClass = getOverrideClass;
2311
2343
  exports.getTypeField = getTypeField;
2312
2344
  exports.groupedControl = groupedControl;
2313
2345
  exports.hasOptions = hasOptions;
@@ -2339,6 +2371,7 @@ exports.matchesType = matchesType;
2339
2371
  exports.mergeField = mergeField;
2340
2372
  exports.renderControlLayout = renderControlLayout;
2341
2373
  exports.renderLayoutParts = renderLayoutParts;
2374
+ exports.rendererClass = rendererClass;
2342
2375
  exports.stringField = stringField;
2343
2376
  exports.stringOptionsField = stringOptionsField;
2344
2377
  exports.textDisplayControl = textDisplayControl;
@@ -2349,6 +2382,7 @@ exports.useEvalDefaultValueHook = useEvalDefaultValueHook;
2349
2382
  exports.useEvalDisabledHook = useEvalDisabledHook;
2350
2383
  exports.useEvalDisplayHook = useEvalDisplayHook;
2351
2384
  exports.useEvalDynamicHook = useEvalDynamicHook;
2385
+ exports.useEvalLabelText = useEvalLabelText;
2352
2386
  exports.useEvalReadonlyHook = useEvalReadonlyHook;
2353
2387
  exports.useEvalStyleHook = useEvalStyleHook;
2354
2388
  exports.useEvalVisibilityHook = useEvalVisibilityHook;