@itcase/forms 1.0.76 → 1.0.78
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/dist/itcase-forms.cjs.js +82 -8
- package/dist/itcase-forms.esm.js +81 -9
- package/package.json +2 -2
package/dist/itcase-forms.cjs.js
CHANGED
|
@@ -36,6 +36,7 @@ var Button = require('@itcase/ui/components/Button');
|
|
|
36
36
|
var Group$1 = require('@itcase/ui/components/Group');
|
|
37
37
|
var Notification = require('@itcase/ui/components/Notification');
|
|
38
38
|
var createDecorator = require('final-form-focus');
|
|
39
|
+
var apisauce = require('apisauce');
|
|
39
40
|
|
|
40
41
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
41
42
|
|
|
@@ -830,13 +831,22 @@ function DatePickerField(props) {
|
|
|
830
831
|
* custom React Hook function.
|
|
831
832
|
*/
|
|
832
833
|
|
|
833
|
-
const onChangeField = React.useCallback((
|
|
834
|
-
|
|
834
|
+
const onChangeField = React.useCallback((startDate, endDate) => {
|
|
835
|
+
if (!datePickerProps.selectsRange) {
|
|
836
|
+
// When we need to save single date, value is date
|
|
837
|
+
// TODO: make object with one date? need to check all forms with DatePickerField
|
|
838
|
+
input.onChange(startDate);
|
|
839
|
+
} else {
|
|
840
|
+
// When we need to save range, value is object with two date
|
|
841
|
+
input.onChange({
|
|
842
|
+
startDate,
|
|
843
|
+
endDate
|
|
844
|
+
});
|
|
845
|
+
}
|
|
835
846
|
if (onChange) {
|
|
836
|
-
|
|
837
|
-
onChange(firstDate, input.name, secondDate);
|
|
847
|
+
onChange(startDate, endDate);
|
|
838
848
|
}
|
|
839
|
-
}, [onChange,
|
|
849
|
+
}, [input.onChange, onChange]);
|
|
840
850
|
const {
|
|
841
851
|
isErrorState,
|
|
842
852
|
isValidState,
|
|
@@ -870,7 +880,8 @@ function DatePickerField(props) {
|
|
|
870
880
|
inputProps: updatedInputProps,
|
|
871
881
|
isDisabled: isDisabled,
|
|
872
882
|
name: input.name,
|
|
873
|
-
value: input.value
|
|
883
|
+
value: datePickerProps.selectsRange ? input.value.startDate : input.value,
|
|
884
|
+
endValue: datePickerProps.selectsRange ? input.value.endDate : null,
|
|
874
885
|
onBlur: input.onBlur,
|
|
875
886
|
onChange: onChangeField,
|
|
876
887
|
onFocus: input.onFocus
|
|
@@ -1675,8 +1686,8 @@ InputField.propTypes = {
|
|
|
1675
1686
|
iconFillHover: PropTypes__default.default.string,
|
|
1676
1687
|
iconRevealableHide: PropTypes__default.default.oneOfType([PropTypes__default.default.elementType, PropTypes__default.default.func, PropTypes__default.default.object]),
|
|
1677
1688
|
iconRevealableShow: PropTypes__default.default.oneOfType([PropTypes__default.default.elementType, PropTypes__default.default.func, PropTypes__default.default.object]),
|
|
1678
|
-
iconShape:
|
|
1679
|
-
iconSize:
|
|
1689
|
+
// iconShape: PropTypes.oneOf(shapeProps),
|
|
1690
|
+
// iconSize: PropTypes.oneOf(iconSizeProps),
|
|
1680
1691
|
initialValue: PropTypes__default.default.oneOfType([PropTypes__default.default.string, PropTypes__default.default.number]),
|
|
1681
1692
|
inputProps: PropTypes__default.default.object,
|
|
1682
1693
|
name: PropTypes__default.default.string.isRequired,
|
|
@@ -3139,6 +3150,67 @@ const DEFAULT_MESSAGES_FIELDS = {
|
|
|
3139
3150
|
}
|
|
3140
3151
|
};
|
|
3141
3152
|
|
|
3153
|
+
const parseNumericField = value => {
|
|
3154
|
+
const numberValue = value.slice(0, 10).replace(/,/g, '.').replace(/[^\d.]/g, '');
|
|
3155
|
+
const parsedValue = parseFloat(numberValue);
|
|
3156
|
+
if (parsedValue || parsedValue === 0) {
|
|
3157
|
+
if (numberValue.endsWith('.')) {
|
|
3158
|
+
if ((numberValue.match(/\./g) || []).length > 1) {
|
|
3159
|
+
return numberValue.slice(0, -1);
|
|
3160
|
+
}
|
|
3161
|
+
return numberValue;
|
|
3162
|
+
}
|
|
3163
|
+
return numberValue;
|
|
3164
|
+
}
|
|
3165
|
+
return '';
|
|
3166
|
+
};
|
|
3167
|
+
const getErrorsForFinalForm = errorData => {
|
|
3168
|
+
/*
|
|
3169
|
+
* errorData - its an "axios" error
|
|
3170
|
+
*/
|
|
3171
|
+
|
|
3172
|
+
const formErrors = {};
|
|
3173
|
+
const responseErrorMessage = errorData.toJSON ? errorData.toJSON().message : errorData.message;
|
|
3174
|
+
|
|
3175
|
+
// const status = (errorData.response && errorData.response.status) || null
|
|
3176
|
+
const problemError = apisauce.getProblemFromError(errorData);
|
|
3177
|
+
// const problemStatus = getProblemFromStatus(status)
|
|
3178
|
+
|
|
3179
|
+
if (problemError === apisauce.NETWORK_ERROR || problemError === apisauce.CONNECTION_ERROR) {
|
|
3180
|
+
// Say to "react-final-form" that we have general error
|
|
3181
|
+
formErrors[finalForm.FORM_ERROR] = 'Проблемы с подключением к сервису';
|
|
3182
|
+
} else if (errorData.response?.data) {
|
|
3183
|
+
// Collect errors for some fields, which in the response from server
|
|
3184
|
+
const serverErrors = errorData.response.data;
|
|
3185
|
+
if (typeof serverErrors === 'string') {
|
|
3186
|
+
if (errorData.response.status === 500) {
|
|
3187
|
+
formErrors[finalForm.FORM_ERROR] = 'Во время обработки запроса произошла ошибка, попробуйте повторить запрос';
|
|
3188
|
+
}
|
|
3189
|
+
// formErrors[FORM_ERROR] = responseErrorMessage
|
|
3190
|
+
} else {
|
|
3191
|
+
if (errorData.response.status === 500) {
|
|
3192
|
+
formErrors[finalForm.FORM_ERROR] = 'Во время обработки запроса произошла ошибка, попробуйте повторить запрос';
|
|
3193
|
+
}
|
|
3194
|
+
for (const key in serverErrors) {
|
|
3195
|
+
// TODO: what is forms has "detail" field? show as form error is well?
|
|
3196
|
+
const errorFieldKey = key === 'non_field_errors' || key === 'detail' ? finalForm.FORM_ERROR : key;
|
|
3197
|
+
// Say to "react-final-form" that we have some fields errors
|
|
3198
|
+
formErrors[errorFieldKey] = castArray__default.default(serverErrors[key])[0];
|
|
3199
|
+
}
|
|
3200
|
+
}
|
|
3201
|
+
} else if (typeof errorData === 'object' && Object.keys(errorData).length) {
|
|
3202
|
+
for (const key in errorData) {
|
|
3203
|
+
const errorFieldKey = key === 'non_field_errors' || key === 'detail' ? finalForm.FORM_ERROR : key;
|
|
3204
|
+
// Say to "react-final-form" that we have some fields errors
|
|
3205
|
+
formErrors[errorFieldKey] = castArray__default.default(errorData[key])[0];
|
|
3206
|
+
}
|
|
3207
|
+
} else {
|
|
3208
|
+
// Say to "react-final-form" that we have general error
|
|
3209
|
+
formErrors[finalForm.FORM_ERROR] = responseErrorMessage || 'Произошла ошибка';
|
|
3210
|
+
}
|
|
3211
|
+
return formErrors;
|
|
3212
|
+
};
|
|
3213
|
+
|
|
3142
3214
|
Object.defineProperty(exports, "Field", {
|
|
3143
3215
|
enumerable: true,
|
|
3144
3216
|
get: function () { return reactFinalForm.Field; }
|
|
@@ -3176,6 +3248,8 @@ exports.focusOnError = focusOnError;
|
|
|
3176
3248
|
exports.focusOnErrorDecorator = focusOnErrorDecorator;
|
|
3177
3249
|
exports.formTypes = formTypes;
|
|
3178
3250
|
exports.generateField = generateField;
|
|
3251
|
+
exports.getErrorsForFinalForm = getErrorsForFinalForm;
|
|
3252
|
+
exports.parseNumericField = parseNumericField;
|
|
3179
3253
|
exports.phoneValidation = phoneValidation;
|
|
3180
3254
|
exports.sendFormDataToServer = sendFormDataToServer;
|
|
3181
3255
|
exports.setErrorsMutator = setErrorsMutator;
|
package/dist/itcase-forms.esm.js
CHANGED
|
@@ -35,6 +35,7 @@ import { Button } from '@itcase/ui/components/Button';
|
|
|
35
35
|
import { Group as Group$1 } from '@itcase/ui/components/Group';
|
|
36
36
|
import { NotificationItem } from '@itcase/ui/components/Notification';
|
|
37
37
|
import createDecorator from 'final-form-focus';
|
|
38
|
+
import { getProblemFromError, NETWORK_ERROR, CONNECTION_ERROR } from 'apisauce';
|
|
38
39
|
|
|
39
40
|
const phoneValidation = (value, context) => {
|
|
40
41
|
if (!value) {
|
|
@@ -818,13 +819,22 @@ function DatePickerField(props) {
|
|
|
818
819
|
* custom React Hook function.
|
|
819
820
|
*/
|
|
820
821
|
|
|
821
|
-
const onChangeField = useCallback((
|
|
822
|
-
|
|
822
|
+
const onChangeField = useCallback((startDate, endDate) => {
|
|
823
|
+
if (!datePickerProps.selectsRange) {
|
|
824
|
+
// When we need to save single date, value is date
|
|
825
|
+
// TODO: make object with one date? need to check all forms with DatePickerField
|
|
826
|
+
input.onChange(startDate);
|
|
827
|
+
} else {
|
|
828
|
+
// When we need to save range, value is object with two date
|
|
829
|
+
input.onChange({
|
|
830
|
+
startDate,
|
|
831
|
+
endDate
|
|
832
|
+
});
|
|
833
|
+
}
|
|
823
834
|
if (onChange) {
|
|
824
|
-
|
|
825
|
-
onChange(firstDate, input.name, secondDate);
|
|
835
|
+
onChange(startDate, endDate);
|
|
826
836
|
}
|
|
827
|
-
}, [onChange,
|
|
837
|
+
}, [input.onChange, onChange]);
|
|
828
838
|
const {
|
|
829
839
|
isErrorState,
|
|
830
840
|
isValidState,
|
|
@@ -858,7 +868,8 @@ function DatePickerField(props) {
|
|
|
858
868
|
inputProps: updatedInputProps,
|
|
859
869
|
isDisabled: isDisabled,
|
|
860
870
|
name: input.name,
|
|
861
|
-
value: input.value
|
|
871
|
+
value: datePickerProps.selectsRange ? input.value.startDate : input.value,
|
|
872
|
+
endValue: datePickerProps.selectsRange ? input.value.endDate : null,
|
|
862
873
|
onBlur: input.onBlur,
|
|
863
874
|
onChange: onChangeField,
|
|
864
875
|
onFocus: input.onFocus
|
|
@@ -1663,8 +1674,8 @@ InputField.propTypes = {
|
|
|
1663
1674
|
iconFillHover: PropTypes.string,
|
|
1664
1675
|
iconRevealableHide: PropTypes.oneOfType([PropTypes.elementType, PropTypes.func, PropTypes.object]),
|
|
1665
1676
|
iconRevealableShow: PropTypes.oneOfType([PropTypes.elementType, PropTypes.func, PropTypes.object]),
|
|
1666
|
-
iconShape: PropTypes.
|
|
1667
|
-
iconSize: PropTypes.
|
|
1677
|
+
// iconShape: PropTypes.oneOf(shapeProps),
|
|
1678
|
+
// iconSize: PropTypes.oneOf(iconSizeProps),
|
|
1668
1679
|
initialValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
1669
1680
|
inputProps: PropTypes.object,
|
|
1670
1681
|
name: PropTypes.string.isRequired,
|
|
@@ -3127,4 +3138,65 @@ const DEFAULT_MESSAGES_FIELDS = {
|
|
|
3127
3138
|
}
|
|
3128
3139
|
};
|
|
3129
3140
|
|
|
3130
|
-
|
|
3141
|
+
const parseNumericField = value => {
|
|
3142
|
+
const numberValue = value.slice(0, 10).replace(/,/g, '.').replace(/[^\d.]/g, '');
|
|
3143
|
+
const parsedValue = parseFloat(numberValue);
|
|
3144
|
+
if (parsedValue || parsedValue === 0) {
|
|
3145
|
+
if (numberValue.endsWith('.')) {
|
|
3146
|
+
if ((numberValue.match(/\./g) || []).length > 1) {
|
|
3147
|
+
return numberValue.slice(0, -1);
|
|
3148
|
+
}
|
|
3149
|
+
return numberValue;
|
|
3150
|
+
}
|
|
3151
|
+
return numberValue;
|
|
3152
|
+
}
|
|
3153
|
+
return '';
|
|
3154
|
+
};
|
|
3155
|
+
const getErrorsForFinalForm = errorData => {
|
|
3156
|
+
/*
|
|
3157
|
+
* errorData - its an "axios" error
|
|
3158
|
+
*/
|
|
3159
|
+
|
|
3160
|
+
const formErrors = {};
|
|
3161
|
+
const responseErrorMessage = errorData.toJSON ? errorData.toJSON().message : errorData.message;
|
|
3162
|
+
|
|
3163
|
+
// const status = (errorData.response && errorData.response.status) || null
|
|
3164
|
+
const problemError = getProblemFromError(errorData);
|
|
3165
|
+
// const problemStatus = getProblemFromStatus(status)
|
|
3166
|
+
|
|
3167
|
+
if (problemError === NETWORK_ERROR || problemError === CONNECTION_ERROR) {
|
|
3168
|
+
// Say to "react-final-form" that we have general error
|
|
3169
|
+
formErrors[FORM_ERROR] = 'Проблемы с подключением к сервису';
|
|
3170
|
+
} else if (errorData.response?.data) {
|
|
3171
|
+
// Collect errors for some fields, which in the response from server
|
|
3172
|
+
const serverErrors = errorData.response.data;
|
|
3173
|
+
if (typeof serverErrors === 'string') {
|
|
3174
|
+
if (errorData.response.status === 500) {
|
|
3175
|
+
formErrors[FORM_ERROR] = 'Во время обработки запроса произошла ошибка, попробуйте повторить запрос';
|
|
3176
|
+
}
|
|
3177
|
+
// formErrors[FORM_ERROR] = responseErrorMessage
|
|
3178
|
+
} else {
|
|
3179
|
+
if (errorData.response.status === 500) {
|
|
3180
|
+
formErrors[FORM_ERROR] = 'Во время обработки запроса произошла ошибка, попробуйте повторить запрос';
|
|
3181
|
+
}
|
|
3182
|
+
for (const key in serverErrors) {
|
|
3183
|
+
// TODO: what is forms has "detail" field? show as form error is well?
|
|
3184
|
+
const errorFieldKey = key === 'non_field_errors' || key === 'detail' ? FORM_ERROR : key;
|
|
3185
|
+
// Say to "react-final-form" that we have some fields errors
|
|
3186
|
+
formErrors[errorFieldKey] = castArray(serverErrors[key])[0];
|
|
3187
|
+
}
|
|
3188
|
+
}
|
|
3189
|
+
} else if (typeof errorData === 'object' && Object.keys(errorData).length) {
|
|
3190
|
+
for (const key in errorData) {
|
|
3191
|
+
const errorFieldKey = key === 'non_field_errors' || key === 'detail' ? FORM_ERROR : key;
|
|
3192
|
+
// Say to "react-final-form" that we have some fields errors
|
|
3193
|
+
formErrors[errorFieldKey] = castArray(errorData[key])[0];
|
|
3194
|
+
}
|
|
3195
|
+
} else {
|
|
3196
|
+
// Say to "react-final-form" that we have general error
|
|
3197
|
+
formErrors[FORM_ERROR] = responseErrorMessage || 'Произошла ошибка';
|
|
3198
|
+
}
|
|
3199
|
+
return formErrors;
|
|
3200
|
+
};
|
|
3201
|
+
|
|
3202
|
+
export { CheckboxField as Checkbox, ChipsField, ChoiceField, CodeField, CustomField, DEFAULT_MESSAGES_FIELDS, DatePickerField, FieldWrapper, FieldWrapperBase, FileInput, FinalForm, Group, InputField, MaskedInputField, RadioGroup, SegmentedField, SelectField, SwitchField as Switch, TextareaField as Textarea, addRequiredFieldsParamToSchema, emailValidation, focusOnError, focusOnErrorDecorator, formTypes, generateField, getErrorsForFinalForm, parseNumericField, phoneValidation, sendFormDataToServer, setErrorsMutator, useYupValidationSchema };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itcase/forms",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.78",
|
|
4
4
|
"description": "Forms fields, inputs, etc.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@itcase/common": "^1.2.17",
|
|
34
|
-
"@itcase/ui": "^1.3.
|
|
34
|
+
"@itcase/ui": "^1.3.15",
|
|
35
35
|
"axios": "^1.7.9",
|
|
36
36
|
"clsx": "^2.1.1",
|
|
37
37
|
"final-form": "^4.20.10",
|