1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2026-03-21 17:33:10 +00:00
Classworks/assets/index-D3RRUIYd.js

7 lines
72 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-_6IQhlPZ.js","./vendor-vuetify-ChAgIwn2.js","./vendor-vue-H0jQBZ7T.js","./index-CXKF55qP.css","./dataProvider-BwUtbSl1.js","./vendor-utils-DDRLRfsI.js","./serverRotation-BGVL0kta.js","./MessageLog-DNZPN4Qf.js","./VAppBarTitle-Cvegbk0-.js","./VAppBarTitle-CczdD-Q2.css","./MessageLog-BGkFwivK.css","./RandomPicker-D4SIlUxw.js","./VTextField-CuXGbmmC.js","./autofocus-BrMOVHY_.js","./autofocus-D1VSzmed.css","./VTooltip-C2Bprg_f.js","./VTooltip-DNuxJ6UK.css","./VChip-Veb3ShEh.js","./VChip-Dmz_1Lnv.css","./RandomPicker-CFzd4pLS.css","./FloatingToolbar-Hmj4Cwyb.js","./VSheet-U4CNWLuy.js","./VSheet-DxsDksIw.css","./VDatePicker-cLZU-Ed4.js","./VBadge-VwKD9DDf.js","./VBadge-BGqjJnM0.css","./VDatePicker-X4Ryb5EN.css","./FloatingToolbar-DbFL4asY.css","./ChatWidget-CC4arZYT.js","./socketClient-Cb2FghxN.js","./vendor-socket-CyTcV1HU.js","./soundList-BZnE47k0.js","./deviceEvents-BnDFIf8a.js","./VRow-WkEz3xRr.js","./VRow-D2ArqUC2.css","./VPagination-BiSMksGW.js","./VPagination-BF2MZmld.css","./VTextarea-CCCqy4pz.js","./VTextarea-_xVwaw_z.css","./ChatWidget-DT8kwi-O.css","./HomeworkEditDialog-CzJk0Rhv.js","./VAlert-D9G_9owC.js","./VAlert-D_OX1cfW.css","./HomeworkEditDialog-BYeU7sR3.css","./InitServiceChooser-DBAmZLOu.js","./VExpansionPanels-rcXmB3Pp.js","./VExpansionPanels-kEj4ZJQK.css","./InitServiceChooser-CJilcHuq.css","./StudentNameManager-CKU0cAHn.js","./VAutocomplete-lO4hforf.js","./VSelect-ANRyd3L-.js","./VCheckboxBtn-DCkgbmVP.js","./VSwitch-CdpUb5tZ.js","./VSwitch-C87GkfUP.css","./VSelect-DHZViySU.css","./VAutocomplete-Ygy_KjMW.css","./VCombobox-D6SxB9Ke.js","./VCombobox-r6cc1Iy_.css","./StudentNameManager-tn0RQdqM.css","./UrgentTestDialog-DpliVwT_.js","./VContainer-Bg8RevuO.js","./VContainer-B1KSavhG.css","./VForm-Cskwow1F.js","./VCheckbox-DhU7h1Z3.js","./VCheckbox-ZL-u1kGB.css","./UrgentTestDialog-BdqUELUV.css","./AttendanceSidebar-DFGkatIT.js","./AttendanceManagementDialog-CCmX9Ffv.js","./AttendanceManagementDialog-B_Clb251.css","./PwaInstallCard-CTQnZjV3.js","./ExamScheduleCard-D_oQZ_gl.js","./ExamScheduleCard-B03q7hf4.css","./ExamConfigEditor-DzELjE-Y.js","./VSkeletonLoader-CfCoJRep.js","./VSkeletonLoader-C11ZEozu.css","./ExamConfigEditor-DV8lOLSp.css"])))=>i.map(i=>d[i]);
import{_ as O,V as re,c as N,d as _,e as T,S as H,w as te,g as k,f as E,h as R,i as $,j as X,k as Z,l as D,n as le,o as V,p as j,q as M,r as Se,s as be,t as xe,v as se,x as F}from"./index-_6IQhlPZ.js";import{X as l,_ as g,j as i,N as A,S as m,a5 as Ce,a6 as _e,a7 as Te,Y as y,Z as r,k as f,F as b,a2 as C,n as U,$ as S,a1 as h,U as ae,e as Ee,a3 as x,a8 as I}from"./vendor-vue-H0jQBZ7T.js";import{d as L,a as Ie,k as Ne}from"./dataProvider-BwUtbSl1.js";import{a as J,g as de}from"./vendor-utils-DDRLRfsI.js";import{V as z}from"./VChip-Veb3ShEh.js";import{a0 as Q}from"./vendor-vuetify-ChAgIwn2.js";import{V as ce}from"./VContainer-Bg8RevuO.js";import{g as Ae,j as ne,o as Ve,a as oe,l as Re}from"./socketClient-Cb2FghxN.js";import{c as Oe}from"./deviceEvents-BnDFIf8a.js";import{V as Le,a as Pe}from"./VAppBarTitle-Cvegbk0-.js";import{V as ze,a as je}from"./VRow-WkEz3xRr.js";import{V as Me}from"./VAlert-D9G_9owC.js";import{V as Ue}from"./VTooltip-C2Bprg_f.js";const Be={__name:"AsyncLoadingPlaceholder",props:{height:{type:String,default:"120px"}},setup(e){return(t,s)=>(l(),g("div",{class:"async-loading-placeholder d-flex justify-center align-center",style:A({minHeight:e.height})},[i(re,{indeterminate:"",color:"primary",size:"28",width:"2"})],4))}},K=O(Be,[["__scopeId","data-v-2d12e0c7"]]),Fe={name:"RelativeTimeDisplay",props:{time:{type:[String,Date,Number],required:!0}},computed:{displayTime(){if(!this.time)return"";const e=new Date(this.time),t=new Date,s=new Date(e.getFullYear(),e.getMonth(),e.getDate()),o=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=s.getTime()-o.getTime(),n=Math.round(a/(1e3*60*60*24));if(n===0)return"今天";if(n===1)return"明天";if(n===2)return"后天";if(n===-1)return"昨天";if(n===-2)return"前天";const c=o.getDay()||7,p=new Date(o);p.setDate(o.getDate()-c+1);const v=new Date(o);if(v.setDate(o.getDate()+(7-c)),s>=p&&s<=v)return["周日","周一","周二","周三","周四","周五","周六"][e.getDay()];const d=e.getMonth()+1,w=e.getDate();return`${d}${w}`}}};function He(e,t,s,o,a,n){return l(),g("span",null,m(n.displayTime),1)}const ue=O(Fe,[["render",He]]),ee=Ce("exam",{state:()=>({examList:[],exams:{},loadingList:!1,loadingDetails:{}}),actions:{async fetchExamList(){if(!this.loadingList){this.loadingList=!0;try{const e=await L.loadData("es_list");Array.isArray(e)?this.examList=e:this.examList=[]}catch(e){console.error("Failed to load exam list:",e)}finally{this.loadingList=!1}}},async fetchExam(e){if(this.exams[e])return this.exams[e];if(!this.loadingDetails[e]){this.loadingDetails[e]=!0;try{const t=await L.loadData(`es_${e}`);return t&&(this.exams[e]=t),t}catch(t){console.error(`Failed to load exam details for ${e}:`,t)}finally{this.loadingDetails[e]=!1}}},async getUpcomingExams(e=25){await this.fetchExamList();const t=[],s=new Date,o=new Date(s.getTime()+2*24*60*60*1e3),a=this.examList.slice(0,e);for(const n of a){let c=this.exams[n.id];c||(c=await this.fetchExam(n.id)),c&&c.examInfos&&Array.isArray(c.examInfos)&&c.examInfos.some(v=>{const d=new Date(v.start);return d>=s&&d<=o})&&t.push({id:n.id,...c})}return t}}}),$e={name:"ConciseExamCard",components:{RelativeTimeDisplay:ue},props:{examId:{type:String,required:!0},contentStyle:{type:Object,default:()=>({})},readonly:{type:Boolean,default:!1}},computed:{...Te(ee,["exams","loadingDetails"]),exam(){return this.exams[this.examId]},loading(){return this.loadingDetails[this.examId]},groupedExamInfos(){if(!this.exam||!this.exam.examInfos)return[];const e=[...this.exam.examInfos].sort((o,a)=>new Date(o.start)-new Date(a.start)),t=[];let s=null;return e.forEach(o=>{const n=new Date(o.start).toDateString();(!s||s.key!==n)&&(s={key:n,date:o.start,infos:[]},t.push(s)),s.infos.push(o)}),t}},mounted(){this.fetchExam(this.examId)},methods:{..._e(ee,["fetchExam"]),formatTimeOnly(e){if(!e)return"";try{const t=new Date(e),s=t.getHours().toString().padStart(2,"0"),o=t.getMinutes().toString().padStart(2,"0");return`${s}:${o}`}catch{return""}},isPast(e){return e?new Date(e)<new Date:!1}}},Ke={class:"text-truncate"},We={key:0,class:"d-flex justify-center align-center py-4"},Ge={key:1,class:"d-flex flex-column"},qe={class:"text-subtitle-2 font-weight-bold text-primary mb-1"},Je={class:"font-weight-bold mr-2",style:{"font-size":"1.1em"}},Ye={class:"font-weight-medium text-grey-darken-2",style:{"font-size":"0.85em"}},Xe={key:2,class:"text-center text-caption text-grey py-2"};function Ze(e,t,s,o,a,n){const c=ue;return l(),y(T,{border:"",class:"fill-height d-flex flex-column cursor-pointer hover-elevation",elevation:"0",onClick:t[0]||(t[0]=p=>e.$emit("click"))},{default:r(()=>[i(N,{class:"d-flex align-center py-2 px-3 bg-primary-lighten-5 text-subtitle-1 font-weight-bold"},{default:r(()=>{var p;return[f("span",Ke,m(((p=n.exam)==null?void 0:p.examName)||"加载中..."),1)]}),_:1}),i(_,{class:"flex-grow-1 pa-4 overflow-y-auto",style:A(s.contentStyle)},{default:r(()=>[n.loading?(l(),g("div",We,[i(re,{indeterminate:"",size:"24",color:"primary"})])):n.exam?(l(),g("div",Ge,[(l(!0),g(b,null,C(n.groupedExamInfos,(p,v)=>(l(),g("div",{key:v,class:"mb-3"},[f("div",qe,[i(c,{time:p.date},null,8,["time"])]),(l(!0),g(b,null,C(p.infos,(d,w)=>(l(),g("div",{key:w,class:U(["d-flex align-center justify-space-between py-1 border-b-sm",{"border-none":w===p.infos.length-1,"text-grey":n.isPast(d.end)}])},[f("div",Je,m(d.name),1),f("div",Ye,m(n.formatTimeOnly(d.start))+" - "+m(n.formatTimeOnly(d.end)),1)],2))),128))]))),128))])):(l(),g("div",Xe,"无法加载"))]),_:1},8,["style"])]),_:1})}const he=O($e,[["render",Ze],["__scopeId","data-v-33424f55"]]),Qe=["6IO4","5Lmz","6JCd6I6J","5rer","5aW4"],et=Qe.map(e=>de.decode(e)),ie=.75,tt={name:"HitokotoCard",data(){return{enabled:!1,refreshInterval:60,kvConfig:{sources:["zhaoyu"],sensitiveWords:[]},sentence:"",author:"",origin:"",loading:!1,timer:null,unwatch:null,fontSize:28}},computed:{contentStyle(){return{"font-size":`${this.fontSize*ie}px`,"white-space":"pre-wrap","line-height":"1.6","text-align":"left"}},authorStyle(){return{"font-size":`${this.fontSize*ie*.6}px`,"text-align":"left"}}},async mounted(){this.loadLocalSettings(),await this.loadKvSettings(),this.fetchSentence(),this.startTimer(),this.unwatch=te(()=>{this.loadLocalSettings(),this.startTimer()})},beforeUnmount(){this.stopTimer(),this.unwatch&&this.unwatch()},methods:{loadLocalSettings(){this.enabled=H.getSetting("hitokoto.enabled"),this.refreshInterval=H.getSetting("hitokoto.refreshInterval"),this.fontSize=H.getSetting("font.size")},async loadKvSettings(){try{const e=await L.loadData("sentence-info");let t=e;e&&e.data&&(t=e.data),t&&(this.kvConfig={sources:Array.isArray(t.sources)&&t.sources.length>0?t.sources:["zhaoyu"],sensitiveWords:t.sensitiveWords?t.sensitiveWords.split(/[,]/).map(s=>s.trim()).filter(s=>s):[],jinrishiciToken:t.jinrishiciToken})}catch(e){console.error("Failed to load sentence-info",e)}},startTimer(){this.timer&&clearInterval(this.timer),this.refreshInterval>0&&(this.timer=setInterval(this.fetchSentence,this.refreshInterval*1e3))},stopTimer(){this.timer&&clearInterval(this.timer)},async fetchSentence(){if(!this.loading){this.loading=!0;try{const e=this.kvConfig.sources,t=e[Math.floor(Math.random()*e.length)];let s=null,o="",a="",n="";if(t==="hitokoto")s=(await J.get("https://v1.hitokoto.cn/")).data,o=s.hitokoto,a=s.from_who,n=s.from;else if(t==="zhaoyu"){const c=await J.get("https://hub.saintic.com/openservice/sentence/all.json");c.data.success&&(s=c.data.data,o=s.sentence||s.content||s.name,a=s.author,n=s.name||s.origin)}else if(t==="jinrishici")if(this.kvConfig.jinrishiciToken){const c=await J.get("https://v2.jinrishici.com/one.json?client=npm-sdk/1.0&X-User-Token="+encodeURIComponent(this.kvConfig.jinrishiciToken),{});c.data.status==="success"&&(s=c.data.data,o=s.content,a=s.origin.author,n=s.origin.title)}else return console.warn("Jinrishici token missing. Please enable it in settings to generate a token."),this.loading=!1,this.fetchSentence();if(o){if([...et,...this.kvConfig.sensitiveWords].some(v=>v&&o.includes(v)))return this.loading=!1,this.fetchSentence();this.sentence=o,this.author=a||"",this.origin=n||"未知"}}catch(e){console.error("Failed to fetch sentence",e),this.sentence="获取失败",this.author="",this.origin=""}finally{this.loading=!1}}}}},st={key:0,class:"mr-2"},at={key:1};function nt(e,t,s,o,a,n){return l(),y(T,{class:"hitokoto-card",elevation:"2",border:"",rounded:"xl",loading:a.loading,height:"100%",onClick:n.fetchSentence},{default:r(()=>[i(_,{class:"pa-6 d-flex flex-column justify-center",style:{height:"100%"}},{default:r(()=>[f("div",{class:"font-weight-medium mb-4 serif-font",style:A(n.contentStyle)},m(a.sentence),5),f("div",{class:"text-medium-emphasis serif-font",style:A(n.authorStyle)},[a.author?(l(),g("span",st,m(a.author),1)):S("",!0),a.origin?(l(),g("span",at,"《"+m(a.origin)+"》",1)):S("",!0)],4)]),_:1})]),_:1},8,["loading","onClick"])}const me=O(tt,[["render",nt],["__scopeId","data-v-de957b7d"]]),ot=2,it=.9,rt=.6,lt={name:"TimeCard",data(){return{now:new Date,timer:null,unwatch:null,fontSize:28}},computed:{timeString(){const e=String(this.now.getHours()).padStart(2,"0"),t=String(this.now.getMinutes()).padStart(2,"0");return`${e}:${t}`},secondsString(){return`:${String(this.now.getSeconds()).padStart(2,"0")}`},dateString(){const e=this.now.getFullYear(),t=this.now.getMonth()+1,s=this.now.getDate();return`${e}${t}${s}`},weekdayString(){return["星期日","星期一","星期二","星期三","星期四","星期五","星期六"][this.now.getDay()]},periodOfDay(){const e=this.now.getHours();return e<6?"凌晨":e<8?"早晨":e<11?"上午":e<13?"中午":e<17?"下午":e<19?"傍晚":e<22?"晚上":"深夜"},timeStyle(){return{"font-size":`${this.fontSize*ot}px`,"font-weight":"700","line-height":"1","letter-spacing":"4px","font-variant-numeric":"tabular-nums"}},secondsStyle(){return{"font-size":`${this.fontSize*it}px`,"font-variant-numeric":"tabular-nums","vertical-align":"baseline","margin-left":"4px",opacity:"0.6"}},dateStyle(){return{"font-size":`${this.fontSize*rt}px`,"letter-spacing":"1px"}}},mounted(){this.loadSettings(),this.startTimer(),this.unwatch=te(()=>{this.loadSettings()})},beforeUnmount(){this.stopTimer(),this.unwatch&&this.unwatch()},methods:{loadSettings(){this.fontSize=H.getSetting("font.size")},startTimer(){this.timer=setInterval(()=>{this.now=new Date},1e3)},stopTimer(){this.timer&&(clearInterval(this.timer),this.timer=null)}}};function dt(e,t,s,o,a,n){return l(),y(T,{class:"time-card",elevation:"2",border:"",rounded:"xl",height:"100%"},{default:r(()=>[i(_,{class:"pa-6 d-flex flex-column",style:{height:"100%"}},{default:r(()=>[f("div",{class:"time-display",style:A(n.timeStyle)},[h(m(n.timeString),1),f("span",{class:"seconds-text",style:A(n.secondsStyle)},m(n.secondsString),5)],4),f("div",{class:"date-line mt-3",style:A(n.dateStyle)},m(n.dateString)+" "+m(n.weekdayString)+" "+m(n.periodOfDay),5)]),_:1})]),_:1})}const fe=O(lt,[["render",dt],["__scopeId","data-v-725dbda6"]]),ct={name:"HomeworkGrid",computed:{settings(){return settings}},components:{HitokotoCard:me,TimeCard:fe,ConciseExamCard:he},props:{sortedItems:{type:Array,required:!0},unusedSubjects:{type:Array,required:!0},emptySubjectDisplay:{type:String,default:"button"},isMobile:{type:Boolean,default:!1},isEditingDisabled:{type:Boolean,default:!1},contentStyle:{type:Object,default:()=>({})},highlightedCards:{type:Object,default:()=>({})}},emits:["open-dialog","open-attendance","disabled-click"],data(){return{isReadOnlyToken:!1}},async mounted(){this.resizeObserver=new ResizeObserver(()=>{this.resizeAllGridItems()}),this.$refs.gridContainer&&this.resizeObserver.observe(this.$refs.gridContainer),this.$nextTick(()=>{this.resizeAllGridItems(),this.$refs.items&&this.$refs.items.forEach(e=>{e.firstElementChild&&this.resizeObserver.observe(e.firstElementChild)})}),await this.checkReadOnlyStatus()},updated(){this.$nextTick(()=>{this.resizeAllGridItems(),this.$refs.items&&this.$refs.items.forEach(e=>{e.firstElementChild&&this.resizeObserver.observe(e.firstElementChild)})})},beforeUnmount(){this.resizeObserver&&this.resizeObserver.disconnect()},methods:{getSetting:k,async checkReadOnlyStatus(){try{let e=null;if(this.$parent&&this.$parent.$refs&&this.$parent.$refs.studentNameManager?e=this.$parent.$refs.studentNameManager:this.$root&&this.$root.$refs&&this.$root.$refs.studentNameManager&&(e=this.$root.$refs.studentNameManager),e&&typeof e.isReadOnly<"u")this.isReadOnlyToken=e.isReadOnly;else{const{getSetting:t}=await E(async()=>{const{getSetting:o}=await import("./index-_6IQhlPZ.js").then(a=>a.aI);return{getSetting:o}},__vite__mapDeps([0,1,2,3]),import.meta.url),s=t("server.kvToken");if(s){const{default:o}=await E(async()=>{const{default:n}=await import("./dataProvider-BwUtbSl1.js").then(c=>c.c);return{default:n}},__vite__mapDeps([4,5,0,1,2,3,6]),import.meta.url),a=t("server.domain");if(a)try{const n=await o.get(`${a}/kv/_token`,{headers:{Authorization:`Bearer ${s}`}});n.data&&typeof n.data.isReadOnly<"u"&&(this.isReadOnlyToken=n.data.isReadOnly)}catch(n){console.error("获取Token信息失败:",n)}}}}catch(e){console.error("检查只读状态失败:",e)}},resizeGridItem(e){const t=this.$refs.gridContainer;if(!t)return;const s=parseInt(window.getComputedStyle(t).getPropertyValue("grid-auto-rows")),o=parseInt(window.getComputedStyle(t).getPropertyValue("gap")),a=e.firstElementChild;if(!a)return;const n=a.getBoundingClientRect().height,c=Math.ceil((n+o)/(s+o));e.style.gridRowEnd=`span ${c}`},resizeAllGridItems(){const e=this.$refs.items;e&&e.forEach(t=>this.resizeGridItem(t))},handleCardClick(e,t){if(this.isEditingDisabled){this.$emit("disabled-click");return}e==="attendance"?this.$emit("open-attendance"):e==="dialog"&&this.$emit("open-dialog",t)},splitPoint(e){return e.split(`
`).filter(t=>t.trim())},handleMouseMove(e){const t=e.currentTarget,s=t.getBoundingClientRect(),o=(e.clientX-s.left)/s.width*100,a=(e.clientY-s.top)/s.height*100;t.style.setProperty("--x",`${o}%`),t.style.setProperty("--y",`${a}%`)},handleTouchMove(e){if(e.touches.length===1){const t=e.touches[0],s=e.currentTarget,o=s.getBoundingClientRect(),a=(t.clientX-o.left)/o.width*100,n=(t.clientY-o.top)/o.height*100;s.style.setProperty("--x",`${a}%`),s.style.setProperty("--y",`${n}%`)}}}},ut={ref:"gridContainer",class:"grid-masonry"},ht=["data-key"],mt={key:0,style:{height:"100%"}},ft={key:1,style:{height:"100%"}},gt={key:2,style:{height:"100%"}},yt={class:"d-flex justify-space-between align-center mb-2"},pt={class:"text-h6"},kt={key:0,class:"mb-2"},wt={class:"text-error text-caption mb-1"},vt={class:"d-flex flex-wrap",style:{gap:"4px"}},Dt={key:1,class:"mb-2"},St={class:"text-warning text-caption mb-1"},bt={class:"d-flex flex-wrap",style:{gap:"4px"}},xt={key:2,class:"mb-2"},Ct={class:"text-grey text-caption mb-1"},_t={class:"d-flex flex-wrap",style:{gap:"4px"}},Tt={key:3,class:"text-success text-center mt-2"},Et={class:"empty-subjects mt-4"},It={key:0,class:"d-flex flex-wrap justify-center"},Nt={key:2,class:"empty-subjects-grid"};function At(e,t,s,o,a,n){const c=fe,p=me,v=he;return l(),g(b,null,[f("div",ut,[i(ae,{name:"grid"},{default:r(()=>[(l(!0),g(b,null,C(s.sortedItems,d=>(l(),g("div",{key:d.key,ref_for:!0,ref:"items","data-key":d.key,style:A({order:d.order}),class:"grid-item"},[d.type==="time"?(l(),g("div",mt,[i(c)])):d.type==="hitokoto"?(l(),g("div",ft,[i(p)])):d.type==="exam"?(l(),g("div",gt,[i(v,{"exam-id":d.data.examId,"content-style":s.contentStyle,onClick:w=>e.$emit("open-exam-detail",d.data.examId)},null,8,["exam-id","content-style","onClick"])])):d.type==="attendance"?(l(),y(T,{key:3,class:U([{"glow-highlight":s.highlightedCards[d.key],"cursor-not-allowed":s.isEditingDisabled,"cursor-pointer":!s.isEditingDisabled},"glow-track"]),border:"",height:"100%",onClick:t[0]||(t[0]=w=>n.handleCardClick("attendance",null)),onMousemove:n.handleMouseMove,onTouchmove:n.handleTouchMove},{default:r(()=>[i(N,{class:"d-flex align-center"},{default:r(()=>[i(R,{class:"mr-2",color:"primary",icon:"mdi-account-group"}),t[1]||(t[1]=h(" 出勤统计 ",-1))]),_:1}),i(_,null,{default:r(()=>[f("div",yt,[t[2]||(t[2]=f("span",null,"应到/实到",-1)),f("span",pt,m(d.data.total-d.data.exclude.length)+"/"+m(d.data.total-d.data.absent.length-!n.getSetting("display.lateStudentsArePresent")*d.data.late.length-d.data.exclude.length),1)]),i($,{class:"mb-2"}),d.data.absent.length>0?(l(),g("div",kt,[f("div",wt,"请假 ("+m(d.data.absent.length)+")",1),f("div",vt,[(l(!0),g(b,null,C(d.data.absent,w=>(l(),y(z,{key:w,color:"error",size:"x-small",variant:"flat"},{default:r(()=>[h(m(w),1)]),_:2},1024))),128))])])):S("",!0),d.data.late.length>0?(l(),g("div",Dt,[f("div",St,"迟到 ("+m(d.data.late.length)+")",1),f("div",bt,[(l(!0),g(b,null,C(d.data.late,w=>(l(),y(z,{key:w,color:"warning",size:"x-small",variant:"flat"},{default:r(()=>[h(m(w),1)]),_:2},1024))),128))])])):S("",!0),d.data.exclude.length>0?(l(),g("div",xt,[f("div",Ct,"不参与 ("+m(d.data.exclude.length)+")",1),f("div",_t,[(l(!0),g(b,null,C(d.data.exclude,w=>(l(),y(z,{key:w,color:"grey",size:"x-small",variant:"flat"},{default:r(()=>[h(m(w),1)]),_:2},1024))),128))])])):S("",!0),d.data.absent.length===0&&d.data.late.length===0&&d.data.exclude.length===0?(l(),g("div",Tt," 全勤 ")):S("",!0)]),_:2},1024)]),_:2},1032,["class","onMousemove","onTouchmove"])):d.type==="custom"?(l(),y(T,{key:4,class:U([{"glow-highlight":s.highlightedCards[d.key],"cursor-not-allowed":s.isEditingDisabled,"cursor-pointer":!s.isEditingDisabled},"glow-track"]),border:"",height:"100%",onClick:w=>n.handleCardClick("dialog",d.key),onMousemove:n.handleMouseMove,onTouchmove:n.handleTouchMove},{default:r(()=>[i(N,{class:"text-primary"},{default:r(()=>[i(R,{class:"mr-2",icon:"mdi-card-text-outline",size:"small"}),h(" "+m(d.name),1)]),_:2},1024),i(_,{style:A(s.contentStyle)},{default:r(()=>[h(m(d.content),1)]),_:2},1032,["style"])]),_:2},1032,["class","onClick","onMousemove","onTouchmove"])):(l(),y(T,{key:5,class:U([{"glow-highlight":s.highlightedCards[d.key],"cursor-not-allowed":s.isEditingDisabled,"cursor-pointer":!s.isEditingDisabled},"glow-track"]),border:"",height:"100%",onClick:w=>n.handleCardClick("dialog",d.key),onMousemove:n.handleMouseMove,onTouchmove:n.handleTouchMove},{default:r(()=>[i(N,null,{default:r(()=>[h(m(d.name),1)]),_:2},1024),i(_,{style:A(s.contentStyle)},{default:r(()=>[i(X,null,{default:r(()=>[(l(!0),g(b,null,C(n.splitPoint(d.content),w=>(l(),y(Z,{key:w},{default:r(()=>[h(m(w),1)]),_:2},1024))),128))]),_:2},1024)]),_:2},1032,["style"])]),_:2},1032,["class","onClick","onMousemove","onTouchmove"]))],12,ht))),128))]),_:1})],512),f("div",Et,[s.isMobile?(l(),g("div",It,[(l(!0),g(b,null,C(s.unusedSubjects,d=>(l(),y(z,{key:d.name,class:"ma-1",color:"primary",variant:"tonal",onClick:w=>n.handleCardClick("dialog",d.name)},{default:r(()=>[i(R,{start:"",size:"small"},{default:r(()=>[h(m(a.isReadOnlyToken?"mdi-cancel":"mdi-plus"),1)]),_:1}),h(" "+m(d.name),1)]),_:2},1032,["onClick"]))),128))])):s.emptySubjectDisplay==="button"?(l(),y(le,{key:1,divided:"",variant:"tonal"},{default:r(()=>[(l(!0),g(b,null,C(s.unusedSubjects,d=>(l(),y(D,{key:d.name,onClick:w=>n.handleCardClick("dialog",d.name)},{default:r(()=>[i(R,{start:""},{default:r(()=>[h(m(a.isReadOnlyToken?"mdi-cancel":"mdi-plus"),1)]),_:1}),h(" "+m(d.name),1)]),_:2},1032,["onClick"]))),128))]),_:1})):(l(),g("div",Nt,[i(ae,{name:"v-list"},{default:r(()=>[(l(!0),g(b,null,C(s.unusedSubjects,d=>(l(),y(T,{key:d.name,border:"",class:"empty-subject-card",onClick:w=>n.handleCardClick("dialog",d.name)},{default:r(()=>[i(N,{class:"text-subtitle-1"},{default:r(()=>[h(m(d.name),1)]),_:2},1024),i(_,{class:"text-center"},{default:r(()=>[a.isReadOnlyToken?(l(),g(b,{key:0},[i(R,{color:"grey",size:"small"},{default:r(()=>[...t[3]||(t[3]=[h(" mdi-cancel ",-1)])]),_:1}),t[4]||(t[4]=f("div",{class:"text-caption text-grey"}," 当日无作业 ",-1))],64)):(l(),g(b,{key:1},[i(R,{color:"grey",size:"small"},{default:r(()=>[...t[5]||(t[5]=[h(" mdi-plus ",-1)])]),_:1}),t[6]||(t[6]=f("div",{class:"text-caption text-grey"}," 点击添加作业 ",-1))],64))]),_:1})]),_:2},1032,["onClick"]))),128))]),_:1})]))])],64)}const Vt=O(ct,[["render",At],["__scopeId","data-v-5f84fa28"]]),Rt={name:"HomeActions",props:{synced:Boolean,loadingUpload:Boolean,showRandomPickerButton:Boolean,showExamScheduleButton:Boolean,showListCardButton:Boolean,showFullscreenButton:Boolean,isFullscreen:Boolean,showAntiScreenBurnCard:Boolean,showTestCardButton:Boolean},emits:["upload","show-sync-message","open-random-picker","toggle-fullscreen","add-test-card"]},Ot={class:"d-flex flex-wrap align-center mt-4"};function Lt(e,t,s,o,a,n){return l(),g(b,null,[f("div",Ot,[s.synced?(l(),y(D,{key:1,color:"success",size:"large",onClick:t[1]||(t[1]=c=>e.$emit("show-sync-message"))},{default:r(()=>[...t[9]||(t[9]=[h(" 同步完成 ",-1)])]),_:1})):(l(),y(D,{key:0,loading:s.loadingUpload,class:"ml-2",color:"error",size:"large",onClick:t[0]||(t[0]=c=>e.$emit("upload"))},{default:r(()=>[...t[8]||(t[8]=[h(" 上传 ",-1)])]),_:1},8,["loading"])),s.showRandomPickerButton?(l(),y(D,{key:2,"append-icon":"mdi-dice-multiple",class:"ml-2",color:"amber","prepend-icon":"mdi-account-question",size:"large",onClick:t[2]||(t[2]=c=>e.$emit("open-random-picker"))},{default:r(()=>[...t[10]||(t[10]=[h(" 随机点名 ",-1)])]),_:1})):S("",!0),s.showExamScheduleButton?(l(),y(le,{key:3,class:"ml-2",color:"green",variant:"elevated",divided:""},{default:r(()=>[i(D,{"prepend-icon":"mdi-calendar-check",size:"large",onClick:t[3]||(t[3]=c=>e.$router.push("/examschedule"))},{default:r(()=>[...t[11]||(t[11]=[h(" 考试看板 ",-1)])]),_:1}),i(D,{icon:"mdi-plus",size:"large",onClick:t[4]||(t[4]=c=>e.$emit("add-exam-card"))})]),_:1})):S("",!0),s.showListCardButton?(l(),y(D,{key:4,class:"ml-2",color:"primary-darken-1","prepend-icon":"mdi-list-box",size:"large",onClick:t[5]||(t[5]=c=>e.$router.push("/list"))},{default:r(()=>[...t[12]||(t[12]=[h(" 列表 ",-1)])]),_:1})):S("",!0),s.showFullscreenButton?(l(),y(D,{key:5,color:s.isFullscreen?"blue-grey":"blue","prepend-icon":s.isFullscreen?"mdi-fullscreen-exit":"mdi-fullscreen",class:"ml-2",size:"large",onClick:t[6]||(t[6]=c=>e.$emit("toggle-fullscreen"))},{default:r(()=>[h(m(s.isFullscreen?"退出全屏":"全屏显示"),1)]),_:1},8,["color","prepend-icon"])):S("",!0),s.showTestCardButton?(l(),y(D,{key:6,class:"ml-2",color:"purple","prepend-icon":"mdi-test-tube",size:"large",onClick:t[7]||(t[7]=c=>e.$emit("add-test-card"))},{default:r(()=>[...t[13]||(t[13]=[h(" 添加测试卡片 ",-1)])]),_:1})):S("",!0)]),s.showAntiScreenBurnCard?(l(),y(T,{key:0,border:"",class:"mt-4 anti-burn-card",color:"primary",variant:"tonal"},{default:r(()=>[i(N,{class:"text-subtitle-1"},{default:r(()=>[i(R,{icon:"mdi-shield-check",size:"small",start:""}),t[14]||(t[14]=h(" 屏幕保护技术已启用 ",-1))]),_:1}),i(_,{class:"text-body-2"},{default:r(()=>[...t[15]||(t[15]=[f("p",null," 为防止OLED/LCD屏幕烧屏界面元素会定期微调位置。 ",-1),f("p",{class:"text-caption text-grey"}," 此功能不会影响正常使用,仅在长时间静止显示时生效。 ",-1),f("p",{class:"text-caption text-grey"}," 建议在放学后关闭显示器以节约能源。 ",-1)])]),_:1})]),_:1})):S("",!0)],64)}const Pt=O(Rt,[["render",Lt]]),zt={name:"FloatingICP"},jt={"aria-label":"xICP备x号",class:"floating-icp-link",href:"https://beian.miit.gov.cn/",rel:"noopener noreferrer",target:"_blank",style:{display:"none"}};function Mt(e,t,s,o,a,n){return l(),g("a",jt," xICP备x号 ")}const Ut=O(zt,[["render",Mt],["__scopeId","data-v-fa73670f"]]),Bt={class:"skeleton-grid"},Ft={__name:"HomeSkeleton",setup(e){const{mobile:t}=Q(),s=Ee(()=>t.value?3:6);return(o,a)=>(l(),y(ce,{class:"main-window",fluid:""},{default:r(()=>[f("div",Bt,[(l(!0),g(b,null,C(s.value,n=>(l(),g("div",{key:n,class:"skeleton-card"},[...a[0]||(a[0]=[f("div",{class:"skeleton-heading skeleton-pulse"},null,-1),f("div",{class:"skeleton-line skeleton-pulse"},null,-1),f("div",{class:"skeleton-line skeleton-line--short skeleton-pulse"},null,-1)])]))),128))]),a[1]||(a[1]=f("div",{class:"d-flex justify-center mt-6 ga-3"},[f("div",{class:"skeleton-btn skeleton-pulse"}),f("div",{class:"skeleton-btn skeleton-pulse"})],-1))]),_:1}))}},Ht=O(Ft,[["__scopeId","data-v-ea69d8df"]]);function Y(e,t){let s=null;return function(...o){s&&clearTimeout(s),s=setTimeout(()=>{e.apply(this,o)},t)}}function $t(e,t){let s=null,o=0;return function(...a){const n=Date.now();n-o<t?(s&&clearTimeout(s),s=setTimeout(()=>{o=n,e.apply(this,a)},t)):(o=n,e.apply(this,a))}}const Kt=I({loader:()=>E(()=>import("./MessageLog-DNZPN4Qf.js").then(e=>e.M),__vite__mapDeps([7,0,1,2,3,8,9,10]),import.meta.url),loadingComponent:K,delay:200}),Wt=I({loader:()=>E(()=>import("./RandomPicker-D4SIlUxw.js"),__vite__mapDeps([11,0,1,2,3,12,13,14,15,16,17,18,19]),import.meta.url),delay:0}),Gt=I({loader:()=>E(()=>import("./FloatingToolbar-Hmj4Cwyb.js"),__vite__mapDeps([20,0,1,2,3,21,22,23,24,25,26,27]),import.meta.url),delay:200}),qt=I({loader:()=>E(()=>import("./ChatWidget-CC4arZYT.js").then(e=>e.C),__vite__mapDeps([28,29,30,0,1,2,3,6,31,17,18,32,24,25,15,16,33,34,35,36,37,13,14,38,39]),import.meta.url),delay:0}),Jt=I({loader:()=>E(()=>import("./HomeworkEditDialog-CzJk0Rhv.js"),__vite__mapDeps([40,4,5,0,1,2,3,6,37,13,14,38,17,18,41,42,43]),import.meta.url),delay:0}),Yt=I({loader:()=>E(()=>import("./InitServiceChooser-DBAmZLOu.js"),__vite__mapDeps([44,0,1,2,3,4,5,6,12,13,14,41,42,37,38,17,18,45,46,33,34,47]),import.meta.url),loadingComponent:K,delay:200}),Xt=I({loader:()=>E(()=>import("./StudentNameManager-CKU0cAHn.js"),__vite__mapDeps([48,0,1,2,3,4,5,6,49,13,14,50,12,21,22,51,52,53,17,18,54,55,56,57,41,42,58]),import.meta.url),delay:200}),Zt=I({loader:()=>E(()=>import("./UrgentTestDialog-DpliVwT_.js"),__vite__mapDeps([59,28,29,30,0,1,2,3,6,31,17,18,32,24,25,15,16,33,34,35,36,37,13,14,38,39,4,5,8,9,60,61,62,52,53,63,51,64,65]),import.meta.url),delay:0}),Qt=I({loader:()=>E(()=>import("./AttendanceSidebar-DFGkatIT.js"),__vite__mapDeps([66,0,1,2,3,33,34,58]),import.meta.url),loadingComponent:K,delay:200}),es=I({loader:()=>E(()=>import("./AttendanceManagementDialog-CCmX9Ffv.js"),__vite__mapDeps([67,0,1,2,3,17,18,33,34,12,13,14,68]),import.meta.url),delay:0}),ts=I({loader:()=>E(()=>import("./PwaInstallCard-CTQnZjV3.js"),__vite__mapDeps([69,2,0,1,3,17,18]),import.meta.url),delay:200}),ss=I({loader:()=>E(()=>import("./ExamScheduleCard-D_oQZ_gl.js"),__vite__mapDeps([70,2,0,1,3,41,42,4,5,6,17,18,60,61,29,30,32,8,9,33,34,15,16,71]),import.meta.url),loadingComponent:K,delay:200}),as=I({loader:()=>E(()=>import("./ExamConfigEditor-DzELjE-Y.js"),__vite__mapDeps([72,4,5,0,1,2,3,6,41,42,73,74,15,16,17,18,33,34,12,13,14,37,38,52,53,49,50,21,22,51,54,55,23,24,25,26,75]),import.meta.url),delay:0}),ns={name:"Classworks 作业板",components:{MessageLog:Kt,RandomPicker:Wt,FloatingToolbar:Gt,FloatingICP:Ut,HomeworkEditDialog:Jt,InitServiceChooser:Yt,ChatWidget:qt,StudentNameManager:Xt,UrgentTestDialog:Zt,AttendanceSidebar:Qt,AttendanceManagementDialog:es,HomeworkGrid:Vt,HomeActions:Pt,PwaInstallCard:ts,ExamScheduleCard:ss,ExamConfigEditor:as,HomeSkeleton:Ht},setup(){const{mobile:e}=Q(),t=ee();return{mobile:e,examStore:t}},data(){const e=[{name:"语文",order:0},{name:"数学",order:1},{name:"英语",order:2},{name:"物理",order:3},{name:"化学",order:4},{name:"生物",order:5},{name:"政治",order:6},{name:"历史",order:7},{name:"地理",order:8},{name:"其他",order:9}];return{showAddExamDialog:!1,showExamDetailDialog:!1,selectedExamId:null,upcomingExams:[],dataKey:"",provider:"",useDisplay:Q,state:{classNumber:"",namespaceInfo:null,deviceName:"",studentList:[],boardData:{homework:{},attendance:{absent:[],late:[],exclude:[]}},dialogVisible:!1,dialogTitle:"",textarea:"",dateString:"",synced:!1,attendDialogVisible:!1,contentStyle:{"font-size":`${k("font.size")}px`},uploadLoading:!1,downloadLoading:!1,snackbar:!1,snackbarText:"",fontSize:k("font.size"),datePickerDialog:!1,selectedDate:new Date().toISOString().split("T")[0].replace(/-/g,""),selectedDateObj:new Date,refreshInterval:null,showNoDataMessage:!1,noDataMessage:"",isToday:!1,attendanceDialog:!1,availableSubjects:e,isFullscreen:!1},loading:{download:!1,upload:!1,students:!1,copyToToday:!1},dataReady:!1,debouncedUpload:null,debouncedAttendanceSave:null,throttledReflow:null,sortedItemsCache:{key:"",value:[]},confirmDialog:{show:!1,resolve:null,reject:null},urlConfigDialog:{show:!1,config:null,changes:[],validSettings:{},confirmHandler:null,cancelHandler:null,icons:{}},settingsTick:0,isChatOpen:!1,highlightedCards:{},tokenDisplayInfo:{show:!1,readonly:!1,text:"",color:"primary",variant:"tonal",icon:"mdi-account",disabled:!1},realtimeInfo:{show:!1,time:"",key:""},$offKvChanged:null,$offConnect:null,debouncedRealtimeRefresh:null,preconfigData:{namespace:null,authCode:null,autoOpen:!1,autoExecute:!1},urgentTestDialog:!1,tokenInfo:null,persistentNotifications:[],notificationDetailDialog:!1,currentNotification:null}},computed:{isMobile(){return k("display.forceDesktopMode")?!1:this.mobile},titleText(){var v,d,w;const e=k("server.provider"),t=e==="kv-server"||e==="classworkscloud";let s;t&&this.state.namespaceInfo?s=((v=this.state.namespaceInfo)==null?void 0:v.name)||((w=(d=this.state.namespaceInfo)==null?void 0:d.device)==null?void 0:w.name)||this.state.classNumber||"高三八班":s=this.state.classNumber||"高三八班";const o=this.getToday(),a=new Date(o);a.setDate(a.getDate()-1);const n=this.state.dateString,c=this.formatDate(o),p=this.formatDate(a);return n===c?s+" - 今天的作业":n===p?s+" - 昨天的作业":`${s} - ${n}的作业`},sortedItems(){const e=[];this.isMobile&&e.push({key:"attendance-card",name:"出勤统计",type:"attendance",data:{total:this.state.studentList.length,absent:this.state.boardData.attendance.absent,late:this.state.boardData.attendance.late,exclude:this.state.boardData.attendance.exclude}});for(const t in this.state.boardData.homework)if(t.startsWith("exam-")){const s=this.state.boardData.homework[t];e.push({key:t,name:"考试安排",type:"exam",data:{examId:s.examId},order:-100,rowSpan:200})}for(const t of this.state.availableSubjects){const s=t.name,o=this.state.boardData.homework[s];if(o&&o.content){const n=100+o.content.split(`
`).filter(c=>c.trim()).length*24;e.push({key:s,name:s,type:"homework",content:o.content,order:t.order,rowSpan:n})}}k("timeCard.enabled")&&e.push({key:"time-card",name:"时间",type:"time",order:9997,rowSpan:150}),k("hitokoto.enabled")&&e.push({key:"hitokoto-card",name:"一言",type:"hitokoto",order:9998,rowSpan:150});for(const t in this.state.boardData.homework)if(t.startsWith("custom-")){const s=this.state.boardData.homework[t],a=100+s.content.split(`
`).filter(n=>n.trim()).length*24;e.push({key:t,name:s.name,type:"custom",content:s.content,order:9999,rowSpan:a})}return e.sort((t,s)=>t.order-s.order),e},unusedSubjects(){const e=Object.keys(this.state.boardData.homework).filter(t=>{var s;return(s=this.state.boardData.homework[t].content)==null?void 0:s.trim()});return this.state.availableSubjects.filter(t=>!e.includes(t.name)).sort((t,s)=>t.order-s.order)},emptySubjects(){return this.emptySubjectDisplay!=="button"?[]:this.unusedSubjects},autoSave(){return k("edit.autoSave")},blockNonTodayAutoSave(){return k("edit.blockNonTodayAutoSave")},isToday(){const e=(()=>{const t=new Date,s=t.getFullYear(),o=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0");return`${s}${o}${a}`})();return this.state.dateString===e},canAutoSave(){return this.autoSave&&(!this.blockNonTodayAutoSave||this.isToday)},needConfirmSave(){return!this.isToday&&this.confirmNonTodaySave},shouldShowBlockedMessage(){return!this.isToday&&this.autoSave&&this.blockNonTodayAutoSave},refreshBeforeEdit(){return k("edit.refreshBeforeEdit")},emptySubjectDisplay(){return k("display.emptySubjectDisplay")},dynamicSort(){return k("display.dynamicSort")},isEditingDisabled(){if(this.state.uploadLoading||this.state.downloadLoading)return!0;const e=this.$refs.studentNameManager;return!!(e!=null&&e.isReadOnly||!this.canEditCurrentDate)},unreadCount(){var e;return((e=this.$refs.messageLog)==null?void 0:e.unreadCount)||0},showRandomPickerButton(){return k("randomPicker.enabled")},showListCardButton(){return k("display.showListCard")},confirmNonTodaySave(){return k("edit.confirmNonTodaySave")},blockPastDataEdit(){return k("edit.blockPastDataEdit")},shouldShowSaveConfirm(){return!this.isToday&&this.confirmNonTodaySave},shouldBlockAutoSave(){return!this.isToday&&this.autoSave&&this.blockNonTodayAutoSave},canEditCurrentDate(){return this.isToday?!0:!this.blockPastDataEdit},isEditingPastData(){return!this.isToday},showFullscreenButton(){return k("display.showFullscreenButton")},showExamScheduleButton(){return k("display.showExamScheduleButton")},showAntiScreenBurnCard(){return k("display.showAntiScreenBurnCard")},showTestCardButton(){return k("developer.enabled")},shouldShowInit(){var a;const e=k("server.provider"),t=e==="kv-server"||e==="classworkscloud",s=k("server.kvToken"),o=((a=this.$route)==null?void 0:a.path)==="/";return this.settingsTick,o&&t&&(!s||s==="")},hasExamCard(){for(const e in this.state.boardData.homework)if(e.startsWith("exam-"))return!0;return!1},shouldShowUrgentTestButton(){const e=k("server.provider");return!(e==="kv-server"||e==="classworkscloud")||!k("server.kvToken")||!this.tokenInfo?!1:this.tokenInfo.deviceType==="teacher"||this.tokenInfo.deviceType==="classroom"},subjectOrder(){return[...this.state.availableSubjects].sort((e,t)=>e.order-t.order).map(e=>e.name)}},watch:{homeworkData:{handler(){this.$nextTick(()=>{this.$refs.waterfall&&this.$refs.waterfall.reflow()})},deep:!0},"$vuetify.display.width":{handler(){this.throttledReflow()},deep:!0},"state.attendanceDialog":{handler(e){this.handleAttendanceDialogClose(e)}}},created(){this.debouncedUpload=Y(this.uploadData,2e3),this.debouncedAttendanceSave=Y(async()=>{this.autoSave&&await this.trySave(!0)},2e3),this.throttledReflow=$t(()=>{this.$refs.gridContainer&&this.optimizeGridLayout(this.sortedItems)},200)},async mounted(){try{this.updateBackendUrl(),await this.initializeData(),this.dataReady=!0,await this.loadDeviceInfo(),this.setupAutoRefresh(),this.unwatchSettings=te(()=>{this.updateSettings()}),this.$nextTick(()=>{const e=this.$refs.studentNameManager;e&&(this.studentNameInfo.name=e.currentStudentName||e.currentTeacherName||"",this.studentNameInfo.isStudent=e.isStudentToken,this.studentNameInfo.isTeacher=e.isTeacherToken,this.studentNameInfo.openDialog=()=>e.openDialog(),this.$watch(()=>e.currentStudentName,t=>{this.studentNameInfo.name=t,this.updateTokenDisplayInfo()}),this.$watch(()=>e.currentTeacherName,t=>{e.isTeacherToken&&(this.studentNameInfo.name=t,this.updateTokenDisplayInfo())}),this.$watch(()=>e.isStudentToken,t=>{this.studentNameInfo.isStudent=t,this.updateTokenDisplayInfo()}),this.$watch(()=>e.isTeacherToken,t=>{this.studentNameInfo.isTeacher=t,this.updateTokenDisplayInfo()}))}),document.addEventListener("fullscreenchange",this.fullscreenChangeHandler),document.addEventListener("webkitfullscreenchange",this.fullscreenChangeHandler),document.addEventListener("mozfullscreenchange",this.fullscreenChangeHandler),document.addEventListener("MSFullscreenChange",this.fullscreenChangeHandler),this.checkHashForRandomPicker(),window.addEventListener("hashchange",this.checkHashForRandomPicker),this.setupRealtimeChannel(),this.$nextTick(()=>{this.updateTokenDisplayInfo()}),await this.loadTokenInfo(),this.loadPersistentNotifications()}catch(e){console.error("初始化失败:",e),this.showError("初始化失败,请刷新页面重试")}},beforeUnmount(){this.unwatchSettings&&this.unwatchSettings(),this.state.refreshInterval&&clearInterval(this.state.refreshInterval),document.removeEventListener("fullscreenchange",this.fullscreenChangeHandler),document.removeEventListener("webkitfullscreenchange",this.fullscreenChangeHandler),document.removeEventListener("mozfullscreenchange",this.fullscreenChangeHandler),document.removeEventListener("MSFullscreenChange",this.fullscreenChangeHandler),window.removeEventListener("hashchange",this.checkHashForRandomPicker);try{this.$offKvChanged&&typeof this.$offKvChanged=="function"&&(this.$offKvChanged(),this.$offKvChanged=null),this.$offDeviceEvent&&typeof this.$offDeviceEvent=="function"&&(this.$offDeviceEvent(),this.$offDeviceEvent=null),this.$offConnect&&typeof this.$offConnect=="function"&&(this.$offConnect(),this.$offConnect=null),Re()}catch(e){console.warn("主页面事件清理失败:",e)}},methods:{async loadDeviceInfo(){var e;try{const t=k("server.provider");if(!(t==="kv-server"||t==="classworkscloud"))return;const o=await Ne.loadNamespaceInfo();if(o&&o.success===!1)return;this.state.namespaceInfo=o||null,this.state.deviceName=((e=o==null?void 0:o.account)==null?void 0:e.deviceName)||""}catch(t){console.warn("加载设备信息失败:",t)}},async loadTokenInfo(){try{const e=k("server.provider");if(!(e==="kv-server"||e==="classworkscloud"))return;const s=k("server.kvToken");if(!s)return;const o=k("server.domain");if(!o)return;const a=await Ie.get(`${o}/kv/_token`,{headers:{Authorization:`Bearer ${s}`}});this.tokenInfo=a.data,console.log("Token info loaded:",this.tokenInfo)}catch(e){console.warn("Failed to load token info:",e),this.tokenInfo=null}},updateTokenDisplayInfo(){const e=this.$refs.studentNameManager;if(!e||!e.hasToken){this.tokenDisplayInfo.show=!1,this.tokenDisplayInfo.readonly=!1;return}const t=e.displayName,s=e.isReadOnly,o=e.isStudentToken,a=e.isTeacherToken;if(this.tokenDisplayInfo.readonly=s,!o&&!a){this.tokenDisplayInfo.show=!1;return}this.tokenDisplayInfo.text=t,this.tokenDisplayInfo.color="primary",this.tokenDisplayInfo.icon=a?"mdi-school":"mdi-account",this.tokenDisplayInfo.disabled=s,this.tokenDisplayInfo.show=!0},handleTokenChipClick(){console.log("Token chip clicked");const e=this.$refs.studentNameManager;console.log("Manager:",e),console.log("Is student token:",e==null?void 0:e.isStudentToken),console.log("Is teacher token:",e==null?void 0:e.isTeacherToken),e&&(e.isStudentToken||e.isTeacherToken)?(console.log("Opening dialog..."),e.openDialog()):console.log("Cannot open dialog - conditions not met")},ensureDate(e){if(e instanceof Date)return e;if(typeof e=="string"){const t=new Date(e);if(!isNaN(t.getTime()))return t}return new Date},formatDate(e){const t=this.ensureDate(e),s=t.getFullYear(),o=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0");return`${s}${o}${a}`},formatTime(e){return e?new Date(e).toLocaleString():""},getToday(){return new Date},async initializeData(){this.parsePreconfigData();const e=await this.parseUrlConfig(),s=new URLSearchParams(window.location.search).get("date"),o=this.getToday();let a=o;if(s){if(/^\d{8}$/.test(s)){const n=s.substring(0,4),c=s.substring(4,6),p=s.substring(6,8);a=new Date(`${n}-${c}-${p}`)}else a=new Date(s);isNaN(a.getTime())&&(a=o)}if(this.state.dateString=this.formatDate(a),this.state.selectedDate=this.state.dateString,this.state.selectedDateObj=a,this.state.isToday=this.formatDate(a)===this.formatDate(o),!e){this.provider=k("server.provider");const n=k("server.classNumber");this.state.classNumber=n}await Promise.all([this.downloadData(),this.loadConfig()]),await this.examStore.fetchExamList();for(const n of this.examStore.examList)this.examStore.fetchExam(n.id);this.checkUpcomingExams()},async checkUpcomingExams(){this.upcomingExams=await this.examStore.getUpcomingExams()},loadExamCards(){},saveExamCards(){},addExamCard(e,t=!1,s=!1){const o=`exam-${e}`;!t&&this.state.boardData.homework[o]?delete this.state.boardData.homework[o]:this.state.boardData.homework[o]={type:"exam",examId:e,name:"考试安排",content:""},this.state.synced=!1,s||this.trySave(!0)},openExamDetail(e){this.selectedExamId=e,this.showExamDetailDialog=!0},removeCurrentExamCard(){this.selectedExamId&&(this.addExamCard(this.selectedExamId),this.showExamDetailDialog=!1)},async onExamConfigSaved(){this.selectedExamId&&(delete this.examStore.exams[this.selectedExamId],await this.examStore.fetchExam(this.selectedExamId),this.$message.success("保存成功","考试配置已更新"))},onExamConfigDeleted(){this.removeCurrentExamCard(),this.$message.success("删除成功","考试配置已删除")},isExamCardAdded(e){return!!this.state.boardData.homework[`exam-${e}`]},removeExamCard(e){},addAllUpcomingExams(){let e=0;for(const t of this.upcomingExams)this.isExamCardAdded(t.id)||(this.addExamCard(t.id,!0,!0),e++);e>0?(this.trySave(!0),this.$message.success("添加成功",`已添加 ${e} 个考试安排`)):this.$message.info("提示","所有考试已添加")},async downloadData(e=!1){var t,s,o;if(!this.loading.download)try{this.loading.download=!0;const a=await L.loadData("classworks-data-"+this.state.dateString);if(a.success==!1)if(a.error.code==="NOT_FOUND")this.state.showNoDataMessage=!0,this.state.noDataMessage=a.error.message,(e||!this.state.boardData||!this.state.boardData.homework&&!this.state.boardData.attendance)&&(this.state.boardData={homework:{},attendance:{absent:[],late:[],exclude:[]}});else throw new Error(a.error.message);else this.state.boardData={homework:a.homework||{},attendance:{absent:((t=a.attendance)==null?void 0:t.absent)||[],late:((s=a.attendance)==null?void 0:s.late)||[],exclude:((o=a.attendance)==null?void 0:o.exclude)||[]}},this.state.synced=!0,this.state.showNoDataMessage=!1,this.$message.success("下载成功","数据已更新")}catch(a){console.error("数据加载失败:",a),this.$message.error("下载失败",a.message),(e||!this.state.boardData||!this.state.boardData.homework&&!this.state.boardData.attendance)&&(this.state.boardData={homework:{},attendance:{absent:[],late:[],exclude:[]}})}finally{this.loading.download=!1}},async trySave(e=!1){if(e&&!this.canAutoSave)return this.shouldShowBlockedMessage&&this.showMessage("需要手动保存","已禁止自动保存非当天数据","warning"),!1;if(!e&&this.needConfirmSave)try{await this.showConfirmDialog()}catch{return!1}try{return await this.uploadData(),!0}catch(t){return this.$message.error("保存失败",t.message||"请重试"),!1}},async handleClose(){var s;if(!this.currentEditSubject)return;const e=this.state.textarea.trim(),t=((s=this.state.boardData.homework[this.currentEditSubject])==null?void 0:s.content)||"";if(e!==t.trim()){if(!e&&this.currentEditSubject.startsWith("custom-")){delete this.state.boardData.homework[this.currentEditSubject],this.state.synced=!1,this.autoSave&&await this.trySave(!0),this.state.dialogVisible=!1;return}this.state.boardData.homework[this.currentEditSubject].type==="custom"?this.state.boardData.homework[this.currentEditSubject].content=e:this.state.boardData.homework[this.currentEditSubject]={content:e},this.state.synced=!1,this.autoSave&&await this.trySave(!0)}this.state.dialogVisible=!1},async uploadData(){if(!this.loading.upload)try{this.loading.upload=!0;const e=await L.saveData("classworks-data-"+this.state.dateString,this.state.boardData);if(e.success==!1)throw new Error(e.error.message);this.state.synced=!0,this.$message.success(e.message||"保存成功")}finally{this.loading.upload=!1}},async loadConfig(){try{try{const e=await L.loadData("classworks-list-main");e.success!=!1&&Array.isArray(e)&&(this.state.studentList=e.map(t=>t.name))}catch(e){console.warn("Failed to load student list from dedicated key, falling back to config",e)}await this.loadSubjects()}catch(e){console.error("加载配置失败:",e),this.$message.error("加载配置失败",e.message)}},async loadSubjects(){try{const e=await L.loadData("classworks-config-subject");e&&Array.isArray(e)&&(this.state.availableSubjects=e)}catch(e){console.warn("Failed to load subject configuration:",e)}},showSyncMessage(){this.$message.success("数据已同步","数据已完成与服务器同步")},async openDialog(e){var t;if(this.isEditingDisabled){const s=this.$refs.studentNameManager;s!=null&&s.isReadOnly?this.$message.warning("无法编辑","当前使用的是只读令牌"):this.canEditCurrentDate?this.$message.warning("无法编辑","数据加载中,请稍候"):this.$message.warning("无法编辑","已禁止编辑过往数据");return}if(e.startsWith("custom-")){this.currentEditSubject=e,this.state.dialogTitle=this.state.boardData.homework[e].name,this.state.textarea=this.state.boardData.homework[e].content,this.state.dialogVisible=!0;return}if(this.refreshBeforeEdit)try{await this.downloadData()}catch(s){console.error("刷新数据失败:",s),this.$message.error("刷新数据失败,可能显示的不是最新数据")}this.currentEditSubject=e,this.state.boardData.homework[e]||(this.state.boardData.homework[e]={content:""}),this.state.dialogTitle=((t=this.state.availableSubjects.find(s=>s.name===e))==null?void 0:t.name)||e,this.state.textarea=this.state.boardData.homework[e].content,this.state.dialogVisible=!0},async handleHomeworkSave(e){this.currentEditSubject&&(this.state.boardData.homework[this.currentEditSubject].type==="custom"?this.state.boardData.homework[this.currentEditSubject].content=e:this.state.boardData.homework[this.currentEditSubject]={content:e},this.state.synced=!1,this.autoSave&&await this.trySave(!0))},setAttendanceArea(){if(this.isEditingDisabled){this.handleDisabledClick();return}this.state.attendanceDialog=!0},handleDisabledClick(){const e=this.$refs.studentNameManager;e!=null&&e.isReadOnly?this.$message.warning("无法编辑","当前使用的是只读令牌"):this.canEditCurrentDate?this.$message.warning("无法编辑","数据加载中,请稍候"):this.$message.warning("无法编辑","已禁止编辑过往数据")},zoom(e){e==="up"&&this.state.fontSize<100?this.state.fontSize+=2:e==="out"&&this.state.fontSize>16&&(this.state.fontSize-=2),this.state.contentStyle={"font-size":`${this.state.fontSize}px`},se("font.size",this.state.fontSize)},updateBackendUrl(){const e=k("server.provider"),t=k("server.classNumber");this.provider=e,this.state.classNumber=t},setupAutoRefresh(){const e=k("refresh.auto"),t=k("refresh.interval");this.state.refreshInterval&&clearInterval(this.state.refreshInterval),e&&(this.state.refreshInterval=setInterval(()=>{this.shouldSkipRefresh()||(this.downloadData(),this.loadPersistentNotifications())},t*1e3))},shouldSkipRefresh(){return!!(this.state.dialogVisible||this.state.attendanceDialog||this.confirmDialog.show||this.state.datePickerDialog||this.loading.upload||this.loading.download||!this.state.synced)},updateSettings(){this.state.fontSize=k("font.size"),this.state.contentStyle={"font-size":`${this.state.fontSize}px`},this.setupAutoRefresh(),this.updateBackendUrl(),this.loadDeviceInfo(),this.loadTokenInfo(),this.settingsTick++},async handleDateSelect(e){if(e)try{const t=this.ensureDate(e),s=this.formatDate(t);if(s===this.state.dateString)return;this.state.dateString=s,this.state.selectedDate=s,this.state.selectedDateObj=t,this.state.isToday=s===this.formatDate(this.getToday()),await Promise.all([this.downloadData(!0),this.loadSubjects()])}catch(t){console.error("Date processing error:",t),this.$message.error("日期处理错误","请重新选择日期")}},setupRealtimeChannel(){try{const e=k("server.kvToken");if(!e){console.warn("未配置 KV Token无法加入实时频道");return}Ae(),ne(e),this.$offConnect=Ve(()=>ne(e)),this.debouncedRealtimeRefresh||(this.debouncedRealtimeRefresh=Y(async()=>{var d,w,B;const o=JSON.parse(JSON.stringify(this.state.boardData.homework));await this.downloadData();const a=new Date,n=String(a.getHours()).padStart(2,"0"),c=String(a.getMinutes()).padStart(2,"0"),p=String(a.getSeconds()).padStart(2,"0");(d=this.$message)==null||d.info("数据已更新",`已于 ${n}:${c}:${p} 自动刷新`);const v={};for(const P in this.state.boardData.homework){const W=((w=o[P])==null?void 0:w.content)||"",G=((B=this.state.boardData.homework[P])==null?void 0:B.content)||"";W!==G&&(v[P]=!0)}for(const P in o)this.state.boardData.homework[P]||(v[P]=!0);this.highlightedCards=v,setTimeout(()=>{this.highlightedCards={}},1e4)},800));const t=o=>{var n;if(!o)return;if(o.key==="notification-list"){this.loadPersistentNotifications();return}const a=`classworks-data-${this.state.dateString}`;o.key===a&&(o.action!=="upsert"&&o.action!=="delete"||(n=this.debouncedRealtimeRefresh)==null||n.call(this,o.key))},s=o=>{let a=o;o.content&&o.timestamp&&(a={uuid:o.senderId||"realtime",key:o.content.key,action:o.content.action,created:o.content.created,updatedAt:o.content.updatedAt||o.timestamp,deletedAt:o.content.deletedAt,batch:o.content.batch}),t(a)};this.$offKvChanged=oe("kv-key-changed",s),this.deviceEventHandler=Oe({onKvChanged:t,enableLegacySupport:!0}),this.$offDeviceEvent=oe("device-event",this.deviceEventHandler)}catch(e){console.warn("实时频道初始化失败",e)}},async saveAttendance(){try{await this.trySave(!0),this.state.attendanceDialog=!1}catch(e){console.error("保存出勤状态失败:",e),this.$message.error("保存失败","请重试")}},showMessage(e,t="",s="success"){this.$message[s](e,t)},updateSortedItemsCache(e,t){this._sortedItemsCache={key:e,value:t}},addTestCard(){const e=Date.now().toString();this.state.boardData.homework[`custom-${e}`]={name:"测试卡片",content:`这是一个测试卡片
可以用来测试布局`,type:"custom"},this.state.synced=!1},showConfirmDialog(){return new Promise((e,t)=>{this.confirmDialog={show:!0,resolve:()=>{this.confirmDialog.show=!1,e()},reject:()=>{this.confirmDialog.show=!1,t(new Error("用户取消保存"))}}})},confirmSave(){this.confirmDialog.show=!1,this.confirmDialog.resolve&&this.confirmDialog.resolve(!0)},cancelSave(){this.confirmDialog.show=!1,this.confirmDialog.reject&&this.confirmDialog.reject(new Error("用户取消保存"))},async manualUpload(){return this.trySave(!1)},handleAttendanceChange(){this.state.synced=!1,this.debouncedAttendanceSave()},async handleAttendanceDialogClose(e){!e&&!this.state.synced&&await this.trySave(!0)},toggleFullscreen(){this.state.isFullscreen?this.exitFullscreen():this.enterFullscreen()},enterFullscreen(){const e=document.documentElement;e.requestFullscreen?e.requestFullscreen():e.webkitRequestFullScreen?e.webkitRequestFullScreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.msRequestFullscreen&&e.msRequestFullscreen()},exitFullscreen(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()},fullscreenChangeHandler(){this.state.isFullscreen=!!(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)},openRandomPicker(){this.$refs.randomPicker&&this.$refs.randomPicker.open()},checkHashForRandomPicker(){window.location.hash==="#random-picker"&&this.$nextTick(()=>{console.log("打开随机点名"),window.location.hash="",this.openRandomPicker()})},parseUrlConfig(){try{const t=new URLSearchParams(window.location.search).get("config");if(!t)return!1;try{const s=atob(t),o=Uint8Array.from(s,d=>d.charCodeAt(0)),a=new TextDecoder().decode(o),n=JSON.parse(a);console.log("从URL读取配置:",n);const c=[],p={},v={};return this.processSpecialSettings(n,c,p),this.processStandardSettings(n,c,p,v),Object.keys(p).length===0?(console.log("URL配置与当前配置相同无需应用"),!1):new Promise(d=>{this.urlConfigDialog={show:!0,config:n,changes:c,validSettings:p,icons:v,confirmHandler:()=>{this.urlConfigDialog.show=!1,this.applyUrlConfig(p),d(!0)},cancelHandler:()=>{this.urlConfigDialog.show=!1,d(!1)}}})}catch(s){return console.error("解析URL配置错误:",s),this.$message.error("URL配置错误","无法解析配置数据"),!1}}catch(e){return console.error("处理URL配置错误:",e),!1}},processSpecialSettings(e,t,s){var o,a;if(e.classNumber!==void 0){const n=k("server.classNumber");e.classNumber!==n&&(t.push({key:"server.classNumber",name:"班级",oldValue:n,newValue:e.classNumber,description:((o=F["server.classNumber"])==null?void 0:o.description)||"班级编号",icon:((a=F["server.classNumber"])==null?void 0:a.icon)||"mdi-account-group"}),s["server.classNumber"]=e.classNumber)}e.date!==void 0&&e.date!==this.state.dateString&&(t.push({key:"date",name:"日期",oldValue:this.state.dateString,newValue:e.date,description:"查看的日期",icon:"mdi-calendar"}),s.date=e.date),e.subjects&&Array.isArray(e.subjects)&&(t.push({key:"subjects",name:"科目列表",oldValue:`${this.state.availableSubjects.length}个科目`,newValue:`${e.subjects.length}个科目`,description:"可用科目列表",icon:"mdi-notebook"}),s.subjects=e.subjects)},processStandardSettings(e,t,s,o){Object.entries(e).forEach(([a,n])=>{if(["classNumber","date","subjects"].includes(a))return;let c=a,p=F[a];if(!p&&!a.includes(".")){const v=["server.","display.","theme.","edit.","refresh.","font.","randomPicker."];for(const d of v){const w=`${d}${a}`;if(F[w]){c=w,p=F[w];break}}}if(p){let v=this.convertValueToCorrectType(n,p.type);if(p.validate&&!p.validate(v)){console.warn(`URL配置项 ${c} 的值无效: ${n}`);return}const d=k(c);v!==d&&(t.push({key:c,name:this.getSettingDisplayName(c),oldValue:this.formatSettingValue(d),newValue:this.formatSettingValue(v),description:p.description||c,icon:p.icon||"mdi-cog"}),s[c]=v,o[c]=p.icon||"mdi-cog")}else t.push({key:a,name:this.getSettingDisplayName(a),oldValue:"未知",newValue:this.formatSettingValue(n),description:"自定义配置项",icon:"mdi-cog-outline"}),s[a]=n,o[a]="mdi-cog-outline"})},convertValueToCorrectType(e,t){return t==="boolean"?!!e:t==="number"?Number(e):String(e)},formatSettingValue(e){return typeof e=="boolean"?e?"开启":"关闭":e===""||e===null||e===void 0?"空":e.toString()},getSettingDisplayName(e){const t=e.split("."),s=t[t.length-1];return{provider:"数据提供方",domain:"服务器域名",classNumber:"班级编号",emptySubjectDisplay:"空科目显示方式",dynamicSort:"动态排序",showRandomButton:"随机按钮",showFullscreenButton:"全屏按钮",cardHoverEffect:"卡片悬浮效果",enhancedTouchMode:"增强触摸模式",showAntiScreenBurnCard:"防烧屏卡片",mode:"主题模式",size:"字体大小",autoSave:"自动保存",blockNonTodayAutoSave:"禁止自动保存非当日",refreshBeforeEdit:"编辑前刷新",confirmNonTodaySave:"非当日保存确认",auto:"自动刷新",interval:"刷新间隔"}[s]||s},safeBase64Decode(e){try{return de.decode(e)}catch(t){throw console.error("Base64解码错误:",t),new Error("无法解码配置数据")}},applyUrlConfig(e){for(const[t,s]of Object.entries(e)){if(t==="date"){this.handleDateSelect(s);continue}if(t==="subjects"){this.state.availableSubjects=s;continue}se(t,s),t==="server.classNumber"&&(this.state.classNumber=s)}return this.updateBackendUrl(),this.$message.success("URL配置已应用","已从URL加载配置"),!0},navigateDay(e){const t=new Date(this.state.selectedDateObj);t.setDate(t.getDate()+e),this.handleDateSelect(t)},async copyHomeworkToToday(){if(!this.loading.copyToToday)try{this.loading.copyToToday=!0;const e=this.state.dateString,t=JSON.parse(JSON.stringify(this.state.boardData.homework)),s=this.getToday(),o=this.formatDate(s);this.state.dateString=o,await this.downloadData();const a={};for(const c in t)t[c]&&t[c].content&&(t[c].type==="custom"?a[c]=JSON.parse(JSON.stringify(t[c])):a[c]={content:t[c].content});this.state.boardData.homework=a,this.state.synced=!1,await this.uploadData(),this.state.selectedDate=o,this.state.selectedDateObj=s,this.state.isToday=!0;const n=new URL(window.location);n.searchParams.delete("date"),window.history.pushState({},"",n),this.$message.success("复制成功",`已将 ${e} 的作业内容复制到今天(已替换原有作业)`)}catch(e){console.error("复制作业失败:",e),this.$message.error("复制失败",e.message||"请重试")}finally{this.loading.copyToToday=!1}},parsePreconfigData(){try{const e=new URLSearchParams(window.location.search),t=e.get("namespace"),s=e.get("authCode")||e.get("auth_code"),o=e.get("autoExecute")||e.get("auto_execute");t&&(this.preconfigData.namespace=t,this.preconfigData.authCode=s,this.preconfigData.autoOpen=!0,this.preconfigData.autoExecute=this.parseBoolean(o),console.log("检测到预配数据:",{namespace:this.preconfigData.namespace,hasAuthCode:!!this.preconfigData.authCode,autoExecute:this.preconfigData.autoExecute}),this.cleanupUrlParams(["namespace","authCode","auth_code","autoExecute","auto_execute"]))}catch(e){console.error("解析预配数据失败:",e)}},parseBoolean(e){if(!e)return!1;const t=e.toLowerCase();return t==="true"||t==="1"||t==="yes"},cleanupUrlParams(e){try{const t=new URL(window.location);let s=!1;e.forEach(o=>{t.searchParams.has(o)&&(t.searchParams.delete(o),s=!0)}),s&&window.history.replaceState({},document.title,t.toString())}catch(t){console.error("清理URL参数失败:",t)}},async loadPersistentNotifications(){try{const e=await L.loadData("notification-list");e&&Array.isArray(e)?this.persistentNotifications=e:e&&e.success!==!1&&Array.isArray(e.data)?this.persistentNotifications=e.data:this.persistentNotifications=[]}catch(e){console.error("加载常驻通知失败",e)}},showNotificationDetail(e){this.currentNotification=e,this.notificationDetailDialog=!0},async removePersistentNotification(e){this.persistentNotifications=this.persistentNotifications.filter(s=>s.id!==e);const t=this.persistentNotifications.length>0?this.persistentNotifications:{};await L.saveData("notification-list",t),this.notificationDetailDialog=!1}}},os={key:3,class:"d-flex"},is={class:"text-h6 text-truncate font-weight-bold"},rs={class:"text-h4 font-weight-medium mb-4",style:{"line-height":"1.5"}},ls={class:"text-subtitle-1 text-grey"},ds={class:"d-flex align-center flex-wrap"},cs={class:"text-subtitle-1"},us={class:"text-grey-darken-1"},hs={class:"text-primary font-weight-medium"},ms={key:1,class:"text-center py-4 text-grey"};function fs(e,t,s,o,a,n){const c=x("init-service-chooser"),p=x("StudentNameManager"),v=x("HomeSkeleton"),d=x("homework-grid"),w=x("home-actions"),B=x("pwa-install-card"),P=x("attendance-sidebar"),W=x("homework-edit-dialog"),G=x("attendance-management-dialog"),ge=x("message-log"),ye=x("floating-toolbar"),pe=x("FloatingICP"),ke=x("ChatWidget"),we=x("UrgentTestDialog"),ve=x("random-picker"),De=x("exam-config-editor");return l(),g(b,null,[i(Pe,{class:"no-select"},{append:r(()=>[a.tokenDisplayInfo.readonly?(l(),y(z,{key:0,class:"mx-2",color:"warning","prepend-icon":"mdi-lock-alert",variant:"tonal"},{default:r(()=>[...t[29]||(t[29]=[h(" 只读 ",-1)])]),_:1})):S("",!0),a.tokenDisplayInfo.show?(l(),y(z,{key:1,style:A({cursor:a.tokenDisplayInfo.disabled?"default":"pointer"}),class:"mx-2",color:"primary","prepend-icon":"mdi-account",variant:"tonal",onClick:n.handleTokenChipClick},{default:r(()=>[h(m(a.tokenDisplayInfo.text),1)]),_:1},8,["style","onClick"])):S("",!0),n.shouldShowUrgentTestButton?(l(),y(D,{key:2,"prepend-icon":"mdi-chat",onClick:t[0]||(t[0]=u=>a.urgentTestDialog=!0),variant:"tonal"},{default:r(()=>[...t[30]||(t[30]=[h("发送通知",-1)])]),_:1})):S("",!0),i(D,{icon:"mdi-chat",variant:"text",onClick:t[1]||(t[1]=u=>a.isChatOpen=!0)}),i(D,{badge:n.unreadCount||void 0,"badge-color":n.unreadCount?"error":void 0,icon:"mdi-bell",variant:"text",onClick:t[2]||(t[2]=u=>e.$refs.messageLog.drawer=!0)},null,8,["badge","badge-color"]),i(D,{icon:"mdi-cog",variant:"text",onClick:t[3]||(t[3]=u=>e.$router.push("/settings"))})]),default:r(()=>[i(Le,null,{default:r(()=>[h(m(n.titleText),1)]),_:1}),i(V)]),_:1}),n.shouldShowInit?(l(),y(c,{key:0,preconfig:a.preconfigData,onDone:t[4]||(t[4]=u=>a.settingsTick++)},null,8,["preconfig"])):S("",!0),n.shouldShowInit?S("",!0):(l(),y(p,{key:1,ref:"studentNameManager",onTokenInfoUpdated:n.updateTokenDisplayInfo},null,8,["onTokenInfoUpdated"])),!n.shouldShowInit&&!a.dataReady?(l(),y(v,{key:2})):S("",!0),!n.shouldShowInit&&a.dataReady?(l(),g("div",os,[i(ce,{class:"main-window flex-grow-1 no-select bloom-container",fluid:""},{default:r(()=>[a.persistentNotifications.length>0?(l(),y(ze,{key:0,class:"mb-4"},{default:r(()=>[i(je,{cols:"12"},{default:r(()=>[(l(!0),g(b,null,C(a.persistentNotifications,u=>(l(),y(T,{key:u.id,color:u.isUrgent?"error":"primary",class:"mb-2 cursor-pointer",variant:"tonal",onClick:q=>n.showNotificationDetail(u)},{default:r(()=>[i(_,{class:"d-flex align-center py-3"},{default:r(()=>[f("span",is,m(u.message),1),i(V),i(D,{icon:"mdi-chevron-right",variant:"text"})]),_:2},1024)]),_:2},1032,["color","onClick"]))),128))]),_:1})]),_:1})):S("",!0),i(j,{modelValue:a.notificationDetailDialog,"onUpdate:modelValue":t[8]||(t[8]=u=>a.notificationDetailDialog=u),"max-width":"700",scrollable:""},{default:r(()=>[a.currentNotification?(l(),y(T,{key:0,class:"rounded-xl"},{default:r(()=>[i(N,{class:"d-flex align-center pa-4 text-h5"},{default:r(()=>[f("span",{class:U([a.currentNotification.isUrgent?"text-error":"","font-weight-bold"])},m(a.currentNotification.isUrgent?"强调通知":"通知详情"),3),i(V),i(D,{icon:"mdi-close",variant:"text",onClick:t[5]||(t[5]=u=>a.notificationDetailDialog=!1)})]),_:1}),i($),i(_,{class:"pa-6"},{default:r(()=>[f("div",rs,m(a.currentNotification.message),1),f("div",ls," 发布时间:"+m(n.formatTime(a.currentNotification.timestamp)),1)]),_:1}),i($),i(M,{class:"pa-4"},{default:r(()=>[i(D,{color:"error","prepend-icon":"mdi-delete",size:"x-large",variant:"tonal",class:"px-6",onClick:t[6]||(t[6]=u=>n.removePersistentNotification(a.currentNotification.id))},{default:r(()=>[...t[31]||(t[31]=[h(" 删除通知 ",-1)])]),_:1}),i(V),i(D,{color:"primary",size:"x-large",variant:"elevated",class:"px-8",onClick:t[7]||(t[7]=u=>a.notificationDetailDialog=!1)},{default:r(()=>[...t[32]||(t[32]=[h(" 关闭 ",-1)])]),_:1})]),_:1})]),_:1})):S("",!0)]),_:1},8,["modelValue"]),i(d,{"sorted-items":n.sortedItems,"unused-subjects":n.unusedSubjects,"empty-subject-display":n.emptySubjectDisplay,"is-mobile":n.isMobile,"is-editing-disabled":n.isEditingDisabled,"content-style":a.state.contentStyle,"highlighted-cards":a.highlightedCards,onOpenDialog:n.openDialog,onOpenAttendance:n.setAttendanceArea,onDisabledClick:n.handleDisabledClick,onOpenExamDetail:n.openExamDetail},null,8,["sorted-items","unused-subjects","empty-subject-display","is-mobile","is-editing-disabled","content-style","highlighted-cards","onOpenDialog","onOpenAttendance","onDisabledClick","onOpenExamDetail"]),i(w,{synced:a.state.synced,"loading-upload":a.loading.upload,"show-random-picker-button":n.showRandomPickerButton,"show-exam-schedule-button":n.showExamScheduleButton,"show-list-card-button":n.showListCardButton,"show-fullscreen-button":n.showFullscreenButton,"is-fullscreen":a.state.isFullscreen,"show-anti-screen-burn-card":n.showAntiScreenBurnCard,"show-test-card-button":n.showTestCardButton,onUpload:n.manualUpload,onShowSyncMessage:n.showSyncMessage,onOpenRandomPicker:n.openRandomPicker,onToggleFullscreen:n.toggleFullscreen,onAddTestCard:n.addTestCard,onAddExamCard:t[9]||(t[9]=u=>a.showAddExamDialog=!0)},null,8,["synced","loading-upload","show-random-picker-button","show-exam-schedule-button","show-list-card-button","show-fullscreen-button","is-fullscreen","show-anti-screen-burn-card","show-test-card-button","onUpload","onShowSyncMessage","onOpenRandomPicker","onToggleFullscreen","onAddTestCard"]),i(B),a.upcomingExams.length>0&&!n.hasExamCard?(l(),y(Me,{key:1,class:"mt-4",color:"info",variant:"tonal",closable:"",icon:"mdi-calendar-clock",title:"近期有考试安排"},{append:r(()=>[i(D,{color:"primary",variant:"text",onClick:n.addAllUpcomingExams},{default:r(()=>[...t[34]||(t[34]=[h(" 一键添加 ",-1)])]),_:1},8,["onClick"])]),default:r(()=>[f("div",ds,[t[33]||(t[33]=f("span",{class:"mr-2"},"检测到未来两天内有以下考试:",-1)),(l(!0),g(b,null,C(a.upcomingExams,u=>(l(),y(z,{key:u.id,size:"small",class:"mr-1 mb-1",color:"primary"},{default:r(()=>[h(m(u.examName),1)]),_:2},1024))),128))])]),_:1})):S("",!0)]),_:1}),n.isMobile?S("",!0):(l(),y(P,{key:0,"student-list":a.state.studentList,attendance:a.state.boardData.attendance,"is-editing-disabled":n.isEditingDisabled,onClick:n.setAttendanceArea,onDisabledClick:n.handleDisabledClick},null,8,["student-list","attendance","is-editing-disabled","onClick","onDisabledClick"]))])):S("",!0),i(W,{modelValue:a.state.dialogVisible,"onUpdate:modelValue":t[10]||(t[10]=u=>a.state.dialogVisible=u),"auto-save":n.autoSave,"initial-content":a.state.textarea,title:a.state.dialogTitle,"is-editing-past-data":n.isEditingPastData,"current-date-string":a.state.dateString,onSave:n.handleHomeworkSave},null,8,["modelValue","auto-save","initial-content","title","is-editing-past-data","current-date-string","onSave"]),i(Se,{modelValue:a.state.snackbar,"onUpdate:modelValue":t[11]||(t[11]=u=>a.state.snackbar=u),timeout:2e3},{default:r(()=>[h(m(a.state.snackbarText),1)]),_:1},8,["modelValue"]),i(G,{modelValue:a.state.attendanceDialog,"onUpdate:modelValue":t[12]||(t[12]=u=>a.state.attendanceDialog=u),"student-list":a.state.studentList,attendance:a.state.boardData.attendance,"date-string":a.state.dateString,onSave:n.saveAttendance,onChange:n.handleAttendanceChange},null,8,["modelValue","student-list","attendance","date-string","onSave","onChange"]),i(ge,{ref:"messageLog"},null,512),i(ye,{"is-today":n.isToday,loading:a.loading.download,"copy-to-today-loading":a.loading.copyToToday,"selected-date":a.state.selectedDateObj,"unread-count":n.unreadCount,onRefresh:n.downloadData,onZoom:n.zoom,onOpenMessages:t[13]||(t[13]=u=>e.$refs.messageLog.drawer=!0),onOpenSettings:t[14]||(t[14]=u=>e.$router.push("/settings")),onDateSelect:n.handleDateSelect,onPrevDay:t[15]||(t[15]=u=>n.navigateDay(-1)),onNextDay:t[16]||(t[16]=u=>n.navigateDay(1)),onCopyToToday:n.copyHomeworkToToday},null,8,["is-today","loading","copy-to-today-loading","selected-date","unread-count","onRefresh","onZoom","onDateSelect","onCopyToToday"]),i(pe),i(ke,{modelValue:a.isChatOpen,"onUpdate:modelValue":t[17]||(t[17]=u=>a.isChatOpen=u),"show-button":!1},null,8,["modelValue"]),i(we,{modelValue:a.urgentTestDialog,"onUpdate:modelValue":t[18]||(t[18]=u=>a.urgentTestDialog=u)},null,8,["modelValue"]),i(j,{modelValue:a.confirmDialog.show,"onUpdate:modelValue":t[19]||(t[19]=u=>a.confirmDialog.show=u),"max-width":"400"},{default:r(()=>[i(T,null,{default:r(()=>[i(N,{class:"text-h6"},{default:r(()=>[...t[35]||(t[35]=[h(" 确认保存",-1)])]),_:1}),i(_,null,{default:r(()=>[h(" 您正在修改 "+m(a.state.dateString)+" 的数据,确定要保存吗? ",1)]),_:1}),i(M,null,{default:r(()=>[i(V),i(D,{color:"grey",variant:"text",onClick:a.confirmDialog.reject},{default:r(()=>[...t[36]||(t[36]=[h(" 取消 ",-1)])]),_:1},8,["onClick"]),i(D,{color:"primary",onClick:a.confirmDialog.resolve},{default:r(()=>[...t[37]||(t[37]=[h(" 确认保存",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),i(ve,{ref:"randomPicker",attendance:a.state.boardData.attendance,"student-list":a.state.studentList},null,8,["attendance","student-list"]),i(j,{modelValue:a.urlConfigDialog.show,"onUpdate:modelValue":t[20]||(t[20]=u=>a.urlConfigDialog.show=u),"max-width":"500"},{default:r(()=>[i(T,null,{default:r(()=>[i(N,{class:"text-h6"},{default:r(()=>[...t[38]||(t[38]=[h(" 确认应用URL配置",-1)])]),_:1}),i(_,null,{default:r(()=>[t[39]||(t[39]=f("p",null,"以下配置将应用于当前班级:",-1)),i(X,{density:"compact"},{default:r(()=>[(l(!0),g(b,null,C(a.urlConfigDialog.changes,u=>(l(),y(Z,{key:u.key},{prepend:r(()=>[i(R,{icon:u.icon,class:"mr-2",size:"small"},null,8,["icon"])]),default:r(()=>[i(be,{class:"d-flex align-center"},{default:r(()=>[f("span",cs,m(u.name),1),i(Ue,{activator:"parent",location:"top"},{default:r(()=>[h(m(u.description||u.key),1)]),_:2},1024)]),_:2},1024),i(xe,null,{default:r(()=>[f("span",us,m(u.oldValue),1),i(R,{class:"mx-1",icon:"mdi-arrow-right",size:"small"}),f("span",hs,m(u.newValue),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1}),i(M,null,{default:r(()=>[i(V),i(D,{color:"grey",variant:"text",onClick:a.urlConfigDialog.cancelHandler},{default:r(()=>[...t[40]||(t[40]=[h(" 取消 ",-1)])]),_:1},8,["onClick"]),i(D,{color:"primary",onClick:a.urlConfigDialog.confirmHandler},{default:r(()=>[...t[41]||(t[41]=[h(" 确认应用 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),i(j,{modelValue:a.showExamDetailDialog,"onUpdate:modelValue":t[23]||(t[23]=u=>a.showExamDetailDialog=u),persistent:"",fullscreen:""},{default:r(()=>[a.selectedExamId?(l(),y(T,{key:0},{default:r(()=>[i(N,{class:"d-flex align-center pa-4"},{default:r(()=>[t[42]||(t[42]=h(" 编辑考试配置 ",-1)),i(V),i(D,{icon:"mdi-close",variant:"text",onClick:t[21]||(t[21]=u=>a.showExamDetailDialog=!1)})]),_:1}),i(_,{class:"pa-4",style:{"max-height":"70vh","overflow-y":"auto"}},{default:r(()=>[i(De,{"config-id":a.selectedExamId,"dialog-mode":!0,onSaved:n.onExamConfigSaved,onDeleted:n.onExamConfigDeleted},null,8,["config-id","onSaved","onDeleted"])]),_:1}),i($),i(M,{class:"pa-4"},{default:r(()=>[i(D,{color:"error","prepend-icon":"mdi-delete",variant:"tonal",onClick:n.removeCurrentExamCard},{default:r(()=>[...t[43]||(t[43]=[h(" 移除卡片 ",-1)])]),_:1},8,["onClick"]),i(V),i(D,{color:"primary",variant:"text",onClick:t[22]||(t[22]=u=>a.showExamDetailDialog=!1)},{default:r(()=>[...t[44]||(t[44]=[h(" 关闭 ",-1)])]),_:1})]),_:1})]),_:1})):S("",!0)]),_:1},8,["modelValue"]),i(j,{modelValue:a.showAddExamDialog,"onUpdate:modelValue":t[25]||(t[25]=u=>a.showAddExamDialog=u),"max-width":"500"},{default:r(()=>[i(T,null,{default:r(()=>[i(N,{class:"text-h6"},{default:r(()=>[...t[45]||(t[45]=[h("预览考试看板",-1)])]),_:1}),i(_,null,{default:r(()=>[o.examStore.examList.length>0?(l(),y(X,{key:0},{default:r(()=>[(l(!0),g(b,null,C(o.examStore.examList,u=>{var q;return l(),y(Z,{key:u.id,title:((q=o.examStore.exams[u.id])==null?void 0:q.examName)||u.id,subtitle:u.id,onClick:ys=>n.addExamCard(u.id)},{prepend:r(()=>[i(R,{color:"primary"},{default:r(()=>[...t[46]||(t[46]=[h("mdi-calendar-text",-1)])]),_:1})]),append:r(()=>[i(D,{icon:n.isExamCardAdded(u.id)?"mdi-check":"mdi-plus",color:n.isExamCardAdded(u.id)?"success":"grey",variant:"text"},null,8,["icon","color"])]),_:2},1032,["title","subtitle","onClick"])}),128))]),_:1})):(l(),g("div",ms," 暂无考试配置 "))]),_:1}),i(M,null,{default:r(()=>[i(V),i(D,{color:"primary",variant:"text",onClick:t[24]||(t[24]=u=>a.showAddExamDialog=!1)},{default:r(()=>[...t[47]||(t[47]=[h("关闭",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),i(j,{modelValue:a.notificationDetailDialog,"onUpdate:modelValue":t[28]||(t[28]=u=>a.notificationDetailDialog=u),"max-width":"600"},{default:r(()=>[a.currentNotification?(l(),y(T,{key:0},{default:r(()=>[i(N,{class:U(["headline",a.currentNotification.isUrgent?"text-error":"text-primary"])},{default:r(()=>[h(m(a.currentNotification.isUrgent?"强调通知":"通知详情"),1)]),_:1},8,["class"]),i(_,{class:"text-h5 py-4"},{default:r(()=>[h(m(a.currentNotification.message),1)]),_:1}),i(M,null,{default:r(()=>[i(D,{color:"error",variant:"text",onClick:t[26]||(t[26]=u=>n.removePersistentNotification(a.currentNotification.id))},{default:r(()=>[...t[48]||(t[48]=[h("删除",-1)])]),_:1}),i(V),i(D,{color:"primary",onClick:t[27]||(t[27]=u=>a.notificationDetailDialog=!1)},{default:r(()=>[...t[49]||(t[49]=[h("关闭",-1)])]),_:1})]),_:1})]),_:1})):S("",!0)]),_:1},8,["modelValue"]),t[50]||(t[50]=f("br",null,null,-1)),t[51]||(t[51]=f("br",null,null,-1)),t[52]||(t[52]=f("br",null,null,-1))],64)}const gs=O(ns,[["render",fs]]),Ns=Object.freeze(Object.defineProperty({__proto__:null,default:gs},Symbol.toStringTag,{value:"Module"}));export{Ns as i,ee as u};