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