Skip to content

Commit 62583f6

Browse files
committed
[PRAC/cont] Add logic to adding contact elements
Organiz dynamic adding contacts string/elements to "add-modal" window. Worth noting: - and realization the logic to deleting this/such rows by "X" buttons. core: B-3 / JS-BL
1 parent f8d5efe commit 62583f6

File tree

2 files changed

+125
-11
lines changed

2 files changed

+125
-11
lines changed

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/css/modal-add.css

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@
128128
}
129129

130130
.modal__add-body-add-select-wrap {
131+
display: flex;
132+
flex-direction: column;
133+
row-gap: 15px;
131134
margin-bottom: 20px;
132-
padding-right: 30px;
133-
padding-left: 30px;
135+
padding: 25px 30px 0 30px;
134136
width: 100%;
135137

136138
}

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

Lines changed: 121 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -483,13 +483,11 @@
483483
crm.append(crmSearch, crmOutput, crmAdd);
484484

485485
// ** организация появления/скрытия поля для ввода данных/фильтрационного инпута (по нажатию на logo, на 320px)
486-
document
487-
.querySelector('.crm__search-logo-img')
488-
.addEventListener('click', () => {
489-
document
490-
.querySelector('.crm__search-data')
491-
.classList.toggle('show-search-input');
492-
});
486+
searchLogoImg.addEventListener('click', () => {
487+
document
488+
.querySelector('.crm__search-data')
489+
.classList.toggle('show-search-input');
490+
});
493491

494492
// ** организация валидации для ввода данных/фильтрационного инпута (для формы без submit)
495493
function searchFormInputValidation(input) {
@@ -525,7 +523,8 @@
525523
});
526524
}
527525

528-
const searchFormMainInput = document.querySelector('.crm__search-form input'); // получение search-инпута
526+
// получение заглавного search-инпута (последующая валидация)
527+
const searchFormMainInput = document.querySelector('.crm__search-form input');
529528
searchFormInputValidation(searchFormMainInput);
530529

531530
// ** изменение направления стрелки/svg-icon, согласно прожатия по заглавной ячейке (при сортировке данных)
@@ -598,8 +597,121 @@
598597
);
599598
}
600599

600+
// получение всех add-модальных инпутов (последующая валидация)
601601
const allAddModalFormInputs = document.querySelectorAll(
602602
'.modal__add-body-input'
603-
); // получение всех модальных-инпутов
603+
);
604604
addModalFormInputValidation(allAddModalFormInputs);
605+
606+
// ** динамическое добавление строки контактов в add-модальном окне (по нажатию "Добавить контакт" кнопки)
607+
function createAddModalContactsElement() {
608+
const addModalContactElement = document.createElement('div');
609+
addModalContactElement.classList.add(
610+
'modal__add-body-add-contact-element',
611+
'input-group'
612+
);
613+
614+
const addModalContactSelect = document.createElement('select');
615+
addModalContactSelect.classList.add(
616+
'modal__add-body-add-contact-select',
617+
'form-select'
618+
);
619+
addModalContactSelect.setAttribute('id', 'add-modal-select');
620+
addModalContactSelect.setAttribute('name', 'Client contacts');
621+
addModalContactSelect.innerHTML = `
622+
<option value="phone" selected>Телефон</option>
623+
<option value="extra-phone">Доп. телефон</option>
624+
<option value="email">Email</option>
625+
<option value="vk">Vk</option>
626+
<option value="facebook">Facebook</option>
627+
`;
628+
629+
const addModalContactInput = document.createElement('input');
630+
addModalContactInput.classList.add(
631+
'modal__add-body-add-contact-input',
632+
'form-control'
633+
);
634+
// !! нужно добавлять id.. но всем разные
635+
// addModalContactInput.setAttribute('id', 'add-modal-contact-input');
636+
addModalContactInput.setAttribute('type', 'text');
637+
addModalContactInput.setAttribute('placeholder', 'Введите данные контакта');
638+
639+
const addModalContactXBtn = document.createElement('button');
640+
addModalContactXBtn.classList.add(
641+
'modal__add-body-add-x-btn',
642+
'add-modal-delete-btn'
643+
);
644+
addModalContactXBtn.setAttribute('type', 'button');
645+
addModalContactXBtn.setAttribute('tabindex', '0');
646+
addModalContactXBtn.textContent = '✖';
647+
648+
addModalContactElement.append(
649+
addModalContactSelect,
650+
addModalContactInput,
651+
addModalContactXBtn
652+
);
653+
654+
// отображение изначально скрытой обвёртки/родителя
655+
const addBodySelectWrap = document.querySelector(
656+
'.modal__add-body-add-select-wrap'
657+
);
658+
addBodySelectWrap.classList.remove('d-none');
659+
660+
addBodySelectWrap.append(addModalContactElement); // добавление в DOM строки контактов
661+
662+
// добавление "не большого" эффекта/задержки появления для "новой" строки контактов (элемента)
663+
addModalContactElement.style.opacity = '0';
664+
setTimeout(() => {
665+
addModalContactElement.style.transition = 'opacity 0.3s ease';
666+
addModalContactElement.style.opacity = '1';
667+
}, 10);
668+
669+
// организация удаления строки контактов
670+
addModalContactXBtn.addEventListener('click', (event) => {
671+
event.stopPropagation(); // исключение не предвиденных событий/поведения
672+
deleteModalContactsElement(event); // удаление строки контактов (посредствам "X" кнопки)
673+
});
674+
675+
// организация удаления строки контактов и через TAB/Enter
676+
addModalContactXBtn.addEventListener('keydown', (event) => {
677+
if (event.key === 'Enter') {
678+
event.stopPropagation(); // исключение не предвиденных событий/поведения
679+
deleteModalContactsElement(event); // удаление строки контактов (посредствам "X" кнопки)
680+
}
681+
});
682+
}
683+
684+
// запуск логики добавления/создания строки контактов
685+
addModalBodyAddBtn.addEventListener('click', () => {
686+
createAddModalContactsElement();
687+
});
688+
689+
// ** удаление строки контактов в add-модальном окне (через "X" кнопку)
690+
function deleteModalContactsElement(event) {
691+
const clickedContactsXBtn = event.target;
692+
693+
// проверка на входящее прожатие/событие
694+
if (!clickedContactsXBtn) {
695+
return;
696+
}
697+
698+
if (clickedContactsXBtn.classList.contains('add-modal-delete-btn')) {
699+
const modalContactsElement = clickedContactsXBtn.closest('div'); // фиксация родительского элемента
700+
701+
if (modalContactsElement) {
702+
modalContactsElement.remove(); // удаление строки контактов
703+
704+
// проверка на количество строк контактов (нет, скрытие обвёртки/родителя)
705+
if (
706+
document.querySelectorAll('.modal__add-body-add-contact-element')
707+
.length === 0
708+
) {
709+
const addBodySelectWrap = document.querySelector(
710+
'.modal__add-body-add-select-wrap'
711+
);
712+
addBodySelectWrap.classList.add('d-none');
713+
}
714+
}
715+
}
716+
}
605717
})();

0 commit comments

Comments
 (0)