Files
github-actions[bot] 70d35bab31
Merge-upstream / merge (push) Canceled after 0s
🗽 Sync 2026-09-13 02:49:28
2026-09-13 02:49:28 +08:00

1 line
16 KiB
JavaScript

"use strict";"require baseclass";"require ui";const ICON_MAP={status:"activity",system:"settings",network:"network",services:"layers",nas:"hard-drive",control:"sliders-horizontal",vpn:"shield",docker:"container",statistics:"chart-bar",nlbw:"gauge",asterisk:"phone",logout:"log-out",default:"layout-dashboard"},CACHE_KEY="shadcn.sidebar.cache",RECENTS_KEY="shadcn.palette.recents";return baseclass.extend({__init__(){ui.menu.load().then(e=>{this.renderSidebarChrome(),this.render(e),this.initUciIndicator(),this.cacheSidebar(),window.addEventListener("pagehide",()=>this.cacheSidebar()),document.dispatchEvent(new Event("shadcn-sidebar-ready"))})},cacheSidebar(){if(window.shadcnSuppressSidebarCache)return;const e=document.getElementById("sidebar"),t=document.getElementById("sidebar-nav");if(e&&t)try{sessionStorage.setItem(CACHE_KEY,JSON.stringify({v:1,lang:document.documentElement.lang||"",html:e.innerHTML,scroll:t.scrollTop||0}))}catch(e){}},_mediaBase(){const e=document.documentElement.getAttribute("data-shadcn-media"),t=document.getElementById("sidebar"),a=t&&t.getAttribute("data-media");return String(e||a||"/luci-static/shadcn").replace(/\/$/,"")},_sectionIcon(e,t){const a=String(e||"").toLowerCase(),s=ICON_MAP[a]||ICON_MAP.default;return this._iconFile(s,t)},_isLogoutMenuItem(e){const t=String(e&&null!=e.name?e.name:"").toLowerCase();return"logout"===t||t.endsWith("/logout")},_iconFile(e,t){const a=this._mediaBase();return E("img",{src:`${a}/icons/${e}.svg`,width:String(t),height:String(t),alt:"",loading:"lazy",class:"shadcn-icon"})},_resolveMenuBranch(e){const t=L.env.dispatchpath||[],a=L.env.requestpath||[],s=ui.menu.getChildren(e);let n=a.length&&a[0]||t.length&&t[0]||"admin",i=null;for(let e=0;e<s.length;e++)if(s[e].name===n){i=s[e];break}return i||1!==s.length||(i=s[0],n=i.name),i||(i=e),{branch:i,branchUrl:i.name||n}},renderSidebarChrome(){const e=document.getElementById("sidebar");if(!e)return;if("1"===e.getAttribute("data-shadcn-built")){const t=e.querySelector(".sidebar-brand-text"),a=e.getAttribute("data-hostname");return void(t&&a&&t.textContent!==a&&(t.textContent=a))}e.setAttribute("data-shadcn-built","1");const t=this._mediaBase(),a=e.getAttribute("data-hostname")||"Shadcn";for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(E("div",{class:"sidebar-header"},[E("a",{class:"sidebar-brand",href:"/"},[E("img",{class:"sidebar-logo",src:`${t}/images/logo.svg`,alt:"Shadcn",width:"24",height:"24"}),E("span",{class:"sidebar-brand-text"},[a])]),E("button",{id:"sidebar-toggle-btn",class:"sidebar-toggle",type:"button","aria-label":_("Navigation")},[E("span",{class:"icon-collapse"},[this._iconFile("panel-left-close",16)]),E("span",{class:"icon-expand"},[this._iconFile("panel-left-open",16)])])])),e.appendChild(E("nav",{class:"sidebar-nav",id:"sidebar-nav"})),e.appendChild(E("div",{class:"sidebar-footer",id:"sidebar-footer",hidden:""}))},render(e){const{branch:t,branchUrl:a}=this._resolveMenuBranch(e);this.tree=e,this.branch=t,this.branchUrl=a,this.renderSidebarNav(t,a),this.renderBreadcrumb(t,a),this.initPalette(t,a),this.renderTabs(e)},renderTabs(e){const t=L.env.dispatchpath||[],a=document.getElementById("tabmenu");a&&(a.innerHTML="",a.style.display="none");let s=e,n="";if(t.length>=3){for(var i=0;i<3&&s;i++){const e=t[i];if(!s.children||!s.children[e])break;s=s.children[e],n=n+(n?"/":"")+e}s&&this.renderTabMenu(s,n)}},syncRoute(){if(!this.tree)return;const e=document.getElementById("sidebar");if(e){e.querySelectorAll(".active").forEach(e=>e.classList.remove("active"));const t=new URL(L.url(...(L.env.dispatchpath||[]).slice(0,3)),location.href).pathname;let a=null,s=-1;if(e.querySelectorAll("a.sidebar-sub-link, a.sidebar-nav-parent, a.sidebar-logout").forEach(e=>{const n=e.pathname;(t===n||t.startsWith(n+"/"))&&n.length>s&&(a=e,s=n.length)}),a){const t=a.closest(".sidebar-sub-item");if(t){t.classList.add("active");const s=a.closest(".sidebar-accordion-item");s&&(s.classList.add("active"),"true"!==e.getAttribute("data-collapsed")&&e.querySelectorAll(".sidebar-accordion-item").forEach(e=>e.setAttribute("data-open",e===s?"true":"false")))}else a.classList.contains("sidebar-logout")?a.classList.add("active"):a.closest(".sidebar-nav-item")?.classList.add("active")}}this.renderBreadcrumb(this.branch,this.branchUrl),this.renderTabs(this.tree)},closeSurfaces(){this.closePalette(),window.ShadcnSidebar?.closeDrawer?.(),window.ShadcnSidebar?._hideCollapsedPopover?.()},renderSidebarNav(e,t){const a=document.getElementById("sidebar-nav"),s=document.getElementById("sidebar-footer");if(!a)return;const n=ui.menu.getChildren(e),i=L.env.dispatchpath||[],r="1"===document.getElementById("sidebar")?.getAttribute("data-shadcn-restored"),l=r?Array.from(a.querySelectorAll('.sidebar-accordion-item[data-open="true"]'),e=>e.getAttribute("data-section")):null,c=r?a.scrollTop:0;a.innerHTML="",s&&(s.innerHTML="",s.hidden=!0),n.forEach(e=>{if(this._isLogoutMenuItem(e)&&s){const a=i[1]==e.name,n=this._sectionIcon(e.name,18);return s.appendChild(E("a",{class:"sidebar-logout"+(a?" active":""),href:L.url(t,e.name),"aria-label":_(e.title),onclick:()=>{window.ShadcnSidebar&&window.ShadcnSidebar.closeDrawer&&window.ShadcnSidebar.closeDrawer()}},[E("span",{class:"sidebar-icon","aria-hidden":"true"},[n]),E("span",{class:"sidebar-label"},[_(e.title)])])),void(s.hidden=!1)}const n=ui.menu.getChildren(e),r=i[1]==e.name,l=this._sectionIcon(e.name,18);if(0===n.length)return void a.appendChild(E("div",{class:"sidebar-nav-item"+(r?" active":"")},[E("a",{class:"sidebar-nav-parent no-sub",href:L.url(t,e.name),onclick:()=>{window.ShadcnSidebar&&window.ShadcnSidebar.closeDrawer&&window.ShadcnSidebar.closeDrawer()}},[E("span",{class:"sidebar-icon","aria-hidden":"true"},[l]),E("span",{class:"sidebar-label"},[_(e.title)])])]));const c=E("div",{class:"sidebar-accordion-item"+(r?" active":""),"data-open":r?"true":"false","data-section":e.name},[E("button",{class:"sidebar-nav-parent",type:"button"},[E("span",{class:"sidebar-icon","aria-hidden":"true"},[l]),E("span",{class:"sidebar-label"},[_(e.title)]),E("span",{class:"sidebar-chevron","aria-hidden":"true"},[this._iconFile("chevron-down",18)])]),E("div",{class:"sidebar-accordion-sub"},[E("ul",{class:"sidebar-sub-list"},n.map(a=>{const s=r&&i[2]==a.name;return E("li",{class:"sidebar-sub-item"+(s?" active":"")},[E("a",{class:"sidebar-sub-link",href:L.url(t,e.name,a.name),onclick:()=>{window.ShadcnSidebar&&window.ShadcnSidebar.closeDrawer&&window.ShadcnSidebar.closeDrawer()}},[_(a.title)])])}))])]);a.appendChild(c)}),r&&(a.querySelectorAll(".sidebar-accordion-item").forEach(e=>{e.setAttribute("data-open",l.includes(e.getAttribute("data-section"))?"true":"false")}),a.scrollTop=c)},initPalette(e,t){const a=document.getElementById("cmdk-trigger");if(!a||this.palIndex)return;this.palIndex=[],ui.menu.getChildren(e).forEach(e=>{const a=ui.menu.getChildren(e);0!==a.length?a.forEach(a=>{this.palIndex.push({title:_(a.title),group:_(e.title),icon:e.name,path:`${t}/${e.name}/${a.name}`,href:L.url(t,e.name,a.name),isLogout:!1})}):this.palIndex.push({title:_(e.title),group:null,icon:e.name,path:`${t}/${e.name}`,href:L.url(t,e.name),isLogout:this._isLogoutMenuItem(e)})}),this.palModes=[{mode:"light",title:_("Light Mode"),iconFile:"sun"},{mode:"dark",title:_("Dark Mode"),iconFile:"moon"},{mode:"device",title:_("Automatic"),iconFile:"monitor"}];const s=/Mac|iP(ad|hone|od)/.test(navigator.platform),n=a.querySelector(".cmdk-trigger-key");n&&(n.textContent=s?"⌘K":"Ctrl+K",n.hidden=!1),a.setAttribute("aria-keyshortcuts",s?"Meta+K":"Control+K"),a.addEventListener("click",()=>this.openPalette()),document.addEventListener("keydown",e=>{e.isComposing||229===e.keyCode||(!(s?e.metaKey:e.ctrlKey)||e.altKey||e.shiftKey||"k"!==(e.key||"").toLowerCase()?"Escape"===e.key&&this.palOverlay&&!this.palOverlay.hidden&&this.closePalette():(e.preventDefault(),this.palOverlay&&!this.palOverlay.hidden?this.closePalette():this.openPalette()))})},openPalette(){this.palOverlay||this._buildPalette();const e=document.activeElement;this.palReturn=e&&e!==document.body&&!this.palOverlay.contains(e)?e:null,this.palOverlay.hidden=!1,this._renderPalette(),this.palInput.focus(),this.palInput.select()},closePalette(){if(!this.palOverlay||this.palOverlay.hidden)return;this.palOverlay.hidden=!0,this.palInput.value="";const e=this.palReturn||document.getElementById("cmdk-trigger");this.palReturn=null,e&&e.isConnected&&e.focus()},_buildPalette(){this.palInput=E("input",{class:"cmdk-input",type:"text",placeholder:_("Type to filter…"),"aria-label":_("Type to filter…"),role:"combobox","aria-expanded":"true","aria-controls":"cmdk-list","aria-autocomplete":"list",autocomplete:"off",spellcheck:"false",enterkeyhint:"go"}),this.palInput.addEventListener("input",()=>this._renderPalette()),this.palInput.addEventListener("keydown",e=>{e.isComposing||229===e.keyCode||("ArrowDown"===e.key||"ArrowUp"===e.key?(e.preventDefault(),this._palMove("ArrowDown"===e.key?1:-1)):"Enter"===e.key&&(e.preventDefault(),this.palList.querySelector(".is-selected")?.click()))});const e=E("button",{class:"cmdk-clear",type:"button","aria-label":_("Clear")});e.addEventListener("click",()=>{this.palInput.value="",this._renderPalette(),this.palInput.focus()});const t=E("button",{class:"cmdk-cancel",type:"button"},[_("Cancel")]);t.addEventListener("click",()=>this.closePalette()),this.palList=E("div",{id:"cmdk-list",class:"cmdk-list",role:"listbox","aria-label":_("Navigation")}),this.palList.addEventListener("mousemove",e=>{const t=e.target?.closest?.(".cmdk-row");t&&!t.classList.contains("is-selected")&&this._palSelect(t)});const a=E("div",{class:"cmdk-footer"},[E("span",{class:"cmdk-hint"},[E("kbd",{},["↑"]),E("kbd",{},["↓"]),_("Select")]),E("span",{class:"cmdk-hint"},[E("kbd",{},["↵"]),_("OK")]),E("span",{class:"cmdk-hint"},[E("kbd",{},[">"]),_("Command")]),E("span",{class:"cmdk-hint cmdk-hint-close"},[E("kbd",{},["esc"]),_("Close")])]),s=E("div",{class:"cmdk-panel",role:"dialog","aria-modal":"true","aria-label":_("Navigation")},[E("div",{class:"cmdk-inputrow"},[this.palInput,e,t]),this.palList,a]);s.addEventListener("keydown",a=>{if("Tab"!==a.key)return;const s=[this.palInput,e,t].filter(e=>null!==e.offsetParent);if(!s.length)return;a.preventDefault();const n=s.indexOf(document.activeElement);s[(n+(a.shiftKey?-1:1)+s.length)%s.length].focus()}),this.palOverlay=E("div",{id:"cmdk-overlay",hidden:""},[s]),this.palOverlay.addEventListener("pointerdown",e=>{e.target===this.palOverlay&&this.closePalette()}),document.body.appendChild(this.palOverlay)},_palReadRecents(){try{const e=JSON.parse(localStorage.getItem(RECENTS_KEY));return Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}catch(e){return[]}},_palRecordRecent(e){try{localStorage.setItem(RECENTS_KEY,JSON.stringify([e,...this._palReadRecents().filter(t=>t!==e)]))}catch(e){}},_palBrowsePages(){const e=this._palReadRecents().filter(e=>this.palIndex.some(t=>t.path===e&&!t.isLogout)),t=t=>{const a=e.indexOf(t.path);return a<0?0:e.length-a};return this.palIndex.filter(e=>!e.isLogout).sort((e,a)=>t(a)-t(e))},_renderPalette(){const e=this.palInput.value.trimStart(),t=e.startsWith(">"),a=(t?e.slice(1):e).trim().toLowerCase(),s=localStorage.getItem("shadcn.theme")||"device";let n;if(a){const e=[];(t?this.palIndex.filter(e=>e.isLogout):this.palIndex).forEach(t=>{const s=this._palScore(a,t.title,t.path,t.group);s&&e.push({score:s.score,node:this._palPageRow(t,s.ranges,s.groupRanges)})}),this.palModes.forEach(t=>{const n=this._palScore(a,t.title,`theme ${t.mode}`);n&&e.push({score:n.score,node:this._palModeRow(t,s,n.ranges)})}),e.sort((e,t)=>t.score-e.score),n=e.map(e=>e.node)}else if(n=[],t||this._palBrowsePages().forEach(e=>n.push(this._palPageRow(e,null))),n.push(E("div",{class:"cmdk-group",role:"presentation"},[_("Design")])),this.palModes.forEach(e=>n.push(this._palModeRow(e,s,null))),t){const e=this.palIndex.find(e=>e.isLogout);e&&n.push(this._palPageRow(e,null))}n.length||(n=[E("div",{class:"cmdk-empty",role:"presentation"},[_("No entries available")])]),this.palList.replaceChildren(...n),this.palList.scrollTop=0;const i=this.palList.querySelectorAll(".cmdk-row");i.forEach((e,t)=>e.id=`cmdk-row-${t}`),i.length?this._palSelect(i[0]):this.palInput.removeAttribute("aria-activedescendant")},_palPageRow(e,t,a){const s=E("a",{class:"cmdk-row",href:e.href,role:"option","aria-selected":"false",tabindex:"-1"},[this._sectionIcon(e.icon,15),E("span",{class:"cmdk-title"},this._palMark(e.title,t)),e.group?E("span",{class:"cmdk-group-name"},this._palMark(e.group,a)):""]);return e.isLogout?s.addEventListener("click",()=>{window.shadcnSuppressSidebarCache=!0;try{sessionStorage.removeItem("shadcn.sidebar.cache")}catch(e){}}):s.addEventListener("click",()=>this._palRecordRecent(e.path)),s},_palModeRow(e,t,a){const s=t===e.mode,n=E("button",{class:"cmdk-row cmdk-cmd",type:"button",role:"option","aria-selected":"false",tabindex:"-1","data-mode":e.mode},[this._iconFile(e.iconFile,15),E("span",{class:"cmdk-title"},this._palMark(e.title,a)),s?E("span",{class:"cmdk-check","aria-hidden":"true"}):""]);return n.addEventListener("click",()=>{window.ShadcnSidebar?.applyTheme?.(e.mode),this._renderPalette(),this.palInput.focus();const t=this.palList.querySelector(`.cmdk-row[data-mode="${e.mode}"]`);t&&this._palSelect(t)}),n},_palScore(e,t,a,s){const n=this._palSub(e,t.toLowerCase());if(n)return{score:n.score+10,ranges:n.ranges,groupRanges:null};const i=s?this._palSub(e,s.toLowerCase()):null;if(i)return{score:i.score+5,ranges:null,groupRanges:i.ranges};const r=this._palSub(e,String(a||"").toLowerCase());return r?{score:r.score,ranges:null,groupRanges:null}:null},_palSub(e,t){let a=0,s=0,n=0;const i=[];for(let r=0;r<e.length;r++){const l=e[r];if(" "===l){n=0;continue}const c=t.indexOf(l,a);if(c<0)return null;n=c===a&&r>0?n+1:1,s+=n+(0===c||" "===t[c-1]||"/"===t[c-1]?3:0),i.length&&i[i.length-1][1]===c?i[i.length-1][1]=c+1:i.push([c,c+1]),a=c+1}return{score:s-.02*t.length,ranges:i}},_palMark(e,t){if(!t||e.toLowerCase().length!==e.length)return[e];const a=[];let s=0;return t.forEach(([t,n])=>{t>s&&a.push(e.slice(s,t)),a.push(E("mark",{},[e.slice(t,n)])),s=n}),s<e.length&&a.push(e.slice(s)),a},_palSelect(e){const t=this.palList.querySelector(".is-selected");t&&(t.classList.remove("is-selected"),t.setAttribute("aria-selected","false")),e.classList.add("is-selected"),e.setAttribute("aria-selected","true"),this.palInput.setAttribute("aria-activedescendant",e.id)},_palMove(e){const t=[...this.palList.querySelectorAll(".cmdk-row")];if(!t.length)return;const a=t.findIndex(e=>e.classList.contains("is-selected")),s=t[(a+e+t.length)%t.length];this._palSelect(s),s.scrollIntoView({block:"nearest"})},renderBreadcrumb(e,t){const a=document.getElementById("topbar-breadcrumb");if(!a)return;a.innerHTML="";const s=L.env.dispatchpath||[],n=s[1]||"",i=s[2]||"",r=(e.children||{})[n],l=r&&r.children?r.children[i]:null;r&&a.appendChild(E("span",{class:"breadcrumb-item"},[_(r.title)])),l&&(a.appendChild(E("span",{class:"breadcrumb-sep"},[this._iconFile("chevron-right",14)])),a.appendChild(E("span",{class:"breadcrumb-item active"},[_(l.title)])))},renderTabMenu(e,t,a){const s=document.getElementById("tabmenu");if(!s)return;const n=(a||0)+1,i=E("ul",{class:"tabs"}),r=ui.menu.getChildren(e);let l=null;if(0===r.length)return;const c=L.env.dispatchpath||[];return r.forEach(e=>{const a=c[n+2]==e.name,s=a?" active":"",r="tabmenu-item-%s %s".format(e.name,s);i.appendChild(E("li",{class:r},[E("a",{href:L.url(t,e.name)},[_(e.title)])])),a&&(l=e)}),s.appendChild(i),s.style.display="",l&&this.renderTabMenu(l,t+"/"+l.name,n),i},initUciIndicator(){const e=ui.changes&&ui.changes.setIndicator;e&&(ui.changes.setIndicator=function(t){e.call(this,t),document.querySelectorAll('[data-indicator="uci-changes"]').forEach(e=>{e.setAttribute("data-count",t||0)})})}});