|
688 | 688 |
|
689 | 689 | const clientServerId = row.getAttribute('data-server-id'); // фиксация серверного id (из атрибута) |
690 | 690 |
|
691 | | - // вызов "общей" функции, для удаления клиента/строки (передача соответствующих аргументов) |
692 | | - deleteBodyRowsClients( |
693 | | - [clientServerId], |
694 | | - `Вы уверены, что хотите удалить клиента?`, |
695 | | - event.target |
696 | | - ); |
| 691 | + if (!clientServerId) { |
| 692 | + console.error('Ошибка: отсутствует ID клиента для удаления!'); |
| 693 | + return; // нет ID или не корректен, возврат |
| 694 | + } |
| 695 | + |
| 696 | + // вызов/создание "отдельного" модального окна, для последующего удаления клиента/строки |
| 697 | + const deleteModal = createDeleteModalWindow(clientServerId); |
| 698 | + document.body.append(deleteModal); |
| 699 | + // инициализация модального окна, через Bootstrap API |
| 700 | + const modalInstance = new bootstrap.Modal(deleteModal); |
| 701 | + modalInstance.show(); // отображение |
| 702 | + |
| 703 | + // принудительное удаление атрибута aria-hidden="true" с модального окна (исключение ошибки с ARIA) |
| 704 | + deleteAriaHiddenTrue(deleteModal); |
697 | 705 | } |
698 | 706 |
|
699 | 707 | // добавление обработчика события на таблицу (удаление строки) |
|
702 | 710 | // ** удаление элементов/строк таблицы данных о клиентах (ОБЩАЯ ЛОГИКА) |
703 | 711 | async function deleteBodyRowsClients( |
704 | 712 | clientsServerIdsToDelete, |
705 | | - confirmMessage = null, |
706 | 713 | currentBtn = null |
707 | 714 | ) { |
708 | | - if (confirmMessage) { |
709 | | - const confirmed = confirm(confirmMessage); |
710 | | - |
711 | | - if (!confirmed) { |
712 | | - if (currentBtn) { |
713 | | - currentBtn.blur(); // снятие фокуса с кнопки, при отмене действия |
714 | | - } |
715 | | - return; |
716 | | - } |
| 715 | + // если кнопка передаётся, снятие фокуса (после прожатия) |
| 716 | + if (currentBtn) { |
| 717 | + currentBtn.blur(); |
717 | 718 | } |
718 | 719 |
|
719 | 720 | clientsServerIdsToDelete.forEach(async (serverId) => { |
|
1781 | 1782 | } |
1782 | 1783 |
|
1783 | 1784 | // отработка удаления клиента/строки |
1784 | | - await deleteBodyRowsClients([clientServerId], null, event.target); |
| 1785 | + await deleteBodyRowsClients([clientServerId], event.target); |
1785 | 1786 |
|
1786 | 1787 | // закрытие модального окна после удаления |
1787 | 1788 | const modalInstance = bootstrap.Modal.getInstance(modalWrap); |
|
1794 | 1795 | return modalWrap; // возврат модального окна (т.е. здесь/без добавления в DOM.. позже, при клике) |
1795 | 1796 | } |
1796 | 1797 |
|
| 1798 | + // TODO: стилизация по аналогии (расположение окна..) |
| 1799 | + // ** создание "отдельного" модального окна, для удаления клиента из таблицы (при прожатии "Удалить" кнопки) |
| 1800 | + function createDeleteModalWindow(clientId) { |
| 1801 | + const deleteModalWrap = document.createElement('div'); |
| 1802 | + deleteModalWrap.classList.add( |
| 1803 | + 'modal-delete', |
| 1804 | + 'crm__delete-modal-wrap', |
| 1805 | + 'modal', |
| 1806 | + 'fade' |
| 1807 | + ); |
| 1808 | + deleteModalWrap.setAttribute('id', 'modal-delete-client'); |
| 1809 | + deleteModalWrap.setAttribute('tabindex', '-1'); |
| 1810 | + |
| 1811 | + deleteModalWrap.innerHTML = ` |
| 1812 | + <div class="modal-delete__dialog modal-dialog"> |
| 1813 | + <div class="modal-delete__content-wrap modal-content"> |
| 1814 | + <div class="modal-delete__header modal-header"> |
| 1815 | + <h2 class="modal-delete__header-title modal-title">Удалить клиента</h2> |
| 1816 | + <button class="modal-delete__header-x-btn btn-close" data-bs-dismiss="modal" type="button" aria-label="Закрыть"></button> |
| 1817 | + </div> |
| 1818 | + <div class="modal-delete__body modal-body"> |
| 1819 | + <p class="modal-delete__body-text">Вы действительно хотите удалить данного клиента?</p> |
| 1820 | + </div> |
| 1821 | + <div class="modal-delete__footer modal-footer"> |
| 1822 | + <div class="modal-delete__footer-btns-wrap"> |
| 1823 | + <button class="modal-delete__footer-delete-btn modal-delete-btn" id="modal-footer-delete-btn" type="button">Удалить</button> |
| 1824 | + <button class="modal-delete__footer-cancel-btn modal-delete-btn" id="modal-footer-cancel-btn" type="button" data-bs-dismiss="modal">Отмена</button> |
| 1825 | + </div> |
| 1826 | + </div> |
| 1827 | + </div> |
| 1828 | + </div> |
| 1829 | + `; |
| 1830 | + |
| 1831 | + // фиксация внутренней "свеже" созданной "X" кнопки |
| 1832 | + const deleteModalXBtn = deleteModalWrap.querySelector( |
| 1833 | + '.modal-delete__header-x-btn' |
| 1834 | + ); |
| 1835 | + // фиксация внутренней "свеже" созданной "Удалить" кнопки |
| 1836 | + const deleteModalBtn = deleteModalWrap.querySelector( |
| 1837 | + '.modal-delete__footer-delete-btn' |
| 1838 | + ); |
| 1839 | + |
| 1840 | + // вызов/инициализация tooltips для "X" модальной кнопки (для кнопки закрытия модального окна, с задержкой) |
| 1841 | + setTimeout(() => { |
| 1842 | + initTippy(deleteModalXBtn, 'закрыть', 'left'); |
| 1843 | + }, 0); |
| 1844 | + |
| 1845 | + // организация удаления клиента/строки |
| 1846 | + deleteModalBtn.addEventListener('click', async () => { |
| 1847 | + await deleteBodyRowsClients([clientId]); |
| 1848 | + // закрытие модального окна, через Bootstrap API |
| 1849 | + const modalInstance = bootstrap.Modal.getInstance(deleteModalWrap); |
| 1850 | + if (modalInstance) { |
| 1851 | + modalInstance.hide(); // скрытие |
| 1852 | + } |
| 1853 | + }); |
| 1854 | + |
| 1855 | + return deleteModalWrap; // передача/возврат модального окна |
| 1856 | + } |
| 1857 | + |
1797 | 1858 | // ** организация принудительного удаления атрибута aria-hidden="true" с модальных окон (исключение ошибок с ARIA) |
1798 | 1859 | function deleteAriaHiddenTrue(modalWrap) { |
1799 | 1860 | // мониторинг/ожидание появления соответствующего атрибута |
|
2534 | 2595 | content, |
2535 | 2596 | theme: 'main', |
2536 | 2597 | delay: [50, 0], |
2537 | | - offset: [0, 13], |
| 2598 | + offset: [0, 10], |
2538 | 2599 | placement: side, |
2539 | 2600 | animation: 'scale', // анимация появления/скрытия (через дополнительный файл/подключение) |
2540 | 2601 | trigger: 'mouseenter', // только по наведению мыши (исключение вывода по клику, в другом месте) |
|
0 commit comments