1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2025-12-08 13:49:37 +00:00
Classworks/assets/index-DDqm_lzS.js

14 lines
144 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

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

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