(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('bootstrap')) : typeof define === 'function' && define.amd ? define(['bootstrap'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.phoenix = factory(global.bootstrap)); })(this, (function (bootstrap) { 'use strict'; /* -------------------------------------------------------------------------- */ /* Utils */ /* -------------------------------------------------------------------------- */ const docReady = fn => { // see if DOM is already available if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { setTimeout(fn, 1); } }; const toggleColor = (lightColor, darkColor) => { const currentMode = getItemFromStore('phoenixTheme'); const mode = currentMode === 'auto' ? getSystemTheme() : currentMode; return mode === 'light' ? lightColor : darkColor; }; const resize = fn => window.addEventListener('resize', fn); const isIterableArray = array => Array.isArray(array) && !!array.length; const camelize = str => { const text = str.replace(/[-_\s.]+(.)?/g, (_, c) => c ? c.toUpperCase() : '' ); return `${text.substr(0, 1).toLowerCase()}${text.substr(1)}`; }; const getData = (el, data) => { try { return JSON.parse(el.dataset[camelize(data)]); } catch (e) { return el.dataset[camelize(data)]; } }; /* ----------------------------- Colors function ---------------------------- */ const hexToRgb = hexValue => { let hex; hexValue.indexOf('#') === 0 ? (hex = hexValue.substring(1)) : (hex = hexValue); // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec( hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b) ); return result ? [ parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16) ] : null; }; const rgbaColor = (color = '#fff', alpha = 0.5) => `rgba(${hexToRgb(color)}, ${alpha})`; /* --------------------------------- Colors --------------------------------- */ const getColor = (name, dom = document.documentElement) => { return getComputedStyle(dom).getPropertyValue(`--phoenix-${name}`).trim(); }; const hasClass = (el, className) => { return el.classList.value.includes(className); }; const addClass = (el, className) => { el.classList.add(className); }; const getOffset = el => { const rect = el.getBoundingClientRect(); const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft; const scrollTop = window.pageYOffset || document.documentElement.scrollTop; return { top: rect.top + scrollTop, left: rect.left + scrollLeft }; }; const isScrolledIntoView = el => { let top = el.offsetTop; let left = el.offsetLeft; const width = el.offsetWidth; const height = el.offsetHeight; while (el.offsetParent) { // eslint-disable-next-line no-param-reassign el = el.offsetParent; top += el.offsetTop; left += el.offsetLeft; } return { all: top >= window.pageYOffset && left >= window.pageXOffset && top + height <= window.pageYOffset + window.innerHeight && left + width <= window.pageXOffset + window.innerWidth, partial: top < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && top + height > window.pageYOffset && left + width > window.pageXOffset }; }; const breakpoints = { xs: 0, sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1540 }; const getBreakpoint = el => { const classes = el && el.classList.value; let breakpoint; if (classes) { breakpoint = breakpoints[ classes .split(' ') .filter(cls => cls.includes('navbar-expand-')) .pop() .split('-') .pop() ]; } return breakpoint; }; /* --------------------------------- Cookie --------------------------------- */ const setCookie = (name, value, seconds) => { const expires = window.dayjs().add(seconds, 'second').toDate(); document.cookie = `${name}=${value};expires=${expires}`; }; const getCookie = name => { const keyValue = document.cookie.match(`(^|;) ?${name}=([^;]*)(;|$)`); return keyValue ? keyValue[2] : keyValue; }; const settings = { tinymce: { theme: 'oxide' }, chart: { borderColor: 'rgba(255, 255, 255, 0.8)' } }; /* -------------------------- Chart Initialization -------------------------- */ const newChart = (chart, config) => { const ctx = chart.getContext('2d'); return new window.Chart(ctx, config); }; /* ---------------------------------- Store --------------------------------- */ const getItemFromStore = (key, defaultValue, store = localStorage) => { try { return JSON.parse(store.getItem(key)) || defaultValue; } catch { return store.getItem(key) || defaultValue; } }; const setItemToStore = (key, payload, store = localStorage) => store.setItem(key, payload); const getStoreSpace = (store = localStorage) => parseFloat( ( escape(encodeURIComponent(JSON.stringify(store))).length / (1024 * 1024) ).toFixed(2) ); /* get Dates between */ const getDates = ( startDate, endDate, interval = 1000 * 60 * 60 * 24 ) => { const duration = endDate - startDate; const steps = duration / interval; return Array.from( { length: steps + 1 }, (v, i) => new Date(startDate.valueOf() + interval * i) ); }; const getPastDates = duration => { let days; switch (duration) { case 'week': days = 7; break; case 'month': days = 30; break; case 'year': days = 365; break; default: days = duration; } const date = new Date(); const endDate = date; const startDate = new Date(new Date().setDate(date.getDate() - (days - 1))); return getDates(startDate, endDate); }; /* Get Random Number */ const getRandomNumber = (min, max) => { return Math.floor(Math.random() * (max - min) + min); }; const getSystemTheme = () => window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; // export const handleThemeDropdownIcon = value => { // document.querySelectorAll('[data-theme-dropdown-toggle-icon]').forEach(el => { // const theme = getData(el, 'theme-dropdown-toggle-icon'); // if (value === theme) { // el.classList.remove('d-none'); // } else { // el.classList.add('d-none'); // } // }); // }; // handleThemeDropdownIcon(getItemFromStore('phoenixTheme')); var utils = { docReady, toggleColor, resize, isIterableArray, camelize, getData, hasClass, addClass, hexToRgb, rgbaColor, getColor, breakpoints, // getGrays, getOffset, isScrolledIntoView, getBreakpoint, setCookie, getCookie, newChart, settings, getItemFromStore, setItemToStore, getStoreSpace, getDates, getPastDates, getRandomNumber, getSystemTheme // handleThemeDropdownIcon }; const docComponentInit = () => { const componentCards = document.querySelectorAll('[data-component-card]'); const iconCopiedToast = document.getElementById('icon-copied-toast'); const iconCopiedToastInstance = new bootstrap.Toast(iconCopiedToast); componentCards.forEach(card => { const copyCodeBtn = card.querySelector('.copy-code-btn'); const copyCodeEl = card.querySelector('.code-to-copy'); const previewBtn = card.querySelector('.preview-btn'); const collapseElement = card.querySelector('.code-collapse'); const collapseInstance = bootstrap.Collapse.getOrCreateInstance(collapseElement, { toggle: false }); previewBtn?.addEventListener('click', () => { collapseInstance.toggle(); }); copyCodeBtn?.addEventListener('click', () => { const el = document.createElement('textarea'); el.value = copyCodeEl.innerHTML; document.body.appendChild(el); el.select(); document.execCommand('copy'); document.body.removeChild(el); iconCopiedToast.querySelector( '.toast-body' ).innerHTML = `Code has been copied to clipboard.`; iconCopiedToastInstance.show(); }); }); }; /* eslint-disable */ const orders = [ { id: 1, dropdownId: 'order-dropdown-1', orderId: '#2181', mailLink: 'mailto:carry@example.com', customer: 'Carry Anna', date: '10/03/2023', address: 'Carry Anna, 2392 Main Avenue, Penasauka, New Jersey 02149', deliveryType: 'Cash on Delivery', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$99' }, { id: 2, dropdownId: 'order-dropdown-2', orderId: '#2182', mailLink: 'mailto:milind@example.com', customer: 'Milind Mikuja', date: '10/03/2023', address: 'Milind Mikuja, 1 Hollywood Blvd,Beverly Hills, California 90210', deliveryType: 'Cash on Delivery', status: 'Processing', badge: { type: 'primary', icon: 'fas fa-redo' }, amount: '$120' }, { id: 3, dropdownId: 'order-dropdown-3', orderId: '#2183', mailLink: 'mailto:stanly@example.com', customer: 'Stanly Drinkwater', date: '30/04/2023', address: 'Stanly Drinkwater, 1 Infinite Loop, Cupertino, California 90210', deliveryType: 'Local Delivery', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$70' }, { id: 4, dropdownId: 'order-dropdown-4', orderId: '#2184', mailLink: 'mailto:bucky@example.com', customer: 'Bucky Robert', date: '30/04/2023', address: 'Bucky Robert, 1 Infinite Loop, Cupertino, California 90210', deliveryType: 'Free Shipping', status: 'Pending', badge: { type: 'warning', icon: 'fas fa-stream' }, amount: '$92' }, { id: 5, dropdownId: 'order-dropdown-5', orderId: '#2185', mailLink: 'mailto:josef@example.com', customer: 'Josef Stravinsky', date: '30/04/2023', address: 'Josef Stravinsky, 1 Infinite Loop, Cupertino, California 90210', deliveryType: 'Via Free Road', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$120' }, { id: 6, dropdownId: 'order-dropdown-6', orderId: '#2186', mailLink: 'mailto:igor@example.com', customer: 'Igor Borvibson', date: '30/04/2023', address: 'Igor Borvibson, 1 Infinite Loop, Cupertino, California 90210', deliveryType: 'Free Shipping', status: 'Processing', badge: { type: 'primary', icon: 'fas fa-redo' }, amount: '$145' }, { id: 7, dropdownId: 'order-dropdown-7', orderId: '#2187', mailLink: 'mailto:katerina@example.com', customer: 'Katerina Karenin', date: '30/04/2023', address: 'Katerina Karenin, 1 Infinite Loop, Cupertino, California 90210', deliveryType: 'Flat Rate', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$55' }, { id: 8, dropdownId: 'order-dropdown-8', orderId: '#2188', mailLink: 'mailto:roy@example.com', customer: 'Roy Anderson', date: '29/04/2023', address: 'Roy Anderson, 1 Infinite Loop, Cupertino, California 90210', deliveryType: 'Local Delivery', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$90' }, { id: 9, dropdownId: 'order-dropdown-9', orderId: '#2189', mailLink: 'mailto:Stephenson@example.com', customer: 'Thomas Stephenson', date: '29/04/2023', address: 'Thomas Stephenson, 116 Ballifeary Road, Bamff', deliveryType: 'Flat Rate', status: 'Processing', badge: { type: 'primary', icon: 'fas fa-redo' }, amount: '$52' }, { id: 10, dropdownId: 'order-dropdown-10', orderId: '#2190', mailLink: 'mailto:eviewsing@example.com', customer: 'Evie Singh', date: '29/04/2023', address: 'Evie Singh, 54 Castledore Road, Tunstead', deliveryType: 'Flat Rate', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$90' }, { id: 11, dropdownId: 'order-dropdown-11', orderId: '#2191', mailLink: 'mailto:peter@example.com', customer: 'David Peters', date: '29/04/2023', address: 'David Peters, Rhyd Y Groes, Rhosgoch, LL66 0AT', deliveryType: 'Local Delivery', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$69' }, { id: 12, dropdownId: 'order-dropdown-12', orderId: '#2192', mailLink: 'mailto:jennifer@example.com', customer: 'Jennifer Johnson', date: '28/04/2023', address: 'Jennifer Johnson, Rhyd Y Groes, Rhosgoch, LL66 0AT', deliveryType: 'Flat Rate', status: 'Processing', badge: { type: 'primary', icon: 'fas fa-redo' }, amount: '$112' }, { id: 13, dropdownId: 'order-dropdown-13', orderId: '#2193', mailLink: 'mailto:okuneva@example.com', customer: 'Demarcus Okuneva', date: '28/04/2023', address: 'Demarcus Okuneva, 90555 Upton Drive Jeffreyview, UT 08771', deliveryType: 'Flat Rate', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$99' }, { id: 14, dropdownId: 'order-dropdown-14', orderId: '#2194', mailLink: 'mailto:simeon@example.com', customer: 'Simeon Harber', date: '27/04/2023', address: 'Simeon Harber, 702 Kunde Plain Apt. 634 East Bridgetview, HI 13134-1862', deliveryType: 'Free Shipping', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$129' }, { id: 15, dropdownId: 'order-dropdown-15', orderId: '#2195', mailLink: 'mailto:lavon@example.com', customer: 'Lavon Haley', date: '27/04/2023', address: 'Lavon Haley, 30998 Adonis Locks McGlynnside, ID 27241', deliveryType: 'Free Shipping', status: 'Pending', badge: { type: 'warning', icon: 'fas fa-stream' }, amount: '$70' }, { id: 16, dropdownId: 'order-dropdown-16', orderId: '#2196', mailLink: 'mailto:ashley@example.com', customer: 'Ashley Kirlin', date: '26/04/2023', address: 'Ashley Kirlin, 43304 Prosacco Shore South Dejuanfurt, MO 18623-0505', deliveryType: 'Local Delivery', status: 'Processing', badge: { type: 'primary', icon: 'fas fa-redo' }, amount: '$39' }, { id: 17, dropdownId: 'order-dropdown-17', orderId: '#2197', mailLink: 'mailto:johnnie@example.com', customer: 'Johnnie Considine', date: '26/04/2023', address: 'Johnnie Considine, 6008 Hermann Points Suite 294 Hansenville, TN 14210', deliveryType: 'Flat Rate', status: 'Pending', badge: { type: 'warning', icon: 'fas fa-stream' }, amount: '$70' }, { id: 18, dropdownId: 'order-dropdown-18', orderId: '#2198', mailLink: 'mailto:trace@example.com', customer: 'Trace Farrell', date: '26/04/2023', address: 'Trace Farrell, 431 Steuber Mews Apt. 252 Germanland, AK 25882', deliveryType: 'Free Shipping', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$70' }, { id: 19, dropdownId: 'order-dropdown-19', orderId: '#2199', mailLink: 'mailto:nienow@example.com', customer: 'Estell Nienow', date: '26/04/2023', address: 'Estell Nienow, 4167 Laverna Manor Marysemouth, NV 74590', deliveryType: 'Free Shipping', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$59' }, { id: 20, dropdownId: 'order-dropdown-20', orderId: '#2200', mailLink: 'mailto:howe@example.com', customer: 'Daisha Howe', date: '25/04/2023', address: 'Daisha Howe, 829 Lavonne Valley Apt. 074 Stehrfort, RI 77914-0379', deliveryType: 'Free Shipping', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$39' }, { id: 21, dropdownId: 'order-dropdown-21', orderId: '#2201', mailLink: 'mailto:haley@example.com', customer: 'Miles Haley', date: '24/04/2023', address: 'Miles Haley, 53150 Thad Squares Apt. 263 Archibaldfort, MO 00837', deliveryType: 'Flat Rate', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$55' }, { id: 22, dropdownId: 'order-dropdown-22', orderId: '#2202', mailLink: 'mailto:watsica@example.com', customer: 'Brenda Watsica', date: '24/04/2023', address: "Brenda Watsica, 9198 O'Kon Harbors Morarborough, IA 75409-7383", deliveryType: 'Free Shipping', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$89' }, { id: 23, dropdownId: 'order-dropdown-23', orderId: '#2203', mailLink: 'mailto:ellie@example.com', customer: "Ellie O'Reilly", date: '24/04/2023', address: "Ellie O'Reilly, 1478 Kaitlin Haven Apt. 061 Lake Muhammadmouth, SC 35848", deliveryType: 'Free Shipping', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$47' }, { id: 24, dropdownId: 'order-dropdown-24', orderId: '#2204', mailLink: 'mailto:garry@example.com', customer: 'Garry Brainstrow', date: '23/04/2023', address: 'Garry Brainstrow, 13572 Kurt Mews South Merritt, IA 52491', deliveryType: 'Free Shipping', status: 'Completed', badge: { type: 'success', icon: 'fas fa-check' }, amount: '$139' }, { id: 25, dropdownId: 'order-dropdown-25', orderId: '#2205', mailLink: 'mailto:estell@example.com', customer: 'Estell Pollich', date: '23/04/2023', address: 'Estell Pollich, 13572 Kurt Mews South Merritt, IA 52491', deliveryType: 'Free Shipping', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$49' }, { id: 26, dropdownId: 'order-dropdown-26', orderId: '#2206', mailLink: 'mailto:ara@example.com', customer: 'Ara Mueller', date: '23/04/2023', address: 'Ara Mueller, 91979 Kohler Place Waelchiborough, CT 41291', deliveryType: 'Flat Rate', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$19' }, { id: 27, dropdownId: 'order-dropdown-27', orderId: '#2207', mailLink: 'mailto:blick@example.com', customer: 'Lucienne Blick', date: '23/04/2023', address: 'Lucienne Blick, 6757 Giuseppe Meadows Geraldinemouth, MO 48819-4970', deliveryType: 'Flat Rate', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$59' }, { id: 28, dropdownId: 'order-dropdown-28', orderId: '#2208', mailLink: 'mailto:haag@example.com', customer: 'Laverne Haag', date: '22/04/2023', address: 'Laverne Haag, 2327 Kaylee Mill East Citlalli, AZ 89582-3143', deliveryType: 'Flat Rate', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$49' }, { id: 29, dropdownId: 'order-dropdown-29', orderId: '#2209', mailLink: 'mailto:bednar@example.com', customer: 'Brandon Bednar', date: '22/04/2023', address: 'Brandon Bednar, 25156 Isaac Crossing Apt. 810 Lonborough, CO 83774-5999', deliveryType: 'Flat Rate', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$39' }, { id: 30, dropdownId: 'order-dropdown-30', orderId: '#2210', mailLink: 'mailto:dimitri@example.com', customer: 'Dimitri Boehm', date: '23/04/2023', address: 'Dimitri Boehm, 71603 Wolff Plains Apt. 885 Johnstonton, MI 01581', deliveryType: 'Flat Rate', status: 'On Hold', badge: { type: 'secondary', icon: 'fas fa-ban' }, amount: '$111' } ]; const advanceAjaxTableInit = () => { const togglePaginationButtonDisable = (button, disabled) => { button.disabled = disabled; button.classList[disabled ? 'add' : 'remove']('disabled'); }; // Selectors const table = document.getElementById('advanceAjaxTable'); if (table) { const options = { page: 10, pagination: { item: "
  • " }, item: values => { const { orderId, id, customer, date, address, deliveryType, status, badge, amount } = values; return ` ${orderId} ${customer} ${date} ${address}

    ${deliveryType}

    ${status} ${amount}
    `; } }; const paginationButtonNext = table.querySelector( '[data-list-pagination="next"]' ); const paginationButtonPrev = table.querySelector( '[data-list-pagination="prev"]' ); const viewAll = table.querySelector('[data-list-view="*"]'); const viewLess = table.querySelector('[data-list-view="less"]'); const listInfo = table.querySelector('[data-list-info]'); const listFilter = document.querySelector('[data-list-filter]'); const orderList = new window.List(table, options, orders); // Fallback orderList.on('updated', item => { const fallback = table.querySelector('.fallback') || document.getElementById(options.fallback); if (fallback) { if (item.matchingItems.length === 0) { fallback.classList.remove('d-none'); } else { fallback.classList.add('d-none'); } } }); const totalItem = orderList.items.length; const itemsPerPage = orderList.page; const btnDropdownClose = orderList.listContainer.querySelector('.btn-close'); let pageQuantity = Math.ceil(totalItem / itemsPerPage); let numberOfcurrentItems = orderList.visibleItems.length; let pageCount = 1; btnDropdownClose && btnDropdownClose.addEventListener('search.close', () => orderList.fuzzySearch('') ); const updateListControls = () => { listInfo && (listInfo.innerHTML = `${orderList.i} to ${numberOfcurrentItems} of ${totalItem}`); paginationButtonPrev && togglePaginationButtonDisable(paginationButtonPrev, pageCount === 1); paginationButtonNext && togglePaginationButtonDisable( paginationButtonNext, pageCount === pageQuantity ); if (pageCount > 1 && pageCount < pageQuantity) { togglePaginationButtonDisable(paginationButtonNext, false); togglePaginationButtonDisable(paginationButtonPrev, false); } }; updateListControls(); if (paginationButtonNext) { paginationButtonNext.addEventListener('click', e => { e.preventDefault(); pageCount += 1; const nextInitialIndex = orderList.i + itemsPerPage; nextInitialIndex <= orderList.size() && orderList.show(nextInitialIndex, itemsPerPage); numberOfcurrentItems += orderList.visibleItems.length; updateListControls(); }); } if (paginationButtonPrev) { paginationButtonPrev.addEventListener('click', e => { e.preventDefault(); pageCount -= 1; numberOfcurrentItems -= orderList.visibleItems.length; const prevItem = orderList.i - itemsPerPage; prevItem > 0 && orderList.show(prevItem, itemsPerPage); updateListControls(); }); } const toggleViewBtn = () => { viewLess.classList.toggle('d-none'); viewAll.classList.toggle('d-none'); }; if (viewAll) { viewAll.addEventListener('click', () => { orderList.show(1, totalItem); pageQuantity = 1; pageCount = 1; numberOfcurrentItems = totalItem; updateListControls(); toggleViewBtn(); }); } if (viewLess) { viewLess.addEventListener('click', () => { orderList.show(1, itemsPerPage); pageQuantity = Math.ceil(totalItem / itemsPerPage); pageCount = 1; numberOfcurrentItems = orderList.visibleItems.length; updateListControls(); toggleViewBtn(); }); } if (options.pagination) { table.querySelector('.pagination').addEventListener('click', e => { if (e.target.classList[0] === 'page') { pageCount = Number(e.target.innerText); updateListControls(); } }); } if (options.filter) { const { key } = options.filter; listFilter.addEventListener('change', e => { orderList.filter(item => { if (e.target.value === '') { return true; } return item .values() [key].toLowerCase() .includes(e.target.value.toLowerCase()); }); }); } } }; // import AnchorJS from 'anchor-js'; const anchorJSInit = () => { const anchors = new window.AnchorJS({ icon: '#' }); anchors.add('[data-anchor]'); }; /* -------------------------------------------------------------------------- */ /* bigPicture */ /* -------------------------------------------------------------------------- */ const bigPictureInit = () => { const { getData } = window.phoenix.utils; if (window.BigPicture) { const bpItems = document.querySelectorAll('[data-bigpicture]'); bpItems.forEach(bpItem => { const userOptions = getData(bpItem, 'bigpicture'); const defaultOptions = { el: bpItem, noLoader: true, allowfullscreen: true }; const options = window._.merge(defaultOptions, userOptions); bpItem.addEventListener('click', () => { window.BigPicture(options); }); }); } }; /* eslint-disable no-unused-expressions */ /*----------------------------------------------- | DomNode -----------------------------------------------*/ class DomNode { constructor(node) { this.node = node; } addClass(className) { this.isValidNode() && this.node.classList.add(className); } removeClass(className) { this.isValidNode() && this.node.classList.remove(className); } toggleClass(className) { this.isValidNode() && this.node.classList.toggle(className); } hasClass(className) { this.isValidNode() && this.node.classList.contains(className); } data(key) { if (this.isValidNode()) { try { return JSON.parse(this.node.dataset[this.camelize(key)]); } catch (e) { return this.node.dataset[this.camelize(key)]; } } return null; } attr(name) { return this.isValidNode() && this.node[name]; } setAttribute(name, value) { this.isValidNode() && this.node.setAttribute(name, value); } removeAttribute(name) { this.isValidNode() && this.node.removeAttribute(name); } setProp(name, value) { this.isValidNode() && (this.node[name] = value); } on(event, cb) { this.isValidNode() && this.node.addEventListener(event, cb); } isValidNode() { return !!this.node; } // eslint-disable-next-line class-methods-use-this camelize(str) { const text = str.replace(/[-_\s.]+(.)?/g, (_, c) => c ? c.toUpperCase() : '' ); return `${text.substr(0, 1).toLowerCase()}${text.substr(1)}`; } } /*----------------------------------------------- | Bulk Select -----------------------------------------------*/ const elementMap = new Map(); class BulkSelect { constructor(element, option) { this.element = element; this.option = { displayNoneClassName: 'd-none', ...option }; elementMap.set(this.element, this); } // Static static getInstance(element) { if (elementMap.has(element)) { return elementMap.get(element); } return null; } init() { this.attachNodes(); this.clickBulkCheckbox(); this.clickRowCheckbox(); } getSelectedRows() { return Array.from(this.bulkSelectRows) .filter(row => row.checked) .map(row => getData(row, 'bulk-select-row')); } attachNodes() { const { body, actions, replacedElement } = getData( this.element, 'bulk-select' ); this.actions = new DomNode(document.getElementById(actions)); this.replacedElement = new DomNode( document.getElementById(replacedElement) ); this.bulkSelectRows = document .getElementById(body) .querySelectorAll('[data-bulk-select-row]'); } attachRowNodes(elms) { this.bulkSelectRows = elms; } clickBulkCheckbox() { // Handle click event in bulk checkbox this.element.addEventListener('click', () => { if (this.element.indeterminate === 'indeterminate') { this.actions.addClass(this.option.displayNoneClassName); this.replacedElement.removeClass(this.option.displayNoneClassName); this.removeBulkCheck(); this.bulkSelectRows.forEach(el => { const rowCheck = new DomNode(el); rowCheck.checked = false; rowCheck.setAttribute('checked', false); }); return; } this.toggleDisplay(); this.bulkSelectRows.forEach(el => { el.checked = this.element.checked; }); }); } clickRowCheckbox() { // Handle click event in checkbox of each row this.bulkSelectRows.forEach(el => { const rowCheck = new DomNode(el); rowCheck.on('click', () => { if (this.element.indeterminate !== 'indeterminate') { this.element.indeterminate = true; this.element.setAttribute('indeterminate', 'indeterminate'); this.element.checked = true; this.element.setAttribute('checked', true); this.actions.removeClass(this.option.displayNoneClassName); this.replacedElement.addClass(this.option.displayNoneClassName); } if ([...this.bulkSelectRows].every(element => element.checked)) { this.element.indeterminate = false; this.element.setAttribute('indeterminate', false); } if ([...this.bulkSelectRows].every(element => !element.checked)) { this.removeBulkCheck(); this.toggleDisplay(); } }); }); } removeBulkCheck() { this.element.indeterminate = false; this.element.removeAttribute('indeterminate'); this.element.checked = false; this.element.setAttribute('checked', false); } toggleDisplay(replacedElement, actions) { if (replacedElement || actions) { replacedElement.classList.toggle(this.option.displayNoneClassName); actions.classList.toggle(this.option.displayNoneClassName); } this.actions.toggleClass(this.option.displayNoneClassName); this.replacedElement.toggleClass(this.option.displayNoneClassName); } deselectAll(replacedElement, actions) { this.removeBulkCheck(); this.toggleDisplay(replacedElement, actions); this.bulkSelectRows.forEach(el => { el.checked = false; el.removeAttribute('checked'); }); } } const bulkSelectInit = () => { const bulkSelects = document.querySelectorAll('[data-bulk-select]'); if (bulkSelects.length) { bulkSelects.forEach(el => { const bulkSelect = new BulkSelect(el); bulkSelect.init(); }); } }; // import * as echarts from 'echarts'; const { merge: merge$2 } = window._; // form config.js const echartSetOption = ( chart, userOptions, getDefaultOptions, responsiveOptions ) => { const { breakpoints, resize } = window.phoenix.utils; const handleResize = options => { Object.keys(options).forEach(item => { if (window.innerWidth > breakpoints[item]) { chart.setOption(options[item]); } }); }; const themeController = document.body; // Merge user options with lodash chart.setOption(merge$2(getDefaultOptions(), userOptions)); const navbarVerticalToggle = document.querySelector( '.navbar-vertical-toggle' ); if (navbarVerticalToggle) { navbarVerticalToggle.addEventListener('navbar.vertical.toggle', () => { chart.resize(); if (responsiveOptions) { handleResize(responsiveOptions); } }); } resize(() => { chart.resize(); if (responsiveOptions) { handleResize(responsiveOptions); } }); if (responsiveOptions) { handleResize(responsiveOptions); } themeController.addEventListener( 'clickControl', ({ detail: { control } }) => { if (control === 'phoenixTheme') { chart.setOption(window._.merge(getDefaultOptions(), userOptions)); } if (responsiveOptions) { handleResize(responsiveOptions); } } ); }; // -------------------end config.js-------------------- const echartTabs = document.querySelectorAll('[data-tab-has-echarts]'); if (echartTabs) { echartTabs.forEach(tab => { tab.addEventListener('shown.bs.tab', e => { const el = e.target; const { hash } = el; const id = hash || el.dataset.bsTarget; const content = document.getElementById(id.substring(1)); const chart = content?.querySelector('[data-echart-tab]'); if (chart) { window.echarts.init(chart).resize(); } }); }); } const handleTooltipPosition = ([pos, , dom, , size]) => { // only for mobile device if (window.innerWidth <= 540) { const tooltipHeight = dom.offsetHeight; const obj = { top: pos[1] - tooltipHeight - 20 }; obj[pos[0] < size.viewSize[0] / 2 ? 'left' : 'right'] = 5; return obj; } return null; // else default behaviour }; // import dayjs from 'dayjs'; /* -------------------------------------------------------------------------- */ /* Echart Bar Member info */ /* -------------------------------------------------------------------------- */ const basicEchartsInit = () => { const { getColor, getData, getDates } = window.phoenix.utils; const $echartBasicCharts = document.querySelectorAll('[data-echarts]'); $echartBasicCharts.forEach($echartBasicChart => { const userOptions = getData($echartBasicChart, 'echarts'); const chart = window.echarts.init($echartBasicChart); const getDefaultOptions = () => ({ color: getColor('primary'), tooltip: { trigger: 'item', padding: [7, 10], backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, extraCssText: 'z-index: 1000' }, xAxis: { type: 'category', data: getDates( new Date('5/1/2022'), new Date('5/7/2022'), 1000 * 60 * 60 * 24 ), show: true, boundaryGap: false, axisLine: { show: true, lineStyle: { color: getColor('secondary-bg') } }, axisTick: { show: false }, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM'), interval: 6, showMinLabel: true, showMaxLabel: true, color: getColor('secondary-color') } }, yAxis: { show: false, type: 'value', boundaryGap: false }, series: [ { type: 'bar', symbol: 'none' } ], grid: { left: 22, right: 22, top: 0, bottom: 20 } }); echartSetOption(chart, userOptions, getDefaultOptions); }); }; /* -------------------------------------------------------------------------- */ /* Echarts Total Sales */ /* -------------------------------------------------------------------------- */ const reportsDetailsChartInit = () => { const { getColor, getData, toggleColor } = window.phoenix.utils; // const phoenixTheme = window.config.config; const $chartEl = document.querySelector('.echart-reports-details'); const tooltipFormatter = (params, dateFormatter = 'MMM DD') => { let tooltipItem = ``; params.forEach(el => { tooltipItem += `
    ${el.seriesName} : ${ typeof el.value === 'object' ? el.value[1] : el.value }
    `; }); return `

    ${ window.dayjs(params[0].axisValue).isValid() ? window.dayjs(params[0].axisValue).format('DD MMM, YYYY') : params[0].axisValue }

    ${tooltipItem}
    `; }; // const dates = getPastDates(7); const data = [64, 40, 45, 62, 82]; if ($chartEl) { const userOptions = getData($chartEl, 'echarts'); const chart = window.echarts.init($chartEl); const getDefaultOptions = () => ({ color: [getColor('primary-lighter'), getColor('info-light')], tooltip: { trigger: 'axis', padding: [7, 10], backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: tooltipFormatter, extraCssText: 'z-index: 1000' }, // legend: { // left: '76%', // top: 'auto', // icon: 'circle', // }, xAxis: { type: 'category', data: ['Analysis', 'Statement', 'Action', 'Offering', 'Interlocution'], axisLabel: { color: getColor('body-color'), fontFamily: 'Nunito Sans', fontWeight: 600, fontSize: 12.8, rotate: 30, formatter: value => `${value.slice(0, 5)}...` }, axisLine: { lineStyle: { color: getColor('secondary-bg') } }, axisTick: false }, yAxis: { type: 'value', splitLine: { lineStyle: { color: getColor('secondary-bg') } }, // splitLine: { // show: true, // lineStyle: { // color: "rgba(217, 21, 21, 1)" // } // }, axisLabel: { color: getColor('body-color'), fontFamily: 'Nunito Sans', fontWeight: 700, fontSize: 12.8, margin: 24, formatter: value => `${value}%` } }, series: [ { name: 'Revenue', type: 'bar', barWidth: '32px', barGap: '48%', showBackground: true, backgroundStyle: { color: toggleColor( getColor('primary-bg-subtle'), getColor('body-highlight-bg') ) }, label: { show: false }, itemStyle: { color: toggleColor(getColor('primary-light'), getColor('primary')) }, data } ], grid: { right: '0', left: '0', bottom: 0, top: 10, containLabel: true }, animation: false }); echartSetOption(chart, userOptions, getDefaultOptions); } }; /*----------------------------------------------- | Chat -----------------------------------------------*/ const chatInit = () => { const { getData } = window.phoenix.utils; const Selector = { CHAT_SIDEBAR: '.chat-sidebar', CHAT_TEXT_AREA: '.chat-textarea', CHAT_THREADS: '[data-chat-thread]', CHAT_THREAD_TAB: '[data-chat-thread-tab]', CHAT_THREAD_TAB_CONTENT: '[data-chat-thread-tab-content]' }; const $chatSidebar = document.querySelector(Selector.CHAT_SIDEBAR); const $chatTextArea = document.querySelector(Selector.CHAT_TEXT_AREA); const $chatThreads = document.querySelectorAll(Selector.CHAT_THREADS); const threadTab = document.querySelector(Selector.CHAT_THREAD_TAB); const threadTabContent = document.querySelector( Selector.CHAT_THREAD_TAB_CONTENT ); if (threadTab) { const threadTabItems = threadTab.querySelectorAll("[data-bs-toggle='tab']"); const list = new window.List(threadTabContent, { valueNames: ['read', 'unreadItem'] }); const chatBox = document.querySelector('.chat .card-body'); chatBox.scrollTop = chatBox.scrollHeight; threadTabItems.forEach(tabEl => tabEl.addEventListener('shown.bs.tab', () => { const value = getData(tabEl, 'chat-thread-list'); list.filter(item => { if (value === 'all') { return true; } return item.elm.classList.contains(value); }); }) ); } $chatThreads.forEach((thread, index) => { thread.addEventListener('click', () => { const chatContentArea = document.querySelector( `.chat-content-body-${index}` ); chatContentArea.scrollTop = chatContentArea.scrollHeight; $chatSidebar.classList.remove('show'); if (thread.classList.contains('unread')) { thread.classList.remove('unread'); const unreadBadge = thread.querySelector('.unread-badge'); if (unreadBadge) { unreadBadge.remove(); } } }); }); if ($chatTextArea) { $chatTextArea.setAttribute('placeholder', 'Type your message...'); } }; /* -------------------------------------------------------------------------- */ /* choices */ /* -------------------------------------------------------------------------- */ const choicesInit = () => { const { getData } = window.phoenix.utils; if (window.Choices) { const elements = document.querySelectorAll('[data-choices]'); elements.forEach(item => { const userOptions = getData(item, 'options'); const choices = new window.Choices(item, { itemSelectText: '', addItems: true, allowHTML: true, ...userOptions }); const needsValidation = document.querySelectorAll('.needs-validation'); needsValidation.forEach(validationItem => { const selectFormValidation = () => { validationItem.querySelectorAll('.choices').forEach(choicesItem => { const singleSelect = choicesItem.querySelector( '.choices__list--single' ); const multipleSelect = choicesItem.querySelector( '.choices__list--multiple' ); if (choicesItem.querySelector('[required]')) { if (singleSelect) { if ( singleSelect .querySelector('.choices__item--selectable') ?.getAttribute('data-value') !== '' ) { choicesItem.classList.remove('invalid'); choicesItem.classList.add('valid'); } else { choicesItem.classList.remove('valid'); choicesItem.classList.add('invalid'); } } // ----- for multiple select only ---------- if (multipleSelect) { if (choicesItem.getElementsByTagName('option').length) { choicesItem.classList.remove('invalid'); choicesItem.classList.add('valid'); } else { choicesItem.classList.remove('valid'); choicesItem.classList.add('invalid'); } } // ------ select end --------------- } }); }; validationItem.addEventListener('submit', () => { selectFormValidation(); }); item.addEventListener('change', () => { selectFormValidation(); }); }); return choices; }); } }; /* -------------------------------------------------------------------------- */ /* Copy LinK */ /* -------------------------------------------------------------------------- */ const copyLink = () => { const { getData } = window.phoenix.utils; const copyButtons = document.querySelectorAll('[data-copy]'); copyButtons.forEach(button => { const tooltip = new window.bootstrap.Tooltip(button); button.addEventListener('mouseover', () => tooltip.show()); button.addEventListener('mouseleave', () => tooltip.hide()); button.addEventListener('click', () => { button.setAttribute('data-bs-original-title', 'Copied'); tooltip.show(); const inputID = getData(button, 'copy'); const input = document.querySelector(inputID); input.select(); navigator.clipboard.writeText(input.value); button.setAttribute('data-bs-original-title', 'click to copy'); }); }); }; /* -------------------------------------------------------------------------- */ /* Count Up */ /* -------------------------------------------------------------------------- */ const countupInit = () => { const { getData } = window.phoenix.utils; if (window.countUp) { const countups = document.querySelectorAll('[data-countup]'); countups.forEach(node => { const { endValue, ...options } = getData(node, 'countup'); const countUp = new window.countUp.CountUp(node, endValue, { duration: 4, // suffix: '+', ...options }); if (!countUp.error) { countUp.start(); } else { console.error(countUp.error); } }); } }; /* -------------------------------------------------------------------------- */ /* step wizard */ /* -------------------------------------------------------------------------- */ const createBoardInit = () => { const { getData } = window.phoenix.utils; const submit_btn = document.querySelector('#submit_btn'); const selectors = { CREATE_BOARD: '[data-create-board]', TOGGLE_BUTTON_EL: '[data-wizard-step]', FORMS: '[data-wizard-form]', PASSWORD_INPUT: '[data-wizard-password]', CONFIRM_PASSWORD_INPUT: '[data-wizard-confirm-password]', NEXT_BTN: '[data-wizard-next-btn]', PREV_BTN: '[data-wizard-prev-btn]', FOOTER: '[data-wizard-footer]', KANBAN_STEP: '[data-kanban-step]', BOARD_PREV_BTN: '[data-board-prev-btn]', CUSTOM_COLOR: '[data-custom-color-radio]' }; const events = { SUBMIT: 'submit', SHOW: 'show.bs.tab', SHOWN: 'shown.bs.tab', CLICK: 'click', CHANGE: 'change' }; const createBoard = document.querySelector(selectors.CREATE_BOARD); if (createBoard) { const tabToggleButtonEl = createBoard.querySelectorAll( selectors.TOGGLE_BUTTON_EL ); const tabs = Array.from(tabToggleButtonEl).map(item => { return window.bootstrap.Tab.getOrCreateInstance(item); }); // previous button only for create board last step const boardPrevButton = document.querySelector(selectors.BOARD_PREV_BTN); boardPrevButton?.addEventListener(events.CLICK, () => { tabs[tabs.length - 2].show(); }); // update kanban step if (tabToggleButtonEl.length) { tabToggleButtonEl.forEach(item => { item.addEventListener(events.SHOW, () => { const step = getData(item, 'wizard-step'); const kanbanStep = document.querySelector(selectors.KANBAN_STEP); if (kanbanStep) { kanbanStep.textContent = step; } }); }); } const forms = createBoard.querySelectorAll(selectors.FORMS); forms.forEach((form, index) => { form.addEventListener(events.SUBMIT, e => { e.preventDefault(); const formData = new FormData(e.target); Object.fromEntries(formData.entries()); if (index + 1 === forms.length) { window.location.reload(); } return null; }); }); // custom color const colorPicker = document.querySelector('#customColorInput'); colorPicker?.addEventListener(events.CHANGE, event => { const selectedColor = event.target.value; const customColorRadioBtn = document.querySelector( selectors.CUSTOM_COLOR ); customColorRadioBtn.setAttribute('checked', 'checked'); customColorRadioBtn.value = selectedColor; }); } }; /* -------------------------------------------------------------------------- */ /* Detector */ /* -------------------------------------------------------------------------- */ const detectorInit = () => { const { addClass } = window.phoenix.utils; const { is } = window; const html = document.querySelector('html'); is.opera() && addClass(html, 'opera'); is.mobile() && addClass(html, 'mobile'); is.firefox() && addClass(html, 'firefox'); is.safari() && addClass(html, 'safari'); is.ios() && addClass(html, 'ios'); is.iphone() && addClass(html, 'iphone'); is.ipad() && addClass(html, 'ipad'); is.ie() && addClass(html, 'ie'); is.edge() && addClass(html, 'edge'); is.chrome() && addClass(html, 'chrome'); is.mac() && addClass(html, 'osx'); is.windows() && addClass(html, 'windows'); navigator.userAgent.match('CriOS') && addClass(html, 'chrome'); }; /* -------------------------------------------------------------------------- */ /* Open dropdown on hover */ /* -------------------------------------------------------------------------- */ const dropdownOnHover = () => { const navbarArea = document.querySelector('[data-dropdown-on-hover]'); if (navbarArea) { navbarArea.addEventListener('mouseover', e => { if ( e.target?.classList.contains('dropdown-toggle') && !e.target.parentNode.className.includes('dropdown-inside') && window.innerWidth > 992 ) { const dropdownInstance = new window.bootstrap.Dropdown(e.target); /* eslint-disable no-underscore-dangle */ dropdownInstance._element.classList.add('show'); dropdownInstance._menu.classList.add('show'); dropdownInstance._menu.setAttribute('data-bs-popper', 'none'); e.target.parentNode.addEventListener('mouseleave', () => { if (window.innerWidth > 992) { dropdownInstance.hide(); } }); } }); } }; /* eslint-disable */ const { merge: merge$1 } = window._; /*----------------------------------------------- | Dropzone -----------------------------------------------*/ window.Dropzone ? (window.Dropzone.autoDiscover = false) : ''; const dropzoneInit = () => { const { getData } = window.phoenix.utils; const Selector = { DROPZONE: '[data-dropzone]', DZ_ERROR_MESSAGE: '.dz-error-message', DZ_PREVIEW: '.dz-preview', DZ_PROGRESS: '.dz-preview .dz-preview-cover .dz-progress', DZ_PREVIEW_COVER: '.dz-preview .dz-preview-cover' }; const ClassName = { DZ_FILE_PROCESSING: 'dz-file-processing', DZ_FILE_COMPLETE: 'dz-file-complete', DZ_COMPLETE: 'dz-complete', DZ_PROCESSING: 'dz-processing' }; const DATA_KEY = { OPTIONS: 'options' }; const Events = { ADDED_FILE: 'addedfile', REMOVED_FILE: 'removedfile', COMPLETE: 'complete' }; const dropzones = document.querySelectorAll(Selector.DROPZONE); !!dropzones.length && dropzones.forEach(item => { let userOptions = getData(item, DATA_KEY.OPTIONS); userOptions = userOptions ? userOptions : {}; const data = userOptions.data ? userOptions.data : {}; const options = merge$1( { url: '/assets/php/', addRemoveLinks: false, previewsContainer: item.querySelector(Selector.DZ_PREVIEW), previewTemplate: item.querySelector(Selector.DZ_PREVIEW).innerHTML, thumbnailWidth: null, thumbnailHeight: null, maxFilesize: 2, autoProcessQueue: false, filesizeBase: 1000, init: function init() { const thisDropzone = this; if (data.length) { data.forEach(v => { const mockFile = { name: v.name, size: v.size }; thisDropzone.options.addedfile.call(thisDropzone, mockFile); thisDropzone.options.thumbnail.call( thisDropzone, mockFile, `${v.url}/${v.name}` ); }); } thisDropzone.on(Events.ADDED_FILE, function addedfile() { if ('maxFiles' in userOptions) { if ( userOptions.maxFiles === 1 && item.querySelectorAll(Selector.DZ_PREVIEW_COVER).length > 1 ) { item.querySelector(Selector.DZ_PREVIEW_COVER).remove(); } if (userOptions.maxFiles === 1 && this.files.length > 1) { this.removeFile(this.files[0]); } } }); }, error(file, message) { if (file.previewElement) { file.previewElement.classList.add('dz-error'); if (typeof message !== 'string' && message.error) { message = message.error; } for (let node of file.previewElement.querySelectorAll( '[data-dz-errormessage]' )) { node.textContent = message; } } } }, userOptions ); // eslint-disable-next-line item.querySelector(Selector.DZ_PREVIEW).innerHTML = ''; const dropzone = new window.Dropzone(item, options); dropzone.on(Events.ADDED_FILE, () => { if (item.querySelector(Selector.DZ_PREVIEW_COVER)) { item .querySelector(Selector.DZ_PREVIEW_COVER) .classList.remove(ClassName.DZ_FILE_COMPLETE); } item.classList.add(ClassName.DZ_FILE_PROCESSING); // Kanban custom bg radio select document .querySelector('.kanban-custom-bg-radio') ?.setAttribute('checked', true); }); dropzone.on(Events.REMOVED_FILE, () => { if (item.querySelector(Selector.DZ_PREVIEW_COVER)) { item .querySelector(Selector.DZ_PREVIEW_COVER) .classList.remove(ClassName.DZ_PROCESSING); } item.classList.add(ClassName.DZ_FILE_COMPLETE); }); dropzone.on(Events.COMPLETE, () => { if (item.querySelector(Selector.DZ_PREVIEW_COVER)) { item .querySelector(Selector.DZ_PREVIEW_COVER) .classList.remove(ClassName.DZ_PROCESSING); } item.classList.add(ClassName.DZ_FILE_COMPLETE); }); }); }; // import feather from 'feather-icons'; /* -------------------------------------------------------------------------- */ /* Feather Icons */ /* -------------------------------------------------------------------------- */ const featherIconsInit = () => { if (window.feather) { window.feather.replace({ width: '16px', height: '16px' }); } }; /* -------------------------------------------------------------------------- */ /* Flatpickr */ /* -------------------------------------------------------------------------- */ const flatpickrInit = () => { const { getData } = window.phoenix.utils; document.querySelectorAll('.datetimepicker').forEach(item => { const userOptions = getData(item, 'options'); window.flatpickr(item, { nextArrow: ``, prevArrow: ``, locale: { firstDayOfWeek: 1, shorthand: ['S', 'M', 'T', 'W', 'T', 'F', 'S'] }, monthSelectorType: 'static', onDayCreate: (dObj, dStr, fp, dayElem) => { if (dayElem.dateObj.getDay() === 6 || dayElem.dateObj.getDay() === 0) { dayElem.className += ' weekend-days'; } }, ...userOptions }); // datepicker.l10n.weekdays.shorthand = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; }); }; /* -------------------------------------------------------------------------- */ /* Form Validation */ /* -------------------------------------------------------------------------- */ const formValidationInit = () => { const forms = document.querySelectorAll('.needs-validation'); forms.forEach(form => { form.addEventListener( 'submit', event => { if (!form.checkValidity()) { event.preventDefault(); event.stopPropagation(); } form.classList.add('was-validated'); }, false ); }); }; /* -------------------------------------------------------------------------- */ /* Calendar */ /* -------------------------------------------------------------------------- */ const renderCalendar = (el, option) => { const { merge } = window._; const options = merge( { initialView: 'dayGridMonth', weekNumberCalculation: 'ISO', editable: true, direction: document.querySelector('html').getAttribute('dir'), headerToolbar: { left: 'prev,next today', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay' }, buttonText: { month: 'Month', week: 'Week', day: 'Day' } }, option ); const calendar = new window.FullCalendar.Calendar(el, options); calendar.render(); document .querySelector('.navbar-vertical-toggle') ?.addEventListener('navbar.vertical.toggle', () => calendar.updateSize()); return calendar; }; const fullCalendarInit = () => { const { getData } = window.phoenix.utils; const calendars = document.querySelectorAll('[data-calendar]'); calendars.forEach(item => { const options = getData(item, 'calendar'); renderCalendar(item, options); }); }; /* -------------------------------------------------------------------------- */ /* Glightbox */ /* -------------------------------------------------------------------------- */ const glightboxInit = () => { if (window.GLightbox) { window.GLightbox({ selector: '[data-gallery]' }); } }; /*----------------------------------------------- | Gooogle Map -----------------------------------------------*/ function initMap() { const { getData } = window.phoenix.utils; const themeController = document.body; const $googlemaps = document.querySelectorAll('[data-googlemap]'); if ($googlemaps.length && window.google) { const createControlBtn = (map, type) => { const controlButton = document.createElement('button'); controlButton.classList.add(type); controlButton.innerHTML = type === 'zoomIn' ? '' : ''; controlButton.addEventListener('click', () => { const zoom = map.getZoom(); if (type === 'zoomIn') { map.setZoom(zoom + 1); } if (type === 'zoomOut') { map.setZoom(zoom - 1); } }); return controlButton; }; const mapStyles = { SnazzyCustomLight: [ { featureType: 'administrative', elementType: 'all', stylers: [ { visibility: 'off' } ] }, { featureType: 'administrative', elementType: 'labels', stylers: [ { visibility: 'on' } ] }, { featureType: 'administrative', elementType: 'labels.text.fill', stylers: [ { color: '#525b75' } ] }, { featureType: 'administrative', elementType: 'labels.text.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'administrative', elementType: 'labels.icon', stylers: [ { visibility: 'off' } ] }, { featureType: 'administrative.country', elementType: 'geometry.stroke', stylers: [ { visibility: 'on' }, { color: '#ffffff' } ] }, { featureType: 'administrative.province', elementType: 'geometry.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'landscape', elementType: 'geometry', stylers: [ { visibility: 'on' }, { color: '#E3E6ED' } ] }, { featureType: 'landscape.natural', elementType: 'labels', stylers: [ { visibility: 'off' } ] }, { featureType: 'poi', elementType: 'all', stylers: [ { visibility: 'off' } ] }, { featureType: 'road', elementType: 'all', stylers: [ { color: '#eff2f6' } ] }, { featureType: 'road', elementType: 'labels', stylers: [ { visibility: 'off' } ] }, { featureType: 'road.arterial', elementType: 'all', stylers: [ { visibility: 'on' } ] }, { featureType: 'road.arterial', elementType: 'geometry', stylers: [ { visibility: 'on' }, { color: '#eff2f6' } ] }, { featureType: 'road.arterial', elementType: 'labels.text.fill', stylers: [ { visibility: 'on' }, { color: '#9fa6bc' } ] }, { featureType: 'road.arterial', elementType: 'labels.text.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'road.local', elementType: 'geometry.fill', stylers: [ { visibility: 'on' }, { color: '#eff2f6' } ] }, { featureType: 'road.local', elementType: 'labels.text.fill', stylers: [ { visibility: 'on' }, { color: '#9fa6bc' } ] }, { featureType: 'road.local', elementType: 'labels.text.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'transit', elementType: 'labels.icon', stylers: [ { visibility: 'off' } ] }, { featureType: 'transit.line', elementType: 'geometry', stylers: [ { visibility: 'off' } ] }, { featureType: 'transit.line', elementType: 'labels.text', stylers: [ { visibility: 'off' } ] }, { featureType: 'transit.station.airport', elementType: 'geometry', stylers: [ { visibility: 'off' } ] }, { featureType: 'transit.station.airport', elementType: 'labels', stylers: [ { visibility: 'off' } ] }, { featureType: 'water', elementType: 'geometry', stylers: [ { color: '#F5F7FA' } ] }, { featureType: 'water', elementType: 'labels', stylers: [ { visibility: 'off' } ] } ], SnazzyCustomDark: [ { featureType: 'administrative', elementType: 'all', stylers: [ { visibility: 'off' } ] }, { featureType: 'administrative', elementType: 'labels', stylers: [{ visibility: 'on' }] }, { featureType: 'administrative', elementType: 'labels.text.fill', stylers: [ { color: '#8a94ad' } ] }, { featureType: 'administrative', elementType: 'labels.text.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'administrative', elementType: 'labels.icon', stylers: [ { visibility: 'off' } ] }, { featureType: 'administrative.country', elementType: 'geometry.stroke', stylers: [ { visibility: 'on' }, { color: '#000000' } ] }, { featureType: 'administrative.province', elementType: 'geometry.stroke', stylers: [{ visibility: 'off' }] }, { featureType: 'landscape', elementType: 'geometry', stylers: [{ visibility: 'on' }, { color: '#222834' }] }, { featureType: 'landscape.natural', elementType: 'labels', stylers: [{ visibility: 'off' }] }, { featureType: 'poi', elementType: 'all', stylers: [{ visibility: 'off' }] }, { featureType: 'road', elementType: 'all', stylers: [{ color: '#141824' }] }, { featureType: 'road', elementType: 'labels', stylers: [{ visibility: 'off' }] }, { featureType: 'road.arterial', elementType: 'all', stylers: [ { visibility: 'on' } ] }, { featureType: 'road.arterial', elementType: 'geometry', stylers: [ { visibility: 'on' }, { color: '#141824' } ] }, { featureType: 'road.arterial', elementType: 'labels.text.fill', stylers: [ { visibility: 'on' }, { color: '#525b75' } ] }, { featureType: 'road.arterial', elementType: 'labels.text.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'road.local', elementType: 'geometry.fill', stylers: [ { visibility: 'on' }, { color: '#141824' } ] }, { featureType: 'road.local', elementType: 'labels.text.fill', stylers: [ { visibility: 'on' }, { color: '#67718A' } ] }, { featureType: 'road.local', elementType: 'labels.text.stroke', stylers: [ { visibility: 'off' } ] }, { featureType: 'transit', elementType: 'labels.icon', stylers: [{ visibility: 'off' }] }, { featureType: 'transit.line', elementType: 'geometry', stylers: [{ visibility: 'off' }] }, { featureType: 'transit.line', elementType: 'labels.text', stylers: [{ visibility: 'off' }] }, { featureType: 'transit.station.airport', elementType: 'geometry', stylers: [{ visibility: 'off' }] }, { featureType: 'transit.station.airport', elementType: 'labels', stylers: [{ visibility: 'off' }] }, { featureType: 'water', elementType: 'geometry', stylers: [{ color: '#0f111a' }] }, { featureType: 'water', elementType: 'labels', stylers: [{ visibility: 'off' }] } ] }; $googlemaps.forEach(itm => { const latLng = getData(itm, 'latlng').split(','); const markerPopup = itm.innerHTML; const zoom = getData(itm, 'zoom'); const mapElement = itm; const mapStyle = getData(itm, 'phoenixTheme'); if (getData(itm, 'phoenixTheme') === 'streetview') { const pov = getData(itm, 'pov'); const mapOptions = { position: { lat: Number(latLng[0]), lng: Number(latLng[1]) }, pov, zoom, gestureHandling: 'none', scrollwheel: false }; return new window.google.maps.StreetViewPanorama( mapElement, mapOptions ); } const mapOptions = { zoom, minZoom: 1.2, clickableIcons: false, zoomControl: false, zoomControlOptions: { position: window.google.maps.ControlPosition.LEFT }, scrollwheel: getData(itm, 'scrollwheel'), disableDefaultUI: true, center: new window.google.maps.LatLng(latLng[0], latLng[1]), styles: window.config.config.phoenixTheme === 'dark' ? mapStyles.SnazzyCustomDark : mapStyles[mapStyle || 'SnazzyCustomLight'] }; const map = new window.google.maps.Map(mapElement, mapOptions); const infoWindow = new window.google.maps.InfoWindow({ content: markerPopup }); // Create the DIV to hold the control. const controlDiv = document.createElement('div'); controlDiv.classList.add('google-map-control-btn'); // Create the control. const zoomInBtn = createControlBtn(map, 'zoomIn'); const zoomOutBtn = createControlBtn(map, 'zoomOut'); // Append the control to the DIV. controlDiv.appendChild(zoomInBtn); controlDiv.appendChild(zoomOutBtn); map.controls[window.google.maps.ControlPosition.LEFT].push(controlDiv); const marker = new window.google.maps.Marker({ position: new window.google.maps.LatLng(latLng[0], latLng[1]), // icon, map }); marker.addListener('click', () => { infoWindow.open(map, marker); }); themeController && themeController.addEventListener( 'clickControl', ({ detail: { control, value } }) => { if (control === 'phoenixTheme') { map.set( 'styles', value === 'dark' ? mapStyles.SnazzyCustomDark : mapStyles.SnazzyCustomLight ); } } ); // return null; }); } } /* -------------------------------------------------------------------------- */ /* Icon copy to clipboard */ /* -------------------------------------------------------------------------- */ const iconCopiedInit = () => { const iconList = document.getElementById('icon-list'); const iconCopiedToast = document.getElementById('icon-copied-toast'); const iconCopiedToastInstance = new window.bootstrap.Toast(iconCopiedToast); if (iconList) { iconList.addEventListener('click', e => { const el = e.target; if (el.tagName === 'INPUT') { el.select(); el.setSelectionRange(0, 99999); document.execCommand('copy'); iconCopiedToast.querySelector( '.toast-body' ).innerHTML = `Copied: ${el.value}`; iconCopiedToastInstance.show(); } }); } }; /*----------------------------------------------- | Isotope -----------------------------------------------*/ const isotopeInit = () => { const { getData } = window.phoenix.utils; const Selector = { ISOTOPE_ITEM: '.isotope-item', DATA_ISOTOPE: '[data-sl-isotope]', DATA_FILTER: '[data-filter]', DATA_FILER_NAV: '[data-filter-nav]', DATA_GALLERY_COLUMN: '[data-gallery-column]' }; const DATA_KEY = { ISOTOPE: 'sl-isotope' }; const ClassName = { ACTIVE: 'active' }; if (window.Isotope) { const masonryItems = document.querySelectorAll(Selector.DATA_ISOTOPE); const columnGallery = document.querySelector(Selector.DATA_GALLERY_COLUMN); if (masonryItems.length) { masonryItems.forEach(masonryItem => { window.imagesLoaded(masonryItem, () => { document.querySelectorAll(Selector.ISOTOPE_ITEM).forEach(item => { // eslint-disable-next-line no-param-reassign item.style.visibility = 'visible'; }); const userOptions = getData(masonryItem, DATA_KEY.ISOTOPE); const defaultOptions = { itemSelector: Selector.ISOTOPE_ITEM, layoutMode: 'packery' }; const options = window._.merge(defaultOptions, userOptions); const isotope = new window.Isotope(masonryItem, options); const addSeparator = (count = 4) => { for (let i = 1; i < count; i += 1) { const separator = document.createElement('span'); separator.classList.add( `gallery-column-separator`, `gallery-column-separator-${i}` ); masonryItem.appendChild(separator); } }; const removeSeparator = () => { document .querySelectorAll('span[class*="gallery-column-separator-"]') .forEach(separatorEle => separatorEle.remove()); }; if (columnGallery) addSeparator(); // --------- filter ----------------- const filterElement = document.querySelector(Selector.DATA_FILER_NAV); filterElement?.addEventListener('click', e => { const item = e.target.dataset.filter; isotope.arrange({ filter: item }); document.querySelectorAll(Selector.DATA_FILTER).forEach(el => { el.classList.remove(ClassName.ACTIVE); }); e.target.classList.add(ClassName.ACTIVE); const filteredItems = isotope.getFilteredItemElements(); if (columnGallery) { removeSeparator(); } setTimeout(() => { if (columnGallery) { addSeparator( filteredItems.length > 4 ? 4 : filteredItems.length ); } isotope.layout(); }, 400); }); // ---------- filter end ------------ isotope.layout(); return isotope; }); }); } } }; /* eslint-disable no-unused-expressions */ /* -------------------------------------------------------------------------- */ /* Data Table */ /* -------------------------------------------------------------------------- */ /* eslint-disable no-param-reassign */ const togglePaginationButtonDisable = (button, disabled) => { button.disabled = disabled; button.classList[disabled ? 'add' : 'remove']('disabled'); }; const listInit = () => { const { getData } = window.phoenix.utils; if (window.List) { const lists = document.querySelectorAll('[data-list]'); if (lists.length) { lists.forEach(el => { const bulkSelect = el.querySelector('[data-bulk-select]'); let options = getData(el, 'list'); if (options.pagination) { options = { ...options, pagination: { item: `
  • `, ...options.pagination } }; } const paginationButtonNext = el.querySelector( '[data-list-pagination="next"]' ); const paginationButtonPrev = el.querySelector( '[data-list-pagination="prev"]' ); const viewAll = el.querySelector('[data-list-view="*"]'); const viewLess = el.querySelector('[data-list-view="less"]'); const listInfo = el.querySelector('[data-list-info]'); const listFilter = el.querySelector('[data-list-filter]'); const list = new List(el, options); // --------------------------------------- let totalItem = list.items.length; const itemsPerPage = list.page; const btnDropdownClose = list.listContainer.querySelector('.btn-close'); let pageQuantity = Math.ceil(list.size() / list.page); let pageCount = 1; let numberOfcurrentItems = (pageCount - 1) * Number(list.page) + list.visibleItems.length; let isSearching = false; btnDropdownClose && btnDropdownClose.addEventListener('search.close', () => { list.fuzzySearch(''); }); const updateListControls = () => { listInfo && (listInfo.innerHTML = `${list.i} to ${numberOfcurrentItems} Items of ${totalItem}`); paginationButtonPrev && togglePaginationButtonDisable( paginationButtonPrev, pageCount === 1 || pageCount === 0 ); paginationButtonNext && togglePaginationButtonDisable( paginationButtonNext, pageCount === pageQuantity || pageCount === 0 ); if (pageCount > 1 && pageCount < pageQuantity) { togglePaginationButtonDisable(paginationButtonNext, false); togglePaginationButtonDisable(paginationButtonPrev, false); } }; // List info updateListControls(); if (paginationButtonNext) { paginationButtonNext.addEventListener('click', e => { e.preventDefault(); pageCount += 1; const nextInitialIndex = list.i + itemsPerPage; nextInitialIndex <= list.size() && list.show(nextInitialIndex, itemsPerPage); }); } if (paginationButtonPrev) { paginationButtonPrev.addEventListener('click', e => { e.preventDefault(); pageCount -= 1; const prevItem = list.i - itemsPerPage; prevItem > 0 && list.show(prevItem, itemsPerPage); }); } const toggleViewBtn = () => { viewLess.classList.toggle('d-none'); viewAll.classList.toggle('d-none'); }; if (viewAll) { viewAll.addEventListener('click', () => { list.show(1, totalItem); pageCount = 1; toggleViewBtn(); }); } if (viewLess) { viewLess.addEventListener('click', () => { list.show(1, itemsPerPage); pageCount = 1; toggleViewBtn(); }); } // numbering pagination if (options.pagination) { el.querySelector('.pagination').addEventListener('click', e => { if (e.target.classList[0] === 'page') { const pageNum = Number(e.target.getAttribute('data-i')); if (pageNum) { list.show(itemsPerPage * (pageNum - 1) + 1, list.page); pageCount = pageNum; } } }); } // filter if (options.filter) { const { key } = options.filter; listFilter.addEventListener('change', e => { list.filter(item => { if (e.target.value === '') { return true; } pageQuantity = Math.ceil(list.matchingItems.length / list.page); pageCount = 1; updateListControls(); return item .values() [key].toLowerCase() .includes(e.target.value.toLowerCase()); }); }); } // bulk-select if (bulkSelect) { const bulkSelectInstance = window.phoenix.BulkSelect.getInstance(bulkSelect); bulkSelectInstance.attachRowNodes( list.items.map(item => item.elm.querySelector('[data-bulk-select-row]') ) ); bulkSelect.addEventListener('change', () => { if (list) { if (bulkSelect.checked) { list.items.forEach(item => { item.elm.querySelector( '[data-bulk-select-row]' ).checked = true; }); } else { list.items.forEach(item => { item.elm.querySelector( '[data-bulk-select-row]' ).checked = false; }); } } }); } list.on('searchStart', () => { isSearching = true; }); list.on('searchComplete', () => { isSearching = false; }); list.on('updated', item => { if (!list.matchingItems.length) { pageQuantity = Math.ceil(list.size() / list.page); } else { pageQuantity = Math.ceil(list.matchingItems.length / list.page); } numberOfcurrentItems = (pageCount - 1) * Number(list.page) + list.visibleItems.length; updateListControls(); // -------search----------- if (isSearching) { if (list.matchingItems.length === 0) { pageCount = 0; } else { pageCount = 1; } totalItem = list.matchingItems.length; numberOfcurrentItems = (pageCount === 0 ? 1 : pageCount - 1) * Number(list.page) + list.visibleItems.length; updateListControls(); listInfo && (listInfo.innerHTML = `${ list.matchingItems.length === 0 ? 0 : list.i } to ${ list.matchingItems.length === 0 ? 0 : numberOfcurrentItems } Items of ${ list.matchingItems.length }`); } // -------fallback----------- const fallback = el.querySelector('.fallback') || document.getElementById(options.fallback); if (fallback) { if (item.matchingItems.length === 0) { fallback.classList.remove('d-none'); } else { fallback.classList.add('d-none'); } } }); }); } } }; const lottieInit = () => { const { getData } = window.phoenix.utils; const lotties = document.querySelectorAll('.lottie'); if (lotties.length) { lotties.forEach(item => { const options = getData(item, 'options'); window.bodymovin.loadAnimation({ container: item, path: '../img/animated-icons/warning-light.json', renderer: 'svg', loop: true, autoplay: true, name: 'Hello World', ...options }); }); } }; /* ----------------------------------------------------------------- */ /* Modal */ /* ----------------------------------------------------------------- */ const modalInit = () => { const $modals = document.querySelectorAll('[data-phoenix-modal]'); if ($modals) { const { getData, getCookie, setCookie } = window.phoenix.utils; $modals.forEach(modal => { const userOptions = getData(modal, 'phoenix-modal'); const defaultOptions = { autoShow: false }; const options = window._.merge(defaultOptions, userOptions); if (options.autoShow) { const autoShowModal = new window.bootstrap.Modal(modal); const disableModalBtn = modal.querySelector( '[data-disable-modal-auto-show]' ); disableModalBtn.addEventListener('click', () => { const seconds = 24 * 60 * 60; setCookie('disableAutoShowModal', 'true', seconds); }); const disableAutoShowModalCookie = getCookie('disableAutoShowModal'); if (!disableAutoShowModalCookie) { autoShowModal.show(); } } else { modal.addEventListener('shown.bs.modal', () => { const $autofocusEls = modal.querySelectorAll('[autofocus=autofocus]'); $autofocusEls.forEach(el => { el.focus(); }); }); } }); } }; /* -------------------------------------------------------------------------- */ /* Navbar Combo Layout */ /* -------------------------------------------------------------------------- */ const navbarComboInit = () => { const { getBreakpoint, getData, addClass, hasClass, resize } = window.phoenix.utils; const Selector = { NAVBAR_VERTICAL: '.navbar-vertical', NAVBAR_TOP_COMBO: '[data-navbar-top="combo"]', COLLAPSE: '.collapse', DATA_MOVE_CONTAINER: '[data-move-container]', NAVBAR_NAV: '.navbar-nav', NAVBAR_VERTICAL_DIVIDER: '.navbar-vertical-divider' }; const ClassName = { FLEX_COLUMN: 'flex-column' }; const navbarVertical = document.querySelector(Selector.NAVBAR_VERTICAL); const navbarTopCombo = document.querySelector(Selector.NAVBAR_TOP_COMBO); const moveNavContent = windowWidth => { const navbarVerticalBreakpoint = getBreakpoint(navbarVertical); const navbarTopBreakpoint = getBreakpoint(navbarTopCombo); if (windowWidth < navbarTopBreakpoint) { const navbarCollapse = navbarTopCombo.querySelector(Selector.COLLAPSE); const navbarTopContent = navbarCollapse.innerHTML; if (navbarTopContent) { const targetID = getData(navbarTopCombo, 'move-target'); const targetElement = document.querySelector(targetID); navbarCollapse.innerHTML = ''; targetElement.insertAdjacentHTML( 'afterend', `
    ${navbarTopContent}
    ` ); if (navbarVerticalBreakpoint < navbarTopBreakpoint) { const navbarNav = document .querySelector(Selector.DATA_MOVE_CONTAINER) .querySelector(Selector.NAVBAR_NAV); addClass(navbarNav, ClassName.FLEX_COLUMN); } } } else { const moveableContainer = document.querySelector( Selector.DATA_MOVE_CONTAINER ); if (moveableContainer) { const navbarNav = moveableContainer.querySelector(Selector.NAVBAR_NAV); hasClass(navbarNav, ClassName.FLEX_COLUMN) && navbarNav.classList.remove(ClassName.FLEX_COLUMN); moveableContainer .querySelector(Selector.NAVBAR_VERTICAL_DIVIDER) .remove(); navbarTopCombo.querySelector(Selector.COLLAPSE).innerHTML = moveableContainer.innerHTML; moveableContainer.remove(); } } }; moveNavContent(window.innerWidth); resize(() => moveNavContent(window.innerWidth)); }; const navbarShadowOnScrollInit = () => { const navbar = document.querySelector('[data-navbar-shadow-on-scroll]'); if (navbar) { window.onscroll = () => { if (window.scrollY > 300) { navbar.classList.add('navbar-shadow'); } else { navbar.classList.remove('navbar-shadow'); } }; } }; const navbarInit = () => { const navbar = document.querySelector('[data-navbar-soft-on-scroll]'); if (navbar) { const windowHeight = window.innerHeight; const handleAlpha = () => { const scrollTop = window.pageYOffset; let alpha = (scrollTop / windowHeight) * 2; alpha >= 1 && (alpha = 1); navbar.style.backgroundColor = `rgba(255, 255, 255, ${alpha})`; }; handleAlpha(); document.addEventListener('scroll', () => handleAlpha()); } }; /* -------------------------------------------------------------------------- */ /* Navbar Vertical */ /* -------------------------------------------------------------------------- */ const handleNavbarVerticalCollapsed = () => { const { getItemFromStore, setItemToStore, resize } = window.phoenix.utils; const Selector = { HTML: 'html', BODY: 'body', NAVBAR_VERTICAL: '.navbar-vertical', NAVBAR_VERTICAL_TOGGLE: '.navbar-vertical-toggle', NAVBAR_VERTICAL_COLLAPSE: '.navbar-vertical .navbar-collapse', ACTIVE_NAV_LINK: '.navbar-vertical .nav-link.active' }; const Events = { CLICK: 'click', MOUSE_OVER: 'mouseover', MOUSE_LEAVE: 'mouseleave', NAVBAR_VERTICAL_TOGGLE: 'navbar.vertical.toggle' }; const ClassNames = { NAVBAR_VERTICAL_COLLAPSED: 'navbar-vertical-collapsed' }; const navbarVerticalToggle = document.querySelector( Selector.NAVBAR_VERTICAL_TOGGLE ); // const html = document.querySelector(Selector.HTML); const navbarVerticalCollapse = document.querySelector( Selector.NAVBAR_VERTICAL_COLLAPSE ); const activeNavLinkItem = document.querySelector(Selector.ACTIVE_NAV_LINK); if (navbarVerticalToggle) { navbarVerticalToggle.addEventListener(Events.CLICK, e => { const isNavbarVerticalCollapsed = getItemFromStore( 'phoenixIsNavbarVerticalCollapsed', false ); navbarVerticalToggle.blur(); document.documentElement.classList.toggle( ClassNames.NAVBAR_VERTICAL_COLLAPSED ); // Set collapse state on localStorage setItemToStore( 'phoenixIsNavbarVerticalCollapsed', !isNavbarVerticalCollapsed ); const event = new CustomEvent(Events.NAVBAR_VERTICAL_TOGGLE); e.currentTarget?.dispatchEvent(event); }); } if (navbarVerticalCollapse) { const isNavbarVerticalCollapsed = getItemFromStore( 'phoenixIsNavbarVerticalCollapsed', false ); if (activeNavLinkItem && !isNavbarVerticalCollapsed) { activeNavLinkItem.scrollIntoView({ behavior: 'smooth' }); } } const setDocumentMinHeight = () => { const bodyHeight = document.querySelector(Selector.BODY).offsetHeight; const navbarVerticalHeight = document.querySelector( Selector.NAVBAR_VERTICAL )?.offsetHeight; if ( document.documentElement.classList.contains( ClassNames.NAVBAR_VERTICAL_COLLAPSED ) && bodyHeight < navbarVerticalHeight ) { document.documentElement.style.minHeight = `${navbarVerticalHeight}px`; } else { document.documentElement.removeAttribute('style'); } }; // set document min height for collapse vertical nav setDocumentMinHeight(); resize(() => { setDocumentMinHeight(); }); if (navbarVerticalToggle) { navbarVerticalToggle.addEventListener('navbar.vertical.toggle', () => { setDocumentMinHeight(); }); } }; /* eslint-disable no-new */ /*----------------------------------------------- | Phoenix Offcanvas -----------------------------------------------*/ const phoenixOffcanvasInit = () => { const { getData } = window.phoenix.utils; const toggleEls = document.querySelectorAll( "[data-phoenix-toggle='offcanvas']" ); const offcanvasBackdrops = document.querySelectorAll( '[data-phoenix-backdrop]' ); const offcanvasBodyScroll = document.querySelector('[data-phoenix-scroll]'); const offcanvases = document.querySelectorAll('.phoenix-offcanvas'); const offcanvasFaq = document.querySelector('.faq'); const offcanvasFaqShow = document.querySelector('.faq-sidebar'); if (offcanvases) { const breakpoints = { sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1540 }; window.addEventListener('resize', () => { offcanvases.forEach(offcanvas => { const offcanvasInstance = new window.bootstrap.Offcanvas(offcanvas); const breakpoint = offcanvas.getAttribute('data-breakpoint'); const breakpointValue = breakpoints[breakpoint]; if (window.innerWidth >= breakpointValue) { document.body.style.overflow = ''; offcanvasInstance.hide(); } }); }); } const showFilterCol = offcanvasEl => { offcanvasEl.classList.add('show'); if (!offcanvasBodyScroll) { document.body.style.overflow = 'hidden'; } }; const hideFilterCol = offcanvasEl => { offcanvasEl.classList.remove('show'); document.body.style.removeProperty('overflow'); }; if (toggleEls) { toggleEls.forEach(toggleEl => { const offcanvasTarget = getData(toggleEl, 'phoenix-target'); const offcanvasTargetEl = document.querySelector(offcanvasTarget); const closeBtn = offcanvasTargetEl.querySelectorAll( "[data-phoenix-dismiss='offcanvas']" ); toggleEl.addEventListener('click', () => { showFilterCol(offcanvasTargetEl); }); if (closeBtn) { closeBtn.forEach(el => { el.addEventListener('click', () => { hideFilterCol(offcanvasTargetEl); }); }); } if (offcanvasBackdrops) { offcanvasBackdrops.forEach(offcanvasBackdrop => { offcanvasBackdrop.addEventListener('click', () => { hideFilterCol(offcanvasTargetEl); }); }); } }); } if (offcanvasFaq) { if (offcanvasFaqShow.classList.contains('show')) { offcanvasFaq.classList.add = 'newFaq'; } } }; /* -------------------------------------------------------------------------- */ /* Popover */ /* -------------------------------------------------------------------------- */ const picmoInit = () => { const { getData } = window.phoenix.utils; const picmoBtns = document.querySelectorAll('[data-picmo]'); if (picmoBtns) { Array.from(picmoBtns).forEach(btn => { const options = getData(btn, 'picmo'); const picker = window.picmoPopup.createPopup( {}, { referenceElement: btn, triggerElement: btn, position: 'bottom-start', showCloseButton: false } ); btn.addEventListener('click', () => { picker.toggle(); }); const input = document.querySelector(options.inputTarget); picker.addEventListener('emoji:select', selection => { if (input) { input.innerHTML += selection.emoji; } }); }); } }; /* -------------------------------------------------------------------------- */ /* Popover */ /* -------------------------------------------------------------------------- */ const popoverInit = () => { const popoverTriggerList = Array.from( document.querySelectorAll('[data-bs-toggle="popover"]') ); popoverTriggerList.map(popoverTriggerEl => { return new bootstrap.Popover(popoverTriggerEl); }); }; /* eslint-disable no-new */ /*----------------------------------------------- | Swiper -----------------------------------------------*/ const getThubmnailDirection = () => { if ( window.innerWidth < 768 || (window.innerWidth >= 992 && window.innerWidth < 1200) ) { return 'horizontal'; } return 'vertical'; }; const productDetailsInit = () => { const { getData, resize } = window.phoenix.utils; const productDetailsEl = document.querySelector('[data-product-details]'); if (productDetailsEl) { const colorVariantEl = productDetailsEl.querySelector( '[data-product-color]' ); productDetailsEl.querySelector( '[data-product-quantity]' ); const productQuantityInputEl = productDetailsEl.querySelector( '[data-quantity] input[type="number"]' ); const productColorVariantConatiner = productDetailsEl.querySelector( '[data-product-color-variants]' ); const swiperInit = productImages => { const productSwiper = productDetailsEl.querySelector( '[data-products-swiper]' ); const options = getData(productSwiper, 'swiper'); const thumbTarget = getData(productSwiper, 'thumb-target'); const thumbEl = document.getElementById(thumbTarget); let slides = ''; productImages.forEach(img => { slides += `
    `; }); productSwiper.innerHTML = `
    ${slides}
    `; let thumbSlides = ''; productImages.forEach(img => { thumbSlides += `
    `; }); thumbEl.innerHTML = `
    ${thumbSlides}
    `; const thumbSwiper = new window.Swiper(thumbEl, { slidesPerView: 5, spaceBetween: 16, direction: getThubmnailDirection(), breakpoints: { 768: { spaceBetween: 100 }, 992: { spaceBetween: 16 } } }); const swiperNav = productSwiper.querySelector('.swiper-nav'); resize(() => { thumbSwiper.changeDirection(getThubmnailDirection()); }); new Swiper(productSwiper, { ...options, navigation: { nextEl: swiperNav?.querySelector('.swiper-button-next'), prevEl: swiperNav?.querySelector('.swiper-button-prev') }, thumbs: { swiper: thumbSwiper } }); }; const colorVariants = productColorVariantConatiner.querySelectorAll('[data-variant]'); colorVariants.forEach(variant => { if (variant.classList.contains('active')) { swiperInit(getData(variant, 'products-images')); colorVariantEl.innerHTML = getData(variant, 'variant'); } const productImages = getData(variant, 'products-images'); variant.addEventListener('click', () => { swiperInit(productImages); colorVariants.forEach(colorVariant => { colorVariant.classList.remove('active'); }); variant.classList.add('active'); colorVariantEl.innerHTML = getData(variant, 'variant'); }); }); productQuantityInputEl.addEventListener('change', e => { if (e.target.value == '') { e.target.value = 0; } }); } }; /*----------------------------------------------- | Quantity -----------------------------------------------*/ const quantityInit = () => { const { getData } = window.phoenix.utils; const Selector = { DATA_QUANTITY_BTN: '[data-quantity] [data-type]', DATA_QUANTITY: '[data-quantity]', DATA_QUANTITY_INPUT: '[data-quantity] input[type="number"]' }; const Events = { CLICK: 'click' }; const Attributes = { MIN: 'min' }; const DataKey = { TYPE: 'type' }; const quantities = document.querySelectorAll(Selector.DATA_QUANTITY_BTN); quantities.forEach(quantity => { quantity.addEventListener(Events.CLICK, e => { const el = e.currentTarget; const type = getData(el, DataKey.TYPE); const numberInput = el .closest(Selector.DATA_QUANTITY) .querySelector(Selector.DATA_QUANTITY_INPUT); const min = numberInput.getAttribute(Attributes.MIN); let value = parseInt(numberInput.value, 10); if (type === 'plus') { value += 1; } else { value = value > min ? (value -= 1) : value; } numberInput.value = value; }); }); }; /* -------------------------------------------------------------------------- */ /* Ratings */ /* -------------------------------------------------------------------------- */ const randomColorInit = () => { const { getData } = window.phoenix.utils; const randomColorElements = document.querySelectorAll('[data-random-color]'); const defaultColors = [ '#85A9FF', '#60C6FF', '#90D67F', '#F48270', '#3874FF', '#0097EB', '#25B003', '#EC1F00', '#E5780B', '#004DFF', '#0080C7', '#23890B', '#CC1B00', '#D6700A', '#222834', '#3E465B', '#6E7891', '#9FA6BC' ]; randomColorElements.forEach(el => { const userColors = getData(el, 'random-color'); let colors; if (Array.isArray(userColors)) { colors = [...defaultColors, ...userColors]; } else { colors = [...defaultColors]; } el.addEventListener('click', e => { const randomColor = colors[Math.floor(Math.random() * (colors.length - 1))]; e.target.value = randomColor; const inputLabel = e.target.nextElementSibling; // e.target.nextElementSibling.style.boxShadow = `0 0 0 0.2rem ${randomColor}`; inputLabel.style.background = `${randomColor}`; inputLabel.style.borderColor = `${randomColor}`; inputLabel.style.color = `white`; }); }); }; /* -------------------------------------------------------------------------- */ /* Ratings */ /* -------------------------------------------------------------------------- */ const ratingInit = () => { const { getData, getItemFromStore } = window.phoenix.utils; const raters = document.querySelectorAll('[data-rater]'); raters.forEach(rater => { const options = { reverse: getItemFromStore('phoenixIsRTL'), starSize: 32, step: 0.5, element: rater, rateCallback(rating, done) { this.setRating(rating); done(); }, ...getData(rater, 'rater') }; return window.raterJs(options); }); }; /*eslint-disable*/ /*----------------------------------------------- | Top navigation opacity on scroll -----------------------------------------------*/ const responsiveNavItemsInit = () => { const { resize } = window.phoenix.utils; const Selector = { NAV_ITEM: '[data-nav-item]', NAVBAR: '[data-navbar]', DROPDOWN: '[data-more-item]', CATEGORY_LIST: '[data-category-list]', CATEGORY_BUTTON: '[data-category-btn]' }; const navbarEl = document.querySelector(Selector.NAVBAR); const navbar = () => { const navbarWidth = navbarEl.clientWidth; const dropdown = navbarEl.querySelector(Selector.DROPDOWN); const dropdownWidth = dropdown.clientWidth; const navbarContainerWidth = navbarWidth - dropdownWidth; const elements = navbarEl.querySelectorAll(Selector.NAV_ITEM); const categoryBtn = navbarEl.querySelector(Selector.CATEGORY_BUTTON); const categoryBtnWidth = categoryBtn?.clientWidth; let totalItemsWidth = 0; dropdown.style.display = 'none'; elements.forEach(item => { const itemWidth = item.clientWidth; totalItemsWidth = totalItemsWidth + itemWidth; if ( totalItemsWidth + (categoryBtnWidth || 0) + dropdownWidth > navbarContainerWidth && !item.classList.contains('dropdown') ) { dropdown.style.display = 'block'; item.style.display = 'none'; const link = item.firstChild; const linkItem = link.cloneNode(true); navbarEl.querySelector('.category-list').appendChild(linkItem); } }); const dropdownMenu = navbarEl.querySelectorAll('.dropdown-menu .nav-link'); dropdownMenu.forEach(item => { item.classList.remove('nav-link'); item.classList.add('dropdown-item'); }); }; if (navbarEl) { window.addEventListener('load', () => { navbar(); // hideDropdown(); }); resize(() => { const navElements = navbarEl.querySelectorAll(Selector.NAV_ITEM); const dropElements = navbarEl.querySelectorAll(Selector.CATEGORY_LIST); navElements.forEach(item => item.removeAttribute('style')); dropElements.forEach(item => (item.innerHTML = '')); navbar(); // hideDropdown(); }); const navbarLinks = navbarEl.querySelectorAll('.nav-link'); navbarEl.addEventListener('click', function (e) { for (let x = 0; x < navbarLinks.length; x++) { navbarLinks[x].classList.remove('active'); } if (e.target.closest('li')) { e.target.closest('li').classList.add('active'); } }); } }; const searchInit = () => { const Selectors = { SEARCH_DISMISS: '[data-bs-dismiss="search"]', DROPDOWN_TOGGLE: '[data-bs-toggle="dropdown"]', DROPDOWN_MENU: '.dropdown-menu', SEARCH_BOX: '.search-box', SEARCH_INPUT: '.search-input', SEARCH_TOGGLE: '[data-bs-toggle="search"]' }; const ClassName = { SHOW: 'show' }; const Attribute = { ARIA_EXPANDED: 'aria-expanded' }; const Events = { CLICK: 'click', FOCUS: 'focus', SHOW_BS_DROPDOWN: 'show.bs.dropdown', SEARCH_CLOSE: 'search.close' }; const hideSearchSuggestion = searchArea => { const el = searchArea.querySelector(Selectors.SEARCH_TOGGLE); const dropdownMenu = searchArea.querySelector(Selectors.DROPDOWN_MENU); if (!el || !dropdownMenu) return; el.setAttribute(Attribute.ARIA_EXPANDED, 'false'); el.classList.remove(ClassName.SHOW); dropdownMenu.classList.remove(ClassName.SHOW); }; const searchAreas = document.querySelectorAll(Selectors.SEARCH_BOX); const hideAllSearchAreas = () => { searchAreas.forEach(hideSearchSuggestion); }; searchAreas.forEach(searchArea => { const input = searchArea.querySelector(Selectors.SEARCH_INPUT); const btnDropdownClose = searchArea.querySelector(Selectors.SEARCH_DISMISS); const dropdownMenu = searchArea.querySelector(Selectors.DROPDOWN_MENU); if (input) { input.addEventListener(Events.FOCUS, () => { hideAllSearchAreas(); const el = searchArea.querySelector(Selectors.SEARCH_TOGGLE); if (!el || !dropdownMenu) return; el.setAttribute(Attribute.ARIA_EXPANDED, 'true'); el.classList.add(ClassName.SHOW); dropdownMenu.classList.add(ClassName.SHOW); }); } document.addEventListener(Events.CLICK, ({ target }) => { !searchArea.contains(target) && hideSearchSuggestion(searchArea); }); btnDropdownClose && btnDropdownClose.addEventListener(Events.CLICK, e => { hideSearchSuggestion(searchArea); input.value = ''; const event = new CustomEvent(Events.SEARCH_CLOSE); e.currentTarget.dispatchEvent(event); }); }); document.querySelectorAll(Selectors.DROPDOWN_TOGGLE).forEach(dropdown => { dropdown.addEventListener(Events.SHOW_BS_DROPDOWN, () => { hideAllSearchAreas(); }); }); }; /* -------------------------------------------------------------------------- */ /* Toast */ /* -------------------------------------------------------------------------- */ const simplebarInit = () => { const scrollEl = Array.from(document.querySelectorAll('.scrollbar-overlay')); scrollEl.forEach(el => { return new window.SimpleBar(el); }); }; /* -------------------------------------------------------------------------- */ /* SortableJS */ /* -------------------------------------------------------------------------- */ const sortableInit = () => { const { getData } = window.phoenix.utils; const sortableEl = document.querySelectorAll('[data-sortable]'); const defaultOptions = { animation: 150, group: { name: 'shared' }, delay: 100, delayOnTouchOnly: true, // useful for mobile touch forceFallback: true, // * ignore the HTML5 DnD behaviour onStart() { document.body.classList.add('sortable-dragging'); // to add cursor grabbing }, onEnd() { document.body.classList.remove('sortable-dragging'); } }; sortableEl.forEach(el => { const userOptions = getData(el, 'sortable'); const options = window._.merge(defaultOptions, userOptions); return window.Sortable.create(el, options); }); }; const supportChatInit = () => { const supportChat = document.querySelector('.support-chat'); const supportChatBtn = document.querySelectorAll('.btn-support-chat'); const supportChatcontainer = document.querySelector( '.support-chat-container' ); const { phoenixSupportChat } = window.config.config; if (phoenixSupportChat) { supportChatcontainer?.classList.add('show'); } if (supportChatBtn) { supportChatBtn.forEach(item => { item.addEventListener('click', () => { supportChat.classList.toggle('show-chat'); supportChatBtn[supportChatBtn.length - 1].classList.toggle( 'btn-chat-close' ); supportChatcontainer.classList.add('show'); }); }); } }; /* eslint-disable no-new */ /*----------------------------------------------- | Swiper -----------------------------------------------*/ const swiperInit = () => { const { getData } = window.phoenix.utils; const swiperContainers = document.querySelectorAll('.swiper-theme-container'); if (swiperContainers) { swiperContainers.forEach(swiperContainer => { const swiper = swiperContainer.querySelector('[data-swiper]'); const options = getData(swiper, 'swiper'); const thumbsOptions = options.thumb; let thumbsInit; if (thumbsOptions) { const thumbImages = swiper.querySelectorAll('img'); let slides = ''; thumbImages.forEach(img => { slides += `
    `; }); const thumbs = document.createElement('div'); thumbs.setAttribute('class', 'swiper thumb'); thumbs.innerHTML = `
    ${slides}
    `; if (thumbsOptions.parent) { const parent = document.querySelector(thumbsOptions.parent); parent.parentNode.appendChild(thumbs); } else { swiper.parentNode.appendChild(thumbs); } thumbsInit = new window.Swiper(thumbs, thumbsOptions); } const swiperNav = swiperContainer.querySelector('.swiper-nav'); new window.Swiper(swiper, { ...options, navigation: { nextEl: swiperNav?.querySelector('.swiper-button-next'), prevEl: swiperNav?.querySelector('.swiper-button-prev') }, thumbs: { swiper: thumbsInit } }); const gallerySlider = document.querySelector('.swiper-slider-gallery'); if (gallerySlider) { window.addEventListener('resize', () => { thumbsInit.update(); }); } }); } }; /* -------------------------------------------------------------------------- */ /* Theme Control */ /* -------------------------------------------------------------------------- */ /* eslint-disable no-param-reassign */ /* eslint-disable */ const { config } = window.config; const initialDomSetup = element => { const { getData, getItemFromStore, getSystemTheme } = window.phoenix.utils; if (!element) return; element.querySelectorAll('[data-theme-control]').forEach(el => { const inputDataAttributeValue = getData(el, 'theme-control'); const localStorageValue = getItemFromStore(inputDataAttributeValue); // diable horizontal navbar shape for dual nav if ( inputDataAttributeValue === 'phoenixNavbarTopShape' && getItemFromStore('phoenixNavbarPosition') === 'dual-nav' ) { el.setAttribute('disabled', true); } // diable navbar vertical style for horizontal & dual navbar const currentNavbarPosition = getItemFromStore('phoenixNavbarPosition'); const isHorizontalOrDualNav = currentNavbarPosition === 'horizontal' || currentNavbarPosition === 'dual-nav'; if ( inputDataAttributeValue === 'phoenixNavbarVerticalStyle' && isHorizontalOrDualNav ) { el.setAttribute('disabled', true); } if (el.type === 'checkbox') { if (inputDataAttributeValue === 'phoenixTheme') { if ( localStorageValue === 'auto' ? getSystemTheme() === 'dark' : localStorageValue === 'dark' ) { el.setAttribute('checked', true); } } else { localStorageValue && el.setAttribute('checked', true); } } else if ( el.type === 'radio' && inputDataAttributeValue === 'phoenixNavbarVerticalStyle' ) { localStorageValue === 'darker' && el.value === 'darker' && el.setAttribute('checked', true); localStorageValue === 'default' && el.value === 'default' && el.setAttribute('checked', true); } else if ( el.type === 'radio' && inputDataAttributeValue === 'phoenixNavbarTopShape' ) { localStorageValue === 'slim' && el.value === 'slim' && el.setAttribute('checked', true); localStorageValue === 'default' && el.value === 'default' && el.setAttribute('checked', true); } else if ( el.type === 'radio' && inputDataAttributeValue === 'phoenixNavbarTopStyle' ) { localStorageValue === 'darker' && el.value === 'darker' && el.setAttribute('checked', true); localStorageValue === 'default' && el.value === 'default' && el.setAttribute('checked', true); } else if ( el.type === 'radio' && inputDataAttributeValue === 'phoenixTheme' ) { const isChecked = localStorageValue === el.value; isChecked && el.setAttribute('checked', true); } else if ( el.type === 'radio' && inputDataAttributeValue === 'phoenixNavbarPosition' ) { const isChecked = localStorageValue === el.value; isChecked && el.setAttribute('checked', true); } else { const isActive = localStorageValue === el.value; isActive && el.classList.add('active'); } }); }; const changeTheme = element => { const { getData, getItemFromStore, getSystemTheme } = window.phoenix.utils; element .querySelectorAll('[data-theme-control = "phoenixTheme"]') .forEach(el => { const inputDataAttributeValue = getData(el, 'theme-control'); const localStorageValue = getItemFromStore(inputDataAttributeValue); if (el.type === 'checkbox') { if (localStorageValue === 'auto') { getSystemTheme() === 'dark' ? (el.checked = true) : (el.checked = false); } else { localStorageValue === 'dark' ? (el.checked = true) : (el.checked = false); } } else if (el.type === 'radio') { localStorageValue === el.value ? (el.checked = true) : (el.checked = false); } else { localStorageValue === el.value ? el.classList.add('active') : el.classList.remove('active'); } }); }; const handleThemeDropdownIcon = value => { document.querySelectorAll('[data-theme-dropdown-toggle-icon]').forEach(el => { el.classList.toggle( 'd-none', value !== el.getAttribute('data-theme-dropdown-toggle-icon') // value !== getData(el, 'theme-dropdown-toggle-icon') ); }); }; handleThemeDropdownIcon(localStorage.getItem('phoenixTheme')); const themeControl = () => { const { getData, getItemFromStore, getSystemTheme } = window.phoenix.utils; // handleThemeDropdownIcon( // window.phoenix.utils.getItemFromStore('phoenixTheme'), // getData // ); const handlePageUrl = el => { const pageUrl = getData(el, 'page-url'); if (pageUrl) { window.location.replace(pageUrl); } else { window.location.reload(); } }; const themeController = new DomNode(document.body); const navbarVertical = document.querySelector('.navbar-vertical'); const navbarTop = document.querySelector('.navbar-top'); const supportChat = document.querySelector('.support-chat-container'); initialDomSetup(themeController.node); themeController.on('click', e => { const target = new DomNode(e.target); if (target.data('theme-control')) { const control = target.data('theme-control'); let value = e.target[e.target.type === 'checkbox' ? 'checked' : 'value']; if (control === 'phoenixTheme') { typeof value === 'boolean' && (value = value ? 'dark' : 'light'); } // config.hasOwnProperty(control) && setItemToStore(control, value); config.hasOwnProperty(control) && window.config.set({ [control]: value }); switch (control) { case 'phoenixTheme': { document.documentElement.setAttribute( 'data-bs-theme', value === 'auto' ? getSystemTheme() : value ); // document.documentElement.classList[ // value === 'dark' ? 'add' : 'remove' // ]('dark'); const clickControl = new CustomEvent('clickControl', { detail: { control, value } }); e.currentTarget.dispatchEvent(clickControl); changeTheme(themeController.node); break; } case 'phoenixNavbarVerticalStyle': { navbarVertical.setAttribute('data-navbar-appearance', 'default'); if (value !== 'default') { navbarVertical.setAttribute('data-navbar-appearance', 'darker'); } break; } case 'phoenixNavbarTopStyle': { navbarTop.setAttribute('data-navbar-appearance', 'default'); if (value !== 'default') { navbarTop.setAttribute('data-navbar-appearance', 'darker'); } break; } case 'phoenixNavbarTopShape': { if (getItemFromStore('phoenixNavbarPosition') === 'dual-nav') { el.setAttribute('disabled', true); // document.documentElement.setAttribute("data-bs-theme", value); } else handlePageUrl(target.node); } break; case 'phoenixNavbarPosition': { handlePageUrl(target.node); } break; case 'phoenixIsRTL': { // localStorage.setItem('phoenixIsRTL', target.node.checked); window.config.set({ phoenixIsRTL: target.node.checked }); window.location.reload(); } break; case 'phoenixSupportChat': { supportChat?.classList.remove('show'); if (value) { supportChat?.classList.add('show'); } break; } case 'reset': { window.config.reset(); window.location.reload(); break; } default: { window.location.reload(); } } } }); themeController.on('clickControl', ({ detail: { control, value } }) => { if (control === 'phoenixTheme') { handleThemeDropdownIcon(value); } }); }; const { merge } = window._; /* -------------------------------------------------------------------------- */ /* Tinymce */ /* -------------------------------------------------------------------------- */ const tinymceInit = () => { const { getColor, getData, getItemFromStore } = window.phoenix.utils; const tinymces = document.querySelectorAll('[data-tinymce]'); if (window.tinymce) { // const wrapper = document.querySelector('.tox-sidebar-wrap'); tinymces.forEach(tinymceEl => { const userOptions = getData(tinymceEl, 'tinymce'); const options = merge( { selector: '.tinymce', height: '50vh', skin: 'oxide', menubar: false, content_style: ` .mce-content-body { color: ${getColor('emphasis-color')}; background-color: ${getColor('tinymce-bg')}; } .mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { color: ${getColor('quaternary-color')}; font-weight: 400; font-size: 12.8px; } `, // mobile: { // theme: 'mobile', // toolbar: ['undo', 'bold'] // }, statusbar: false, plugins: 'link,image,lists,table,media', theme_advanced_toolbar_align: 'center', directionality: getItemFromStore('phoenixIsRTL') ? 'rtl' : 'ltr', toolbar: [ { name: 'history', items: ['undo', 'redo'] }, { name: 'formatting', items: ['bold', 'italic', 'underline', 'strikethrough'] }, { name: 'alignment', items: ['alignleft', 'aligncenter', 'alignright', 'alignjustify'] }, { name: 'list', items: ['numlist', 'bullist'] }, { name: 'link', items: ['link'] } ], setup: editor => { editor.on('focus', () => { const wraper = document.querySelector('.tox-sidebar-wrap'); wraper.classList.add('editor-focused'); }); editor.on('blur', () => { const wraper = document.querySelector('.tox-sidebar-wrap'); wraper.classList.remove('editor-focused'); }); } }, userOptions ); window.tinymce.init(options); }); const themeController = document.body; if (themeController) { themeController.addEventListener( 'clickControl', ({ detail: { control } }) => { if (control === 'phoenixTheme') { tinymces.forEach(tinymceEl => { const instance = window.tinymce.get(tinymceEl.id); instance.dom.addStyle( `.mce-content-body{ color: ${getColor('emphasis-color')} !important; background-color: ${getColor('tinymce-bg')} !important; }` ); }); } } ); } } }; /* -------------------------------------------------------------------------- */ /* Toast */ /* -------------------------------------------------------------------------- */ const toastInit = () => { const toastElList = [].slice.call(document.querySelectorAll('.toast')); toastElList.map(toastEl => new bootstrap.Toast(toastEl)); const liveToastBtn = document.getElementById('liveToastBtn'); if (liveToastBtn) { const liveToast = new bootstrap.Toast(document.getElementById('liveToast')); liveToastBtn.addEventListener('click', () => { liveToast && liveToast.show(); }); } }; /* -------------------------------------------------------------------------- */ /* TODO Offacanvas */ /* -------------------------------------------------------------------------- */ const todoOffcanvasInit = () => { const { getData } = window.phoenix.utils; const stopPropagationElements = document.querySelectorAll( '[data-event-propagation-prevent]' ); if (stopPropagationElements) { stopPropagationElements.forEach(el => { el.addEventListener('click', e => { e.stopPropagation(); }); }); } const todoList = document.querySelector('.todo-list'); if (todoList) { const offcanvasToggles = todoList.querySelectorAll( '[data-todo-offcanvas-toogle]' ); offcanvasToggles.forEach(toggle => { const target = getData(toggle, 'todo-offcanvas-target'); const offcanvasEl = todoList.querySelector(`#${target}`); const todoOffcanvas = new window.bootstrap.Offcanvas(offcanvasEl, { backdrop: true }); toggle.addEventListener('click', () => { todoOffcanvas.show(); }); }); } }; /* -------------------------------------------------------------------------- */ /* Tooltip */ /* -------------------------------------------------------------------------- */ const tooltipInit = () => { const tooltipTriggerList = [].slice.call( document.querySelectorAll('[data-bs-toggle="tooltip"]') ); tooltipTriggerList.map( tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl, { trigger: 'hover' }) ); }; /* eslint-disable no-restricted-syntax */ /* -------------------------------------------------------------------------- */ /* step wizard */ /* -------------------------------------------------------------------------- */ const wizardInit = () => { const { getData } = window.phoenix.utils; const selectors = { WIZARDS: '[data-theme-wizard]', TOGGLE_BUTTON_EL: '[data-wizard-step]', FORMS: '[data-wizard-form]', PASSWORD_INPUT: '[data-wizard-password]', CONFIRM_PASSWORD_INPUT: '[data-wizard-confirm-password]', NEXT_BTN: '[data-wizard-next-btn]', PREV_BTN: '[data-wizard-prev-btn]', FOOTER: '[data-wizard-footer]' }; const events = { SUBMIT: 'submit', SHOW: 'show.bs.tab', SHOWN: 'shown.bs.tab', CLICK: 'click' }; const wizards = document.querySelectorAll(selectors.WIZARDS); wizards.forEach(wizard => { const tabToggleButtonEl = wizard.querySelectorAll( selectors.TOGGLE_BUTTON_EL ); const forms = wizard.querySelectorAll(selectors.FORMS); const passwordInput = wizard.querySelector(selectors.PASSWORD_INPUT); const confirmPasswordInput = wizard.querySelector( selectors.CONFIRM_PASSWORD_INPUT ); const nextButton = wizard.querySelector(selectors.NEXT_BTN); const prevButton = wizard.querySelector(selectors.PREV_BTN); const wizardFooter = wizard.querySelector(selectors.FOOTER); const submitEvent = new Event(events.SUBMIT, { bubbles: true, cancelable: true }); const hasWizardModal = wizard.hasAttribute('data-wizard-modal-disabled'); const tabs = Array.from(tabToggleButtonEl).map(item => { return window.bootstrap.Tab.getOrCreateInstance(item); }); // console.log({ tabs }); let count = 0; let showEvent = null; forms.forEach(form => { form.addEventListener(events.SUBMIT, e => { e.preventDefault(); if (form.classList.contains('needs-validation')) { if (passwordInput && confirmPasswordInput) { if (passwordInput.value !== confirmPasswordInput.value) { confirmPasswordInput.setCustomValidity('Invalid field.'); } else { confirmPasswordInput.setCustomValidity(''); } } if (!form.checkValidity()) { showEvent.preventDefault(); return false; } } count += 1; return null; }); }); nextButton.addEventListener(events.CLICK, () => { if (count + 1 < tabs.length) { tabs[count + 1].show(); } }); if (prevButton) { prevButton.addEventListener(events.CLICK, () => { count -= 1; tabs[count].show(); }); } if (tabToggleButtonEl.length) { tabToggleButtonEl.forEach((item, index) => { item.addEventListener(events.SHOW, e => { const step = getData(item, 'wizard-step'); showEvent = e; if (step > count) { forms[count].dispatchEvent(submitEvent); } }); item.addEventListener(events.SHOWN, () => { count = index; // can't go back tab if (count === tabToggleButtonEl.length - 1 && !hasWizardModal) { tabToggleButtonEl.forEach(tab => { tab.setAttribute('data-bs-toggle', 'modal'); tab.setAttribute('data-bs-target', '#error-modal'); }); } // add done class for (let i = 0; i < count; i += 1) { tabToggleButtonEl[i].classList.add('done'); if (i > 0) { tabToggleButtonEl[i - 1].classList.add('complete'); } } // remove done class for (let j = count; j < tabToggleButtonEl.length; j += 1) { tabToggleButtonEl[j].classList.remove('done'); if (j > 0) { tabToggleButtonEl[j - 1].classList.remove('complete'); } } // card footer remove at last step if (count > tabToggleButtonEl.length - 2) { wizardFooter.classList.add('d-none'); } else { wizardFooter.classList.remove('d-none'); } // prev-button removing if (prevButton) { if (count > 0 && count !== tabToggleButtonEl.length - 1) { prevButton.classList.remove('d-none'); } else { prevButton.classList.add('d-none'); } } }); }); } }); }; const faqTabInit = () => { const triggerEls = document.querySelectorAll('[data-vertical-category-tab]'); const offcanvasEle = document.querySelector( '[data-vertical-category-offcanvas]' ); const filterEles = document.querySelectorAll('[data-category-filter]'); const faqSubcategoryTabs = document.querySelectorAll( '.faq-subcategory-tab .nav-item' ); if (offcanvasEle) { const offcanvas = window.bootstrap.Offcanvas?.getOrCreateInstance(offcanvasEle); triggerEls.forEach(el => { el.addEventListener('click', () => { offcanvas.hide(); }); }); } if (filterEles) { filterEles.forEach(el => { if (el.classList.contains('active')) { faqSubcategoryTabs.forEach(item => { if ( !item.classList.contains(el.getAttribute('data-category-filter')) && el.getAttribute('data-category-filter') !== 'all' ) { item.classList.add('d-none'); } }); } el.addEventListener('click', () => { faqSubcategoryTabs.forEach(item => { if (el.getAttribute('data-category-filter') === 'all') { item.classList.remove('d-none'); } else if ( !item.classList.contains(el.getAttribute('data-category-filter')) ) { item.classList.add('d-none'); } }); }); }); } }; /* -------------------------------------------------------------------------- */ /* Kanban */ /* -------------------------------------------------------------------------- */ const kanbanInit = () => { // kanbanContainer to controll collapse behavior in kanban board const kanbanContainer = document.querySelector('[data-kanban-container]'); if (kanbanContainer) { kanbanContainer.addEventListener('click', e => { if (e.target.hasAttribute('data-kanban-collapse')) { e.target.closest('.kanban-column').classList.toggle('collapsed'); } }); const kanbanGroups = kanbanContainer.querySelectorAll('[data-sortable]'); kanbanGroups.forEach(item => { const itemInstance = window.Sortable.get(item); itemInstance.option('onStart', e => { document.body.classList.add('sortable-dragging'); window.Sortable.ghost .querySelector('.dropdown-menu') ?.classList.remove('show'); const dropdownElement = e.item.querySelector( `[data-bs-toggle='dropdown']` ); window.bootstrap.Dropdown.getInstance(dropdownElement)?.hide(); }); // return itemInstance; }); } }; const towFAVerificarionInit = () => { const verificationForm = document.querySelector('[data-2fa-form]'); const inputFields = verificationForm?.querySelectorAll('input[type=number]'); const varificationBtn = verificationForm?.querySelector( 'button[type=submit]' ); if (verificationForm) { window.addEventListener('load', () => inputFields[0].focus()); const totalInputLength = 6; inputFields.forEach((input, index) => { input.addEventListener('keyup', e => { const { value } = e.target; if (value) { [...value].slice(0, totalInputLength).forEach((char, charIndex) => { if (inputFields && inputFields[index + charIndex]) { inputFields[index + charIndex].value = char; inputFields[index + charIndex + 1]?.focus(); } }); } else { inputFields[index].value = ''; inputFields[index - 1]?.focus(); } const inputs = [...inputFields]; const updatedOtp = inputs.reduce( (acc, inputData) => acc + (inputData?.value || ''), '' ); if (totalInputLength === updatedOtp.length) { varificationBtn.removeAttribute('disabled'); } else { varificationBtn.setAttribute('disabled', true); } }); }); } }; /* -------------------------------------------------------------------------- */ /* mapbox */ /* -------------------------------------------------------------------------- */ const mapboxInit = () => { const { getData } = window.phoenix.utils; const mapboxContainers = document.querySelectorAll('.mapbox-container'); const mapContainerTab = document.querySelectorAll('[data-tab-map-container]'); if (mapboxContainers) { mapboxContainers.forEach(mapboxContainer => { window.mapboxgl.accessToken = 'pk.eyJ1IjoidGhlbWV3YWdvbiIsImEiOiJjbGhmNW5ybzkxcmoxM2RvN2RmbW1nZW90In0.hGIvQ890TYkZ948MVrsMIQ'; const mapbox = mapboxContainer.querySelector('[data-mapbox]'); if (mapbox) { const options = getData(mapbox, 'mapbox'); const zoomIn = document.querySelector('.zoomIn'); const zoomOut = document.querySelector('.zoomOut'); const fullScreen = document.querySelector('.fullScreen'); const styles = { default: 'mapbox://styles/mapbox/light-v11', light: 'mapbox://styles/themewagon/clj57pads001701qo25756jtw', dark: 'mapbox://styles/themewagon/cljzg9juf007x01pk1bepfgew' }; const map = new window.mapboxgl.Map({ ...options, container: 'mapbox', style: styles[window.config.config.phoenixTheme] }); if (options.center) { new window.mapboxgl.Marker({ color: getColor('danger') }) .setLngLat(options.center) .addTo(map); } if (zoomIn && zoomOut) { zoomIn.addEventListener('click', () => map.zoomIn()); zoomOut.addEventListener('click', () => map.zoomOut()); } if (fullScreen) { fullScreen.addEventListener('click', () => map.getContainer().requestFullscreen() ); } mapContainerTab.forEach(ele => { ele.addEventListener('shown.bs.tab', () => { map.resize(); }); }); } }); } }; const themeController$2 = document.body; if (themeController$2) { themeController$2.addEventListener('clickControl', () => { mapboxInit(); }); } const flightMapInit = () => { const flightMap = document.querySelector('#flightMap'); if (flightMap) { window.mapboxgl.accessToken = 'pk.eyJ1IjoidGhlbWV3YWdvbiIsImEiOiJjbGhmNW5ybzkxcmoxM2RvN2RmbW1nZW90In0.hGIvQ890TYkZ948MVrsMIQ'; const zoomIn = document.querySelector('.zoomIn'); const zoomOut = document.querySelector('.zoomOut'); const fullScreen = document.querySelector('.fullScreen'); const styles = { default: 'mapbox://styles/mapbox/light-v11', light: 'mapbox://styles/themewagon/clj57pads001701qo25756jtw', dark: 'mapbox://styles/themewagon/cljzg9juf007x01pk1bepfgew' }; const map = new window.mapboxgl.Map({ container: 'flightMap', style: styles[window.config.config.phoenixTheme], center: [-73.102712, 7.102257], zoom: 5, pitch: 40, attributionControl: false }); zoomIn.addEventListener('click', () => map.zoomIn()); zoomOut.addEventListener('click', () => map.zoomOut()); fullScreen.addEventListener('click', () => map.getContainer().requestFullscreen() ); const origin = [-61.100583, 5.044713]; const currentPosition = [-74.2139449434892, 8.136553550752552]; const destination = [-84.913785, 10.325774]; const originToCurrentRoute = { type: 'FeatureCollection', features: [ { type: 'Feature', geometry: { type: 'LineString', coordinates: [origin, currentPosition] } } ] }; const currentToDestinationRoute = { type: 'FeatureCollection', features: [ { type: 'Feature', geometry: { type: 'LineString', coordinates: [currentPosition, destination] } } ] }; const points = { type: 'FeatureCollection', features: [ { type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: origin } }, { type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: currentPosition } }, { type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: destination } } ] }; let count = 1; points.features.forEach(feature => { const el = document.createElement('div'); el.className = `marker-${count}`; new window.mapboxgl.Marker(el) .setLngLat(feature.geometry.coordinates) .addTo(map); count += 1; }); const lineDistance = window.turf.length(originToCurrentRoute.features[0]); const lineDistance2 = window.turf.length(originToCurrentRoute.features[0]); const arc = []; const arc2 = []; const steps = 500; for (let i = 0; i < lineDistance; i += lineDistance / steps) { const segment = window.turf.along(originToCurrentRoute.features[0], i); arc.push(segment.geometry.coordinates); } for (let i = 0; i < lineDistance2; i += lineDistance2 / steps) { const segment = window.turf.along( currentToDestinationRoute.features[0], i ); arc2.push(segment.geometry.coordinates); } originToCurrentRoute.features[0].geometry.coordinates = arc; currentToDestinationRoute.features[0].geometry.coordinates = arc2; map.on('load', () => { map.addSource('route', { type: 'geojson', data: originToCurrentRoute.features[0] }); map.addSource('route2', { type: 'geojson', data: currentToDestinationRoute.features[0] }); map.addLayer({ id: 'route', source: 'route', type: 'line', paint: { 'line-width': 2, 'line-color': getItemFromStore('phoenixTheme') === 'dark' ? getColor('primary') : getColor('primary-light') } }); map.addLayer({ id: 'route2', source: 'route2', type: 'line', paint: { 'line-width': 1, 'line-color': getColor('warning') } }); }); } }; const themeController$1 = document.body; if (themeController$1) { themeController$1.addEventListener('clickControl', () => { flightMapInit(); }); } /* -------------------------------------------------------------------------- */ /* Typed Text */ /* -------------------------------------------------------------------------- */ const typedTextInit = () => { const typedTexts = document.querySelectorAll('.typed-text'); if (typedTexts.length && window.Typed) { typedTexts.forEach(typedText => { return new window.Typed(typedText, { strings: getData(typedText, 'typedText'), typeSpeed: 70, backSpeed: 70, loop: true, backDelay: 1000 }); }); } }; /* -------------------------------------------------------------------------- */ /* price tier form */ /* -------------------------------------------------------------------------- */ const priceTierFormInit = () => { const priceTierForms = document.querySelectorAll('[data-form-price-tier]'); if (priceTierForms) { priceTierForms.forEach(priceTierForm => { const priceToggler = priceTierForm.querySelector('[data-price-toggle]'); const pricings = priceTierForm.querySelectorAll('[data-pricing]'); const bottomOption = priceTierForm.querySelector( '[data-pricing-collapse]' ); const pricingCollapse = new window.bootstrap.Collapse(bottomOption, { toggle: false }); priceToggler.addEventListener('change', e => { pricings[0].checked = true; if (e.target.checked) { priceTierForm.classList.add('active'); } else { priceTierForm.classList.remove('active'); pricingCollapse.hide(); } }); pricings.forEach(pricing => { pricing.addEventListener('change', e => { if (e.target.value === 'paid') { pricingCollapse.show(); } else { pricingCollapse.hide(); } }); }); }); } }; /* -------------------------------------------------------------------------- */ /* noUiSlider */ /* -------------------------------------------------------------------------- */ const nouisliderInit = () => { const { getData } = window.phoenix.utils; if (window.noUiSlider) { const elements = document.querySelectorAll('[data-nouislider]'); elements.forEach(item => { const userOptions = getData(item, 'nouislider'); const sliderValues = getData(item, 'nouislider-values'); let defaultOptions; if (sliderValues && sliderValues.length) { defaultOptions = { connect: true, step: 1, range: { min: 0, max: sliderValues.length - 1 }, tooltips: true, format: { to(value) { return sliderValues[Math.round(value)]; }, from(value) { return sliderValues.indexOf(value); } } }; } else { defaultOptions = { start: [10], connect: [true, false], step: 1, range: { min: [0], max: [100] }, tooltips: true }; } const options = window._.merge(defaultOptions, userOptions); window.noUiSlider.create(item, { ...options }); }); } }; const collapseAllInit = () => { const collapseParent = document.querySelector('[data-collapse-all]'); const collapseBtn = document.querySelector('[data-btn-collapse-all]'); if (collapseParent) { const collapseElements = collapseParent.querySelectorAll('.collapse'); collapseElements.forEach(ele => { const collapse = window.bootstrap.Collapse.getOrCreateInstance(ele, { toggle: false }); collapseBtn.addEventListener('click', () => { collapse.hide(); }); }); } }; const leaftletPoints = [ { lat: 53.958332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 52.958332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 51.958332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 53.958332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 54.958332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 55.958332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 53.908332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 53.008332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 53.158332, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 53.000032, long: -1.080278, name: 'Diana Meyer', street: 'Slude Strand 27', location: '1130 Kobenhavn' }, { lat: 52.292001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 52.392001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 51.492001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 51.192001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 52.292001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 54.392001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 51.292001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 52.102001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 52.202001, long: -2.22, name: 'Anke Schroder', street: 'Industrivej 54', location: '4140 Borup' }, { lat: 51.063202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.363202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.463202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.563202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.763202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.863202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.963202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.000202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.000202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.163202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 52.263202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 53.463202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 55.163202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.263202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.463202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.563202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.663202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.763202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.863202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 56.963202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 57.973202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 57.163202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.163202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.263202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.363202, long: -1.308, name: 'Tobias Vogel', street: 'Mollebakken 33', location: '3650 Olstykke' }, { lat: 51.409, long: -2.647, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.68, long: -1.49, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 50.259998, long: -5.051, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 54.906101, long: -1.38113, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.383331, long: -1.466667, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.483002, long: -2.2931, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.509865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.109865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.209865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.309865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.409865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.609865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.709865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.809865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 51.909865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.109865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.209865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.309865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.409865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.509865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.609865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.709865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.809865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.909865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.519865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.529865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.539865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.549865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 52.549865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.109865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.209865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.319865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.329865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.409865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.559865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.619865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.629865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.639865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.649865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.669865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.669865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.719865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.739865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.749865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.759865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.769865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.769865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.819865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.829865, long: -0.118092, name: 'Richard Hendricks', street: '37 Seafield Place', location: 'London' }, { lat: 53.483959, long: -2.244644, name: 'Ethel B. Brooks', street: '2576 Sun Valley Road' }, { lat: 40.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 39.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 38.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 37.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 40.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 41.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 42.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 43.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 44.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 45.737, long: -73.923, name: 'Marshall D. Lewis', street: '1489 Michigan Avenue', location: 'Michigan' }, { lat: 46.7128, long: 74.006, name: 'Elizabeth C. Lyons', street: '4553 Kenwood Place', location: 'Fort Lauderdale' }, { lat: 40.7128, long: 74.1181, name: 'Elizabeth C. Lyons', street: '4553 Kenwood Place', location: 'Fort Lauderdale' }, { lat: 14.235, long: 51.9253, name: 'Ralph D. Wylie', street: '3186 Levy Court', location: 'North Reading' }, { lat: 15.235, long: 51.9253, name: 'Ralph D. Wylie', street: '3186 Levy Court', location: 'North Reading' }, { lat: 16.235, long: 51.9253, name: 'Ralph D. Wylie', street: '3186 Levy Court', location: 'North Reading' }, { lat: 14.235, long: 51.9253, name: 'Ralph D. Wylie', street: '3186 Levy Court', location: 'North Reading' }, { lat: 15.8267, long: 47.9218, name: 'Hope A. Atkins', street: '3715 Hillcrest Drive', location: 'Seattle' }, { lat: 15.9267, long: 47.9218, name: 'Hope A. Atkins', street: '3715 Hillcrest Drive', location: 'Seattle' }, { lat: 23.4425, long: 58.4438, name: 'Samuel R. Bailey', street: '2883 Raoul Wallenberg Place', location: 'Cheshire' }, { lat: 23.5425, long: 58.3438, name: 'Samuel R. Bailey', street: '2883 Raoul Wallenberg Place', location: 'Cheshire' }, { lat: -37.8927369333, long: 175.4087452333, name: 'Samuel R. Bailey', street: '3228 Glory Road', location: 'Nashville' }, { lat: -38.9064188833, long: 175.4441556833, name: 'Samuel R. Bailey', street: '3228 Glory Road', location: 'Nashville' }, { lat: -12.409874, long: -65.596832, name: 'Ann J. Perdue', street: '921 Ella Street', location: 'Dublin' }, { lat: -22.090887, long: -57.411827, name: 'Jorge C. Woods', street: '4800 North Bend River Road', location: 'Allen' }, { lat: -19.019585, long: -65.261963, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: -16.500093, long: -68.214684, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: -17.413977, long: -66.165321, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: -16.489689, long: -68.119293, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: 54.766323, long: 3.08603729, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: 54.866323, long: 3.08603729, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: 49.537685, long: 3.08603729, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: 54.715424, long: 0.509207, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: 44.891666, long: 10.136665, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: 48.078335, long: 14.535004, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: -26.358055, long: 27.398056, name: 'Russ E. Panek', street: '4068 Hartland Avenue', location: 'Appleton' }, { lat: -29.1, long: 26.2167, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: -29.883333, long: 31.049999, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: -26.266111, long: 27.865833, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: -29.087217, long: 26.154898, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: -33.958252, long: 25.619022, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: -33.977074, long: 22.457581, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: -26.563404, long: 27.844164, name: 'Wilbur J. Dry', street: '2043 Jadewood Drive', location: 'Northbrook' }, { lat: 51.21389, long: -102.462776, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 52.321945, long: -106.584167, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 50.288055, long: -107.793892, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 52.7575, long: -108.28611, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 50.393333, long: -105.551941, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 50.930557, long: -102.807777, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 52.856388, long: -104.610001, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 52.289722, long: -106.666664, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 52.201942, long: -105.123055, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 53.278046, long: -110.00547, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 49.13673, long: -102.990959, name: 'Joseph B. Poole', street: '3364 Lunetta Street', location: 'Wichita Falls' }, { lat: 45.484531, long: -73.597023, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.266666, long: -71.900002, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.349998, long: -72.51667, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 47.333332, long: -79.433334, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.400002, long: -74.033333, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.683334, long: -73.433334, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 48.099998, long: -77.783333, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.5, long: -72.316666, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 46.349998, long: -72.550003, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 48.119999, long: -69.18, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.599998, long: -75.25, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 46.099998, long: -71.300003, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 45.700001, long: -73.633331, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 47.68, long: -68.879997, name: 'Claudette D. Nowakowski', street: '3742 Farland Avenue', location: 'San Antonio' }, { lat: 46.716667, long: -79.099998, name: '299' }, { lat: 45.016666, long: -72.099998, name: '299' } ]; const { L } = window; /* -------------------------------------------------------------------------- */ /* leaflet */ /* -------------------------------------------------------------------------- */ const leafletInit = () => { const mapContainer = document.getElementById('map'); if (L && mapContainer) { const getFilterColor = () => { return window.config.config.phoenixTheme === 'dark' ? [ 'invert:98%', 'grayscale:69%', 'bright:89%', 'contrast:111%', 'hue:205deg', 'saturate:1000%' ] : ['bright:101%', 'contrast:101%', 'hue:23deg', 'saturate:225%']; }; const tileLayerTheme = 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png'; const tiles = L.tileLayer.colorFilter(tileLayerTheme, { attribution: null, transparent: true, filter: getFilterColor() }); const map = L.map('map', { center: L.latLng(25.659195, 30.182691), zoom: 0.6, layers: [tiles], minZoom: 1.4 }); const mcg = L.markerClusterGroup({ chunkedLoading: false, spiderfyOnMaxZoom: false }); leaftletPoints.map(point => { const { name, location, street } = point; const icon = L.icon({ iconUrl: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAACXBIWXMAAAFgAAABYAEg2RPaAAADpElEQVRYCZ1XS1LbQBBtybIdiMEJKSpUqihgEW/xDdARyAnirOIl3MBH8NK7mBvkBpFv4Gy9IRSpFIQiRPyNfqkeZkY9HwmFt7Lm06+7p/vN2MmyDIrQ6QebALAHAD4AbFuWfQeAAACGs5H/w5jlsJJw4wMA+GhMFuMA99jIDJJOP+ihZwDQFmNuowWO1wS3viDXpdEdZPEc0odruj0EgN5s5H8tJOEEX8R3rbkMtcU34NTqhe5nSQTJ7Tkk80s6/Gk28scGiULguFBffgdufdEwWoQ0uoXo8hdAlooVH0REjISfwZSlyHGh0V5n6aHAtKTxXI5g6nQnMH0P4bEgwtR18Yw8Pj8QZ4ARUAI0Hl+fQZZGisGEBVwHr7XKzox57DXZ/ij8Cdwe2u057z9/wygOxRl4S2vSUHx1oucaMQGAHTrgtdag9mK5aN+Wx/uAAQ9Zenp/SRce4TpaNbQK4+sTcGqeTB/aIXv3XN5oj2VKqii++U0JunpZ8urxee4hvjqVc2hHpBDXuKKT9XMgVYJ1/1fPGSeaikzgmWWkMIi9bVf8UhotXxzORn5gWFchI8QyttlzjS0qpsaIGY2MMsujV/AUSdcY0dDpB6/EiOPYzclR1CI5mOez3ekHvrFLxa7cR5pTscfrXjk0Vhm5V2PqLUWnH3R5GbPGpMVD7E1ckXesKBQ7AS/vmQ1c0+kHuxpBj98lTCm8pbc5QRJRdZ6qHb/wGryXq3Lxszv+5gySuwvxueXySwYvHEjuQ9ofTGKYlrmK1EsCHMd5SoD7mZ1HHFCBHLNbMEshvrugqWLn01hpVVJhFgVGkDvK7hR6n2B+d9C7xsqWsbkqHv4cCsWezEb+o2SR+SFweUBxfA5wH7kShjKt2vWL57Px3GhIFEezkb8pxvUWHYhotAfCk2AtkEcxoOttrxUWDR5svb1emSQKj0WXK1HYIgFREbiBqmoZcB2RkbE+byMZiosorVgAZF1ID7yQhEs38wa7nUqNDezdlavC2HbBGSQkGgZ8uJVBmzeiKCRRpEa9ilWghORVeGB7BxeSKF5xqbFBkxBrFKUk/JHA7ppENQaCnCjthK+3opCEYyANztXmZN858cDYWSUSHk3A311GAZDvo6deNKUk1EsqnJoQlkYBNlmxQZeaMgmxoUokICoHDce351RCCiuKoirJWEgNOYvQplM2VCLhUqF7jf94rW9kHVUjQeheV4riv0i4ZOzzz/2y/+0KAOAfr4EE4HpCFhwAAAAASUVORK5CYII=` }); const marker = L.marker([point.lat, point.long], { icon }); const popupContent = `
    ${name}

    ${street}, ${location}

    `; const popup = L.popup({ minWidth: 180 }).setContent(popupContent); marker.bindPopup(popup); mcg.addLayer(marker); return true; }); map.addLayer(mcg); const themeController = document.body; themeController.addEventListener( 'clickControl', ({ detail: { control, value } }) => { if (control === 'phoenixTheme') { tiles.updateFilter( value === 'dark' ? [ 'invert:98%', 'grayscale:69%', 'bright:89%', 'contrast:111%', 'hue:205deg', 'saturate:1000%' ] : ['bright:101%', 'contrast:101%', 'hue:23deg', 'saturate:225%'] ); } } ); } }; /* -------------------------------------------------------------------------- */ /* mapbox cluster */ /* -------------------------------------------------------------------------- */ const mapboxClusterInit = () => { const mapboxCluster = document.querySelectorAll('#mapbox-cluster'); if (mapboxCluster) { mapboxCluster.forEach(() => { window.mapboxgl.accessToken = 'pk.eyJ1IjoidGhlbWV3YWdvbiIsImEiOiJjbGhmNW5ybzkxcmoxM2RvN2RmbW1nZW90In0.hGIvQ890TYkZ948MVrsMIQ'; const styles = { default: 'mapbox://styles/mapbox/light-v11', light: 'mapbox://styles/themewagon/clj57pads001701qo25756jtw', dark: 'mapbox://styles/themewagon/cljzg9juf007x01pk1bepfgew' }; const map = new window.mapboxgl.Map({ container: 'mapbox-cluster', style: styles[window.config.config.phoenixTheme], center: [-73.102712, 7.102257], zoom: 3.5, pitch: 40, attributionControl: false }); map.on('load', () => { map.addSource('earthquakes', { type: 'geojson', data: 'https://docs.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson', cluster: true, clusterMaxZoom: 14, clusterRadius: 50 }); map.addLayer({ id: 'clusters', type: 'circle', source: 'earthquakes', filter: ['has', 'point_count'], paint: { 'circle-color': [ 'step', ['get', 'point_count'], getColor('secondary'), 100, getColor('info'), 750, getColor('warning') ], 'circle-radius': [ 'step', ['get', 'point_count'], 20, 100, 30, 750, 40 ] } }); map.addLayer({ id: 'cluster-count', type: 'symbol', source: 'earthquakes', filter: ['has', 'point_count'], layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'], 'text-size': 12 }, paint: { 'text-color': getColor('white') } }); map.addLayer({ id: 'unclustered-point', type: 'circle', source: 'earthquakes', filter: ['!', ['has', 'point_count']], paint: { 'circle-color': getColor('primary-light'), 'circle-radius': 4, 'circle-stroke-width': 1, 'circle-stroke-color': getColor('emphasis-bg') } }); map.on('click', 'clusters', e => { const features = map.queryRenderedFeatures(e.point, { layers: ['clusters'] }); const clusterId = features[0].properties.cluster_id; map .getSource('earthquakes') .getClusterExpansionZoom(clusterId, (err, zoom) => { if (err) return; map.easeTo({ center: features[0].geometry.coordinates, zoom }); }); }); map.on('click', 'unclustered-point', e => { const coordinates = e.features[0].geometry.coordinates.slice(); const { mag } = e.features[0].properties; const tsunami = e.features[0].properties.tsunami === 1 ? 'yes' : 'no'; while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) { coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360; } new window.mapboxgl.Popup() .setLngLat(coordinates) .setHTML(`magnitude: ${mag}
    Was there a tsunami?: ${tsunami}`) .addTo(map); }); map.on('mouseenter', 'clusters', () => { map.getCanvas().style.cursor = 'pointer'; }); map.on('mouseleave', 'clusters', () => { map.getCanvas().style.cursor = ''; }); }); }); } }; const themeController = document.body; if (themeController) { themeController.addEventListener('clickControl', () => { mapboxClusterInit(); }); } /* -------------------------------------------------------------------------- */ /* Echarts trip review */ /* -------------------------------------------------------------------------- */ const { echarts } = window; const tripReviewChartInit = () => { const { getData, getColor } = window.phoenix.utils; const $echartTripReviews = document.querySelectorAll('.echart-trip-review'); if ($echartTripReviews) { $echartTripReviews.forEach($echartTripReview => { const userOptions = getData($echartTripReview, 'options'); const chart = echarts.init($echartTripReview); const getDefaultOptions = () => ({ tooltip: { trigger: 'item', padding: [7, 10], backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, position: (...params) => handleTooltipPosition(params), transitionDuration: 0, formatter: params => { return `${params.seriesName}: ${params.value}%`; }, extraCssText: 'z-index: 1000' }, series: [ { type: 'gauge', name: 'Commission', startAngle: 90, endAngle: -270, radius: '90%', pointer: { show: false }, progress: { show: true, overlap: false, // roundCap: true, clip: false, itemStyle: { color: getColor('primary') } }, axisLine: { lineStyle: { width: 4, color: [[1, getColor('secondary-bg')]] } }, splitLine: { show: false }, axisTick: { show: false }, axisLabel: { show: false }, detail: { fontSize: '20px', color: getColor('body-color'), offsetCenter: [0, '10%'] } } ] }); echartSetOption(chart, userOptions, getDefaultOptions); }); } }; const playOnHoverInit = () => { const isPause = (playIcon, pauseIcon) => { playIcon.classList.add('d-block'); pauseIcon.classList.add('d-none'); playIcon.classList.remove('d-none'); pauseIcon.classList.remove('d-block'); }; const isPlay = (playIcon, pauseIcon) => { playIcon.classList.add('d-none'); pauseIcon.classList.add('d-block'); playIcon.classList.remove('d-block'); pauseIcon.classList.remove('d-none'); }; const playVideo = (video, playIcon, pauseIcon) => { video.play(); isPlay(playIcon, pauseIcon); }; const pauseVideo = (video, playIcon, pauseIcon) => { video.pause(); isPause(playIcon, pauseIcon); }; const controlIsContainer = (container, state) => { const video = container.querySelector('[data-play-on-hover]'); const controller = container.querySelector('[data-video-controller]'); if (controller) { const playIcon = controller.querySelector('.play-icon'); const pauseIcon = controller.querySelector('.pause-icon'); if (state === 'play') { playVideo(video, playIcon, pauseIcon); } else { pauseVideo(video, playIcon, pauseIcon); } } }; document.addEventListener('mouseover', e => { if (e.target.closest('[data-play-on-hover]')) { const video = e.target.closest('[data-play-on-hover]'); playVideo(video, null, null); } else if (e.target.closest('[data-play-on-container-hover]')) { const container = e.target.closest('[data-play-on-container-hover]'); controlIsContainer(container, 'play'); } }); document.addEventListener('mouseout', e => { if (e.target.closest('[data-play-on-hover]')) { const video = e.target.closest('[data-play-on-hover]'); pauseVideo(video, null, null); } else if (e.target.closest('[data-play-on-container-hover]')) { const container = e.target.closest('[data-play-on-container-hover]'); controlIsContainer(container, 'pause'); } }); document.addEventListener('touchstart', e => { if (e.target.closest('[data-play-on-hover]')) { const video = e.target.closest('[data-play-on-hover]'); playVideo(video, null, null); } else if (e.target.closest('[data-play-on-container-hover]')) { const container = e.target.closest('[data-play-on-container-hover]'); controlIsContainer(container, 'play'); } }); document.addEventListener('touchend', e => { if (e.target.closest('[data-play-on-hover]')) { const video = e.target.closest('[data-play-on-hover]'); pauseVideo(video, null, null); } else if (e.target.closest('[data-play-on-container-hover]')) { const container = e.target.closest('[data-play-on-container-hover]'); controlIsContainer(container, 'pause'); } }); document.addEventListener('click', e => { if (e.target.closest('[data-video-controller]')) { const controller = e.target.closest('[data-video-controller]'); const container = controller.closest('[data-play-on-container-hover]'); const video = container.querySelector('[data-play-on-hover]'); const playIcon = controller.querySelector('.play-icon'); const pauseIcon = controller.querySelector('.pause-icon'); if (video.paused) { playVideo(video, playIcon, pauseIcon); } else { pauseVideo(video, playIcon, pauseIcon); } } }); const videoContainers = document.querySelectorAll( '[data-play-on-container-hover]' ); videoContainers.forEach(container => { const video = container.querySelector('[data-play-on-hover]'); const controller = container.querySelector('[data-video-controller]'); if (controller) { const playIcon = controller.querySelector('.play-icon'); const pauseIcon = controller.querySelector('.pause-icon'); if (video.paused) { isPause(playIcon, pauseIcon); } } }); }; const passwordToggleInit = () => { const passwords = document.querySelectorAll('[data-password]'); if (passwords) { passwords.forEach(password => { const passwordInput = password.querySelector('[data-password-input]'); const passwordToggler = password.querySelector('[data-password-toggle]'); passwordToggler.addEventListener('click', () => { if (passwordInput.type === 'password') { passwordInput.setAttribute('type', 'text'); passwordToggler.classList.add('show-password'); } else { passwordInput.setAttribute('type', 'password'); passwordToggler.classList.remove('show-password'); } }); }); } }; /* -------------------------------------------------------------------------- */ /* Treeview */ /* -------------------------------------------------------------------------- */ const treeviewInit = () => { const Events = { CHANGE: 'change', SHOW_BS_COLLAPSE: 'show.bs.collapse', HIDE_BS_COLLAPSE: 'hide.bs.collapse' }; const Selector = { TREEVIEW_ROW: '.treeview > li > .treeview-row,.treeview-list.collapse-show > li > .treeview-row', TREEVIEW: '.treeview', TREEVIEW_LIST: '.treeview-list', TOGGLE_ELEMENT: "[data-bs-toggle='collapse']", INPUT: 'input', TREEVIEW_LIST_ITEM: '.treeview-list-item', CHILD_SELECTOR: ':scope > li > .collapse.collapse-show' }; const ClassName = { TREEVIEW: 'treeview', TREEVIEW_LIST: 'treeview-list', TREEVIEW_BORDER: 'treeview-border', TREEVIEW_BORDER_TRANSPARENT: 'treeview-border-transparent', COLLAPSE_SHOW: 'collapse-show', COLLAPSE_HIDDEN: 'collapse-hidden', TREEVIEW_ROW: 'treeview-row', TREEVIEW_ROW_ODD: 'treeview-row-odd', TREEVIEW_ROW_EVEN: 'treeview-row-even' }; const treeviews = document.querySelectorAll(Selector.TREEVIEW); const makeStriped = treeview => { const tags = Array.from(treeview.querySelectorAll(Selector.TREEVIEW_ROW)); const uTags = tags.filter(tag => { let result = true; while (tag.parentElement) { if (tag.parentElement.classList.contains(ClassName.COLLAPSE_HIDDEN)) { result = false; break; } tag = tag.parentElement; } return result; }); uTags.forEach((tag, index) => { if (index % 2 === 0) { tag.classList.add(ClassName.TREEVIEW_ROW_EVEN); tag.classList.remove(ClassName.TREEVIEW_ROW_ODD); } else { tag.classList.add(ClassName.TREEVIEW_ROW_ODD); tag.classList.remove(ClassName.TREEVIEW_ROW_EVEN); } }); }; if (treeviews.length) { treeviews.forEach(treeview => { const options = getData(treeview, 'options'); const striped = options?.striped; const select = options?.select; if (striped) { makeStriped(treeview); } const collapseElementList = Array.from( treeview.querySelectorAll(Selector.TREEVIEW_LIST) ); const collapseListItem = Array.from( treeview.querySelectorAll(Selector.TREEVIEW_LIST_ITEM) ); collapseListItem.forEach(item => { const wholeRow = document.createElement('div'); wholeRow.setAttribute('class', ClassName.TREEVIEW_ROW); item.prepend(wholeRow); }); collapseElementList.forEach(collapse => { const collapseId = collapse.id; if (!striped) { collapse.classList.add(ClassName.TREEVIEW_BORDER); } collapse.addEventListener(Events.SHOW_BS_COLLAPSE, e => { e.target.classList.remove(ClassName.COLLAPSE_HIDDEN); e.target.classList.add(ClassName.COLLAPSE_SHOW); if (striped) { makeStriped(treeview); } }); collapse.addEventListener(Events.HIDE_BS_COLLAPSE, e => { e.target.classList.add(ClassName.COLLAPSE_HIDDEN); e.target.classList.remove(ClassName.COLLAPSE_SHOW); if (striped) { makeStriped(treeview); } else { const childs = e .composedPath()[2] .querySelectorAll(Selector.CHILD_SELECTOR); if ( !e.composedPath()[2].classList.contains(ClassName.TREEVIEW) && childs.length === 0 ) { e.composedPath()[2].classList.remove( ClassName.TREEVIEW_BORDER_TRANSPARENT ); } } }); if (collapse.dataset.show === 'true') { const parents = [collapse]; while (collapse.parentElement) { if ( collapse.parentElement.classList.contains(ClassName.TREEVIEW_LIST) ) { parents.unshift(collapse.parentElement); } collapse = collapse.parentElement; } parents.forEach(collapseEl => { // eslint-disable-next-line no-new new window.bootstrap.Collapse(collapseEl, { show: true }); }); } if (select) { const inputElement = treeview.querySelector( `input[data-target='#${collapseId}']` ); inputElement.addEventListener(Events.CHANGE, e => { const childInputElements = Array.from( treeview .querySelector(`#${collapseId}`) .querySelectorAll(Selector.INPUT) ); childInputElements.forEach(input => { input.checked = e.target.checked; }); }); } }); }); } }; /* eslint-disable no-new */ window.initMap = initMap; docReady(detectorInit); docReady(simplebarInit); docReady(toastInit); docReady(tooltipInit); docReady(featherIconsInit); docReady(basicEchartsInit); docReady(bulkSelectInit); docReady(listInit); docReady(anchorJSInit); docReady(popoverInit); docReady(formValidationInit); docReady(docComponentInit); docReady(swiperInit); docReady(productDetailsInit); docReady(ratingInit); docReady(quantityInit); docReady(dropzoneInit); docReady(choicesInit); docReady(tinymceInit); docReady(responsiveNavItemsInit); docReady(flatpickrInit); docReady(iconCopiedInit); docReady(isotopeInit); docReady(bigPictureInit); docReady(countupInit); docReady(phoenixOffcanvasInit); docReady(todoOffcanvasInit); docReady(wizardInit); docReady(reportsDetailsChartInit); docReady(glightboxInit); docReady(themeControl); docReady(searchInit); docReady(handleNavbarVerticalCollapsed); docReady(navbarInit); docReady(navbarComboInit); docReady(fullCalendarInit); docReady(picmoInit); docReady(chatInit); docReady(modalInit); docReady(lottieInit); docReady(navbarShadowOnScrollInit); docReady(dropdownOnHover); docReady(supportChatInit); docReady(sortableInit); docReady(copyLink); docReady(randomColorInit); docReady(faqTabInit); docReady(createBoardInit); docReady(advanceAjaxTableInit); docReady(kanbanInit); docReady(towFAVerificarionInit); docReady(mapboxInit); docReady(flightMapInit); docReady(typedTextInit); docReady(priceTierFormInit); docReady(nouisliderInit); docReady(collapseAllInit); docReady(leafletInit); docReady(mapboxClusterInit); docReady(tripReviewChartInit); docReady(playOnHoverInit); docReady(passwordToggleInit); docReady(treeviewInit); docReady(() => { const selectedRowsBtn = document.querySelector('[data-selected-rows]'); const selectedRows = document.getElementById('selectedRows'); if (selectedRowsBtn) { const bulkSelectEl = document.getElementById('bulk-select-example'); const bulkSelectInstance = window.phoenix.BulkSelect.getInstance(bulkSelectEl); selectedRowsBtn.addEventListener('click', () => { selectedRows.innerHTML = JSON.stringify( bulkSelectInstance.getSelectedRows(), undefined, 2 ); }); } }); var phoenix = { utils, BulkSelect }; return phoenix; })); //# sourceMappingURL=phoenix.js.map