cafeg/public/assets/js/front-main.js
2025-01-09 16:56:00 +08:00

190 lines
6.6 KiB
JavaScript

/**
* Main - Front Pages
*/
'use strict';
window.isRtl = window.Helpers.isRtl();
window.isDarkStyle = window.Helpers.isDarkStyle();
(function () {
// Button & Pagination Waves effect
if (typeof Waves !== 'undefined') {
Waves.init();
Waves.attach(
".btn[class*='btn-']:not(.position-relative):not([class*='btn-outline-']):not([class*='btn-label-'])",
['waves-light']
);
Waves.attach("[class*='btn-outline-']:not(.position-relative)");
Waves.attach("[class*='btn-label-']:not(.position-relative)");
Waves.attach('.pagination .page-item .page-link');
Waves.attach('.dropdown-menu .dropdown-item');
Waves.attach('.light-style .list-group .list-group-item-action');
Waves.attach('.dark-style .list-group .list-group-item-action', ['waves-light']);
Waves.attach('.nav-tabs:not(.nav-tabs-widget) .nav-item .nav-link');
Waves.attach('.nav-pills .nav-item .nav-link', ['waves-light']);
}
const menu = document.getElementById('navbarSupportedContent'),
nav = document.querySelector('.landing-navbar'),
navItemLink = document.querySelectorAll('.navbar-nav .nav-link');
// Initialised custom options if checked
setTimeout(function () {
window.Helpers.initCustomOptionCheck();
}, 1000);
// Init BS Tooltip
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
// If layout is RTL add .dropdown-menu-end class to .dropdown-menu
if (isRtl) {
Helpers._addClass('dropdown-menu-end', document.querySelectorAll('#layout-navbar .dropdown-menu'));
}
// Navbar
window.addEventListener('scroll', e => {
if (window.scrollY > 10) {
nav.classList.add('navbar-active');
} else {
nav.classList.remove('navbar-active');
}
});
window.addEventListener('load', e => {
if (window.scrollY > 10) {
nav.classList.add('navbar-active');
} else {
nav.classList.remove('navbar-active');
}
});
// Function to close the mobile menu
function closeMenu() {
menu.classList.remove('show');
}
document.addEventListener('click', function (event) {
// Check if the clicked element is inside mobile menu
if (!menu.contains(event.target)) {
closeMenu();
}
});
navItemLink.forEach(link => {
link.addEventListener('click', event => {
if (!link.classList.contains('dropdown-toggle')) {
closeMenu();
} else {
event.preventDefault();
}
});
});
// If layout is RTL add .dropdown-menu-end class to .dropdown-menu
if (isRtl) {
Helpers._addClass('dropdown-menu-end', document.querySelectorAll('.dropdown-menu'));
}
// Mega dropdown
const megaDropdown = document.querySelectorAll('.nav-link.mega-dropdown');
if (megaDropdown) {
megaDropdown.forEach(e => {
new MegaDropdown(e);
});
}
//Style Switcher (Light/Dark/System Mode)
let styleSwitcher = document.querySelector('.dropdown-style-switcher');
const activeStyle = document.documentElement.getAttribute('data-style');
// Get style from local storage or use 'system' as default
let storedStyle =
localStorage.getItem('templateCustomizer-' + templateName + '--Style') || //if no template style then use Customizer style
(window.templateCustomizer?.settings?.defaultStyle ?? 'light'); //!if there is no Customizer then use default style as light
// Set style on click of style switcher item if template customizer is enabled
if (window.templateCustomizer && styleSwitcher) {
let styleSwitcherItems = [].slice.call(styleSwitcher.children[1].querySelectorAll('.dropdown-item'));
styleSwitcherItems.forEach(function (item) {
item.classList.remove('active');
item.addEventListener('click', function () {
let currentStyle = this.getAttribute('data-theme');
if (currentStyle === 'light') {
window.templateCustomizer.setStyle('light');
} else if (currentStyle === 'dark') {
window.templateCustomizer.setStyle('dark');
} else {
window.templateCustomizer.setStyle('system');
}
});
setTimeout(() => {
if (item.getAttribute('data-theme') === activeStyle) {
// Add 'active' class to the item if it matches the activeStyle
item.classList.add('active');
}
}, 1000);
});
// Update style switcher icon based on the stored style
const styleSwitcherIcon = styleSwitcher.querySelector('i');
if (storedStyle === 'light') {
styleSwitcherIcon.classList.add('ri-sun-line');
new bootstrap.Tooltip(styleSwitcherIcon, {
title: 'Light Mode',
fallbackPlacements: ['bottom']
});
} else if (storedStyle === 'dark') {
styleSwitcherIcon.classList.add('ri-moon-clear-line');
new bootstrap.Tooltip(styleSwitcherIcon, {
title: 'Dark Mode',
fallbackPlacements: ['bottom']
});
} else {
styleSwitcherIcon.classList.add('ri-computer-line');
new bootstrap.Tooltip(styleSwitcherIcon, {
title: 'System Mode',
fallbackPlacements: ['bottom']
});
}
}
// Run switchImage function based on the stored style
switchImage(storedStyle);
// Update light/dark image based on current style
function switchImage(style) {
if (style === 'system') {
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
style = 'dark';
} else {
style = 'light';
}
}
const switchImagesList = [].slice.call(document.querySelectorAll('[data-app-' + style + '-img]'));
switchImagesList.map(function (imageEl) {
const setImage = imageEl.getAttribute('data-app-' + style + '-img');
imageEl.src = assetsPath + 'img/' + setImage; // Using window.assetsPath to get the exact relative path
});
}
// Accordion active class
const accordionActiveFunction = function (e) {
if (e.type == 'show.bs.collapse' || e.type == 'show.bs.collapse') {
e.target.closest('.accordion-item').classList.add('active');
e.target.closest('.accordion-item').previousElementSibling?.classList.add('previous-active');
} else {
e.target.closest('.accordion-item').classList.remove('active');
e.target.closest('.accordion-item').previousElementSibling?.classList.remove('previous-active');
}
};
const accordionTriggerList = [].slice.call(document.querySelectorAll('.accordion'));
const accordionList = accordionTriggerList.map(function (accordionTriggerEl) {
accordionTriggerEl.addEventListener('show.bs.collapse', accordionActiveFunction);
accordionTriggerEl.addEventListener('hide.bs.collapse', accordionActiveFunction);
});
})();