Skip to content

Commit 0df4858

Browse files
committed
[PRAC/cont] Add "one" func to remove row-contacts
Excep checkEmptyRow..()/removeInvalid..() fnc, organiz deleteModal..(). Worth noting: - removing row-contacts by/with delay/setTimeout(), so that to don't see changes in the modal-window (at the moment of animation/closing). core: B-3 / JS-BL
1 parent 6358c3a commit 0df4858

File tree

1 file changed

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

1 file changed

+46
-55
lines changed

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

Lines changed: 46 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,24 +1161,18 @@
11611161
});
11621162
});
11631163

1164-
// запуск проверки на "пустые" контакты (перед закрытием модального окна)
1164+
// запуск проверки, последующего удаления/сохранения строк контактов в зависимости от состояний/наполнения (при закрытии модального окна, передача объекта/context(a))
11651165
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, {
11721167
modalWrap,
11731168
modalBodyAddContactsRowWrap,
11741169
modalBodyAddBtn,
11751170
});
1171+
});
11761172

1177-
if (modalContactsArr.length === 0) {
1178-
modalBodyAddContactsRowWrap.classList.add('d-none');
1179-
}
1180-
1181-
modalContactsArr = []; // очистка массива
1173+
// очистка массива после закрытия модального окна
1174+
modalWrap.addEventListener('hidden.bs.modal', () => {
1175+
modalContactsArr = [];
11821176
});
11831177

11841178
return modalWrap; // возврат модального окна (т.е. здесь/без добавления в DOM.. позже, при клике)
@@ -1704,61 +1698,58 @@
17041698
}
17051699
}
17061700

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+
);
17101707

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+
);
17151716
});
17161717

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+
);
17271723

1728-
alert(message);
1724+
if (!userConfirmed) {
1725+
event.preventDefault(); // исключение закрытия модального окна
1726+
event.stopPropagation(); // исключение передачи данного события (выше)
1727+
return; // при "Cancel" по confirm, всё остаётся как было (т.е. вообще/без удалений)
1728+
}
17291729
}
1730-
}
17311730

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();
17451736
const contactIndex = modalContactsArr.indexOf(contactRow);
17461737
if (contactIndex > -1) {
17471738
modalContactsArr.splice(contactIndex, 1);
17481739
}
1749-
}
1750-
});
17511740

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+
}
17561745

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+
});
17621753
}
17631754

17641755
// ** дополнительная/местная организация логики для tooltips (т.е. помимо customTippy.js)

0 commit comments

Comments
 (0)