Skip to content

Commit 6358c3a

Browse files
committed
[PRAC/cont] Fix sit.. with non-display contact-row
Exclud "not" displaying wrap/contact-row, when add-modal windw reopened. Worth noting: - exclusion of work-off/fixation of elements by the global variable "document" (in case of dynamic components). core: B-3 / JS-BL
1 parent 2f7dd0c commit 6358c3a

File tree

1 file changed

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

1 file changed

+50
-47
lines changed

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

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -902,13 +902,13 @@
902902
});
903903

904904
// ** создание "универсального" модального окна, для добавления или изменения данных клиента (согласно передаваемого типа)
905+
let modalContactsArr = []; // глобальная инициализация массива контактов (будущих row-контактов)
906+
905907
function createModalWindowByType(type, clientData = {}) {
906908
const modalId = type === 'add' ? 'add-modal' : 'edit-modal';
907909
const modalTitle = type === 'add' ? 'Новый клиент' : 'Изменить данные';
908910
const modalCancelBtn = type === 'add' ? 'Отмена' : 'Удалить клиента';
909911

910-
const modalContactsArr = []; // организация массива контактов (будущих контактов)
911-
912912
const modalWrap = document.createElement('div');
913913
const modalDialog = document.createElement('div');
914914
const modalContent = document.createElement('div');
@@ -1152,25 +1152,34 @@
11521152
initTippy(modalHeaderXBtn, 'закрыть', 'left');
11531153
}, 0);
11541154

1155-
// запуск логики добавления/создания "внутренней" строки контактов (передача объекта/context(a) с необходимыми элементами/сущностями)
1155+
// запуск логики добавления/создания "внутренней" строки контактов (передача объекта/context(a) с необходимыми элементами)
11561156
modalBodyAddBtn.addEventListener('click', () => {
11571157
createModalContactsElement({
11581158
modalWrap,
1159+
modalBodyAddContactsRowWrap,
11591160
modalBodyAddBtn,
1160-
modalContactsArr,
11611161
});
11621162
});
11631163

11641164
// запуск проверки на "пустые" контакты (перед закрытием модального окна)
1165-
modalWrap.addEventListener('hide.bs.modal', checkEmptyRowContacts);
1165+
modalWrap.addEventListener('hide.bs.modal', (event) => {
1166+
checkEmptyRowContacts(event, modalWrap);
1167+
});
11661168

11671169
// удаление/очистка от невалидных row-контактов (при закрытие модального окна, передача объекта/context(a))
1168-
modalWrap.addEventListener('hidden.bs.modal', () =>
1170+
modalWrap.addEventListener('hidden.bs.modal', () => {
11691171
removeInvalidRowContacts({
1172+
modalWrap,
1173+
modalBodyAddContactsRowWrap,
11701174
modalBodyAddBtn,
1171-
modalContactsArr,
1172-
})
1173-
);
1175+
});
1176+
1177+
if (modalContactsArr.length === 0) {
1178+
modalBodyAddContactsRowWrap.classList.add('d-none');
1179+
}
1180+
1181+
modalContactsArr = []; // очистка массива
1182+
});
11741183

11751184
return modalWrap; // возврат модального окна (т.е. здесь/без добавления в DOM.. позже, при клике)
11761185
}
@@ -1197,7 +1206,7 @@
11971206

11981207
// ** организация "динамического" добавления строки контакта/row-contact (по нажатию "Добавить контакт" кнопки, в модальных/универсальных окнах)
11991208
function createModalContactsElement(context = {}) {
1200-
const { modalWrap, modalBodyAddBtn, modalContactsArr } = context; // получение необходимых элементов/сущностей (через деструктуризациию входящего/передаваемого объекта)
1209+
const { modalWrap, modalBodyAddContactsRowWrap, modalBodyAddBtn } = context; // получение необходимых элементов (через деструктуризациию входящего/передаваемого объекта)
12011210

12021211
if (modalContactsArr.length >= 10) return; // проверка количества контактов (не более 10)
12031212

@@ -1343,12 +1352,8 @@
13431352
);
13441353

13451354
// отображение изначально скрытой обвёртки/родителя
1346-
const modalContactsRowWrap = document.querySelector(
1347-
'.modal__body-contacts-row-wrap'
1348-
);
1349-
modalContactsRowWrap.classList.remove('d-none');
1350-
1351-
modalContactsRowWrap.append(modalContactElement); // добавление в DOM строки контактов
1355+
modalBodyAddContactsRowWrap.classList.remove('d-none');
1356+
modalBodyAddContactsRowWrap.append(modalContactElement); // добавление в DOM строки контактов
13521357

13531358
// организация дополнительных отступов для "Добавить контакт" кнопки (при появлении строки контактов)
13541359
if (modalContactsArr.length === 0) {
@@ -1375,7 +1380,7 @@
13751380
dynamicContactValidation: true,
13761381
});
13771382

1378-
modalContactsArr.push(modalContactElement); // добавление контакта во "внешний" массив
1383+
modalContactsArr.push(modalContactElement); // добавление контакта во внешний/глобальный массив
13791384

13801385
// исключение ещё/прожатия кнопки "Добавить контакт", если контактов/уже 10 (вывод сообщения)
13811386
if (modalContactsArr.length >= 10) {
@@ -1393,12 +1398,12 @@
13931398
isDropdownToggleAllowed = false;
13941399
setTimeout(() => (isDropdownToggleAllowed = true), 200);
13951400

1396-
const alreadyOpenDropBtn = document.querySelector('.drop-open'); // фиксация открытого/уже списка (согласно drop-кнопки)
1401+
const alreadyOpenDropBtn = modalWrap.querySelector('.drop-open'); // фиксация открытого/уже списка (согласно drop-кнопки)
13971402
const nowClickedDropBtn = event.currentTarget; // фиксация нажатой drop-кнопки (сейчас)
13981403

13991404
// закрытие ранее открытого выпадающего списка (если такой был)
14001405
if (alreadyOpenDropBtn && alreadyOpenDropBtn !== nowClickedDropBtn) {
1401-
closeBtnDropdown();
1406+
closeBtnDropdown(modalWrap);
14021407
}
14031408

14041409
const nowShowedDropList = nowClickedDropBtn.nextElementSibling; // фиксация "ново-открытого" выпадающего списка (согласно drop-кнопки)
@@ -1419,6 +1424,7 @@
14191424
modalContactList.addEventListener('click', (event) => {
14201425
if (event.target.tagName === 'LI') {
14211426
getContactDropSelection(event.target, {
1427+
modalWrap,
14221428
modalContactDropBtn,
14231429
modalContactList,
14241430
modalContactHiddenInput,
@@ -1431,6 +1437,7 @@
14311437
if (event.target.tagName === 'LI' && event.key === 'Enter') {
14321438
event.preventDefault(); // исключение непредвиденных событий/поведения
14331439
getContactDropSelection(event.target, {
1440+
modalWrap,
14341441
modalContactDropBtn,
14351442
modalContactList,
14361443
modalContactHiddenInput,
@@ -1440,29 +1447,29 @@
14401447
});
14411448

14421449
// автоматическое закрытие/скрытие развёрнутого выпадающего drop-списка (при работе НЕ с ним)
1443-
document.addEventListener('click', (event) => {
1444-
const openDropdownBtn = document.querySelector('.drop-open');
1450+
modalWrap.addEventListener('click', (event) => {
1451+
const openDropdownBtn = modalWrap.querySelector('.drop-open');
14451452

14461453
// закрытие/скрытие выпадающего списка (если последующий "клик" не по нему, не по drop-кнопке)
14471454
if (
14481455
openDropdownBtn &&
14491456
!openDropdownBtn.contains(event.target) &&
14501457
!openDropdownBtn.nextElementSibling.contains(event.target)
14511458
) {
1452-
closeBtnDropdown(); // вызов соответствующей функции
1459+
closeBtnDropdown(modalWrap); // вызов соответствующей функции
14531460
}
14541461
});
14551462

14561463
modalWrap.addEventListener('focusout', (event) => {
1457-
const openDropdownBtn = document.querySelector('.drop-open');
1464+
const openDropdownBtn = modalWrap.querySelector('.drop-open');
14581465

14591466
// закрытие/скрытие выпадающего списка (если "фокус" перешёл на другой элемент, в другое место)
14601467
if (
14611468
openDropdownBtn &&
14621469
!openDropdownBtn.contains(event.relatedTarget) &&
14631470
!openDropdownBtn.nextElementSibling.contains(event.relatedTarget)
14641471
) {
1465-
closeBtnDropdown(); // вызов соответствующей функции
1472+
closeBtnDropdown(modalWrap); // вызов соответствующей функции
14661473
}
14671474
});
14681475

@@ -1481,8 +1488,8 @@
14811488
event.stopPropagation(); // исключение непредвиденных событий/поведения
14821489
deleteModalContactsElement(event, {
14831490
modalBodyAddBtn,
1484-
modalContactsArr,
1485-
}); // удаление строки контактов (посредствам "X" кнопки, передача объекта/context(a))
1491+
modalBodyAddContactsRowWrap,
1492+
}); // удаление строки контактов (посредствам "X", передача context(a))
14861493
});
14871494

14881495
// организация удаления строки контактов и через TAB/Enter
@@ -1491,8 +1498,8 @@
14911498
event.stopPropagation(); // исключение непредвиденных событий/поведения
14921499
deleteModalContactsElement(event, {
14931500
modalBodyAddBtn,
1494-
modalContactsArr,
1495-
}); // удаление строки контактов (посредствам "X" кнопки, передача объекта/context(a))
1501+
modalBodyAddContactsRowWrap,
1502+
}); // удаление строки контактов (посредствам "X", передача context(a))
14961503
}
14971504
});
14981505
}
@@ -1501,6 +1508,7 @@
15011508
function getContactDropSelection(target, context = {}) {
15021509
const selectedItemValue = target.getAttribute('data-value');
15031510
const {
1511+
modalWrap,
15041512
modalContactDropBtn,
15051513
modalContactList,
15061514
modalContactHiddenInput,
@@ -1537,7 +1545,7 @@
15371545

15381546
updateRowInputType(modalContactInput, selectedItemValue); // обновление атрибута/значения "type" у/для инпута (кому возможно)
15391547
updateDropItemPaddings(modalContactList); // обновление/изменение отступов для li/вариантов выпадающего списка (для первого и последнего элементов)
1540-
closeBtnDropdown(); // закрытие выпадающего списка
1548+
closeBtnDropdown(modalWrap); // закрытие выпадающего списка
15411549
modalContactInput.focus(); // перевод фокуса на соседний инпут (после выбора в выпадающем списке)
15421550
}
15431551

@@ -1576,8 +1584,8 @@
15761584
}
15771585

15781586
// ** организация закрытия/скрытия выпадающего row-contact списка в модальном окне (снятие фокуса)
1579-
function closeBtnDropdown() {
1580-
const openDropdownBtn = document.querySelector('.drop-open'); // фиксация "открывающей" drop-кнопки
1587+
function closeBtnDropdown(modalWrap) {
1588+
const openDropdownBtn = modalWrap.querySelector('.drop-open'); // фиксация "открывающей" drop-кнопки
15811589

15821590
if (openDropdownBtn) {
15831591
const dropdownList = openDropdownBtn.nextElementSibling; // фиксация выпадающего списка
@@ -1640,7 +1648,7 @@
16401648
// ** удаление строки row-контакта в модальном окне (через "X" кнопку, с/без уточняющего сообщения)
16411649
function deleteModalContactsElement(event, context = {}) {
16421650
const clickedContactsXBtn = event.currentTarget; // получение ИМЕННО кнопки, а не/может внутренней иконки (согласно "размазанного" события)
1643-
const { modalBodyAddBtn, modalContactsArr } = context; // получение необходимых элементов/сущностей (через деструктуризациию входящего/передаваемого объекта)
1651+
const { modalBodyAddBtn, modalBodyAddContactsRowWrap } = context; // получение необходимых элементов (через деструктуризациию входящего/передаваемого объекта)
16441652

16451653
if (clickedContactsXBtn) {
16461654
tippy.hideAll(); // предварительное скрытие всех/вдруг "активных" tooltips (перед удалением искомой строки)
@@ -1682,13 +1690,11 @@
16821690

16831691
// проверка на количество строк контактов (нет, скрытие обвёртки/родителя и удаление дополнительных отступов)
16841692
if (
1685-
document.querySelectorAll('.modal__body-add-contact-element')
1686-
.length === 0
1693+
modalBodyAddContactsRowWrap.querySelectorAll(
1694+
'.modal__body-add-contact-element'
1695+
).length === 0
16871696
) {
1688-
const modalContactsRowWrap = document.querySelector(
1689-
'.modal__body-contacts-row-wrap'
1690-
);
1691-
modalContactsRowWrap.classList.add('d-none');
1697+
modalBodyAddContactsRowWrap.classList.add('d-none');
16921698
modalBodyAddBtn.classList.remove('modal-contact-btn-margin');
16931699
}
16941700
} else {
@@ -1699,8 +1705,8 @@
16991705
}
17001706

17011707
// ** организация проверки на "пустые" row-контакты, перед закрытием соответствующего модального окна (вывод сообщения)
1702-
function checkEmptyRowContacts(event) {
1703-
const allContactRows = document.querySelectorAll('.modal-contact-element');
1708+
function checkEmptyRowContacts(event, modalWrap) {
1709+
const allContactRows = modalWrap.querySelectorAll('.modal-contact-element');
17041710

17051711
// определение "пустых" контактов (формирование соответствующего массива)
17061712
const emptyContacts = Array.from(allContactRows).filter((row) => {
@@ -1724,9 +1730,9 @@
17241730
}
17251731

17261732
// ** удаление/очистка от невалидных row-контактов (при закрытии модального окна)
1727-
function removeInvalidRowContacts(context) {
1728-
const { modalBodyAddBtn, modalContactsArr } = context; // получение необходимых элементов/сущностей (через деструктуризациию входящего/передаваемого объекта)
1729-
const invalidContactRows = document.querySelectorAll(
1733+
function removeInvalidRowContacts(context = {}) {
1734+
const { modalWrap, modalBodyAddContactsRowWrap, modalBodyAddBtn } = context; // получение необходимых элементов (через деструктуризациию входящего/передаваемого объекта)
1735+
const invalidContactRows = modalWrap.querySelectorAll(
17301736
'.modal-contact-element .is-invalid'
17311737
);
17321738

@@ -1750,10 +1756,7 @@
17501756

17511757
// скрытие "обвёртки" контактов если в массиве контактов пусто
17521758
if (modalContactsArr.length === 0) {
1753-
const modalContactsRowWrap = document.querySelector(
1754-
'.modal__body-contacts-row-wrap'
1755-
);
1756-
modalContactsRowWrap.classList.add('d-none');
1759+
modalBodyAddContactsRowWrap.classList.add('d-none');
17571760
modalBodyAddBtn.classList.remove('modal-contact-btn-margin'); // удаление дополнительных отступов
17581761
}
17591762
}

0 commit comments

Comments
 (0)