mirror of
https://github.com/ZeroCatDev/Classworks.git
synced 2025-07-02 00:59:23 +00:00
4 lines
66 KiB
JavaScript
4 lines
66 KiB
JavaScript
import{_ as Be,O as D,P as le,A as P,B as v,C as o,k as n,Q as z,R as W,H as m,V as Y,S as K,T as y,U as B,E as k,D as w,W as F,X as x,Y as $e,F as L,Z as I,$ as ke,G as O,a0 as et,a1 as se,g as G,p as H,f as A,j as J,l as xe,a2 as de,u as Se,a3 as je,a4 as De,a5 as tt,a6 as re,a7 as X,a8 as ue,r as ye,s as ce,t as pe,a9 as Ie,aa as ie,ab as Re,w as Ue,ac as at,ad as nt,ae as st,af as lt,a as it,b as rt,I as ot,c as dt,ag as ut,ah as ct,d as mt,m as ht,n as ft,o as vt,ai as gt,aj as kt,v as yt,L as pt,x as bt,y as xt,ak as St,al as Dt,am as wt,M as Ct,an as _e,ao as Ve,ap as Pe,aq as he,ar as _t,as as Vt,at as Pt,au as At,av as fe,aw as Mt,ax as Lt,ay as Ft,az as ne,aA as ve,aB as Nt,z as Ae}from"./index-ByVcHmHP.js";import{V as be}from"./VTextField-xmohowzo.js";import{V as Ye}from"./VTooltip-1sQCtODC.js";import{V as q}from"./VChip-eMRrC11H.js";import{_ as He,a as We,p as Me}from"./index-DF4wJk7c.js";import{V as Tt,a as Et}from"./VAppBarTitle-B8BT9fYp.js";import{V as zt}from"./VMenu-RF_tVNBL.js";import{V as Ot}from"./VContainer-DZXmFKHE.js";import{V as oe,a as ge}from"./VRow-Dz4XHvZD.js";import{V as Bt}from"./VTextarea-SupiQVXT.js";const jt={name:"RandomPicker",props:{studentList:{type:Array,required:!0},attendance:{type:Object,required:!0,default:()=>({absent:[],late:[],exclude:[]})}},data(){return{dialog:!1,count:D("randomPicker.defaultCount"),isPickingStarted:!1,isAnimating:!1,pickedStudents:[],animationStudents:[],highlightedIndices:[],animationTimer:null,getSetting:D,tempFilters:{excludeAbsent:D("randomPicker.excludeAbsent"),excludeLate:D("randomPicker.excludeLate"),excludeExcluded:D("randomPicker.excludeExcluded")},pickerMode:D("randomPicker.mode"),minNumber:D("randomPicker.minNumber"),maxNumber:D("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=D("randomPicker.defaultCount"),this.isPickingStarted=!1,this.isAnimating=!1,this.pickedStudents=[],this.tempFilters={excludeAbsent:D("randomPicker.excludeAbsent"),excludeLate:D("randomPicker.excludeLate"),excludeExcluded:D("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){le("randomPicker.mode",t)}},minNumber:{handler(t){t>this.maxNumber&&(this.minNumber=this.maxNumber),t<1&&(this.minNumber=1),le("randomPicker.minNumber",this.minNumber)}},maxNumber:{handler(t){t<this.minNumber&&(this.maxNumber=this.minNumber),t>100&&(this.maxNumber=100),le("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,D("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 s=50,r=()=>{this.highlightedIndices=[];const a=[];for(let d=0;d<this.count;d++){let u;do u=Math.floor(Math.random()*this.animationStudents.length);while(a.includes(u));a.push(u)}this.highlightedIndices=a,e++;const l=s+e*20;e<5?this.animationTimer=setTimeout(r,l):setTimeout(()=>{this.finishPicking()},500)};r()},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),s=this.remainingStudents[e];this.pickedStudents[t]=s;const r=document.querySelectorAll(".result-card");r[t]&&(r[t].classList.add("refresh-animation"),setTimeout(()=>{r[t].classList.remove("refresh-animation")},500))}}},It={class:"d-flex justify-center align-center counter-container"},Rt={class:"count-display mx-8"},Ut={class:"text-h2 font-weight-bold"},Yt={class:"mode-switch-container mt-6"},Ht={key:0,class:"number-range-container mt-4"},Wt={class:"d-flex justify-center align-center gap-4"},qt={class:"mt-4"},Gt={key:1,class:"mt-4 text-error"},Jt={class:"mt-4 text-caption"},Kt={class:"pa-2"},Xt={key:0},Qt={key:1},Zt={key:2},$t={key:1,class:"d-flex flex-wrap justify-center gap-2 mt-4"},ea={key:0,class:"animation-container"},ta={class:"animation-wrapper"},aa={key:1,class:"result-container"},na={class:"mt-8 d-flex justify-center"};function sa(t,e,s,r,a,l){return v(),P(se,{modelValue:a.dialog,"onUpdate:modelValue":e[8]||(e[8]=d=>a.dialog=d),"max-width":"600","fullscreen-breakpoint":"sm",persistent:""},{default:o(()=>[n(z,{class:"random-picker-card",rounded:"xl",border:""},{default:o(()=>[n(W,{class:"text-h5 d-flex align-center"},{default:o(()=>[n(Y,{icon:"mdi-account-question",class:"mr-2"}),e[9]||(e[9]=m(" 随机点名 ")),n(K),n(y,{icon:"mdi-close",variant:"text",onClick:e[0]||(e[0]=d=>a.dialog=!1)})]),_:1,__:[9]}),a.isPickingStarted?(v(),P(B,{key:1,class:"text-center py-6"},{default:o(()=>[a.isAnimating?(v(),w("div",ea,[k("div",ta,[n(ke,{name:"shuffle",tag:"div",class:"shuffle-container"},{default:o(()=>[(v(!0),w(L,null,O(a.animationStudents,(d,u)=>(v(),w("div",{key:d.id,class:et(["student-item",{highlighted:a.highlightedIndices.includes(u)}])},x(d.name),3))),128))]),_:1})])])):(v(),w("div",aa,[e[19]||(e[19]=k("div",{class:"text-h6 mb-4"},"抽取结果",-1)),(v(!0),w(L,null,O(a.pickedStudents,(d,u)=>(v(),P(z,{key:u,variant:"outlined",color:"primary",class:"mb-2 result-card"},{default:o(()=>[n(B,{class:"text-h4 text-center py-4 d-flex align-center justify-center"},{default:o(()=>[m(x(d)+" ",1),n(y,{icon:"mdi-refresh",variant:"text",size:"small",class:"ml-2 refresh-btn",onClick:c=>l.refreshSingleStudent(u),disabled:l.remainingStudents.length===0,title:l.remainingStudents.length===0?"没有更多可用学生":"重新抽取此学生"},null,8,["onClick","disabled","title"])]),_:2},1024)]),_:2},1024))),128)),k("div",na,[n(y,{color:"primary","prepend-icon":"mdi-refresh",onClick:l.resetPicker,size:"large",class:"mx-2"},{default:o(()=>e[17]||(e[17]=[m(" 重新抽取 ")])),_:1,__:[17]},8,["onClick"]),n(y,{color:"grey",variant:"outlined",onClick:e[7]||(e[7]=d=>a.dialog=!1),size:"large",class:"mx-2"},{default:o(()=>e[18]||(e[18]=[m(" 关闭 ")])),_:1,__:[18]})])]))]),_:1})):(v(),P(B,{key:0,class:"text-center py-6"},{default:o(()=>[e[16]||(e[16]=k("div",{class:"text-h6 mb-4"},"请选择抽取人数",-1)),k("div",It,[n(y,{size:"x-large",icon:"mdi-minus",variant:"tonal",color:"primary",disabled:a.count<=1,onClick:l.decrementCount,class:"counter-btn"},null,8,["disabled","onClick"]),k("div",Rt,[k("span",Ut,x(a.count),1),e[10]||(e[10]=k("span",{class:"text-subtitle-1 ml-2"},"人",-1))]),n(y,{size:"x-large",icon:"mdi-plus",variant:"tonal",color:"primary",disabled:a.count>=l.maxAllowedCount,onClick:l.incrementCount,class:"counter-btn"},null,8,["disabled","onClick"])]),k("div",Yt,[n($e,{modelValue:a.pickerMode,"onUpdate:modelValue":e[1]||(e[1]=d=>a.pickerMode=d),color:"primary",rounded:"pill",mandatory:"",class:"mode-toggle"},{default:o(()=>[n(y,{value:"name","prepend-icon":"mdi-account"},{default:o(()=>e[11]||(e[11]=[m("姓名模式")])),_:1,__:[11]}),n(y,{value:"number","prepend-icon":"mdi-numeric"},{default:o(()=>e[12]||(e[12]=[m("学号模式")])),_:1,__:[12]})]),_:1},8,["modelValue"])]),a.pickerMode==="number"?(v(),w("div",Ht,[e[14]||(e[14]=k("div",{class:"text-subtitle-1 mb-2"},"学号范围设置",-1)),k("div",Wt,[n(be,{modelValue:a.minNumber,"onUpdate:modelValue":e[2]||(e[2]=d=>a.minNumber=d),modelModifiers:{number:!0},label:"最小值",type:"number",min:"1",max:"100","hide-details":"",class:"number-input",density:"compact"},null,8,["modelValue"]),e[13]||(e[13]=k("span",{class:"mx-2"},"至",-1)),n(be,{modelValue:a.maxNumber,"onUpdate:modelValue":e[3]||(e[3]=d=>a.maxNumber=d),modelModifiers:{number:!0},label:"最大值",type:"number",min:"1",max:"100","hide-details":"",class:"number-input",density:"compact"},null,8,["modelValue"])])])):F("",!0),k("div",qt,[n(y,{size:"x-large",color:"primary","prepend-icon":"mdi-dice-multiple",onClick:l.startPicking,disabled:l.filteredStudents.length===0,class:"start-btn"},{default:o(()=>e[15]||(e[15]=[m(" 开始抽取 ")])),_:1,__:[15]},8,["onClick","disabled"])]),l.filteredStudents.length===0?(v(),w("div",Gt,[a.pickerMode==="name"?(v(),w(L,{key:0},[m(" 没有可抽取的学生,请调整过滤选项 ")],64)):(v(),w(L,{key:1},[m(" 请设置有效的学号范围 ")],64))])):F("",!0),k("div",Jt,[m(" 当前可抽取学生: "+x(l.filteredStudents.length)+"人 ",1),a.pickerMode==="name"?(v(),P(Ye,{key:0,location:"bottom"},{activator:o(({props:d})=>[n(Y,I(d,{icon:"mdi-information-outline",size:"small",class:"ml-1"}),null,16)]),default:o(()=>[k("div",Kt,[a.tempFilters.excludeAbsent?(v(),w("div",Xt," • 已排除请假学生 ("+x(l.absentCount)+"人) ",1)):F("",!0),a.tempFilters.excludeLate?(v(),w("div",Qt," • 已排除迟到学生 ("+x(l.lateCount)+"人) ",1)):F("",!0),a.tempFilters.excludeExcluded?(v(),w("div",Zt," • 已排除不参与学生 ("+x(l.excludedCount)+"人) ",1)):F("",!0)])]),_:1})):F("",!0),a.pickerMode==="name"?(v(),w("div",$t,[n(q,{color:a.tempFilters.excludeLate?"warning":"default",variant:a.tempFilters.excludeLate?"elevated":"text",onClick:e[4]||(e[4]=d=>a.tempFilters.excludeLate=!a.tempFilters.excludeLate),"prepend-icon":"mdi-clock-alert",class:"filter-chip"},{default:o(()=>[m(x(a.tempFilters.excludeLate?"排除":"包含")+"迟到学生 ",1)]),_:1},8,["color","variant"]),n(q,{color:a.tempFilters.excludeAbsent?"error":"default",variant:a.tempFilters.excludeAbsent?"elevated":"text",onClick:e[5]||(e[5]=d=>a.tempFilters.excludeAbsent=!a.tempFilters.excludeAbsent),"prepend-icon":"mdi-account-off",class:"filter-chip"},{default:o(()=>[m(x(a.tempFilters.excludeAbsent?"排除":"包含")+"请假学生 ",1)]),_:1},8,["color","variant"]),n(q,{color:a.tempFilters.excludeExcluded?"grey":"default",variant:a.tempFilters.excludeExcluded?"elevated":"text",onClick:e[6]||(e[6]=d=>a.tempFilters.excludeExcluded=!a.tempFilters.excludeExcluded),"prepend-icon":"mdi-account-cancel",class:"filter-chip"},{default:o(()=>[m(x(a.tempFilters.excludeExcluded?"排除":"包含")+"不参与学生 ",1)]),_:1},8,["color","variant"])])):F("",!0)])]),_:1,__:[16]}))]),_:1})]),_:1},8,["modelValue"])}const qe=Be(jt,[["render",sa],["__scopeId","data-v-fd7ac224"]]);function la(t,e){let s=null;return function(...r){s&&clearTimeout(s),s=setTimeout(()=>{t.apply(this,r)},e)}}function ia(t,e){let s=null,r=0;return function(...a){const l=Date.now();l-r<e?(s&&clearTimeout(s),s=setTimeout(()=>{r=l,t.apply(this,a)},e)):(r=l,t.apply(this,a))}}const Ge=H({active:{type:[String,Array],default:void 0},controlHeight:[Number,String],disabled:{type:[Boolean,String,Array],default:null},nextIcon:{type:de,default:"$next"},prevIcon:{type:de,default:"$prev"},modeIcon:{type:de,default:"$subgroup"},text:String,viewMode:{type:String,default:"month"}},"VDatePickerControls"),Le=G()({name:"VDatePickerControls",props:Ge(),emits:{"click:year":()=>!0,"click:month":()=>!0,"click:prev":()=>!0,"click:next":()=>!0,"click:text":()=>!0},setup(t,e){let{emit:s}=e;const r=A(()=>Array.isArray(t.disabled)?t.disabled.includes("text"):!!t.disabled),a=A(()=>Array.isArray(t.disabled)?t.disabled.includes("mode"):!!t.disabled),l=A(()=>Array.isArray(t.disabled)?t.disabled.includes("prev"):!!t.disabled),d=A(()=>Array.isArray(t.disabled)?t.disabled.includes("next"):!!t.disabled);function u(){s("click:prev")}function c(){s("click:next")}function h(){s("click:year")}function i(){s("click:month")}return J(()=>n("div",{class:["v-date-picker-controls"],style:{"--v-date-picker-controls-height":xe(t.controlHeight)}},[n(y,{class:"v-date-picker-controls__month-btn","data-testid":"month-btn",disabled:r.value,text:t.text,variant:"text",rounded:!0,onClick:i},null),n(y,{class:"v-date-picker-controls__mode-btn","data-testid":"year-btn",disabled:a.value,density:"comfortable",icon:t.modeIcon,variant:"text",onClick:h},null),n(K,null,null),n("div",{class:"v-date-picker-controls__month"},[n(y,{"data-testid":"prev-month",disabled:l.value,density:"comfortable",icon:t.prevIcon,variant:"text",onClick:u},null),n(y,{"data-testid":"next-month",disabled:d.value,icon:t.nextIcon,density:"comfortable",variant:"text",onClick:c},null)])])),{}}}),ra=H({appendIcon:de,color:String,header:String,transition:String,onClick:tt()},"VDatePickerHeader"),Fe=G()({name:"VDatePickerHeader",props:ra(),emits:{click:()=>!0,"click:append":()=>!0},setup(t,e){let{emit:s,slots:r}=e;const{backgroundColorClasses:a,backgroundColorStyles:l}=Se(()=>t.color);function d(){s("click")}function u(){s("click:append")}return J(()=>{const c=!!(r.default||t.header),h=!!(r.append||t.appendIcon);return n("div",{class:["v-date-picker-header",{"v-date-picker-header--clickable":!!t.onClick},a.value],style:l.value,onClick:d},[r.prepend&&n("div",{key:"prepend",class:"v-date-picker-header__prepend"},[r.prepend()]),c&&n(je,{key:"content",name:t.transition},{default:()=>{var i;return[n("div",{key:t.header,class:"v-date-picker-header__content"},[((i=r.default)==null?void 0:i.call(r))??t.header])]}}),h&&n("div",{class:"v-date-picker-header__append"},[r.append?n(De,{key:"append-defaults",disabled:!t.appendIcon,defaults:{VBtn:{icon:t.appendIcon,variant:"text"}}},{default:()=>{var i;return[(i=r.append)==null?void 0:i.call(r)]}}):n(y,{key:"append-btn",icon:t.appendIcon,variant:"text",onClick:u},null)])])}),{}}}),oa=H({allowedDates:[Array,Function],disabled:{type:Boolean,default:null},displayValue:null,modelValue:Array,month:[Number,String],max:null,min:null,showAdjacentMonths:Boolean,year:[Number,String],weekdays:{type:Array,default:()=>[0,1,2,3,4,5,6]},weeksInMonth:{type:String,default:"dynamic"},firstDayOfWeek:{type:[Number,String],default:void 0}},"calendar");function da(t){const e=re(),s=X(t,"modelValue",[],f=>ue(f).map(p=>e.date(p))),r=A(()=>t.displayValue?e.date(t.displayValue):s.value.length>0?e.date(s.value[0]):t.min?e.date(t.min):Array.isArray(t.allowedDates)?e.date(t.allowedDates[0]):e.date()),a=X(t,"year",void 0,f=>{const p=f!=null?Number(f):e.getYear(r.value);return e.startOfYear(e.setYear(e.date(),p))},f=>e.getYear(f)),l=X(t,"month",void 0,f=>{const p=f!=null?Number(f):e.getMonth(r.value),C=e.setYear(e.startOfMonth(e.date()),e.getYear(a.value));return e.setMonth(C,p)},f=>e.getMonth(f)),d=A(()=>{const f=e.toJsDate(e.startOfWeek(e.date(),t.firstDayOfWeek)).getDay();return[0,1,2,3,4,5,6].map(p=>(p+f)%7)}),u=A(()=>{const f=e.getWeekArray(l.value,t.firstDayOfWeek),p=f.flat(),C=6*7;if(t.weeksInMonth==="static"&&p.length<C){const T=p[p.length-1];let _=[];for(let b=1;b<=C-p.length;b++)_.push(e.addDays(T,b)),b%7===0&&(f.push(_),_=[])}return f});function c(f,p){return f.filter(C=>d.value.includes(e.toJsDate(C).getDay())).map((C,T)=>{const _=e.toISO(C),b=!e.isSameMonth(C,l.value),E=e.isSameDay(C,e.startOfMonth(l.value)),R=e.isSameDay(C,e.endOfMonth(l.value)),U=e.isSameDay(C,l.value);return{date:C,formatted:e.format(C,"keyboardDate"),isAdjacent:b,isDisabled:N(C),isEnd:R,isHidden:b&&!t.showAdjacentMonths,isSame:U,isSelected:s.value.some(Z=>e.isSameDay(C,Z)),isStart:E,isToday:e.isSameDay(C,p),isWeekEnd:T%7===6,isWeekStart:T%7===0,isoDate:_,localized:e.format(C,"dayOfMonth"),month:e.getMonth(C),year:e.getYear(C)}})}const h=A(()=>{const f=e.startOfWeek(r.value,t.firstDayOfWeek),p=[];for(let T=0;T<=6;T++)p.push(e.addDays(f,T));const C=e.date();return c(p,C)}),i=A(()=>{const f=u.value.flat(),p=e.date();return c(f,p)}),g=A(()=>u.value.map(f=>f.length?e.getWeek(f[0],t.firstDayOfWeek):null));function N(f){if(t.disabled)return!0;const p=e.date(f);return t.min&&e.isAfter(e.date(t.min),p)||t.max&&e.isAfter(p,e.date(t.max))?!0:Array.isArray(t.allowedDates)&&t.allowedDates.length>0?!t.allowedDates.some(C=>e.isSameDay(e.date(C),p)):typeof t.allowedDates=="function"?!t.allowedDates(p):!t.weekdays.includes(e.toJsDate(p).getDay())}return{displayValue:r,daysInMonth:i,daysInWeek:h,genDays:c,model:s,weeksInMonth:u,weekDays:d,weekNumbers:g}}const Je=H({color:String,hideWeekdays:Boolean,multiple:[Boolean,Number,String],showWeek:Boolean,transition:{type:String,default:"picker-transition"},reverseTransition:{type:String,default:"picker-reverse-transition"},...ie(oa(),["displayValue"])},"VDatePickerMonth"),Ne=G()({name:"VDatePickerMonth",props:Je(),emits:{"update:modelValue":t=>!0,"update:month":t=>!0,"update:year":t=>!0},setup(t,e){let{emit:s,slots:r}=e;const a=ye(),{daysInMonth:l,model:d,weekNumbers:u}=da(t),c=re(),h=ce(),i=ce(),g=ce(!1),N=pe(()=>g.value?t.reverseTransition:t.transition);t.multiple==="range"&&d.value.length>0&&(h.value=d.value[0],d.value.length>1&&(i.value=d.value[d.value.length-1]));const f=A(()=>{const _=["number","string"].includes(typeof t.multiple)?Number(t.multiple):1/0;return d.value.length>=_});Ie(l,(_,b)=>{b&&(g.value=c.isBefore(_[0].date,b[0].date))});function p(_){const b=c.startOfDay(_);if(d.value.length===0?h.value=void 0:d.value.length===1&&(h.value=d.value[0],i.value=void 0),!h.value)h.value=b,d.value=[h.value];else if(i.value)h.value=_,i.value=void 0,d.value=[h.value];else{if(c.isSameDay(b,h.value)){h.value=void 0,d.value=[];return}else c.isBefore(b,h.value)?(i.value=c.endOfDay(h.value),h.value=b):i.value=c.endOfDay(b);const E=c.getDiff(i.value,h.value,"days"),R=[h.value];for(let U=1;U<E;U++){const Z=c.addDays(h.value,U);R.push(Z)}R.push(i.value),d.value=R}}function C(_){const b=d.value.findIndex(E=>c.isSameDay(E,_));if(b===-1)d.value=[...d.value,_];else{const E=[...d.value];E.splice(b,1),d.value=E}}function T(_){t.multiple==="range"?p(_):t.multiple?C(_):d.value=[_]}J(()=>n("div",{class:"v-date-picker-month"},[t.showWeek&&n("div",{key:"weeks",class:"v-date-picker-month__weeks"},[!t.hideWeekdays&&n("div",{key:"hide-week-days",class:"v-date-picker-month__day"},[m(" ")]),u.value.map(_=>n("div",{class:["v-date-picker-month__day","v-date-picker-month__day--adjacent"]},[_]))]),n(je,{name:N.value},{default:()=>{var _;return[n("div",{ref:a,key:(_=l.value[0].date)==null?void 0:_.toString(),class:"v-date-picker-month__days"},[!t.hideWeekdays&&c.getWeekdays(t.firstDayOfWeek).map(b=>n("div",{class:["v-date-picker-month__day","v-date-picker-month__weekday"]},[b])),l.value.map((b,E)=>{var U;const R={props:{class:"v-date-picker-month__day-btn",color:b.isSelected||b.isToday?t.color:void 0,disabled:b.isDisabled,icon:!0,ripple:!1,text:b.localized,variant:b.isSelected?"flat":b.isToday?"outlined":"text",onClick:()=>T(b.date)},item:b,i:E};return f.value&&!b.isSelected&&(b.isDisabled=!0),n("div",{class:["v-date-picker-month__day",{"v-date-picker-month__day--adjacent":b.isAdjacent,"v-date-picker-month__day--hide-adjacent":b.isHidden,"v-date-picker-month__day--selected":b.isSelected,"v-date-picker-month__day--week-end":b.isWeekEnd,"v-date-picker-month__day--week-start":b.isWeekStart}],"data-v-date":b.isDisabled?void 0:b.isoDate},[(t.showAdjacentMonths||!b.isAdjacent)&&(((U=r.day)==null?void 0:U.call(r,R))??n(y,R.props,null))])})])]}})]))}}),Ke=H({color:String,height:[String,Number],min:null,max:null,modelValue:Number,year:Number},"VDatePickerMonths"),Te=G()({name:"VDatePickerMonths",props:Ke(),emits:{"update:modelValue":t=>!0},setup(t,e){let{emit:s,slots:r}=e;const a=re(),l=X(t,"modelValue"),d=A(()=>{let u=a.startOfYear(a.date());return t.year&&(u=a.setYear(u,t.year)),Re(12).map(c=>{const h=a.format(u,"monthShort"),i=!!(t.min&&a.isAfter(a.startOfMonth(a.date(t.min)),u)||t.max&&a.isAfter(u,a.startOfMonth(a.date(t.max))));return u=a.getNextMonth(u),{isDisabled:i,text:h,value:c}})});return Ue(()=>{l.value=l.value??a.getMonth(a.date())}),J(()=>n("div",{class:"v-date-picker-months",style:{height:xe(t.height)}},[n("div",{class:"v-date-picker-months__content"},[d.value.map((u,c)=>{var g;const h={active:l.value===c,color:l.value===c?t.color:void 0,disabled:u.isDisabled,rounded:!0,text:u.text,variant:l.value===u.value?"flat":"text",onClick:()=>i(c)};function i(N){if(l.value===N){s("update:modelValue",l.value);return}l.value=N}return((g=r.month)==null?void 0:g.call(r,{month:u,i:c,props:h}))??n(y,I({key:"month"},h),null)})])])),{}}}),Xe=H({color:String,height:[String,Number],min:null,max:null,modelValue:Number},"VDatePickerYears"),Ee=G()({name:"VDatePickerYears",props:Xe(),emits:{"update:modelValue":t=>!0},setup(t,e){let{emit:s,slots:r}=e;const a=re(),l=X(t,"modelValue"),d=A(()=>{const c=a.getYear(a.date());let h=c-100,i=c+52;t.min&&(h=a.getYear(a.date(t.min))),t.max&&(i=a.getYear(a.date(t.max)));let g=a.startOfYear(a.date());return g=a.setYear(g,h),Re(i-h+1,h).map(N=>{const f=a.format(g,"year");return g=a.setYear(g,a.getYear(g)+1),{text:f,value:N}})});Ue(()=>{l.value=l.value??a.getYear(a.date())});const u=at();return nt(async()=>{var c;await st(),(c=u.el)==null||c.scrollIntoView({block:"center"})}),J(()=>n("div",{class:"v-date-picker-years",style:{height:xe(t.height)}},[n("div",{class:"v-date-picker-years__content"},[d.value.map((c,h)=>{var g;const i={ref:l.value===c.value?u:void 0,active:l.value===c.value,color:l.value===c.value?t.color:void 0,rounded:!0,text:c.text,variant:l.value===c.value?"flat":"text",onClick:()=>{if(l.value===c.value){s("update:modelValue",l.value);return}l.value=c.value}};return((g=r.year)==null?void 0:g.call(r,{year:c,i:h,props:i}))??n(y,I({key:"month"},i),null)})])])),{}}}),ua=lt("v-picker-title"),Qe=H({color:String,...xt(),...bt(),...pt(),...yt(),...kt(),...gt(),...vt(),...ft(),...ht()},"VSheet"),ze=G()({name:"VSheet",props:Qe(),setup(t,e){let{slots:s}=e;const{themeClasses:r}=it(t),{backgroundColorClasses:a,backgroundColorStyles:l}=Se(()=>t.color),{borderClasses:d}=rt(t),{dimensionStyles:u}=ot(t),{elevationClasses:c}=dt(t),{locationStyles:h}=ut(t),{positionClasses:i}=ct(t),{roundedClasses:g}=mt(t);return J(()=>n(t.tag,{class:["v-sheet",r.value,a.value,d.value,c.value,i.value,g.value,t.class],style:[l.value,u.value,h.value,t.style]},s)),{}}}),Ze=H({bgColor:String,divided:Boolean,landscape:Boolean,title:String,hideHeader:Boolean,...Qe()},"VPicker"),Oe=G()({name:"VPicker",props:Ze(),setup(t,e){let{slots:s}=e;const{backgroundColorClasses:r,backgroundColorStyles:a}=Se(()=>t.color);return J(()=>{const l=ze.filterProps(t),d=!!(t.title||s.title);return n(ze,I(l,{color:t.bgColor,class:["v-picker",{"v-picker--divided":t.divided,"v-picker--landscape":t.landscape,"v-picker--with-actions":!!s.actions},t.class],style:t.style}),{default:()=>{var u;return[!t.hideHeader&&n("div",{key:"header",class:[r.value],style:[a.value]},[d&&n(ua,{key:"picker-title"},{default:()=>{var c;return[((c=s.title)==null?void 0:c.call(s))??t.title]}}),s.header&&n("div",{class:"v-picker__header"},[s.header()])]),n("div",{class:"v-picker__body"},[(u=s.default)==null?void 0:u.call(s)]),s.actions&&n(De,{defaults:{VBtn:{slim:!0,variant:"text"}}},{default:()=>[n("div",{class:"v-picker__actions"},[s.actions()])]})]}})}),{}}}),ca=H({header:{type:String,default:"$vuetify.datePicker.header"},headerColor:String,...Ge(),...Je({weeksInMonth:"static"}),...ie(Ke(),["modelValue"]),...ie(Xe(),["modelValue"]),...Ze({title:"$vuetify.datePicker.title"}),modelValue:null},"VDatePicker"),ma=G()({name:"VDatePicker",props:ca(),emits:{"update:modelValue":t=>!0,"update:month":t=>!0,"update:year":t=>!0,"update:viewMode":t=>!0},setup(t,e){let{emit:s,slots:r}=e;const a=re(),{t:l}=St(),{rtlClasses:d}=Dt(),u=X(t,"modelValue",void 0,S=>ue(S).map(V=>a.date(V)),S=>t.multiple?S:S[0]),c=X(t,"viewMode"),h=A(()=>{const S=a.date(t.min);return t.min&&a.isValid(S)?S:null}),i=A(()=>{const S=a.date(t.max);return t.max&&a.isValid(S)?S:null}),g=A(()=>{var j;const S=a.date();let V=S;return(j=u.value)!=null&&j[0]?V=a.date(u.value[0]):h.value&&a.isBefore(S,h.value)?V=h.value:i.value&&a.isAfter(S,i.value)&&(V=i.value),V&&a.isValid(V)?V:S}),N=pe(()=>t.headerColor??t.color),f=ye(Number(t.month??a.getMonth(a.startOfMonth(g.value)))),p=ye(Number(t.year??a.getYear(a.startOfYear(a.setMonth(g.value,f.value))))),C=ce(!1),T=A(()=>t.multiple&&u.value.length>1?l("$vuetify.datePicker.itemsSelected",u.value.length):u.value[0]&&a.isValid(u.value[0])?a.format(a.date(u.value[0]),"normalDateWithWeekday"):l(t.header)),_=A(()=>{let S=a.date();return S=a.setDate(S,1),S=a.setMonth(S,f.value),S=a.setYear(S,p.value),a.format(S,"monthAndYear")}),b=pe(()=>`date-picker-header${C.value?"-reverse":""}-transition`),E=A(()=>{if(t.disabled)return!0;const S=[];if(c.value!=="month")S.push("prev","next");else{let V=a.date();if(V=a.startOfMonth(V),V=a.setMonth(V,f.value),V=a.setYear(V,p.value),h.value){const j=a.addDays(a.startOfMonth(V),-1);a.isAfter(h.value,j)&&S.push("prev")}if(i.value){const j=a.addDays(a.endOfMonth(V),1);a.isAfter(j,i.value)&&S.push("next")}}return S});function R(){f.value<11?f.value++:(p.value++,f.value=0,ee(p.value)),$(f.value)}function U(){f.value>0?f.value--:(p.value--,f.value=11,ee(p.value)),$(f.value)}function Z(){c.value="month"}function we(){c.value=c.value==="months"?"month":"months"}function Ce(){c.value=c.value==="year"?"month":"year"}function $(S){c.value==="months"&&we(),s("update:month",S)}function ee(S){c.value==="year"&&Ce(),s("update:year",S)}return Ie(u,(S,V)=>{const j=ue(V),te=ue(S);if(!te.length)return;const me=a.date(j[j.length-1]),ae=a.date(te[te.length-1]),Q=a.getMonth(ae),M=a.getYear(ae);Q!==f.value&&(f.value=Q,$(f.value)),M!==p.value&&(p.value=M,ee(p.value)),C.value=a.isBefore(me,ae)}),J(()=>{const S=Oe.filterProps(t),V=Le.filterProps(t),j=Fe.filterProps(t),te=Ne.filterProps(t),me=ie(Te.filterProps(t),["modelValue"]),ae=ie(Ee.filterProps(t),["modelValue"]),Q={color:N.value,header:T.value,transition:b.value};return n(Oe,I(S,{color:N.value,class:["v-date-picker",`v-date-picker--${c.value}`,{"v-date-picker--show-week":t.showWeek},d.value,t.class],style:t.style}),{title:()=>{var M;return((M=r.title)==null?void 0:M.call(r))??n("div",{class:"v-date-picker__title"},[l(t.title)])},header:()=>r.header?n(De,{defaults:{VDatePickerHeader:{...Q}}},{default:()=>{var M;return[(M=r.header)==null?void 0:M.call(r,Q)]}}):n(Fe,I({key:"header"},j,Q,{onClick:c.value!=="month"?Z:void 0}),{...r,default:void 0}),default:()=>n(L,null,[n(Le,I(V,{disabled:E.value,text:_.value,"onClick:next":R,"onClick:prev":U,"onClick:month":we,"onClick:year":Ce}),null),n(wt,{hideOnLeave:!0},{default:()=>[c.value==="months"?n(Te,I({key:"date-picker-months"},me,{modelValue:f.value,"onUpdate:modelValue":[M=>f.value=M,$],min:h.value,max:i.value,year:p.value}),null):c.value==="year"?n(Ee,I({key:"date-picker-years"},ae,{modelValue:p.value,"onUpdate:modelValue":[M=>p.value=M,ee],min:h.value,max:i.value}),null):n(Ne,I({key:"date-picker-month"},te,{modelValue:u.value,"onUpdate:modelValue":M=>u.value=M,month:f.value,"onUpdate:month":[M=>f.value=M,$],year:p.value,"onUpdate:year":[M=>p.value=M,ee],min:h.value,max:i.value}),null)]})]),actions:r.actions})}),{}}}),ha={name:"Classworks 作业板",components:{MessageLog:We,RandomPicker:qe,NamespaceAccess:He},data(){return{dataKey:"",provider:"",useDisplay:Ae,state:{classNumber:"",studentList:[],boardData:{homework:{},attendance:{absent:[],late:[],exclude:[]}},dialogVisible:!1,dialogTitle:"",textarea:"",dateString:"",synced:!1,attendDialogVisible:!1,contentStyle:{"font-size":`${D("font.size")}px`},uploadLoading:!1,downloadLoading:!1,snackbar:!1,snackbarText:"",fontSize:D("font.size"),datePickerDialog:!1,selectedDate:new Date().toISOString().split("T")[0].replace(/-/g,""),selectedDateObj:new Date,refreshInterval:null,subjectOrder:["语文","数学","英语","物理","化学","生物","政治","历史","地理","其他"],showNoDataMessage:!1,noDataMessage:"",isToday:!1,attendanceDialog:!1,availableSubjects:[{key:"语文",name:"语文"},{key:"数学",name:"数学"},{key:"英语",name:"英语"},{key:"物理",name:"物理"},{key:"化学",name:"化学"},{key:"生物",name:"生物"},{key:"政治",name:"政治"},{key:"历史",name:"历史"},{key:"地理",name:"地理"},{key:"其他",name:"其他"}],isFullscreen:!1},loading:{download:!1,upload:!1,students:!1},debouncedUpload:null,throttledReflow:null,sortedItemsCache:{key:"",value:[]},confirmDialog:{show:!1,resolve:null,reject:null},attendanceSearch:"",attendanceFilter:[],urlConfigDialog:{show:!1,config:null,changes:[],validSettings:{},confirmHandler:null,cancelHandler:null,icons:{}}}},computed:{isMobile(){return Ae().mobile.value},titleText(){const t=this.getToday(),e=new Date(t);e.setDate(e.getDate()-1);const s=this.state.dateString,r=this.formatDate(t),a=this.formatDate(e);return s===r?"今天的作业":s===a?"昨天的作业":`${s}的作业`},sortedItems(){const t=`${JSON.stringify(this.state.boardData.homework)}_${this.state.subjectOrder.join()}_${this.dynamicSort}`;if(this.sortedItemsCache.key===t)return this.sortedItemsCache.value;const e=Object.entries(this.state.boardData.homework).filter(([,r])=>{var a;return(a=r.content)==null?void 0:a.trim()}).map(([r,a])=>{var l;return{key:r,name:((l=this.state.availableSubjects.find(d=>d.key===r))==null?void 0:l.name)||r,content:a.content,order:this.state.subjectOrder.indexOf(r),rowSpan:Math.ceil((a.content.split(`
|
||
`).filter(d=>d.trim()).length+1)*.8)}}),s=this.dynamicSort?this.optimizeGridLayout(e):e.sort((r,a)=>r.order-a.order);return this.updateSortedItemsCache(t,s),s},unusedSubjects(){const t=Object.keys(this.state.boardData.homework).filter(e=>{var s;return(s=this.state.boardData.homework[e].content)==null?void 0:s.trim()});return this.state.availableSubjects.filter(e=>!t.includes(e.key))},emptySubjects(){return this.emptySubjectDisplay!=="button"?[]:this.unusedSubjects},autoSave(){return D("edit.autoSave")},blockNonTodayAutoSave(){return D("edit.blockNonTodayAutoSave")},isToday(){const t=(()=>{const e=new Date,s=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${s}${r}${a}`})();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 D("edit.refreshBeforeEdit")},emptySubjectDisplay(){return D("display.emptySubjectDisplay")},dynamicSort(){return D("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 D("randomPicker.enabled")},showListCardButton(){return D("display.showListCard")},confirmNonTodaySave(){return D("edit.confirmNonTodaySave")},shouldShowSaveConfirm(){return!this.isToday&&this.confirmNonTodaySave},shouldBlockAutoSave(){return!this.isToday&&this.autoSave&&this.blockNonTodayAutoSave},showFullscreenButton(){return D("display.showFullscreenButton")},showAntiScreenBurnCard(){return D("display.showAntiScreenBurnCard")},filteredStudents(){let t=[...this.state.studentList];if(this.attendanceSearch){const e=this.attendanceSearch.toLowerCase();t=t.filter(s=>s.toLowerCase().includes(e))}return this.attendanceFilter&&this.attendanceFilter.length>0&&(t=t.filter(e=>{const s=this.state.studentList.indexOf(e);return!!(this.attendanceFilter.includes("present")&&this.isPresent(s)||this.attendanceFilter.includes("absent")&&this.isAbsent(s)||this.attendanceFilter.includes("late")&&this.isLate(s)||this.attendanceFilter.includes("exclude")&&this.isExclude(s))})),t},extractedSurnames(){if(!this.state.studentList||this.state.studentList.length===0)return[];const t=new Map;return this.state.studentList.forEach(e=>{if(e&&e.length>0){const s=e.charAt(0);t.has(s)?t.set(s,t.get(s)+1):t.set(s,1)}}),Array.from(t.entries()).map(([e,s])=>({name:e,count:s})).sort((e,s)=>{const r=Me(e.name,{toneType:"none",mode:"surname"}),a=Me(s.name,{toneType:"none",mode:"surname"});return r.localeCompare(a)})}},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=la(this.uploadData,2e3),this.throttledReflow=ia(()=>{this.$refs.gridContainer&&this.optimizeGridLayout(this.sortedItems)},200)},async mounted(){try{this.updateBackendUrl(),await this.initializeData(),this.setupAutoRefresh(),this.unwatchSettings=Nt(()=>{this.updateSettings()}),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)}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)},methods:{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),s=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${s}${r}${a}`},getToday(){return new Date},async initializeData(){const t=await this.parseUrlConfig(),s=new URLSearchParams(window.location.search).get("date"),r=this.getToday();let a=r;if(s){if(/^\d{8}$/.test(s)){const l=s.substring(0,4),d=s.substring(4,6),u=s.substring(6,8);a=new Date(`${l}-${d}-${u}`)}else a=new Date(s);isNaN(a.getTime())&&(a=r)}if(this.state.dateString=this.formatDate(a),this.state.selectedDate=this.state.dateString,this.state.selectedDateObj=a,this.state.isToday=this.formatDate(a)===this.formatDate(r),!t){this.provider=D("server.provider");const l=D("server.classNumber");this.state.classNumber=l}await Promise.all([this.downloadData(),this.loadConfig()])},async downloadData(){var t,e,s;if(!this.loading.download)try{this.loading.download=!0;const r=await ve.loadData("classworks-data-"+this.state.dateString);if(r.success==!1)if(r.error.code==="NOT_FOUND")this.state.showNoDataMessage=!0,this.state.noDataMessage=r.error.message,this.state.boardData={homework:{},attendance:{absent:[],late:[],exclude:[]}};else throw new Error(r.error.message);else this.state.boardData={homework:r.homework||{},attendance:{absent:((t=r.attendance)==null?void 0:t.absent)||[],late:((e=r.attendance)==null?void 0:e.late)||[],exclude:((s=r.attendance)==null?void 0:s.exclude)||[]}},this.state.synced=!0,this.state.showNoDataMessage=!1,this.$message.success("下载成功","数据已更新")}catch(r){this.state.boardData={homework:{},attendance:{absent:[],late:[],exclude:[]}},this.$message.error("下载失败",r.message)}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 s;if(!this.currentEditSubject)return;const t=this.state.textarea.trim(),e=((s=this.state.boardData.homework[this.currentEditSubject])==null?void 0:s.content)||"";t!==e.trim()&&(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 ve.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 ve.loadData("classworks-list-main");if(t.success!=!1&&Array.isArray(t)){this.state.studentList=t.map(e=>e.name);return}}catch(t){console.warn("Failed to load student list from dedicated key, falling back to config",t)}}catch(t){console.error("加载配置失败:",t),this.$message.error("加载配置失败",t.message)}},showSyncMessage(){this.$message.success("数据已同步","数据已完成与服务器同步")},async openDialog(t){var e;if(this.refreshBeforeEdit)try{await this.downloadData()}catch(s){console.error("刷新数据失败:",s),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(s=>s.key===t))==null?void 0:e.name)||t,this.state.textarea=this.state.boardData.homework[t].content,this.state.dialogVisible=!0,this.$nextTick(()=>{this.$refs.inputRef&&this.$refs.inputRef.focus()})},splitPoint(t){return t.split(`
|
||
`).filter(e=>e.trim())},setAttendanceArea(){this.state.attendanceDialog=!0},toggleStudentStatus(t){const e=this.state.studentList[t];this.state.boardData.attendance.absent.includes(e)?(this.state.boardData.attendance.absent=this.state.boardData.attendance.absent.filter(s=>s!==e),this.state.boardData.attendance.late.push(e)):this.state.boardData.attendance.late.includes(e)?(this.state.boardData.attendance.late=this.state.boardData.attendance.late.filter(s=>s!==e),this.state.boardData.attendance.exclude.push(e)):this.state.boardData.attendance.exclude.includes(e)?this.state.boardData.attendance.exclude=this.state.boardData.attendance.exclude.filter(s=>s!==e):this.state.boardData.attendance.absent.push(e),this.state.synced=!1,this.canAutoSave&&this.uploadData()},cleanstudentslist(){this.state.boardData.attendance.absent=[],this.state.boardData.attendance.late=[],this.state.boardData.attendance.exclude=[],this.state.synced=!1,this.canAutoSave&&this.uploadData()},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`},le("font.size",this.state.fontSize)},updateBackendUrl(){const t=D("server.provider"),e=D("server.classNumber");this.provider=t,this.state.classNumber=e},setupAutoRefresh(){const t=D("refresh.auto"),e=D("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=D("font.size"),this.state.contentStyle={"font-size":`${this.state.fontSize}px`},this.setupAutoRefresh(),this.updateBackendUrl()},handleDateSelect(t){if(t)try{const e=this.ensureDate(t),s=this.formatDate(e);this.state.dateString!==s&&(this.state.dateString=s,this.state.selectedDate=s,this.state.selectedDateObj=e,this.state.isToday=s===this.formatDate(this.getToday()),this.$router.replace({query:{date:s}}).catch(()=>{}),this.downloadData())}catch(e){console.error("Date processing error:",e),this.$message.error("日期处理错误","请重新选择日期")}},optimizeGridLayout(t){const e=Math.min(3,Math.floor(window.innerWidth/300));if(e<=1)return t;const s=Array.from({length:e},()=>({height:0,items:[]}));return t.forEach(r=>{const a=s.reduce((l,d,u)=>d.height<s[l].height?u:l,0);s[a].items.push(r),s[a].height+=r.rowSpan}),s.flatMap(r=>r.items).map((r,a)=>({...r,order:a}))},fixedGridLayout(t){const e=[["语文","数学","英语"],["物理","化学","生物"],["政治","历史","地理","其他"]];return t.sort((s,r)=>{const a=i=>{for(let g=0;g<e.length;g++)if(e[g].includes(i))return g;return e.length},l=i=>{for(const g of e){const N=g.indexOf(i);if(N!==-1)return N}return 999},d=a(s.key),u=a(r.key);if(d!==u)return d-u;const c=l(s.key),h=l(r.key);return c-h}).map((s,r)=>({...s,order:r,rowSpan:s.content?2:1}))},setAllPresent(){this.state.boardData.attendance={absent:[],late:[],exclude:[]},this.state.synced=!1},setAllAbsent(){this.state.boardData.attendance.absent=[...this.state.studentList],this.state.boardData.attendance.late=[],this.state.boardData.attendance.exclude=[],this.state.synced=!1},setAllLate(){this.state.boardData.attendance.absent=[],this.state.boardData.attendance.late=[...this.state.studentList],this.state.boardData.attendance.exclude=[],this.state.synced=!1},setAllExclude(){this.state.boardData.attendance.absent=[],this.state.boardData.attendance.late=[],this.state.boardData.attendance.exclude=[...this.state.studentList],this.state.synced=!1},isPresent(t){const e=this.state.studentList[t],{absent:s,late:r,exclude:a}=this.state.boardData.attendance;return!s.includes(e)&&!r.includes(e)&&!a.includes(e)},isAbsent(t){return this.state.boardData.attendance.absent.includes(this.state.studentList[t])},isLate(t){return this.state.boardData.attendance.late.includes(this.state.studentList[t])},isExclude(t){return this.state.boardData.attendance.exclude.includes(this.state.studentList[t])},setPresent(t){const e=this.state.studentList[t];this.state.boardData.attendance.absent=this.state.boardData.attendance.absent.filter(s=>s!==e),this.state.boardData.attendance.late=this.state.boardData.attendance.late.filter(s=>s!==e),this.state.boardData.attendance.exclude=this.state.boardData.attendance.exclude.filter(s=>s!==e),this.state.synced=!1},setAbsent(t){const e=this.state.studentList[t];this.setPresent(t),this.state.boardData.attendance.absent.push(e),this.state.synced=!1},setLate(t){const e=this.state.studentList[t];this.setPresent(t),this.state.boardData.attendance.late.push(e),this.state.synced=!1},setExclude(t){const e=this.state.studentList[t];this.setPresent(t),this.state.boardData.attendance.exclude.push(e),this.state.synced=!1},async saveAttendance(){try{await this.trySave(!0),this.state.attendanceDialog=!1}catch(t){console.error("保存出勤状态失败:",t),this.$message.error("保存失败","请重试")}},showMessage(t,e="",s="success"){this.$message[s](t,e)},updateSortedItemsCache(t,e){this._sortedItemsCache={key:t,value:e}},handleMouseMove(t){const e=t.currentTarget,s=e.getBoundingClientRect(),r=(t.clientX-s.left)/s.width*100,a=(t.clientY-s.top)/s.height*100;e.style.setProperty("--x",`${r}%`),e.style.setProperty("--y",`${a}%`)},handleTouchMove(t){if(t.touches.length===1){const e=t.touches[0],s=t.currentTarget,r=s.getBoundingClientRect(),a=(e.clientX-r.left)/r.width*100,l=(e.clientY-r.top)/r.height*100;s.style.setProperty("--x",`${a}%`),s.style.setProperty("--y",`${l}%`)}},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)},getStudentStatusColor(t){const e=this.state.studentList[t];return this.state.boardData.attendance.absent.includes(e)?"error":this.state.boardData.attendance.late.includes(e)?"warning":this.state.boardData.attendance.exclude.includes(e)?"grey":"success"},getStudentStatusVariant(t){const e=this.state.studentList[t];return this.state.boardData.attendance.absent.includes(e)||this.state.boardData.attendance.late.includes(e)||this.state.boardData.attendance.exclude.includes(e)?"tonal":"outlined"},getStudentStatusIcon(t){const e=this.state.studentList[t];return this.state.boardData.attendance.absent.includes(e)?"mdi-account-off":this.state.boardData.attendance.late.includes(e)?"mdi-clock-alert":this.state.boardData.attendance.exclude.includes(e)?"mdi-account-cancel":"mdi-account-check"},getStudentStatusText(t){const e=this.state.studentList[t];return this.state.boardData.attendance.absent.includes(e)?"请假":this.state.boardData.attendance.late.includes(e)?"迟到":this.state.boardData.attendance.exclude.includes(e)?"不参与":"到课"},toggleFilter(t){const e=this.attendanceFilter.indexOf(t);e===-1?this.attendanceFilter.push(t):this.attendanceFilter.splice(e,1)},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 s=atob(e),r=Uint8Array.from(s,h=>h.charCodeAt(0)),a=new TextDecoder().decode(r),l=JSON.parse(a);console.log("从URL读取配置:",l);const d=[],u={},c={};return this.processSpecialSettings(l,d,u),this.processStandardSettings(l,d,u,c),Object.keys(u).length===0?(console.log("URL配置与当前配置相同,无需应用"),!1):new Promise(h=>{this.urlConfigDialog={show:!0,config:l,changes:d,validSettings:u,icons:c,confirmHandler:()=>{this.urlConfigDialog.show=!1,this.applyUrlConfig(u),h(!0)},cancelHandler:()=>{this.urlConfigDialog.show=!1,h(!1)}}})}catch(s){return console.error("解析URL配置错误:",s),this.$message.error("URL配置错误","无法解析配置数据"),!1}}catch(t){return console.error("处理URL配置错误:",t),!1}},processSpecialSettings(t,e,s){var r,a;if(t.classNumber!==void 0){const l=D("server.classNumber");t.classNumber!==l&&(e.push({key:"server.classNumber",name:"班级",oldValue:l,newValue:t.classNumber,description:((r=ne["server.classNumber"])==null?void 0:r.description)||"班级编号",icon:((a=ne["server.classNumber"])==null?void 0:a.icon)||"mdi-account-group"}),s["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"}),s.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"}),s.subjects=t.subjects)},processStandardSettings(t,e,s,r){Object.entries(t).forEach(([a,l])=>{if(["classNumber","date","subjects"].includes(a))return;let d=a,u=ne[a];if(!u&&!a.includes(".")){const c=["server.","display.","theme.","edit.","refresh.","font.","randomPicker."];for(const h of c){const i=`${h}${a}`;if(ne[i]){d=i,u=ne[i];break}}}if(u){let c=this.convertValueToCorrectType(l,u.type);if(u.validate&&!u.validate(c)){console.warn(`URL配置项 ${d} 的值无效: ${l}`);return}const h=D(d);c!==h&&(e.push({key:d,name:this.getSettingDisplayName(d),oldValue:this.formatSettingValue(h),newValue:this.formatSettingValue(c),description:u.description||d,icon:u.icon||"mdi-cog"}),s[d]=c,r[d]=u.icon||"mdi-cog")}else e.push({key:a,name:this.getSettingDisplayName(a),oldValue:"未知",newValue:this.formatSettingValue(l),description:"自定义配置项",icon:"mdi-cog-outline"}),s[a]=l,r[a]="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("."),s=e[e.length-1];return{provider:"数据提供方",domain:"服务器域名",classNumber:"班级编号",emptySubjectDisplay:"空科目显示方式",dynamicSort:"动态排序",showRandomButton:"随机按钮",showFullscreenButton:"全屏按钮",cardHoverEffect:"卡片悬浮效果",enhancedTouchMode:"增强触摸模式",showAntiScreenBurnCard:"防烧屏卡片",mode:"主题模式",size:"字体大小",autoSave:"自动保存",blockNonTodayAutoSave:"禁止自动保存非当日",refreshBeforeEdit:"编辑前刷新",confirmNonTodaySave:"非当日保存确认",auto:"自动刷新",interval:"刷新间隔"}[s]||s},safeBase64Decode(t){try{return Ft.decode(t)}catch(e){throw console.error("Base64解码错误:",e),new Error("无法解码配置数据")}},applyUrlConfig(t){for(const[e,s]of Object.entries(t)){if(e==="date"){this.handleDateSelect(s);continue}if(e==="subjects"){this.state.availableSubjects=s;continue}le(e,s),e==="server.classNumber"&&(this.state.classNumber=s)}return this.updateBackendUrl(),this.$message.success("URL配置已应用","已从URL加载配置"),!0}}},fa={class:"d-flex"},va={ref:"gridContainer",class:"grid-masonry"},ga={class:"empty-subjects mt-4"},ka={key:1,class:"empty-subjects-grid"},ya={key:0},pa={style:{"white-space":"nowrap"}},ba={key:0},xa={style:{"white-space":"nowrap"}},Sa={key:0},Da={style:{"white-space":"nowrap"}},wa={class:"d-flex flex-wrap mt-2 gap-1"},Ca={class:"d-flex flex-wrap mb-4 gap-2"},_a={class:"flex-grow-1"},Va={class:"d-flex align-center"},Pa={class:"text-subtitle-1"},Aa={class:"attendance-actions"},Ma={class:"text-subtitle-1"},La={class:"text-grey-darken-1"},Fa={class:"text-primary font-weight-medium"};function Na(t,e,s,r,a,l){const d=He,u=Ct("snap"),c=We,h=qe;return v(),w(L,null,[n(Et,{class:"no-select"},{append:o(()=>[n(d),n(y,{icon:"mdi-format-font-size-decrease",variant:"text",onClick:e[0]||(e[0]=i=>l.zoom("out"))}),n(y,{icon:"mdi-format-font-size-increase",variant:"text",onClick:e[1]||(e[1]=i=>l.zoom("up"))}),n(zt,{modelValue:a.state.datePickerDialog,"onUpdate:modelValue":e[3]||(e[3]=i=>a.state.datePickerDialog=i),"close-on-content-click":!1},{activator:o(({props:i})=>[n(y,I({icon:"mdi-calendar",variant:"text"},i),null,16)]),default:o(()=>[n(z,{border:""},{default:o(()=>[n(ma,{modelValue:a.state.selectedDateObj,"onUpdate:modelValue":[e[2]||(e[2]=i=>a.state.selectedDateObj=i),l.handleDateSelect],"model-value":a.state.selectedDateObj,color:"primary"},null,8,["modelValue","model-value","onUpdate:modelValue"])]),_:1})]),_:1},8,["modelValue"]),n(y,{icon:"mdi-refresh",variant:"text",loading:a.loading.download,onClick:l.downloadData},null,8,["loading","onClick"]),n(y,{icon:"mdi-bell",variant:"text",badge:l.unreadCount||void 0,"badge-color":l.unreadCount?"error":void 0,onClick:e[4]||(e[4]=i=>t.$refs.messageLog.drawer=!0)},null,8,["badge","badge-color"]),n(y,{icon:"mdi-cog",variant:"text",onClick:e[5]||(e[5]=i=>t.$router.push("/settings"))})]),default:o(()=>[n(Tt,null,{default:o(()=>[m(x(a.state.classNumber)+" - "+x(l.titleText),1)]),_:1}),n(K)]),_:1}),k("div",fa,[n(Ot,{class:"main-window flex-grow-1 no-select",fluid:""},{default:o(()=>[k("div",va,[n(ke,{name:"grid"},{default:o(()=>[(v(!0),w(L,null,O(l.sortedItems,i=>(v(),w("div",{key:i.key,class:"grid-item",style:_e({"grid-row-end":`span ${i.rowSpan}`,order:i.order})},[n(z,{border:"",height:"100%",class:"glow-track",onClick:g=>!l.isEditingDisabled&&l.openDialog(i.key),onMousemove:l.handleMouseMove,onTouchmove:l.handleTouchMove},{default:o(()=>[n(W,null,{default:o(()=>[m(x(i.name),1)]),_:2},1024),n(B,{style:_e(a.state.contentStyle)},{default:o(()=>[n(Ve,null,{default:o(()=>[(v(!0),w(L,null,O(l.splitPoint(i.content),g=>(v(),P(Pe,{key:g},{default:o(()=>[m(x(g),1)]),_:2},1024))),128))]),_:2},1024)]),_:2},1032,["style"])]),_:2},1032,["onClick","onMousemove","onTouchmove"])],4))),128))]),_:1})],512),k("div",ga,[l.emptySubjectDisplay==="button"?(v(),P(he,{key:0,divided:"",variant:"outlined"},{default:o(()=>[(v(!0),w(L,null,O(l.unusedSubjects,i=>(v(),P(y,{key:i.key,disabled:l.isEditingDisabled,onClick:g=>l.openDialog(i.key)},{default:o(()=>[n(Y,{start:""},{default:o(()=>e[19]||(e[19]=[m(" mdi-plus ")])),_:1,__:[19]}),m(" "+x(i.name),1)]),_:2},1032,["disabled","onClick"]))),128))]),_:1})):(v(),w("div",ka,[n(ke,{name:"v-list"},{default:o(()=>[(v(!0),w(L,null,O(l.unusedSubjects,i=>(v(),P(z,{key:i.key,border:"",class:"empty-subject-card",disabled:l.isEditingDisabled,onClick:g=>l.openDialog(i.key)},{default:o(()=>[n(W,{class:"text-subtitle-1"},{default:o(()=>[m(x(i.name),1)]),_:2},1024),n(B,{class:"text-center"},{default:o(()=>[n(Y,{size:"small",color:"grey"},{default:o(()=>e[20]||(e[20]=[m(" mdi-plus ")])),_:1,__:[20]}),e[21]||(e[21]=k("div",{class:"text-caption text-grey"},"点击添加作业",-1))]),_:1,__:[21]})]),_:2},1032,["disabled","onClick"]))),128))]),_:1})]))]),a.state.synced?(v(),P(y,{key:1,color:"success",size:"large",onClick:l.showSyncMessage},{default:o(()=>e[23]||(e[23]=[m(" 同步完成 ")])),_:1,__:[23]},8,["onClick"])):(v(),P(y,{key:0,color:"error",size:"large",loading:a.loading.upload,class:"ml-2",onClick:l.manualUpload},{default:o(()=>e[22]||(e[22]=[m(" 上传 ")])),_:1,__:[22]},8,["loading","onClick"])),l.showRandomPickerButton?(v(),P(y,{key:2,color:"amber","prepend-icon":"mdi-account-question","append-icon":"mdi-dice-multiple",size:"large",class:"ml-2",onClick:l.openRandomPicker},{default:o(()=>e[24]||(e[24]=[m(" 随机点名 ")])),_:1,__:[24]},8,["onClick"])):F("",!0),l.showListCardButton?(v(),P(y,{key:3,color:"primary-darken-1","prepend-icon":"mdi-list-box",size:"large",class:"ml-2",onClick:e[6]||(e[6]=i=>t.$router.push("/list"))},{default:o(()=>e[25]||(e[25]=[m(" 列表 ")])),_:1,__:[25]})):F("",!0),l.showFullscreenButton?(v(),P(y,{key:4,color:a.state.isFullscreen?"blue-grey":"blue","prepend-icon":a.state.isFullscreen?"mdi-fullscreen-exit":"mdi-fullscreen",size:"large",class:"ml-2",onClick:l.toggleFullscreen},{default:o(()=>[m(x(a.state.isFullscreen?"退出全屏":"全屏显示"),1)]),_:1},8,["color","prepend-icon","onClick"])):F("",!0),l.showAntiScreenBurnCard?(v(),P(z,{key:5,border:"",class:"mt-4 anti-burn-card",color:"primary",variant:"tonal"},{default:o(()=>[n(W,{class:"text-subtitle-1"},{default:o(()=>[n(Y,{start:"",icon:"mdi-shield-check",size:"small"}),e[26]||(e[26]=m(" 屏幕保护技术已启用 "))]),_:1,__:[26]}),n(B,{class:"text-body-2"},{default:o(()=>e[27]||(e[27]=[k("p",null," 本应用采用独立自研的动态像素偏移技术(DPO™),有效防止LCD屏幕烧屏现象。 ",-1),k("p",{class:"text-caption text-grey"},[m(" *研究显示动态像素偏移技术可以修复屏幕坏点,起到保护屏幕的作用,数据来自实验室。"),k("a",{href:"https://patentscope.wipo.int/search/zh/detail.jsf?docId=CN232281523&_cid=P20-M8L0YX-67061-1",target:"_blank"},"专利号CN108648692 ")],-1),k("p",{class:"text-caption text-grey"}," *技术已自动适配您的设备,无需手动调整 ",-1)])),_:1,__:[27]})]),_:1})):F("",!0)]),_:1}),a.state.studentList&&a.state.studentList.length?(v(),P(oe,{key:0,class:"attendance-area no-select",cols:"1",onClick:e[7]||(e[7]=i=>l.setAttendanceArea())},{default:o(()=>[e[38]||(e[38]=k("h1",null,"出勤",-1)),k("h2",null,[n(u,{style:{"white-space":"nowrap"}},{default:o(()=>e[28]||(e[28]=[m(" 应到 ")])),_:1,__:[28]}),e[29]||(e[29]=m(": ")),n(u,{style:{"white-space":"nowrap"}},{default:o(()=>[m(x(a.state.studentList.length-a.state.boardData.attendance.exclude.length)+"人 ",1)]),_:1})]),k("h2",null,[n(u,{style:{"white-space":"nowrap"}},{default:o(()=>e[30]||(e[30]=[m(" 实到 ")])),_:1,__:[30]}),e[31]||(e[31]=m(": ")),n(u,{style:{"white-space":"nowrap"}},{default:o(()=>[m(x(a.state.studentList.length-a.state.boardData.attendance.absent.length-a.state.boardData.attendance.late.length-a.state.boardData.attendance.exclude.length)+"人 ",1)]),_:1})]),k("h2",null,[n(u,{style:{"white-space":"nowrap"}},{default:o(()=>e[32]||(e[32]=[m(" 请假 ")])),_:1,__:[32]}),e[33]||(e[33]=m(": ")),n(u,{style:{"white-space":"nowrap"}},{default:o(()=>[m(x(a.state.boardData.attendance.absent.length)+"人 ",1)]),_:1})]),(v(!0),w(L,null,O(a.state.boardData.attendance.absent,(i,g)=>(v(),w("h3",{class:"gray-text",key:"absent-"+g},[a.useDisplay().lgAndUp.value?(v(),w("span",ya,x(`${g+1}. `),1)):F("",!0),k("span",pa,x(i),1)]))),128)),k("h2",null,[n(u,{style:{"white-space":"nowrap"}},{default:o(()=>e[34]||(e[34]=[m("迟到")])),_:1,__:[34]}),e[35]||(e[35]=m(": ")),n(u,{style:{"white-space":"nowrap"}},{default:o(()=>[m(x(a.state.boardData.attendance.late.length)+"人 ",1)]),_:1})]),(v(!0),w(L,null,O(a.state.boardData.attendance.late,(i,g)=>(v(),w("h3",{class:"gray-text",key:"late-"+g},[a.useDisplay().lgAndUp.value?(v(),w("span",ba,x(`${g+1}. `),1)):F("",!0),k("span",xa,x(i),1)]))),128)),k("h2",null,[n(u,{style:{"white-space":"nowrap"}},{default:o(()=>e[36]||(e[36]=[m("不参与")])),_:1,__:[36]}),e[37]||(e[37]=m(": ")),n(u,{style:{"white-space":"nowrap"}},{default:o(()=>[m(x(a.state.boardData.attendance.exclude.length)+"人 ",1)]),_:1})]),(v(!0),w(L,null,O(a.state.boardData.attendance.exclude,(i,g)=>(v(),w("h3",{class:"gray-text",key:"exclude-"+g},[a.useDisplay().lgAndUp.value?(v(),w("span",Sa,x(`${g+1}. `),1)):F("",!0),k("span",Da,x(i),1)]))),128))]),_:1,__:[38]})):F("",!0)]),n(se,{modelValue:a.state.dialogVisible,"onUpdate:modelValue":e[9]||(e[9]=i=>a.state.dialogVisible=i),width:"500","onClick:outside":l.handleClose},{default:o(()=>[n(z,{border:""},{default:o(()=>[n(W,null,{default:o(()=>[m(x(a.state.dialogTitle),1)]),_:1}),n(_t,null,{default:o(()=>[m(x(l.autoSave?"喵?喵呜!":"写完后点击上传谢谢喵"),1)]),_:1}),n(B,null,{default:o(()=>[n(Bt,{ref:"inputRef",modelValue:a.state.textarea,"onUpdate:modelValue":e[8]||(e[8]=i=>a.state.textarea=i),"auto-grow":"",placeholder:"使用换行表示分条",rows:"5"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","onClick:outside"]),n(Vt,{modelValue:a.state.snackbar,"onUpdate:modelValue":e[10]||(e[10]=i=>a.state.snackbar=i),timeout:2e3},{default:o(()=>[m(x(a.state.snackbarText),1)]),_:1},8,["modelValue"]),n(se,{modelValue:a.state.attendanceDialog,"onUpdate:modelValue":[e[16]||(e[16]=i=>a.state.attendanceDialog=i),l.handleAttendanceDialogClose],"max-width":"900","fullscreen-breakpoint":"sm"},{default:o(()=>[n(z,null,{default:o(()=>[n(W,{class:"d-flex align-center"},{default:o(()=>[n(Y,{icon:"mdi-account-group",class:"mr-2"}),e[39]||(e[39]=m(" 出勤状态管理 ")),n(K),n(q,{color:"primary",size:"small",class:"ml-2"},{default:o(()=>[m(x(a.state.dateString),1)]),_:1})]),_:1,__:[39]}),n(B,null,{default:o(()=>[n(ge,{class:"mb-4"},{default:o(()=>[n(oe,{cols:"12",md:"12"},{default:o(()=>[n(be,{modelValue:a.attendanceSearch,"onUpdate:modelValue":[e[11]||(e[11]=i=>a.attendanceSearch=i),t.handleSearchChange],"prepend-inner-icon":"mdi-magnify",label:"搜索学生",hint:"支持筛选姓氏,如输入'孙'可筛选所有姓孙的学生",variant:"outlined",clearable:""},null,8,["modelValue","onUpdate:modelValue"]),k("div",wa,[(v(!0),w(L,null,O(l.extractedSurnames,i=>(v(),P(y,{key:i.name,variant:a.attendanceSearch===i.name?"elevated":"text",color:a.attendanceSearch===i.name?"primary":"",onClick:g=>a.attendanceSearch=a.attendanceSearch===i.name?"":i.name},{default:o(()=>[m(x(i.name)+" ("+x(i.count)+") ",1)]),_:2},1032,["variant","color","onClick"]))),128))])]),_:1})]),_:1}),k("div",Ca,[k("div",null,[n(q,{value:"present",color:a.attendanceFilter.includes("present")?"success":"",variant:a.attendanceFilter.includes("present")?"elevated":"tonal",class:"px-2 filter-chip",onClick:e[12]||(e[12]=i=>l.toggleFilter("present")),"prepend-icon":"mdi-account-check","append-icon":a.attendanceFilter.includes("present")?"mdi-check":""},{default:o(()=>e[40]||(e[40]=[m(" 到课 ")])),_:1,__:[40]},8,["color","variant","append-icon"]),n(q,{value:"absent",color:a.attendanceFilter.includes("absent")?"error":"",variant:a.attendanceFilter.includes("absent")?"elevated":"tonal",class:"px-2 filter-chip",onClick:e[13]||(e[13]=i=>l.toggleFilter("absent")),"prepend-icon":"mdi-account-off","append-icon":a.attendanceFilter.includes("absent")?"mdi-check":""},{default:o(()=>e[41]||(e[41]=[m(" 请假 ")])),_:1,__:[41]},8,["color","variant","append-icon"]),n(q,{value:"late",color:a.attendanceFilter.includes("late")?"warning":"",variant:a.attendanceFilter.includes("late")?"elevated":"tonal",class:"px-2 filter-chip",onClick:e[14]||(e[14]=i=>l.toggleFilter("late")),"prepend-icon":"mdi-clock-alert","append-icon":a.attendanceFilter.includes("late")?"mdi-check":""},{default:o(()=>e[42]||(e[42]=[m(" 迟到 ")])),_:1,__:[42]},8,["color","variant","append-icon"]),n(q,{value:"exclude",color:a.attendanceFilter.includes("exclude")?"grey":"",variant:a.attendanceFilter.includes("exclude")?"elevated":"tonal",class:"px-2 filter-chip",onClick:e[15]||(e[15]=i=>l.toggleFilter("exclude")),"prepend-icon":"mdi-account-cancel","append-icon":a.attendanceFilter.includes("exclude")?"mdi-check":""},{default:o(()=>e[43]||(e[43]=[m(" 不参与 ")])),_:1,__:[43]},8,["color","variant","append-icon"])])]),n(ge,null,{default:o(()=>[(v(!0),w(L,null,O(l.filteredStudents,i=>(v(),P(oe,{key:i,cols:"12",sm:"6",md:"6",lg:"4"},{default:o(()=>[n(z,{class:"student-card",border:""},{default:o(()=>[n(B,{class:"d-flex align-center pa-2"},{default:o(()=>[k("div",_a,[k("div",Va,[n(Pt,{color:l.getStudentStatusColor(a.state.studentList.indexOf(i)),size:"24",class:"mr-2"},{default:o(()=>[n(Y,{size:"small"},{default:o(()=>[m(x(l.getStudentStatusIcon(a.state.studentList.indexOf(i))),1)]),_:2},1024)]),_:2},1032,["color"]),k("div",Pa,x(i),1)])]),k("div",Aa,[n(y,{color:l.isPresent(a.state.studentList.indexOf(i))?"success":"",icon:"mdi-account-check",size:"small",variant:"text",onClick:g=>l.setPresent(a.state.studentList.indexOf(i)),title:"设为到课"},null,8,["color","onClick"]),n(y,{color:l.isAbsent(a.state.studentList.indexOf(i))?"error":"",icon:"mdi-account-off",size:"small",variant:"text",onClick:g=>l.setAbsent(a.state.studentList.indexOf(i)),title:"设为请假"},null,8,["color","onClick"]),n(y,{color:l.isLate(a.state.studentList.indexOf(i))?"warning":"",icon:"mdi-clock-alert",size:"small",variant:"text",onClick:g=>l.setLate(a.state.studentList.indexOf(i)),title:"设为迟到"},null,8,["color","onClick"]),n(y,{color:l.isExclude(a.state.studentList.indexOf(i))?"grey":"",icon:"mdi-account-cancel",size:"small",variant:"text",onClick:g=>l.setExclude(a.state.studentList.indexOf(i)),title:"设为不参与"},null,8,["color","onClick"])])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1}),n(ge,null,{default:o(()=>[n(oe,{cols:"12",md:"12"},{default:o(()=>[n(z,{variant:"tonal",color:"primary",class:"mb-4"},{default:o(()=>[n(B,null,{default:o(()=>[e[48]||(e[48]=k("div",{class:"text-subtitle-2 mb-2"},"批量操作",-1)),n(he,null,{default:o(()=>[n(y,{color:"success","prepend-icon":"mdi-account-check",onClick:l.setAllPresent},{default:o(()=>e[44]||(e[44]=[m(" 全部到齐 ")])),_:1,__:[44]},8,["onClick"]),n(y,{color:"error","prepend-icon":"mdi-account-off",onClick:l.setAllAbsent},{default:o(()=>e[45]||(e[45]=[m(" 全部请假 ")])),_:1,__:[45]},8,["onClick"])]),_:1}),n(he,null,{default:o(()=>[n(y,{color:"warning","prepend-icon":"mdi-clock-alert",onClick:l.setAllLate},{default:o(()=>e[46]||(e[46]=[m(" 全部迟到 ")])),_:1,__:[46]},8,["onClick"]),n(y,{color:"grey","prepend-icon":"mdi-account-cancel",onClick:l.setAllExclude},{default:o(()=>e[47]||(e[47]=[m(" 全部不参与 ")])),_:1,__:[47]},8,["onClick"])]),_:1})]),_:1,__:[48]})]),_:1})]),_:1})]),_:1})]),_:1}),n(At),n(fe,null,{default:o(()=>[n(K),n(y,{color:"primary",onClick:l.saveAttendance},{default:o(()=>[n(Y,{start:""},{default:o(()=>e[49]||(e[49]=[m("mdi-content-save")])),_:1,__:[49]}),e[50]||(e[50]=m(" 保存 "))]),_:1,__:[50]},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue","onUpdate:modelValue"]),n(c,{ref:"messageLog"},null,512),n(se,{modelValue:a.confirmDialog.show,"onUpdate:modelValue":e[17]||(e[17]=i=>a.confirmDialog.show=i),"max-width":"400"},{default:o(()=>[n(z,null,{default:o(()=>[n(W,{class:"text-h6"},{default:o(()=>e[51]||(e[51]=[m(" 确认保存 ")])),_:1,__:[51]}),n(B,null,{default:o(()=>[m(" 您正在修改 "+x(a.state.dateString)+" 的数据,确定要保存吗? ",1)]),_:1}),n(fe,null,{default:o(()=>[n(K),n(y,{color:"grey",variant:"text",onClick:a.confirmDialog.reject},{default:o(()=>e[52]||(e[52]=[m(" 取消 ")])),_:1,__:[52]},8,["onClick"]),n(y,{color:"primary",onClick:a.confirmDialog.resolve},{default:o(()=>e[53]||(e[53]=[m(" 确认保存 ")])),_:1,__:[53]},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),n(h,{ref:"randomPicker","student-list":a.state.studentList,attendance:a.state.boardData.attendance},null,8,["student-list","attendance"]),n(se,{modelValue:a.urlConfigDialog.show,"onUpdate:modelValue":e[18]||(e[18]=i=>a.urlConfigDialog.show=i),"max-width":"500"},{default:o(()=>[n(z,null,{default:o(()=>[n(W,{class:"text-h6"},{default:o(()=>e[54]||(e[54]=[m(" 确认应用URL配置 ")])),_:1,__:[54]}),n(B,null,{default:o(()=>[e[55]||(e[55]=k("p",null,"以下配置将应用于当前班级:",-1)),n(Ve,{density:"compact"},{default:o(()=>[(v(!0),w(L,null,O(a.urlConfigDialog.changes,i=>(v(),P(Pe,{key:i.key},{prepend:o(()=>[n(Y,{icon:i.icon,size:"small",class:"mr-2"},null,8,["icon"])]),default:o(()=>[n(Mt,{class:"d-flex align-center"},{default:o(()=>[k("span",Ma,x(i.name),1),n(Ye,{activator:"parent",location:"top"},{default:o(()=>[m(x(i.description||i.key),1)]),_:2},1024)]),_:2},1024),n(Lt,null,{default:o(()=>[k("span",La,x(i.oldValue),1),n(Y,{icon:"mdi-arrow-right",size:"small",class:"mx-1"}),k("span",Fa,x(i.newValue),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1,__:[55]}),n(fe,null,{default:o(()=>[n(K),n(y,{color:"grey",variant:"text",onClick:a.urlConfigDialog.cancelHandler},{default:o(()=>e[56]||(e[56]=[m(" 取消 ")])),_:1,__:[56]},8,["onClick"]),n(y,{color:"primary",onClick:a.urlConfigDialog.confirmHandler},{default:o(()=>e[57]||(e[57]=[m(" 确认应用 ")])),_:1,__:[57]},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}const Ha=Be(ha,[["render",Na]]);export{Ha as default};
|