Skip to content

Commit c765839

Browse files
committed
[PRAC/cont] Add logic for chg type of row-contact
Organiz chg selection/type of row-contact, after st/entering data/input. Worth noting: - "clearing" notifications for invalid input/validation (from previous types, except similar/telephone). core: B-3 / JS-BL
1 parent 6a6eeab commit c765839

File tree

1 file changed

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

1 file changed

+75
-14
lines changed

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

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,7 +1342,18 @@
13421342

13431343
function getContactDropSelection(target) {
13441344
const selectedItemValue = target.getAttribute('data-value');
1345-
const previousItemValue = addModalContactHiddenInput.value;
1345+
const previousItemValue = addModalContactHiddenInput.value; // фиксация скрытого значения
1346+
1347+
// обработка смены/типа контакта (если/с одного "вдруг" на другой решили)
1348+
if (
1349+
!changeContactRowType(
1350+
addModalContactInput,
1351+
selectedItemValue,
1352+
previousItemValue
1353+
)
1354+
) {
1355+
return; // исключение корректировки, если/в confirm отмена
1356+
}
13461357

13471358
addModalContactDropBtn.textContent = target.textContent;
13481359
addModalContactHiddenInput.value = selectedItemValue; // обновление данных в "скрытом" input (для последующей отправки на сервер)
@@ -1365,19 +1376,6 @@
13651376
addModalContactInput.focus(); // перевод фокуса на соседний инпут (после выбора в выпадающем списке)
13661377
}
13671378

1368-
function updateRowInputType(input, contactType) {
1369-
// объект для сопоставления (кому заменять, на какое значение)
1370-
const typeMapping = {
1371-
phone: 'tel',
1372-
'extra-phone': 'tel',
1373-
email: 'email',
1374-
};
1375-
1376-
// корректировка атрибута/значения "type" (или будет text)
1377-
const newType = typeMapping[contactType] || 'text';
1378-
input.setAttribute('type', newType);
1379-
}
1380-
13811379
function updateDropItemPaddings(dropList) {
13821380
Array.from(dropList.children).forEach((item) => {
13831381
item.classList.remove('first-visible', 'last-visible'); // изначальная очистка от дополнительных классов
@@ -1465,6 +1463,69 @@
14651463
createAddModalContactsElement();
14661464
});
14671465

1466+
// ** организация замены выбора/типа row-контакта, после начала/внесения данных в инпут (вывод уточняющего сообщения)
1467+
function changeContactRowType(input, newType, previousType) {
1468+
const inputCurrentValue = input.value.trim();
1469+
1470+
// определение типов контактов, которые схожи/одного формата (замена без изменений)
1471+
const phoneTypes = ['phone', 'extra-phone'];
1472+
1473+
// проверка на схожий/один формат (просто сообщение о смене)
1474+
if (phoneTypes.includes(previousType) && phoneTypes.includes(newType)) {
1475+
if (inputCurrentValue) {
1476+
alert(
1477+
`Тип контакта: "${
1478+
previousType === 'phone' ? 'Телефон' : 'Доп. телефон'
1479+
}" меняется на "${newType === 'phone' ? 'Телефон' : 'Доп. телефон'}".`
1480+
);
1481+
}
1482+
return true; // завершить без подтверждения
1483+
}
1484+
1485+
// если row-инпут не "пустой" запрос на подтверждение действий
1486+
if (inputCurrentValue) {
1487+
const userConfirmed = confirm(
1488+
'Изменить тип контакта? Разные форматы! Внесённые ранее данные будут удалены.. продолжить?'
1489+
);
1490+
if (!userConfirmed) {
1491+
return false; // отмена изменений
1492+
}
1493+
1494+
input.value = ''; // очистка инпута
1495+
}
1496+
1497+
// очистка от уведомлений на некорректный ввод/валидации (от предыдущих типов, кроме схожих/телефонов)
1498+
if (
1499+
!phoneTypes.includes(newType) ||
1500+
(phoneTypes.includes(newType) && !phoneTypes.includes(previousType))
1501+
) {
1502+
const feedback = input
1503+
.closest('.modal-contact-element')
1504+
.querySelector('.invalid-feedback');
1505+
if (feedback) {
1506+
feedback.textContent = ''; // удаление сообщений
1507+
}
1508+
input.classList.remove('is-invalid'); // исключение классов ошибки
1509+
}
1510+
1511+
updateRowInputType(input, newType); // обновление атрибута/значения "type" у/дя инпута (нового выбора)
1512+
return true; // факт завершения
1513+
}
1514+
1515+
// ** обновление атрибута/значения "type" у/для row-инпута (кому возможно, после выбора)
1516+
function updateRowInputType(input, contactType) {
1517+
// объект для сопоставления (кому заменять, на какое значение)
1518+
const typeMapping = {
1519+
phone: 'tel',
1520+
'extra-phone': 'tel',
1521+
email: 'email',
1522+
};
1523+
1524+
// корректировка атрибута/значения "type" (или будет text)
1525+
const newType = typeMapping[contactType] || 'text';
1526+
input.setAttribute('type', newType);
1527+
}
1528+
14681529
// ** организация проверки на "пустые" row-контакты, перед закрытием модального окна (вывод сообщения)
14691530
function checkEmptyRowContacts(event) {
14701531
const allContactRows = document.querySelectorAll('.modal-contact-element');

0 commit comments

Comments
 (0)