Skip to content

Commit bba1fec

Browse files
committed
[PRAC/cont] Add logic to exclude selected li/el
Organiz hiding selected li/element from dropdown menu (no duplication). Worth noting: - updateDropItemPaddings() function to update the indents (for first/last li/element). core: B-3 / JS-BL
1 parent 7ce43e2 commit bba1fec

File tree

2 files changed

+52
-35
lines changed

2 files changed

+52
-35
lines changed

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
outline: none;
1414
}
1515

16-
.add-modal-content-padding {
17-
padding-bottom: 30px;
18-
}
19-
2016
.modal__add-header,
2117
.modal__add-body,
2218
.modal__add-footer {
@@ -295,7 +291,7 @@
295291
box-sizing: border-box;
296292
margin: 0;
297293
padding: 0;
298-
padding: 3px 10px;
294+
padding: 4px 10px;
299295
font-size: 12px;
300296
outline: none;
301297
cursor: pointer;
@@ -304,11 +300,11 @@
304300
transition-timing-function: ease;
305301
}
306302

307-
.modal__add-body-add-contact-item:first-child {
308-
padding-top: 8px;
303+
.modal__add-body-add-contact-item.first-visible {
304+
padding-top: 9px;
309305
}
310306

311-
.modal__add-body-add-contact-item:last-child {
307+
.modal__add-body-add-contact-item.last-visible {
312308
padding-bottom: 5px;
313309
}
314310

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

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@
779779
const addModalContactCustomSelect = document.createElement('div');
780780
const addModalContactDropBtn = document.createElement('button');
781781
const addModalContactList = document.createElement('ul');
782+
const addModalContactItemPhone = document.createElement('li');
782783
const addModalContactItemExtraPhone = document.createElement('li');
783784
const addModalContactItemEmail = document.createElement('li');
784785
const addModalContactItemVk = document.createElement('li');
@@ -806,6 +807,10 @@
806807
'modal__add-body-add-contact-list',
807808
'd-none'
808809
);
810+
addModalContactItemPhone.classList.add(
811+
'modal__add-body-add-contact-item',
812+
'add-modal-phone-item'
813+
);
809814
addModalContactItemExtraPhone.classList.add(
810815
'modal__add-body-add-contact-item',
811816
'add-modal-extra-phone-item'
@@ -856,6 +861,8 @@
856861
addModalContactCustomSelect.setAttribute('name', 'contact-options');
857862
addModalContactDropBtn.setAttribute('id', 'add-modal-drop-btn');
858863
addModalContactDropBtn.setAttribute('type', 'button');
864+
addModalContactItemPhone.setAttribute('data-value', 'phone');
865+
addModalContactItemPhone.setAttribute('tabindex', '0');
859866
addModalContactItemExtraPhone.setAttribute('data-value', 'extra-phone');
860867
addModalContactItemExtraPhone.setAttribute('tabindex', '0');
861868
addModalContactItemEmail.setAttribute('data-value', 'email');
@@ -873,13 +880,13 @@
873880
addModalContactHiddenInput.setAttribute('name', 'contact-type');
874881
addModalContactInput.setAttribute('type', 'text');
875882
addModalContactInput.setAttribute('name', 'contact-data');
876-
// addModalContactInput.setAttribute('pattern', '[А-Яа-яЁё\\-]+');
877883
addModalContactInput.setAttribute('placeholder', 'Введите данные контакта');
878884
addModalContactInput.setAttribute('required', '');
879885
addModalContactXBtn.setAttribute('type', 'button');
880886
addModalContactXBtn.setAttribute('tabindex', '0');
881887

882888
addModalContactDropBtn.textContent = 'Телефон';
889+
addModalContactItemPhone.textContent = 'Телефон';
883890
addModalContactItemExtraPhone.textContent = 'Доп. телефон';
884891
addModalContactItemEmail.textContent = 'Email';
885892
addModalContactItemVk.textContent = 'Vk';
@@ -889,6 +896,7 @@
889896
addModalContactFeedback.textContent = 'НЕ корректный ввод данных контакта!';
890897

891898
addModalContactList.append(
899+
addModalContactItemPhone,
892900
addModalContactItemExtraPhone,
893901
addModalContactItemEmail,
894902
addModalContactItemVk,
@@ -917,10 +925,9 @@
917925

918926
addBodySelectWrap.append(addModalContactElement); // добавление в DOM строки контактов
919927

920-
// добавление дополнительных отступов (при появлении строки контактов)
928+
// организация дополнительных отступов для "Добавить контакт" кнопки (при появлении строки контактов)
921929
if (addModalContactsArr.length === 0) {
922930
addModalBodyAddBtn.classList.add('add-modal-btn-margin');
923-
addModalContent.classList.add('add-modal-content-padding');
924931
}
925932

926933
// добавление "не большого" эффекта/задержки появления для "новой" строки контактов (элемента)
@@ -930,6 +937,14 @@
930937
addModalContactElement.style.opacity = '1';
931938
}, 10);
932939

940+
// скрытие/сразу li/варианта, как "Телефон" (т.к. в drop-btn отображение по умолчанию)
941+
if (addModalContactDropBtn.textContent === 'Телефон') {
942+
addModalContactItemPhone.style.display = 'none';
943+
}
944+
945+
// обновление/изменение отступов для li/вариантов выпадающего списка (для первого и последнего элементов)
946+
updateDropItemPaddings(addModalContactList);
947+
933948
// добавление валидации для вводимых данных контакта (при добавлении строки контактов)
934949
addInputsValidation([addModalContactInput], {
935950
dynamicContactValidation: true,
@@ -1001,37 +1016,44 @@
10011016

10021017
function getContactDropSelection(target) {
10031018
const selectedItemValue = target.getAttribute('data-value');
1019+
const previousItemValue = addModalContactHiddenInput.value;
1020+
10041021
addModalContactDropBtn.textContent = target.textContent;
10051022
addModalContactHiddenInput.value = selectedItemValue; // обновление данных в "скрытом" input (для последующей отправки на сервер)
1006-
addDropPhoneOption(); // добавление li/варианта, как "Телефон" в выпадающий список (если сразу не выбрали)
1023+
1024+
target.style.display = 'none'; // скрытие li/варианта в выпадающем списке (т.е. после выбора, отображения в drop-btn)
1025+
1026+
// отображение/снова li/варианта (т.е. до этого скрытого)
1027+
if (previousItemValue) {
1028+
const previousItem = addModalContactList.querySelector(
1029+
`[data-value="${previousItemValue}"]`
1030+
);
1031+
if (previousItem) {
1032+
previousItem.style.display = ''; // сброс display: none;
1033+
}
1034+
}
1035+
1036+
updateDropItemPaddings(addModalContactList); // обновление/изменение отступов для li/вариантов выпадающего списка (для первого и последнего элементов)
10071037
closeBtnDropdown(); // закрытие выпадающего списка
10081038
addModalContactInput.focus(); // перевод фокуса на соседний инпут (после выбора в выпадающем списке)
10091039
}
10101040

1011-
function addDropPhoneOption() {
1012-
const isPhoneOption = Array.from(addModalContactList.children).some(
1013-
(item) => item.getAttribute('data-value') === 'phone'
1041+
function updateDropItemPaddings(dropList) {
1042+
Array.from(dropList.children).forEach((item) => {
1043+
item.classList.remove('first-visible', 'last-visible'); // изначальная очистка от дополнительных классов
1044+
});
1045+
1046+
// фиксация li/вариантов находящихся "сейчас" в выпадающем списке
1047+
const visibleDropItems = Array.from(dropList.children).filter(
1048+
(item) => item.style.display !== 'none'
10141049
);
10151050

1016-
// проверка на наличие "Телефон(а)" в кнопке, среди li/элементов (удаление/добавление в выпадающий список)
1017-
if (addModalContactDropBtn.textContent === 'Телефон' && isPhoneOption) {
1018-
const phoneOption = addModalContactList.querySelector(
1019-
'[data-value="phone"]'
1020-
);
1021-
if (phoneOption) phoneOption.remove(); // удаление
1022-
} else if (
1023-
addModalContactDropBtn.textContent !== 'Телефон' &&
1024-
!isPhoneOption
1025-
) {
1026-
const addModalContactItemPhone = document.createElement('li');
1027-
addModalContactItemPhone.classList.add(
1028-
'modal__add-body-add-contact-item',
1029-
'add-modal-phone-item'
1030-
);
1031-
addModalContactItemPhone.setAttribute('data-value', 'phone');
1032-
addModalContactItemPhone.setAttribute('tabindex', '0');
1033-
addModalContactItemPhone.textContent = 'Телефон';
1034-
addModalContactList.prepend(addModalContactItemPhone); // добавляем в начало списка
1051+
// добавление отступов (для первого/последнего элементов списка)
1052+
if (visibleDropItems.length > 0) {
1053+
const firstVisibleItem = visibleDropItems[0];
1054+
const lastVisibleItem = visibleDropItems[visibleDropItems.length - 1];
1055+
firstVisibleItem.classList.add('first-visible');
1056+
lastVisibleItem.classList.add('last-visible');
10351057
}
10361058
}
10371059

@@ -1110,7 +1132,6 @@
11101132
);
11111133
addBodySelectWrap.classList.add('d-none');
11121134
addModalBodyAddBtn.classList.remove('add-modal-btn-margin');
1113-
addModalContent.classList.remove('add-modal-content-padding');
11141135
}
11151136
}
11161137
}

0 commit comments

Comments
 (0)