|
1342 | 1342 |
|
1343 | 1343 | function getContactDropSelection(target) { |
1344 | 1344 | 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 | + } |
1346 | 1357 |
|
1347 | 1358 | addModalContactDropBtn.textContent = target.textContent; |
1348 | 1359 | addModalContactHiddenInput.value = selectedItemValue; // обновление данных в "скрытом" input (для последующей отправки на сервер) |
|
1365 | 1376 | addModalContactInput.focus(); // перевод фокуса на соседний инпут (после выбора в выпадающем списке) |
1366 | 1377 | } |
1367 | 1378 |
|
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 | | - |
1381 | 1379 | function updateDropItemPaddings(dropList) { |
1382 | 1380 | Array.from(dropList.children).forEach((item) => { |
1383 | 1381 | item.classList.remove('first-visible', 'last-visible'); // изначальная очистка от дополнительных классов |
|
1465 | 1463 | createAddModalContactsElement(); |
1466 | 1464 | }); |
1467 | 1465 |
|
| 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 | + |
1468 | 1529 | // ** организация проверки на "пустые" row-контакты, перед закрытием модального окна (вывод сообщения) |
1469 | 1530 | function checkEmptyRowContacts(event) { |
1470 | 1531 | const allContactRows = document.querySelectorAll('.modal-contact-element'); |
|
0 commit comments