gentelella
Version:
Gentelella v4 — free admin template. 60 pages, 20 chart variants, fully interactive inbox & kanban, live theme generator, component playground, PWA-ready. Vite 8, vanilla JS, no Bootstrap, no jQuery.
1 lines • 8.75 kB
JavaScript
import{t as e}from"./toast-DgCSlJPv.js";import{n as t}from"./modal-MTuCfURV.js";var o="gentelella:settings";function n(){try{const e=localStorage.getItem(o);return e?JSON.parse(e):{}}catch(e){return{}}}function r(e){try{localStorage.setItem(o,JSON.stringify(e))}catch(t){}}function a(e){const t=e.closest(".settings-toggle-row")?.querySelector(".label")?.textContent.trim();return t?`toggle:${e.closest(".settings-section")?.id||"general"}:${t}`:null}function i(){i._wired||(i._wired=!0,function(){const e=n();document.querySelectorAll(".settings-toggle-list .toggle").forEach(t=>{const o=a(t);o&&Object.prototype.hasOwnProperty.call(e,o)&&t.classList.toggle("on",!!e[o])}),document.addEventListener("click",e=>{const t=e.target.closest(".settings-toggle-list .toggle");t&&setTimeout(()=>{const e=a(t);if(!e)return;const o=n();o[e]=t.classList.contains("on"),r(o)},0)})}(),function(){const e=n();document.querySelectorAll('.theme-options input[type="radio"]').forEach(t=>{const o=`radio:${t.name}`;e[o]===t.value&&(t.checked=!0),t.addEventListener("change",()=>{if(!t.checked)return;const e=n();e[o]=t.value,r(e),"theme"===t.name&&function(e){if("system"===e){try{localStorage.removeItem("theme")}catch(o){}const e=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.setAttribute("data-theme",e?"dark":"light")}else{try{localStorage.setItem("theme",e)}catch(o){}document.documentElement.setAttribute("data-theme",e)}const t=document.querySelector(".theme-toggle");t&&t.setAttribute("aria-pressed","dark"===e?"true":"false")}(t.value)})})}(),function(){const t=document.querySelector(".settings-content form");if(!t)return;const o=[...t.querySelectorAll("input, textarea, select")],a=n();o.forEach(e=>{const t=`field:${e.id||e.name}`;!t.endsWith(":")&&Object.prototype.hasOwnProperty.call(a,t)&&(e.value=a[t])});const i=o.map(e=>e.value);let l=!1;const s=t.querySelector('button[type="submit"]'),c=t.querySelector('button[type="reset"]');s&&(s.disabled=!0),c&&(c.disabled=!0);const d=()=>{l=o.map(e=>e.value).some((e,t)=>e!==i[t]),s&&(s.disabled=!l),c&&(c.disabled=!l)};o.forEach(e=>e.addEventListener("input",d)),t.addEventListener("submit",t=>{if(t.preventDefault(),t.stopPropagation(),!l)return;const a=n();o.forEach(e=>{const t=`field:${e.id||e.name}`;t.endsWith(":")||(a[t]=e.value)}),r(a),o.forEach((e,t)=>{i[t]=e.value}),l=!1,s&&(s.disabled=!0),c&&(c.disabled=!0),e("Profile saved",{variant:"success"})}),c&&c.addEventListener("click",t=>{t.preventDefault(),l&&(o.forEach((e,t)=>{e.value=i[t]}),d(),e("Changes discarded"))})}(),function(){const t=n();document.querySelectorAll(".integration").forEach(o=>{const a=o.querySelector(".title"),i=o.querySelector(".btn");if(!a||!i)return;const l=`integration:${a.textContent.trim()}`,s=()=>Object.prototype.hasOwnProperty.call(t,l)?t[l]:/connected/i.test(i.textContent),c=()=>{const e=s();i.textContent=e?"Connected ✓":"Connect",i.classList.toggle("btn-primary",!e),i.classList.toggle("btn-outline",e)};c(),i.addEventListener("click",o=>{o.preventDefault(),o.stopPropagation();const i=n();i[l]=!s(),Object.assign(t,i),r(i),c(),e(i[l]?`${a.textContent.trim()} connected`:`${a.textContent.trim()} disconnected`,{variant:i[l]?"success":"default"})})})}(),document.querySelectorAll(".session-row").forEach(o=>{const n=o.querySelector(".btn");n&&"revoke"===n.textContent.trim().toLowerCase()&&n.addEventListener("click",n=>{n.preventDefault(),n.stopPropagation();const r=o.querySelector(".device")?.textContent.trim()||"session";t({title:"Revoke session?",body:`<p style="font-size:13px;line-height:1.6;color:var(--text-secondary)">This will sign out <strong>${r}</strong> immediately. The user will need to sign in again.</p>`,actions:[{label:"Cancel",variant:"ghost"},{label:"Revoke",variant:"danger",action:()=>{o.style.transition="opacity 200ms, transform 200ms",o.style.opacity="0",o.style.transform="translateX(8px)",setTimeout(()=>o.remove(),220),e(`Revoked: ${r}`,{variant:"success"})}}]})})}),document.querySelectorAll(".danger-row .btn").forEach(o=>{const r=o.textContent.trim().toLowerCase();"export"===r?o.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation();const o=n(),r=new Blob([JSON.stringify({exportedAt:(new Date).toISOString(),settings:o},null,2)],{type:"application/json"}),a=URL.createObjectURL(r),i=document.createElement("a");i.href=a,i.download="gentelella-export.json",document.body.appendChild(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(a),0),e("Workspace export ready",{variant:"success"})}):"transfer"===r?o.addEventListener("click",o=>{o.preventDefault(),o.stopPropagation(),t({title:"Transfer workspace ownership",body:'\n <p style="font-size:13px;line-height:1.6;color:var(--text-secondary);margin-bottom:14px">Transfer ownership to another team member. You\'ll keep your account but lose admin privileges.</p>\n <div class="form-group">\n <label class="form-label" for="transfer-to">Transfer to</label>\n <select id="transfer-to" class="form-control">\n <option>Sarah Kowalski (sarah@example.com)</option>\n <option>Michael Reyes (michael@example.com)</option>\n <option>Emily Wang (emily@example.com)</option>\n </select>\n </div>\n ',actions:[{label:"Cancel",variant:"ghost"},{label:"Transfer",variant:"danger",action:t=>{const o=t.body.querySelector("#transfer-to").value;e(`Transfer initiated to ${o}`,{variant:"success"})}}]})}):"delete"===r&&o.addEventListener("click",o=>{o.preventDefault(),o.stopPropagation(),t({title:"Delete account permanently?",body:'\n <p style="font-size:13px;line-height:1.6;color:var(--text-secondary);margin-bottom:14px">This will <strong>permanently delete</strong> your account, all projects, and all associated data. This action cannot be undone.</p>\n <div class="form-group">\n <label class="form-label" for="confirm-delete">Type <code style="background:var(--bg-surface-secondary);padding:1px 4px;border-radius:3px">DELETE</code> to confirm</label>\n <input id="confirm-delete" class="form-control" autocomplete="off">\n </div>\n ',actions:[{label:"Cancel",variant:"ghost"},{label:"Delete account",variant:"danger",action:t=>{if("DELETE"!==t.body.querySelector("#confirm-delete").value)return e("Type DELETE to confirm",{variant:"error"}),!1;e("Account deletion initiated",{variant:"error"})}}]})})}),function(){const o=[...document.querySelectorAll("#team .btn-primary")].find(e=>e.textContent.trim().toLowerCase().includes("invite"));o&&o.addEventListener("click",o=>{o.preventDefault(),o.stopPropagation(),t({title:"Invite team member",body:'\n <div class="form-group">\n <label class="form-label" for="invite-email">Email</label>\n <input type="email" id="invite-email" class="form-control" placeholder="colleague@example.com" autocomplete="off">\n </div>\n <div class="form-group">\n <label class="form-label" for="invite-role">Role</label>\n <select id="invite-role" class="form-control">\n <option>Member</option>\n <option>Admin</option>\n <option>Designer</option>\n <option>Engineer</option>\n <option>PM</option>\n </select>\n </div>\n ',actions:[{label:"Cancel",variant:"ghost"},{label:"Send invite",variant:"primary",action:t=>{const o=t.body.querySelector("#invite-email").value.trim();if(!o)return e("Add an email address",{variant:"error"}),!1;e(`Invite sent to ${o}`,{variant:"success"})}}]})}),document.querySelectorAll("#team .session-row .btn").forEach(o=>{"manage"===o.textContent.trim().toLowerCase()&&o.addEventListener("click",n=>{n.preventDefault(),n.stopPropagation();const r=o.closest(".session-row"),a=r?.querySelector(".device")?.textContent.trim()||"Member",i=r?.querySelector(".meta")?.textContent.trim()||"";t({title:`Manage ${a}`,body:`\n <p style="font-size:13px;line-height:1.6;color:var(--text-secondary);margin-bottom:14px">${i}</p>\n <div class="form-group">\n <label class="form-label">Role</label>\n <select class="form-control" id="manage-role">\n <option>Member</option><option>Admin</option><option>Designer</option><option>Engineer</option><option>PM</option>\n </select>\n </div>\n `,actions:[{label:"Remove",variant:"danger",action:()=>{r.remove(),e(`${a} removed from team`)}},{label:"Cancel",variant:"ghost"},{label:"Save",variant:"primary",action:t=>{const o=t.body.querySelector("#manage-role").value;e(`${a} → ${o}`,{variant:"success"})}}]})})})}())}export{i as initSettings};