|
1161 | 1161 | }); |
1162 | 1162 | }); |
1163 | 1163 |
|
1164 | | - // запуск проверки на "пустые" контакты (перед закрытием модального окна) |
| 1164 | + // запуск проверки, последующего удаления/сохранения строк контактов в зависимости от состояний/наполнения (при закрытии модального окна, передача объекта/context(a)) |
1165 | 1165 | modalWrap.addEventListener('hide.bs.modal', (event) => { |
1166 | | - checkEmptyRowContacts(event, modalWrap); |
1167 | | - }); |
1168 | | - |
1169 | | - // удаление/очистка от невалидных row-контактов (при закрытие модального окна, передача объекта/context(a)) |
1170 | | - modalWrap.addEventListener('hidden.bs.modal', () => { |
1171 | | - removeInvalidRowContacts({ |
| 1166 | + deleteModalRowContacts(event, { |
1172 | 1167 | modalWrap, |
1173 | 1168 | modalBodyAddContactsRowWrap, |
1174 | 1169 | modalBodyAddBtn, |
1175 | 1170 | }); |
| 1171 | + }); |
1176 | 1172 |
|
1177 | | - if (modalContactsArr.length === 0) { |
1178 | | - modalBodyAddContactsRowWrap.classList.add('d-none'); |
1179 | | - } |
1180 | | - |
1181 | | - modalContactsArr = []; // очистка массива |
| 1173 | + // очистка массива после закрытия модального окна |
| 1174 | + modalWrap.addEventListener('hidden.bs.modal', () => { |
| 1175 | + modalContactsArr = []; |
1182 | 1176 | }); |
1183 | 1177 |
|
1184 | 1178 | return modalWrap; // возврат модального окна (т.е. здесь/без добавления в DOM.. позже, при клике) |
|
1704 | 1698 | } |
1705 | 1699 | } |
1706 | 1700 |
|
1707 | | - // ** организация проверки на "пустые" row-контакты, перед закрытием соответствующего модального окна (вывод сообщения) |
1708 | | - function checkEmptyRowContacts(event, modalWrap) { |
1709 | | - const allContactRows = modalWrap.querySelectorAll('.modal-contact-element'); |
| 1701 | + // ** проверка/последующее удаление незаполненных/невалидных, "просто" row-контактов (при закрытии модального окна) |
| 1702 | + function deleteModalRowContacts(event, context = {}) { |
| 1703 | + const { modalWrap, modalBodyAddContactsRowWrap, modalBodyAddBtn } = context; // получение необходимых элементов (через деструктуризациию входящего/передаваемого объекта) |
| 1704 | + const allContactRows = Array.from( |
| 1705 | + modalWrap.querySelectorAll('.modal-contact-element') // фиксация всех строк контактов |
| 1706 | + ); |
1710 | 1707 |
|
1711 | | - // определение "пустых" контактов (формирование соответствующего массива) |
1712 | | - const emptyContacts = Array.from(allContactRows).filter((row) => { |
1713 | | - const internalInput = row.querySelector('.modal-contact-input'); |
1714 | | - return internalInput && internalInput.value.trim() === ''; |
| 1708 | + // определение заполненных/валидных контактов (хотя бы одного) |
| 1709 | + const validContactsExist = allContactRows.some((row) => { |
| 1710 | + const input = row.querySelector('.modal-contact-input'); |
| 1711 | + return ( |
| 1712 | + input && |
| 1713 | + input.value.trim() !== '' && |
| 1714 | + !input.classList.contains('is-invalid') |
| 1715 | + ); |
1715 | 1716 | }); |
1716 | 1717 |
|
1717 | | - // исключение закрытия/сворачивания модального окна (если есть "пустые" контакты) |
1718 | | - if (emptyContacts.length > 0) { |
1719 | | - event.preventDefault(); |
1720 | | - event.stopPropagation(); |
1721 | | - |
1722 | | - // формирование/вывод сообщения в зависимости от количества контактов |
1723 | | - const message = |
1724 | | - emptyContacts.length === 1 |
1725 | | - ? 'Заполните "пустой" контакт или удалите!' |
1726 | | - : `Заполните "пустые" контакты или удалите!`; |
| 1718 | + // отработка уточняющего сообщения (если есть заполненные/валидные контакты) |
| 1719 | + if (validContactsExist) { |
| 1720 | + const userConfirmed = confirm( |
| 1721 | + 'Есть не сохранённые данные! Закрыть окно?' |
| 1722 | + ); |
1727 | 1723 |
|
1728 | | - alert(message); |
| 1724 | + if (!userConfirmed) { |
| 1725 | + event.preventDefault(); // исключение закрытия модального окна |
| 1726 | + event.stopPropagation(); // исключение передачи данного события (выше) |
| 1727 | + return; // при "Cancel" по confirm, всё остаётся как было (т.е. вообще/без удалений) |
| 1728 | + } |
1729 | 1729 | } |
1730 | | - } |
1731 | 1730 |
|
1732 | | - // ** удаление/очистка от невалидных row-контактов (при закрытии модального окна) |
1733 | | - function removeInvalidRowContacts(context = {}) { |
1734 | | - const { modalWrap, modalBodyAddContactsRowWrap, modalBodyAddBtn } = context; // получение необходимых элементов (через деструктуризациию входящего/передаваемого объекта) |
1735 | | - const invalidContactRows = modalWrap.querySelectorAll( |
1736 | | - '.modal-contact-element .is-invalid' |
1737 | | - ); |
1738 | | - |
1739 | | - invalidContactRows.forEach((invalidInput) => { |
1740 | | - const contactRow = invalidInput.closest('.modal-contact-element'); |
1741 | | - if (contactRow) { |
1742 | | - contactRow.remove(); // удаление всего элемента/родителя |
1743 | | - |
1744 | | - // корректировка массива контактов |
| 1731 | + // удаления "любых" строк, через задержку (ряд дополнительных действий) |
| 1732 | + allContactRows.forEach((contactRow) => { |
| 1733 | + setTimeout(() => { |
| 1734 | + // удаление, обновление массива |
| 1735 | + contactRow.remove(); |
1745 | 1736 | const contactIndex = modalContactsArr.indexOf(contactRow); |
1746 | 1737 | if (contactIndex > -1) { |
1747 | 1738 | modalContactsArr.splice(contactIndex, 1); |
1748 | 1739 | } |
1749 | | - } |
1750 | | - }); |
1751 | 1740 |
|
1752 | | - // проверка общего количества row-контактов |
1753 | | - if (modalContactsArr.length < 10) { |
1754 | | - modalBodyAddBtn.disabled = false; // разблокировка кнопки "Добавить контакт", если меньше 10 контактов |
1755 | | - } |
| 1741 | + // проверка общего количества row-контактов |
| 1742 | + if (modalContactsArr.length < 10) { |
| 1743 | + modalBodyAddBtn.disabled = false; // разблокировка кнопки "Добавить контакт", если меньше 10 контактов |
| 1744 | + } |
1756 | 1745 |
|
1757 | | - // скрытие "обвёртки" контактов если в массиве контактов пусто |
1758 | | - if (modalContactsArr.length === 0) { |
1759 | | - modalBodyAddContactsRowWrap.classList.add('d-none'); |
1760 | | - modalBodyAddBtn.classList.remove('modal-contact-btn-margin'); // удаление дополнительных отступов |
1761 | | - } |
| 1746 | + // скрытие "обвёртки" контактов если в массиве контактов пусто |
| 1747 | + if (modalContactsArr.length === 0) { |
| 1748 | + modalBodyAddContactsRowWrap.classList.add('d-none'); |
| 1749 | + modalBodyAddBtn.classList.remove('modal-contact-btn-margin'); // удаление дополнительных отступов |
| 1750 | + } |
| 1751 | + }, 500); // минимальная задержка (что бы не видеть удаления при анимации/закрытия) |
| 1752 | + }); |
1762 | 1753 | } |
1763 | 1754 |
|
1764 | 1755 | // ** дополнительная/местная организация логики для tooltips (т.е. помимо customTippy.js) |
|
0 commit comments