@steroidsjs/core 2.2.37 → 2.2.40
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/actions/form.d.ts +9 -0
- package/actions/form.js +11 -1
- package/hooks/useForm.d.ts +1 -0
- package/hooks/useForm.js +1 -0
- package/package.json +1 -1
- package/reducers/form.js +2 -0
- package/ui/form/DateField/DateField.js +1 -1
- package/ui/form/DateTimeField/DateTimeField.js +1 -1
- package/ui/form/Field/fieldWrapper.js +1 -1
- package/ui/form/FieldList/FieldList.js +2 -1
- package/ui/form/FieldSet/FieldSet.js +3 -1
- package/ui/form/Form/Form.d.ts +11 -0
- package/ui/form/Form/Form.js +36 -10
package/actions/form.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare const FORM_INITIALIZE = "@form/initialize";
|
|
2
2
|
export declare const FORM_CHANGE = "@form/change";
|
|
3
3
|
export declare const FORM_RESET = "@form/reset";
|
|
4
|
+
export declare const FORM_DESTROY = "@form/destroy";
|
|
4
5
|
export declare const FORM_SET_ERRORS = "@form/set_errors";
|
|
5
6
|
export declare const FORM_SUBMIT = "@form/submit";
|
|
6
7
|
export declare const FORM_SET_SUBMITTING = "@form/set_submitting";
|
|
@@ -64,6 +65,14 @@ export declare const formReset: (formId: any) => {
|
|
|
64
65
|
type: string;
|
|
65
66
|
formId: any;
|
|
66
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* Удаление данных формы из redux хранилища
|
|
70
|
+
* @param formId
|
|
71
|
+
*/
|
|
72
|
+
export declare const formDestroy: (formId: any) => {
|
|
73
|
+
type: string;
|
|
74
|
+
formId: any;
|
|
75
|
+
};
|
|
67
76
|
export declare const formArrayAdd: (formId: any, name: any, rowsCount: any, initialValues: any) => {
|
|
68
77
|
type: string;
|
|
69
78
|
formId: any;
|
package/actions/form.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
exports.__esModule = true;
|
|
3
|
-
exports.formArrayRemove = exports.formArrayAdd = exports.formReset = exports.formSetSubmitting = exports.formSubmit = exports.formSetErrors = exports.formChange = exports.formInitialize = exports.FORM_ARRAY_REMOVE = exports.FORM_ARRAY_ADD = exports.FORM_SET_SUBMITTING = exports.FORM_SUBMIT = exports.FORM_SET_ERRORS = exports.FORM_RESET = exports.FORM_CHANGE = exports.FORM_INITIALIZE = void 0;
|
|
3
|
+
exports.formArrayRemove = exports.formArrayAdd = exports.formDestroy = exports.formReset = exports.formSetSubmitting = exports.formSubmit = exports.formSetErrors = exports.formChange = exports.formInitialize = exports.FORM_ARRAY_REMOVE = exports.FORM_ARRAY_ADD = exports.FORM_SET_SUBMITTING = exports.FORM_SUBMIT = exports.FORM_SET_ERRORS = exports.FORM_DESTROY = exports.FORM_RESET = exports.FORM_CHANGE = exports.FORM_INITIALIZE = void 0;
|
|
4
4
|
exports.FORM_INITIALIZE = '@form/initialize';
|
|
5
5
|
exports.FORM_CHANGE = '@form/change';
|
|
6
6
|
exports.FORM_RESET = '@form/reset';
|
|
7
|
+
exports.FORM_DESTROY = '@form/destroy';
|
|
7
8
|
exports.FORM_SET_ERRORS = '@form/set_errors';
|
|
8
9
|
exports.FORM_SUBMIT = '@form/submit';
|
|
9
10
|
exports.FORM_SET_SUBMITTING = '@form/set_submitting';
|
|
@@ -76,6 +77,15 @@ var formReset = function (formId) { return ({
|
|
|
76
77
|
formId: formId
|
|
77
78
|
}); };
|
|
78
79
|
exports.formReset = formReset;
|
|
80
|
+
/**
|
|
81
|
+
* Удаление данных формы из redux хранилища
|
|
82
|
+
* @param formId
|
|
83
|
+
*/
|
|
84
|
+
var formDestroy = function (formId) { return ({
|
|
85
|
+
type: exports.FORM_DESTROY,
|
|
86
|
+
formId: formId
|
|
87
|
+
}); };
|
|
88
|
+
exports.formDestroy = formDestroy;
|
|
79
89
|
var formArrayAdd = function (formId, name, rowsCount, initialValues) { return ({
|
|
80
90
|
type: exports.FORM_ARRAY_ADD,
|
|
81
91
|
formId: formId,
|
package/hooks/useForm.d.ts
CHANGED
package/hooks/useForm.js
CHANGED
|
@@ -9,6 +9,7 @@ function useForm() {
|
|
|
9
9
|
formId: context.formId,
|
|
10
10
|
model: context.model,
|
|
11
11
|
prefix: context.prefix,
|
|
12
|
+
size: context.size,
|
|
12
13
|
layout: context.layout,
|
|
13
14
|
formDispatch: context === null || context === void 0 ? void 0 : context.dispatch,
|
|
14
15
|
formSelector: function (selector) { var _a; return (_a = context === null || context === void 0 ? void 0 : context.provider) === null || _a === void 0 ? void 0 : _a.select(context.formId, selector); }
|
package/package.json
CHANGED
package/reducers/form.js
CHANGED
|
@@ -53,6 +53,8 @@ function reducerItem(state, action) {
|
|
|
53
53
|
return dot_prop_immutable_1.set(state, 'isSubmitting', action.isSubmitting);
|
|
54
54
|
case form_1.FORM_RESET:
|
|
55
55
|
return __assign(__assign({}, state), { values: cloneDeep_1["default"](state.initialValues || {}) });
|
|
56
|
+
case form_1.FORM_DESTROY:
|
|
57
|
+
return null;
|
|
56
58
|
case form_1.FORM_ARRAY_ADD:
|
|
57
59
|
// eslint-disable-next-line no-case-declarations
|
|
58
60
|
var newValue = [].concat(get_1["default"](state, 'values.' + action.name) || []);
|
|
@@ -40,7 +40,7 @@ function DateField(props) {
|
|
|
40
40
|
onClose: onClose,
|
|
41
41
|
isOpened: isOpened,
|
|
42
42
|
inputProps: inputProps,
|
|
43
|
-
calendarProps: calendarProps, size: props.size, icon: props.icon, errors: props.errors, disabled: props.disabled, className: props.className, showRemove: props.showRemove }));
|
|
43
|
+
calendarProps: calendarProps, size: props.size, icon: props.icon, errors: props.errors, label: props.label, disabled: props.disabled, className: props.className, showRemove: props.showRemove }));
|
|
44
44
|
}
|
|
45
45
|
DateField.defaultProps = {
|
|
46
46
|
disabled: false,
|
|
@@ -62,7 +62,7 @@ function DateTimeField(props) {
|
|
|
62
62
|
onClose: onClose,
|
|
63
63
|
inputProps: inputProps,
|
|
64
64
|
calendarProps: calendarProps,
|
|
65
|
-
timePanelViewProps: timePanelViewProps, size: props.size, icon: props.icon, errors: props.errors, className: props.className, showRemove: props.showRemove, isInvalid: props.isInvalid, disabled: props.disabled }));
|
|
65
|
+
timePanelViewProps: timePanelViewProps, size: props.size, icon: props.icon, label: props.label, errors: props.errors, className: props.className, showRemove: props.showRemove, isInvalid: props.isInvalid, disabled: props.disabled }));
|
|
66
66
|
}
|
|
67
67
|
DateTimeField.defaultProps = {
|
|
68
68
|
disabled: false,
|
|
@@ -128,7 +128,7 @@ function fieldWrapper(componentId, Component, optionsConfig) {
|
|
|
128
128
|
// Resolve layout
|
|
129
129
|
var layout = react_1.useMemo(function () { return form_1.mergeLayoutProp(context.layout, props.layout); }, [context.layout, props.layout]);
|
|
130
130
|
if (layout !== null) {
|
|
131
|
-
return components.ui.renderView(FieldLayout_1["default"], __assign(__assign({}, attributesProps), { layout: layout, required: has_1["default"](props, 'required') ? props.required : metaProps.required, label: options.label === false ? null : (has_1["default"](props, 'label') ? props.label : metaProps.label), hint: has_1["default"](props, 'hint') ? props.hint : metaProps.hint, errors: props.errors, children: (React.createElement(Component.DynamicField, __assign({}, props))) }));
|
|
131
|
+
return components.ui.renderView(FieldLayout_1["default"], __assign(__assign({}, attributesProps), { layout: layout, size: props.size || context.size || null, required: has_1["default"](props, 'required') ? props.required : metaProps.required, label: options.label === false ? null : (has_1["default"](props, 'label') ? props.label : metaProps.label), hint: has_1["default"](props, 'hint') ? props.hint : metaProps.hint, errors: props.errors, children: (React.createElement(Component.DynamicField, __assign({}, props))) }));
|
|
132
132
|
}
|
|
133
133
|
return components.ui.renderView(Component.DynamicField, props);
|
|
134
134
|
};
|
|
@@ -85,10 +85,11 @@ function FieldList(props) {
|
|
|
85
85
|
formId: props.formId,
|
|
86
86
|
model: props.model,
|
|
87
87
|
prefix: props.prefix,
|
|
88
|
+
size: props.size,
|
|
88
89
|
layout: props.layout,
|
|
89
90
|
provider: context.provider,
|
|
90
91
|
reducer: context.reducer
|
|
91
|
-
}); }, [context.provider, context.reducer, props.formId, props.layout, props.model, props.prefix]);
|
|
92
|
+
}); }, [context.provider, context.reducer, props.formId, props.layout, props.model, props.prefix, props.size]);
|
|
92
93
|
var commonProps = {
|
|
93
94
|
showAdd: props.showAdd,
|
|
94
95
|
showRemove: props.showRemove,
|
|
@@ -48,10 +48,12 @@ function FieldSet(props) {
|
|
|
48
48
|
prefix: [context.prefix, props.prefix]
|
|
49
49
|
.filter(Boolean)
|
|
50
50
|
.join('.'),
|
|
51
|
+
size: props.size || context.size,
|
|
51
52
|
layout: form_1.mergeLayoutProp(context.layout, props.layout),
|
|
52
53
|
provider: context.provider,
|
|
53
54
|
reducer: context.reducer
|
|
54
|
-
}); }, [context.
|
|
55
|
+
}); }, [context.formId, context.layout, context.model, context.prefix, context.provider, context.reducer,
|
|
56
|
+
context.size, props.formId, props.layout, props.model, props.prefix, props.size]);
|
|
55
57
|
var FieldSetView = props.view || components.ui.getView('form.FieldSetView');
|
|
56
58
|
return (react_1["default"].createElement(Form_1.FormContext.Provider, { value: contextValue },
|
|
57
59
|
react_1["default"].createElement(FieldSetView, __assign({ className: props.className, label: props.label }, props),
|
package/ui/form/Form/Form.d.ts
CHANGED
|
@@ -28,6 +28,11 @@ export interface IFormProps {
|
|
|
28
28
|
* @example POST
|
|
29
29
|
*/
|
|
30
30
|
actionMethod?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Текст ошибки при неудачной отправке данных. По-умолчанию: "Ошибка сервера"
|
|
33
|
+
* @example Упс, что-то пошло не так
|
|
34
|
+
*/
|
|
35
|
+
submitErrorMessage?: string;
|
|
31
36
|
/**
|
|
32
37
|
* Шаблон для полей в форме
|
|
33
38
|
* @example horizontal
|
|
@@ -135,6 +140,11 @@ export interface IFormProps {
|
|
|
135
140
|
* @example true
|
|
136
141
|
*/
|
|
137
142
|
isBordered?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Очищать ли данные формы с redux хранилища при размонтировании компонента. По-умолчанию - false
|
|
145
|
+
* @example false
|
|
146
|
+
*/
|
|
147
|
+
autoDestroy?: boolean;
|
|
138
148
|
[key: string]: any;
|
|
139
149
|
}
|
|
140
150
|
export interface IFormViewProps {
|
|
@@ -165,6 +175,7 @@ export interface IFormContext {
|
|
|
165
175
|
model?: any;
|
|
166
176
|
prefix?: string | boolean;
|
|
167
177
|
layout?: FormLayout;
|
|
178
|
+
size?: Size;
|
|
168
179
|
provider?: any;
|
|
169
180
|
reducer?: {
|
|
170
181
|
dispatch: React.Dispatch<any>;
|
package/ui/form/Form/Form.js
CHANGED
|
@@ -76,6 +76,7 @@ var isUndefined_1 = __importDefault(require("lodash-es/isUndefined"));
|
|
|
76
76
|
var set_1 = __importDefault(require("lodash-es/set"));
|
|
77
77
|
var react_1 = require("react");
|
|
78
78
|
var react_use_1 = require("react-use");
|
|
79
|
+
var notifications_1 = require("../../../actions/notifications");
|
|
79
80
|
var useAddressBar_1 = __importDefault(require("../../../hooks/useAddressBar"));
|
|
80
81
|
var AutoSaveHelper_1 = __importDefault(require("./AutoSaveHelper"));
|
|
81
82
|
var hooks_1 = require("../../../hooks");
|
|
@@ -103,6 +104,7 @@ function Form(props) {
|
|
|
103
104
|
}
|
|
104
105
|
// Get components and dispatch method
|
|
105
106
|
var components = hooks_1.useComponents();
|
|
107
|
+
var reduxDispatch = hooks_1.useDispatch();
|
|
106
108
|
// Normalize layout
|
|
107
109
|
var layout = react_1.useMemo(function () { return form_1.normalizeLayout(props.layout); }, [props.layout]);
|
|
108
110
|
// Address bar synchronization
|
|
@@ -148,6 +150,12 @@ function Form(props) {
|
|
|
148
150
|
//AutoSaveHelper.save(components.clientStorage, props.formId, values);
|
|
149
151
|
}
|
|
150
152
|
}, [props.autoSave, values]);
|
|
153
|
+
// Auto destroy
|
|
154
|
+
react_use_1.useUnmount(function () {
|
|
155
|
+
if (props.autoDestroy) {
|
|
156
|
+
dispatch(form_2.formDestroy(props.formId));
|
|
157
|
+
}
|
|
158
|
+
});
|
|
151
159
|
// OnChange handler
|
|
152
160
|
react_use_1.useUpdateEffect(function () {
|
|
153
161
|
if (props.onChange) {
|
|
@@ -158,7 +166,7 @@ function Form(props) {
|
|
|
158
166
|
var onSubmit = react_1.useCallback(function (e) {
|
|
159
167
|
if (e === void 0) { e = null; }
|
|
160
168
|
return __awaiter(_this, void 0, void 0, function () {
|
|
161
|
-
var cleanedValues, submitResult, captchaAttribute, googleCaptcha, captchaToken, options, response, _a, data;
|
|
169
|
+
var cleanedValues, submitResult, captchaAttribute, googleCaptcha, captchaToken, options, response, _a, requestError_1, data;
|
|
162
170
|
var _b;
|
|
163
171
|
var _this = this;
|
|
164
172
|
return __generator(this, function (_c) {
|
|
@@ -239,31 +247,46 @@ function Form(props) {
|
|
|
239
247
|
}); }
|
|
240
248
|
: undefined
|
|
241
249
|
};
|
|
242
|
-
|
|
243
|
-
return [4 /*yield*/, props.action.call(null, components.api, cleanedValues, options)];
|
|
250
|
+
_c.label = 6;
|
|
244
251
|
case 6:
|
|
252
|
+
_c.trys.push([6, 11, , 12]);
|
|
253
|
+
if (!(typeof props.action === 'function')) return [3 /*break*/, 8];
|
|
254
|
+
return [4 /*yield*/, props.action.call(null, components.api, cleanedValues, options)];
|
|
255
|
+
case 7:
|
|
245
256
|
_a = _c.sent();
|
|
246
|
-
return [3 /*break*/,
|
|
247
|
-
case
|
|
248
|
-
case 8:
|
|
249
|
-
_a = _c.sent();
|
|
250
|
-
_c.label = 9;
|
|
257
|
+
return [3 /*break*/, 10];
|
|
258
|
+
case 8: return [4 /*yield*/, components.http.send(props.actionMethod, props.action || window.location.pathname, cleanedValues, options)];
|
|
251
259
|
case 9:
|
|
260
|
+
_a = _c.sent();
|
|
261
|
+
_c.label = 10;
|
|
262
|
+
case 10:
|
|
252
263
|
response = _a;
|
|
264
|
+
return [3 /*break*/, 12];
|
|
265
|
+
case 11:
|
|
266
|
+
requestError_1 = _c.sent();
|
|
267
|
+
console.error(requestError_1); // eslint-disable-line no-console
|
|
253
268
|
dispatch(form_2.formSetSubmitting(props.formId, false));
|
|
269
|
+
reduxDispatch(notifications_1.showNotification(props.submitErrorMessage || __('Ошибка сервера'), 'danger'));
|
|
270
|
+
return [2 /*return*/, null];
|
|
271
|
+
case 12:
|
|
254
272
|
// Skip on 2fa
|
|
255
273
|
if (response.twoFactor) {
|
|
274
|
+
dispatch(form_2.formSetSubmitting(props.formId, false));
|
|
256
275
|
return [2 /*return*/, null];
|
|
257
276
|
}
|
|
258
277
|
data = response.data || {};
|
|
259
278
|
// Event onAfterSubmit
|
|
260
279
|
if (props.onAfterSubmit && props.onAfterSubmit.call(null, cleanedValues, data, response) === false) {
|
|
280
|
+
dispatch(form_2.formSetSubmitting(props.formId, false));
|
|
261
281
|
return [2 /*return*/, null];
|
|
262
282
|
}
|
|
263
283
|
if (data.errors) {
|
|
284
|
+
dispatch(form_2.formSetSubmitting(props.formId, false));
|
|
264
285
|
setErrors(data.errors);
|
|
265
286
|
return [2 /*return*/, null];
|
|
266
287
|
}
|
|
288
|
+
// Clean errors
|
|
289
|
+
setErrors(null);
|
|
267
290
|
if (props.onComplete) {
|
|
268
291
|
props.onComplete.call(null, cleanedValues, data, response);
|
|
269
292
|
}
|
|
@@ -272,11 +295,13 @@ function Form(props) {
|
|
|
272
295
|
//const AutoSaveHelper = require('../ui/form/Form/AutoSaveHelper').default;
|
|
273
296
|
//AutoSaveHelper.remove(props.clientStorage, props.formId);
|
|
274
297
|
}
|
|
298
|
+
dispatch(form_2.formSetSubmitting(props.formId, false));
|
|
275
299
|
return [2 /*return*/, null];
|
|
276
300
|
}
|
|
277
301
|
});
|
|
278
302
|
});
|
|
279
|
-
}, [
|
|
303
|
+
}, [dispatch, props, values, components.ui, components.resource,
|
|
304
|
+
components.http, components.api, reduxDispatch, setErrors]);
|
|
280
305
|
// Manual submit form by reducer action
|
|
281
306
|
var prevSubmitCounter = react_use_1.usePrevious(submitCounter);
|
|
282
307
|
react_use_1.useUpdateEffect(function () {
|
|
@@ -288,11 +313,12 @@ function Form(props) {
|
|
|
288
313
|
formId: props.formId,
|
|
289
314
|
model: props.model,
|
|
290
315
|
prefix: props.prefix,
|
|
316
|
+
size: props.size,
|
|
291
317
|
layout: props.layout,
|
|
292
318
|
provider: provider,
|
|
293
319
|
reducer: reducer,
|
|
294
320
|
dispatch: dispatch
|
|
295
|
-
}); }, [dispatch, props.formId, props.layout, props.model, props.prefix, provider, reducer]);
|
|
321
|
+
}); }, [dispatch, props.formId, props.layout, props.model, props.prefix, props.size, provider, reducer]);
|
|
296
322
|
// Wait initialization (only for redux)
|
|
297
323
|
if (values === undefined) {
|
|
298
324
|
return null;
|