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

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