Skip to content

Commit 6a6eeab

Browse files
committed
[PRAC/cont] Fix duplicate tooltips in left corner
Exclud flick/duplicate (at times) tltps when del row-conts (by "X" btn). Worth noting: - this corrections, namely the transition to fixation by means of "event.currentTarget". core: B-3 / JS-BL
1 parent d8bc658 commit 6a6eeab

File tree

1 file changed

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

1 file changed

+42
-24
lines changed

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

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,8 +1440,10 @@
14401440
event.stopPropagation();
14411441
});
14421442

1443-
// вызов/инициализация tooltips для "X" кнопки (для кнопки удаления строки контактов)
1444-
initTippy('.modal__add-body-add-x-btn', 'удалить контакт', 'top');
1443+
// вызов/инициализация tooltips для "X" кнопки (для кнопки удаления строки контактов, с задержкой)
1444+
setTimeout(() => {
1445+
initTippy(addModalContactXBtn, 'удалить контакт', 'top');
1446+
}, 0);
14451447

14461448
// организация удаления строки контактов
14471449
addModalContactXBtn.addEventListener('click', (event) => {
@@ -1528,15 +1530,22 @@
15281530

15291531
// ** удаление строки контактов в add-модальном окне (через "X" кнопку, с/без уточняющего сообщения)
15301532
function deleteModalContactsElement(event) {
1531-
const clickedContactsXBtn = event.target;
1533+
const clickedContactsXBtn = event.currentTarget; // получение ИМЕННО кнопки, а не/может внутренней иконки (согласно "размазанного" события)
1534+
1535+
if (clickedContactsXBtn) {
1536+
tippy.hideAll(); // предварительное скрытие всех/вдруг "активных" tooltips (перед удалением искомой строки)
15321537

1533-
if (clickedContactsXBtn.classList.contains('add-modal-delete-btn')) {
15341538
// фиксация родительского элемента
15351539
const modalContactsElement = clickedContactsXBtn.closest(
15361540
'.modal__add-body-add-contact-element'
15371541
);
15381542

15391543
if (modalContactsElement) {
1544+
// удаление/исключение привязанного tooltip (к конкретной строке/кнопке)
1545+
if (clickedContactsXBtn._tippy) {
1546+
clickedContactsXBtn._tippy.destroy();
1547+
}
1548+
15401549
// определение заполненности инпута в данной строке контакта
15411550
const currentInput = modalContactsElement.querySelector(
15421551
'.modal__add-body-add-contact-input'
@@ -1580,27 +1589,36 @@
15801589

15811590
// ** дополнительная/местная организация логики для tooltips (т.е. помимо customTippy.js)
15821591
function initTippy(selector, content, side) {
1592+
// определение входящего элемента (селектор или DOM-элемент, поиск/корректировка)
1593+
const elements =
1594+
typeof selector === 'string'
1595+
? document.querySelectorAll(selector)
1596+
: [selector];
1597+
15831598
if (typeof tippy === 'function') {
1584-
tippy(selector, {
1585-
content: content,
1586-
theme: 'main',
1587-
delay: [50, 0],
1588-
offset: [0, 13],
1589-
placement: side,
1590-
animation: 'scale', // анимация появления/скрытия (через дополнительный файл/подключение)
1591-
trigger: 'mouseenter', // только по наведению мыши (исключение вывода по клику, в другом месте)
1592-
1593-
onShow(instance) {
1594-
setTimeout(() => {
1595-
instance.hide(); // автоматическое скрытие (по истечению времени)
1596-
}, 1000);
1597-
},
1598-
1599-
// точечная корректировка стилей (для "стрелки" подсказки)
1600-
onMount(instance) {
1601-
const arrowElement = instance.popper.querySelector('.tippy-arrow');
1602-
arrowElement.style.marginBottom = '-1px';
1603-
},
1599+
elements.forEach((el) => {
1600+
if (!el._tippy) {
1601+
tippy(el, {
1602+
content,
1603+
theme: 'main',
1604+
delay: [50, 0],
1605+
offset: [0, 13],
1606+
placement: side,
1607+
animation: 'scale', // анимация появления/скрытия (через дополнительный файл/подключение)
1608+
trigger: 'mouseenter', // только по наведению мыши (исключение вывода по клику, в другом месте)
1609+
1610+
onShow(instance) {
1611+
setTimeout(() => instance.hide(), 1000); // автоматическое скрытие (по истечению времени)
1612+
},
1613+
1614+
// точечная корректировка стилей (для "стрелки" подсказки)
1615+
onMount(instance) {
1616+
const arrowElement =
1617+
instance.popper.querySelector('.tippy-arrow');
1618+
arrowElement.style.marginBottom = '-1px';
1619+
},
1620+
});
1621+
}
16041622
});
16051623
} else {
16061624
console.error('Tippy.js is not loaded!');

0 commit comments

Comments
 (0)