@steroidsjs/core 3.0.25 → 3.0.27

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.25",
3
+ "version": "3.0.27",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
@@ -125,6 +125,8 @@ function fieldWrapper(componentId, Component, optionsConfig) {
125
125
  return obj;
126
126
  }, {});
127
127
  var attribute = Object.values(attributesProps)[0];
128
+ // Get full path to the field, it is necessary for displaying errors in nested fields, for example, in FieldList
129
+ var errorsAttribute = [props.prefix, attribute].filter(Boolean).join('.');
128
130
  // Get UI props and create Field Class dynamically (for add field props - input, errors, model, ...)
129
131
  var metaProps = (0, react_1.useMemo)(function () { return components.ui.getFieldProps(componentId, model, attribute); }, [components.ui, attribute, model]);
130
132
  if (!Component.DynamicField) {
@@ -136,7 +138,7 @@ function fieldWrapper(componentId, Component, optionsConfig) {
136
138
  return components.ui.renderView(Component.DynamicField, __assign(__assign({}, props), { size: props.size || DEFAULT_SIZE }));
137
139
  }
138
140
  var size = props.size || context.size || DEFAULT_SIZE;
139
- return components.ui.renderView(FieldLayout_1["default"], __assign(__assign({}, attributesProps), { size: size, className: props.fieldLayoutClassName, required: (0, has_1["default"])(props, 'required') ? props.required : metaProps.required, label: options.label === false ? null : ((0, has_1["default"])(props, 'label') ? props.label : metaProps.label), hint: (0, has_1["default"])(props, 'hint') ? props.hint : metaProps.hint, errors: props.errors, id: inputId, children: (React.createElement(Component.DynamicField, __assign({}, props, { id: inputId, size: size }))) }));
141
+ return components.ui.renderView(FieldLayout_1["default"], __assign(__assign({}, attributesProps), { errorsAttribute: errorsAttribute, size: size, className: props.fieldLayoutClassName, required: (0, has_1["default"])(props, 'required') ? props.required : metaProps.required, label: options.label === false ? null : ((0, has_1["default"])(props, 'label') ? props.label : metaProps.label), hint: (0, has_1["default"])(props, 'hint') ? props.hint : metaProps.hint, errors: props.errors, id: inputId, children: (React.createElement(Component.DynamicField, __assign({}, props, { id: inputId, size: size }))) }));
140
142
  };
141
143
  NewComponent.WrappedComponent = Component;
142
144
  NewComponent.displayName = componentId;
@@ -33,7 +33,7 @@ var hooks_1 = require("../../../hooks");
33
33
  function FieldLayout(props) {
34
34
  var components = (0, hooks_1.useComponents)();
35
35
  // Error from state
36
- var errors = (0, hooks_1.useForm)().formSelector(function (state) { return (0, get_1["default"])(state, 'errors.' + props.attribute); });
36
+ var errors = (0, hooks_1.useForm)().formSelector(function (state) { return (0, get_1["default"])(state, 'errors.' + props.errorsAttribute); });
37
37
  var viewProps = (0, react_1.useMemo)(function () { return ({
38
38
  errors: props.errors || errors,
39
39
  className: props.className,
package/utils/form.js CHANGED
@@ -18,11 +18,11 @@ exports.providers = exports.clearErrors = exports.cleanEmptyObject = exports.set
18
18
  var isPlainObject_1 = __importDefault(require("lodash-es/isPlainObject"));
19
19
  var isArray_1 = __importDefault(require("lodash-es/isArray"));
20
20
  var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
21
+ var cloneDeep_1 = __importDefault(require("lodash-es/cloneDeep"));
21
22
  var get_1 = __importDefault(require("lodash-es/get"));
22
- var differenceWith_1 = __importDefault(require("lodash-es/differenceWith"));
23
- var toPairs_1 = __importDefault(require("lodash-es/toPairs"));
24
- var omit_1 = __importDefault(require("lodash-es/omit"));
23
+ var isObject_1 = __importDefault(require("lodash-es/isObject"));
25
24
  var isEmpty_1 = __importDefault(require("lodash-es/isEmpty"));
25
+ var unset_1 = __importDefault(require("lodash-es/unset"));
26
26
  var react_1 = require("react");
27
27
  var react_use_1 = require("react-use");
28
28
  var useDispatch_1 = __importDefault(require("../hooks/useDispatch"));
@@ -81,12 +81,34 @@ var cleanEmptyObject = function (object) {
81
81
  exports.cleanEmptyObject = cleanEmptyObject;
82
82
  var clearErrors = function (values, prevValues, errors, setErrors) {
83
83
  if (!(0, isEmpty_1["default"])(errors) && !(0, isEqual_1["default"])(prevValues || {}, values)) {
84
- // compare arrays of key-value pairs in previous and new field objects to identify the changed field
85
- var changedField = (0, differenceWith_1["default"])((0, toPairs_1["default"])(values), (0, toPairs_1["default"])(prevValues), isEqual_1["default"]);
86
- if (!(0, isEmpty_1["default"])(changedField)) {
87
- var cleanedErrors = (0, omit_1["default"])(errors, changedField[0]);
88
- setErrors((0, isEmpty_1["default"])(cleanedErrors) ? null : cleanedErrors);
89
- }
84
+ var cleanedErrors_1 = (0, cloneDeep_1["default"])(errors);
85
+ var clearFieldErrors_1 = function (errorsPath, currentValue, currentPrevValue) {
86
+ if (!(0, isEqual_1["default"])(currentValue, currentPrevValue)) {
87
+ (0, unset_1["default"])(cleanedErrors_1, errorsPath);
88
+ }
89
+ };
90
+ var iterateErrors_1 = function (currentErrors, currentValues, currentPrevValues, path) {
91
+ if (path === void 0) { path = ''; }
92
+ Object.keys(currentErrors).forEach(function (key) {
93
+ var errorValue = currentErrors[key];
94
+ var newPath = path
95
+ ? [path, key].join('.')
96
+ : key;
97
+ if ((0, isObject_1["default"])(errorValue)
98
+ && !(0, isArray_1["default"])(errorValue)) {
99
+ // Если текущее значение ошибки - объект (но не массив), рекурсивно обрабатываем его
100
+ iterateErrors_1(errorValue, (0, get_1["default"])(currentValues, key, {}), (0, get_1["default"])(currentPrevValues, key, {}), newPath);
101
+ }
102
+ else {
103
+ // Если текущее значение ошибки не объект, проверяем изменение значения
104
+ clearFieldErrors_1(newPath, (0, get_1["default"])(currentValues, key), (0, get_1["default"])(currentPrevValues, key));
105
+ }
106
+ });
107
+ };
108
+ iterateErrors_1(errors, values, prevValues);
109
+ setErrors((0, isEmpty_1["default"])(cleanedErrors_1)
110
+ ? null
111
+ : cleanedErrors_1);
90
112
  }
91
113
  };
92
114
  exports.clearErrors = clearErrors;