/** * App Email */ 'use strict'; document.addEventListener('DOMContentLoaded', function () { (function () { // Utility function to initialize PerfectScrollbar const initPerfectScrollbar = (element, options = { wheelPropagation: false, suppressScrollX: true }) => { if (element) new PerfectScrollbar(element, options); }; // Query selectors for elements and collections const selectors = { emailList: document.querySelector('.email-list'), emailListItems: Array.from(document.querySelectorAll('.email-list-item')), emailListItemInputs: Array.from(document.querySelectorAll('.email-list-item-input')), emailView: document.querySelector('.app-email-view-content'), emailFilters: document.querySelector('.email-filters'), emailFilterByFolders: Array.from(document.querySelectorAll('.email-filter-folders li')), emailEditor: document.querySelector('.email-editor'), appEmailSidebar: document.querySelector('.app-email-sidebar'), appOverlay: document.querySelector('.app-overlay'), emailReplyEditor: document.querySelector('.email-reply-editor'), bookmarkEmail: Array.from(document.querySelectorAll('.email-list-item-bookmark')), selectAllEmails: document.getElementById('email-select-all'), emailSearch: document.querySelector('.email-search-input'), toggleCC: document.querySelector('.email-compose-toggle-cc'), toggleBCC: document.querySelector('.email-compose-toggle-bcc'), emailCompose: document.querySelector('.app-email-compose'), emailListDelete: document.querySelector('.email-list-delete'), emailListRead: document.querySelector('.email-list-read'), emailListEmpty: document.querySelector('.email-list-empty'), refreshEmails: document.querySelector('.email-refresh'), emailViewContainer: document.getElementById('app-email-view'), emailFilterFolderLists: Array.from(document.querySelectorAll('.email-filter-folders li')), emailListItemActions: Array.from(document.querySelectorAll('.email-list-item-actions li')) }; // Initialize scrollbars where needed initPerfectScrollbar(selectors.emailList); initPerfectScrollbar(selectors.emailFilters); initPerfectScrollbar(selectors.emailView); // Utility function to initialize Quill Editor const initQuillEditor = (selector, toolbar) => { if (selector) { new Quill(selector, { modules: { toolbar }, placeholder: 'Message', theme: 'snow' }); } }; // Initialize editors initQuillEditor(selectors.emailEditor, '.email-editor-toolbar'); initQuillEditor(selectors.emailReplyEditor, '.email-reply-toolbar'); // Bookmark email functionality selectors.bookmarkEmail.forEach(emailItem => { emailItem.addEventListener('click', e => { const emailItemParent = e.currentTarget.closest('.email-list-item'); e.stopPropagation(); if (emailItemParent.hasAttribute('data-starred')) { // If attribute exists, remove it emailItemParent.removeAttribute('data-starred'); } else { // If attribute does not exist, set it with the value "true" emailItemParent.setAttribute('data-starred', 'true'); } }); }); // Select all functionality if (selectors.selectAllEmails) { selectors.selectAllEmails.addEventListener('click', e => { selectors.emailListItemInputs.forEach(input => { input.checked = e.currentTarget.checked; }); }); } // Select single email and update 'Select All' checkbox state if (selectors.emailListItemInputs) { selectors.emailListItemInputs.forEach(emailListItemInput => { emailListItemInput.addEventListener('click', e => { e.stopPropagation(); // Count checked inputs const checkedCount = selectors.emailListItemInputs.filter(input => input.checked).length; const totalInputs = selectors.emailListItemInputs.length; // Update 'Select All' checkbox and indeterminate state selectors.selectAllEmails.indeterminate = checkedCount > 0 && checkedCount < totalInputs; selectors.selectAllEmails.checked = checkedCount === totalInputs; }); }); } // Search emails based on input text if (selectors.emailSearch) { selectors.emailSearch.addEventListener('keyup', e => { const searchValue = e.currentTarget.value.toLowerCase(); const activeFolderFilter = document.querySelector('.email-filter-folders .active'); const selectedFolder = activeFolderFilter ? activeFolderFilter.getAttribute('data-target') : 'inbox'; // Filter emails based on the active folder const emailListItems = selectedFolder !== 'inbox' ? Array.from(document.querySelectorAll(`.email-list-item[data-${selectedFolder}="true"]`)) : selectors.emailListItems; // Show/hide emails based on the search term emailListItems.forEach(emailItem => { const itemText = emailItem.textContent.toLowerCase(); emailItem.classList.toggle('d-block', itemText.includes(searchValue)); emailItem.classList.toggle('d-none', !itemText.includes(searchValue)); }); }); } // Filter emails based on folder type (Inbox, Sent, Draft, etc.) selectors.emailFilterByFolders.forEach(folder => { folder.addEventListener('click', e => { const targetFolder = e.currentTarget.getAttribute('data-target'); // Hide sidebar and overlay selectors.appEmailSidebar.classList.remove('show'); selectors.appOverlay.classList.remove('show'); // Update active class for folder filters selectors.emailFilterByFolders.forEach(f => f.classList.remove('active')); e.currentTarget.classList.add('active'); // Filter email items based on selected folder selectors.emailListItems.forEach(emailItem => { const matchesFolder = targetFolder === 'inbox' || emailItem.hasAttribute(`data-${targetFolder}`); emailItem.classList.toggle('d-block', matchesFolder); emailItem.classList.toggle('d-none', !matchesFolder); }); }); }); // Toggle visibility of CC/BCC input fields const toggleVisibility = selector => { document.querySelector(selector).classList.toggle('d-block'); document.querySelector(selector).classList.toggle('d-none'); }; if (selectors.toggleBCC) { selectors.toggleBCC.addEventListener('click', () => toggleVisibility('.email-compose-bcc')); } if (selectors.toggleCC) { selectors.toggleCC.addEventListener('click', () => toggleVisibility('.email-compose-cc')); } // Clear compose email message inputs when modal is hidden selectors.emailCompose.addEventListener('hidden.bs.modal', () => { document.querySelector('.email-editor .ql-editor').innerHTML = ''; document.getElementById('emailContacts').value = ''; initSelect2(); }); // Delete selected emails if (selectors.emailListDelete) { selectors.emailListDelete.addEventListener('click', () => { selectors.emailListItemInputs.forEach(input => { if (input.checked) { input.closest('li.email-list-item').remove(); } }); selectors.selectAllEmails.indeterminate = false; selectors.selectAllEmails.checked = false; // Show empty message if no emails are left if (selectors.emailListItems.length === 0) { selectors.emailListEmpty.classList.remove('d-none'); } }); } // Mark selected emails as read if (selectors.emailListRead) { selectors.emailListRead.addEventListener('click', () => { selectors.emailListItemInputs.forEach(input => { if (input.checked) { input.checked = false; const emailItem = input.closest('li.email-list-item'); emailItem.classList.add('email-marked-read'); // Update envelope icon const emailActions = emailItem.querySelector('.email-list-item-actions li'); emailActions.classList.replace('email-read', 'email-unread'); const icon = emailActions.querySelector('i'); icon.classList.replace('tabler-mail-opened', 'tabler-mail'); } }); selectors.selectAllEmails.indeterminate = false; selectors.selectAllEmails.checked = false; }); } // Refresh emails with loading animation if (selectors.refreshEmails && selectors.emailList) { const emailListClass = '.email-list'; const emailListInstance = new PerfectScrollbar(selectors.emailList, { wheelPropagation: false, suppressScrollX: true }); selectors.refreshEmails.addEventListener('click', () => { // Block the email list section with Notiflix Block.standard(emailListClass, { backgroundColor: 'rgba(' + window.Helpers.getCssVar('black-rgb') + ', 0.1)', svgSize: '0px' }); // Add custom spinner to the Notiflix block const customSpinner = document.createElement('div'); customSpinner.classList.add('spinner-border', 'text-primary'); customSpinner.setAttribute('role', 'status'); const notiflixBlock = document.querySelector('.email-list .notiflix-block'); if (notiflixBlock) { notiflixBlock.appendChild(customSpinner); } // Simulate a timeout and unblock setTimeout(() => { // Disable vertical scroll suppression emailListInstance.settings.suppressScrollY = false; // Unblock the section Block.remove(emailListClass); }, 1000); // Suppress scroll during the block emailListInstance.settings.suppressScrollY = true; }); } // Toggle visibility of earlier messages const earlierMsg = document.querySelector('.email-earlier-msgs'); if (earlierMsg) { earlierMsg.addEventListener('click', () => { const emailCardLast = document.querySelector('.email-card-last'); const emailCardPrev = earlierMsg.nextElementSibling; if (emailCardLast) emailCardLast.classList.add('hide-pseudo'); // Vanilla JavaScript slideToggle effect if (emailCardPrev) { emailCardPrev.style.display = emailCardPrev.style.display === 'none' || !emailCardPrev.style.display ? 'block' : 'none'; emailCardPrev.classList.toggle('slide-toggle'); } // Remove the earlier message link after expanding earlierMsg.remove(); }); } // Email contacts (select2) // ? Using jquery vars due to select2 jQuery dependency let emailContacts = $('#emailContacts'); function initSelect2() { if (emailContacts.length) { function renderContactsAvatar(option) { if (!option.id) { return option.text; } let $avatar = "