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