Skip to content

Commit b5b2d02

Browse files
committed
[PRAC/cont] Correct "add" logic for validation
Organiz check/min length for enter data to modal inputs (FIO, contacts). Worth noting: - validation corrections for row-contact "email" in the main validation function. core: B-3 / JS-BL
1 parent e5e6553 commit b5b2d02

File tree

1 file changed

+82
-12
lines changed
  • core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/js

1 file changed

+82
-12
lines changed

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/js/index.js

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -373,10 +373,18 @@
373373
}
374374

375375
// исключение недопустимых символов (вообще)
376-
target.value = target.value.replace(
377-
/[=+,`~!?%#$^&:{}()<>|"'*/\\]/g,
378-
''
379-
);
376+
const invalidCharacters = /[=+,`;~!?%#$^&:{}()<>|"'*/\\]/g;
377+
378+
if (invalidCharacters.test(target.value)) {
379+
errors.push(
380+
'Введите корректную почту, например: [email protected]'
381+
);
382+
target.classList.add('is-invalid');
383+
invalidFeed.textContent =
384+
'Введите корректную почту, например: [email protected]';
385+
}
386+
387+
target.value = target.value.replace(invalidCharacters, '');
380388

381389
// отдельная обработка пробелов через событие "beforeinput" (попытка исключить непонятный возврат "каретки" в начало строки/инпута при вводе пробела)
382390
target.addEventListener('beforeinput', (event) => {
@@ -889,6 +897,31 @@
889897
// ** организация "дополнительной" логики для валидации полей ввода/инпутов в модальных окнах (при/в "submit" состояниях)
890898
function additionalFormInputsValidation(allModalInputs, modalBodyForm) {
891899
const validErrors = [];
900+
// определение минимального количества букв/символов (для каждого инпут/типа поля)
901+
const minLengths = {
902+
'modal-surname-input': 3,
903+
'modal-name-input': 2,
904+
'modal-patronymic-input': 5,
905+
'modal-contact-input': {
906+
phone: 18,
907+
'extra-phone': 18,
908+
vk: 7,
909+
email: 6,
910+
facebook: 5,
911+
twitter: 3,
912+
'extra-contact': 3,
913+
},
914+
};
915+
// использование названий как в drop-down меню
916+
const contactTypeLabels = {
917+
phone: 'Телефон',
918+
'extra-phone': 'Доп. телефон',
919+
vk: 'Vk',
920+
email: 'Email',
921+
facebook: 'Facebook',
922+
twitter: 'Twitter',
923+
'extra-contact': 'Доп. контакт',
924+
};
892925

893926
allModalInputs.forEach((input) => {
894927
const parent = input.parentNode;
@@ -915,14 +948,51 @@
915948
input.classList.add('is-invalid'); // выделение инпута "красным"
916949
}
917950
} else {
918-
// отображение ошибок
919-
if (input.classList.contains('is-invalid')) {
920-
return; // если "is-invalid".. оставляем
951+
// проверка минимальной длины вводимых данных
952+
const inputClass = Object.keys(minLengths).find((className) =>
953+
input.classList.contains(className)
954+
);
955+
956+
// для полей ФИО
957+
if (inputClass && typeof minLengths[inputClass] === 'number') {
958+
if (input.value.length < minLengths[inputClass]) {
959+
const fieldName = {
960+
'modal-surname-input': 'Фамилия',
961+
'modal-name-input': 'Имя',
962+
'modal-patronymic-input': 'Отчество',
963+
}[inputClass];
964+
965+
validErrors.push(
966+
`Поле "${fieldName}" должно быть не менее ${minLengths[inputClass]} символов!`
967+
);
968+
input.classList.add('is-invalid');
969+
if (feedback)
970+
feedback.textContent = validErrors[validErrors.length - 1];
971+
}
972+
}
973+
974+
// для строк контактов
975+
if (input.classList.contains('modal-contact-input')) {
976+
const hiddenInput = parent.querySelector('.modal-hidden-input');
977+
const contactType = hiddenInput ? hiddenInput.value : '';
978+
const minLength = minLengths['modal-contact-input'][contactType] || 0;
979+
const contactLabel = contactTypeLabels[contactType] || 'Контакт';
980+
981+
if (input.value.length < minLength) {
982+
validErrors.push(
983+
`Поле "${contactLabel}" должно быть не менее ${minLength} символов!`
984+
);
985+
input.classList.add('is-invalid');
986+
if (feedback)
987+
feedback.textContent = validErrors[validErrors.length - 1];
988+
}
921989
}
922990

923-
// а если данные валидны, отмена выделения/исключение сообщения
924-
input.classList.remove('is-invalid');
925-
if (feedback) feedback.textContent = '';
991+
// Если данные валидны, убираем ошибки
992+
if (!input.classList.contains('is-invalid')) {
993+
input.classList.remove('is-invalid');
994+
if (feedback) feedback.textContent = '';
995+
}
926996
}
927997
});
928998

@@ -2091,8 +2161,8 @@
20912161
.querySelector('.invalid-feedback');
20922162
if (
20932163
feedback &&
2094-
feedback.textContent.trim() !==
2095-
'Заполните поле "Отчество" или оставьте его пустым!'
2164+
feedback.textContent.trim() &&
2165+
input.value.trim() !== ''
20962166
) {
20972167
return true; // другие сообщения.. кнопка "Сохранить" будет не доступной
20982168
}

0 commit comments

Comments
 (0)