@react-typed-forms/schemas 8.0.0 → 8.2.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) {
@@ -557,20 +558,23 @@ function cleanDataForSchema(v, fields) {
557
558
  });
558
559
  return out;
559
560
  }
560
- function getAllReferencedClasses(c) {
561
- var _c$children;
562
- var childClasses = (_c$children = c.children) == null ? void 0 : _c$children.flatMap(getAllReferencedClasses);
563
- var tc = clsx__default["default"](c.styleClass, c.layoutClass);
561
+ function getAllReferencedClasses(c, collectExtra) {
562
+ var _c$children, _collectExtra;
563
+ var childClasses = (_c$children = c.children) == null ? void 0 : _c$children.flatMap(function (x) {
564
+ return getAllReferencedClasses(x, collectExtra);
565
+ });
566
+ var tc = clsx__default["default"]([c.styleClass, c.layoutClass, c.labelClass].concat((_collectExtra = collectExtra == null ? void 0 : collectExtra(c)) != null ? _collectExtra : []).map(getOverrideClass));
564
567
  if (childClasses && !tc) return childClasses;
565
568
  if (!tc) return [];
566
569
  if (childClasses) return [tc].concat(childClasses);
567
570
  return [tc];
568
571
  }
569
- function jsonPathString(jsonPath) {
572
+ function jsonPathString(jsonPath, customIndex) {
570
573
  var out = "";
571
574
  jsonPath.forEach(function (v, i) {
572
575
  if (typeof v === "number") {
573
- out += "[" + v + "]";
576
+ var _customIndex;
577
+ out += (_customIndex = customIndex == null ? void 0 : customIndex(v)) != null ? _customIndex : "[" + v + "]";
574
578
  } else {
575
579
  if (i > 0) out += ".";
576
580
  out += v;
@@ -588,6 +592,17 @@ function findChildDefinition(parent, childPath) {
588
592
  }
589
593
  return parent.children[childPath];
590
594
  }
595
+ function getOverrideClass(className) {
596
+ if (className && className.startsWith("@ ")) {
597
+ return className.substring(2);
598
+ }
599
+ return className;
600
+ }
601
+ function rendererClass(controlClass, globalClass) {
602
+ var oc = getOverrideClass(controlClass);
603
+ if (oc === controlClass) return clsx__default["default"](controlClass, globalClass);
604
+ return oc ? oc : undefined;
605
+ }
591
606
 
592
607
  function dataControl(field, title, options) {
593
608
  return _extends({
@@ -913,7 +928,9 @@ function hideDisplayOnly(context, field, definition, schemaInterface) {
913
928
  return displayOptions && !displayOptions.emptyText && schemaInterface.isEmptyValue(field, (_lookupChildControl = lookupChildControl(context, field.field)) == null ? void 0 : _lookupChildControl.value);
914
929
  }
915
930
  function useJsonataExpression(jExpr, dataContext, bindings) {
916
- var pathString = jsonPathString(dataContext.path);
931
+ var pathString = jsonPathString(dataContext.path, function (x) {
932
+ return "#$i[" + x + "]";
933
+ });
917
934
  var fullExpr = pathString ? pathString + ".(" + jExpr + ")" : jExpr;
918
935
  var compiledExpr = React.useMemo(function () {
919
936
  try {
@@ -967,6 +984,15 @@ function useJsonataExpression(jExpr, dataContext, bindings) {
967
984
  }, [compiledExpr]);
968
985
  return control;
969
986
  }
987
+ function useEvalLabelText(useExpr, definition) {
988
+ var dynamicValue = useEvalDynamicHook(definition, exports.DynamicPropertyType.Label, useExpr);
989
+ return React.useCallback(function (ctx) {
990
+ if (dynamicValue) {
991
+ return dynamicValue(ctx);
992
+ }
993
+ return core.useControl(null);
994
+ }, [dynamicValue]);
995
+ }
970
996
 
971
997
  function useValidationHook(definition) {
972
998
  var _definition$validator, _definition$validator2;
@@ -1073,6 +1099,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1073
1099
  var useIsReadonly = useEvalReadonlyHook(useExpr, definition);
1074
1100
  var useIsDisabled = useEvalDisabledHook(useExpr, definition);
1075
1101
  var useAllowedOptions = useEvalAllowedOptionsHook(useExpr, definition);
1102
+ var useLabelText = useEvalLabelText(useExpr, definition);
1076
1103
  var useCustomStyle = useEvalStyleHook(useExpr, exports.DynamicPropertyType.Style, definition);
1077
1104
  var useLayoutStyle = useEvalStyleHook(useExpr, exports.DynamicPropertyType.LayoutStyle, definition);
1078
1105
  var useDynamicDisplay = useEvalDisplayHook(useExpr, definition);
@@ -1107,6 +1134,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1107
1134
  var displayControl = useDynamicDisplay(parentDataContext);
1108
1135
  var customStyle = useCustomStyle(parentDataContext).value;
1109
1136
  var layoutStyle = useLayoutStyle(parentDataContext).value;
1137
+ var labelText = useLabelText(parentDataContext);
1110
1138
  var visible = visibleControl.current.value;
1111
1139
  var visibility = core.useControl(function () {
1112
1140
  return visible != null ? {
@@ -1188,6 +1216,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1188
1216
  formOptions: myOptions,
1189
1217
  dataContext: controlDataContext,
1190
1218
  control: displayControl != null ? displayControl : control,
1219
+ labelText: labelText,
1191
1220
  schemaField: _schemaField,
1192
1221
  displayControl: displayControl,
1193
1222
  style: customStyle,
@@ -1204,7 +1233,7 @@ function useControlRenderer(definition, fields, renderer, options) {
1204
1233
  } finally {
1205
1234
  stopTracking();
1206
1235
  }
1207
- }, [r, dataProps, useIsVisible, useDefaultValue, useIsReadonly, useIsDisabled, useCustomStyle, useLayoutStyle, useAllowedOptions, useDynamicDisplay, useValidation, renderer, schemaInterface]);
1236
+ }, [r, dataProps, useIsVisible, useDefaultValue, useIsReadonly, useIsDisabled, useCustomStyle, useLayoutStyle, useAllowedOptions, useLabelText, useDynamicDisplay, useValidation, renderer, schemaInterface]);
1208
1237
  Component.displayName = "RenderControl";
1209
1238
  return Component;
1210
1239
  }
@@ -1335,12 +1364,13 @@ function renderControlLayout(_ref5) {
1335
1364
  dataProps = _ref5.createDataProps,
1336
1365
  displayControl = _ref5.displayControl,
1337
1366
  style = _ref5.style,
1367
+ labelText = _ref5.labelText,
1338
1368
  allowedOptions = _ref5.allowedOptions;
1339
1369
  if (isDataControlDefinition(c)) {
1340
1370
  return renderData(c);
1341
1371
  }
1342
1372
  if (isGroupControlsDefinition(c)) {
1343
- var _c$groupOptions2;
1373
+ var _labelText$value, _c$groupOptions2;
1344
1374
  if (c.compoundField) {
1345
1375
  var _c$groupOptions;
1346
1376
  return renderData(dataControl(c.compoundField, c.title, {
@@ -1351,17 +1381,18 @@ function renderControlLayout(_ref5) {
1351
1381
  return {
1352
1382
  processLayout: renderer.renderGroup(groupProps(c, childRenderer, dataContext, c.styleClass, style)),
1353
1383
  label: {
1354
- label: c.title,
1384
+ label: (_labelText$value = labelText == null ? void 0 : labelText.value) != null ? _labelText$value : c.title,
1385
+ className: cc(c.labelClass),
1355
1386
  type: exports.LabelType.Group,
1356
1387
  hide: (_c$groupOptions2 = c.groupOptions) == null ? void 0 : _c$groupOptions2.hideTitle
1357
1388
  }
1358
1389
  };
1359
1390
  }
1360
1391
  if (isActionControlsDefinition(c)) {
1361
- var _c$title;
1392
+ var _ref6, _labelText$value2;
1362
1393
  return {
1363
1394
  children: renderer.renderAction({
1364
- actionText: (_c$title = c.title) != null ? _c$title : c.actionId,
1395
+ actionText: (_ref6 = (_labelText$value2 = labelText == null ? void 0 : labelText.value) != null ? _labelText$value2 : c.title) != null ? _ref6 : c.actionId,
1365
1396
  actionId: c.actionId,
1366
1397
  onClick: function onClick() {},
1367
1398
  className: cc(c.styleClass),
@@ -1382,6 +1413,7 @@ function renderControlLayout(_ref5) {
1382
1413
  }
1383
1414
  return {};
1384
1415
  function renderData(c, elemIndex) {
1416
+ var _labelText$value3;
1385
1417
  if (!schemaField) return {
1386
1418
  children: "No schema field for: " + c.field
1387
1419
  };
@@ -1405,15 +1437,16 @@ function renderControlLayout(_ref5) {
1405
1437
  return renderLayoutParts(renderData(c, ei), renderer).children;
1406
1438
  } : undefined
1407
1439
  });
1408
- var labelText = !c.hideTitle ? controlTitle(c.title, schemaField) : undefined;
1440
+ var label = !c.hideTitle ? controlTitle((_labelText$value3 = labelText == null ? void 0 : labelText.value) != null ? _labelText$value3 : c.title, schemaField) : undefined;
1409
1441
  return {
1410
1442
  processLayout: renderer.renderData(props),
1411
1443
  label: {
1412
1444
  type: exports.LabelType.Control,
1413
- label: labelText,
1445
+ label: label,
1414
1446
  forId: props.id,
1415
1447
  required: c.required,
1416
- hide: c.hideTitle
1448
+ hide: c.hideTitle,
1449
+ className: cc(c.labelClass)
1417
1450
  },
1418
1451
  errorControl: childControl
1419
1452
  };
@@ -1449,13 +1482,13 @@ function wrapMarkupAt(pos, wrap) {
1449
1482
  }
1450
1483
  function renderLayoutParts(props, renderer) {
1451
1484
  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;
1485
+ var _ref7 = (_props$processLayout = props.processLayout == null ? void 0 : props.processLayout(props)) != null ? _props$processLayout : props,
1486
+ className = _ref7.className,
1487
+ children = _ref7.children,
1488
+ style = _ref7.style,
1489
+ errorControl = _ref7.errorControl,
1490
+ label = _ref7.label,
1491
+ adornments = _ref7.adornments;
1459
1492
  var layout = {
1460
1493
  children: children,
1461
1494
  errorControl: errorControl,
@@ -1605,12 +1638,13 @@ function createDefaultLabelRenderer(options) {
1605
1638
  var _options = options,
1606
1639
  className = _options.className,
1607
1640
  groupLabelClass = _options.groupLabelClass,
1641
+ controlLabelClass = _options.controlLabelClass,
1608
1642
  requiredElement = _options.requiredElement;
1609
1643
  return {
1610
1644
  render: function render(props, labelStart, labelEnd) {
1611
1645
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, labelStart, /*#__PURE__*/React__default["default"].createElement("label", {
1612
1646
  htmlFor: props.forId,
1613
- className: clsx__default["default"](className, props.type === exports.LabelType.Group && groupLabelClass)
1647
+ className: rendererClass(props.className, clsx__default["default"](className, props.type === exports.LabelType.Group && groupLabelClass, props.type === exports.LabelType.Control && controlLabelClass))
1614
1648
  }, props.label, props.required && requiredElement), labelEnd);
1615
1649
  },
1616
1650
  type: "label"
@@ -1701,7 +1735,7 @@ function createDefaultGroupRenderer(options) {
1701
1735
  return function (cp) {
1702
1736
  return _extends({}, cp, {
1703
1737
  children: /*#__PURE__*/React__default["default"].createElement("div", {
1704
- className: clsx__default["default"](props.className, className, gcn),
1738
+ className: rendererClass(props.className, clsx__default["default"](className, gcn)),
1705
1739
  style: style
1706
1740
  }, children == null ? void 0 : children.map(function (c, i) {
1707
1741
  return renderChild(i, i);
@@ -1738,17 +1772,17 @@ function DefaultDisplay(_ref8) {
1738
1772
  case exports.DisplayDataType.Icon:
1739
1773
  return /*#__PURE__*/React__default["default"].createElement("i", {
1740
1774
  style: style,
1741
- className: clsx__default["default"](className, display ? display.value : data.iconClass)
1775
+ className: clsx__default["default"](getOverrideClass(className), display ? display.value : data.iconClass)
1742
1776
  });
1743
1777
  case exports.DisplayDataType.Text:
1744
1778
  return /*#__PURE__*/React__default["default"].createElement("div", {
1745
1779
  style: style,
1746
- className: clsx__default["default"](className, options.textClassName)
1780
+ className: rendererClass(className, options.textClassName)
1747
1781
  }, display ? display.value : data.text);
1748
1782
  case exports.DisplayDataType.Html:
1749
1783
  return /*#__PURE__*/React__default["default"].createElement("div", {
1750
1784
  style: style,
1751
- className: clsx__default["default"](className, options.htmlClassName),
1785
+ className: rendererClass(className, options.htmlClassName),
1752
1786
  dangerouslySetInnerHTML: {
1753
1787
  __html: display ? (_display$value = display.value) != null ? _display$value : "" : data.html
1754
1788
  }
@@ -1836,7 +1870,7 @@ function createDefaultDataRenderer(options) {
1836
1870
  className: props.className,
1837
1871
  control: props.control
1838
1872
  }) : /*#__PURE__*/React__default["default"].createElement(ControlInput, {
1839
- className: clsx__default["default"](props.className, inputClass),
1873
+ className: rendererClass(props.className, inputClass),
1840
1874
  style: props.style,
1841
1875
  id: props.id,
1842
1876
  readOnly: props.readonly,
@@ -1859,7 +1893,7 @@ function DefaultDisplayOnly(_ref9) {
1859
1893
  var text = (_ref10 = schemaInterface.isEmptyValue(field, v) ? emptyText : schemaInterface.textValue(field, v)) != null ? _ref10 : "";
1860
1894
  return /*#__PURE__*/React__default["default"].createElement("div", {
1861
1895
  style: style,
1862
- className: className
1896
+ className: rendererClass(className)
1863
1897
  }, text);
1864
1898
  } finally {
1865
1899
  _effect2();
@@ -1929,7 +1963,7 @@ function createDefaultLayoutRenderer(options) {
1929
1963
  }
1930
1964
  return createLayoutRenderer(function (props, renderers) {
1931
1965
  var layout = renderLayoutParts(_extends({}, props, {
1932
- className: clsx__default["default"](props.className, options.className)
1966
+ className: rendererClass(props.className, options.className)
1933
1967
  }), renderers);
1934
1968
  return {
1935
1969
  children: /*#__PURE__*/React__default["default"].createElement(DefaultLayout, _extends({
@@ -2042,7 +2076,7 @@ function createSelectRenderer(options) {
2042
2076
  }
2043
2077
  return createDataRenderer(function (props, asArray) {
2044
2078
  return /*#__PURE__*/React__default["default"].createElement(SelectDataRenderer, {
2045
- className: clsx__default["default"](props.className, options.className),
2079
+ className: rendererClass(props.className, options.className),
2046
2080
  state: props.control,
2047
2081
  id: props.id,
2048
2082
  options: props.options,
@@ -2190,7 +2224,6 @@ function DefaultLayout(_ref15) {
2190
2224
  var _effect6 = core.useComponentTracking();
2191
2225
  try {
2192
2226
  var errorClass = _ref15.errorClass,
2193
- className = _ref15.className,
2194
2227
  _ref15$layout = _ref15.layout,
2195
2228
  controlEnd = _ref15$layout.controlEnd,
2196
2229
  controlStart = _ref15$layout.controlStart,
@@ -2308,6 +2341,7 @@ exports.findScalarField = findScalarField;
2308
2341
  exports.getAllReferencedClasses = getAllReferencedClasses;
2309
2342
  exports.getControlData = getControlData;
2310
2343
  exports.getDisplayOnlyOptions = getDisplayOnlyOptions;
2344
+ exports.getOverrideClass = getOverrideClass;
2311
2345
  exports.getTypeField = getTypeField;
2312
2346
  exports.groupedControl = groupedControl;
2313
2347
  exports.hasOptions = hasOptions;
@@ -2339,6 +2373,7 @@ exports.matchesType = matchesType;
2339
2373
  exports.mergeField = mergeField;
2340
2374
  exports.renderControlLayout = renderControlLayout;
2341
2375
  exports.renderLayoutParts = renderLayoutParts;
2376
+ exports.rendererClass = rendererClass;
2342
2377
  exports.stringField = stringField;
2343
2378
  exports.stringOptionsField = stringOptionsField;
2344
2379
  exports.textDisplayControl = textDisplayControl;
@@ -2349,6 +2384,7 @@ exports.useEvalDefaultValueHook = useEvalDefaultValueHook;
2349
2384
  exports.useEvalDisabledHook = useEvalDisabledHook;
2350
2385
  exports.useEvalDisplayHook = useEvalDisplayHook;
2351
2386
  exports.useEvalDynamicHook = useEvalDynamicHook;
2387
+ exports.useEvalLabelText = useEvalLabelText;
2352
2388
  exports.useEvalReadonlyHook = useEvalReadonlyHook;
2353
2389
  exports.useEvalStyleHook = useEvalStyleHook;
2354
2390
  exports.useEvalVisibilityHook = useEvalVisibilityHook;