mirror of
https://github.com/ZeroCatDev/Classworks.git
synced 2025-12-07 21:13:11 +00:00
14 lines
158 KiB
JavaScript
14 lines
158 KiB
JavaScript
import{_ as te,k as C,s as pe,j as w,o as f,w as i,d as n,l as _,q as Y,t as c,v as D,x as K,y as k,z as A,i as r,A as y,B as x,C as g,D as bt,F as N,E as he,T as Ye,G as M,e as we,H as ie,I as re,n as Ie,J as Te,K as xe,L as je,M as de,N as it,O as at,P as Ke,Q as Me,R as wt,S as Ve,U as tn,W as nn,X as Pe,Y as sn,g as an,p as ln,Z as on,$ as P,a0 as Ee,a1 as rn,a2 as dn,a3 as We,a4 as un,a5 as q,a6 as Se,a7 as lt,a8 as cn,c as fn,a9 as mn,aa as hn,ab as vn,ac as gn,ad as pn,ae as yn,af as ot,ag as kn,ah as rt,ai as xt,aj as St,ak as bn,al as dt,am as Ae,an as Fe,ao as wn,ap as xn,aq as Sn,ar as Ue}from"./index-DCfuJPuG.js";import{V as De,u as Cn,m as Dn}from"./VTextField-BRbhN_Cz.js";import{V as Ze,a as _n}from"./VBadge-CGohtVff.js";import{V as B}from"./VChip-jjIP7g4a.js";import{s as Tn,g as Ct,j as Xe,o as be,a as Vn,l as In}from"./socketClient-Uz_3CJu-.js";import{f as Nn,s as En,c as Dt}from"./deviceEvents-Dd2e16zV.js";import{V as ge,a as se}from"./VRow-Zp5wXpZ4.js";import{V as An,u as Un,a as Fn,b as Mn,c as Pn,h as zn,m as Ln,d as Rn}from"./filter-m2Xlp4v-.js";import{V as ze}from"./VTextarea-C4V-n3Cg.js";import{d as fe,k as Bn}from"./dataProvider-RNYuBa7r.js";import{V as ut,a as ct,b as $n,c as On}from"./VAppBarTitle-CtnYOVIt.js";import{V as _t}from"./VContainer-BtTiuWI7.js";import{V as ft}from"./VForm-CdagSBg-.js";import{V as mt}from"./VSwitch-B2qOcUn1.js";import{V as ht}from"./VCheckbox-DbxrEffN.js";import{V as Tt}from"./VMenu-HWv8qFs5.js";import{V as jn}from"./VDatePicker-BxLWlS-i.js";import{p as vt,_ as Vt}from"./index-H6zZVeLz.js";import{V as Le}from"./VAlert-CAj-d93P.js";import{a as Ce,g as Kn}from"./axios-tV22qYsA.js";import{V as Hn}from"./VCheckboxBtn-B50rmDo0.js";import{V as qn,a as gt,b as pt,c as yt}from"./VExpansionPanels-202Q3H96.js";import"./VSelectionControl-Cy5nWFk1.js";import"./VSheet-CdftSqcU.js";const Qn={name:"RandomPicker",props:{studentList:{type:Array,required:!0},attendance:{type:Object,required:!0,default:()=>({absent:[],late:[],exclude:[]})}},data(){return{dialog:!1,count:C("randomPicker.defaultCount"),isPickingStarted:!1,isAnimating:!1,pickedStudents:[],animationStudents:[],highlightedIndices:[],animationTimer:null,getSetting:C,tempFilters:{excludeAbsent:C("randomPicker.excludeAbsent"),excludeLate:C("randomPicker.excludeLate"),excludeExcluded:C("randomPicker.excludeExcluded")},pickerMode:C("randomPicker.mode"),minNumber:C("randomPicker.minNumber"),maxNumber:C("randomPicker.maxNumber")}},computed:{absentCount(){return this.attendance.absent?this.attendance.absent.length:0},lateCount(){return this.attendance.late?this.attendance.late.length:0},excludedCount(){return this.attendance.exclude?this.attendance.exclude.length:0},numberModeStudents(){if(this.pickerMode!=="number")return[];const t=[];for(let e=this.minNumber;e<=this.maxNumber;e++)t.push(e.toString().padStart(2,"0")+"号");return t},filteredStudents(){return this.pickerMode==="number"?this.numberModeStudents:!this.studentList||!this.studentList.length?[]:this.studentList.filter(t=>!(this.tempFilters.excludeAbsent&&this.attendance.absent.includes(t)||this.tempFilters.excludeLate&&this.attendance.late.includes(t)||this.tempFilters.excludeExcluded&&this.attendance.exclude.includes(t)))},availableStudents(){return this.filteredStudents},maxAllowedCount(){return Math.min(10,this.filteredStudents.length)},remainingStudents(){return this.filteredStudents.filter(t=>!this.pickedStudents.includes(t))}},watch:{dialog(t){t?(this.count=C("randomPicker.defaultCount"),this.isPickingStarted=!1,this.isAnimating=!1,this.pickedStudents=[],this.tempFilters={excludeAbsent:C("randomPicker.excludeAbsent"),excludeLate:C("randomPicker.excludeLate"),excludeExcluded:C("randomPicker.excludeExcluded")}):this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},tempFilters:{handler(){this.count>this.maxAllowedCount&&(this.count=Math.max(1,this.maxAllowedCount))},deep:!0},pickerMode:{handler(t){pe("randomPicker.mode",t)}},minNumber:{handler(t){t>this.maxNumber&&(this.minNumber=this.maxNumber),t<1&&(this.minNumber=1),pe("randomPicker.minNumber",this.minNumber)}},maxNumber:{handler(t){t<this.minNumber&&(this.maxNumber=this.minNumber),t>100&&(this.maxNumber=100),pe("randomPicker.maxNumber",this.maxNumber)}}},methods:{open(){this.dialog=!0},incrementCount(){this.count<this.maxAllowedCount&&this.count++},decrementCount(){this.count>1&&this.count--},startPicking(){this.filteredStudents.length!==0&&(this.isPickingStarted=!0,C("randomPicker.animation")?this.startAnimation():this.finishPicking())},startAnimation(){this.isAnimating=!0,this.animationStudents=this.filteredStudents.map((t,e)=>({id:`student-${e}`,name:t})),this.animateHighlight()},animateHighlight(){let e=0;const a=50,d=()=>{this.highlightedIndices=[];const s=[];for(let o=0;o<this.count;o++){let u;do u=Math.floor(Math.random()*this.animationStudents.length);while(s.includes(u));s.push(u)}this.highlightedIndices=s,e++;const l=a+e*20;e<5?this.animationTimer=setTimeout(d,l):setTimeout(()=>{this.finishPicking()},500)};d()},finishPicking(){this.isAnimating=!1;const t=[...this.filteredStudents].sort(()=>.5-Math.random());this.pickedStudents=t.slice(0,this.count)},resetPicker(){this.isPickingStarted=!1,this.isAnimating=!1,this.pickedStudents=[],this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},refreshSingleStudent(t){if(this.remainingStudents.length===0)return;const e=Math.floor(Math.random()*this.remainingStudents.length),a=this.remainingStudents[e];this.pickedStudents[t]=a;const d=document.querySelectorAll(".result-card");d[t]&&(d[t].classList.add("refresh-animation"),setTimeout(()=>{d[t].classList.remove("refresh-animation")},500))}}},Wn={class:"d-flex justify-center align-center counter-container"},Gn={class:"count-display mx-8"},Jn={class:"text-h2 font-weight-bold"},Yn={class:"mode-switch-container mt-6"},Xn={key:0,class:"number-range-container mt-4"},Zn={class:"d-flex justify-center align-center gap-4"},es={class:"mt-4"},ts={key:1,class:"mt-4 text-error"},ns={class:"mt-4 text-caption"},ss={class:"pa-2"},is={key:0},as={key:1},ls={key:2},os={key:1,class:"d-flex flex-wrap justify-center gap-2 mt-4"},rs={key:0,class:"animation-container"},ds={class:"animation-wrapper"},us={key:1,class:"result-container"},cs={class:"mt-8 d-flex justify-center"};function fs(t,e,a,d,s,l){return f(),w(ie,{modelValue:s.dialog,"onUpdate:modelValue":e[8]||(e[8]=o=>s.dialog=o),"fullscreen-breakpoint":"sm","max-width":"600",persistent:""},{default:i(()=>[n(_,{border:"",class:"random-picker-card",rounded:"xl"},{default:i(()=>[n(Y,{class:"text-h5 d-flex align-center"},{default:i(()=>[n(D,{class:"mr-2",icon:"mdi-account-question"}),e[9]||(e[9]=c(" 随机点名 ",-1)),n(K),n(k,{icon:"mdi-close",variant:"text",onClick:e[0]||(e[0]=o=>s.dialog=!1)})]),_:1}),s.isPickingStarted?(f(),w(A,{key:1,class:"text-center py-6"},{default:i(()=>[s.isAnimating?(f(),y("div",rs,[r("div",ds,[n(Ye,{class:"shuffle-container",name:"shuffle",tag:"div"},{default:i(()=>[(f(!0),y(N,null,M(s.animationStudents,(o,u)=>(f(),y("div",{key:o.id,class:we([{highlighted:s.highlightedIndices.includes(u)},"student-item"])},g(o.name),3))),128))]),_:1})])])):(f(),y("div",us,[e[19]||(e[19]=r("div",{class:"text-h6 mb-4"},"抽取结果",-1)),(f(!0),y(N,null,M(s.pickedStudents,(o,u)=>(f(),w(_,{key:u,class:"mb-2 result-card",color:"primary",variant:"outlined"},{default:i(()=>[n(A,{class:"text-h4 text-center py-4 d-flex align-center justify-center"},{default:i(()=>[c(g(o)+" ",1),n(k,{disabled:l.remainingStudents.length===0,title:l.remainingStudents.length===0?"没有更多可用学生":"重新抽取此学生",class:"ml-2 refresh-btn",icon:"mdi-refresh",size:"small",variant:"text",onClick:h=>l.refreshSingleStudent(u)},null,8,["disabled","title","onClick"])]),_:2},1024)]),_:2},1024))),128)),r("div",cs,[n(k,{class:"mx-2",color:"primary","prepend-icon":"mdi-refresh",size:"large",onClick:l.resetPicker},{default:i(()=>[...e[17]||(e[17]=[c(" 重新抽取 ",-1)])]),_:1},8,["onClick"]),n(k,{class:"mx-2",color:"grey",size:"large",variant:"outlined",onClick:e[7]||(e[7]=o=>s.dialog=!1)},{default:i(()=>[...e[18]||(e[18]=[c(" 关闭 ",-1)])]),_:1})])]))]),_:1})):(f(),w(A,{key:0,class:"text-center py-6"},{default:i(()=>[e[16]||(e[16]=r("div",{class:"text-h6 mb-4"},"请选择抽取人数",-1)),r("div",Wn,[n(k,{disabled:s.count<=1,class:"counter-btn",color:"primary",icon:"mdi-minus",size:"x-large",variant:"tonal",onClick:l.decrementCount},null,8,["disabled","onClick"]),r("div",Gn,[r("span",Jn,g(s.count),1),e[10]||(e[10]=r("span",{class:"text-subtitle-1 ml-2"},"人",-1))]),n(k,{disabled:s.count>=l.maxAllowedCount,class:"counter-btn",color:"primary",icon:"mdi-plus",size:"x-large",variant:"tonal",onClick:l.incrementCount},null,8,["disabled","onClick"])]),r("div",Yn,[n(bt,{modelValue:s.pickerMode,"onUpdate:modelValue":e[1]||(e[1]=o=>s.pickerMode=o),class:"mode-toggle",color:"primary",mandatory:"",rounded:"pill"},{default:i(()=>[n(k,{"prepend-icon":"mdi-account",value:"name"},{default:i(()=>[...e[11]||(e[11]=[c("姓名模式",-1)])]),_:1}),n(k,{"prepend-icon":"mdi-numeric",value:"number"},{default:i(()=>[...e[12]||(e[12]=[c("学号模式",-1)])]),_:1})]),_:1},8,["modelValue"])]),s.pickerMode==="number"?(f(),y("div",Xn,[e[14]||(e[14]=r("div",{class:"text-subtitle-1 mb-2"},"学号范围设置",-1)),r("div",Zn,[n(De,{modelValue:s.minNumber,"onUpdate:modelValue":e[2]||(e[2]=o=>s.minNumber=o),modelModifiers:{number:!0},class:"number-input",density:"compact","hide-details":"",label:"最小值",max:"100",min:"1",type:"number"},null,8,["modelValue"]),e[13]||(e[13]=r("span",{class:"mx-2"},"至",-1)),n(De,{modelValue:s.maxNumber,"onUpdate:modelValue":e[3]||(e[3]=o=>s.maxNumber=o),modelModifiers:{number:!0},class:"number-input",density:"compact","hide-details":"",label:"最大值",max:"100",min:"1",type:"number"},null,8,["modelValue"])])])):x("",!0),r("div",es,[n(k,{disabled:l.filteredStudents.length===0,class:"start-btn",color:"primary","prepend-icon":"mdi-dice-multiple",size:"x-large",onClick:l.startPicking},{default:i(()=>[...e[15]||(e[15]=[c(" 开始抽取 ",-1)])]),_:1},8,["disabled","onClick"])]),l.filteredStudents.length===0?(f(),y("div",ts,[s.pickerMode==="name"?(f(),y(N,{key:0},[c(" 没有可抽取的学生,请调整过滤选项 ")],64)):(f(),y(N,{key:1},[c(" 请设置有效的学号范围 ")],64))])):x("",!0),r("div",ns,[c(" 当前可抽取学生: "+g(l.filteredStudents.length)+"人 ",1),s.pickerMode==="name"?(f(),w(Ze,{key:0,location:"bottom"},{activator:i(({props:o})=>[n(D,he({class:"ml-1",icon:"mdi-information-outline",size:"small"},o),null,16)]),default:i(()=>[r("div",ss,[s.tempFilters.excludeAbsent?(f(),y("div",is," • 已排除请假学生 ("+g(l.absentCount)+"人) ",1)):x("",!0),s.tempFilters.excludeLate?(f(),y("div",as," • 已排除迟到学生 ("+g(l.lateCount)+"人) ",1)):x("",!0),s.tempFilters.excludeExcluded?(f(),y("div",ls," • 已排除不参与学生 ("+g(l.excludedCount)+"人) ",1)):x("",!0)])]),_:1})):x("",!0),s.pickerMode==="name"?(f(),y("div",os,[n(B,{color:s.tempFilters.excludeLate?"warning":"default",variant:s.tempFilters.excludeLate?"elevated":"text",class:"filter-chip","prepend-icon":"mdi-clock-alert",onClick:e[4]||(e[4]=o=>s.tempFilters.excludeLate=!s.tempFilters.excludeLate)},{default:i(()=>[c(g(s.tempFilters.excludeLate?"排除":"包含")+"迟到学生 ",1)]),_:1},8,["color","variant"]),n(B,{color:s.tempFilters.excludeAbsent?"error":"default",variant:s.tempFilters.excludeAbsent?"elevated":"text",class:"filter-chip","prepend-icon":"mdi-account-off",onClick:e[5]||(e[5]=o=>s.tempFilters.excludeAbsent=!s.tempFilters.excludeAbsent)},{default:i(()=>[c(g(s.tempFilters.excludeAbsent?"排除":"包含")+"请假学生 ",1)]),_:1},8,["color","variant"]),n(B,{color:s.tempFilters.excludeExcluded?"grey":"default",variant:s.tempFilters.excludeExcluded?"elevated":"text",class:"filter-chip","prepend-icon":"mdi-account-cancel",onClick:e[6]||(e[6]=o=>s.tempFilters.excludeExcluded=!s.tempFilters.excludeExcluded)},{default:i(()=>[c(g(s.tempFilters.excludeExcluded?"排除":"包含")+"不参与学生 ",1)]),_:1},8,["color","variant"])])):x("",!0)])]),_:1}))]),_:1})]),_:1},8,["modelValue"])}const It=te(Qn,[["render",fs],["__scopeId","data-v-85e7eea6"]]),ms={name:"EventSender",emits:["sent","error"],methods:{async sendEvent(t,e={}){try{return Tn(t,e),this.$emit("sent",{eventName:t,content:e,timestamp:new Date().toISOString(),success:!0}),{success:!0,eventId:(e==null?void 0:e.eventId)||null,notificationId:(e==null?void 0:e.notificationId)||null}}catch(a){return console.error("发送事件失败:",a),this.$emit("error",{eventName:t,content:e,error:a.message,timestamp:new Date().toISOString(),success:!1}),{success:!1,error:a.message}}},async sendNotification(t,e=!1,a=[],d={},s=null){const l=`evt-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return this.sendEvent("notification",{eventId:l,notificationId:s,message:t,isUrgent:e,targetDevices:a,senderInfo:d})},async sendReceipt(t,e,a={},d=null){const s=`rcpt-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;return this.sendEvent("notification-receipt",{eventId:s,originalEventId:t,notificationId:d,status:e,deviceInfo:a})},async sendDisplayedReceipt(t={},e=null){const a=`disp-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;return this.sendEvent("notification-displayed",{eventId:a,notificationId:e,deviceInfo:t})},async sendReadReceipt(t={},e=null){const a=`read-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;return this.sendEvent("notification-read",{eventId:a,notificationId:e,deviceInfo:t})}}},hs={style:{display:"none"}};function vs(t,e,a,d,s,l){return f(),y("div",hs)}const He=te(ms,[["render",vs]]),gs={name:"UrgentNotification",components:{EventSender:He},data(){return{visible:!1,notificationQueue:[],currentIndex:0,autoCloseTimer:null,urgentSoundTimer:null}},computed:{currentNotification(){return this.notificationQueue[this.currentIndex]||null},hasNotifications(){return this.notificationQueue.length>0},hasMultipleNotifications(){return this.notificationQueue.length>1},notificationCountText(){return this.hasMultipleNotifications?`${this.currentIndex+1} / ${this.notificationQueue.length}`:""},isUrgent(){var t,e;return((e=(t=this.currentNotification)==null?void 0:t.content)==null?void 0:e.isUrgent)||!1},urgencyColor(){return this.isUrgent?"red darken-2":"blue darken-2"},iconColor(){return"white"},urgencyIcon(){return this.isUrgent?"mdi-alert-circle-outline":"mdi-information-outline"},urgencyTitle(){return this.isUrgent?"🚨 紧急通知":"📢 通知消息"},senderName(){var e,a,d;const t=((e=this.currentNotification)==null?void 0:e.senderInfo)||((d=(a=this.currentNotification)==null?void 0:a.content)==null?void 0:d.senderInfo);return t?t.deviceName||t.deviceType||"未知设备":"未知发送者"},deviceType(){var e,a,d;const t=((e=this.currentNotification)==null?void 0:e.senderInfo)||((d=(a=this.currentNotification)==null?void 0:a.content)==null?void 0:d.senderInfo);return(t==null?void 0:t.deviceType)||"未知类型"},targetDevices(){var t,e;return((e=(t=this.currentNotification)==null?void 0:t.content)==null?void 0:e.targetDevices)||[]}},beforeUnmount(){this.autoCloseTimer&&clearTimeout(this.autoCloseTimer),this.urgentSoundTimer&&clearInterval(this.urgentSoundTimer)},methods:{show(t){var a;if(this.notificationQueue.findIndex(d=>{var s,l;return((s=d.content)==null?void 0:s.notificationId)===((l=t.content)==null?void 0:l.notificationId)})!==-1){console.log("通知已存在,跳过添加");return}this.notificationQueue.push(t),this.visible?(a=t.content)!=null&&a.isUrgent&&!this.isUrgent&&(this.currentIndex=this.notificationQueue.length-1,this.sendDisplayedReceipt(),this.playNotificationSound(),this.startUrgentSound()):(this.currentIndex=this.notificationQueue.length-1,this.visible=!0,this.sendDisplayedReceipt(),this.playNotificationSound(),this.isUrgent&&this.startUrgentSound())},close(){var t,e,a,d;try{this.sendReadReceipt(),console.log("已发送已读回执")}catch(s){console.warn("发送已读回执失败:",s)}if((e=(t=this.currentNotification)==null?void 0:t.content)!=null&&e.message){const s=this.isUrgent?"紧急通知":"通知";this.isUrgent?(a=this.$message)==null||a.error(s,`${this.currentNotification.content.message}`):(d=this.$message)==null||d.info(s,`${this.currentNotification.content.message}`)}this.notificationQueue.length>0&&(this.notificationQueue.splice(this.currentIndex,1),this.currentIndex>=this.notificationQueue.length&&(this.currentIndex=Math.max(0,this.notificationQueue.length-1)),this.notificationQueue.length>0?(this.sendDisplayedReceipt(),this.isUrgent?this.startUrgentSound():this.stopUrgentSound()):this.closeWithoutRead())},closeWithoutRead(){this.visible=!1,this.notificationQueue=[],this.currentIndex=0,this.autoCloseTimer&&(clearTimeout(this.autoCloseTimer),this.autoCloseTimer=null),this.stopUrgentSound()},formatTime(t){if(!t)return"";try{const e=new Date(t);if(new Date-e<24*60*60*1e3){const s=String(e.getHours()).padStart(2,"0"),l=String(e.getMinutes()).padStart(2,"0");return`${s}:${l}`}else{const s=String(e.getMonth()+1).padStart(2,"0"),l=String(e.getDate()).padStart(2,"0");return`${s}/${l}`}}catch{return"无效时间"}},getDeviceTypeLabel(t){return{classroom:"教室设备",student:"学生设备",teacher:"教师设备",admin:"管理员设备",system:"系统设备"}[t]||t},playNotificationSound(){try{const t=new(window.AudioContext||window.webkitAudioContext),e=t.createOscillator(),a=t.createGain();e.connect(a),a.connect(t.destination),e.frequency.value=1e3,e.type="sine",a.gain.value=.3,e.start(),e.stop(t.currentTime+.3)}catch(t){console.warn("无法播放通知音效:",t)}},sendDisplayedReceipt(){var t;try{this.$refs.eventSender&&((t=this.currentNotification)!=null&&t.eventId)&&(this.$refs.eventSender.sendDisplayedReceipt({},this.currentNotification.content.notificationId),console.log("已发送显示回执:",this.currentNotification.eventId))}catch(e){console.warn("发送显示回执失败:",e)}},sendReadReceipt(){var t;try{this.$refs.eventSender&&((t=this.currentNotification)!=null&&t.eventId)&&(this.$refs.eventSender.sendReadReceipt({},this.currentNotification.content.notificationId),console.log("已发送已读回执:",this.currentNotification.eventId))}catch(e){console.warn("发送已读回执失败:",e)}},previousNotification(){this.currentIndex>0&&(this.currentIndex--,this.sendDisplayedReceipt(),this.isUrgent?this.startUrgentSound():this.stopUrgentSound())},nextNotification(){this.currentIndex<this.notificationQueue.length-1&&(this.currentIndex++,this.sendDisplayedReceipt(),this.isUrgent?this.startUrgentSound():this.stopUrgentSound())},startUrgentSound(){this.stopUrgentSound(),this.urgentSoundTimer=setInterval(()=>{this.visible&&this.isUrgent?this.playNotificationSound():this.stopUrgentSound()},1e3)},stopUrgentSound(){this.urgentSoundTimer&&(clearInterval(this.urgentSoundTimer),this.urgentSoundTimer=null)}}},ps={class:"urgent-title mb-6"},ys={key:0,class:"navigation-controls mt-6"},ks={class:"notification-counter mb-3"},bs={class:"navigation-buttons"},ws={class:"mt-8"};function xs(t,e,a,d,s,l){const o=He;return f(),y(N,null,[n(ie,{modelValue:s.visible,"onUpdate:modelValue":e[0]||(e[0]=u=>s.visible=u),"max-width":"800",persistent:"",transition:"dialog-transition",class:"urgent-notification-dialog"},{default:i(()=>[n(_,{class:"urgent-notification-card",color:l.urgencyColor,elevation:"24"},{default:i(()=>[n(A,null,{default:i(()=>{var u,h;return[r("div",ps,g(((h=(u=l.currentNotification)==null?void 0:u.content)==null?void 0:h.message)||"无内容"),1),n(_,{variant:"flat",color:"white"},{default:i(()=>[n(Y,null,{default:i(()=>[...e[1]||(e[1]=[c("发送者信息",-1)])]),_:1}),n(A,null,{default:i(()=>[n(B,{class:"mr-2 mb-2",color:"primary",variant:"outlined",size:"small"},{default:i(()=>[n(D,{left:"",size:"16"},{default:i(()=>[...e[2]||(e[2]=[c(" mdi-account ",-1)])]),_:1}),c(" "+g(l.senderName),1)]),_:1}),n(B,{class:"mr-2 mb-2",color:"info",variant:"outlined",size:"small"},{default:i(()=>[n(D,{left:"",size:"16"},{default:i(()=>[...e[3]||(e[3]=[c(" mdi-devices ",-1)])]),_:1}),c(" "+g(l.deviceType),1)]),_:1}),n(B,{class:"mb-2",color:"success",variant:"outlined",size:"small"},{default:i(()=>{var m;return[n(D,{left:"",size:"16"},{default:i(()=>[...e[4]||(e[4]=[c(" mdi-clock ",-1)])]),_:1}),c(" "+g(l.formatTime((m=l.currentNotification)==null?void 0:m.timestamp)),1)]}),_:1})]),_:1})]),_:1}),l.hasMultipleNotifications?(f(),y("div",ys,[n(_,{variant:"flat",color:"rgba(255,255,255,0.1)"},{default:i(()=>[n(A,{class:"text-center"},{default:i(()=>[r("div",ks,[n(B,{color:"white",variant:"flat",size:"small"},{default:i(()=>[c(g(l.notificationCountText),1)]),_:1})]),r("div",bs,[n(k,{disabled:s.currentIndex===0,color:"white",variant:"outlined",size:"small",onClick:l.previousNotification},{default:i(()=>[n(D,null,{default:i(()=>[...e[5]||(e[5]=[c(" mdi-chevron-left ",-1)])]),_:1}),e[6]||(e[6]=c(" 上一个 ",-1))]),_:1},8,["disabled","onClick"]),n(k,{disabled:s.currentIndex===s.notificationQueue.length-1,color:"white",variant:"outlined",size:"small",class:"ml-2",onClick:l.nextNotification},{default:i(()=>[e[8]||(e[8]=c(" 下一个 ",-1)),n(D,null,{default:i(()=>[...e[7]||(e[7]=[c(" mdi-chevron-right ",-1)])]),_:1})]),_:1},8,["disabled","onClick"])])]),_:1})]),_:1})])):x("",!0),r("div",ws,[n(k,{color:"white",size:"large",variant:"flat",onClick:l.close},{default:i(()=>[n(D,{left:""},{default:i(()=>[...e[9]||(e[9]=[c(" mdi-check ",-1)])]),_:1}),e[10]||(e[10]=c(" 我知道了 ",-1))]),_:1},8,["onClick"])])]}),_:1})]),_:1},8,["color"])]),_:1},8,["modelValue"]),n(o,{ref:"eventSender"},null,512)],64)}const Nt=te(gs,[["render",xs],["__scopeId","data-v-e250350b"]]),Ss={name:"ChatWidget",components:{UrgentNotification:Nt},props:{modelValue:{type:Boolean,default:!1},showButton:{type:Boolean,default:!0},offset:{type:Number,default:16},width:{type:Number,default:380},height:{type:Number,default:520}},emits:["update:modelValue"],data(){return{visible:this.modelValue,text:"",messages:[],allEvents:[],lastVisit:null,unreadCount:0,connected:!1,socketId:"",currentMode:"chat",currentPage:1,itemsPerPage:20,loading:!1,isDestroying:!1,eventStats:{chat:0,kvChanged:0,other:0},cleanupFunctions:[]}},computed:{panelStyle(){return{right:this.offset+"px",bottom:this.offset+"px",width:this.width+"px",height:this.height+"px"}},toggleStyle(){return{right:this.offset+"px",bottom:this.offset+"px"}},canSend(){return!!(C("server.kvToken")&&this.text.trim())},showToggleButton(){return this.$props.showButton&&!this.visible},decoratedMessages(){if(!this.lastVisit)return this.messages;const t=this.messages.findIndex(d=>d.at&&new Date(d.at).getTime()>=new Date(this.lastVisit).getTime());if(t<=0)return this.messages;const e=this.messages.slice(0,t),a=this.messages.slice(t);return[...e,{_id:"divider",_type:"divider"},...a]},currentDisplayItems(){return this.currentMode==="chat"?this.decoratedMessages:this.paginatedEvents},paginatedEvents(){if(this.isDestroying||!this.allEvents)return[];const t=(this.currentPage-1)*this.itemsPerPage,e=t+this.itemsPerPage;return this.allEvents.slice(t,e)},totalPages(){return this.isDestroying||!this.allEvents?1:Math.ceil(this.allEvents.length/this.itemsPerPage)},modeTitle(){return this.currentMode==="chat"?"设备聊天室":"所有事件"}},watch:{modelValue(t){this.visible=t,t&&this.onOpen()}},mounted(){try{const m=localStorage.getItem("chat.lastVisit");m&&(this.lastVisit=m)}catch{}const t=Ct();this.connected=!!t.connected,this.socketId=t.id||"",t.on("connect",()=>{this.connected=!0,this.socketId=t.id||""}),t.on("disconnect",()=>{this.connected=!1});const e=C("server.kvToken");e&&Xe(e);const a=m=>(...p)=>{if(!this.isDestroying)try{m(...p)}catch(I){console.error("ChatWidget 事件处理错误:",I)}},d=be("chat:message",a(m=>{this.pushMessage(m),this.addEvent({_id:`legacy-chat-${Date.now()}-${Math.random()}`,type:"chat:message",content:m,timestamp:m.at||new Date().toISOString(),senderId:m.senderId,uuid:m.uuid,senderInfo:m.senderInfo})})),s=be("chat",a(m=>{if(m&&m.content&&m.content.text){const p={text:m.content.text,senderId:m.senderId,at:m.timestamp,uuid:m.senderId,senderInfo:m.senderInfo};this.pushMessage(p),this.addEvent({_id:m.eventId||`chat-${Date.now()}-${Math.random()}`,type:"chat",content:m.content,timestamp:m.timestamp,eventId:m.eventId,senderId:m.senderId,senderInfo:m.senderInfo})}}));this.deviceEventHandler=Dt({onChat:a((m,p)=>{this.pushMessage(m),this.addEvent(p)}),onKvChanged:a((m,p)=>{this.addEvent(p)}),onUrgentNotice:a((m,p)=>{this.addEvent(p),this.showUrgentNotification(p)}),onNotification:a((m,p)=>{console.log("收到通知事件:",m,p),this.addEvent(p),this.showUrgentNotification(p)}),onOtherEvent:a(m=>{(m.type==="urgent-notice"||m.type==="notification")&&this.showUrgentNotification(m),this.addEvent(m)}),enableLegacySupport:!0});const l=be("device-event",this.deviceEventHandler),o=be("kv-key-changed",a(m=>{m.content&&m.timestamp?this.addEvent({_id:`kv-${Date.now()}-${Math.random()}`,type:"kv-key-changed",content:m.content,timestamp:m.timestamp,eventId:m.eventId,senderId:m.senderId,senderInfo:m.senderInfo}):this.addEvent({_id:`legacy-kv-${Date.now()}-${Math.random()}`,type:"kv-key-changed",content:m,timestamp:m.updatedAt||new Date().toISOString(),uuid:m.uuid})})),u=be("urgent-notice",a(m=>{console.log("收到紧急通知:",m),this.addEvent({_id:`urgent-${Date.now()}-${Math.random()}`,type:"urgent-notice",content:m.content||m,timestamp:m.timestamp||new Date().toISOString(),eventId:m.eventId,senderId:m.senderId,senderInfo:m.senderInfo}),this.showUrgentNotification(m)})),h=be("notification",a(m=>{var p;console.log("收到通知事件:",m),this.addEvent({_id:`notification-${Date.now()}-${Math.random()}`,type:"notification",content:m.content||m,timestamp:m.timestamp||new Date().toISOString(),eventId:m.eventId,senderId:m.senderId,senderInfo:m.senderInfo||((p=m.content)==null?void 0:p.senderInfo)}),this.showUrgentNotification(m)}));this.cleanupFunctions=[d,s,u,h,l,o],this.visible&&this.onOpen()},beforeUnmount(){this.isDestroying=!0,this.cleanupFunctions&&Array.isArray(this.cleanupFunctions)&&this.cleanupFunctions.forEach(t=>{try{typeof t=="function"&&t()}catch(e){console.warn("ChatWidget 清理函数执行失败:",e)}});try{this.offMessage&&this.offMessage(),this.offDeviceEvent&&this.offDeviceEvent(),this.offKvChanged&&this.offKvChanged()}catch(t){console.warn("ChatWidget 旧清理函数执行失败:",t)}this.cleanupFunctions=[],this.messages=[],this.allEvents=[]},methods:{open(){this.visible=!0,this.$emit("update:modelValue",!0),this.onOpen()},close(){this.visible=!1,this.$emit("update:modelValue",!1);try{localStorage.setItem("chat.lastVisit",new Date().toISOString())}catch{}this.unreadCount=0},onOpen(){this.$nextTick(()=>this.scrollToBottom())},insertEmoji(t){this.text+=t,this.$nextTick(()=>{var e,a;if((a=(e=this.$refs.inputRef)==null?void 0:e.$el)!=null&&a.querySelector){const d=this.$refs.inputRef.$el.querySelector("textarea");d==null||d.focus()}})},handleEnter(t){t.shiftKey||this.send()},send(){const t=this.text.trim();if(!t)return;const e={_id:`self-${Date.now()}-${Math.random()}`,text:t,at:new Date().toISOString(),senderId:this.socketId,self:!0,senderInfo:{deviceName:"我",deviceType:"client",isReadOnly:!1}};this.pushMessage(e),this.addEvent({_id:`self-event-${Date.now()}-${Math.random()}`,type:"chat",content:{text:t},timestamp:new Date().toISOString(),senderId:this.socketId,senderInfo:{deviceName:"本设备",deviceType:"client",isReadOnly:!1}}),En(t),this.text=""},pushMessage(t){if(!(this.isDestroying||!t))try{const e={_id:`${t.at||Date.now()}-${Math.random()}`,text:typeof(t==null?void 0:t.text)=="string"?t.text:(t==null?void 0:t.text)||"",at:t.at||new Date().toISOString(),senderId:t.senderId,self:!!(t.senderId&&t.senderId===this.socketId),senderInfo:t.senderInfo||null,deviceName:this.getDeviceName(t.senderInfo,t.senderId===this.socketId)};if(!e.text)return;this.messages.push(e),this.visible||this.unreadCount++,this.$nextTick(()=>{this.isDestroying||this.scrollToBottom()}),this.messages.length>500&&this.messages.shift()}catch(e){console.error("ChatWidget pushMessage 错误:",e)}},formatTime(t){try{const e=new Date(t),a=String(e.getHours()).padStart(2,"0"),d=String(e.getMinutes()).padStart(2,"0");return`${a}:${d}`}catch{return""}},scrollToBottom(){if(!this.isDestroying)try{const t=this.$refs.listRef;if(!t)return;requestAnimationFrame(()=>{!this.isDestroying&&t&&(t.scrollTop=t.scrollHeight)})}catch(t){console.warn("ChatWidget scrollToBottom 错误:",t)}},addEvent(t){if(!(this.isDestroying||!t))try{this.allEvents.unshift(t),t.type==="chat"||t.type==="chat:message"?this.eventStats.chat++:t.type==="kv-key-changed"?this.eventStats.kvChanged++:this.eventStats.other++,this.allEvents.length>200&&(this.allEvents=this.allEvents.slice(0,200))}catch(e){console.error("ChatWidget addEvent 错误:",e)}},getEventColor(t){switch(t){case"chat":case"chat:message":return"success";case"kv-key-changed":return"info";default:return"warning"}},getEventTypeLabel(t){switch(t){case"chat":case"chat:message":return"聊天";case"kv-key-changed":return"KV变化";default:return t}},formatDeviceInfo(t){return Nn(t)},getDeviceName(t,e=!1){return e?"我":t?t.deviceName==="realtime"?"系统":t.deviceName||t.deviceType||"未知设备":"未知设备"},showUrgentNotification(t){try{this.$refs.urgentNotification?this.$refs.urgentNotification.show(t):console.warn("紧急通知组件未找到")}catch(e){console.error("显示紧急通知失败:",e)}}}},Cs={class:"text-subtitle-1"},Ds={key:0,ref:"listRef",class:"messages"},_s={key:0,class:"divider-row"},Ts={class:"avatar"},Vs={class:"bubble"},Is={key:0,class:"sender-name"},Ns={class:"text"},Es={class:"meta"},As={key:0,class:"device-name"},Us={key:1,class:"events-container"},Fs={class:"event-stats mb-3"},Ms={class:"text-h6"},Ps={class:"text-h6"},zs={class:"text-h6"},Ls={class:"events-list"},Rs={class:"d-flex align-center mb-1"},Bs={class:"text-caption"},$s={key:0,class:"mb-1 text-caption"},Os={class:"event-content"},js={key:0,class:"chat-content"},Ks={key:1,class:"text-caption event-data"},Hs={key:0,class:"text-center text-grey pa-4"},qs={key:0,class:"pagination mt-2"};function Qs(t,e,a,d,s,l){const o=Nt;return f(),y(N,null,[l.showToggleButton?(f(),y("div",{key:0,style:Ie(l.toggleStyle),class:"chat-toggle"},[n(k,{color:"primary",icon:"",variant:"flat",onClick:e[0]||(e[0]=u=>l.open())},{default:i(()=>[n(_n,{content:s.unreadCount||void 0,"model-value":s.unreadCount>0,color:"error",overlap:""},{default:i(()=>[n(D,null,{default:i(()=>[...e[7]||(e[7]=[c(" mdi-chat ",-1)])]),_:1})]),_:1},8,["content","model-value"])]),_:1})],4)):x("",!0),re(r("div",{style:Ie(l.panelStyle),class:"chat-panel"},[n(_,{border:"",class:"chat-card",elevation:"8"},{default:i(()=>[n(Y,{class:"d-flex align-center"},{default:i(()=>[n(D,{class:"mr-2"},{default:i(()=>[...e[8]||(e[8]=[c(" mdi-chat-processing ",-1)])]),_:1}),r("span",Cs,g(l.modeTitle),1),n(K),n(bt,{modelValue:s.currentMode,"onUpdate:modelValue":e[1]||(e[1]=u=>s.currentMode=u),class:"mr-2",mandatory:"",size:"small",variant:"outlined"},{default:i(()=>[n(k,{value:"chat",size:"small"},{default:i(()=>[n(D,null,{default:i(()=>[...e[9]||(e[9]=[c("mdi-chat",-1)])]),_:1})]),_:1}),n(k,{value:"events",size:"small"},{default:i(()=>[n(D,null,{default:i(()=>[...e[10]||(e[10]=[c("mdi-format-list-bulleted",-1)])]),_:1})]),_:1})]),_:1},8,["modelValue"]),n(Ze,{location:"top"},{activator:i(({props:u})=>[n(B,he({color:s.connected?"success":"grey",size:"x-small"},u,{variant:"tonal"}),{default:i(()=>[c(g(s.connected?"已连接":"未连接"),1)]),_:1},16,["color"])]),default:i(()=>[r("span",null,"Socket "+g(s.socketId||"-"),1)]),_:1}),n(k,{icon:"",variant:"text",onClick:e[2]||(e[2]=u=>l.close())},{default:i(()=>[n(D,null,{default:i(()=>[...e[11]||(e[11]=[c("mdi-close",-1)])]),_:1})]),_:1})]),_:1}),n(xe),n(A,{class:"chat-body"},{default:i(()=>[s.currentMode==="chat"?(f(),y("div",Ds,[(f(!0),y(N,null,M(l.decoratedMessages,u=>(f(),y(N,{key:u._id},[u._type==="divider"?(f(),y("div",_s,[n(xe,{class:"my-2"}),e[12]||(e[12]=r("div",{class:"divider-text"}," 今天 - 上次访问 ",-1)),n(xe,{class:"my-2"})])):(f(),y("div",{key:1,class:we([{self:u.self},"message-row"])},[r("div",Ts,[n(je,{color:u.self?"primary":"grey",size:"24"},{default:i(()=>[n(D,{size:"small"},{default:i(()=>[c(g(u.self?"mdi-account":"mdi-account-outline"),1)]),_:2},1024)]),_:2},1032,["color"])]),r("div",Vs,[!u.self&&u.deviceName?(f(),y("div",Is,g(u.deviceName),1)):x("",!0),r("div",Ns,g(u.text),1),r("div",Es,[u.self&&u.deviceName?(f(),y("span",As,g(u.deviceName)+" • ",1)):x("",!0),c(" "+g(l.formatTime(u.at)),1)])])],2))],64))),128))],512)):(f(),y("div",Us,[r("div",Fs,[n(ge,{dense:""},{default:i(()=>[n(se,{cols:"4"},{default:i(()=>[n(_,{color:"success",dark:"",size:"small"},{default:i(()=>[n(A,{class:"text-center pa-2"},{default:i(()=>[r("div",Ms,g(s.eventStats.chat),1),e[13]||(e[13]=r("div",{class:"text-caption"}," 聊天 ",-1))]),_:1})]),_:1})]),_:1}),n(se,{cols:"4"},{default:i(()=>[n(_,{color:"info",dark:"",size:"small"},{default:i(()=>[n(A,{class:"text-center pa-2"},{default:i(()=>[r("div",Ps,g(s.eventStats.kvChanged),1),e[14]||(e[14]=r("div",{class:"text-caption"}," KV变化 ",-1))]),_:1})]),_:1})]),_:1}),n(se,{cols:"4"},{default:i(()=>[n(_,{color:"warning",dark:"",size:"small"},{default:i(()=>[n(A,{class:"text-center pa-2"},{default:i(()=>[r("div",zs,g(s.eventStats.other),1),e[15]||(e[15]=r("div",{class:"text-caption"}," 其他 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),r("div",Ls,[(f(!0),y(N,null,M(l.paginatedEvents,u=>(f(),y("div",{key:u._id,class:"event-item mb-2"},[n(_,{color:l.getEventColor(u.type),size:"small",variant:"outlined"},{default:i(()=>[n(A,{class:"pa-2"},{default:i(()=>{var h;return[r("div",Rs,[n(B,{color:l.getEventColor(u.type),size:"x-small"},{default:i(()=>[c(g(l.getEventTypeLabel(u.type)),1)]),_:2},1032,["color"]),n(K),r("span",Bs,g(l.formatTime(u.timestamp||u.at)),1)]),u.senderInfo?(f(),y("div",$s,[e[16]||(e[16]=r("strong",null,"发送者:",-1)),c(" "+g(l.formatDeviceInfo(u.senderInfo)),1)])):x("",!0),r("div",Os,[u.type==="chat"||u.type==="chat:message"?(f(),y("div",js,g(((h=u.content)==null?void 0:h.text)||u.text),1)):(f(),y("pre",Ks,g(JSON.stringify(u.content||u,null,1)),1))])]}),_:2},1024)]),_:2},1032,["color"])]))),128)),s.allEvents.length===0?(f(),y("div",Hs," 暂无事件 ")):x("",!0)]),l.totalPages>1?(f(),y("div",qs,[n(An,{modelValue:s.currentPage,"onUpdate:modelValue":e[3]||(e[3]=u=>s.currentPage=u),length:l.totalPages,"total-visible":3,size:"small"},null,8,["modelValue","length"])])):x("",!0)]))]),_:1}),s.currentMode==="chat"?(f(),w(xe,{key:0})):x("",!0),s.currentMode==="chat"?(f(),w(de,{key:1,class:"chat-input"},{default:i(()=>[n(k,{class:"mr-1",icon:"",variant:"text",onClick:e[4]||(e[4]=u=>l.insertEmoji("😄"))},{default:i(()=>[n(D,null,{default:i(()=>[...e[17]||(e[17]=[c("mdi-emoticon-outline",-1)])]),_:1})]),_:1}),n(ze,{ref:"inputRef",modelValue:s.text,"onUpdate:modelValue":e[5]||(e[5]=u=>s.text=u),"auto-grow":"",class:"flex-grow-1","hide-details":"",placeholder:"输入消息",rows:"1",variant:"solo",onKeydown:[it(at(l.handleEnter,["prevent"]),["enter"]),e[6]||(e[6]=it(at(()=>{},["shift","stop"]),["enter"]))]},null,8,["modelValue","onKeydown"]),n(k,{disabled:!l.canSend,class:"ml-2",color:"primary",onClick:l.send},{default:i(()=>[n(D,{start:""},{default:i(()=>[...e[18]||(e[18]=[c(" mdi-send ",-1)])]),_:1}),e[19]||(e[19]=c(" 发送 ",-1))]),_:1},8,["disabled","onClick"])]),_:1})):x("",!0)]),_:1})],4),[[Te,s.visible]]),n(o,{ref:"urgentNotification"},null,512)],64)}const qe=te(Ss,[["render",Qs],["__scopeId","data-v-1a62ac2a"]]),Ws={name:"UrgentTestDialog",components:{ChatWidget:qe,EventSender:He},props:{modelValue:{type:Boolean,default:!1}},emits:["update:modelValue"],data(){return{sending:!1,notificationForm:{isUrgent:!1,message:"",isPersistent:!1},sentMessages:[],receiptCleanup:[],persistentNotifications:[],editDialog:!1,editForm:{id:null,message:"",isUrgent:!1,resend:!1},savingEdit:!1,deleteConfirmDialog:!1,itemToDelete:null}},computed:{dialog:{get(){return this.modelValue},set(t){this.$emit("update:modelValue",t)}}},mounted(){this.setupEventListeners(),this.loadPersistentNotifications()},beforeUnmount(){this.cleanup()},methods:{generateNotificationId(){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let e="";for(let a=0;a<32;a++)e+=t.charAt(Math.floor(Math.random()*t.length));return e},async sendNotification(){if(this.notificationForm.message.trim()){this.sending=!0;try{const t=this.generateNotificationId(),e=this.notificationForm.message,a=this.notificationForm.isUrgent,d=this.notificationForm.isPersistent,s=await this.$refs.eventSender.sendNotification(e,a,[],{deviceName:"测试设备",deviceType:"system",isReadOnly:!1},t),l=(s==null?void 0:s.eventId)||`msg-${Date.now()}`;if(this.sentMessages.push({id:l,notificationId:t,message:e,isUrgent:a,timestamp:new Date().toISOString(),receipts:{displayed:[],read:[]}}),d)try{const o="notification-list",u=await fe.loadData(o);let h=[];u&&Array.isArray(u)?h=u:u&&u.success!==!1&&Array.isArray(u.data)&&(h=u.data);const m={id:t,message:e,isUrgent:a,timestamp:new Date().toISOString()};h.unshift(m),await fe.saveData(o,h),this.persistentNotifications=h,console.log("常驻通知已保存")}catch(o){console.error("保存常驻通知失败",o)}console.log("通知已发送,事件ID:",l,"通知ID:",t),this.resetForm()}catch(t){console.error("发送通知失败:",t)}finally{this.sending=!1}}},resetForm(){this.notificationForm={isUrgent:!1,message:"",isPersistent:!1}},close(){this.dialog=!1},setupEventListeners(){const t=be("notification-displayed",a=>{console.log("收到显示回执:",a),this.updateReceipt(a,"displayed")}),e=be("notification-read",a=>{console.log("收到已读回执:",a),this.updateReceipt(a,"read")});this.receiptCleanup.push(t,e)},updateReceipt(t,e){var l,o,u,h,m;const a=t.originalEventId,d=t.notificationId||((l=t.content)==null?void 0:l.notificationId);if(!a&&!d)return;const s=this.sentMessages.find(p=>p.id===a||p.notificationId===d);if(s){const p={senderId:t.senderId||"unknown-sender",deviceName:((o=t.senderInfo)==null?void 0:o.deviceName)||((u=t.deviceInfo)==null?void 0:u.deviceName)||"未知设备",deviceType:((h=t.senderInfo)==null?void 0:h.deviceType)||((m=t.deviceInfo)==null?void 0:m.deviceType)||"unknown",timestamp:new Date().toISOString()};s.receipts[e].find(L=>L.senderId===p.senderId)||(s.receipts[e].push(p),console.log(`更新${e}回执:`,s.id,p))}},cleanup(){this.receiptCleanup.forEach(t=>t()),this.receiptCleanup=[]},formatTime(t){return new Date(t).toLocaleString("zh-CN")},getReceiptStatus(t){return t.read.length>0?"已读":t.displayed.length>0?"已显示":"已发送"},getReceiptColor(t){return t.read.length>0?"success":t.displayed.length>0?"info":"grey"},formatDeviceTime(t){return new Date(t).toLocaleTimeString("zh-CN")},getMainCardColor(t){return t.read.length>0?"success":t.displayed.length>0?"info":"grey"},hasAnyReceipts(t){return t.read.length>0||t.displayed.length>0},getDisplayedOnlyDevices(t){const e=t.read.map(a=>a.senderId);return t.displayed.filter(a=>!e.includes(a.senderId))},openEditDialog(t){this.editForm={id:t.id,message:t.message,isUrgent:t.isUrgent||!1,resend:!1,timestamp:t.timestamp},this.editDialog=!0},async saveEdit(){var t,e;if(this.editForm.message.trim()){this.savingEdit=!0;try{const a=this.persistentNotifications.findIndex(d=>d.id===this.editForm.id);if(a!==-1){if(this.persistentNotifications[a]={...this.persistentNotifications[a],message:this.editForm.message,isUrgent:this.editForm.isUrgent,timestamp:new Date().toISOString()},await fe.saveData("notification-list",this.persistentNotifications),this.editForm.resend){const d=this.editForm.id,s=this.editForm.message,l=this.editForm.isUrgent,o=await this.$refs.eventSender.sendNotification(s,l,[],{deviceName:"测试设备",deviceType:"system",isReadOnly:!1},d),u=(o==null?void 0:o.eventId)||`msg-${Date.now()}`;this.sentMessages.push({id:u,notificationId:d,message:s,isUrgent:l,timestamp:new Date().toISOString(),receipts:{displayed:[],read:[]}})}this.editDialog=!1,(t=this.$message)==null||t.success("已更新")}}catch(a){console.error("保存失败",a),(e=this.$message)==null||e.error("保存失败")}finally{this.savingEdit=!1}}},async loadPersistentNotifications(){try{const t=await fe.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)}},async deleteNotification(t){if(confirm("确定要删除这个通知吗?"))try{this.sentMessages=this.sentMessages.filter(a=>a.id!==t),this.persistentNotifications=this.persistentNotifications.filter(a=>a.id!==t),console.log("通知已删除,通知ID:",t)}catch(a){console.error("删除通知失败:",a)}},deletePersistentNotification(t){this.itemToDelete=t,this.deleteConfirmDialog=!0},async executeDelete(){var e,a;if(!this.itemToDelete)return;const t=this.itemToDelete;this.deleteConfirmDialog=!1,this.itemToDelete=null;try{this.persistentNotifications=this.persistentNotifications.filter(s=>s.id!==t);const d=this.persistentNotifications.length>0?this.persistentNotifications:{};await fe.saveData("notification-list",d),(e=this.$message)==null||e.success("已删除")}catch(d){console.error("删除失败",d),(a=this.$message)==null||a.error("删除失败")}}}},Gs={key:0,class:"text-center text-grey py-4"},Js={key:0,class:"text-center text-grey py-8"},Ys={class:"d-flex align-center mb-2"},Xs={class:"font-weight-medium"},Zs={class:"text-caption font-weight-medium"},ei={class:"text-body-2 mb-3",style:{"max-height":"60px",overflow:"hidden"}},ti={class:"text-caption"},ni={key:0},si={class:"align-center"},ii={class:"text-body-2 font-weight-medium"},ai={class:"text-caption mt-1"},li={class:"align-center"},oi={class:"text-body-2 font-weight-medium"},ri={class:"text-caption text-grey"},di={class:"text-caption text-grey mt-1"},ui={key:1};function ci(t,e,a,d,s,l){const o=qe,u=He;return f(),w(ie,{modelValue:l.dialog,"onUpdate:modelValue":e[11]||(e[11]=h=>l.dialog=h),fullscreen:"",transition:"dialog-bottom-transition",scrollable:""},{default:i(()=>[n(_,null,{default:i(()=>[n(ut,{dark:"",flat:""},{default:i(()=>[n(ct,null,{default:i(()=>[n(D,{class:"mr-2"},{default:i(()=>[...e[12]||(e[12]=[c(" mdi-chat ",-1)])]),_:1}),e[13]||(e[13]=c(" 发送通知 ",-1))]),_:1}),n(K),n(k,{icon:"mdi-close",onClick:l.close},null,8,["onClick"])]),_:1}),n(A,{class:"pa-0"},{default:i(()=>[n(_t,null,{default:i(()=>[n(ge,null,{default:i(()=>[n(se,{cols:"12"},{default:i(()=>[n(_,null,{default:i(()=>[n(A,null,{default:i(()=>[n(ft,null,{default:i(()=>[n(ge,null,{default:i(()=>[n(se,{cols:"12",md:"6"},{default:i(()=>[n(mt,{modelValue:s.notificationForm.isUrgent,"onUpdate:modelValue":e[0]||(e[0]=h=>s.notificationForm.isUrgent=h),label:"强调通知",color:"red",inset:""},null,8,["modelValue"]),n(ht,{modelValue:s.notificationForm.isPersistent,"onUpdate:modelValue":e[1]||(e[1]=h=>s.notificationForm.isPersistent=h),label:"常驻展示",color:"primary","hide-details":"",class:"mt-0"},null,8,["modelValue"])]),_:1}),n(se,{cols:"12"},{default:i(()=>[n(ze,{modelValue:s.notificationForm.message,"onUpdate:modelValue":e[2]||(e[2]=h=>s.notificationForm.message=h),label:"通知内容",outlined:"",rows:"3",placeholder:"请输入强调通知的内容..."},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})]),_:1}),n(de,{class:"px-6 pb-6"},{default:i(()=>[n(k,{color:s.notificationForm.isUrgent?"red":"blue",disabled:!s.notificationForm.message.trim(),loading:s.sending,size:"large",variant:"elevated",onClick:l.sendNotification},{default:i(()=>[n(D,{left:""},{default:i(()=>[c(g(s.notificationForm.isUrgent?"mdi-alert-circle":"mdi-information"),1)]),_:1}),c(" "+g(s.notificationForm.isUrgent?"发送强调通知":"发送通知"),1)]),_:1},8,["color","disabled","loading","onClick"]),n(K)]),_:1})]),_:1})]),_:1})]),_:1}),n(ge,{class:"mt-4"},{default:i(()=>[n(se,{cols:"12"},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,null,{default:i(()=>[n(D,{class:"mr-2"},{default:i(()=>[...e[14]||(e[14]=[c("mdi-pin",-1)])]),_:1}),e[15]||(e[15]=c(" 常驻通知管理 ",-1))]),_:1}),n(A,null,{default:i(()=>[s.persistentNotifications.length===0?(f(),y("div",Gs," 暂无常驻通知 ")):(f(),w(Ke,{key:1},{default:i(()=>[(f(!0),y(N,null,M(s.persistentNotifications,h=>(f(),w(Me,{key:h.id,title:h.message,subtitle:l.formatTime(h.timestamp),lines:"two"},{prepend:i(()=>[n(D,{color:h.isUrgent?"error":"primary"},{default:i(()=>[c(g(h.isUrgent?"mdi-alert-circle":"mdi-information"),1)]),_:2},1032,["color"])]),append:i(()=>[n(k,{icon:"mdi-pencil",variant:"text",size:"small",onClick:m=>l.openEditDialog(h)},null,8,["onClick"]),n(k,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:m=>l.deletePersistentNotification(h.id)},null,8,["onClick"])]),_:2},1032,["title","subtitle"]))),128))]),_:1}))]),_:1})]),_:1})]),_:1})]),_:1}),n(ge,{class:"mt-4"},{default:i(()=>[n(se,{cols:"12"},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,null,{default:i(()=>[n(D,{class:"mr-2"},{default:i(()=>[...e[16]||(e[16]=[c(" mdi-history ",-1)])]),_:1}),e[17]||(e[17]=c(" 消息记录 ",-1)),n(K)]),_:1}),n(A,null,{default:i(()=>[s.sentMessages.length===0?(f(),y("div",Js,[n(D,{size:"64",color:"grey-lighten-2"},{default:i(()=>[...e[18]||(e[18]=[c(" mdi-message-outline ",-1)])]),_:1}),e[19]||(e[19]=r("div",{class:"mt-2"}," 暂无发送记录 ",-1))])):(f(),w(ge,{key:1},{default:i(()=>[(f(!0),y(N,null,M(s.sentMessages.slice().reverse(),h=>(f(),w(se,{key:h.id,cols:"12",md:"6",lg:"4"},{default:i(()=>[n(_,{color:l.getMainCardColor(h.receipts),class:"mb-2"},{default:i(()=>[n(A,null,{default:i(()=>[r("div",Ys,[r("span",Xs,g(h.isUrgent?"强调通知":"通知"),1),n(K),r("span",Zs,g(l.getReceiptStatus(h.receipts)),1)]),r("div",ei,g(h.message),1),r("div",ti,[r("div",null,"发送时间:"+g(l.formatTime(h.timestamp)),1),r("div",null,"事件ID:"+g(h.id),1),r("div",null,"通知ID:"+g(h.notificationId),1)])]),_:2},1024)]),_:2},1032,["color"]),l.hasAnyReceipts(h.receipts)?(f(),y("div",ni,[(f(!0),y(N,null,M(h.receipts.read,m=>(f(),w(_,{key:`${m.senderId}-read`,color:"success",class:"mb-1",size:"small"},{default:i(()=>[n(A,{class:"pa-2"},{default:i(()=>[r("div",si,[r("span",ii,g(m.deviceName),1),e[20]||(e[20]=r("br",null,null,-1)),c(" "+g(m.deviceType),1)]),r("div",ai," 已读于 "+g(l.formatDeviceTime(m.timestamp)),1)]),_:2},1024)]),_:2},1024))),128)),(f(!0),y(N,null,M(l.getDisplayedOnlyDevices(h.receipts),m=>(f(),w(_,{key:`${m.senderId}-displayed`,color:"info-lighten-4",variant:"outlined",class:"mb-1",size:"small"},{default:i(()=>[n(A,{class:"pa-2"},{default:i(()=>[r("div",li,[r("span",oi,g(m.deviceName),1),n(K),r("span",ri,g(m.deviceType=="classroom"?"教室设备上的应用":m.deviceType),1)]),r("div",di," 已显示于 "+g(l.formatDeviceTime(m.timestamp)),1)]),_:2},1024)]),_:2},1024))),128))])):(f(),y("div",ui,[n(_,{color:"info-lighten-4",variant:"outlined",class:"mb-1",size:"small",title:"无设备在线"},{default:i(()=>[n(A,null,{default:i(()=>[...e[21]||(e[21]=[c(" 如果数秒后任然显示这个提示,则可能没有任何设备在线接收通知。 ",-1)])]),_:1})]),_:1})]))]),_:2},1024))),128))]),_:1}))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),n(o),n(u,{ref:"eventSender"},null,512),n(ie,{modelValue:s.editDialog,"onUpdate:modelValue":e[8]||(e[8]=h=>s.editDialog=h),"max-width":"500",fullscreen:t.$vuetify.display.xs},{default:i(()=>[n(_,null,{default:i(()=>[n(ut,{flat:"",density:"compact"},{default:i(()=>[n(ct,null,{default:i(()=>[...e[22]||(e[22]=[c("编辑常驻通知",-1)])]),_:1}),n(K),n(k,{icon:"mdi-close",onClick:e[3]||(e[3]=h=>s.editDialog=!1)})]),_:1}),n(A,null,{default:i(()=>[n(ft,null,{default:i(()=>[n(ze,{modelValue:s.editForm.message,"onUpdate:modelValue":e[4]||(e[4]=h=>s.editForm.message=h),label:"通知内容",rows:"3","auto-grow":""},null,8,["modelValue"]),n(mt,{modelValue:s.editForm.isUrgent,"onUpdate:modelValue":e[5]||(e[5]=h=>s.editForm.isUrgent=h),label:"强调通知",color:"error","hide-details":""},null,8,["modelValue"]),n(ht,{modelValue:s.editForm.resend,"onUpdate:modelValue":e[6]||(e[6]=h=>s.editForm.resend=h),label:"保存并重新发送通知",hint:"勾选后将作为新通知发送给所有在线设备","persistent-hint":""},null,8,["modelValue"])]),_:1})]),_:1}),n(de,null,{default:i(()=>[n(K),n(k,{variant:"text",onClick:e[7]||(e[7]=h=>s.editDialog=!1)},{default:i(()=>[...e[23]||(e[23]=[c("取消",-1)])]),_:1}),n(k,{color:"primary",loading:s.savingEdit,onClick:l.saveEdit},{default:i(()=>[...e[24]||(e[24]=[c("保存",-1)])]),_:1},8,["loading","onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue","fullscreen"]),n(ie,{modelValue:s.deleteConfirmDialog,"onUpdate:modelValue":e[10]||(e[10]=h=>s.deleteConfirmDialog=h),"max-width":"400"},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,{class:"text-h5"},{default:i(()=>[...e[25]||(e[25]=[c("确认删除",-1)])]),_:1}),n(A,null,{default:i(()=>[...e[26]||(e[26]=[c("确定要删除这条常驻通知吗?此操作无法撤销。",-1)])]),_:1}),n(de,null,{default:i(()=>[n(K),n(k,{color:"grey-darken-1",variant:"text",onClick:e[9]||(e[9]=h=>s.deleteConfirmDialog=!1)},{default:i(()=>[...e[27]||(e[27]=[c("取消",-1)])]),_:1}),n(k,{color:"error",variant:"text",onClick:l.executeDelete},{default:i(()=>[...e[28]||(e[28]=[c("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["modelValue"])}const Et=te(Ws,[["render",ci],["__scopeId","data-v-c6850940"]]),fi={name:"FloatingICP"},mi={"aria-label":"浙ICP备2024068645号",class:"floating-icp-link",href:"https://beian.miit.gov.cn/",rel:"noopener noreferrer",target:"_blank"};function hi(t,e,a,d,s,l){return f(),y("a",mi," 浙ICP备2024068645号 ")}const At=te(fi,[["render",hi],["__scopeId","data-v-8d08b563"]]),vi={name:"FloatingToolbar",props:{loading:{type:Boolean,default:!1},unreadCount:{type:Number,default:0},selectedDate:{type:[String,Date],required:!0},isToday:{type:Boolean,required:!0},copyToTodayLoading:{type:Boolean,default:!1}},data(){return{isExpanded:!1}},methods:{handleDateSelect(t){this.$emit("date-select",t)}}},gi={class:"floating-toolbar-container"};function pi(t,e,a,d,s,l){return f(),y("div",gi,[n(tn,null,{default:i(()=>[n(_,{class:we([{"toolbar-expanded":s.isExpanded},"floating-toolbar"]),elevation:"4",rounded:"xl"},{default:i(()=>[n(wt,{class:"toolbar-buttons",variant:"text"},{default:i(()=>[re(n(k,{title:"查看昨天",class:"toolbar-btn",icon:"mdi-chevron-left",variant:"text",onClick:e[0]||(e[0]=o=>t.$emit("prev-day"))},null,512),[[Ve]]),re(n(k,{title:"缩小字体",class:"toolbar-btn",icon:"mdi-format-font-size-decrease",variant:"text",onClick:e[1]||(e[1]=o=>t.$emit("zoom","out"))},null,512),[[Ve]]),re(n(k,{title:"放大字体",class:"toolbar-btn",icon:"mdi-format-font-size-increase",variant:"text",onClick:e[2]||(e[2]=o=>t.$emit("zoom","up"))},null,512),[[Ve]]),n(Tt,{"close-on-content-click":!1,location:"top"},{activator:i(({props:o})=>[re(n(k,he({title:"选择日期",class:"toolbar-btn",icon:"mdi-calendar"},o,{variant:"text"}),null,16),[[Ve]])]),default:i(()=>[n(_,{border:"",class:"date-picker-card"},{default:i(()=>[n(jn,{"model-value":a.selectedDate,color:"primary","onUpdate:modelValue":l.handleDateSelect},null,8,["model-value","onUpdate:modelValue"])]),_:1})]),_:1}),re(n(k,{loading:a.loading,title:"刷新数据",class:"toolbar-btn",icon:"mdi-refresh",variant:"text",onClick:e[3]||(e[3]=o=>t.$emit("refresh"))},null,8,["loading"]),[[Ve]]),a.isToday?x("",!0):re((f(),w(k,{key:0,title:"查看明天",class:"toolbar-btn",icon:"mdi-chevron-right",variant:"text",onClick:e[4]||(e[4]=o=>t.$emit("next-day"))},null,512)),[[Ve]])]),_:1})]),_:1},8,["class"])]),_:1}),n(nn,null,{default:i(()=>[a.isToday?x("",!0):(f(),w(k,{key:0,loading:a.copyToTodayLoading,disabled:a.copyToTodayLoading,class:"side-action-btn",color:"primary",elevation:"4","prepend-icon":"mdi-content-copy",rounded:"xl",size:"large",text:"复制作业内容到今天",onClick:e[5]||(e[5]=o=>t.$emit("copy-to-today"))},{default:i(()=>[...e[6]||(e[6]=[c("复制到今天",-1)])]),_:1},8,["loading","disabled"]))]),_:1})])}const Ut=te(vi,[["render",pi],["__scopeId","data-v-7076d3aa"]]),yi={name:"AttendanceManagementDialog",props:{modelValue:{type:Boolean,required:!0},studentList:{type:Array,required:!0},attendance:{type:Object,required:!0},dateString:{type:String,default:""}},emits:["update:modelValue","save","change"],setup(){const{mobile:t}=Pe();return{isMobile:t}},data(){return{attendanceSearch:"",attendanceFilter:[]}},computed:{filteredStudents(){let t=[...this.studentList];if(this.attendanceSearch){const e=this.attendanceSearch.toLowerCase();t=t.filter(a=>a.toLowerCase().includes(e))}return this.attendanceFilter&&this.attendanceFilter.length>0&&(t=t.filter(e=>!!(this.attendanceFilter.includes("present")&&this.isPresent(e)||this.attendanceFilter.includes("absent")&&this.isAbsent(e)||this.attendanceFilter.includes("late")&&this.isLate(e)||this.attendanceFilter.includes("exclude")&&this.isExclude(e)))),t},extractedSurnames(){if(!this.studentList||this.studentList.length===0)return[];const t=new Map;return this.studentList.forEach(e=>{if(e&&e.length>0){const a=e.charAt(0);t.set(a,(t.get(a)||0)+1)}}),Array.from(t.entries()).map(([e,a])=>({name:e,count:a})).sort((e,a)=>{const d=vt(e.name,{toneType:"none"}),s=vt(a.name,{toneType:"none"});return d.localeCompare(s)})}},methods:{toggleFilter(t){const e=this.attendanceFilter.indexOf(t);e===-1?this.attendanceFilter.push(t):this.attendanceFilter.splice(e,1)},isPresent(t){const{absent:e,late:a,exclude:d}=this.attendance;return!e.includes(t)&&!a.includes(t)&&!d.includes(t)},isAbsent(t){return this.attendance.absent.includes(t)},isLate(t){return this.attendance.late.includes(t)},isExclude(t){return this.attendance.exclude.includes(t)},getStudentStatusColor(t){return this.attendance.absent.includes(t)?"error":this.attendance.late.includes(t)?"warning":this.attendance.exclude.includes(t)?"grey":"success"},getStudentStatusIcon(t){return this.attendance.absent.includes(t)?"mdi-account-off":this.attendance.late.includes(t)?"mdi-clock-alert":this.attendance.exclude.includes(t)?"mdi-account-cancel":"mdi-account-check"},removeFromAll(t){const e=this.attendance.absent.indexOf(t);e>-1&&this.attendance.absent.splice(e,1);const a=this.attendance.late.indexOf(t);a>-1&&this.attendance.late.splice(a,1);const d=this.attendance.exclude.indexOf(t);d>-1&&this.attendance.exclude.splice(d,1)},setPresent(t){this.removeFromAll(t),this.$emit("change")},setAbsent(t){this.removeFromAll(t),this.attendance.absent.push(t),this.$emit("change")},setLate(t){this.removeFromAll(t),this.attendance.late.push(t),this.$emit("change")},setExclude(t){this.removeFromAll(t),this.attendance.exclude.push(t),this.$emit("change")},setAllPresent(){this.attendance.absent.splice(0,this.attendance.absent.length),this.attendance.late.splice(0,this.attendance.late.length),this.attendance.exclude.splice(0,this.attendance.exclude.length),this.$emit("change")},setAllAbsent(){this.setAllPresent(),this.attendance.absent.push(...this.studentList),this.$emit("change")},setAllLate(){this.setAllPresent(),this.attendance.late.push(...this.studentList),this.$emit("change")},setAllExclude(){this.setAllPresent(),this.attendance.exclude.push(...this.studentList),this.$emit("change")}}},ki={class:"d-flex flex-wrap mt-2 gap-1"},bi={class:"d-flex flex-wrap mb-4 gap-2"},wi={class:"flex-grow-1"},xi={class:"d-flex align-center"},Si={class:"text-subtitle-1"},Ci={class:"attendance-actions"},Di={class:"d-flex flex-wrap gap-2"};function _i(t,e,a,d,s,l){return f(),w(ie,{"model-value":a.modelValue,fullscreen:d.isMobile,"fullscreen-breakpoint":"sm","max-width":"900","onUpdate:modelValue":e[7]||(e[7]=o=>t.$emit("update:modelValue",o))},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,{class:"d-flex align-center"},{default:i(()=>[n(D,{class:"mr-2",icon:"mdi-account-group"}),e[8]||(e[8]=c(" 出勤状态管理 ",-1)),n(K),d.isMobile?x("",!0):(f(),w(B,{key:0,class:"ml-2",color:"primary",size:"small"},{default:i(()=>[c(g(a.dateString),1)]),_:1})),d.isMobile?(f(),w(k,{key:1,icon:"mdi-close",variant:"text",onClick:e[0]||(e[0]=o=>t.$emit("update:modelValue",!1))})):x("",!0)]),_:1}),n(A,null,{default:i(()=>[n(ge,{class:"mb-4"},{default:i(()=>[n(se,{cols:"12",md:"12"},{default:i(()=>[n(De,{modelValue:s.attendanceSearch,"onUpdate:modelValue":e[1]||(e[1]=o=>s.attendanceSearch=o),clearable:"",hint:"支持筛选姓氏,如输入'孙'可筛选所有姓孙的学生",label:"搜索学生","prepend-inner-icon":"mdi-magnify",variant:"outlined"},null,8,["modelValue"]),r("div",ki,[(f(!0),y(N,null,M(l.extractedSurnames,o=>(f(),w(k,{key:o.name,color:s.attendanceSearch===o.name?"primary":"",variant:s.attendanceSearch===o.name?"elevated":"text",onClick:u=>s.attendanceSearch=s.attendanceSearch===o.name?"":o.name},{default:i(()=>[c(g(o.name)+" ("+g(o.count)+") ",1)]),_:2},1032,["color","variant","onClick"]))),128))])]),_:1})]),_:1}),r("div",bi,[r("div",null,[n(B,{"append-icon":s.attendanceFilter.includes("present")?"mdi-check":"",color:s.attendanceFilter.includes("present")?"success":"",variant:s.attendanceFilter.includes("present")?"elevated":"tonal",class:"px-2 filter-chip","prepend-icon":"mdi-account-check",value:"present",onClick:e[2]||(e[2]=o=>l.toggleFilter("present"))},{default:i(()=>[...e[9]||(e[9]=[c(" 到课 ",-1)])]),_:1},8,["append-icon","color","variant"]),n(B,{"append-icon":s.attendanceFilter.includes("absent")?"mdi-check":"",color:s.attendanceFilter.includes("absent")?"error":"",variant:s.attendanceFilter.includes("absent")?"elevated":"tonal",class:"px-2 filter-chip","prepend-icon":"mdi-account-off",value:"absent",onClick:e[3]||(e[3]=o=>l.toggleFilter("absent"))},{default:i(()=>[...e[10]||(e[10]=[c(" 请假 ",-1)])]),_:1},8,["append-icon","color","variant"]),n(B,{"append-icon":s.attendanceFilter.includes("late")?"mdi-check":"",color:s.attendanceFilter.includes("late")?"warning":"",variant:s.attendanceFilter.includes("late")?"elevated":"tonal",class:"px-2 filter-chip","prepend-icon":"mdi-clock-alert",value:"late",onClick:e[4]||(e[4]=o=>l.toggleFilter("late"))},{default:i(()=>[...e[11]||(e[11]=[c(" 迟到 ",-1)])]),_:1},8,["append-icon","color","variant"]),n(B,{"append-icon":s.attendanceFilter.includes("exclude")?"mdi-check":"",color:s.attendanceFilter.includes("exclude")?"grey":"",variant:s.attendanceFilter.includes("exclude")?"elevated":"tonal",class:"px-2 filter-chip","prepend-icon":"mdi-account-cancel",value:"exclude",onClick:e[5]||(e[5]=o=>l.toggleFilter("exclude"))},{default:i(()=>[...e[12]||(e[12]=[c(" 不参与 ",-1)])]),_:1},8,["append-icon","color","variant"])])]),n(ge,null,{default:i(()=>[(f(!0),y(N,null,M(l.filteredStudents,o=>(f(),w(se,{key:o,cols:"12",lg:"4",md:"6",sm:"6"},{default:i(()=>[n(_,{border:"",class:"student-card"},{default:i(()=>[n(A,{class:"d-flex align-center pa-2"},{default:i(()=>[r("div",wi,[r("div",xi,[n(je,{color:l.getStudentStatusColor(o),class:"mr-2",size:"24"},{default:i(()=>[n(D,{size:"small"},{default:i(()=>[c(g(l.getStudentStatusIcon(o)),1)]),_:2},1024)]),_:2},1032,["color"]),r("div",Si,g(o),1)])]),r("div",Ci,[n(k,{color:l.isPresent(o)?"success":"",title:"设为到课",icon:"mdi-account-check",size:d.isMobile?"default":"small",variant:"text",onClick:u=>l.setPresent(o)},null,8,["color","size","onClick"]),n(k,{color:l.isAbsent(o)?"error":"",title:"设为请假",icon:"mdi-account-off",size:d.isMobile?"default":"small",variant:"text",onClick:u=>l.setAbsent(o)},null,8,["color","size","onClick"]),n(k,{color:l.isLate(o)?"warning":"",title:"设为迟到",icon:"mdi-clock-alert",size:d.isMobile?"default":"small",variant:"text",onClick:u=>l.setLate(o)},null,8,["color","size","onClick"]),n(k,{color:l.isExclude(o)?"grey":"",title:"设为不参与",icon:"mdi-account-cancel",size:d.isMobile?"default":"small",variant:"text",onClick:u=>l.setExclude(o)},null,8,["color","size","onClick"])])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1}),n(ge,null,{default:i(()=>[n(se,{cols:"12",md:"12"},{default:i(()=>[n(_,{class:"mb-4",color:"primary",variant:"tonal"},{default:i(()=>[n(A,null,{default:i(()=>[e[17]||(e[17]=r("div",{class:"text-subtitle-2 mb-2"},"批量操作",-1)),r("div",Di,[n(k,{class:"flex-grow-1",color:"success","prepend-icon":"mdi-account-check",onClick:l.setAllPresent},{default:i(()=>[...e[13]||(e[13]=[c(" 全部到齐 ",-1)])]),_:1},8,["onClick"]),n(k,{class:"flex-grow-1",color:"error","prepend-icon":"mdi-account-off",onClick:l.setAllAbsent},{default:i(()=>[...e[14]||(e[14]=[c(" 全部请假 ",-1)])]),_:1},8,["onClick"]),n(k,{class:"flex-grow-1",color:"warning","prepend-icon":"mdi-clock-alert",onClick:l.setAllLate},{default:i(()=>[...e[15]||(e[15]=[c(" 全部迟到 ",-1)])]),_:1},8,["onClick"]),n(k,{class:"flex-grow-1",color:"grey","prepend-icon":"mdi-account-cancel",onClick:l.setAllExclude},{default:i(()=>[...e[16]||(e[16]=[c(" 全部不参与 ",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),n(xe),n(de,null,{default:i(()=>[n(K),n(k,{color:"primary",onClick:e[6]||(e[6]=o=>t.$emit("save"))},{default:i(()=>[n(D,{start:""},{default:i(()=>[...e[18]||(e[18]=[c("mdi-content-save",-1)])]),_:1}),e[19]||(e[19]=c(" 保存 ",-1))]),_:1})]),_:1})]),_:1})]),_:1},8,["model-value","fullscreen"])}const Ft=te(yi,[["render",_i],["__scopeId","data-v-7f9de516"]]),Ti={name:"HomeworkEditDialog",props:{modelValue:{type:Boolean,required:!0},title:{type:String,required:!0},initialContent:{type:String,default:""},autoSave:{type:Boolean,default:!1},isEditingPastData:{type:Boolean,default:!1},currentDateString:{type:String,default:""}},emits:["update:modelValue","save"],setup(){const{mobile:t}=Pe();return{isMobile:t}},data(){return{content:"",templateData:null,currentLine:"",currentLineStart:0,currentLineEnd:0,quickTexts:["课","题","例","变","T","P"]}},computed:{dialogVisible:{get(){return this.modelValue},set(t){this.$emit("update:modelValue",t)}},subject(){return this.title},hasTemplates(){var t,e;return!!((e=(t=this.templateData)==null?void 0:t.actions)!=null&&e.length||this.subjectBooks||this.commonBooks)},subjectBooks(){var t,e,a;return!this.subject||!((a=(e=(t=this.templateData)==null?void 0:t.subjects)==null?void 0:e[this.subject])!=null&&a.books)?null:this.templateData.subjects[this.subject].books},commonBooks(){var t,e;return(e=(t=this.templateData)==null?void 0:t.commonSubject)!=null&&e.books?this.templateData.commonSubject.books:null},showQuickTools(){return C("display.showQuickTools")},autoSavePromptText(){return C("edit.autoSavePromptText")},manualSavePromptText(){return C("edit.manualSavePromptText")}},watch:{async modelValue(t){if(t){this.content=this.initialContent;try{this.templateData=await fe.loadData("classworks-config-homework-template")}catch(e){console.error("Failed to load homework templates:",e),this.templateData=null}this.$nextTick(()=>{this.$refs.inputRef&&(this.$refs.inputRef.focus(),this.updateCurrentLine())})}}},methods:{handleClose(){const t=this.content.trim();t!==this.initialContent.trim()&&this.$emit("save",t),this.dialogVisible=!1},updateCurrentLine(){const e=this.$refs.inputRef.$el.querySelector("textarea").selectionStart,a=this.content;let d=0;const s=a.split(`
|
||
`);for(let l=0;l<s.length;l++){const o=s[l].length,u=d+o;if(e<=u||l===s.length-1){this.currentLine=s[l],this.currentLineStart=d,this.currentLineEnd=u;break}d=u+1}this.currentLine||(this.currentLine="",this.currentLineStart=a.length,this.currentLineEnd=a.length)},isBookSelected(t){return this.currentLine.includes(t)},isPageSelected(t,e){return this.currentLine.includes(e)},handleBookClick(t){if(this.isBookSelected(t)){const e=this.content.split(`
|
||
`),a=e.findIndex(d=>d.includes(t));a!==-1&&(e.splice(a,1),this.content=e.join(`
|
||
`))}else{const e=this.content.trim().length>0;this.content=(e?this.content.trim()+`
|
||
`:"")+t}this.$nextTick(()=>{const e=this.$refs.inputRef.$el.querySelector("textarea");if(e.focus(),!this.isBookSelected(t)){const a=this.content.split(`
|
||
`);let d=0;for(let s=0;s<a.length;s++){if(a[s].includes(t)){d+=a[s].length;break}d+=a[s].length+1}e.setSelectionRange(d,d)}this.updateCurrentLine()})},handlePageClick(t,e){if(this.isPageSelected(t,e)){const a=this.currentLineStart,d=this.currentLineEnd,s=this.content.slice(a,d),l=s.lastIndexOf(e);if(l!==-1){const o=s.slice(0,l)+s.slice(l+e.length);this.content=this.content.slice(0,a)+o.trim()+this.content.slice(d)}}else{const a=this.currentLineStart,d=this.currentLineEnd,s=this.content.slice(a,d);this.content=this.content.slice(0,a)+s.trim()+(s.trim().length>0?" ":"")+e+this.content.slice(d)}this.$nextTick(()=>{const a=this.$refs.inputRef.$el.querySelector("textarea");a.focus();const d=this.content.split(`
|
||
`);let s=0;for(let l=0;l<d.length&&(s+=d[l].length,!(s>this.currentLineStart));l++)s+=1;a.setSelectionRange(s,s),this.updateCurrentLine()})},insertTemplate(t){const e=this.$refs.inputRef.$el.querySelector("textarea"),a=e.selectionStart,d=e.selectionEnd,s=a>0&&this.content[a-1]!==" "&&this.content[a-1]!==`
|
||
`;this.content=this.content.slice(0,a)+(s?" ":"")+t+this.content.slice(d),this.$nextTick(()=>{e.focus();const l=a+t.length+(s?1:0);e.setSelectionRange(l,l),this.updateCurrentLine()})},insertAtCursor(t){if(!t)return;const e=this.$refs.inputRef.$el.querySelector("textarea"),a=e.selectionStart,d=e.selectionEnd;this.content=this.content.slice(0,a)+t+this.content.slice(d),this.$nextTick(()=>{e.focus();const s=a+t.length;e.setSelectionRange(s,s),this.updateCurrentLine()})},deleteLastChar(){const t=this.$refs.inputRef.$el.querySelector("textarea"),e=t.selectionStart,a=t.selectionEnd;e===a?e>0&&(this.content=this.content.slice(0,e-1)+this.content.slice(e),this.$nextTick(()=>{t.focus(),t.setSelectionRange(e-1,e-1),this.updateCurrentLine()})):(this.content=this.content.slice(0,e)+this.content.slice(a),this.$nextTick(()=>{t.focus(),t.setSelectionRange(e,e),this.updateCurrentLine()}))}}},Vi={class:"d-flex"},Ii={class:"flex-grow-1"},Ni={key:0,class:"mt-4"},Ei={key:0,class:"template-buttons"},Ai={key:0,class:"pages-container mt-2"},Ui={key:0,class:"pages-container mt-2"},Fi={key:2,class:"button-group"},Mi={key:1,class:"text-center text-body-2 text-disabled mt-2"},Pi={key:0,class:"quick-tools ml-4",style:{"min-width":"180px"}},zi={class:"numeric-keypad mb-4"},Li={class:"keypad-row"},Ri={class:"keypad-row"},Bi={class:"keypad-row"},$i={class:"keypad-row"},Oi={class:"keypad-row"},ji={class:"d-flex flex-wrap gap-1"},Ki={class:"d-flex flex-column"},Hi={class:"text-body-2"};function qi(t,e,a,d,s,l){return f(),w(ie,{modelValue:l.dialogVisible,"onUpdate:modelValue":e[5]||(e[5]=o=>l.dialogVisible=o),fullscreen:d.isMobile,"max-width":"900",width:"auto","onClick:outside":l.handleClose},{default:i(()=>[n(_,{border:""},{default:i(()=>[n(Y,{class:"d-flex align-center"},{default:i(()=>[c(g(a.title)+" ",1),n(K),n(k,{icon:"mdi-close",variant:"text",onClick:l.handleClose},null,8,["onClick"])]),_:1}),n(sn,null,{default:i(()=>[c(g(a.autoSave?l.autoSavePromptText:l.manualSavePromptText),1)]),_:1}),n(A,null,{default:i(()=>{var o;return[r("div",Vi,[r("div",Ii,[n(ze,{ref:"inputRef",modelValue:s.content,"onUpdate:modelValue":e[0]||(e[0]=u=>s.content=u),"auto-grow":"",placeholder:"使用换行表示分条",rows:"5",width:d.isMobile?"100%":"480",onClick:l.updateCurrentLine,onKeyup:l.updateCurrentLine},null,8,["modelValue","width","onClick","onKeyup"]),s.templateData?(f(),y("div",Ni,[l.hasTemplates?(f(),y("div",Ei,[l.subjectBooks?(f(!0),y(N,{key:0},M(l.subjectBooks,(u,h)=>(f(),y("div",{key:h,class:"button-group"},[n(B,{color:l.isBookSelected(h)?"success":"default",variant:l.isBookSelected(h)?"elevated":"flat",class:"ma-1 book-chip",onClick:m=>l.handleBookClick(h)},{default:i(()=>[c(g(h),1)]),_:2},1032,["color","variant","onClick"]),l.isBookSelected(h)?(f(),y("div",Ai,[(f(!0),y(N,null,M(u,m=>(f(),w(B,{key:m,color:l.isPageSelected(h,m)?"info":"default",variant:l.isPageSelected(h,m)?"elevated":"flat",class:"ma-1",onClick:p=>l.handlePageClick(h,m)},{default:i(()=>[c(g(m),1)]),_:2},1032,["color","variant","onClick"]))),128))])):x("",!0)]))),128)):x("",!0),l.commonBooks?(f(!0),y(N,{key:1},M(l.commonBooks,(u,h)=>(f(),y("div",{key:h,class:"button-group"},[n(B,{color:l.isBookSelected(h)?"success":"default",variant:l.isBookSelected(h)?"elevated":"flat",class:"ma-1 book-chip",onClick:m=>l.handleBookClick(h)},{default:i(()=>[c(g(h),1)]),_:2},1032,["color","variant","onClick"]),l.isBookSelected(h)?(f(),y("div",Ui,[(f(!0),y(N,null,M(u,m=>(f(),w(B,{key:m,color:l.isPageSelected(h,m)?"info":"default",variant:l.isPageSelected(h,m)?"elevated":"flat",class:"ma-1",onClick:p=>l.handlePageClick(h,m)},{default:i(()=>[c(g(m),1)]),_:2},1032,["color","variant","onClick"]))),128))])):x("",!0)]))),128)):x("",!0),(o=s.templateData.actions)!=null&&o.length?(f(),y("div",Fi,[(f(!0),y(N,null,M(s.templateData.actions,u=>(f(),w(B,{key:u,class:"ma-1",color:"primary",variant:"flat",onClick:h=>l.insertTemplate(u)},{default:i(()=>[c(g(u),1)]),_:2},1032,["onClick"]))),128))])):x("",!0)])):(f(),y("div",Mi," 暂无可用的模板 "))])):x("",!0)]),l.showQuickTools&&!d.isMobile?(f(),y("div",Pi,[r("div",zi,[r("div",Li,[(f(),y(N,null,M(3,u=>n(k,{key:u,class:"keypad-btn",size:"small",variant:"tonal",onClick:h=>l.insertAtCursor(String(u))},{default:i(()=>[c(g(u),1)]),_:2},1032,["onClick"])),64))]),r("div",Ri,[(f(),y(N,null,M(3,u=>n(k,{key:u,class:"keypad-btn",size:"small",variant:"tonal",onClick:h=>l.insertAtCursor(String(u+3))},{default:i(()=>[c(g(u+3),1)]),_:2},1032,["onClick"])),64))]),r("div",Bi,[(f(),y(N,null,M(3,u=>n(k,{key:u,class:"keypad-btn",size:"small",variant:"tonal",onClick:h=>l.insertAtCursor(String(u+6))},{default:i(()=>[c(g(u+6),1)]),_:2},1032,["onClick"])),64))]),r("div",$i,[n(k,{class:"keypad-btn",size:"small",variant:"tonal",onClick:e[1]||(e[1]=u=>l.insertAtCursor("-"))},{default:i(()=>[...e[6]||(e[6]=[c(" - ",-1)])]),_:1}),n(k,{class:"keypad-btn",size:"small",variant:"tonal",onClick:e[2]||(e[2]=u=>l.insertAtCursor("0"))},{default:i(()=>[...e[7]||(e[7]=[c(" 0 ",-1)])]),_:1}),n(k,{class:"keypad-btn",color:"error",size:"small",variant:"tonal",onClick:l.deleteLastChar},{default:i(()=>[...e[8]||(e[8]=[c(" ← ",-1)])]),_:1},8,["onClick"])]),r("div",Oi,[n(k,{class:"keypad-btn space-btn",size:"small",variant:"tonal",onClick:e[3]||(e[3]=u=>l.insertAtCursor(" "))},{default:i(()=>[...e[9]||(e[9]=[c(" 空格 ",-1)])]),_:1}),n(k,{class:"keypad-btn space-btn",size:"small",variant:"tonal",onClick:e[4]||(e[4]=u=>l.insertAtCursor(`
|
||
`))},{default:i(()=>[...e[10]||(e[10]=[c(" 换行 ",-1)])]),_:1})])]),r("div",ji,[(f(!0),y(N,null,M(s.quickTexts,u=>(f(),w(k,{key:u,size:"small",variant:"flat",onClick:h=>l.insertAtCursor(u)},{default:i(()=>[c(g(u),1)]),_:2},1032,["onClick"]))),128))])])):x("",!0)])]}),_:1}),a.isEditingPastData?(f(),w(Le,{key:0,type:"warning",variant:"tonal",class:"mx-4 mb-4",border:"start","border-color":"warning",prominent:""},{prepend:i(()=>[...e[11]||(e[11]=[])]),default:i(()=>[r("div",Ki,[e[12]||(e[12]=r("div",{class:"text-h6 mb-1"},"你打算修改历史?",-1)),r("div",Hi," 这是 "+g(new Date(a.currentDateString.slice(0,4),a.currentDateString.slice(4,6)-1,a.currentDateString.slice(6,8)).toLocaleDateString())+" 的作业 • 请谨慎操作,确保不会覆盖重要数据 ",1)])]),_:1})):x("",!0),e[13]||(e[13]=r("div",{class:"text-center text-body-2 text-disabled mb-5"}," 点击空白处完成编辑 ",-1))]),_:1})]),_:1},8,["modelValue","fullscreen","onClick:outside"])}const Mt=te(Ti,[["render",qi],["__scopeId","data-v-b3e3018d"]]),Qi={name:"AttendanceSidebar",props:{studentList:{type:Array,required:!0},attendance:{type:Object,required:!0},isEditingDisabled:{type:Boolean,default:!1}},emits:["click","disabled-click"],setup(){return{display:Pe()}},methods:{handleClick(){this.isEditingDisabled?this.$emit("disabled-click"):this.$emit("click")}}},Wi={style:{"white-space":"nowrap"}},Gi={style:{"white-space":"nowrap"}},Ji={style:{"white-space":"nowrap"}},Yi={key:0},Xi={style:{"white-space":"nowrap"}},Zi={style:{"white-space":"nowrap"}},ea={key:0},ta={style:{"white-space":"nowrap"}},na={style:{"white-space":"nowrap"}},sa={key:0},ia={style:{"white-space":"nowrap"}};function aa(t,e,a,d,s,l){return a.studentList&&a.studentList.length?re((f(),w(se,{key:0,class:we([{"cursor-not-allowed":a.isEditingDisabled},"attendance-area no-select"]),cols:"1",onClick:l.handleClick},{default:i(()=>[e[10]||(e[10]=r("h1",null,"出勤",-1)),r("h2",null,[e[0]||(e[0]=r("span",{style:{"white-space":"nowrap"}}," 应到",-1)),e[1]||(e[1]=c(" : ",-1)),r("span",Wi,g(a.studentList.length-a.attendance.exclude.length)+"人 ",1)]),r("h2",null,[e[2]||(e[2]=r("span",{style:{"white-space":"nowrap"}}," 实到",-1)),e[3]||(e[3]=c(" : ",-1)),r("span",Gi,g(a.studentList.length-a.attendance.absent.length-a.attendance.late.length-a.attendance.exclude.length)+"人 ",1)]),r("h2",null,[e[4]||(e[4]=r("span",{style:{"white-space":"nowrap"}}," 请假",-1)),e[5]||(e[5]=c(" : ",-1)),r("span",Ji,g(a.attendance.absent.length)+"人 ",1)]),(f(!0),y(N,null,M(a.attendance.absent,(o,u)=>(f(),y("h3",{key:"absent-"+u,class:"gray-text"},[d.display.lgAndUp.value?(f(),y("span",Yi,g(`${u+1}. `),1)):x("",!0),r("span",Xi,g(o),1)]))),128)),r("h2",null,[e[6]||(e[6]=r("span",{style:{"white-space":"nowrap"}},"迟到",-1)),e[7]||(e[7]=c(" : ",-1)),r("span",Zi,g(a.attendance.late.length)+"人 ",1)]),(f(!0),y(N,null,M(a.attendance.late,(o,u)=>(f(),y("h3",{key:"late-"+u,class:"gray-text"},[d.display.lgAndUp.value?(f(),y("span",ea,g(`${u+1}. `),1)):x("",!0),r("span",ta,g(o),1)]))),128)),r("h2",null,[e[8]||(e[8]=r("span",{style:{"white-space":"nowrap"}},"不参与",-1)),e[9]||(e[9]=c(" : ",-1)),r("span",na,g(a.attendance.exclude.length)+"人 ",1)]),(f(!0),y(N,null,M(a.attendance.exclude,(o,u)=>(f(),y("h3",{key:"exclude-"+u,class:"gray-text"},[d.display.lgAndUp.value?(f(),y("span",sa,g(`${u+1}. `),1)):x("",!0),r("span",ia,g(o),1)]))),128))]),_:1},8,["class","onClick"])),[[Ve,a.isEditingDisabled?!1:{class:`text-${["primary","secondary","info","success","warning","error"][Math.floor(Math.random()*6)]}`}]]):x("",!0)}const Pt=te(Qi,[["render",aa],["__scopeId","data-v-8dbe204a"]]),la={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"]},oa={class:"d-flex flex-wrap align-center mt-4"};function ra(t,e,a,d,s,l){return f(),y(N,null,[r("div",oa,[a.synced?(f(),w(k,{key:1,color:"success",size:"large",onClick:e[1]||(e[1]=o=>t.$emit("show-sync-message"))},{default:i(()=>[...e[8]||(e[8]=[c(" 同步完成 ",-1)])]),_:1})):(f(),w(k,{key:0,loading:a.loadingUpload,class:"ml-2",color:"error",size:"large",onClick:e[0]||(e[0]=o=>t.$emit("upload"))},{default:i(()=>[...e[7]||(e[7]=[c(" 上传 ",-1)])]),_:1},8,["loading"])),a.showRandomPickerButton?(f(),w(k,{key:2,"append-icon":"mdi-dice-multiple",class:"ml-2",color:"amber","prepend-icon":"mdi-account-question",size:"large",onClick:e[2]||(e[2]=o=>t.$emit("open-random-picker"))},{default:i(()=>[...e[9]||(e[9]=[c(" 随机点名 ",-1)])]),_:1})):x("",!0),a.showExamScheduleButton?(f(),w(k,{key:3,class:"ml-2",color:"green","prepend-icon":"mdi-calendar-check",size:"large",onClick:e[3]||(e[3]=o=>t.$router.push("/examschedule"))},{default:i(()=>[...e[10]||(e[10]=[c(" 考试看板 ",-1)])]),_:1})):x("",!0),a.showListCardButton?(f(),w(k,{key:4,class:"ml-2",color:"primary-darken-1","prepend-icon":"mdi-list-box",size:"large",onClick:e[4]||(e[4]=o=>t.$router.push("/list"))},{default:i(()=>[...e[11]||(e[11]=[c(" 列表 ",-1)])]),_:1})):x("",!0),a.showFullscreenButton?(f(),w(k,{key:5,color:a.isFullscreen?"blue-grey":"blue","prepend-icon":a.isFullscreen?"mdi-fullscreen-exit":"mdi-fullscreen",class:"ml-2",size:"large",onClick:e[5]||(e[5]=o=>t.$emit("toggle-fullscreen"))},{default:i(()=>[c(g(a.isFullscreen?"退出全屏":"全屏显示"),1)]),_:1},8,["color","prepend-icon"])):x("",!0),a.showTestCardButton?(f(),w(k,{key:6,class:"ml-2",color:"purple","prepend-icon":"mdi-test-tube",size:"large",onClick:e[6]||(e[6]=o=>t.$emit("add-test-card"))},{default:i(()=>[...e[12]||(e[12]=[c(" 添加测试卡片 ",-1)])]),_:1})):x("",!0)]),a.showAntiScreenBurnCard?(f(),w(_,{key:0,border:"",class:"mt-4 anti-burn-card",color:"primary",variant:"tonal"},{default:i(()=>[n(Y,{class:"text-subtitle-1"},{default:i(()=>[n(D,{icon:"mdi-shield-check",size:"small",start:""}),e[13]||(e[13]=c(" 屏幕保护技术已启用 ",-1))]),_:1}),n(A,{class:"text-body-2"},{default:i(()=>[...e[14]||(e[14]=[r("p",null," 为防止OLED/LCD屏幕烧屏,界面元素会定期微调位置。 ",-1),r("p",{class:"text-caption text-grey"}," 此功能不会影响正常使用,仅在长时间静止显示时生效。 ",-1),r("p",{class:"text-caption text-grey"}," 建议在放学后关闭显示器以节约能源。 ",-1)])]),_:1})]),_:1})):x("",!0)],64)}const zt=te(la,[["render",ra]]),da={name:"HomeworkGrid",props:{sortedItems:{type:Array,required:!0},unusedSubjects:{type:Array,required:!0},emptySubjectDisplay:{type:String,default:"button"},isEditingDisabled:{type:Boolean,default:!1},contentStyle:{type:Object,default:()=>({})},highlightedCards:{type:Object,default:()=>({})}},emits:["open-dialog","open-attendance","disabled-click"],computed:{isMobile(){return this.$vuetify.display.mobile}},methods:{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,a=e.getBoundingClientRect(),d=(t.clientX-a.left)/a.width*100,s=(t.clientY-a.top)/a.height*100;e.style.setProperty("--x",`${d}%`),e.style.setProperty("--y",`${s}%`)},handleTouchMove(t){if(t.touches.length===1){const e=t.touches[0],a=t.currentTarget,d=a.getBoundingClientRect(),s=(e.clientX-d.left)/d.width*100,l=(e.clientY-d.top)/d.height*100;a.style.setProperty("--x",`${s}%`),a.style.setProperty("--y",`${l}%`)}}}},ua={ref:"gridContainer",class:"grid-masonry"},ca={class:"d-flex justify-space-between align-center mb-2"},fa={class:"text-h6"},ma={key:0,class:"mb-2"},ha={class:"text-error text-caption mb-1"},va={class:"d-flex flex-wrap",style:{gap:"4px"}},ga={key:1,class:"mb-2"},pa={class:"text-warning text-caption mb-1"},ya={class:"d-flex flex-wrap",style:{gap:"4px"}},ka={key:2,class:"mb-2"},ba={class:"text-grey text-caption mb-1"},wa={class:"d-flex flex-wrap",style:{gap:"4px"}},xa={key:3,class:"text-success text-center mt-2"},Sa={class:"empty-subjects mt-4"},Ca={key:0,class:"d-flex flex-wrap justify-center"},Da={key:2,class:"empty-subjects-grid"};function _a(t,e,a,d,s,l){return f(),y(N,null,[r("div",ua,[n(Ye,{name:"grid"},{default:i(()=>[(f(!0),y(N,null,M(a.sortedItems,o=>(f(),y("div",{key:o.key,style:Ie({"grid-row-end":`span ${o.rowSpan}`,order:o.order}),class:"grid-item"},[o.type==="attendance"?(f(),w(_,{key:0,class:we([{"glow-highlight":a.highlightedCards[o.key],"cursor-not-allowed":a.isEditingDisabled,"cursor-pointer":!a.isEditingDisabled},"glow-track"]),border:"",height:"100%",onClick:e[0]||(e[0]=u=>l.handleCardClick("attendance",null)),onMousemove:l.handleMouseMove,onTouchmove:l.handleTouchMove},{default:i(()=>[n(Y,{class:"d-flex align-center"},{default:i(()=>[n(D,{class:"mr-2",color:"primary",icon:"mdi-account-group"}),e[1]||(e[1]=c(" 出勤统计 ",-1))]),_:1}),n(A,null,{default:i(()=>[r("div",ca,[e[2]||(e[2]=r("span",null,"应到/实到",-1)),r("span",fa,g(o.data.total-o.data.exclude.length)+"/"+g(o.data.total-o.data.absent.length-o.data.late.length-o.data.exclude.length),1)]),n(xe,{class:"mb-2"}),o.data.absent.length>0?(f(),y("div",ma,[r("div",ha,"请假 ("+g(o.data.absent.length)+")",1),r("div",va,[(f(!0),y(N,null,M(o.data.absent,u=>(f(),w(B,{key:u,color:"error",size:"x-small",variant:"flat"},{default:i(()=>[c(g(u),1)]),_:2},1024))),128))])])):x("",!0),o.data.late.length>0?(f(),y("div",ga,[r("div",pa,"迟到 ("+g(o.data.late.length)+")",1),r("div",ya,[(f(!0),y(N,null,M(o.data.late,u=>(f(),w(B,{key:u,color:"warning",size:"x-small",variant:"flat"},{default:i(()=>[c(g(u),1)]),_:2},1024))),128))])])):x("",!0),o.data.exclude.length>0?(f(),y("div",ka,[r("div",ba,"不参与 ("+g(o.data.exclude.length)+")",1),r("div",wa,[(f(!0),y(N,null,M(o.data.exclude,u=>(f(),w(B,{key:u,color:"grey",size:"x-small",variant:"flat"},{default:i(()=>[c(g(u),1)]),_:2},1024))),128))])])):x("",!0),o.data.absent.length===0&&o.data.late.length===0&&o.data.exclude.length===0?(f(),y("div",xa," 全勤 ")):x("",!0)]),_:2},1024)]),_:2},1032,["class","onMousemove","onTouchmove"])):o.type==="custom"?(f(),w(_,{key:1,class:we([{"glow-highlight":a.highlightedCards[o.key],"cursor-not-allowed":a.isEditingDisabled,"cursor-pointer":!a.isEditingDisabled},"glow-track"]),border:"",height:"100%",onClick:u=>l.handleCardClick("dialog",o.key),onMousemove:l.handleMouseMove,onTouchmove:l.handleTouchMove},{default:i(()=>[n(Y,{class:"text-primary"},{default:i(()=>[n(D,{class:"mr-2",icon:"mdi-card-text-outline",size:"small"}),c(" "+g(o.name),1)]),_:2},1024),n(A,{style:Ie(a.contentStyle)},{default:i(()=>[c(g(o.content),1)]),_:2},1032,["style"])]),_:2},1032,["class","onClick","onMousemove","onTouchmove"])):(f(),w(_,{key:2,class:we([{"glow-highlight":a.highlightedCards[o.key],"cursor-not-allowed":a.isEditingDisabled,"cursor-pointer":!a.isEditingDisabled},"glow-track"]),border:"",height:"100%",onClick:u=>l.handleCardClick("dialog",o.key),onMousemove:l.handleMouseMove,onTouchmove:l.handleTouchMove},{default:i(()=>[n(Y,null,{default:i(()=>[c(g(o.name),1)]),_:2},1024),n(A,{style:Ie(a.contentStyle)},{default:i(()=>[n(Ke,null,{default:i(()=>[(f(!0),y(N,null,M(l.splitPoint(o.content),u=>(f(),w(Me,{key:u},{default:i(()=>[c(g(u),1)]),_:2},1024))),128))]),_:2},1024)]),_:2},1032,["style"])]),_:2},1032,["class","onClick","onMousemove","onTouchmove"]))],4))),128))]),_:1})],512),r("div",Sa,[l.isMobile?(f(),y("div",Ca,[(f(!0),y(N,null,M(a.unusedSubjects,o=>(f(),w(B,{key:o.name,class:"ma-1",color:"primary",variant:"tonal",onClick:u=>l.handleCardClick("dialog",o.name)},{default:i(()=>[n(D,{start:"",size:"small"},{default:i(()=>[...e[3]||(e[3]=[c("mdi-plus",-1)])]),_:1}),c(" "+g(o.name),1)]),_:2},1032,["onClick"]))),128))])):a.emptySubjectDisplay==="button"?(f(),w(wt,{key:1,divided:"",variant:"tonal"},{default:i(()=>[(f(!0),y(N,null,M(a.unusedSubjects,o=>(f(),w(k,{key:o.name,onClick:u=>l.handleCardClick("dialog",o.name)},{default:i(()=>[n(D,{start:""},{default:i(()=>[...e[4]||(e[4]=[c(" mdi-plus",-1)])]),_:1}),c(" "+g(o.name),1)]),_:2},1032,["onClick"]))),128))]),_:1})):(f(),y("div",Da,[n(Ye,{name:"v-list"},{default:i(()=>[(f(!0),y(N,null,M(a.unusedSubjects,o=>(f(),w(_,{key:o.name,border:"",class:"empty-subject-card",onClick:u=>l.handleCardClick("dialog",o.name)},{default:i(()=>[n(Y,{class:"text-subtitle-1"},{default:i(()=>[c(g(o.name),1)]),_:2},1024),n(A,{class:"text-center"},{default:i(()=>[n(D,{color:"grey",size:"small"},{default:i(()=>[...e[5]||(e[5]=[c(" mdi-plus",-1)])]),_:1}),e[6]||(e[6]=r("div",{class:"text-caption text-grey"},"点击添加作业",-1))]),_:1})]),_:2},1032,["onClick"]))),128))]),_:1})]))])],64)}const Lt=te(da,[["render",_a],["__scopeId","data-v-1f29e910"]]),Ta=ln({autoSelectFirst:{type:[Boolean,String]},clearOnSelect:Boolean,search:String,...Rn({filterKeys:["title"]}),...Ln(),...yn(Dn({modelValue:null,role:"combobox"}),["validationValue","dirty","appendInnerIcon"])},"VAutocomplete"),Va=an()({name:"VAutocomplete",props:Ta(),emits:{"update:focused":t=>!0,"update:search":t=>!0,"update:modelValue":t=>!0,"update:menu":t=>!0},setup(t,e){let{slots:a}=e;const{t:d}=on(),s=P(),l=Ee(!1),o=Ee(!0),u=Ee(!1),h=P(),m=P(),p=Ee(-1),I=Ee(null),{items:L,transformIn:oe,transformOut:$}=rn(t),{textColorClasses:Q,textColorStyles:ae}=dn(()=>{var S;return(S=s.value)==null?void 0:S.color}),j=We(t,"search",""),E=We(t,"modelValue",[],S=>oe(S===null?[null]:un(S)),S=>{const F=$(S);return t.multiple?F:F[0]??null}),T=q(()=>typeof t.counterValue=="function"?t.counterValue(E.value):typeof t.counterValue=="number"?t.counterValue:E.value.length),ve=Cn(t),{filteredItems:ye,getMatches:V}=Un(t,L,()=>I.value??(o.value?"":j.value)),b=q(()=>t.hideSelected&&I.value===null?ye.value.filter(S=>!E.value.some(F=>F.value===S.value)):ye.value),U=q(()=>!!(t.chips||a.chip)),le=q(()=>U.value||!!a.selection),W=q(()=>E.value.map(S=>S.props.value)),ne=q(()=>{var F;return(t.autoSelectFirst===!0||t.autoSelectFirst==="exact"&&j.value===((F=b.value[0])==null?void 0:F.title))&&b.value.length>0&&!o.value&&!u.value}),G=q(()=>t.hideNoData&&!b.value.length||ve.isReadonly.value||ve.isDisabled.value),v=We(t,"menu"),R=q({get:()=>v.value,set:S=>{var F;v.value&&!S&&((F=h.value)!=null&&F.ΨopenChildren.size)||S&&G.value||(v.value=S)}}),{menuId:ue,ariaExpanded:Ne,ariaControls:Re,ariaLabel:Be}=Fn(t,R),me=P(),$t=Mn(me,s);function Ot(S){t.openOnClear&&(R.value=!0),j.value=""}function jt(){G.value||(R.value=!0)}function Kt(S){G.value||(l.value&&(S.preventDefault(),S.stopPropagation()),R.value=!R.value)}function Ht(S){var F;(ot(S)||S.key==="Backspace")&&((F=s.value)==null||F.focus())}function qt(S){var z,X,ce,ke,O;if(ve.isReadonly.value)return;const F=(z=s.value)==null?void 0:z.selectionStart,H=E.value.length;if(["Enter","ArrowDown","ArrowUp"].includes(S.key)&&S.preventDefault(),["Enter","ArrowDown"].includes(S.key)&&(R.value=!0),["Escape"].includes(S.key)&&(R.value=!1),ne.value&&["Enter","Tab"].includes(S.key)&&!E.value.some(J=>{let{value:Z}=J;return Z===b.value[0].value})&&_e(b.value[0]),S.key==="ArrowDown"&&ne.value&&((X=me.value)==null||X.focus("next")),["Backspace","Delete"].includes(S.key)){if(!t.multiple&&le.value&&E.value.length>0&&!j.value)return _e(E.value[0],!1);if(~p.value){S.preventDefault();const J=p.value;_e(E.value[p.value],!1),p.value=J>=H-1?H-2:J}else S.key==="Backspace"&&!j.value&&(p.value=H-1);return}if(t.multiple)if(S.key==="ArrowLeft"){if(p.value<0&&F&&F>0)return;const J=p.value>-1?p.value-1:H-1;if(E.value[J])p.value=J;else{const Z=((ce=j.value)==null?void 0:ce.length)??null;p.value=-1,(ke=s.value)==null||ke.setSelectionRange(Z,Z)}}else if(S.key==="ArrowRight"){if(p.value<0)return;const J=p.value+1;E.value[J]?p.value=J:(p.value=-1,(O=s.value)==null||O.setSelectionRange(0,0))}else~p.value&&ot(S)&&(p.value=-1)}function Qt(S){if(rt(s.value,":autofill")||rt(s.value,":-webkit-autofill")){const F=L.value.find(H=>H.title===S.target.value);F&&_e(F)}}function Wt(){var S;t.eager&&((S=m.value)==null||S.calculateVisibleItems())}function Gt(){var S;l.value&&(o.value=!0,(S=s.value)==null||S.focus()),I.value=null}function Jt(S){l.value=!0,setTimeout(()=>{u.value=!0})}function Yt(S){u.value=!1}function Xt(S){(S==null||S===""&&!t.multiple&&!le.value)&&(E.value=[])}const Qe=Ee(!1);function _e(S){let F=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(!(!S||S.props.disabled))if(t.multiple){const H=E.value.findIndex(X=>(t.valueComparator||kn)(X.value,S.value)),z=F??!~H;if(~H){const X=z?[...E.value,S]:[...E.value];X.splice(H,1),E.value=X}else z&&(E.value=[...E.value,S]);t.clearOnSelect&&(j.value="")}else{const H=F!==!1;E.value=H?[S]:[],I.value=o.value?"":j.value??"",j.value=H&&!le.value?S.title:"",lt(()=>{R.value=!1,o.value=!0})}}return Se(l,(S,F)=>{var H;S!==F&&(S?(Qe.value=!0,j.value=t.multiple||le.value?"":String(((H=E.value.at(-1))==null?void 0:H.props.title)??""),o.value=!0,lt(()=>Qe.value=!1)):(!t.multiple&&j.value==null&&(E.value=[]),R.value=!1,!o.value&&j.value&&(I.value=j.value),j.value="",p.value=-1))}),Se(j,S=>{!l.value||Qe.value||(S&&(R.value=!0),o.value=!S)}),Se(R,S=>{if(!t.hideSelected&&S&&E.value.length&&o.value){const F=b.value.findIndex(H=>E.value.some(z=>H.value===z.value));cn&&window.requestAnimationFrame(()=>{var H;F>=0&&((H=m.value)==null||H.scrollToIndex(F))})}S&&(I.value=null)}),Se(L,(S,F)=>{R.value||l.value&&!F.length&&S.length&&(R.value=!0)}),fn(()=>{const S=!!(!t.hideNoData||b.value.length||a["prepend-item"]||a["append-item"]||a["no-data"]),F=E.value.length>0,H=De.filterProps(t);return n(De,he({ref:s},H,{modelValue:j.value,"onUpdate:modelValue":[z=>j.value=z,Xt],focused:l.value,"onUpdate:focused":z=>l.value=z,validationValue:E.externalValue,counterValue:T.value,dirty:F,onChange:Qt,class:["v-autocomplete",`v-autocomplete--${t.multiple?"multiple":"single"}`,{"v-autocomplete--active-menu":R.value,"v-autocomplete--chips":!!t.chips,"v-autocomplete--selection-slot":!!le.value,"v-autocomplete--selecting-index":p.value>-1},t.class],style:t.style,readonly:ve.isReadonly.value,placeholder:F?void 0:t.placeholder,"onClick:clear":Ot,"onMousedown:control":jt,onKeydown:qt,"aria-expanded":Ne.value,"aria-controls":Re.value}),{...a,default:()=>r(N,null,[n(Tt,he({id:ue.value,ref:h,modelValue:R.value,"onUpdate:modelValue":z=>R.value=z,activator:"parent",contentClass:"v-autocomplete__content",disabled:G.value,eager:t.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:Wt,onAfterLeave:Gt},t.menuProps),{default:()=>[S&&n(Ke,he({ref:me,filterable:!0,selected:W.value,selectStrategy:t.multiple?"independent":"single-independent",onMousedown:z=>z.preventDefault(),onKeydown:Ht,onFocusin:Jt,onFocusout:Yt,tabindex:"-1",selectable:!0,"aria-live":"polite",color:t.itemColor??t.color},$t,t.listProps),{default:()=>{var z,X,ce;return[(z=a["prepend-item"])==null?void 0:z.call(a),!b.value.length&&!t.hideNoData&&(((X=a["no-data"])==null?void 0:X.call(a))??n(Me,{key:"no-data",title:d(t.noDataText)},null)),n(Pn,{ref:m,renderless:!0,items:b.value,itemKey:"value"},{default:ke=>{var tt,nt,st;let{item:O,index:J,itemRef:Z}=ke;const et=he(O.props,{ref:Z,key:O.value,active:ne.value&&J===0?!0:void 0,onClick:()=>_e(O,null)});return O.type==="divider"?((tt=a.divider)==null?void 0:tt.call(a,{props:O.raw,index:J}))??n(xe,he(O.props,{key:`divider-${J}`}),null):O.type==="subheader"?((nt=a.subheader)==null?void 0:nt.call(a,{props:O.raw,index:J}))??n(hn,he(O.props,{key:`subheader-${J}`}),null):((st=a.item)==null?void 0:st.call(a,{item:O,index:J,props:et}))??n(Me,he(et,{role:"option"}),{prepend:$e=>{let{isSelected:Zt}=$e;return r(N,null,[t.multiple&&!t.hideSelected?n(Hn,{key:O.value,modelValue:Zt,ripple:!1,tabindex:"-1",onClick:en=>en.preventDefault()},null):void 0,O.props.prependAvatar&&n(je,{image:O.props.prependAvatar},null),O.props.prependIcon&&n(D,{icon:O.props.prependIcon},null)])},title:()=>{var $e;return o.value?O.title:zn("v-autocomplete",O.title,($e=V(O))==null?void 0:$e.title)}})}}),(ce=a["append-item"])==null?void 0:ce.call(a)]}})]}),E.value.map((z,X)=>{function ce(Z){Z.stopPropagation(),Z.preventDefault(),_e(z,!1)}const ke=he(B.filterProps(z.props),{"onClick:close":ce,onKeydown(Z){Z.key!=="Enter"&&Z.key!==" "||(Z.preventDefault(),Z.stopPropagation(),ce(Z))},onMousedown(Z){Z.preventDefault(),Z.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0}),O=U.value?!!a.chip:!!a.selection,J=O?vn(U.value?a.chip({item:z,index:X,props:ke}):a.selection({item:z,index:X})):void 0;if(!(O&&!J))return r("div",{key:z.value,class:we(["v-autocomplete__selection",X===p.value&&["v-autocomplete__selection--selected",Q.value]]),style:Ie(X===p.value?ae.value:{})},[U.value?a.chip?n(gn,{key:"chip-defaults",defaults:{VChip:{closable:t.closableChips,size:"small",text:z.title}}},{default:()=>[J]}):n(B,he({key:"chip",closable:t.closableChips,size:"small",text:z.title,disabled:z.props.disabled},ke),null):J??r("span",{class:"v-autocomplete__selection-text"},[z.title,t.multiple&&X<E.value.length-1&&r("span",{class:"v-autocomplete__selection-comma"},[c(",")])])])})]),"append-inner":function(){var ke,O;for(var z=arguments.length,X=new Array(z),ce=0;ce<z;ce++)X[ce]=arguments[ce];return r(N,null,[(ke=a["append-inner"])==null?void 0:ke.call(a,...X),t.menuIcon?n(D,{class:"v-autocomplete__menu-icon",color:(O=s.value)==null?void 0:O.fieldIconColor,icon:t.menuIcon,onMousedown:Kt,onClick:mn,"aria-label":Be.value,title:Be.value,tabindex:"-1"},null):void 0])}})}),pn({isFocused:l,isPristine:o,menu:R,search:j,filteredItems:ye,select:_e},s)}}),Ia={key:0,class:"mt-2 text-caption text-medium-emphasis"},Na={__name:"StudentNameManager",emits:["token-info-updated"],setup(t,{expose:e,emit:a}){const d=a,s=P(!1),l=P(""),o=P([]),u=P(""),h=P(!1),m=P(""),p=P(null),I=q(()=>{var V;return((V=p.value)==null?void 0:V.deviceType)==="student"}),L=q(()=>{var V;return((V=p.value)==null?void 0:V.isReadOnly)===!0}),oe=q(()=>{var V;return((V=p.value)==null?void 0:V.note)||"设置名称"}),$=q(()=>!!Q.value),Q=q(()=>C("server.kvToken")),ae=q(()=>C("server.provider")),j=q(()=>ae.value==="kv-server"||ae.value==="classworkscloud"),E=async()=>{if(!(!j.value||!Q.value))try{const V=C("server.domain");if(!V)return;const b=await Ce.get(`${V}/kv/_token`,{headers:{Authorization:`Bearer ${Q.value}`}});if(p.value=b.data,p.value.deviceType!=="student")return;u.value=p.value.note||"";const le=(await Ce.get(`${V}/kv/classworks-list-main`,{headers:{Authorization:`Bearer ${Q.value}`}})).data.value||[];if(o.value=Array.isArray(le)?le:[],o.value.length===0)return;const W=p.value.note||"",ne=o.value.some(G=>G.name===W);(!W||!ne)&&(s.value=!0,l.value="")}catch(V){console.error("检查学生姓名状态失败:",V)}},T=async()=>{var V,b,U,le;if(!(!l.value||h.value)){m.value="",h.value=!0;try{const W=C("server.domain"),ne=Q.value;(await Ce.post(`${W}/apps/tokens/${ne}/set-student-name`,{name:l.value})).data.success&&(u.value=l.value,s.value=!1,await E(),d("token-info-updated"))}catch(W){const ne=(V=W==null?void 0:W.response)==null?void 0:V.status;ne===400?m.value="该名称不在学生列表中,请选择正确的姓名":ne===403?m.value="只有学生类型的 Token 可以设置姓名":ne===404?m.value="设备未设置学生列表或 Token 不存在":m.value=((le=(U=(b=W==null?void 0:W.response)==null?void 0:b.data)==null?void 0:U.error)==null?void 0:le.message)||(W==null?void 0:W.message)||"设置失败,请稍后重试"}finally{h.value=!1}}},ve=()=>{s.value=!1},ye=async()=>{if(console.log("StudentNameManager.openDialog called"),console.log("isStudentToken:",I.value),console.log("studentList.length:",o.value.length),console.log("currentStudentName:",u.value),!I.value){console.log("Not a student token, cannot open dialog");return}o.value=await fe.loadData("classworks-list-main"),o.value.length===0?(console.log("Student list is empty, trying to load..."),E().then(()=>{o.value.length>0?(l.value=u.value,s.value=!0):console.warn("Student list is still empty after reload")})):(l.value=u.value,s.value=!0,console.log("Dialog opened, showDialog:",s.value))};return Se(Q,()=>{E()}),xt(()=>{E()}),Se(p,()=>{d("token-info-updated")},{deep:!0}),St(()=>{E()}),e({checkStudentNameStatus:E,openDialog:ye,currentStudentName:u,isStudentToken:I,isReadOnly:L,displayName:oe,hasToken:$,tokenInfo:p}),(V,b)=>(f(),y(N,null,[n(ie,{modelValue:s.value,"onUpdate:modelValue":b[1]||(b[1]=U=>s.value=U),"max-width":"500",persistent:""},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,null,{default:i(()=>[...b[2]||(b[2]=[c("设置学生姓名",-1)])]),_:1}),n(A,null,{default:i(()=>[b[3]||(b[3]=r("div",{class:"mb-2"}," 请从列表中选择您的姓名: ",-1)),n(Va,{modelValue:l.value,"onUpdate:modelValue":b[0]||(b[0]=U=>l.value=U),items:o.value,clearable:"","hide-details":"","item-title":"name","item-value":"name",label:"学生姓名",placeholder:"选择您的姓名"},null,8,["modelValue","items"]),o.value.length>0?(f(),y("div",Ia," 共 "+g(o.value.length)+" 位学生 ",1)):x("",!0),m.value?(f(),w(Le,{key:1,class:"mt-3",type:"error",variant:"tonal"},{default:i(()=>[c(g(m.value),1)]),_:1})):x("",!0)]),_:1}),n(de,null,{default:i(()=>[n(k,{variant:"text",onClick:ve},{default:i(()=>[...b[4]||(b[4]=[c(" 稍后设置 ",-1)])]),_:1}),n(K),n(k,{disabled:!l.value||h.value,loading:h.value,color:"primary",onClick:T},{default:i(()=>[...b[5]||(b[5]=[c(" 确认 ",-1)])]),_:1},8,["disabled","loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),bn(V.$slots,"header-display",{isStudent:I.value,openDialog:ye,studentName:u.value},void 0)],64))}},Rt=te(Na,[["__scopeId","data-v-49cb0f5f"]]),Ea={class:"text-center mb-6"},Aa={class:"text-body-2"},Ua={class:"form-section"},Fa={__name:"DeviceAuthDialog",props:{showCancel:{type:Boolean,default:!1},preconfig:{type:Object,default:null}},emits:["success","cancel"],setup(t,{expose:e,emit:a}){const d=t,s=a,l=P({namespace:"",password:""}),o=P(!1),u=P("");Se(()=>d.preconfig,m=>{m&&(console.log("应用预配置数据:",m),l.value.namespace=m.namespace||"",l.value.password=m.password||"",m.autoExecute&&m.namespace?(console.log("检测到自动执行标志且有命名空间,自动执行认证"),setTimeout(()=>{h()},300)):m.namespace&&console.log("预配置数据已填入,等待手动认证"))},{immediate:!0,deep:!0});const h=async()=>{var m,p,I,L,oe;if(!(!l.value.namespace||o.value)){u.value="",o.value=!0;try{const $=C("server.domain");if(!$)throw new Error("未配置服务器域名");const Q=await Ce.post(`${$}/apps/auth/token`,{namespace:l.value.namespace,password:l.value.password||void 0,appId:"d158067f53627d2b98babe8bffd2fd7d"});if(!Q.data.success)throw new Error("设备验证失败");const ae=Q.data;pe("server.kvToken",ae.token),(m=ae.device)!=null&&m.uuid&&pe("device.uuid",ae.device.uuid),s("success",ae)}catch($){const Q=(p=$==null?void 0:$.response)==null?void 0:p.status;Q===401||Q===403?u.value="密码错误或无权限访问":Q===404?u.value="设备不存在,请检查 namespace 是否正确":u.value=((oe=(L=(I=$==null?void 0:$.response)==null?void 0:I.data)==null?void 0:L.error)==null?void 0:oe.message)||($==null?void 0:$.message)||"认证失败,请稍后重试"}finally{o.value=!1}}};return e({reset:()=>{l.value={namespace:"",password:""},u.value=""}}),(m,p)=>(f(),w(_,{class:"auth-card"},{default:i(()=>[n(A,{class:"pa-8"},{default:i(()=>[r("div",Ea,[n(D,{class:"mb-4",color:"success",size:"80"},{default:i(()=>[...p[4]||(p[4]=[c(" mdi-account-key ",-1)])]),_:1}),p[5]||(p[5]=r("h2",{class:"text-h4 mb-3"}," 设备认证 ",-1)),p[6]||(p[6]=r("p",{class:"text-body-1 text-medium-emphasis"}," 输入你在 Classworks KV 获取的认证信息 ",-1))]),n(_,{class:"pa-4 mb-6",color:"info",variant:"tonal"},{default:i(()=>[r("div",Aa,[n(D,{class:"mr-2",size:"20"},{default:i(()=>[...p[7]||(p[7]=[c(" mdi-information ",-1)])]),_:1}),p[8]||(p[8]=c(" 对于已有UUID的用户,您应当使用UUID与您的密码登录。 ",-1))])]),_:1}),r("div",Ua,[n(De,{modelValue:l.value.namespace,"onUpdate:modelValue":p[0]||(p[0]=I=>l.value.namespace=I),class:"mb-4","hide-details":"auto",label:"命名空间","prepend-inner-icon":"mdi-identifier",variant:"outlined"},null,8,["modelValue"]),n(De,{modelValue:l.value.password,"onUpdate:modelValue":p[1]||(p[1]=I=>l.value.password=I),label:"认证码","prepend-inner-icon":"mdi-lock-outline",type:"text",variant:"outlined"},null,8,["modelValue"]),u.value?(f(),w(Le,{key:0,class:"mt-4",closable:"",type:"error",variant:"tonal","onClick:close":p[2]||(p[2]=I=>u.value="")},{default:i(()=>[c(g(u.value),1)]),_:1})):x("",!0)])]),_:1}),n(de,{class:"pa-6 pt-0"},{default:i(()=>[t.showCancel?(f(),w(k,{key:0,size:"large",variant:"text",onClick:p[3]||(p[3]=I=>m.$emit("cancel"))},{default:i(()=>[...p[9]||(p[9]=[c(" 取消 ",-1)])]),_:1})):x("",!0),n(K),n(k,{disabled:!l.value.namespace||o.value,loading:o.value,class:"px-8",color:"primary",size:"x-large",variant:"elevated",onClick:h},{default:i(()=>[n(D,{size:"24",start:""},{default:i(()=>[...p[10]||(p[10]=[c(" mdi-login ",-1)])]),_:1}),p[11]||(p[11]=r("span",{class:"text-h6"},"认证并登录",-1))]),_:1},8,["disabled","loading"])]),_:1})]),_:1}))}},Ma=te(Fa,[["__scopeId","data-v-9e8d02e4"]]),Pa={__name:"TokenInputDialog",props:{showCancel:{type:Boolean,default:!1}},emits:["success","cancel"],setup(t,{expose:e,emit:a}){const d=a,s=P(""),l=P(!1),o=P(""),u=async()=>{var h,m,p;if(!(!s.value||l.value)){o.value="",l.value=!0;try{const I=C("server.domain");if(!I)throw new Error("未配置服务器域名");await Ce.get(`${I}/kv/_info`,{headers:{Accept:"application/json","x-app-token":s.value}}),pe("server.kvToken",s.value),d("success")}catch(I){const L=(h=I==null?void 0:I.response)==null?void 0:h.status;L===401||L===403?o.value="Token 无效或无权限,请确认后重试":L===404?o.value="命名空间不存在或服务器未就绪":o.value=((p=(m=I==null?void 0:I.response)==null?void 0:m.data)==null?void 0:p.message)||(I==null?void 0:I.message)||"验证失败,请稍后重试"}finally{l.value=!1}}};return e({reset:()=>{s.value="",o.value=""}}),(h,m)=>(f(),w(_,null,{default:i(()=>[n(Y,null,{default:i(()=>[...m[2]||(m[2]=[c("输入授权 Token",-1)])]),_:1}),n(A,null,{default:i(()=>[n(De,{modelValue:s.value,"onUpdate:modelValue":m[0]||(m[0]=p=>s.value=p),clearable:"",density:"comfortable","hide-details":"auto",label:"KV 授权 Token",placeholder:"粘贴从授权页面获取的 Token",variant:"outlined"},null,8,["modelValue"]),o.value?(f(),w(Le,{key:0,class:"mt-3",type:"error",variant:"tonal"},{default:i(()=>[c(g(o.value),1)]),_:1})):x("",!0)]),_:1}),n(de,null,{default:i(()=>[n(K),t.showCancel?(f(),w(k,{key:0,variant:"text",onClick:m[1]||(m[1]=p=>h.$emit("cancel"))},{default:i(()=>[...m[3]||(m[3]=[c(" 取消 ",-1)])]),_:1})):x("",!0),n(k,{disabled:!s.value||l.value,loading:l.value,color:"primary",onClick:u},{default:i(()=>[...m[4]||(m[4]=[c(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])]),_:1})]),_:1}))}},za={__name:"AlternativeCodeDialog",props:{showCancel:{type:Boolean,default:!1}},emits:["submit","cancel"],setup(t,{expose:e,emit:a}){const d=a,s=P(""),l=()=>{s.value&&d("submit",s.value)};return e({reset:()=>{s.value=""}}),(o,u)=>(f(),w(_,null,{default:i(()=>[n(Y,null,{default:i(()=>[...u[2]||(u[2]=[c("输入替代代码",-1)])]),_:1}),n(A,null,{default:i(()=>[n(ze,{modelValue:s.value,"onUpdate:modelValue":u[0]||(u[0]=h=>s.value=h),density:"comfortable","hide-details":"auto",label:"替代代码",placeholder:"请输入替代代码",rows:"5",variant:"outlined"},null,8,["modelValue"]),n(Le,{class:"mt-3",type:"info",variant:"tonal"},{default:i(()=>[...u[3]||(u[3]=[c(" 替代代码功能暂未实现,敬请期待 ",-1)])]),_:1})]),_:1}),n(de,null,{default:i(()=>[n(K),t.showCancel?(f(),w(k,{key:0,variant:"text",onClick:u[1]||(u[1]=h=>o.$emit("cancel"))},{default:i(()=>[...u[4]||(u[4]=[c(" 取消 ",-1)])]),_:1})):x("",!0),n(k,{disabled:!s.value,color:"primary",onClick:l},{default:i(()=>[...u[5]||(u[5]=[c(" 提交 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1}))}},ee=[];for(let t=0;t<256;++t)ee.push((t+256).toString(16).slice(1));function La(t,e=0){return(ee[t[e+0]]+ee[t[e+1]]+ee[t[e+2]]+ee[t[e+3]]+"-"+ee[t[e+4]]+ee[t[e+5]]+"-"+ee[t[e+6]]+ee[t[e+7]]+"-"+ee[t[e+8]]+ee[t[e+9]]+"-"+ee[t[e+10]]+ee[t[e+11]]+ee[t[e+12]]+ee[t[e+13]]+ee[t[e+14]]+ee[t[e+15]]).toLowerCase()}let Ge;const Ra=new Uint8Array(16);function Ba(){if(!Ge){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");Ge=crypto.getRandomValues.bind(crypto)}return Ge(Ra)}const $a=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),kt={randomUUID:$a};function Oa(t,e,a){var s;t=t||{};const d=t.random??((s=t.rng)==null?void 0:s.call(t))??Ba();if(d.length<16)throw new Error("Random bytes length must be >= 16");return d[6]=d[6]&15|64,d[8]=d[8]&63|128,La(d)}function ja(t,e,a){return kt.randomUUID&&!t?kt.randomUUID():Oa(t)}const Ka={class:"step-content"},Ha={class:"text-center mb-6"},qa={class:"step-content"},Qa={class:"relationship-diagram"},Wa={class:"diagram-item"},Ga={class:"text-center"},Ja={class:"diagram-description mt-3"},Ya={class:"diagram-connector"},Xa={class:"diagram-item"},Za={class:"text-center"},el={class:"diagram-description mt-3"},tl={class:"step-content"},nl={class:"button-group"},sl={class:"d-flex flex-column align-center py-2"},il={class:"d-flex flex-column align-center py-2"},al={class:"step-content"},ll={class:"text-center mb-6"},ol={class:"step-content"},rl={class:"text-center mb-6"},dl={class:"d-flex flex-column flex-sm-row align-center"},ul={class:"flex-grow-1"},cl={class:"text-h6 font-weight-bold"},fl={class:"text-h5 mb-6"},ml={class:"text-subtitle-2"},hl={class:"d-flex align-center"},vl={class:"d-flex align-center"},gl={class:"step-content"},pl={class:"text-center mb-6"},yl={class:"d-flex align-center mb-3"},kl={class:"text-h6 font-weight-medium"},bl={key:0,class:"text-body-2 mb-2"},wl={class:"mb-2"},xl={class:"device-code"},Sl={key:1,class:"text-body-2 text-error"},Cl={class:"log-box"},Dl={key:0,class:"text-caption text-medium-emphasis"},_l={class:"d-flex flex-wrap gap-2 mt-4"},Oe=5,Tl={__name:"FirstTimeGuide",emits:["close","success"],setup(t,{emit:e}){const a=e,d=C("server.authDomain"),s=P(1),l=P(""),o=P("idle"),u=P(""),h=P(null),m=P(null),p=P([]),I=P({1:!1,2:!1,3:!1,4:!1}),L=()=>{s.value<Oe&&s.value++},oe=()=>{s.value>1&&s.value--},$=G=>{l.value=G,L()},Q=()=>{a("close")},ae=()=>{window.open(d,"_blank")},j=()=>{s.value=5},E=q(()=>Object.values(I.value).filter(Boolean).length/4*100),T=q(()=>o.value==="success"?"success":o.value==="error"?"error":"primary"),ve=q(()=>o.value==="success"?"mdi-check-circle":o.value==="error"?"mdi-alert-circle":o.value==="registering"?"mdi-progress-clock":"mdi-rocket-launch"),ye=q(()=>o.value==="success"?"完成!设备已创建":o.value==="error"?"创建失败":o.value==="registering"?"正在执行…":"准备开始"),V=G=>{const v=new Date,R=String(v.getHours()).padStart(2,"0"),ue=String(v.getMinutes()).padStart(2,"0"),Ne=String(v.getSeconds()).padStart(2,"0");p.value.push({time:`${R}:${ue}:${Ne}`,message:G})},b=()=>"Classworks",U=async()=>{var G,v,R;if(o.value!=="registering"){o.value="registering",u.value="",p.value=[],I.value={1:!1,2:!1,3:!1,4:!1};try{V("正在生成设备信息…");const ue=ja(),Ne=b(),Re=C("server.domain");I.value[1]=!0,V("向服务器注册设备…");const Be=await Ce.post(`${Re}/devices`,{uuid:ue,deviceName:Ne});I.value[2]=!0,h.value={uuid:ue,deviceName:Ne,createdAt:new Date().toISOString(),registered:!0},localStorage.setItem("Classworks_progressive_device",JSON.stringify(h.value)),V("获取访问令牌…");try{const me=await Ce.post(`${Re}/apps/auth/token`,{namespace:ue,password:"",appId:"d158067f53627d2b98babe8bffd2fd7d"});me.data&&me.data.token?(m.value=me.data,pe("server.kvToken",me.data.token),(G=me.data.device)!=null&&G.uuid&&pe("device.uuid",me.data.device.uuid),V("已获取 Token 并写入配置")):V("未返回 Token,您可以稍后在授权页完成配置")}catch(me){console.warn("自动获取 Token 失败:",me),V("自动获取 Token 失败,可在授权页手动完成")}I.value[3]=!0,V("完成!您可以应用令牌或前往授权页面继续配置"),I.value[4]=!0,o.value="success"}catch(ue){console.error("设备注册失败:",ue),u.value=((R=(v=ue.response)==null?void 0:v.data)==null?void 0:R.message)||ue.message||"网络连接失败",V("失败:"+u.value),o.value="error"}}},le=()=>{o.value="idle",u.value="",p.value=[],I.value={1:!1,2:!1,3:!1,4:!1}},W=()=>{const G=h.value;if(!(G!=null&&G.uuid))return;const R=`${C("server.authDomain")}/?uuid=${encodeURIComponent(G.uuid)}&tolinktoaccount=true`;window.open(R,"_blank")},ne=()=>{m.value&&a("success",m.value),a("close")};return(G,v)=>(f(),w(_,{class:"guide-card"},{default:i(()=>[n(dt,{"model-value":s.value/Oe*100,color:"primary",height:"6"},null,8,["model-value"]),n(A,{class:"pa-8"},{default:i(()=>[re(r("div",Ka,[r("div",Ha,[n(D,{class:"mb-4",color:"primary",size:"80"},{default:i(()=>[...v[2]||(v[2]=[c(" mdi-hand-wave ",-1)])]),_:1}),v[3]||(v[3]=r("h2",{class:"text-h4 mb-3"}," 欢迎使用 Classworks ",-1)),v[4]||(v[4]=r("p",{class:"text-body-1 text-medium-emphasis"}," 适用于班级大屏的作业板小工具 ",-1))])],512),[[Te,s.value===1]]),re(r("div",qa,[v[17]||(v[17]=r("h3",{class:"text-h5 mb-6 text-center"}," Classworks 和 Classworks KV 的关系 ",-1)),n(_,{class:"pa-6 mb-6",color:"primary",variant:"tonal"},{default:i(()=>[r("div",Qa,[r("div",Wa,[n(_,{class:"pa-4",color:"blue-darken-1",elevation:"8"},{default:i(()=>[r("div",Ga,[n(D,{color:"white",size:"60"},{default:i(()=>[...v[5]||(v[5]=[c(" mdi-laptop ",-1)])]),_:1}),v[6]||(v[6]=r("h4",{class:"text-h6 text-white mt-2"}," Classworks ",-1)),v[7]||(v[7]=r("p",{class:"text-caption text-white mt-1"}," 作业板应用 ",-1))])]),_:1}),r("div",Ja,[n(B,{class:"mb-2",color:"blue",size:"small",variant:"flat"},{default:i(()=>[...v[8]||(v[8]=[c(" 前端应用 ",-1)])]),_:1}),v[9]||(v[9]=r("div",{class:"text-body-2"},[c(" • 显示作业内容"),r("br"),c(" • 管理班级信息"),r("br"),c(" • 提供用户界面 ")],-1))])]),r("div",Ya,[n(D,{color:"primary",size:"40"},{default:i(()=>[...v[10]||(v[10]=[c(" mdi-swap-horizontal ",-1)])]),_:1}),v[11]||(v[11]=r("div",{class:"text-caption font-weight-bold mt-2"}," 数据同步 ",-1))]),r("div",Xa,[n(_,{class:"pa-4",color:"green-darken-1",elevation:"8"},{default:i(()=>[r("div",Za,[n(D,{color:"white",size:"60"},{default:i(()=>[...v[12]||(v[12]=[c(" mdi-cloud-sync ",-1)])]),_:1}),v[13]||(v[13]=r("h4",{class:"text-h6 text-white mt-2"}," Classworks KV ",-1)),v[14]||(v[14]=r("p",{class:"text-caption text-white mt-1"}," 云端数据库 ",-1))])]),_:1}),r("div",el,[n(B,{class:"mb-2",color:"green",size:"small",variant:"flat"},{default:i(()=>[...v[15]||(v[15]=[c(" 后端服务 ",-1)])]),_:1}),v[16]||(v[16]=r("div",{class:"text-body-2"},[c(" • 存储作业数据"),r("br"),c(" • 多设备同步"),r("br"),c(" • 权限管理 ")],-1))])])])]),_:1})],512),[[Te,s.value===2]]),re(r("div",tl,[v[25]||(v[25]=r("h3",{class:"text-h5 mb-6 text-center"}," 你需要在多个设备上查看作业吗? ",-1)),n(_,{class:"mb-6 pa-4",color:"info",variant:"tonal"},{default:i(()=>[...v[18]||(v[18]=[r("div",{class:"text-body-2"}," 比如:在家里电脑、手机上查看,或者多个教室设备共享数据 ",-1)])]),_:1}),r("div",nl,[n(k,{block:"",class:"mb-4 py-6",color:"primary",size:"x-large",variant:"elevated",onClick:v[0]||(v[0]=R=>$("cloud"))},{default:i(()=>[r("div",sl,[n(D,{class:"mb-2",size:"40"},{default:i(()=>[...v[19]||(v[19]=[c(" mdi-cloud-check ",-1)])]),_:1}),v[20]||(v[20]=r("span",{class:"text-h6"},"需要,使用云同步",-1)),v[21]||(v[21]=r("span",{class:"text-caption mt-1"},"多设备访问",-1))])]),_:1}),n(k,{block:"",class:"py-6",size:"x-large",variant:"outlined",onClick:v[1]||(v[1]=R=>$("local"))},{default:i(()=>[r("div",il,[n(D,{class:"mb-2",size:"40"},{default:i(()=>[...v[22]||(v[22]=[c(" mdi-laptop ",-1)])]),_:1}),v[23]||(v[23]=r("span",{class:"text-h6"},"不需要,只用这台设备",-1)),v[24]||(v[24]=r("span",{class:"text-caption mt-1"},"本地存储",-1))])]),_:1})])],512),[[Te,s.value===3]]),re(r("div",al,[r("div",ll,[n(D,{class:"mb-4",color:"success",size:"80"},{default:i(()=>[...v[26]||(v[26]=[c(" mdi-check-circle ",-1)])]),_:1}),v[28]||(v[28]=r("h3",{class:"text-h5 mb-4"}," 您可以使用本地模式 ",-1)),n(_,{class:"pa-4 text-left",variant:"tonal"},{default:i(()=>[...v[27]||(v[27]=[r("div",{class:"text-body-1 mb-2"}," 此数据将存储在您的浏览器中,如果您的浏览器不支持IndexedDB,可能会出现问题。如果您经常清除浏览器数据,请谨慎使用本地模式。 ",-1),r("div",{class:"text-body-1 mb-2"}," 在刚才地方点击使用本地模式的按钮使用。 ",-1)])]),_:1})])],512),[[Te,s.value===4&&l.value==="local"]]),re(r("div",ol,[r("div",rl,[n(D,{class:"mb-4",color:"primary",size:"80"},{default:i(()=>[...v[29]||(v[29]=[c(" mdi-cloud-cog ",-1)])]),_:1}),v[30]||(v[30]=r("h3",{class:"text-h5 mb-4"}," 需要先设置云端账号 ",-1))]),n(_,{class:"pa-6 mb-6",variant:"tonal"},{default:i(()=>[r("div",dl,[r("div",ul,[v[32]||(v[32]=r("h4",{class:"text-h6 font-weight-bold mb-2"}," 自动注册设备 ",-1)),v[33]||(v[33]=r("p",{class:"text-body-2 mb-3 text-medium-emphasis"}," 通过引导式流程自动创建设备、获取令牌并完成初始化。适合首次体验或快速部署多终端。 ",-1)),n(k,{color:"primary","prepend-icon":"mdi-flash",size:"large",variant:"elevated",onClick:j},{default:i(()=>[...v[31]||(v[31]=[c(" 自动注册 ",-1)])]),_:1})])])]),_:1}),v[41]||(v[41]=r("div",{class:"mb-6"}," 也可以手动前往 Classworks KV 控制台获取认证信息: ",-1)),n(_,{color:Ae(d)=="https://kv.houlang.cloud"?"primary":"error",variant:Ae(d)=="https://kv.houlang.cloud"?"elevated":"outlined",class:"pa-6 mb-6",onClick:ae},{default:i(()=>[n(D,{class:"mb-3",size:"48"},{default:i(()=>[...v[34]||(v[34]=[c(" mdi-open-in-new ",-1)])]),_:1}),r("h4",cl," 请访问 "+g(Ae(d)=="https://kv.houlang.cloud"?"Classworks KV":"自定义的 Classworks KV 实例 ")+" 控制台 ",1),r("div",fl,g(Ae(d)),1),r("h6",ml,g(Ae(d)=="https://kv.houlang.cloud"?"此实例由 Classworks KV 官方提供":"此链接由您的实例、预配代码或管理员管理,当前可能不是 Classworks KV 官方的实例地址。"),1)]),_:1},8,["color","variant"]),n(qn,{class:"mt-6",variant:"accordion"},{default:i(()=>[n(gt,null,{default:i(()=>[n(pt,null,{default:i(()=>[r("div",hl,[n(D,{class:"mr-3",color:"warning"},{default:i(()=>[...v[35]||(v[35]=[c(" mdi-help-circle ",-1)])]),_:1}),v[36]||(v[36]=r("span",{class:"text-subtitle-1 font-weight-medium"},"我以前已经使用过 Classworks KV?",-1))])]),_:1}),n(yt,null,{default:i(()=>[n(_,{class:"pa-4",color:"success",variant:"tonal"},{default:i(()=>[...v[37]||(v[37]=[r("div",{class:"text-body-2 mb-2"},[c(" 如果您之前已经使用过 Classworks KV,可以直接使用您的 "),r("strong",null,"UUID(命名空间)"),c(" 和 "),r("strong",null,"设置的密码"),c(" 进行认证。 ")],-1),r("div",{class:"text-body-2"},' 返回上一页,点击"已注册"按钮,输入您的认证信息即可登录。 ',-1)])]),_:1})]),_:1})]),_:1}),n(gt,null,{default:i(()=>[n(pt,null,{default:i(()=>[r("div",vl,[n(D,{class:"mr-3",color:"info"},{default:i(()=>[...v[38]||(v[38]=[c(" mdi-help-circle ",-1)])]),_:1}),v[39]||(v[39]=r("span",{class:"text-subtitle-1 font-weight-medium"},"我如何配置不同类型的设备?",-1))])]),_:1}),n(yt,null,{default:i(()=>[n(_,{class:"pa-4",color:"info",variant:"tonal"},{default:i(()=>[...v[40]||(v[40]=[r("div",{class:"text-body-2 mb-2"},[c(" 不同的密码对应不同的设备类型,这将由 "),r("strong",null,"管理员管理"),c("。 ")],-1),r("div",{class:"text-body-2 mb-2"}," 例如: ",-1),r("ul",{class:"text-body-2 ml-4"},[r("li",{class:"mb-1"}," 班级大屏使用一个密码 "),r("li",{class:"mb-1"}," 教师设备使用另一个密码 "),r("li",null,"学生设备使用不同的密码")],-1),r("div",{class:"text-body-2 mt-3"}," 请联系您的管理员获取对应设备类型的密码。 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1})],512),[[Te,s.value===4&&l.value==="cloud"]]),re(r("div",gl,[r("div",pl,[n(je,{class:"mb-4",color:"primary",size:"80",variant:"tonal"},{default:i(()=>[n(D,{size:"48"},{default:i(()=>[...v[42]||(v[42]=[c(" mdi-rocket-launch ",-1)])]),_:1})]),_:1}),v[43]||(v[43]=r("h3",{class:"text-h5 font-weight-bold mb-2"}," 渐进式注册 ",-1)),v[44]||(v[44]=r("p",{class:"text-body-2 text-medium-emphasis"}," 您可以暂时不配置 Classworks KV ",-1))]),n(dt,{"model-value":E.value,class:"mb-6",color:"primary",height:"8",rounded:""},null,8,["model-value"]),n(ge,null,{default:i(()=>[n(se,{cols:"12"},{default:i(()=>[n(_,{color:T.value,variant:"tonal"},{default:i(()=>[n(Fe,null,{default:i(()=>[r("div",yl,[n(D,{color:T.value,class:"mr-2",size:"32"},{default:i(()=>[c(g(ve.value),1)]),_:1},8,["color"]),r("div",kl,g(ye.value),1)]),h.value?(f(),y("div",bl,[r("div",wl,[v[45]||(v[45]=r("strong",null,"设备名称:",-1)),c(g(h.value.deviceName),1)]),r("div",null,[v[46]||(v[46]=r("strong",null,"设备 UUID:",-1)),r("code",xl,g(h.value.uuid),1)])])):x("",!0),o.value==="error"?(f(),y("div",Sl,g(u.value),1)):x("",!0)]),_:1})]),_:1},8,["color"])]),_:1}),n(se,{cols:"12"},{default:i(()=>[n(_,{variant:"outlined"},{default:i(()=>[n(Fe,null,{default:i(()=>[v[47]||(v[47]=r("div",{class:"text-subtitle-2 font-weight-medium mb-3"}," 过程日志 ",-1)),r("div",Cl,[(f(!0),y(N,null,M(p.value,(R,ue)=>(f(),y("div",{key:ue,class:"text-caption log-line"},g(R.time)+" · "+g(R.message),1))),128)),p.value.length?x("",!0):(f(),y("div",Dl," 等待开始… "))])]),_:1})]),_:1})]),_:1})]),_:1}),r("div",_l,[o.value==="idle"?(f(),w(k,{key:0,color:"primary","prepend-icon":"mdi-play",size:"large",onClick:U},{default:i(()=>[...v[48]||(v[48]=[c(" 开始创建 ",-1)])]),_:1})):x("",!0),o.value==="error"?(f(),w(k,{key:1,color:"error","prepend-icon":"mdi-refresh",variant:"outlined",onClick:le},{default:i(()=>[...v[49]||(v[49]=[c(" 重试 ",-1)])]),_:1})):x("",!0),o.value==="registering"?(f(),w(k,{key:2,loading:!0,color:"primary","prepend-icon":"mdi-progress-clock",variant:"tonal"},{default:i(()=>[...v[50]||(v[50]=[c(" 正在执行… ",-1)])]),_:1})):x("",!0),o.value==="success"?(f(),w(k,{key:3,color:"success","prepend-icon":"mdi-check-circle",size:"large",variant:"elevated",onClick:ne},{default:i(()=>[...v[51]||(v[51]=[c(" 应用令牌并关闭 ",-1)])]),_:1})):x("",!0),o.value==="success"?(f(),w(k,{key:4,color:"primary","prepend-icon":"mdi-open-in-new",size:"large",variant:"outlined",onClick:W},{default:i(()=>[...v[52]||(v[52]=[c(" 前往绑定账户 ",-1)])]),_:1})):x("",!0)])],512),[[Te,s.value===5]])]),_:1}),n(de,{class:"pa-6 pt-0"},{default:i(()=>[s.value>1?(f(),w(k,{key:0,size:"large",variant:"text",onClick:oe},{default:i(()=>[n(D,{start:""},{default:i(()=>[...v[53]||(v[53]=[c(" mdi-chevron-left ",-1)])]),_:1}),v[54]||(v[54]=c(" 上一步 ",-1))]),_:1})):x("",!0),n(K),s.value<Oe&&s.value!==4?(f(),w(k,{key:1,disabled:s.value===3&&!l.value,color:"primary",size:"large",variant:"elevated",onClick:L},{default:i(()=>[v[56]||(v[56]=c(" 下一步 ",-1)),n(D,{end:""},{default:i(()=>[...v[55]||(v[55]=[c(" mdi-chevron-right ",-1)])]),_:1})]),_:1},8,["disabled"])):x("",!0),s.value===Oe||s.value===4?(f(),w(k,{key:2,color:"primary",size:"large",variant:"elevated",onClick:Q},{default:i(()=>[...v[57]||(v[57]=[c(" 关闭 ",-1)])]),_:1})):x("",!0)]),_:1})]),_:1}))}},Vl=te(Tl,[["__scopeId","data-v-817c6e0e"]]),Il={key:0,class:"init-overlay"},Nl={class:"init-container"},El={class:"main-card-row"},Al={class:"card-horizontal-layout"},Ul={class:"card-icon-wrapper"},Fl={class:"card-horizontal-layout"},Ml={class:"card-icon-wrapper"},Pl={class:"card-horizontal-layout"},zl={class:"card-icon-wrapper"},Ll={class:"options-buttons"},Rl={__name:"InitServiceChooser",props:{preconfig:{type:Object,default:()=>({namespace:null,authCode:null,autoOpen:!1,autoExecute:!1})}},emits:["done"],setup(t,{emit:e}){const a=t,d=e,s=P(!1),l=P(!1),o=P(!1),u=P(!1),h=P(!1),m=P(null),p=q(()=>C("server.provider")),I=q(()=>p.value==="kv-server"||p.value==="classworkscloud"),L=q(()=>C("server.kvToken")),oe=q(()=>{var V;return(V=a.preconfig)!=null&&V.namespace?{namespace:a.preconfig.namespace,password:a.preconfig.authCode||"",autoExecute:a.preconfig.autoExecute||!1}:null}),$=()=>{const V=window.location.pathname,b=V==="/"||V==="/index"||V==="/index.html",U=I.value&&(!L.value||L.value==="");s.value=b&&U};Se(()=>a.preconfig,V=>{V!=null&&V.autoOpen&&(V!=null&&V.namespace)&&s.value&&(console.log("检测到预配数据,自动打开设备认证对话框"),setTimeout(()=>{o.value=!0},500))},{immediate:!0,deep:!0}),St(()=>{$()});const Q=()=>{const V=C("server.authDomain"),b="d158067f53627d2b98babe8bffd2fd7d",U=window.location.origin,le=encodeURIComponent(`${U}/authorizecallback`),W=C("device.uuid")||"00000000-0000-4000-8000-000000000000";let ne=`${V}/authorize?app_id=${b}&mode=callback&callback_url=${le}&remark=Classworks 自动授权 来自${window.location.hostname} ${new Date().toLocaleString()}`;W!=="00000000-0000-4000-8000-000000000000"&&(ne+=`&uuid=${encodeURIComponent(W)}`),window.location.href=ne},ae=V=>{l.value=!1,console.log("渐进式注册成功:",V),$(),d("done")},j=V=>{var b;o.value=!1,console.log("认证成功:",V),(b=a.preconfig)!=null&&b.namespace&&console.log(`预配数据认证成功: ${a.preconfig.namespace}`),$(),d("done")},E=()=>{u.value=!1,$(),d("done")},T=V=>{console.log("替代代码:",V),h.value=!1},ve=()=>{pe("server.provider","kv-local"),s.value=!1,window.location.reload(),d("done")},ye=()=>{window.open(C("server.authDomain"),"_blank")};return(V,b)=>s.value?(f(),y("div",Il,[r("div",Nl,[b[22]||(b[22]=r("div",{class:"init-header"},[r("div",{class:"title"}," 欢迎使用 Classworks "),r("div",{class:"subtitle"}," 请选择你的使用方式 ")],-1)),r("div",El,[n(_,{class:"main-service-card gradient-new clickable",elevation:"4",onClick:b[0]||(b[0]=U=>l.value=!0)},{default:i(()=>[n(Fe,null,{default:i(()=>[r("div",Al,[r("div",Ul,[n(D,{color:"primary",size:"48"},{default:i(()=>[...b[12]||(b[12]=[c(" mdi-new-box ",-1)])]),_:1})]),b[13]||(b[13]=r("div",{class:"card-content"},[r("div",{class:"text-h6 font-weight-bold"}," 初次使用 "),r("div",{class:"text-body-2 text-medium-emphasis mt-1"}," 了解 Classworks KV 并开始使用 ")],-1))])]),_:1})]),_:1}),n(_,{class:"main-service-card gradient-registered clickable",elevation:"4",onClick:b[1]||(b[1]=U=>o.value=!0)},{default:i(()=>[n(Fe,null,{default:i(()=>[r("div",Fl,[r("div",Ml,[n(D,{color:"success",size:"48"},{default:i(()=>[...b[14]||(b[14]=[c(" mdi-account-check ",-1)])]),_:1})]),b[15]||(b[15]=r("div",{class:"card-content"},[r("div",{class:"text-h6 font-weight-bold"}," 已注册 "),r("div",{class:"text-body-2 text-medium-emphasis mt-1"}," 使用设备 Namespace 登录 ")],-1))])]),_:1})]),_:1}),n(_,{class:"main-service-card clickable",elevation:"4",onClick:ye},{default:i(()=>[n(Fe,null,{default:i(()=>[r("div",Pl,[r("div",zl,[n(D,{color:"info",size:"48"},{default:i(()=>[...b[16]||(b[16]=[c(" mdi-database-cog ",-1)])]),_:1})]),b[17]||(b[17]=r("div",{class:"card-content"},[r("div",{class:"text-h6 font-weight-bold"}," Classworks KV "),r("div",{class:"text-body-2 text-medium-emphasis mt-1"}," 打开云端控制台管理数据 ")],-1))])]),_:1})]),_:1})]),r("div",Ll,[n(k,{"prepend-icon":"mdi-laptop",size:"small",variant:"tonal",onClick:ve},{default:i(()=>[...b[18]||(b[18]=[c(" 使用本地模式 ",-1)])]),_:1}),n(k,{"prepend-icon":"mdi-flash",size:"small",variant:"tonal",onClick:Q},{default:i(()=>[...b[19]||(b[19]=[c(" 授权码式授权(弃用) ",-1)])]),_:1}),n(k,{"prepend-icon":"mdi-key",size:"small",variant:"tonal",onClick:b[2]||(b[2]=U=>u.value=!0)},{default:i(()=>[...b[20]||(b[20]=[c(" 输入 Token ",-1)])]),_:1}),n(k,{"prepend-icon":"mdi-code-tags",size:"small",variant:"tonal",onClick:b[3]||(b[3]=U=>h.value=!0)},{default:i(()=>[...b[21]||(b[21]=[c(" 输入替代代码 ",-1)])]),_:1})]),b[23]||(b[23]=r("div",{class:"footer-hint"}," 完成授权后可使用作业同步、考试看板等在线功能。 ",-1))]),n(ie,{modelValue:l.value,"onUpdate:modelValue":b[5]||(b[5]=U=>l.value=U),"max-width":"600"},{default:i(()=>[n(Vl,{onClose:b[4]||(b[4]=U=>l.value=!1),onSuccess:ae})]),_:1},8,["modelValue"]),n(ie,{modelValue:o.value,"onUpdate:modelValue":b[7]||(b[7]=U=>o.value=U),"max-width":"500"},{default:i(()=>[n(Ma,{ref_key:"deviceAuthDialog",ref:m,preconfig:oe.value,"show-cancel":!0,onCancel:b[6]||(b[6]=U=>o.value=!1),onSuccess:j},null,8,["preconfig"])]),_:1},8,["modelValue"]),n(ie,{modelValue:u.value,"onUpdate:modelValue":b[9]||(b[9]=U=>u.value=U),"max-width":"500"},{default:i(()=>[n(Pa,{"show-cancel":!0,onCancel:b[8]||(b[8]=U=>u.value=!1),onSuccess:E})]),_:1},8,["modelValue"]),n(ie,{modelValue:h.value,"onUpdate:modelValue":b[11]||(b[11]=U=>h.value=U),"max-width":"500"},{default:i(()=>[n(za,{"show-cancel":!0,onCancel:b[10]||(b[10]=U=>h.value=!1),onSubmit:T})]),_:1},8,["modelValue"])])):x("",!0)}},Bt=te(Rl,[["__scopeId","data-v-cbfbc6db"]]);function Je(t,e){let a=null;return function(...d){a&&clearTimeout(a),a=setTimeout(()=>{t.apply(this,d)},e)}}function Bl(t,e){let a=null,d=0;return function(...s){const l=Date.now();l-d<e?(a&&clearTimeout(a),a=setTimeout(()=>{d=l,t.apply(this,s)},e)):(d=l,t.apply(this,s))}}const $l={name:"Classworks 作业板",components:{MessageLog:Vt,RandomPicker:It,FloatingToolbar:Ut,FloatingICP:At,HomeworkEditDialog:Mt,InitServiceChooser:Bt,ChatWidget:qe,StudentNameManager:Rt,UrgentTestDialog:Et,AttendanceSidebar:Pt,AttendanceManagementDialog:Ft,HomeworkGrid:Lt,HomeActions:zt},setup(){const{mobile:t}=Pe();return{mobile:t}},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{dataKey:"",provider:"",useDisplay:Pe,state:{classNumber:"",namespaceInfo:null,deviceName:"",studentList:[],boardData:{homework:{},attendance:{absent:[],late:[],exclude:[]}},dialogVisible:!1,dialogTitle:"",textarea:"",dateString:"",synced:!1,attendDialogVisible:!1,contentStyle:{"font-size":`${C("font.size")}px`},uploadLoading:!1,downloadLoading:!1,snackbar:!1,snackbarText:"",fontSize:C("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},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 this.mobile},titleText(){var o,u;const t=((u=(o=this.state.namespaceInfo)==null?void 0:o.device)==null?void 0:u.name)||this.state.classNumber||"高三八班",e=this.getToday(),a=new Date(e);a.setDate(a.getDate()-1);const d=this.state.dateString,s=this.formatDate(e),l=this.formatDate(a);return d===s?t+" - 今天的作业":d===l?t+" - 昨天的作业":`${t} - ${d}的作业`},sortedItems(){const t=[];this.mobile&&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 of this.state.availableSubjects){const a=e.name,d=this.state.boardData.homework[a];d&&d.content&&t.push({key:a,name:a,type:"homework",content:d.content,order:e.order,rowSpan:Math.ceil((d.content.split(`
|
||
`).filter(s=>s.trim()).length+1)*.8)})}for(const e in this.state.boardData.homework)if(e.startsWith("custom-")){const a=this.state.boardData.homework[e];t.push({key:e,name:a.name,type:"custom",content:a.content,order:9999,rowSpan:Math.ceil((a.content.split(`
|
||
`).filter(d=>d.trim()).length+1)*.8)})}return t.sort((e,a)=>e.order-a.order),t},unusedSubjects(){const t=Object.keys(this.state.boardData.homework).filter(e=>{var a;return(a=this.state.boardData.homework[e].content)==null?void 0:a.trim()});return this.state.availableSubjects.filter(e=>!t.includes(e.name)).sort((e,a)=>e.order-a.order)},emptySubjects(){return this.emptySubjectDisplay!=="button"?[]:this.unusedSubjects},autoSave(){return C("edit.autoSave")},blockNonTodayAutoSave(){return C("edit.blockNonTodayAutoSave")},isToday(){const t=(()=>{const e=new Date,a=e.getFullYear(),d=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${a}${d}${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 C("edit.refreshBeforeEdit")},emptySubjectDisplay(){return C("display.emptySubjectDisplay")},dynamicSort(){return C("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 C("randomPicker.enabled")},showListCardButton(){return C("display.showListCard")},confirmNonTodaySave(){return C("edit.confirmNonTodaySave")},blockPastDataEdit(){return C("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 C("display.showFullscreenButton")},showExamScheduleButton(){return C("display.showExamScheduleButton")},showAntiScreenBurnCard(){return C("display.showAntiScreenBurnCard")},showTestCardButton(){return C("developer.enabled")},shouldShowInit(){var s;const t=C("server.provider"),e=t==="kv-server"||t==="classworkscloud",a=C("server.kvToken"),d=((s=this.$route)==null?void 0:s.path)==="/";return this.settingsTick,d&&e&&(!a||a==="")},shouldShowUrgentTestButton(){const t=C("server.provider");return!(t==="kv-server"||t==="classworkscloud")||!C("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=Je(this.uploadData,2e3),this.debouncedAttendanceSave=Je(async()=>{this.autoSave&&await this.trySave(!0)},2e3),this.throttledReflow=Bl(()=>{this.$refs.gridContainer&&this.optimizeGridLayout(this.sortedItems)},200)},async mounted(){try{this.updateBackendUrl(),await this.initializeData(),await this.loadDeviceInfo(),this.setupAutoRefresh(),this.unwatchSettings=xt(()=>{this.updateSettings()}),this.$nextTick(()=>{const t=this.$refs.studentNameManager;t&&(this.studentNameInfo.name=t.currentStudentName,this.studentNameInfo.isStudent=t.isStudentToken,this.studentNameInfo.openDialog=()=>t.openDialog(),this.$watch(()=>t.currentStudentName,e=>{this.studentNameInfo.name=e}),this.$watch(()=>t.isStudentToken,e=>{this.studentNameInfo.isStudent=e}))}),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),In()}catch(t){console.warn("主页面事件清理失败:",t)}},methods:{async loadDeviceInfo(){var t;try{const e=C("server.provider");if(!(e==="kv-server"||e==="classworkscloud"))return;const d=await Bn.loadNamespaceInfo();if(d&&d.success===!1)return;this.state.namespaceInfo=d||null,this.state.deviceName=((t=d==null?void 0:d.account)==null?void 0:t.deviceName)||""}catch(e){console.warn("加载设备信息失败:",e)}},async loadTokenInfo(){try{const t=C("server.provider");if(!(t==="kv-server"||t==="classworkscloud"))return;const a=C("server.kvToken");if(!a)return;const d=C("server.domain");if(!d)return;const s=await Ce.get(`${d}/kv/_token`,{headers:{Authorization:`Bearer ${a}`}});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,a=t.isReadOnly,d=t.isStudentToken;if(this.tokenDisplayInfo.readonly=a,!d){this.tokenDisplayInfo.show=!1;return}this.tokenDisplayInfo.text=e,this.tokenDisplayInfo.color="primary",this.tokenDisplayInfo.icon="mdi-account",this.tokenDisplayInfo.disabled=a,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),t&&t.isStudentToken?(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),a=e.getFullYear(),d=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${a}${d}${s}`},formatTime(t){return t?new Date(t).toLocaleString():""},getToday(){return new Date},async initializeData(){this.parsePreconfigData();const t=await this.parseUrlConfig(),a=new URLSearchParams(window.location.search).get("date"),d=this.getToday();let s=d;if(a){if(/^\d{8}$/.test(a)){const l=a.substring(0,4),o=a.substring(4,6),u=a.substring(6,8);s=new Date(`${l}-${o}-${u}`)}else s=new Date(a);isNaN(s.getTime())&&(s=d)}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(d),!t){this.provider=C("server.provider");const l=C("server.classNumber");this.state.classNumber=l}await Promise.all([this.downloadData(),this.loadConfig()])},async downloadData(t=!1){var e,a,d;if(!this.loading.download)try{this.loading.download=!0;const s=await fe.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:((a=s.attendance)==null?void 0:a.late)||[],exclude:((d=s.attendance)==null?void 0:d.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 a;if(!this.currentEditSubject)return;const t=this.state.textarea.trim(),e=((a=this.state.boardData.homework[this.currentEditSubject])==null?void 0:a.content)||"";t!==e.trim()&&(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 fe.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 fe.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 fe.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 a=this.$refs.studentNameManager;a!=null&&a.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(a){console.error("刷新数据失败:",a),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(a=>a.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`},pe("font.size",this.state.fontSize)},updateBackendUrl(){const t=C("server.provider"),e=C("server.classNumber");this.provider=t,this.state.classNumber=e},setupAutoRefresh(){const t=C("refresh.auto"),e=C("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=C("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),a=this.formatDate(e);if(a===this.state.dateString)return;this.state.dateString=a,this.state.selectedDate=a,this.state.selectedDateObj=e,this.state.isToday=a===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=C("server.kvToken");if(!t){console.warn("未配置 KV Token,无法加入实时频道");return}Ct(),Xe(t),this.$offConnect=Vn(()=>Xe(t)),this.debouncedRealtimeRefresh||(this.debouncedRealtimeRefresh=Je(async()=>{var m,p,I;const d=JSON.parse(JSON.stringify(this.state.boardData.homework));await this.downloadData();const s=new Date,l=String(s.getHours()).padStart(2,"0"),o=String(s.getMinutes()).padStart(2,"0"),u=String(s.getSeconds()).padStart(2,"0");(m=this.$message)==null||m.info("数据已更新",`已于 ${l}:${o}:${u} 自动刷新`);const h={};for(const L in this.state.boardData.homework){const oe=((p=d[L])==null?void 0:p.content)||"",$=((I=this.state.boardData.homework[L])==null?void 0:I.content)||"";oe!==$&&(h[L]=!0)}for(const L in d)this.state.boardData.homework[L]||(h[L]=!0);this.highlightedCards=h,setTimeout(()=>{this.highlightedCards={}},1e4)},800));const e=d=>{var l;if(!d)return;if(d.key==="notification-list"){this.loadPersistentNotifications();return}const s=`classworks-data-${this.state.dateString}`;d.key===s&&(d.action!=="upsert"&&d.action!=="delete"||(l=this.debouncedRealtimeRefresh)==null||l.call(this,d.key))},a=d=>{let s=d;d.content&&d.timestamp&&(s={uuid:d.senderId||"realtime",key:d.content.key,action:d.content.action,created:d.content.created,updatedAt:d.content.updatedAt||d.timestamp,deletedAt:d.content.deletedAt,batch:d.content.batch}),e(s)};this.$offKvChanged=be("kv-key-changed",a),this.deviceEventHandler=Dt({onKvChanged:e,enableLegacySupport:!0}),this.$offDeviceEvent=be("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="",a="success"){this.$message[a](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 a=atob(e),d=Uint8Array.from(a,m=>m.charCodeAt(0)),s=new TextDecoder().decode(d),l=JSON.parse(s);console.log("从URL读取配置:",l);const o=[],u={},h={};return this.processSpecialSettings(l,o,u),this.processStandardSettings(l,o,u,h),Object.keys(u).length===0?(console.log("URL配置与当前配置相同,无需应用"),!1):new Promise(m=>{this.urlConfigDialog={show:!0,config:l,changes:o,validSettings:u,icons:h,confirmHandler:()=>{this.urlConfigDialog.show=!1,this.applyUrlConfig(u),m(!0)},cancelHandler:()=>{this.urlConfigDialog.show=!1,m(!1)}}})}catch(a){return console.error("解析URL配置错误:",a),this.$message.error("URL配置错误","无法解析配置数据"),!1}}catch(t){return console.error("处理URL配置错误:",t),!1}},processSpecialSettings(t,e,a){var d,s;if(t.classNumber!==void 0){const l=C("server.classNumber");t.classNumber!==l&&(e.push({key:"server.classNumber",name:"班级",oldValue:l,newValue:t.classNumber,description:((d=Ue["server.classNumber"])==null?void 0:d.description)||"班级编号",icon:((s=Ue["server.classNumber"])==null?void 0:s.icon)||"mdi-account-group"}),a["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"}),a.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"}),a.subjects=t.subjects)},processStandardSettings(t,e,a,d){Object.entries(t).forEach(([s,l])=>{if(["classNumber","date","subjects"].includes(s))return;let o=s,u=Ue[s];if(!u&&!s.includes(".")){const h=["server.","display.","theme.","edit.","refresh.","font.","randomPicker."];for(const m of h){const p=`${m}${s}`;if(Ue[p]){o=p,u=Ue[p];break}}}if(u){let h=this.convertValueToCorrectType(l,u.type);if(u.validate&&!u.validate(h)){console.warn(`URL配置项 ${o} 的值无效: ${l}`);return}const m=C(o);h!==m&&(e.push({key:o,name:this.getSettingDisplayName(o),oldValue:this.formatSettingValue(m),newValue:this.formatSettingValue(h),description:u.description||o,icon:u.icon||"mdi-cog"}),a[o]=h,d[o]=u.icon||"mdi-cog")}else e.push({key:s,name:this.getSettingDisplayName(s),oldValue:"未知",newValue:this.formatSettingValue(l),description:"自定义配置项",icon:"mdi-cog-outline"}),a[s]=l,d[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("."),a=e[e.length-1];return{provider:"数据提供方",domain:"服务器域名",classNumber:"班级编号",emptySubjectDisplay:"空科目显示方式",dynamicSort:"动态排序",showRandomButton:"随机按钮",showFullscreenButton:"全屏按钮",cardHoverEffect:"卡片悬浮效果",enhancedTouchMode:"增强触摸模式",showAntiScreenBurnCard:"防烧屏卡片",mode:"主题模式",size:"字体大小",autoSave:"自动保存",blockNonTodayAutoSave:"禁止自动保存非当日",refreshBeforeEdit:"编辑前刷新",confirmNonTodaySave:"非当日保存确认",auto:"自动刷新",interval:"刷新间隔"}[a]||a},safeBase64Decode(t){try{return Kn.decode(t)}catch(e){throw console.error("Base64解码错误:",e),new Error("无法解码配置数据")}},applyUrlConfig(t){for(const[e,a]of Object.entries(t)){if(e==="date"){this.handleDateSelect(a);continue}if(e==="subjects"){this.state.availableSubjects=a;continue}pe(e,a),e==="server.classNumber"&&(this.state.classNumber=a)}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)),a=this.getToday(),d=this.formatDate(a);this.state.dateString=d,await this.downloadData();const s={};for(const o in e)e[o]&&e[o].content&&(e[o].type==="custom"?s[o]=JSON.parse(JSON.stringify(e[o])):s[o]={content:e[o].content});this.state.boardData.homework=s,this.state.synced=!1,await this.uploadData(),this.state.selectedDate=d,this.state.selectedDateObj=a,this.state.isToday=!0;const l=new URL(window.location);l.searchParams.delete("date"),window.history.pushState({},"",l),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"),a=t.get("authCode")||t.get("auth_code"),d=t.get("autoExecute")||t.get("auto_execute");e&&(this.preconfigData.namespace=e,this.preconfigData.authCode=a,this.preconfigData.autoOpen=!0,this.preconfigData.autoExecute=this.parseBoolean(d),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 a=!1;t.forEach(d=>{e.searchParams.has(d)&&(e.searchParams.delete(d),a=!0)}),a&&window.history.replaceState({},document.title,e.toString())}catch(e){console.error("清理URL参数失败:",e)}},async loadPersistentNotifications(){try{const t=await fe.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(a=>a.id!==t);const e=this.persistentNotifications.length>0?this.persistentNotifications:{};await fe.saveData("notification-list",e),this.notificationDetailDialog=!1}}},Ol={key:2,class:"d-flex"},jl={class:"text-h6 text-truncate font-weight-bold"},Kl={class:"text-h4 font-weight-medium mb-4",style:{"line-height":"1.5"}},Hl={class:"text-subtitle-1 text-grey"},ql={class:"text-subtitle-1"},Ql={class:"text-grey-darken-1"},Wl={class:"text-primary font-weight-medium"};function Gl(t,e,a,d,s,l){const o=Bt,u=Rt,h=Lt,m=zt,p=Pt,I=Mt,L=Ft,oe=Vt,$=Ut,Q=At,ae=qe,j=Et,E=It;return f(),y(N,null,[n(On,{class:"no-select"},{append:i(()=>[s.tokenDisplayInfo.readonly?(f(),w(B,{key:0,class:"mx-2",color:"warning","prepend-icon":"mdi-lock-alert",variant:"tonal"},{default:i(()=>[...e[23]||(e[23]=[c(" 只读 ",-1)])]),_:1})):x("",!0),s.tokenDisplayInfo.show?(f(),w(B,{key:1,style:Ie({cursor:s.tokenDisplayInfo.disabled?"default":"pointer"}),class:"mx-2",color:"primary","prepend-icon":"mdi-account",variant:"tonal",onClick:l.handleTokenChipClick},{default:i(()=>[c(g(s.tokenDisplayInfo.text),1)]),_:1},8,["style","onClick"])):x("",!0),l.shouldShowUrgentTestButton?(f(),w(k,{key:2,"prepend-icon":"mdi-chat",onClick:e[0]||(e[0]=T=>s.urgentTestDialog=!0),variant:"tonal"},{default:i(()=>[...e[24]||(e[24]=[c("发送通知",-1)])]),_:1})):x("",!0),n(k,{icon:"mdi-chat",variant:"text",onClick:e[1]||(e[1]=T=>s.isChatOpen=!0)}),n(k,{badge:l.unreadCount||void 0,"badge-color":l.unreadCount?"error":void 0,icon:"mdi-bell",variant:"text",onClick:e[2]||(e[2]=T=>t.$refs.messageLog.drawer=!0)},null,8,["badge","badge-color"]),n(k,{icon:"mdi-cog",variant:"text",onClick:e[3]||(e[3]=T=>t.$router.push("/settings"))})]),default:i(()=>[n($n,null,{default:i(()=>[c(g(l.titleText),1)]),_:1}),n(K)]),_:1}),l.shouldShowInit?(f(),w(o,{key:0,preconfig:s.preconfigData,onDone:e[4]||(e[4]=T=>s.settingsTick++)},null,8,["preconfig"])):x("",!0),l.shouldShowInit?x("",!0):(f(),w(u,{key:1,ref:"studentNameManager",onTokenInfoUpdated:l.updateTokenDisplayInfo},null,8,["onTokenInfoUpdated"])),l.shouldShowInit?x("",!0):(f(),y("div",Ol,[n(_t,{class:"main-window flex-grow-1 no-select bloom-container",fluid:""},{default:i(()=>[s.persistentNotifications.length>0?(f(),w(ge,{key:0,class:"mb-4"},{default:i(()=>[n(se,{cols:"12"},{default:i(()=>[(f(!0),y(N,null,M(s.persistentNotifications,T=>(f(),w(_,{key:T.id,color:T.isUrgent?"error":"primary",class:"mb-2 cursor-pointer",variant:"tonal",onClick:ve=>l.showNotificationDetail(T)},{default:i(()=>[n(A,{class:"d-flex align-center py-3"},{default:i(()=>[r("span",jl,g(T.message),1),n(K),n(k,{icon:"mdi-chevron-right",variant:"text"})]),_:2},1024)]),_:2},1032,["color","onClick"]))),128))]),_:1})]),_:1})):x("",!0),n(ie,{modelValue:s.notificationDetailDialog,"onUpdate:modelValue":e[8]||(e[8]=T=>s.notificationDetailDialog=T),"max-width":"700",scrollable:""},{default:i(()=>[s.currentNotification?(f(),w(_,{key:0,class:"rounded-xl"},{default:i(()=>[n(Y,{class:"d-flex align-center pa-4 text-h5"},{default:i(()=>[r("span",{class:we([s.currentNotification.isUrgent?"text-error":"","font-weight-bold"])},g(s.currentNotification.isUrgent?"强调通知":"通知详情"),3),n(K),n(k,{icon:"mdi-close",variant:"text",onClick:e[5]||(e[5]=T=>s.notificationDetailDialog=!1)})]),_:1}),n(xe),n(A,{class:"pa-6"},{default:i(()=>[r("div",Kl,g(s.currentNotification.message),1),r("div",Hl," 发布时间:"+g(l.formatTime(s.currentNotification.timestamp)),1)]),_:1}),n(xe),n(de,{class:"pa-4"},{default:i(()=>[n(k,{color:"error","prepend-icon":"mdi-delete",size:"x-large",variant:"tonal",class:"px-6",onClick:e[6]||(e[6]=T=>l.removePersistentNotification(s.currentNotification.id))},{default:i(()=>[...e[25]||(e[25]=[c(" 删除通知 ",-1)])]),_:1}),n(K),n(k,{color:"primary",size:"x-large",variant:"elevated",class:"px-8",onClick:e[7]||(e[7]=T=>s.notificationDetailDialog=!1)},{default:i(()=>[...e[26]||(e[26]=[c(" 关闭 ",-1)])]),_:1})]),_:1})]),_:1})):x("",!0)]),_:1},8,["modelValue"]),n(h,{"sorted-items":l.sortedItems,"unused-subjects":l.unusedSubjects,"empty-subject-display":l.emptySubjectDisplay,"is-editing-disabled":l.isEditingDisabled,"content-style":s.state.contentStyle,"highlighted-cards":s.highlightedCards,onOpenDialog:l.openDialog,onOpenAttendance:l.setAttendanceArea,onDisabledClick:l.handleDisabledClick},null,8,["sorted-items","unused-subjects","empty-subject-display","is-editing-disabled","content-style","highlighted-cards","onOpenDialog","onOpenAttendance","onDisabledClick"]),n(m,{synced:s.state.synced,"loading-upload":s.loading.upload,"show-random-picker-button":l.showRandomPickerButton,"show-exam-schedule-button":l.showExamScheduleButton,"show-list-card-button":l.showListCardButton,"show-fullscreen-button":l.showFullscreenButton,"is-fullscreen":s.state.isFullscreen,"show-anti-screen-burn-card":l.showAntiScreenBurnCard,"show-test-card-button":l.showTestCardButton,onUpload:l.manualUpload,onShowSyncMessage:l.showSyncMessage,onOpenRandomPicker:l.openRandomPicker,onToggleFullscreen:l.toggleFullscreen,onAddTestCard:l.addTestCard},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"])]),_:1}),d.mobile?x("",!0):(f(),w(p,{key:0,"student-list":s.state.studentList,attendance:s.state.boardData.attendance,"is-editing-disabled":l.isEditingDisabled,onClick:l.setAttendanceArea,onDisabledClick:l.handleDisabledClick},null,8,["student-list","attendance","is-editing-disabled","onClick","onDisabledClick"]))])),n(I,{modelValue:s.state.dialogVisible,"onUpdate:modelValue":e[9]||(e[9]=T=>s.state.dialogVisible=T),"auto-save":l.autoSave,"initial-content":s.state.textarea,title:s.state.dialogTitle,"is-editing-past-data":l.isEditingPastData,"current-date-string":s.state.dateString,onSave:l.handleHomeworkSave},null,8,["modelValue","auto-save","initial-content","title","is-editing-past-data","current-date-string","onSave"]),n(wn,{modelValue:s.state.snackbar,"onUpdate:modelValue":e[10]||(e[10]=T=>s.state.snackbar=T),timeout:2e3},{default:i(()=>[c(g(s.state.snackbarText),1)]),_:1},8,["modelValue"]),n(L,{modelValue:s.state.attendanceDialog,"onUpdate:modelValue":e[11]||(e[11]=T=>s.state.attendanceDialog=T),"student-list":s.state.studentList,attendance:s.state.boardData.attendance,"date-string":s.state.dateString,onSave:l.saveAttendance,onChange:l.handleAttendanceChange},null,8,["modelValue","student-list","attendance","date-string","onSave","onChange"]),n(oe,{ref:"messageLog"},null,512),n($,{"is-today":l.isToday,loading:s.loading.download,"copy-to-today-loading":s.loading.copyToToday,"selected-date":s.state.selectedDateObj,"unread-count":l.unreadCount,onRefresh:l.downloadData,onZoom:l.zoom,onOpenMessages:e[12]||(e[12]=T=>t.$refs.messageLog.drawer=!0),onOpenSettings:e[13]||(e[13]=T=>t.$router.push("/settings")),onDateSelect:l.handleDateSelect,onPrevDay:e[14]||(e[14]=T=>l.navigateDay(-1)),onNextDay:e[15]||(e[15]=T=>l.navigateDay(1)),onCopyToToday:l.copyHomeworkToToday},null,8,["is-today","loading","copy-to-today-loading","selected-date","unread-count","onRefresh","onZoom","onDateSelect","onCopyToToday"]),n(Q),n(ae,{modelValue:s.isChatOpen,"onUpdate:modelValue":e[16]||(e[16]=T=>s.isChatOpen=T),"show-button":!1},null,8,["modelValue"]),n(j,{modelValue:s.urgentTestDialog,"onUpdate:modelValue":e[17]||(e[17]=T=>s.urgentTestDialog=T)},null,8,["modelValue"]),n(ie,{modelValue:s.confirmDialog.show,"onUpdate:modelValue":e[18]||(e[18]=T=>s.confirmDialog.show=T),"max-width":"400"},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,{class:"text-h6"},{default:i(()=>[...e[27]||(e[27]=[c(" 确认保存",-1)])]),_:1}),n(A,null,{default:i(()=>[c(" 您正在修改 "+g(s.state.dateString)+" 的数据,确定要保存吗? ",1)]),_:1}),n(de,null,{default:i(()=>[n(K),n(k,{color:"grey",variant:"text",onClick:s.confirmDialog.reject},{default:i(()=>[...e[28]||(e[28]=[c(" 取消 ",-1)])]),_:1},8,["onClick"]),n(k,{color:"primary",onClick:s.confirmDialog.resolve},{default:i(()=>[...e[29]||(e[29]=[c(" 确认保存",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),n(E,{ref:"randomPicker",attendance:s.state.boardData.attendance,"student-list":s.state.studentList},null,8,["attendance","student-list"]),n(ie,{modelValue:s.urlConfigDialog.show,"onUpdate:modelValue":e[19]||(e[19]=T=>s.urlConfigDialog.show=T),"max-width":"500"},{default:i(()=>[n(_,null,{default:i(()=>[n(Y,{class:"text-h6"},{default:i(()=>[...e[30]||(e[30]=[c(" 确认应用URL配置",-1)])]),_:1}),n(A,null,{default:i(()=>[e[31]||(e[31]=r("p",null,"以下配置将应用于当前班级:",-1)),n(Ke,{density:"compact"},{default:i(()=>[(f(!0),y(N,null,M(s.urlConfigDialog.changes,T=>(f(),w(Me,{key:T.key},{prepend:i(()=>[n(D,{icon:T.icon,class:"mr-2",size:"small"},null,8,["icon"])]),default:i(()=>[n(xn,{class:"d-flex align-center"},{default:i(()=>[r("span",ql,g(T.name),1),n(Ze,{activator:"parent",location:"top"},{default:i(()=>[c(g(T.description||T.key),1)]),_:2},1024)]),_:2},1024),n(Sn,null,{default:i(()=>[r("span",Ql,g(T.oldValue),1),n(D,{class:"mx-1",icon:"mdi-arrow-right",size:"small"}),r("span",Wl,g(T.newValue),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1}),n(de,null,{default:i(()=>[n(K),n(k,{color:"grey",variant:"text",onClick:s.urlConfigDialog.cancelHandler},{default:i(()=>[...e[32]||(e[32]=[c(" 取消 ",-1)])]),_:1},8,["onClick"]),n(k,{color:"primary",onClick:s.urlConfigDialog.confirmHandler},{default:i(()=>[...e[33]||(e[33]=[c(" 确认应用 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),n(ie,{modelValue:s.notificationDetailDialog,"onUpdate:modelValue":e[22]||(e[22]=T=>s.notificationDetailDialog=T),"max-width":"600"},{default:i(()=>[s.currentNotification?(f(),w(_,{key:0},{default:i(()=>[n(Y,{class:we(["headline",s.currentNotification.isUrgent?"text-error":"text-primary"])},{default:i(()=>[c(g(s.currentNotification.isUrgent?"强调通知":"通知详情"),1)]),_:1},8,["class"]),n(A,{class:"text-h5 py-4"},{default:i(()=>[c(g(s.currentNotification.message),1)]),_:1}),n(de,null,{default:i(()=>[n(k,{color:"error",variant:"text",onClick:e[20]||(e[20]=T=>l.removePersistentNotification(s.currentNotification.id))},{default:i(()=>[...e[34]||(e[34]=[c("删除",-1)])]),_:1}),n(K),n(k,{color:"primary",onClick:e[21]||(e[21]=T=>s.notificationDetailDialog=!1)},{default:i(()=>[...e[35]||(e[35]=[c("关闭",-1)])]),_:1})]),_:1})]),_:1})):x("",!0)]),_:1},8,["modelValue"]),e[36]||(e[36]=r("br",null,null,-1)),e[37]||(e[37]=r("br",null,null,-1)),e[38]||(e[38]=r("br",null,null,-1))],64)}const wo=te($l,[["render",Gl]]);export{wo as default};
|