@react-typed-forms/schemas 10.0.2 → 10.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.
@@ -0,0 +1,25 @@
1
+ import { FieldOption } from "../types";
2
+ import { Control } from "@react-typed-forms/core";
3
+ import React from "react";
4
+ export interface CheckRendererOptions {
5
+ className?: string;
6
+ entryClass?: string;
7
+ checkClass?: string;
8
+ labelClass?: string;
9
+ }
10
+ export declare function createRadioRenderer(options?: CheckRendererOptions): import("../renderers").DataRendererRegistration;
11
+ export declare function createCheckListRenderer(options?: CheckRendererOptions): import("../renderers").DataRendererRegistration;
12
+ export declare function CheckButtons({ control, options, labelClass, checkClass, readonly, entryClass, className, id, type, isChecked, setChecked, }: {
13
+ id?: string;
14
+ className?: string;
15
+ options?: FieldOption[] | null;
16
+ control: Control<any>;
17
+ entryClass?: string;
18
+ checkClass?: string;
19
+ labelClass?: string;
20
+ readonly?: boolean;
21
+ type: "checkbox" | "radio";
22
+ isChecked: (c: Control<any>, o: FieldOption) => boolean;
23
+ setChecked: (c: Control<any>, o: FieldOption, checked: boolean) => void;
24
+ }): React.JSX.Element;
25
+ export declare function setIncluded<A>(array: A[], elem: A, included: boolean): A[];
@@ -4,8 +4,8 @@ import { ActionRendererRegistration, AdornmentRendererRegistration, DataRenderer
4
4
  import { CSSProperties, ReactElement, ReactNode } from "react";
5
5
  import { FieldOption, GridRenderer } from "./types";
6
6
  import { SelectRendererOptions } from "./components/SelectDataRenderer";
7
- import { RadioRendererOptions } from "./components/RadioRenderer";
8
7
  import { DefaultArrayRendererOptions } from "./components/DefaultArrayRenderer";
8
+ import { CheckRendererOptions } from "./components/CheckRenderer";
9
9
  export interface DefaultRendererOptions {
10
10
  data?: DefaultDataRendererOptions;
11
11
  display?: DefaultDisplayRendererOptions;
@@ -39,7 +39,9 @@ interface DefaultDataRendererOptions {
39
39
  inputClass?: string;
40
40
  displayOnlyClass?: string;
41
41
  selectOptions?: SelectRendererOptions;
42
- radioOptions?: RadioRendererOptions;
42
+ checkOptions?: CheckRendererOptions;
43
+ radioOptions?: CheckRendererOptions;
44
+ checkListOptions?: CheckRendererOptions;
43
45
  booleanOptions?: FieldOption[];
44
46
  optionRenderer?: DataRendererRegistration;
45
47
  }
package/lib/index.d.ts CHANGED
@@ -13,7 +13,7 @@ export * from "./createFormRenderer";
13
13
  export * from "./components/DefaultDisplay";
14
14
  export * from "./components/ControlInput";
15
15
  export * from "./components/SelectDataRenderer";
16
- export * from "./components/RadioRenderer";
16
+ export * from "./components/CheckRenderer";
17
17
  export * from "./components/DefaultLayout";
18
18
  export * from "./components/DefaultDisplayOnly";
19
19
  export * from "./components/DefaultVisibility";
package/lib/index.js CHANGED
@@ -210,27 +210,31 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
210
210
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
211
211
  }
212
212
 
213
- function applyDefaultValues(v, fields) {
213
+ function applyDefaultValues(v, fields, doneSet) {
214
+ var _doneSet;
214
215
  if (!v) return defaultValueForFields(fields);
216
+ if (doneSet && doneSet.has(v)) return v;
217
+ (_doneSet = doneSet) != null ? _doneSet : doneSet = new Set();
218
+ doneSet.add(v);
215
219
  var applyValue = fields.filter(function (x) {
216
220
  return isCompoundField(x) || !(x.field in v);
217
221
  });
218
222
  if (!applyValue.length) return v;
219
223
  var out = _extends({}, v);
220
224
  applyValue.forEach(function (x) {
221
- out[x.field] = x.field in v ? applyDefaultForField(v[x.field], x, fields) : defaultValueForField(x);
225
+ out[x.field] = x.field in v ? applyDefaultForField(v[x.field], x, fields, false, doneSet) : defaultValueForField(x);
222
226
  });
223
227
  return out;
224
228
  }
225
- function applyDefaultForField(v, field, parent, notElement) {
229
+ function applyDefaultForField(v, field, parent, notElement, doneSet) {
226
230
  if (field.collection && !notElement) {
227
231
  return (v != null ? v : []).map(function (x) {
228
- return applyDefaultForField(x, field, parent, true);
232
+ return applyDefaultForField(x, field, parent, true, doneSet);
229
233
  });
230
234
  }
231
235
  if (isCompoundField(field)) {
232
236
  if (!v && !field.required) return v;
233
- return applyDefaultValues(v, field.treeChildren ? parent : field.children);
237
+ return applyDefaultValues(v, field.treeChildren ? parent : field.children, doneSet);
234
238
  }
235
239
  return defaultValueForField(field);
236
240
  }
@@ -1747,7 +1751,11 @@ var defaultTailwindTheme = {
1747
1751
  errorClass: "text-sm text-danger-500"
1748
1752
  },
1749
1753
  data: {
1750
- displayOnlyClass: "flex flex-row items-center gap-2"
1754
+ displayOnlyClass: "flex flex-row items-center gap-2",
1755
+ checkOptions: {
1756
+ className: "flex items-center gap-4",
1757
+ entryClass: "flex gap-1 items-center"
1758
+ }
1751
1759
  }
1752
1760
  };
1753
1761
 
@@ -2020,32 +2028,113 @@ function createInputConversion(ft) {
2020
2028
  }
2021
2029
  }
2022
2030
 
2031
+ function createDefaultArrayRenderer(options) {
2032
+ return {
2033
+ render: function render(props, _ref) {
2034
+ var renderAction = _ref.renderAction;
2035
+ return /*#__PURE__*/React__default["default"].createElement(DefaultArrayRenderer, _extends({}, props, options, {
2036
+ renderAction: renderAction
2037
+ }));
2038
+ },
2039
+ type: "array"
2040
+ };
2041
+ }
2042
+ function DefaultArrayRenderer(props) {
2043
+ var _effect = core.useComponentTracking();
2044
+ try {
2045
+ var renderElement = props.renderElement,
2046
+ className = props.className,
2047
+ removableClass = props.removableClass,
2048
+ childClass = props.childClass,
2049
+ removableChildClass = props.removableChildClass,
2050
+ removeActionClass = props.removeActionClass,
2051
+ addActionClass = props.addActionClass,
2052
+ arrayControl = props.arrayControl,
2053
+ renderAction = props.renderAction,
2054
+ style = props.style;
2055
+ var _applyArrayLengthRest = applyArrayLengthRestrictions(props),
2056
+ addAction = _applyArrayLengthRest.addAction,
2057
+ removeAction = _applyArrayLengthRest.removeAction;
2058
+ return /*#__PURE__*/React__default["default"].createElement("div", {
2059
+ style: style
2060
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
2061
+ className: clsx__default["default"](className, removeAction && removableClass)
2062
+ }, /*#__PURE__*/React__default["default"].createElement(core.RenderElements, {
2063
+ control: arrayControl
2064
+ }, function (_, x) {
2065
+ return removeAction ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
2066
+ className: clsx__default["default"](childClass, removableChildClass)
2067
+ }, renderElement(x)), /*#__PURE__*/React__default["default"].createElement("div", {
2068
+ className: removeActionClass
2069
+ }, renderAction(removeAction(x)))) : /*#__PURE__*/React__default["default"].createElement("div", {
2070
+ className: childClass
2071
+ }, renderElement(x));
2072
+ })), addAction && /*#__PURE__*/React__default["default"].createElement("div", {
2073
+ className: addActionClass
2074
+ }, renderAction(addAction)));
2075
+ } finally {
2076
+ _effect();
2077
+ }
2078
+ }
2079
+
2023
2080
  function createRadioRenderer(options) {
2024
2081
  if (options === void 0) {
2025
2082
  options = {};
2026
2083
  }
2027
2084
  return createDataRenderer(function (p) {
2028
- return /*#__PURE__*/React__default["default"].createElement(RadioButtons, _extends({}, options, p, {
2085
+ return /*#__PURE__*/React__default["default"].createElement(CheckButtons, _extends({}, options, p, {
2029
2086
  className: rendererClass(p.className, options.className),
2030
- control: p.control
2087
+ isChecked: function isChecked(control, o) {
2088
+ return control.value == o.value;
2089
+ },
2090
+ setChecked: function setChecked(c, o) {
2091
+ return c.value = o.value;
2092
+ },
2093
+ control: p.control,
2094
+ type: "radio"
2031
2095
  }));
2032
2096
  }, {
2033
2097
  renderType: exports.DataRenderType.Radio
2034
2098
  });
2035
2099
  }
2036
- function RadioButtons(_ref) {
2100
+ function createCheckListRenderer(options) {
2101
+ if (options === void 0) {
2102
+ options = {};
2103
+ }
2104
+ return createDataRenderer(function (p) {
2105
+ return /*#__PURE__*/React__default["default"].createElement(CheckButtons, _extends({}, options, p, {
2106
+ className: rendererClass(p.className, options.className),
2107
+ isChecked: function isChecked(control, o) {
2108
+ var v = control.value;
2109
+ return Array.isArray(v) ? v.includes(o.value) : false;
2110
+ },
2111
+ setChecked: function setChecked(c, o, checked) {
2112
+ c.setValue(function (x) {
2113
+ return setIncluded(x != null ? x : [], o.value, checked);
2114
+ });
2115
+ },
2116
+ control: p.control,
2117
+ type: "checkbox"
2118
+ }));
2119
+ }, {
2120
+ renderType: exports.DataRenderType.CheckList
2121
+ });
2122
+ }
2123
+ function CheckButtons(_ref) {
2037
2124
  var _effect = core.useComponentTracking();
2038
2125
  try {
2039
2126
  var control = _ref.control,
2040
2127
  options = _ref.options,
2041
2128
  labelClass = _ref.labelClass,
2042
- radioClass = _ref.radioClass,
2129
+ checkClass = _ref.checkClass,
2043
2130
  readonly = _ref.readonly,
2044
2131
  entryClass = _ref.entryClass,
2045
2132
  className = _ref.className,
2046
- id = _ref.id;
2133
+ id = _ref.id,
2134
+ type = _ref.type,
2135
+ isChecked = _ref.isChecked,
2136
+ setChecked = _ref.setChecked;
2047
2137
  var disabled = control.disabled;
2048
- var canChange = !disabled && !readonly;
2049
2138
  var name = "r" + control.uniqueId;
2050
2139
  return /*#__PURE__*/React__default["default"].createElement("div", {
2051
2140
  className: className,
@@ -2055,19 +2144,22 @@ function RadioButtons(_ref) {
2055
2144
  return x.value != null;
2056
2145
  })
2057
2146
  }, function (o, i) {
2147
+ var checked = core.useComputed(function () {
2148
+ return isChecked(control, o);
2149
+ }).value;
2058
2150
  return /*#__PURE__*/React__default["default"].createElement("div", {
2059
2151
  key: i,
2060
2152
  className: entryClass
2061
2153
  }, /*#__PURE__*/React__default["default"].createElement("input", {
2062
2154
  id: name + "_" + i,
2063
- className: radioClass,
2064
- type: "radio",
2155
+ className: checkClass,
2156
+ type: type,
2065
2157
  name: name,
2066
2158
  readOnly: readonly,
2067
2159
  disabled: disabled,
2068
- checked: control.value == o.value,
2160
+ checked: checked,
2069
2161
  onChange: function onChange(x) {
2070
- return control.value = o.value;
2162
+ return setChecked(control, o, x.target.checked);
2071
2163
  }
2072
2164
  }), /*#__PURE__*/React__default["default"].createElement("label", {
2073
2165
  className: labelClass,
@@ -2078,54 +2170,17 @@ function RadioButtons(_ref) {
2078
2170
  _effect();
2079
2171
  }
2080
2172
  }
2081
-
2082
- function createDefaultArrayRenderer(options) {
2083
- return {
2084
- render: function render(props, _ref) {
2085
- var renderAction = _ref.renderAction;
2086
- return /*#__PURE__*/React__default["default"].createElement(DefaultArrayRenderer, _extends({}, props, options, {
2087
- renderAction: renderAction
2088
- }));
2089
- },
2090
- type: "array"
2091
- };
2092
- }
2093
- function DefaultArrayRenderer(props) {
2094
- var _effect = core.useComponentTracking();
2095
- try {
2096
- var renderElement = props.renderElement,
2097
- className = props.className,
2098
- removableClass = props.removableClass,
2099
- childClass = props.childClass,
2100
- removableChildClass = props.removableChildClass,
2101
- removeActionClass = props.removeActionClass,
2102
- addActionClass = props.addActionClass,
2103
- arrayControl = props.arrayControl,
2104
- renderAction = props.renderAction,
2105
- style = props.style;
2106
- var _applyArrayLengthRest = applyArrayLengthRestrictions(props),
2107
- addAction = _applyArrayLengthRest.addAction,
2108
- removeAction = _applyArrayLengthRest.removeAction;
2109
- return /*#__PURE__*/React__default["default"].createElement("div", {
2110
- style: style
2111
- }, /*#__PURE__*/React__default["default"].createElement("div", {
2112
- className: clsx__default["default"](className, removeAction && removableClass)
2113
- }, /*#__PURE__*/React__default["default"].createElement(core.RenderElements, {
2114
- control: arrayControl
2115
- }, function (_, x) {
2116
- return removeAction ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
2117
- className: clsx__default["default"](childClass, removableChildClass)
2118
- }, renderElement(x)), /*#__PURE__*/React__default["default"].createElement("div", {
2119
- className: removeActionClass
2120
- }, renderAction(removeAction(x)))) : /*#__PURE__*/React__default["default"].createElement("div", {
2121
- className: childClass
2122
- }, renderElement(x));
2123
- })), addAction && /*#__PURE__*/React__default["default"].createElement("div", {
2124
- className: addActionClass
2125
- }, renderAction(addAction)));
2126
- } finally {
2127
- _effect();
2173
+ function setIncluded(array, elem, included) {
2174
+ var already = array.includes(elem);
2175
+ if (included === already) {
2176
+ return array;
2177
+ }
2178
+ if (included) {
2179
+ return [].concat(array, [elem]);
2128
2180
  }
2181
+ return array.filter(function (e) {
2182
+ return e !== elem;
2183
+ });
2129
2184
  }
2130
2185
 
2131
2186
  function createDefaultActionRenderer(options) {
@@ -2210,11 +2265,13 @@ var DefaultBoolOptions = [{
2210
2265
  value: false
2211
2266
  }];
2212
2267
  function createDefaultDataRenderer(options) {
2268
+ var _options$radioOptions, _options$checkListOpt;
2213
2269
  if (options === void 0) {
2214
2270
  options = {};
2215
2271
  }
2216
2272
  var selectRenderer = createSelectRenderer(options.selectOptions);
2217
- var radioRenderer = createRadioRenderer(options.radioOptions);
2273
+ var radioRenderer = createRadioRenderer((_options$radioOptions = options.radioOptions) != null ? _options$radioOptions : options.checkOptions);
2274
+ var checkListRenderer = createCheckListRenderer((_options$checkListOpt = options.checkListOptions) != null ? _options$checkListOpt : options.checkOptions);
2218
2275
  var _optionRenderer$boole = _extends({
2219
2276
  optionRenderer: selectRenderer,
2220
2277
  booleanOptions: DefaultBoolOptions
@@ -2225,14 +2282,15 @@ function createDefaultDataRenderer(options) {
2225
2282
  displayOnlyClass = _optionRenderer$boole.displayOnlyClass;
2226
2283
  return createDataRenderer(function (props, renderers) {
2227
2284
  var fieldType = props.field.type;
2228
- if (props.toArrayProps) {
2285
+ var renderOptions = props.renderOptions;
2286
+ var renderType = renderOptions.type;
2287
+ if (props.toArrayProps && renderType !== exports.DataRenderType.CheckList) {
2229
2288
  return function (p) {
2230
2289
  return _extends({}, p, {
2231
2290
  children: renderers.renderArray(props.toArrayProps())
2232
2291
  });
2233
2292
  };
2234
2293
  }
2235
- var renderOptions = props.renderOptions;
2236
2294
  if (fieldType === exports.FieldType.Compound) {
2237
2295
  var _ref5;
2238
2296
  var groupOptions = (_ref5 = isDataGroupRenderer(renderOptions) ? renderOptions.groupOptions : undefined) != null ? _ref5 : {
@@ -2243,7 +2301,6 @@ function createDefaultDataRenderer(options) {
2243
2301
  renderOptions: groupOptions
2244
2302
  }));
2245
2303
  }
2246
- var renderType = renderOptions.type;
2247
2304
  if (fieldType == exports.FieldType.Any) return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, "No control for Any");
2248
2305
  if (isDisplayOnlyRenderer(renderOptions)) return function (p) {
2249
2306
  return _extends({}, p, {
@@ -2268,6 +2325,8 @@ function createDefaultDataRenderer(options) {
2268
2325
  return optionRenderer.render(props, renderers);
2269
2326
  }
2270
2327
  switch (renderType) {
2328
+ case exports.DataRenderType.CheckList:
2329
+ return checkListRenderer.render(props, renderers);
2271
2330
  case exports.DataRenderType.Dropdown:
2272
2331
  return selectRenderer.render(props, renderers);
2273
2332
  case exports.DataRenderType.Radio:
@@ -2526,6 +2585,7 @@ function isArrayRegistration(x) {
2526
2585
  }
2527
2586
 
2528
2587
  exports.AppendAdornmentPriority = AppendAdornmentPriority;
2588
+ exports.CheckButtons = CheckButtons;
2529
2589
  exports.ControlInput = ControlInput;
2530
2590
  exports.ControlRenderer = ControlRenderer;
2531
2591
  exports.DefaultBoolOptions = DefaultBoolOptions;
@@ -2534,7 +2594,6 @@ exports.DefaultDisplayOnly = DefaultDisplayOnly;
2534
2594
  exports.DefaultLayout = DefaultLayout;
2535
2595
  exports.DefaultSchemaInterface = DefaultSchemaInterface;
2536
2596
  exports.DefaultVisibility = DefaultVisibility;
2537
- exports.RadioButtons = RadioButtons;
2538
2597
  exports.SelectDataRenderer = SelectDataRenderer;
2539
2598
  exports.WrapAdornmentPriority = WrapAdornmentPriority;
2540
2599
  exports.addFieldOption = addFieldOption;
@@ -2557,6 +2616,7 @@ exports.controlTitle = controlTitle;
2557
2616
  exports.createAction = createAction;
2558
2617
  exports.createAdornmentRenderer = createAdornmentRenderer;
2559
2618
  exports.createArrayRenderer = createArrayRenderer;
2619
+ exports.createCheckListRenderer = createCheckListRenderer;
2560
2620
  exports.createDataRenderer = createDataRenderer;
2561
2621
  exports.createDefaultActionRenderer = createDefaultActionRenderer;
2562
2622
  exports.createDefaultAdornmentRenderer = createDefaultAdornmentRenderer;
@@ -2642,6 +2702,7 @@ exports.renderControlLayout = renderControlLayout;
2642
2702
  exports.renderLayoutParts = renderLayoutParts;
2643
2703
  exports.rendererClass = rendererClass;
2644
2704
  exports.resolveSchemas = resolveSchemas;
2705
+ exports.setIncluded = setIncluded;
2645
2706
  exports.stringField = stringField;
2646
2707
  exports.stringOptionsField = stringOptionsField;
2647
2708
  exports.textDisplayControl = textDisplayControl;