update
This commit is contained in:
179
assets/script/main.js
Normal file
179
assets/script/main.js
Normal file
@@ -0,0 +1,179 @@
|
||||
class LayoutCustomizer {
|
||||
constructor() {
|
||||
this.defaultConfig = {
|
||||
theme: "system",
|
||||
direction: "ltr",
|
||||
fontFamily: "default",
|
||||
sidebarTheme: "light",
|
||||
fullscreen: false,
|
||||
}
|
||||
const configCache = localStorage.getItem("__NEXUS_CONFIG_v3.0__")
|
||||
if (configCache) {
|
||||
this.config = JSON.parse(configCache)
|
||||
} else {
|
||||
this.config = { ...this.defaultConfig }
|
||||
}
|
||||
this.html = document.documentElement
|
||||
this.sidebar = document.getElementById("layout-sidebar")
|
||||
|
||||
window.config = this.config
|
||||
}
|
||||
|
||||
updateTheme = () => {
|
||||
localStorage.setItem("__NEXUS_CONFIG_v3.0__", JSON.stringify(this.config))
|
||||
|
||||
if (this.config.theme === "system") {
|
||||
this.html.removeAttribute("data-theme")
|
||||
} else {
|
||||
this.html.setAttribute("data-theme", this.config.theme)
|
||||
}
|
||||
|
||||
if (this.sidebar) {
|
||||
if (
|
||||
this.config.sidebarTheme === "dark" &&
|
||||
["light", "contrast"].includes(this.config.theme)
|
||||
) {
|
||||
this.sidebar.setAttribute("data-theme", this.config.sidebarTheme)
|
||||
} else {
|
||||
this.sidebar.removeAttribute("data-theme")
|
||||
}
|
||||
}
|
||||
|
||||
this.html.setAttribute("data-sidebar-theme", this.config.sidebarTheme)
|
||||
this.html.dir = this.config.direction
|
||||
|
||||
if (this.config.fullscreen) {
|
||||
this.html.setAttribute("data-fullscreen", "")
|
||||
} else {
|
||||
this.html.removeAttribute("data-fullscreen")
|
||||
}
|
||||
|
||||
if (this.config.fontFamily !== "default") {
|
||||
this.html.setAttribute("data-font-family", config.fontFamily)
|
||||
} else {
|
||||
this.html.removeAttribute("data-font-family")
|
||||
}
|
||||
}
|
||||
|
||||
initEventListener = () => {
|
||||
const themeControls = document.querySelectorAll("[data-theme-control]")
|
||||
themeControls.forEach((control) => {
|
||||
control.addEventListener("click", () => {
|
||||
let theme = control.getAttribute("data-theme-control") ?? "light"
|
||||
if (theme === "toggle") {
|
||||
theme = this.config.theme === "light" ? "dark" : "light"
|
||||
}
|
||||
this.config.theme = theme
|
||||
this.updateTheme()
|
||||
})
|
||||
})
|
||||
|
||||
const sidebarThemeControls = document.querySelectorAll("[data-sidebar-theme-control]")
|
||||
sidebarThemeControls.forEach((control) => {
|
||||
control.addEventListener("click", () => {
|
||||
this.config.sidebarTheme =
|
||||
control.getAttribute("data-sidebar-theme-control") ?? "light"
|
||||
this.updateTheme()
|
||||
})
|
||||
})
|
||||
|
||||
const fontFamilyControls = document.querySelectorAll("[data-font-family-control]")
|
||||
fontFamilyControls.forEach((control) => {
|
||||
control.addEventListener("click", () => {
|
||||
this.config.fontFamily =
|
||||
control.getAttribute("data-font-family-control") ?? "default"
|
||||
this.updateTheme()
|
||||
})
|
||||
})
|
||||
|
||||
const dirControls = document.querySelectorAll("[data-dir-control]")
|
||||
dirControls.forEach((control) => {
|
||||
control.addEventListener("click", () => {
|
||||
this.config.direction = control.getAttribute("data-dir-control") ?? "ltr"
|
||||
this.updateTheme()
|
||||
})
|
||||
})
|
||||
|
||||
const fullscreenControls = document.querySelectorAll("[data-fullscreen-control]")
|
||||
fullscreenControls.forEach((control) => {
|
||||
control.addEventListener("click", () => {
|
||||
if (document.fullscreenElement != null) {
|
||||
this.config.fullscreen = false
|
||||
document.exitFullscreen()
|
||||
} else {
|
||||
this.config.fullscreen = true
|
||||
this.html.requestFullscreen()
|
||||
}
|
||||
this.updateTheme()
|
||||
})
|
||||
})
|
||||
|
||||
const resetControls = document.querySelectorAll("[data-reset-control]")
|
||||
resetControls.forEach((control) => {
|
||||
control.addEventListener("click", () => {
|
||||
this.config = { ...this.defaultConfig }
|
||||
if (document.fullscreenElement != null) {
|
||||
document.exitFullscreen()
|
||||
}
|
||||
this.updateTheme()
|
||||
})
|
||||
})
|
||||
|
||||
const fullscreenMedia = window.matchMedia("(display-mode: fullscreen)")
|
||||
const fullscreenListener = () => {
|
||||
this.config.fullscreen = fullscreenMedia.matches
|
||||
this.updateTheme()
|
||||
}
|
||||
fullscreenMedia.addEventListener("change", fullscreenListener)
|
||||
fullscreenListener()
|
||||
}
|
||||
|
||||
initLeftmenu = () => {
|
||||
const initMenuActivation = () => {
|
||||
const menuItems = document.querySelectorAll(".sidebar-menu-activation a")
|
||||
let currentURL = window.location.href
|
||||
if (window.location.pathname === "/") {
|
||||
currentURL += "dashboards-ecommerce.html"
|
||||
}
|
||||
menuItems.forEach((item) => {
|
||||
if (item.href === currentURL) {
|
||||
item.classList.add("active")
|
||||
const parentElement1 = item.parentElement.parentElement
|
||||
if (parentElement1.classList.contains("collapse-content")) {
|
||||
const inputElement1 = parentElement1.parentElement.querySelector("input")
|
||||
if (inputElement1) {
|
||||
inputElement1.checked = true
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const scrollToActiveMenu = () => {
|
||||
const simplebarEl = document.querySelector("#layout-sidebar [data-simplebar]")
|
||||
const activatedItem = document.querySelector("#layout-sidebar .menu a.active")
|
||||
if (simplebarEl && activatedItem) {
|
||||
const simplebar = new SimpleBar(simplebarEl)
|
||||
const top = activatedItem?.getBoundingClientRect().top
|
||||
if (top && top !== 0) {
|
||||
simplebar.getScrollElement().scrollTo({ top: top - 300, behavior: "smooth" })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initMenuActivation()
|
||||
scrollToActiveMenu()
|
||||
}
|
||||
|
||||
afterInit = () => {
|
||||
this.initEventListener()
|
||||
this.initLeftmenu()
|
||||
}
|
||||
|
||||
init = () => {
|
||||
this.updateTheme()
|
||||
window.addEventListener("DOMContentLoaded", this.afterInit)
|
||||
}
|
||||
}
|
||||
|
||||
new LayoutCustomizer().init()
|
||||
Reference in New Issue
Block a user