mirror of
https://github.com/ZeroCatDev/Classworks.git
synced 2026-03-21 09:13:10 +00:00
3 lines
53 KiB
JavaScript
3 lines
53 KiB
JavaScript
import{d as Q}from"./dataProvider-bUkzKSNt.js";import{o as ae,q as Qe,k as g,N as Se,n as ne,b as _,e as P,j as o,s as et,a1 as f,F as ce,I as Ae,D as tt,m as fe,t as at,X as w,_ as R,Y as E,Z as r,S as F,$ as U,a2 as ye,a8 as nt,R as lt,V as ot}from"./vendor-vue-B2vxubPy.js";import{G as $e,H as it,D as rt,i as x,J as st,L as ut,_ as dt,f as V,l as He,n as ke,o as mt,d as G,e as q,F as ct,c as ee,r as se,W as ft,v as gt,q as Te,k as vt}from"./index-CFUCTEXJ.js";import{V as Ve}from"./VAlert-DO0N7oM6.js";import{V as ht}from"./VSkeletonLoader-AysIn-20.js";import{V as be}from"./VTooltip-CbK3h4lM.js";import{V as xe,a as pt}from"./VChip-DR8Ljy6R.js";import{a as B,V as ue}from"./VRow-Dw4j2TKL.js";import{V as te}from"./VTextField-ByBRYn99.js";import{V as yt}from"./VTextarea-BxmmuONa.js";import{V as bt}from"./VSwitch-DKh_Uq_M.js";import{V as wt}from"./VAutocomplete-CrWVUMTj.js";import{V as Be}from"./VSheet-B8D7XEg5.js";import{a as Le,m as Ct,V as Oe}from"./VDatePicker-BWfVQdXc.js";import{f as we,u as Ce,p as he,aM as Dt,an as Ke,n as ge,z as Re,a5 as _e}from"./vendor-vuetify-s-yw_Hr8.js";import"./vendor-utils-DDRLRfsI.js";import"./serverRotation-CdH9Xda8.js";import"./autofocus-BAgnxQiD.js";import"./VLabel-CU-8PdVS.js";import"./VSelect-Fp4MUhJW.js";import"./VCheckboxBtn-DOw5vjpY.js";import"./VBadge-C7i5WU2T.js";const kt=he({allowedValues:Function,ampm:Boolean,color:String,disabled:Boolean,displayedValue:null,double:Boolean,format:{type:Function,default:e=>e},max:{type:Number,required:!0},min:{type:Number,required:!0},scrollable:Boolean,readonly:Boolean,rotate:{type:Number,default:0},step:{type:Number,default:1},modelValue:{type:Number}},"VTimePickerClock"),je=we()({name:"VTimePickerClock",props:kt(),emits:{change:e=>!0,input:e=>!0},setup(e,t){let{emit:i}=t;const n=_(null),l=_(null),u=_(void 0),a=_(!1),d=_(null),s=_(null),p=Dt(c=>i("change",c),750),{textColorClasses:I,textColorStyles:M}=$e(()=>e.color),{backgroundColorClasses:k,backgroundColorStyles:h}=it(()=>e.color),N=P(()=>e.max-e.min+1),S=P(()=>e.double?N.value/2:N.value),C=P(()=>360/S.value),j=P(()=>C.value*Math.PI/180),$=P(()=>e.modelValue==null?e.min:e.modelValue),le=P(()=>.62),de=P(()=>{const c=[];for(let y=e.min;y<=e.max;y=y+e.step)c.push(y);return c});ae(()=>e.modelValue,c=>{u.value=c});function z(c){u.value!==c&&(u.value=c),i("input",c)}function J(c){return!e.allowedValues||e.allowedValues(c)}function X(c){if(!e.scrollable||e.disabled)return;c.preventDefault();const y=Math.sign(-c.deltaY||1);let T=$.value;do T=T+y,T=(T-e.min+N.value)%N.value+e.min;while(!J(T)&&T!==$.value);T!==e.displayedValue&&z(T),p(T)}function Z(c){return e.double&&c-e.min>=S.value}function Y(c){return Z(c)?le.value:1}function b(c){const y=e.rotate*Math.PI/180;return{x:Math.sin((c-e.min)*j.value+y)*Y(c),y:-Math.cos((c-e.min)*j.value+y)*Y(c)}}function A(c,y){const T=(Math.round(c/C.value)+(y?S.value:0))%N.value+e.min;return c<360-C.value/2?T:y?e.max-S.value+1:e.min}function W(c){const{x:y,y:T}=b(c);return{left:`${Math.round(50+y*50)}%`,top:`${Math.round(50+T*50)}%`}}function m(c,y){const T=y.x-c.x,ie=y.y-c.y;return Math.sqrt(T*T+ie*ie)}function v(c,y){const T=2*Math.atan2(y.y-c.y-m(c,y),y.x-c.x);return Math.abs(T*180/Math.PI)}function O(c){d.value===null&&(d.value=c),s.value=c,z(c)}function D(c){var Fe,Ue;if(c.preventDefault(),!a.value&&c.type!=="click"||!n.value)return;const{width:y,top:T,left:ie}=(Fe=n.value)==null?void 0:Fe.getBoundingClientRect(),{width:De}=((Ue=l.value)==null?void 0:Ue.getBoundingClientRect())??{width:0},{clientX:Ge,clientY:Xe}="touches"in c?c.touches[0]:c,Ie={x:y/2,y:-y/2},Me={x:Ge-ie,y:T-Xe},Ee=Math.round(v(Ie,Me)-e.rotate+360)%360,Pe=e.double&&m(Ie,Me)<(De+De*le.value)/4,Ze=Math.ceil(15/C.value);let re;for(let pe=0;pe<Ze;pe++)if(re=A(Ee+pe*C.value,Pe),J(re)||(re=A(Ee-pe*C.value,Pe),J(re)))return O(re)}function H(c){e.disabled||(c.preventDefault(),window.addEventListener("mousemove",D),window.addEventListener("touchmove",D),window.addEventListener("mouseup",K),window.addEventListener("touchend",K),d.value=null,s.value=null,a.value=!0,D(c))}function K(c){c.stopPropagation(),oe(),a.value=!1,s.value!==null&&J(s.value)&&i("change",s.value)}function oe(){window.removeEventListener("mousemove",D),window.removeEventListener("touchmove",D),window.removeEventListener("mouseup",K),window.removeEventListener("touchend",K)}Qe(oe),Ce(()=>g("div",{class:ne([{"v-time-picker-clock":!0,"v-time-picker-clock--indeterminate":e.modelValue==null,"v-time-picker-clock--readonly":e.readonly}]),onMousedown:H,onTouchstart:H,onWheel:X,ref:n},[g("div",{class:"v-time-picker-clock__inner",ref:l},[g("div",{class:ne([{"v-time-picker-clock__hand":!0,"v-time-picker-clock__hand--inner":Z(e.modelValue)},I.value]),style:Se([{transform:`rotate(${e.rotate+C.value*($.value-e.min)}deg) scaleY(${Y($.value)})`},M.value])},null),de.value.map(c=>{const y=c===$.value;return g("div",{class:ne([{"v-time-picker-clock__item":!0,"v-time-picker-clock__item--active":y,"v-time-picker-clock__item--disabled":e.disabled||!J(c)},y&&k.value]),style:Se([W(c),y&&h.value])},[g("span",null,[e.format(c)])])})])]))}}),Tt=he({active:Boolean,color:String,disabled:Boolean,label:String,modelValue:String,error:String,showHint:Boolean,readonly:Boolean},"VTimePickerField"),Ne=we()({name:"VTimePickerField",props:Tt(),emits:{"update:modelValue":e=>!0},setup(e,t){let{emit:i}=t;const{textColorClasses:n,textColorStyles:l}=$e(()=>e.color),u=_(),a=et(!1);function d(s){if(["Backspace","Delete"].includes(s.key)){s.preventDefault();const p=s.target;p.value="",i("update:modelValue",null)}}return Ce(()=>o(te,{ref:u,_as:"VTimePickerField",autocomplete:"off",class:ne(["v-time-picker-controls__time__field",{"v-time-picker-controls__time__field--active":e.active},e.active?n.value:[]]),style:Se(e.active?l.value:[]),disabled:e.disabled,variant:"solo-filled",inputmode:"numeric",hideDetails:"auto","aria-label":e.label,"aria-invalid":!!e.error,"aria-errormessage":e.error,error:!!e.error,hint:e.showHint?e.label:void 0,persistentHint:!0,flat:!0,modelValue:e.modelValue??(a.value?"":"--"),"onUpdate:modelValue":s=>i("update:modelValue",s),onKeydown:d,onFocus:()=>a.value=!0,onBlur:()=>a.value=!1},null)),rt({},u)}});function L(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2;return String(e).padStart(t,"0")}function qe(e){return e?(e-1)%12+1:12}function ve(e,t){return e%12+(t==="pm"?12:0)}function me(e){const t=e.replaceAll(/\D/g,"");return t.length>0?Number(t):null}function Vt(e,t,i){{if(e===23&&t)return{value:0};if(e===0&&!t)return{value:23}}return{value:e+(t?1:-1)}}function xt(e,t){return e===59&&t?0:e===0&&!t?59:e+(t?1:-1)}const Ye=he({allowedHours:[Function,Array],allowedMinutes:[Function,Array],allowedSeconds:[Function,Array],max:String,min:String},"time-validation");function We(e){const t=P(()=>{const u=e.min?Number(e.min.split(":")[0]):0,a=e.max?Number(e.max.split(":")[0]):23;return d=>d<u||d>a?!1:Array.isArray(e.allowedHours)?e.allowedHours.includes(d):typeof e.allowedHours=="function"?e.allowedHours(d):!0}),i=P(()=>{const[u,a]=e.min?e.min.split(":").map(Number):[0,0],[d,s]=e.max?e.max.split(":").map(Number):[23,59],p=u*60+a,I=d*60+s;return(M,k)=>{if(M!==null){const h=60*M+k;if(h<p||h>I)return!1}return Array.isArray(e.allowedMinutes)?e.allowedMinutes.includes(k):typeof e.allowedMinutes=="function"?e.allowedMinutes(k):!0}}),n=P(()=>{const[u,a,d]=e.min?e.min.split(":").map(Number):[0,0,0],[s,p,I]=e.max?e.max.split(":").map(Number):[23,59,59],M=u*3600+a*60+(d||0),k=s*3600+p*60+(I||0);return(h,N,S)=>{if(h!==null&&N!==null){const C=3600*h+60*N+S;if(C<M||C>k)return!1}return Array.isArray(e.allowedSeconds)?e.allowedSeconds.includes(S):typeof e.allowedSeconds=="function"?e.allowedSeconds(S):!0}});function l(u,a,d){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:null,p=arguments.length>4&&arguments[4]!==void 0?arguments[4]:null;const I=u==="hour"?t.value:u==="minute"?h=>i.value(s,h):h=>n.value(s,p,h),M=u==="hour"?h=>Vt(h,d).value:h=>xt(h,d),k=u==="hour"?24:60;for(let h=1;h<=k&&(a=M(a),!I(a));h++);return a}return{isAllowedHour:t,isAllowedMinute:i,isAllowedSecond:n,findNextAllowed:l}}const Nt=he({ampm:Boolean,color:String,disabled:Boolean,inputHints:Boolean,hour:[Number,String],minute:[Number,String],second:[Number,String],period:String,readonly:Boolean,useSeconds:Boolean,value:Number,viewMode:String,...Ye()},"VTimePickerControls"),ze=we()({name:"VTimePickerControls",props:Nt(),emits:{"update:period":e=>!0,"update:viewMode":e=>!0,"update:hour":e=>!0,"update:minute":e=>!0,"update:second":e=>!0},setup(e,t){let{emit:i}=t;const{t:n}=Ke(),{isAllowedHour:l,isAllowedMinute:u,isAllowedSecond:a,findNextAllowed:d}=We(e),s=P(()=>e.hour!==null?e.ampm?ve(Number(e.hour),e.period??"am"):Number(e.hour):null),p=P(()=>e.minute!==null?Number(e.minute):null),I=P(()=>{var m;return e.hour===null?!0:((m=l.value)==null?void 0:m.call(l,Number(s.value)))??!0}),M=P(()=>{var m;return e.minute===null?!0:((m=u.value)==null?void 0:m.call(u,s.value,Number(e.minute)))??!0}),k=P(()=>{var m;return e.second===null?!0:((m=a.value)==null?void 0:m.call(a,s.value,p.value,Number(e.second)))??!0}),h={in:m=>{if(m==null||isNaN(Number(m)))return null;const v=Number(m);return e.ampm?L(qe(v)):L(v)},out:m=>{if(isNaN(Number(m))||m==null||m==="")return null;const v=typeof m=="string"?me(m):Number(m);return v===null?null:e.ampm?ve(v,e.period??"am"):Re(v,0,23)}},N=ge(e,"hour",void 0,h.in,h.out),S={in:m=>m!=null&&!isNaN(Number(m))?L(`${m}`):null,out:m=>{if(isNaN(Number(m))||m==null||m==="")return null;const v=typeof m=="string"?me(m):Number(m);return v!==null?Re(v,0,59):null}},C=ge(e,"minute",void 0,S.in,S.out),j=ge(e,"second",void 0,S.in,S.out);function $(m){if(!["ArrowUp","ArrowDown"].includes(m.key))return;m.preventDefault(),m.stopPropagation();const v=e.period==="am",O=e.ampm?ve(Number(N.value??0),v?"am":"pm"):Number(N.value??0),D=d("hour",O,m.key==="ArrowUp"),H=v&&D>=12||!v&&D<12;e.ampm&&H?(i("update:period",e.period==="am"?"pm":"am"),Ae(()=>N.value=L(D))):N.value=L(D)}function le(m){if(!["ArrowUp","ArrowDown"].includes(m.key))return;m.preventDefault(),m.stopPropagation();const v=Number(C.value??0),O=d("minute",v,m.key==="ArrowUp",s.value);C.value=L(O)}function de(m){if(!["ArrowUp","ArrowDown"].includes(m.key))return;m.preventDefault(),m.stopPropagation();const v=Number(j.value??0),O=d("second",v,m.key==="ArrowUp",s.value,p.value);j.value=L(O)}function z(m,v,O){return D=>{if(!D.data)return;const H=D.target,{value:K,selectionStart:oe,selectionEnd:c}=H??{};if(me(D.data)===null){D.preventDefault();return}const y=K?K.slice(0,oe)+D.data+K.slice(c):D.data;if(y.length>2){if(oe===c&&c===0&&D.data.trim().startsWith("0")){D.preventDefault(),H.value=y.trim().substring(0,2),O(H.value),D.data.trim().length===1&&H.setSelectionRange(1,1);return}if(oe===c&&c===1&&K.startsWith("0")){D.preventDefault(),H.value=y.trim().substring(0,2),O(H.value);return}const ie=e.viewMode==="hour"?e.ampm?12:23:59;if(me(y)>ie){D.preventDefault(),H.value=L(String(me(D.data)).substring(0,2)),O(H.value);return}}const T=m(y);v(T)&&D.preventDefault()}}function J(m){i("update:period",m);const v=d("hour",m==="am"?23:11,!0);Ae(()=>N.value=L(v))}const X=_(),Z=_(),Y=_();ae(()=>e.viewMode,(m,v)=>{switch(v){case"hour":X.value.blur();break;case"minute":Z.value.blur();break;case"second":Y.value.blur();break}});const b=z(h.out,m=>h.in(m)===N.value,m=>N.value=m),A=z(S.out,m=>S.in(m)===C.value,m=>C.value=m),W=z(S.out,m=>S.in(m)===j.value,m=>j.value=m);return Ce(()=>g("div",{class:"v-time-picker-controls"},[g("div",{class:ne({"v-time-picker-controls__time":!0,"v-time-picker-controls__time--with-ampm":e.ampm,"v-time-picker-controls__time--with-seconds":e.useSeconds})},[o(Ne,{ref:X,active:e.viewMode==="hour",color:e.color,disabled:e.disabled,label:n("$vuetify.timePicker.hour"),showHint:e.inputHints,error:I.value?void 0:n("$vuetify.timePicker.notAllowed"),modelValue:N.value,"onUpdate:modelValue":m=>N.value=m,onKeydown:$,onBeforeinput:b,onFocus:()=>i("update:viewMode","hour")},null),g("span",{class:"v-time-picker-controls__time__separator"},[f(":")]),o(Ne,{ref:Z,active:e.viewMode==="minute",color:e.color,disabled:e.disabled,label:n("$vuetify.timePicker.minute"),showHint:e.inputHints,error:M.value?void 0:n("$vuetify.timePicker.notAllowed"),modelValue:C.value,"onUpdate:modelValue":m=>C.value=m,onKeydown:le,onBeforeinput:A,onFocus:()=>i("update:viewMode","minute")},null),e.useSeconds&&g("span",{key:"secondsDivider",class:"v-time-picker-controls__time__separator"},[f(":")]),e.useSeconds&&g(ce,null,[o(Ne,{key:"secondsVal",ref:Y,active:e.viewMode==="second",color:e.color,disabled:e.disabled,label:n("$vuetify.timePicker.second"),showHint:e.inputHints,error:k.value?void 0:n("$vuetify.timePicker.notAllowed"),modelValue:j.value,"onUpdate:modelValue":m=>j.value=m,onKeydown:de,onBeforeinput:W,onFocus:()=>i("update:viewMode","second")},null)]),e.ampm&&g("div",{class:"v-time-picker-controls__ampm"},[o(x,{active:e.period==="am",color:e.period==="am"?e.color:void 0,class:ne({"v-time-picker-controls__ampm__am":!0,"v-time-picker-controls__ampm__btn":!0,"v-time-picker-controls__ampm__btn__active":e.period==="am"}),disabled:e.disabled,text:n("$vuetify.timePicker.am"),variant:e.disabled&&e.period==="am"?"elevated":"tonal",onClick:()=>e.period!=="am"?J("am"):null},null),o(x,{active:e.period==="pm",color:e.period==="pm"?e.color:void 0,class:ne({"v-time-picker-controls__ampm__pm":!0,"v-time-picker-controls__ampm__btn":!0,"v-time-picker-controls__ampm__btn__active":e.period==="pm"}),disabled:e.disabled,text:n("$vuetify.timePicker.pm"),variant:e.disabled&&e.period==="pm"?"elevated":"tonal",onClick:()=>e.period!=="pm"?J("pm"):null},null)])])])),{}}}),St=he({disabled:Boolean,format:{type:String,default:"ampm"},viewMode:{type:String,default:"hour"},period:{type:String,default:"am",validator:e=>["am","pm"].includes(e)},modelValue:null,readonly:Boolean,scrollable:Boolean,useSeconds:Boolean,variant:{type:String,default:"dial"},...Ye(),..._e(Ct({title:"$vuetify.timePicker.title"}),["landscape"]),...ut()},"VTimePicker"),Je=we()({name:"VTimePicker",props:St(),emits:{"update:hour":e=>!0,"update:minute":e=>!0,"update:period":e=>!0,"update:second":e=>!0,"update:modelValue":e=>!0,"update:viewMode":e=>!0},setup(e,t){let{emit:i,slots:n}=t;const{t:l}=Ke(),{densityClasses:u}=st(e),a=_(null),d=_(null),s=_(null),p=_(null),I=_(null),M=_(null),k=ge(e,"period","am"),h=ge(e,"viewMode","hour"),N=_(null),S=_(null),C=P(()=>e.format==="ampm"),{isAllowedHour:j,isAllowedMinute:$,isAllowedSecond:le}=We(e),de=at(()=>e.modelValue!==null&&a.value===null&&d.value===null&&(!e.useSeconds||s.value===null));function z(){const b=J();b!==null&&b!==e.modelValue&&i("update:modelValue",b),de.value&&i("update:modelValue",null)}ae(a,z),ae(d,z),ae(s,z),ae(()=>e.modelValue,b=>X(b)),ae(()=>e.useSeconds,(b,A)=>{A&&!b&&h.value==="second"&&(h.value="minute"),!b&&s.value!==null&&(s.value=null)}),tt(()=>{X(e.modelValue)});function J(){return a.value!=null&&d.value!=null&&(!e.useSeconds||s.value!=null)?`${L(a.value)}:${L(d.value)}`+(e.useSeconds?`:${L(s.value)}`:""):null}function X(b){if(b==null||b==="")a.value=null,d.value=null,s.value=null;else if(b instanceof Date)a.value=b.getHours(),d.value=b.getMinutes(),s.value=b.getSeconds();else{const[A,,W,,m,v]=b.trim().toLowerCase().match(/^(\d+):(\d+)(:(\d+))?([ap]m)?$/)||new Array(6);a.value=v?ve(parseInt(A,10),v):parseInt(A,10),d.value=parseInt(W,10),s.value=parseInt(m||0,10)}k.value=a.value==null||a.value<12?"am":"pm"}function Z(b){h.value==="hour"?a.value=C.value?ve(b,k.value):b:h.value==="minute"?d.value=b:s.value=b}function Y(b){switch(h.value||"hour"){case"hour":i("update:hour",b);break;case"minute":i("update:minute",b);break;case"second":i("update:second",b);break}const A=a.value!==null&&d.value!==null&&(e.useSeconds?s.value!==null:!0);h.value==="hour"?h.value="minute":e.useSeconds&&h.value==="minute"&&(h.value="second"),!(a.value===p.value&&d.value===I.value&&(!e.useSeconds||s.value===M.value)||J()===null)&&(p.value=a.value,I.value=d.value,e.useSeconds&&(M.value=s.value),A&&z())}Ce(()=>{const b=_e(Le.filterProps(e),["hideHeader"]),A=ze.filterProps(e),W=je.filterProps(_e(e,["format","modelValue","min","max"])),m=h.value==="hour"?j.value:h.value==="minute"?v=>$.value(a.value,v):v=>le.value(a.value,d.value,v);return o(Le,fe(b,{color:void 0,class:["v-time-picker",`v-time-picker--variant-${e.variant}`,e.class,u.value],hideHeader:e.hideHeader&&e.variant!=="input",style:e.style}),{title:()=>{var v;return((v=n.title)==null?void 0:v.call(n))??g("div",{class:"v-time-picker__title"},[l(e.title)])},header:()=>o(ze,fe(A,{ampm:C.value,hour:a.value,minute:d.value,period:k.value,second:s.value,viewMode:h.value,inputHints:e.variant==="input","onUpdate:hour":v=>a.value=v,"onUpdate:minute":v=>d.value=v,"onUpdate:second":v=>s.value=v,"onUpdate:period":v=>k.value=v,"onUpdate:viewMode":v=>h.value=v,ref:N}),null),default:()=>o(je,fe(W,{allowedValues:m,double:h.value==="hour"&&!C.value,format:h.value==="hour"?C.value?qe:v=>v:v=>L(v,2),max:h.value==="hour"?C.value&&k.value==="am"?11:23:59,min:h.value==="hour"&&C.value&&k.value==="pm"?12:0,size:20,step:h.value==="hour"?1:5,modelValue:h.value==="hour"?a.value:h.value==="minute"?d.value:s.value,onChange:Y,onInput:Z,ref:S}),null),actions:n.actions})})}}),_t={name:"ExamConfigEditor",props:{configId:{type:String,required:!0},dialogMode:{type:Boolean,default:!1}},emits:["saved","error","opened","deleted"],data(){return{localConfig:{examName:"",message:"",room:"",examInfos:[]},loading:!1,saving:!1,deleting:!1,deleteDialog:!1,error:"",success:"",isEditMode:!1,showJsonPreview:!1,availableSubjects:[],customSubjectInput:"",enableCustomAlertTime:!1,defaultExamTips:["请保持卷面整洁,字迹清晰,诚信应考。在听到终考铃时立刻起立,停止作答。","沉着 冷静 细心 守记","答题不守记,自己两行泪。"]}},computed:{formattedJson(){try{return JSON.stringify(this.localConfig,null,2)}catch(e){return console.error("格式化JSON时出错:",e),"无效的JSON格式"}},formattedStorageJson(){try{const e={examName:this.localConfig.examName,message:this.localConfig.message,room:this.localConfig.room,examInfos:this.localConfig.examInfos.map(t=>({name:t.name,start:this.formatDisplayDateTime(t.start),end:this.formatDisplayDateTime(t.end),alertTime:parseInt(t.alertTime)||15}))};return JSON.stringify(e,null,2)}catch(e){return console.error("格式化存储JSON时出错:",e),"无效的JSON格式"}},isValidConfig(){return this.localConfig.examName&&this.localConfig.message&&this.localConfig.examInfos&&this.localConfig.examInfos.length>0&&this.localConfig.examInfos.every(e=>e.name&&e.start&&e.end)},validationErrors(){const e=[];if((!this.localConfig.examName||this.localConfig.examName.trim()==="")&&e.push("考试名称不能为空"),(!this.localConfig.message||this.localConfig.message.trim()==="")&&e.push("考试提示不能为空"),!this.localConfig.examInfos||this.localConfig.examInfos.length===0)e.push("至少需要添加一个考试科目");else{this.localConfig.examInfos.forEach((t,i)=>{const n=`第${i+1}个科目`;if((!t.name||t.name.trim()==="")&&e.push(`${n}的名称不能为空`),t.start||e.push(`${n}的开始时间不能为空`),t.end||e.push(`${n}的结束时间不能为空`),t.start&&t.end){const l=new Date(t.start),u=new Date(t.end);isNaN(l.getTime())&&e.push(`${n}的开始时间格式不正确`),isNaN(u.getTime())&&e.push(`${n}的结束时间格式不正确`),!isNaN(l.getTime())&&!isNaN(u.getTime())&&(u<=l&&e.push(`${n}的结束时间必须晚于开始时间`),(u-l)/(1e3*60*60)>24&&e.push(`${n}的考试时长不能超过24小时`))}});for(let t=0;t<this.localConfig.examInfos.length;t++)for(let i=t+1;i<this.localConfig.examInfos.length;i++){const n=this.localConfig.examInfos[t],l=this.localConfig.examInfos[i];if(n.start&&n.end&&l.start&&l.end){const u=new Date(n.start),a=new Date(n.end),d=new Date(l.start),s=new Date(l.end);!isNaN(u.getTime())&&!isNaN(a.getTime())&&!isNaN(d.getTime())&&!isNaN(s.getTime())&&u<s&&a>d&&e.push(`第${t+1}个科目与第${i+1}个科目的时间有重叠`)}}}return e},hasValidationErrors(){return this.validationErrors.length>0}},watch:{configId:{immediate:!0,handler(e){e&&this.loadConfig()}}},created(){this.loadSubjects()},methods:{async loadSubjects(){try{const e=await Q.loadData("classworks-config-subject");e&&Array.isArray(e)?this.availableSubjects=e.sort((t,i)=>(t.order??0)-(i.order??0)).map(t=>({name:t.name,order:t.order??0})):this.availableSubjects=[{name:"语文",order:0},{name:"数学",order:1},{name:"英语",order:2},{name:"物理",order:3},{name:"化学",order:4},{name:"生物",order:5},{name:"政治",order:6},{name:"历史",order:7},{name:"地理",order:8}]}catch(e){console.warn("加载科目列表失败,使用默认列表:",e),this.availableSubjects=[{name:"语文",order:0},{name:"数学",order:1},{name:"英语",order:2},{name:"物理",order:3},{name:"化学",order:4},{name:"生物",order:5},{name:"政治",order:6},{name:"历史",order:7},{name:"地理",order:8}]}},autoFillRemaining(){if(this.localConfig.examInfos.length===0)return;let e=null;for(let t=this.localConfig.examInfos.length-1;t>=0;t--)if(this.localConfig.examInfos[t].end){e=new Date(this.localConfig.examInfos[t].end);break}e||(e=new Date);for(let t=0;t<this.localConfig.examInfos.length;t++){const i=this.localConfig.examInfos[t];if(i.end){e=new Date(i.end);continue}const n=new Date(e.getTime()+10*60*1e3),l=new Date(n.getTime()+2*60*60*1e3);i.start=this.formatDateTimeLocal(n),i.startDate=n,i.startTime=this.formatTimeOnly(n),i.startFormatted=this.formatDisplayDateTime(n),i.end=this.formatDateTimeLocal(l),i.endDate=l,i.endTime=this.formatTimeOnly(l),i.endFormatted=this.formatDisplayDateTime(l),e=l}this.success="已自动填充所有科目的时间(间隔10分钟)"},validateTimeFormat(e,t){if(!e)return!0;const i=e.match(/(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s+(\d{1,2}):(\d{1,2})/);if(!i)return`${t}格式不正确,请使用格式:2025/01/01 09:00`;const[,n,l,u,a,d]=i,s=parseInt(n),p=parseInt(l),I=parseInt(u),M=parseInt(a),k=parseInt(d);if(p<1||p>12)return`${t}月份不合法(1-12)`;if(I<1||I>31)return`${t}日期不合法(1-31)`;if(M<0||M>23)return`${t}小时不合法(0-23)`;if(k<0||k>59)return`${t}分钟不合法(0-59)`;const h=new Date(s,p-1,I,M,k);return isNaN(h.getTime())?`${t}日期不存在`:h.getMonth()!==p-1||h.getDate()!==I?`${t}日期不存在`:!0},validateEndAfterStart(e){if(!e.startFormatted||!e.endFormatted)return!0;try{const t=new Date(e.start||e.startFormatted.replace(/\//g,"-")),i=new Date(e.end||e.endFormatted.replace(/\//g,"-"));return isNaN(t.getTime())||isNaN(i.getTime())?!0:i<=t?"结束时间必须晚于开始时间":(i.getTime()-t.getTime())/(1e3*60*60)>24?"考试时长不能超过24小时":!0}catch{return!0}},validateNoTimeOverlap(e,t){if(!e.startFormatted||!e.endFormatted)return!0;try{const i=new Date(e.start||e.startFormatted.replace(/\//g,"-")),n=new Date(e.end||e.endFormatted.replace(/\//g,"-"));if(isNaN(i.getTime())||isNaN(n.getTime()))return!0;for(let l=0;l<this.localConfig.examInfos.length;l++){if(l===t)continue;const u=this.localConfig.examInfos[l];if(!u.start||!u.end)continue;const a=new Date(u.start),d=new Date(u.end);if(isNaN(a.getTime())||isNaN(d.getTime()))continue;if(i>=a&&i<d||n>a&&n<=d||i<=a&&n>=d)return`时间与"${u.name||`第${l+1}个科目`}"重叠`}return!0}catch{return!0}},toggleAlertTimeMode(){this.enableCustomAlertTime||this.localConfig.examInfos.forEach(e=>{e.alertTime=15})},getExamDuration(e){if(!e.start||!e.end)return"";try{const t=new Date(e.start),i=new Date(e.end);if(isNaN(t.getTime())||isNaN(i.getTime()))return"";const n=i.getTime()-t.getTime(),l=Math.round(n/(1e3*60));if(l<60)return`${l}分钟`;const u=Math.floor(l/60),a=l%60;return a===0?`${u}小时`:`${u}小时${a}分钟`}catch{return""}},updateStartDateTimeFromInput(e){if(e===void 0||!this.localConfig.examInfos[e])return;const t=this.localConfig.examInfos[e],i=t.startFormatted;if(!i)return;const n=i.match(/(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s+(\d{1,2}):(\d{1,2})/);if(!n)return;const[,l,u,a,d,s]=n,p=new Date(parseInt(l),parseInt(u)-1,parseInt(a),parseInt(d),parseInt(s));isNaN(p.getTime())||(t.startDate=p,t.startTime=this.formatTimeOnly(p),t.start=this.formatDateTimeLocal(p),this.updateStartDateTime(e))},updateEndDateTimeFromInput(e){if(e===void 0||!this.localConfig.examInfos[e])return;const t=this.localConfig.examInfos[e],i=t.endFormatted;if(!i)return;const n=i.match(/(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})\s+(\d{1,2}):(\d{1,2})/);if(!n)return;const[,l,u,a,d,s]=n,p=new Date(parseInt(l),parseInt(u)-1,parseInt(a),parseInt(d),parseInt(s));isNaN(p.getTime())||(t.endDate=p,t.endTime=this.formatTimeOnly(p),t.end=this.formatDateTimeLocal(p),this.updateEndDateTime(e))},async loadConfig(){var e;this.loading=!0,this.error="";try{const t=await Q.loadData(`es_${this.configId}`);if(t){this.localConfig={examName:"",message:"",room:"",examInfos:[],...t},Array.isArray(this.localConfig.examInfos)||(this.localConfig.examInfos=[]),this.localConfig.examInfos.forEach(n=>{if(n.start){const l=this.parseDateTime(n.start);n.start=this.formatDateTimeLocal(l),n.startDate=l,n.startTime=this.formatTimeOnly(l),n.startFormatted=this.formatDisplayDateTime(l),n.startDateMenu=!1}if(n.end){const l=this.parseDateTime(n.end);n.end=this.formatDateTimeLocal(l),n.endDate=l,n.endTime=this.formatTimeOnly(l),n.endFormatted=this.formatDisplayDateTime(l),n.endDateMenu=!1}try{if(n.start&&n.end){const l=new Date(n.start),u=new Date(n.end),a=Math.round((u.getTime()-l.getTime())/(1e3*60));a>0&&a<=24*60?n.durationMinutes=a:n.durationMinutes=120}else n.durationMinutes=120}catch{n.durationMinutes=120}n.alertTime===void 0||n.alertTime===null?n.alertTime=15:n.alertTime=parseInt(n.alertTime)||15});const i=this.localConfig.examInfos.some(n=>n.alertTime!==15);this.enableCustomAlertTime=i}else console.error("加载配置失败:",t),this.error="加载配置失败: "+(((e=t.error)==null?void 0:e.message)||"未知错误"),this.$emit("error",this.error)}catch(t){console.error(t),this.error="加载配置失败: "+t.message,this.$emit("error",this.error)}finally{this.loading=!1}},async saveConfig(){var e;if(!this.isValidConfig){const t=this.validationErrors;return t.length>0?this.error=`配置验证失败:${t.join(";")}`:this.error="请填写完整的配置信息",!1}this.saving=!0,this.error="";try{const t={examName:this.localConfig.examName,message:this.localConfig.message,room:this.localConfig.room,examInfos:this.localConfig.examInfos.map(n=>({name:n.name,start:this.formatDisplayDateTime(n.start),end:this.formatDisplayDateTime(n.end),alertTime:parseInt(n.alertTime)||15}))},i=await Q.saveData(`es_${this.configId}`,t);return i?(this.success="配置保存成功",this.$emit("saved",t),!0):(this.error="保存配置失败: "+(((e=i.error)==null?void 0:e.message)||"未知错误"),this.$emit("error",this.error),!1)}catch(t){return this.error="保存配置失败: "+t,this.$emit("error",this.error),!1}finally{this.saving=!1}},addExamInfo(){let e=new Date;if(this.localConfig.examInfos.length>0){const l=this.localConfig.examInfos[this.localConfig.examInfos.length-1];l.end&&(e=new Date(l.end))}const t=new Date(e.getTime()+10*60*1e3),i=new Date(t.getTime()+2*60*60*1e3),n={name:"",start:this.formatDateTimeLocal(t),end:this.formatDateTimeLocal(i),durationMinutes:120,alertTime:15,startDate:t,startTime:this.formatTimeOnly(t),startFormatted:this.formatDisplayDateTime(t),startDateMenu:!1,endDate:i,endTime:this.formatTimeOnly(i),endFormatted:this.formatDisplayDateTime(i),endDateMenu:!1};this.localConfig.examInfos.push(n)},removeExamInfo(e){this.localConfig.examInfos.splice(e,1)},moveExamInfo(e,t){const i=e+t;if(i>=0&&i<this.localConfig.examInfos.length){const n=this.localConfig.examInfos.splice(e,1)[0];this.localConfig.examInfos.splice(i,0,n)}},async copyToClipboard(){try{await navigator.clipboard.writeText(this.formattedStorageJson),this.$message.success("配置已复制到剪贴板")}catch(e){this.error="复制失败: "+e.message}},downloadAsJson(){var e;try{const t=new Blob([this.formattedStorageJson],{type:"application/json"}),i=URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download=`${this.localConfig.examName||"exam-config"}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i),(e=this.$message)==null||e.success("已下载 JSON 文件")}catch(t){this.error="下载失败: "+t.message}},downloadAsEa2(){var e;try{const t=new Blob([this.formattedStorageJson],{type:"application/json"}),i=URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download=`${this.localConfig.examName||"exam-config"}.ea2`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i),(e=this.$message)==null||e.success("已下载 ExamAware2 知试 (.ea2)文件")}catch(t){this.error="下载失败: "+t.message}},async copyConfigUrl(){try{const e=await Q.getKeyCloudUrl(`es_${this.configId}`,{autoMigrate:!0,autoConfig:!0});if(e.success&&e.url)await navigator.clipboard.writeText(e.url),this.$message.success("云端地址已复制到剪贴板");else throw new Error(e.error||"获取云端地址失败")}catch(e){this.error="复制链接失败: "+e.message}},toggleEditMode(){this.isEditMode=!this.isEditMode,this.error="",this.success=""},quickEdit(){this.isEditMode=!0,this.error="",this.success=""},selectDefaultTip(e){this.localConfig.message&&this.localConfig.message.trim()!==""?this.localConfig.message+=`
|
||
`+e:this.localConfig.message=e},durationHint(e){const t=parseInt(e==null?void 0:e.durationMinutes);if(isNaN(t)||t<=0)return"";if(t<60)return`${t} 分钟`;const i=Math.floor(t/60),n=t%60;return n===0?`${i} 小时`:`${i} 小时 ${n} 分钟`},updateDurationFromInput(e){const t=this.localConfig.examInfos[e];let i=parseInt(t.durationMinutes);if((isNaN(i)||i<=0)&&(i=120),i>24*60&&(i=24*60),t.durationMinutes=i,(!t.startDate||!t.startTime)&&t.start){const n=new Date(t.start);isNaN(n.getTime())||(t.startDate=n,t.startTime=this.formatTimeOnly(n))}if(t.startDate&&t.startTime){const n=new Date(t.startDate),[l,u]=String(t.startTime).split(":");n.setHours(parseInt(l),parseInt(u),0,0);const a=new Date(n.getTime()+i*60*1e3);t.endDate=a,t.endTime=this.formatTimeOnly(a),t.end=this.formatDateTimeLocal(a),t.endFormatted=this.formatDisplayDateTime(a)}},formatDateTimeLocal(e){if(!e)return"";let t;if(typeof e=="string"?e.includes("/")?t=new Date(e.replace(/\//g,"-")):t=new Date(e):t=new Date(e),isNaN(t.getTime()))return"";const i=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0"),u=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0");return`${i}-${n}-${l}T${u}:${a}`},formatDisplayDateTime(e){if(!e)return"";const t=new Date(e);if(isNaN(t.getTime()))return e;const i=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0"),u=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0");return`${i}/${n}/${l} ${u}:${a}`},parseDateTime(e){return e?typeof e=="string"?e.includes("/")?new Date(e.replace(/\//g,"-")):new Date(e):new Date(e):new Date},formatTimeOnly(e){if(!e)return"00:00";const t=new Date(e);if(isNaN(t.getTime()))return"00:00";const i=String(t.getHours()).padStart(2,"0"),n=String(t.getMinutes()).padStart(2,"0");return`${i}:${n}`},updateStartDateTime(e){const t=this.localConfig.examInfos[e];if(!t.startDate||!t.startTime)return;const i=new Date(t.startDate),[n,l]=t.startTime.split(":");i.setHours(parseInt(n),parseInt(l),0,0),t.start=this.formatDateTimeLocal(i),t.startFormatted=this.formatDisplayDateTime(i);let u=parseInt(t.durationMinutes);if(isNaN(u)||u<=0||u>24*60)try{let d=null;if(t.endDate&&t.endTime){d=new Date(t.endDate);const[s,p]=String(t.endTime).split(":");d.setHours(parseInt(s),parseInt(p),0,0)}else t.end&&(d=new Date(t.end));if(d&&!isNaN(d.getTime())){const s=Math.round((d.getTime()-i.getTime())/6e4);s>0&&s<=24*60&&(u=s)}}catch{}(isNaN(u)||u<=0||u>24*60)&&(u=120);const a=new Date(i.getTime()+u*60*1e3);t.endDate=a,t.endTime=this.formatTimeOnly(a),t.end=this.formatDateTimeLocal(a),t.endFormatted=this.formatDisplayDateTime(a),t.durationMinutes=u},updateEndDateTime(e){const t=this.localConfig.examInfos[e];if(!t.endDate||!t.endTime)return;const i=new Date(t.endDate),[n,l]=t.endTime.split(":");i.setHours(parseInt(n),parseInt(l),0,0),t.end=this.formatDateTimeLocal(i),t.endFormatted=this.formatDisplayDateTime(i);try{if(t.startDate&&t.startTime){const u=new Date(t.startDate),[a,d]=String(t.startTime).split(":");u.setHours(parseInt(a),parseInt(d),0,0);const s=Math.round((i.getTime()-u.getTime())/(1e3*60));s>0&&s<=24*60&&(t.durationMinutes=s)}}catch{}},async openConfig(){try{const e=await Q.getKeyCloudUrl(`es_${this.configId}`,{autoMigrate:!0,autoConfig:!0});if(e.success&&e.url){const t=`https://es.examaware.cn/exam/?configUrl=${encodeURIComponent(e.url)}`;window.open(t,"_blank"),this.success="配置已在新窗口中打开",this.$emit("opened",{configId:this.configId,url:e.url})}else throw new Error(e.error||"获取云端地址失败")}catch(e){this.error="打开配置失败: "+e.message,this.$emit("error","打开配置失败: "+e.message)}},confirmDelete(){this.deleteDialog=!0},async deleteConfig(){this.deleting=!0;try{const i=(await Q.loadData("es_list")||[]).filter(l=>l.id!==this.configId);if(!await Q.saveData("es_list",i))throw new Error("更新云端列表失败");this.deleteDialog=!1,this.$emit("deleted",{success:!0,message:"配置删除成功",configId:this.configId})}catch(e){console.error("删除配置失败:",e),this.$emit("deleted",{success:!1,message:"删除失败: "+e.message})}finally{this.deleting=!1}},openInEa2Player(){var e;try{const t={examName:this.localConfig.examName,message:this.localConfig.message,room:this.localConfig.room,examInfos:this.localConfig.examInfos.map(u=>({name:u.name,start:this.formatDisplayDateTime(u.start),end:this.formatDisplayDateTime(u.end),alertTime:parseInt(u.alertTime)||15}))},i=JSON.stringify(t),n=btoa(unescape(encodeURIComponent(i))),l=`examaware://player?data=${encodeURIComponent(n)}`;window.location.href=l,(e=this.$message)==null||e.success("正在拉起 ExamAware2 播放器...")}catch(t){this.error="拉起播放器失败: "+t.message}}}},It={class:"d-flex align-center"},Mt={class:"d-flex align-center"},Et={key:4,class:"d-flex justify-space-between align-center mb-4"},Pt={class:"d-flex align-center gap-2"},Ft={key:5},Ut={class:"mb-8"},At={class:"text-h3 font-weight-bold",style:{"line-height":"1.2"}},Ht={class:"text-subtitle-1 text-grey",style:{"white-space":"pre-wrap","line-height":"1.8"}},Bt={key:0,class:"mb-8"},Lt={class:"d-flex align-center"},Ot={class:""},Rt={class:"mb-3"},jt={class:"d-flex align-center mb-1"},zt={class:"text-h6 font-weight-medium text-success"},Jt={class:"d-flex align-center mb-1"},$t={class:"text-h6 font-weight-medium text-error"},Kt={key:1,class:"text-center py-12"},qt={class:"json-preview"},Yt={key:6},Wt={class:"text-subtitle-2 font-weight-bold d-block mb-2"},Gt={key:0,class:"mt-3"},Xt={class:"text-caption text-medium-emphasis mt-2 ml-2"},Zt={class:"d-flex align-center mr-4"},Qt={class:"w-100"},ea={class:"d-flex align-center mb-3"},ta={class:"d-flex gap-1"},aa={class:"text-primary font-weight-bold"},na={key:1,class:"text-center py-12"};function la(e,t,i,n,l,u){return w(),R("div",null,[l.error?(w(),E(Ve,{key:0,border:"start",class:"mb-4 mt-3 mx-2",closable:"",type:"error",variant:"tonal","onClick:close":t[0]||(t[0]=a=>l.error="")},{default:r(()=>[g("div",It,[o(V,{class:"mr-2"},{default:r(()=>[...t[10]||(t[10]=[f("mdi-alert-circle",-1)])]),_:1}),f(" "+F(l.error),1)])]),_:1})):U("",!0),l.success?(w(),E(Ve,{key:1,border:"start",class:"mb-4 mt-3 mx-2",closable:"",type:"success",variant:"tonal","onClick:close":t[1]||(t[1]=a=>l.success="")},{default:r(()=>[g("div",Mt,[o(V,{class:"mr-2"},{default:r(()=>[...t[11]||(t[11]=[f("mdi-check-circle",-1)])]),_:1}),f(" "+F(l.success),1)])]),_:1})):U("",!0),u.hasValidationErrors&&!l.loading?(w(),E(Ve,{key:2,border:"start",class:"mb-4 mt-3 mx-2",type:"warning",variant:"tonal"},{default:r(()=>[t[13]||(t[13]=g("div",{class:"d-flex align-center"},[g("span",{class:"font-weight-bold"},"配置验证失败,请检查以下问题:")],-1)),o(He,{class:"bg-transparent",density:"compact"},{default:r(()=>[(w(!0),R(ce,null,ye(u.validationErrors,(a,d)=>(w(),E(ke,{key:d,class:"px-0 py-0"},{prepend:r(()=>[o(V,{color:"warning",size:"small"},{default:r(()=>[...t[12]||(t[12]=[f("mdi-circle-small",-1)])]),_:1})]),default:r(()=>[o(mt,{class:"text-body-2"},{default:r(()=>[f(F(a),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})):U("",!0),l.loading?(w(),E(q,{key:3,class:"my-4",outlined:""},{default:r(()=>[o(G,null,{default:r(()=>[o(ht,{class:"mx-auto",type:"article"})]),_:1})]),_:1})):U("",!0),l.loading?U("",!0):(w(),R("div",Et,[g("div",Pt,[o(x,{disabled:!u.isValidConfig,class:"text-none",color:"success","prepend-icon":"mdi-open-in-new",variant:"elevated",onClick:u.openConfig},{default:r(()=>[...t[14]||(t[14]=[f(" 打开 ExamSchedule ",-1)])]),_:1},8,["disabled","onClick"]),o(x,{disabled:!u.isValidConfig,class:"text-none",color:"primary","prepend-icon":"mdi-link-variant",variant:"elevated",onClick:u.copyConfigUrl},{default:r(()=>[...t[15]||(t[15]=[f(" 复制远程链接 ",-1)])]),_:1},8,["disabled","onClick"]),o(x,{disabled:!u.isValidConfig,class:"text-none",color:"primary","prepend-icon":"mdi-download",variant:"elevated",onClick:u.downloadAsJson},{default:r(()=>[...t[16]||(t[16]=[f(" JSON 文件 ",-1)])]),_:1},8,["disabled","onClick"]),o(x,{disabled:!u.isValidConfig,class:"text-none",color:"primary","prepend-icon":"mdi-download",variant:"elevated",onClick:u.downloadAsEa2},{default:r(()=>[...t[17]||(t[17]=[f(" .ea2 文件 ",-1)])]),_:1},8,["disabled","onClick"]),o(x,{disabled:!u.isValidConfig,class:"text-none",color:"secondary","prepend-icon":"mdi-play-circle",variant:"elevated",onClick:u.openInEa2Player},{default:r(()=>[...t[18]||(t[18]=[f(" 拉起EA2播放器 ",-1)])]),_:1},8,["disabled","onClick"]),u.isValidConfig?U("",!0):(w(),E(be,{key:0,activator:"parent",location:"bottom"},{default:r(()=>[...t[19]||(t[19]=[g("span",null,"请先完善配置信息后再操作",-1)])]),_:1}))]),o(ct,{modelValue:l.isEditMode,"onUpdate:modelValue":t[2]||(t[2]=a=>l.isEditMode=a),color:"primary",divided:"",variant:"outlined"},{default:r(()=>[o(x,{class:"text-error","prepend-icon":"mdi-delete",onClick:u.confirmDelete},{default:r(()=>[...t[20]||(t[20]=[f(" 删除配置 ",-1)])]),_:1},8,["onClick"]),o(x,{value:!1,"prepend-icon":"mdi-eye"},{default:r(()=>[...t[21]||(t[21]=[f(" 预览",-1)])]),_:1}),o(x,{value:!0,"prepend-icon":"mdi-pencil"},{default:r(()=>[...t[22]||(t[22]=[f(" 编辑",-1)])]),_:1})]),_:1},8,["modelValue"])])),!l.loading&&!l.isEditMode?(w(),R("div",Ft,[g("div",Ut,[g("div",At,F(l.localConfig.examName||"未设置考试名称"),1),g("div",Ht,F(l.localConfig.message||"未设置考试提示"),1),l.localConfig.room?(w(),E(xe,{key:0,class:"px-4 py-2",size:"large"},{default:r(()=>[o(V,{start:""},{default:r(()=>[...t[23]||(t[23]=[f("mdi-home",-1)])]),_:1}),f(" 考场:"+F(l.localConfig.room),1)]),_:1})):U("",!0)]),l.localConfig.examInfos&&l.localConfig.examInfos.length>0?(w(),R("div",Bt,[o(ue,null,{default:r(()=>[(w(!0),R(ce,null,ye(l.localConfig.examInfos,(a,d)=>(w(),E(B,{key:d,cols:"12",lg:"4",md:"6"},{default:r(()=>[o(q,{class:"h-100",hover:"",variant:"tonal"},{default:r(()=>[o(ee,{class:"bg-primary-lighten-5 pa-4"},{default:r(()=>[g("div",Lt,[o(V,{class:"mr-2"},{default:r(()=>[...t[24]||(t[24]=[f("mdi-book-open-page-variant",-1)])]),_:1}),g("span",Ot,F(a.name||"未设置科目"),1)])]),_:2},1024),o(G,{class:"pa-4"},{default:r(()=>[g("div",Rt,[g("div",jt,[o(V,{class:"mr-2",color:"success",size:"small"},{default:r(()=>[...t[25]||(t[25]=[f("mdi-clock-start ",-1)])]),_:1}),t[26]||(t[26]=g("span",{class:"text-body-2 text-grey-darken-1"},"开始时间",-1))]),g("div",zt,F(a.startFormatted||a.start||"未设置"),1)]),g("div",null,[g("div",Jt,[o(V,{class:"mr-2",color:"error",size:"small"},{default:r(()=>[...t[27]||(t[27]=[f("mdi-clock-end ",-1)])]),_:1}),t[28]||(t[28]=g("span",{class:"text-body-2 text-grey-darken-1"},"结束时间",-1))]),g("div",$t,F(a.endFormatted||a.end||"未设置"),1)])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):(w(),R("div",Kt,[o(V,{class:"mb-4",color:"grey-lighten-2",size:"80"},{default:r(()=>[...t[29]||(t[29]=[f(" mdi-calendar-blank ",-1)])]),_:1}),t[32]||(t[32]=g("div",{class:"text-h5 text-grey-darken-1 mb-2"},"暂无考试科目安排",-1)),t[33]||(t[33]=g("div",{class:"text-body-1 text-grey mb-4"},' 点击上方"添加科目"按钮开始配置考试时间表 ',-1)),o(x,{color:"primary",variant:"outlined",onClick:u.quickEdit},{default:r(()=>[o(V,{start:""},{default:r(()=>[...t[30]||(t[30]=[f("mdi-plus",-1)])]),_:1}),t[31]||(t[31]=f(" 立即添加 ",-1))]),_:1},8,["onClick"])])),o(q,{border:"",class:"mb-4",elevation:"2"},{default:r(()=>[o(ee,{class:"d-flex align-center text-white cursor-pointer",onClick:t[3]||(t[3]=a=>l.showJsonPreview=!l.showJsonPreview)},{default:r(()=>[o(V,{class:"mr-2"},{default:r(()=>[...t[34]||(t[34]=[f("mdi-code-json",-1)])]),_:1}),t[36]||(t[36]=f(" 配置预览 ",-1)),o(se),o(x,{color:"white","prepend-icon":"mdi-content-copy",size:"small",variant:"outlined",onClick:nt(u.copyToClipboard,["stop"])},{default:r(()=>[...t[35]||(t[35]=[f(" 复制 ",-1)])]),_:1},8,["onClick"]),o(x,{icon:l.showJsonPreview?"mdi-chevron-up":"mdi-chevron-down",class:"ml-2",color:"white",size:"small",variant:"text"},null,8,["icon"])]),_:1}),o(ft,null,{default:r(()=>[lt(o(G,{class:"pa-4"},{default:r(()=>[o(q,{class:"pa-4",variant:"tonal"},{default:r(()=>[g("pre",qt,[g("code",null,F(u.formattedStorageJson),1)])]),_:1})]),_:1},512),[[ot,l.showJsonPreview]])]),_:1})]),_:1})])):U("",!0),!l.loading&&l.isEditMode?(w(),R("div",Yt,[o(q,{border:"",class:"mb-4",elevation:"1"},{default:r(()=>[o(ee,{class:"d-flex align-center bg-primary-lighten-5 pa-4"},{default:r(()=>[o(V,{class:"mr-2"},{default:r(()=>[...t[37]||(t[37]=[f("mdi-information",-1)])]),_:1}),t[38]||(t[38]=g("span",{class:"font-weight-bold"},"基本信息",-1))]),_:1}),o(G,{class:"pa-6"},{default:r(()=>[o(ue,null,{default:r(()=>[o(B,{cols:"12",md:"6"},{default:r(()=>[o(te,{modelValue:l.localConfig.examName,"onUpdate:modelValue":t[4]||(t[4]=a=>l.localConfig.examName=a),rules:[a=>!!a||"考试名称不能为空",a=>a&&a.trim().length>0||"考试名称不能为空白字符",a=>!a||a.length<=100||"考试名称不能超过100个字符"],clearable:"",density:"comfortable",label:"考试名称",placeholder:"如:2025年高考模拟考试","prepend-inner-icon":"mdi-calendar-text",required:"",variant:"outlined"},null,8,["modelValue","rules"])]),_:1}),o(B,{cols:"12",md:"6"},{default:r(()=>[o(te,{modelValue:l.localConfig.room,"onUpdate:modelValue":t[5]||(t[5]=a=>l.localConfig.room=a),clearable:"",density:"comfortable",label:"考场号(仅 ExamSchedule-Management 支持此配置)",placeholder:"如:一号考场","prepend-inner-icon":"mdi-home",variant:"outlined"},null,8,["modelValue"])]),_:1})]),_:1}),o(ue,null,{default:r(()=>[o(B,{cols:"12"},{default:r(()=>[g("span",Wt,[o(V,{size:"small",class:"mr-1"},{default:r(()=>[...t[39]||(t[39]=[f("mdi-message-text",-1)])]),_:1}),t[40]||(t[40]=f(" 考试提示 ",-1))]),o(yt,{modelValue:l.localConfig.message,"onUpdate:modelValue":t[6]||(t[6]=a=>l.localConfig.message=a),rules:[a=>!!a||"考试提示不能为空",a=>a&&a.trim().length>0||"考试提示不能为空白字符"],clearable:"",density:"comfortable",label:"输入考试相关的提示信息...","no-resize":"",placeholder:"例如:请保持卷面整洁,诚信应考。在听到终考铃时立刻停止作答。",rows:"3",variant:"outlined"},null,8,["modelValue","rules"]),!l.localConfig.message||l.localConfig.message.trim()===""?(w(),R("div",Gt,[o(pt,{class:"d-flex gap-2",column:""},{default:r(()=>[(w(!0),R(ce,null,ye(l.defaultExamTips,(a,d)=>(w(),E(xe,{key:d,class:"cursor-pointer",color:"primary",size:"small",variant:"outlined",onClick:s=>u.selectDefaultTip(a)},{default:r(()=>[o(V,{size:"small",start:""},{default:r(()=>[...t[41]||(t[41]=[f("mdi-plus",-1)])]),_:1}),f(" "+F(a.substring(0,20))+"... ",1)]),_:2},1032,["onClick"]))),128))]),_:1}),g("div",Xt,[o(V,{class:"mr-1",size:"x-small"},{default:r(()=>[...t[42]||(t[42]=[f("mdi-lightbulb-outline",-1)])]),_:1}),t[43]||(t[43]=f(" 点击上方选项快速添加常用考试提示 ",-1))])])):U("",!0)]),_:1})]),_:1})]),_:1})]),_:1}),o(q,{border:"",class:"mb-4",elevation:"1"},{default:r(()=>[o(ee,{class:"d-flex align-center bg-success-lighten-5 pa-4"},{default:r(()=>[o(V,{class:"mr-2"},{default:r(()=>[...t[44]||(t[44]=[f("mdi-format-list-bulleted",-1)])]),_:1}),t[47]||(t[47]=g("span",{class:"font-weight-bold"},"考试科目安排",-1)),o(se),g("div",Zt,[o(bt,{modelValue:l.enableCustomAlertTime,"onUpdate:modelValue":t[7]||(t[7]=a=>l.enableCustomAlertTime=a),color:"primary",density:"compact","hide-details":"",onChange:u.toggleAlertTimeMode},{label:r(()=>[...t[45]||(t[45]=[g("span",{class:"text-body-2"},"自定义提醒时间",-1)])]),_:1},8,["modelValue","onChange"])]),o(x,{color:"success","prepend-icon":"mdi-plus",size:"small",variant:"elevated",onClick:u.addExamInfo},{default:r(()=>[...t[46]||(t[46]=[f(" 添加科目 ",-1)])]),_:1},8,["onClick"])]),_:1}),o(G,{class:"pa-0"},{default:r(()=>[l.localConfig.examInfos&&l.localConfig.examInfos.length>0?(w(),E(He,{key:0,class:"py-0"},{default:r(()=>[(w(!0),R(ce,null,ye(l.localConfig.examInfos,(a,d)=>(w(),E(ke,{key:d,class:"border-b pa-4 hover-highlight"},{default:r(()=>[g("div",Qt,[g("div",ea,[o(xe,{color:d%2===0?"primary":"secondary",size:"small",variant:"tonal",class:"mr-3"},{default:r(()=>[o(V,{start:"",size:"small"},{default:r(()=>[f("mdi-numeric-"+F(d+1)+"-circle",1)]),_:2},1024),f(" 第 "+F(d+1)+" 科目 ",1)]),_:2},1032,["color"]),o(se),g("div",ta,[d>0?(w(),E(x,{key:0,color:"primary",icon:"mdi-arrow-up",size:"x-small",variant:"text",onClick:s=>u.moveExamInfo(d,-1)},{default:r(()=>[o(be,{activator:"parent",location:"bottom"},{default:r(()=>[...t[48]||(t[48]=[f("上移",-1)])]),_:1})]),_:1},8,["onClick"])):U("",!0),d<l.localConfig.examInfos.length-1?(w(),E(x,{key:1,color:"primary",icon:"mdi-arrow-down",size:"x-small",variant:"text",onClick:s=>u.moveExamInfo(d,1)},{default:r(()=>[o(be,{activator:"parent",location:"bottom"},{default:r(()=>[...t[49]||(t[49]=[f("下移",-1)])]),_:1})]),_:1},8,["onClick"])):U("",!0),o(x,{color:"error",icon:"mdi-delete",size:"x-small",variant:"text",onClick:s=>u.removeExamInfo(d)},{default:r(()=>[o(be,{activator:"parent",location:"bottom"},{default:r(()=>[...t[50]||(t[50]=[f("删除",-1)])]),_:1})]),_:1},8,["onClick"])])]),o(ue,{class:"align-start"},{default:r(()=>[o(B,{cols:"12",md:"4"},{default:r(()=>[o(wt,{modelValue:a.name,"onUpdate:modelValue":s=>a.name=s,items:l.availableSubjects,rules:[s=>!!s||"科目名称不能为空",s=>s&&s.trim().length>0||"科目名称不能为空白字符"],clearable:"",density:"comfortable","item-title":"name",label:"科目名称","no-data-text":"没有可用科目,请输入自定义名称","prepend-inner-icon":"mdi-book",variant:"outlined"},{"prepend-item":r(()=>[l.customSubjectInput?(w(),E(ke,{key:0,title:"自定义:"},{append:r(()=>[g("span",aa,F(l.customSubjectInput),1)]),_:1})):U("",!0),l.customSubjectInput?(w(),E(gt,{key:1})):U("",!0)]),_:1},8,["modelValue","onUpdate:modelValue","items","rules"])]),_:2},1024),o(B,{cols:"12",md:"3"},{default:r(()=>[o(Be,{modelValue:a.startDateMenu,"onUpdate:modelValue":s=>a.startDateMenu=s,"close-on-content-click":!1,"min-width":"auto","offset-y":"",transition:"scale-transition"},{activator:r(({props:s})=>[o(te,fe({modelValue:a.startFormatted,"onUpdate:modelValue":p=>a.startFormatted=p,rules:[p=>!!p||"开始时间不能为空",p=>u.validateTimeFormat(p,"开始时间"),()=>u.validateNoTimeOverlap(a,d)],density:"comfortable",label:"开始时间",placeholder:"2025/01/01 09:00","prepend-inner-icon":"mdi-clock-start"},{ref_for:!0},s,{variant:"outlined",onBlur:p=>u.updateStartDateTimeFromInput(d)}),{append:r(()=>[o(V,null,{default:r(()=>[...t[51]||(t[51]=[f("mdi-calendar-clock",-1)])]),_:1})]),_:1},16,["modelValue","onUpdate:modelValue","rules","onBlur"])]),default:r(()=>[o(q,{"min-width":"500"},{default:r(()=>[o(ee,{class:"text-center py-3 bg-primary-lighten-5"},{default:r(()=>[o(V,{class:"mr-2",color:"primary"},{default:r(()=>[...t[52]||(t[52]=[f("mdi-clock-start",-1)])]),_:1}),t[53]||(t[53]=f(" 选择开始时间 ",-1))]),_:1}),o(G,{class:"pa-0"},{default:r(()=>[o(ue,{"no-gutters":""},{default:r(()=>[o(B,{class:"border-e",cols:"6"},{default:r(()=>[o(Oe,{modelValue:a.startDate,"onUpdate:modelValue":[s=>a.startDate=s,s=>u.updateStartDateTime(d)],color:"primary",elevation:"0",locale:"zh-cn","show-adjacent-months":""},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),o(B,{cols:"6"},{default:r(()=>[o(Je,{modelValue:a.startTime,"onUpdate:modelValue":[s=>a.startTime=s,s=>u.updateStartDateTime(d)],color:"primary",elevation:"0",format:"24hr",scrollable:""},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)]),_:2},1024)]),_:2},1024),o(Te,null,{default:r(()=>[o(se),o(x,{color:"grey",variant:"text",onClick:s=>a.startDateMenu=!1},{default:r(()=>[...t[54]||(t[54]=[f(" 关闭 ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1032,["modelValue","onUpdate:modelValue"])]),_:2},1024),o(B,{cols:"12",md:"3"},{default:r(()=>[o(Be,{modelValue:a.endDateMenu,"onUpdate:modelValue":s=>a.endDateMenu=s,"close-on-content-click":!1,"min-width":"auto","offset-y":"",transition:"scale-transition"},{activator:r(({props:s})=>[o(te,fe({modelValue:a.endFormatted,"onUpdate:modelValue":p=>a.endFormatted=p,rules:[p=>!!p||"结束时间不能为空",p=>u.validateTimeFormat(p,"结束时间"),()=>u.validateEndAfterStart(a),()=>u.validateNoTimeOverlap(a,d)],density:"comfortable",label:"结束时间",placeholder:"2025/01/01 11:00","prepend-inner-icon":"mdi-clock-end"},{ref_for:!0},s,{variant:"outlined",onBlur:p=>u.updateEndDateTimeFromInput(d)}),{append:r(()=>[o(V,null,{default:r(()=>[...t[55]||(t[55]=[f("mdi-calendar-clock",-1)])]),_:1})]),_:1},16,["modelValue","onUpdate:modelValue","rules","onBlur"])]),default:r(()=>[o(q,{"min-width":"500"},{default:r(()=>[o(ee,{class:"text-center py-3 bg-error-lighten-5"},{default:r(()=>[o(V,{class:"mr-2",color:"error"},{default:r(()=>[...t[56]||(t[56]=[f("mdi-clock-end",-1)])]),_:1}),t[57]||(t[57]=f(" 选择结束时间 ",-1))]),_:1}),o(G,{class:"pa-0"},{default:r(()=>[o(ue,{"no-gutters":""},{default:r(()=>[o(B,{class:"border-e",cols:"6"},{default:r(()=>[o(Oe,{modelValue:a.endDate,"onUpdate:modelValue":[s=>a.endDate=s,s=>u.updateEndDateTime(d)],color:"error",elevation:"0",locale:"zh-cn","show-adjacent-months":""},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),o(B,{cols:"6"},{default:r(()=>[o(Je,{modelValue:a.endTime,"onUpdate:modelValue":[s=>a.endTime=s,s=>u.updateEndDateTime(d)],color:"error",elevation:"0",format:"24hr",scrollable:""},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)]),_:2},1024)]),_:2},1024),o(Te,null,{default:r(()=>[o(se),o(x,{color:"grey",variant:"text",onClick:s=>a.endDateMenu=!1},{default:r(()=>[...t[58]||(t[58]=[f(" 关闭 ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1032,["modelValue","onUpdate:modelValue"])]),_:2},1024),o(B,{cols:"12",md:"2"},{default:r(()=>[o(te,{modelValue:a.durationMinutes,"onUpdate:modelValue":s=>a.durationMinutes=s,rules:[s=>!!s||"时长不能为空",s=>!isNaN(s)||"时长必须是数字",s=>parseInt(s)>0||"时长必须大于0",s=>parseInt(s)<=1440||"时长不能超过1440分钟(24小时)"],type:"number",min:"1",max:"1440",density:"comfortable",label:"时长(分钟)",placeholder:"例如:120","prepend-inner-icon":"mdi-timer",variant:"outlined",hint:u.durationHint(a),"persistent-hint":"",onBlur:s=>u.updateDurationFromInput(d)},null,8,["modelValue","onUpdate:modelValue","rules","hint","onBlur"])]),_:2},1024),l.enableCustomAlertTime?(w(),E(B,{key:0,cols:"12",md:"2"},{default:r(()=>[o(te,{modelValue:a.alertTime,"onUpdate:modelValue":s=>a.alertTime=s,rules:[s=>!!s||"提醒时间不能为空",s=>!isNaN(s)||"提醒时间必须是数字",s=>parseInt(s)>=0||"提醒时间不能为负数",s=>parseInt(s)<=120||"提醒时间不能超过120分钟"],type:"number",min:"0",max:"120",density:"comfortable",label:"提醒时间(分钟)",placeholder:"例如:15","prepend-inner-icon":"mdi-bell-ring",variant:"outlined",hint:"考试结束前提醒","persistent-hint":""},null,8,["modelValue","onUpdate:modelValue","rules"])]),_:2},1024)):U("",!0)]),_:2},1024)])]),_:2},1024))),128))]),_:1})):(w(),R("div",na,[o(V,{class:"mb-4",color:"grey-lighten-2",size:"80"},{default:r(()=>[...t[59]||(t[59]=[f(" mdi-calendar-blank ",-1)])]),_:1}),t[61]||(t[61]=g("div",{class:"text-h5 text-grey-darken-1 mb-2"},"暂无考试科目安排",-1)),t[62]||(t[62]=g("div",{class:"text-body-1 text-grey mb-4"},' 点击上方"添加科目"按钮开始配置 ',-1)),o(x,{color:"success","prepend-icon":"mdi-plus",size:"large",variant:"elevated",onClick:u.addExamInfo},{default:r(()=>[...t[60]||(t[60]=[f(" 立即添加科目 ",-1)])]),_:1},8,["onClick"])]))]),_:1})]),_:1})])):U("",!0),o(vt,{modelValue:l.deleteDialog,"onUpdate:modelValue":t[9]||(t[9]=a=>l.deleteDialog=a),"max-width":"400"},{default:r(()=>[o(q,null,{default:r(()=>[o(ee,{class:"d-flex align-center"},{default:r(()=>[o(V,{class:"mr-2",color:"error"},{default:r(()=>[...t[63]||(t[63]=[f("mdi-delete-alert",-1)])]),_:1}),t[64]||(t[64]=f(" 确认删除配置 ",-1))]),_:1}),o(G,null,{default:r(()=>[t[65]||(t[65]=f(" 确定要删除配置 ",-1)),g("strong",null,F(l.localConfig.examName||`配置 ${i.configId}`),1),t[66]||(t[66]=f(" 吗? ",-1)),t[67]||(t[67]=g("br",null,null,-1)),t[68]||(t[68]=g("small",{class:"text-grey"},"此操作不可撤销,将会删除所有相关数据",-1))]),_:1}),o(Te,null,{default:r(()=>[o(se),o(x,{color:"grey",variant:"text",onClick:t[8]||(t[8]=a=>l.deleteDialog=!1)},{default:r(()=>[...t[69]||(t[69]=[f(" 取消 ",-1)])]),_:1}),o(x,{loading:l.deleting,color:"error",variant:"outlined",onClick:u.deleteConfig},{default:r(()=>[...t[70]||(t[70]=[f(" 删除 ",-1)])]),_:1},8,["loading","onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])])}const Na=dt(_t,[["render",la],["__scopeId","data-v-415c7c7f"]]);export{Na as default};
|