mirror of
https://github.com/ZeroCatDev/Classworks.git
synced 2025-07-02 00:59:23 +00:00
8 lines
36 KiB
JavaScript
8 lines
36 KiB
JavaScript
import{g as Z,p as Q,u as Pe,d as Ge,ak as je,aF as Ae,aG as qe,ag as Xe,j as K,aH as Ze,k as a,a3 as Qe,aI as Ke,aJ as $e,Z as j,V as P,aK as et,m as tt,n as Be,o as st,aj as lt,x as at,a2 as rt,a7 as me,aL as it,aM as Ne,aa as Ee,a8 as Re,f as L,aN as ge,r as X,t as O,s as ot,a9 as nt,F as D,aO as Me,ae as dt,aP as ut,T as M,aQ as ct,aR as mt,aS as ft,aT as ht,aU as yt,aV as bt,l as pt,aW as gt,aX as vt,_ as kt,A as _,B as c,C as i,Q as H,R as de,H as d,ar as Tt,U as se,W as V,D as v,E as p,X as k,Y as Vt,G as E,aY as xt,av as Ct,S as wt}from"./index-ByVcHmHP.js";import{a as ve,V as J}from"./VRow-Dz4XHvZD.js";import{V as q}from"./VAlert-BW6kJkYi.js";import{V as We,a as Dt,b as St,c as ke,d as ue}from"./VTabsWindowItem-38pzParJ.js";import{V as I,a as Te,m as _t,b as Pt}from"./VChip-eMRrC11H.js";import{V as ce}from"./VTooltip-1sQCtODC.js";import{V as jt}from"./VTextarea-SupiQVXT.js";import{u as Ie,a as ae,m as Le,b as Ve,c as At,d as Bt,V as Nt}from"./VTextField-xmohowzo.js";import{V as xe}from"./VSwitch-Ny54d8kI.js";import{V as Et}from"./VSkeletonLoader-RSp9xkUx.js";import{V as Rt,a as Mt}from"./VDataTable-4Yao2Xkp.js";import{V as Ce,m as Wt}from"./VCheckboxBtn-Bft-Eh3Z.js";import{V as It}from"./VContainer-DZXmFKHE.js";import"./VMenu-RF_tVNBL.js";const Lt=Q({bordered:Boolean,color:String,content:[Number,String],dot:Boolean,floating:Boolean,icon:rt,inline:Boolean,label:{type:String,default:"$vuetify.badge"},max:[Number,String],modelValue:{type:Boolean,default:!0},offsetX:[Number,String],offsetY:[Number,String],textColor:String,...at(),...lt({location:"top end"}),...st(),...Be(),...tt(),...et({transition:"scale-rotate-transition"})},"VBadge"),we=Z()({name:"VBadge",inheritAttrs:!1,props:Lt(),setup(t,e){const{backgroundColorClasses:n,backgroundColorStyles:r}=Pe(()=>t.color),{roundedClasses:s}=Ge(t),{t:o}=je(),{textColorClasses:l,textColorStyles:u}=Ae(()=>t.textColor),{themeClasses:f}=qe(),{locationStyles:h}=Xe(t,!0,y=>(t.floating?t.dot?2:4:t.dot?8:12)+(["top","bottom"].includes(y)?Number(t.offsetY??0):["left","right"].includes(y)?Number(t.offsetX??0):0));return K(()=>{const y=Number(t.content),g=!t.max||isNaN(y)?t.content:y<=Number(t.max)?y:`${t.max}+`,[T,b]=Ze(e.attrs,["aria-atomic","aria-label","aria-live","role","title"]);return a(t.tag,j({class:["v-badge",{"v-badge--bordered":t.bordered,"v-badge--dot":t.dot,"v-badge--floating":t.floating,"v-badge--inline":t.inline},t.class]},b,{style:t.style}),{default:()=>{var x,S;return[a("div",{class:"v-badge__wrapper"},[(S=(x=e.slots).default)==null?void 0:S.call(x),a(Qe,{transition:t.transition},{default:()=>{var A,w;return[Ke(a("span",j({class:["v-badge__badge",f.value,n.value,s.value,l.value],style:[r.value,u.value,t.inline?{}:h.value],"aria-atomic":"true","aria-label":o(t.label,y),"aria-live":"polite",role:"status"},T),[t.dot?void 0:e.slots.badge?(w=(A=e.slots).badge)==null?void 0:w.call(A):t.icon?a(P,{icon:t.icon},null):g]),[[$e,t.modelValue]])]}})])]}})}),{}}}),zt=Q({...Le(),...Ee(Wt(),["inline"])},"VCheckbox"),Ut=Z()({name:"VCheckbox",inheritAttrs:!1,props:zt(),emits:{"update:modelValue":t=>!0,"update:focused":t=>!0},setup(t,e){let{attrs:n,slots:r}=e;const s=me(t,"modelValue"),{isFocused:o,focus:l,blur:u}=Ie(t),f=it();return K(()=>{const[h,y]=Ne(n),g=ae.filterProps(t),T=Ce.filterProps(t);return a(ae,j({class:["v-checkbox",t.class]},h,g,{modelValue:s.value,"onUpdate:modelValue":b=>s.value=b,id:t.id||`checkbox-${f}`,focused:o.value,style:t.style}),{...r,default:b=>{let{id:x,messagesId:S,isDisabled:A,isReadonly:w,isValid:R}=b;return a(Ce,j(T,{id:x.value,"aria-describedby":S.value,disabled:A.value,readonly:w.value},y,{error:R.value===!1,modelValue:s.value,"onUpdate:modelValue":B=>s.value=B,onFocus:l,onBlur:u}),r)}})}),{}}}),Ft=Q({chips:Boolean,counter:Boolean,counterSizeString:{type:String,default:"$vuetify.fileInput.counterSize"},counterString:{type:String,default:"$vuetify.fileInput.counter"},hideInput:Boolean,multiple:Boolean,showSize:{type:[Boolean,Number,String],default:!1,validator:t=>typeof t=="boolean"||[1e3,1024].includes(Number(t))},...Le({prependIcon:"$file"}),modelValue:{type:[Array,Object],default:t=>t.multiple?[]:null,validator:t=>Re(t).every(e=>e!=null&&typeof e=="object")},...Bt({clearable:!0})},"VFileInput"),Yt=Z()({name:"VFileInput",inheritAttrs:!1,props:Ft(),emits:{"click:control":t=>!0,"mousedown:control":t=>!0,"update:focused":t=>!0,"update:modelValue":t=>!0},setup(t,e){let{attrs:n,emit:r,slots:s}=e;const{t:o}=je(),l=me(t,"modelValue",t.modelValue,m=>Re(m),m=>!t.multiple&&Array.isArray(m)?m[0]:m),{isFocused:u,focus:f,blur:h}=Ie(t),y=L(()=>typeof t.showSize!="boolean"?t.showSize:void 0),g=L(()=>(l.value??[]).reduce((m,C)=>{let{size:N=0}=C;return m+N},0)),T=L(()=>ge(g.value,y.value)),b=L(()=>(l.value??[]).map(m=>{const{name:C="",size:N=0}=m;return t.showSize?`${C} (${ge(N,y.value)})`:C})),x=L(()=>{var C;const m=((C=l.value)==null?void 0:C.length)??0;return t.showSize?o(t.counterSizeString,m,T.value):o(t.counterString,m)}),S=X(),A=X(),w=X(),R=O(()=>u.value||t.active),B=L(()=>["plain","underlined"].includes(t.variant)),W=ot(!1);function z(){var m;w.value!==document.activeElement&&((m=w.value)==null||m.focus()),u.value||f()}function $(m){var C;(C=w.value)==null||C.click()}function U(m){r("mousedown:control",m)}function re(m){var C;(C=w.value)==null||C.click(),r("click:control",m)}function ie(m){m.stopPropagation(),z(),dt(()=>{l.value=[],ut(t["onClick:clear"],m)})}function F(m){m.preventDefault(),m.stopImmediatePropagation(),W.value=!0}function oe(m){m.preventDefault(),W.value=!1}function fe(m){var N,ee;if(m.preventDefault(),m.stopImmediatePropagation(),W.value=!1,!((ee=(N=m.dataTransfer)==null?void 0:N.files)!=null&&ee.length)||!w.value)return;const C=new DataTransfer;for(const he of m.dataTransfer.files)C.items.add(he);w.value.files=C.files,w.value.dispatchEvent(new Event("change",{bubbles:!0}))}return nt(l,m=>{(!Array.isArray(m)||!m.length)&&w.value&&(w.value.value="")}),K(()=>{const m=!!(s.counter||t.counter),C=!!(m||s.details),[N,ee]=Ne(n),{modelValue:he,...ze}=ae.filterProps(t),Ue=Ve.filterProps(t);return a(ae,j({ref:S,modelValue:t.multiple?l.value:l.value[0],class:["v-file-input",{"v-file-input--chips":!!t.chips,"v-file-input--dragging":W.value,"v-file-input--hide":t.hideInput,"v-input--plain-underlined":B.value},t.class],style:t.style,"onClick:prepend":$},N,ze,{centerAffix:!B.value,focused:u.value}),{...s,default:ne=>{let{id:te,isDisabled:G,isDirty:ye,isReadonly:be,isValid:Fe}=ne;return a(Ve,j({ref:A,"prepend-icon":t.prependIcon,onMousedown:U,onClick:re,"onClick:clear":ie,"onClick:prependInner":t["onClick:prependInner"],"onClick:appendInner":t["onClick:appendInner"]},Ue,{id:te.value,active:R.value||ye.value,dirty:ye.value||t.dirty,disabled:G.value,focused:u.value,error:Fe.value===!1,onDragover:F,onDrop:fe}),{...s,default:Ye=>{var pe;let{props:{class:Oe,...He}}=Ye;return a(D,null,[a("input",j({ref:w,type:"file",readonly:be.value,disabled:G.value,multiple:t.multiple,name:t.name,onClick:Y=>{Y.stopPropagation(),be.value&&Y.preventDefault(),z()},onChange:Y=>{if(!Y.target)return;const Je=Y.target;l.value=[...Je.files??[]]},onDragleave:oe,onFocus:z,onBlur:h},He,ee),null),a("div",{class:Oe},[!!((pe=l.value)!=null&&pe.length)&&!t.hideInput&&(s.selection?s.selection({fileNames:b.value,totalBytes:g.value,totalBytesReadable:T.value}):t.chips?b.value.map(Y=>a(I,{key:Y,size:"small",text:Y},null)):b.value.join(", "))])])}})},details:C?ne=>{var te,G;return a(D,null,[(te=s.details)==null?void 0:te.call(s,ne),m&&a(D,null,[a("span",null,null),a(At,{active:!!((G=l.value)!=null&&G.length),value:x.value,disabled:t.disabled},s.counter)])])}:void 0})}),Me({},S,A,w)}}),Ot=Q({fixed:Boolean,sliderColor:String,hideSlider:Boolean,direction:{type:String,default:"horizontal"},...Ee(ct({selectedClass:"v-tab--selected",variant:"text"}),["active","block","flat","location","position","symbol"])},"VTab"),le=Z()({name:"VTab",props:Ot(),setup(t,e){let{slots:n,attrs:r}=e;const{textColorClasses:s,textColorStyles:o}=Ae(()=>t.sliderColor),l=X(),u=X(),f=L(()=>t.direction==="horizontal"),h=L(()=>{var g,T;return((T=(g=l.value)==null?void 0:g.group)==null?void 0:T.isSelected.value)??!1});function y(g){var b,x;let{value:T}=g;if(T){const S=(x=(b=l.value)==null?void 0:b.$el.parentElement)==null?void 0:x.querySelector(".v-tab--selected .v-tab__slider"),A=u.value;if(!S||!A)return;const w=getComputedStyle(S).color,R=S.getBoundingClientRect(),B=A.getBoundingClientRect(),W=f.value?"x":"y",z=f.value?"X":"Y",$=f.value?"right":"bottom",U=f.value?"width":"height",re=R[W],ie=B[W],F=re>ie?R[$]-B[$]:R[W]-B[W],oe=Math.sign(F)>0?f.value?"right":"bottom":Math.sign(F)<0?f.value?"left":"top":"center",m=(Math.abs(F)+(Math.sign(F)<0?R[U]:B[U]))/Math.max(R[U],B[U])||0,C=R[U]/B[U]||0,N=1.5;mt(A,{backgroundColor:[w,"currentcolor"],transform:[`translate${z}(${F}px) scale${z}(${C})`,`translate${z}(${F/N}px) scale${z}(${(m-1)/N+1})`,"none"],transformOrigin:Array(3).fill(oe)},{duration:225,easing:ft})}}return K(()=>{const g=M.filterProps(t);return a(M,j({symbol:We,ref:l,class:["v-tab",t.class],style:t.style,tabindex:h.value?0:-1,role:"tab","aria-selected":String(h.value),active:!1},g,r,{block:t.fixed,maxWidth:t.fixed?300:void 0,"onGroup:selected":y}),{...n,default:()=>{var T;return a(D,null,[((T=n.default)==null?void 0:T.call(n))??t.text,!t.hideSlider&&a("div",{ref:u,class:["v-tab__slider",s.value],style:o.value},null)])}})}),Me({},l)}});function Ht(t){return t?t.map(e=>vt(e)?e:{text:e,value:e}):[]}const Jt=Q({alignTabs:{type:String,default:"start"},color:String,fixedTabs:Boolean,items:{type:Array,default:()=>[]},stacked:Boolean,bgColor:String,grow:Boolean,height:{type:[Number,String],default:void 0},hideSlider:Boolean,sliderColor:String,..._t({mandatory:"force",selectedClass:"v-tab-item--selected"}),...gt(),...Be()},"VTabs"),De=Z()({name:"VTabs",props:Jt(),emits:{"update:modelValue":t=>!0},setup(t,e){let{attrs:n,slots:r}=e;const s=me(t,"modelValue"),o=L(()=>Ht(t.items)),{densityClasses:l}=ht(t),{backgroundColorClasses:u,backgroundColorStyles:f}=Pe(()=>t.bgColor),{scopeId:h}=yt();return bt({VTab:{color:O(()=>t.color),direction:O(()=>t.direction),stacked:O(()=>t.stacked),fixed:O(()=>t.fixedTabs),sliderColor:O(()=>t.sliderColor),hideSlider:O(()=>t.hideSlider)}}),K(()=>{const y=Te.filterProps(t),g=!!(r.window||t.items.length>0);return a(D,null,[a(Te,j(y,{modelValue:s.value,"onUpdate:modelValue":T=>s.value=T,class:["v-tabs",`v-tabs--${t.direction}`,`v-tabs--align-tabs-${t.alignTabs}`,{"v-tabs--fixed-tabs":t.fixedTabs,"v-tabs--grow":t.grow,"v-tabs--stacked":t.stacked},l.value,u.value,t.class],style:[{"--v-tabs-height":pt(t.height)},f.value,t.style],role:"tablist",symbol:We},h,n),{default:()=>{var T;return[((T=r.default)==null?void 0:T.call(r))??o.value.map(b=>{var x;return((x=r.tab)==null?void 0:x.call(r,{item:b}))??a(le,j(b,{key:b.text,value:b.value}),{default:r[`tab.${b.value}`]?()=>{var S;return(S=r[`tab.${b.value}`])==null?void 0:S.call(r,{item:b})}:void 0})})]}}),g&&a(Dt,j({modelValue:s.value,"onUpdate:modelValue":T=>s.value=T,key:"tabs-window"},h),{default:()=>{var T;return[o.value.map(b=>{var x;return((x=r.item)==null?void 0:x.call(r,{item:b}))??a(St,{value:b.value},{default:()=>{var S;return(S=r[`item.${b.value}`])==null?void 0:S.call(r,{item:b})}})}),(T=r.window)==null?void 0:T.call(r)]}})])}),{}}}),Se=()=>new Promise((t,e)=>{if(typeof window.jsyaml<"u")return t(window.jsyaml);const n=document.createElement("script");n.src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js",n.async=!0,n.onload=()=>t(window.jsyaml),n.onerror=()=>e(new Error("无法加载YAML解析库")),document.head.appendChild(n)});class _e{constructor(e){this.data=e,this.version=null,this.subjects=[],this.schedules=[],this._parseData()}_parseData(){if(!this.data)return;this.version=this.data.version||1;const e=this.data.subjects||[];for(const r of e)this.subjects.push({name:r.name,simplified_name:r.simplified_name||null,teacher:r.teacher||null,room:r.room||null});const n=this.data.schedules||[];for(const r of n){const s=[];for(const o of r.classes||[])s.push({subject:o.subject,start_time:o.start_time,end_time:o.end_time});this.schedules.push({name:r.name,enable_day:r.enable_day,weeks:r.weeks||"all",classes:s})}}getSubjects(){return this.subjects}getSchedules(){return this.schedules}getScheduleByDay(e){const n=this.schedules.find(r=>r.enable_day===e);return n?n.classes:[]}toCsesData(){return{version:this.version,subjects:this.subjects,schedules:this.schedules}}}const Gt={name:"Cses2Wakeup",data(){return{activeTab:"text",file:null,jsonText:"",loading:!1,error:"",success:"",processedData:null,selectedRows:[],exportPeriods:[],selectedDays:[1,2,3,4,5,6,7],formatMode:"auto",yamlLibLoaded:!1,activeDay:null,subjectColors:{数学:"blue",语文:"red",英语:"green",物理:"purple",化学:"orange",生物:"teal",历史:"brown",地理:"indigo",政治:"pink",体育:"cyan",自习:"grey",早读:"amber",班会:"deep-purple",听力:"light-blue",信息技术:"light-green"},settings:{hideTeacherName:!1,hideRoom:!1,totalWeeks:30},tableHeaders:[{title:"",key:"data-table-select"},{title:"节次",key:"period"},{title:"周一",key:"1"},{title:"周二",key:"2"},{title:"周三",key:"3"},{title:"周四",key:"4"},{title:"周五",key:"5"},{title:"周六",key:"6"},{title:"周日",key:"7"}],timeTableHeaders:[{title:"节次",key:"period"},{title:"课程",key:"subject"},{title:"星期",key:"day"},{title:"开始时间",key:"startTime"},{title:"结束时间",key:"endTime"},{title:"教师",key:"teacher"},{title:"教室",key:"room"},{title:"周次",key:"weeks"}],dayNames:{1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"}}},computed:{timeTableData(){if(!this.processedData||!this.processedData.tableData)return[];const t=[],e=this.processedData.tableData.filter(r=>this.exportPeriods.includes(r.period)),n={};return e.sort((r,s)=>r.period-s.period).forEach((r,s)=>{n[r.period]=s+1}),e.forEach(r=>{for(let s=1;s<=7;s++){if(!this.selectedDays.includes(s))continue;const o=r[s];if(o)if(Array.isArray(o))o.forEach(l=>{!l||!l.name||t.push({originalPeriod:r.period,period:n[r.period],subject:l.name,day:this.dayNames[s],startTime:l.startTime,endTime:l.endTime,teacher:this.settings.hideTeacherName?"":l.teacher||"",room:this.settings.hideRoom?"":l.room||"",weeks:l.weekType?`1-${this.settings.totalWeeks}${l.weekType}`:`1-${this.settings.totalWeeks}`})});else{if(!o.name)continue;t.push({originalPeriod:r.period,period:n[r.period],subject:o.name,day:this.dayNames[s],startTime:o.startTime,endTime:o.endTime,teacher:this.settings.hideTeacherName?"":o.teacher||"",room:this.settings.hideRoom?"":o.room||"",weeks:o.weekType?`1-${this.settings.totalWeeks}${o.weekType}`:`1-${this.settings.totalWeeks}`})}}}),t.sort((r,s)=>{if(r.period!==s.period)return r.period-s.period;const o={周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7};return o[r.day]-o[s.day]})},hasExportData(){return this.processedData&&this.exportPeriods.length>0},totalClassHours(){return this.timeTableData.length},daysWithSchedule(){const t=[];for(let e=1;e<=7;e++)this.selectedDays.includes(e)&&this.getDaySchedule(e).length>0&&t.push(e);return t}},methods:{async handleFileChange(){if(this.resetData(),!this.file)return;const t=this.file.name.toLowerCase();if(t.endsWith(".json")||t.endsWith(".js"))this.formatMode="json";else if((t.endsWith(".yml")||t.endsWith(".yaml"))&&(this.formatMode="yaml",!this.yamlLibLoaded))try{await Se(),this.yamlLibLoaded=!0}catch(e){this.error=`无法加载YAML解析库: ${e.message}`;return}try{const e=new FileReader;e.onload=async n=>{try{this.jsonText=n.target.result,await this.processInput()}catch(r){this.error=`文件读取失败: ${r.message}`}},e.onerror=()=>{this.error="文件读取失败"},e.readAsText(this.file)}catch(e){this.error=`文件处理失败: ${e.message}`}},handleTextChange(){this.resetData()},resetData(){this.error="",this.success="",this.processedData=null,this.selectedRows=[],this.exportPeriods=[]},async processInput(){if(!this.jsonText&&!this.file){this.error="请粘贴文本或上传文件";return}this.loading=!0,this.error="",this.success="";try{await this.$nextTick();let t;try{if(this.formatMode==="yaml"||this.formatMode==="auto"&&this.isYaml(this.jsonText)){const n=this.parseYaml(this.jsonText);t=new _e(n).toCsesData()}else t=JSON.parse(this.jsonText)}catch(n){throw new Error(`格式解析错误: ${n.message}`)}if(!this.validateCsesFormat(t))throw new Error("不是有效的CSES格式数据");const e=this.processCsesData(t);this.processedData=e,this.selectedDays=[1,2,3,4,5],this.success="数据处理成功!",e.tableData&&e.tableData.length>0&&(this.selectedRows=[...e.tableData],this.exportPeriods=e.tableData.map(n=>n.period))}catch(t){this.error="数据处理失败:"+t.message,console.error(t)}finally{this.loading=!1}},validateCsesFormat(t){return t instanceof _e?t.version===1&&Array.isArray(t.subjects)&&Array.isArray(t.schedules):!(!t||typeof t!="object"||t.version!==1||!Array.isArray(t.subjects)||!Array.isArray(t.schedules))},processCsesData(t){const{schedules:e,subjects:n}=t,r=Object.fromEntries(n.map(l=>[l.name,l])),s=[];let o=0;e.forEach(l=>{l.classes&&l.classes.length>o&&(o=l.classes.length)});for(let l=1;l<=o;l++)s.push({period:l,1:null,2:null,3:null,4:null,5:null,6:null,7:null});return e.forEach(l=>{const u=l.enable_day;if(!u||u<1||u>7)return;let f="";l.weeks==="odd"?f="单":l.weeks==="even"&&(f="双"),l.classes.forEach((h,y)=>{if(!h.subject)return;const g=y+1;if(g>o)return;const T=r[h.subject]||{},b={name:h.subject,teacher:T.teacher||"",room:T.room||"",period:g,startTime:h.start_time,endTime:h.end_time,day:u,weekType:f},x=s[g-1][u];x?f&&x.weekType&&f!==x.weekType?(Array.isArray(s[g-1][u])||(s[g-1][u]=[x]),s[g-1][u].push(b)):f===x.weekType?s[g-1][u]=b:f||(s[g-1][u]=b):s[g-1][u]=b})}),{tableData:s,originalData:t}},updateSelectedPeriods(t){this.exportPeriods=[],t&&t.length>0&&(this.exportPeriods=[...new Set(t.filter(e=>e&&typeof e.period=="number").map(e=>e.period))])},getTimeTableData(){return this.timeTableData},downloadCSV(){var s;if(!((s=this.processedData)!=null&&s.tableData)){this.error="没有可下载的数据";return}if(this.exportPeriods.length===0){this.error="请至少选择一节要导出的课";return}if(this.daysWithSchedule.length===0||this.totalClassHours===0){this.error="没有课程数据可导出";return}let t=`课程名称,星期,开始节数,结束节数,老师,地点,周数
|
|
`;for(const o of this.daysWithSchedule){const l=this.groupByPeriod(this.getDaySchedule(o));for(const u of l)for(const f of u.items){const h={周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7}[f.day],y=this.settings.hideTeacherName?"":f.teacher||"",g=this.settings.hideRoom?"":f.room||"";t+=`${f.subject},${h},${f.period},${f.period},${y},${g},${f.weeks}
|
|
`}}const e="\uFEFF",n=new Blob([e+t],{type:"text/csv;charset=utf-8"}),r=document.createElement("a");r.href=URL.createObjectURL(n),r.download=`course_schedule_${this.totalClassHours}课时.csv`,r.click(),URL.revokeObjectURL(r.href),this.success=`导出成功!共计 ${this.totalClassHours} 课时`},showExportPreview(){if(!this.hasExportData){this.error="请先选择要导出的节次";return}const t=this.timeTableData.slice(0,5).map(e=>`${e.subject} (${e.day} 第${e.period}节)`).join(`
|
|
`);this.timeTableData.length>5?this.success=`导出预览 (共${this.totalClassHours}课时):
|
|
${t}
|
|
...等${this.totalClassHours-5}节课程`:this.success=`导出预览 (共${this.totalClassHours}课时):
|
|
${t}`,this.$nextTick(()=>{this.daysWithSchedule.length>0&&!this.activeDay&&(this.activeDay=this.daysWithSchedule[0])})},isYaml(t){const e=t.trim();if(e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e),!1}catch{}return/^\s*[a-zA-Z0-9_-]+\s*:/.test(e)||/\n\s*[a-zA-Z0-9_-]+\s*:/.test(e)},parseYaml(t){try{if(typeof window.jsyaml<"u")return window.jsyaml.load(t);throw new Error("YAML解析器未加载")}catch(e){throw new Error(`YAML解析错误: ${e.message}`)}},getDaySchedule(t){return this.timeTableData?this.getUnfilteredTimeTableData().filter(n=>({周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7})[n.day]===t):[]},getUnfilteredTimeTableData(){if(!this.processedData||!this.processedData.tableData)return[];const t=[],e=this.processedData.tableData.filter(r=>this.exportPeriods.includes(r.period)),n={};return e.sort((r,s)=>r.period-s.period).forEach((r,s)=>{n[r.period]=s+1}),e.forEach(r=>{for(let s=1;s<=7;s++){const o=r[s];if(o)if(Array.isArray(o))o.forEach(l=>{!l||!l.name||t.push({originalPeriod:r.period,period:n[r.period],subject:l.name,day:this.dayNames[s],startTime:l.startTime,endTime:l.endTime,teacher:this.settings.hideTeacherName?"":l.teacher||"",room:this.settings.hideRoom?"":l.room||"",weeks:l.weekType?`1-${this.settings.totalWeeks}${l.weekType}`:`1-${this.settings.totalWeeks}`})});else{if(!o.name)continue;t.push({originalPeriod:r.period,period:n[r.period],subject:o.name,day:this.dayNames[s],startTime:o.startTime,endTime:o.endTime,teacher:this.settings.hideTeacherName?"":o.teacher||"",room:this.settings.hideRoom?"":o.room||"",weeks:o.weekType?`1-${this.settings.totalWeeks}${o.weekType}`:`1-${this.settings.totalWeeks}`})}}}),t.sort((r,s)=>{if(r.period!==s.period)return r.period-s.period;const o={周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7};return o[r.day]-o[s.day]})},groupByPeriod(t){const e={};return t.forEach(n=>{e[n.period]||(e[n.period]={period:n.period,originalPeriod:n.originalPeriod,items:[],timeSlots:[]}),e[n.period].items.push(n),e[n.period].timeSlots.push({startTime:n.startTime,endTime:n.endTime})}),Object.values(e).forEach(n=>{n.uniqueTimeSlots=[],n.timeSlots.forEach(r=>{n.uniqueTimeSlots.some(s=>s.startTime===r.startTime&&s.endTime===r.endTime)||n.uniqueTimeSlots.push(r)}),n.uniqueTimeSlots.sort((r,s)=>r.startTime.localeCompare(s.startTime))}),Object.values(e).sort((n,r)=>n.period-r.period)},formatTime(t){return t?t.substring(0,5):""},getSubjectColor(t){return this.subjectColors[t]||"grey"},selectAllDays(){this.selectedDays=[1,2,3,4,5,6,7]},clearSelectedDays(){this.selectedDays=[]}},async mounted(){try{await Se(),this.yamlLibLoaded=!0}catch(t){this.error=t.message}this.$watch("daysWithSchedule",t=>{t.length>0&&!this.activeDay&&(this.activeDay=t[0])})}},qt={class:"d-flex align-center"},Xt={class:"d-flex align-center"},Zt={key:2,class:"text-caption mb-2"},Qt={class:"d-flex align-center mb-2"},Kt={class:"d-flex align-center mb-3"},$t={class:"d-flex align-center mb-3"},es={key:0,class:"course-cell"},ts={key:0},ss={key:1},ls={key:2,class:"week-type"},as={key:0},rs={key:1},is={key:2,class:"week-type"},os={class:"text-center font-weight-bold"};function ns(t,e,n,r,s,o){return c(),_(It,{class:"fill-height"},{default:i(()=>[a(ve,null,{default:i(()=>[a(J,{cols:"12"},{default:i(()=>[a(H,{class:"elevation-12",border:""},{default:i(()=>[a(de,{class:"d-flex align-center primary lighten-1 white--text py-3 px-4"},{default:i(()=>[a(P,{color:"white",class:"mr-2"},{default:i(()=>e[15]||(e[15]=[d("mdi-swap-horizontal")])),_:1,__:[15]}),e[16]||(e[16]=d(" 课程表转换工具 "))]),_:1,__:[16]}),a(Tt,null,{default:i(()=>e[17]||(e[17]=[d(" 将CSES格式的JSON或YAML文本转换为WakeUp软件使用的课程表 ")])),_:1,__:[17]}),a(se,null,{default:i(()=>[s.error?(c(),_(q,{key:0,type:"error",class:"mb-4 mt-3 mx-2",variant:"tonal",border:"start",closable:"","onClick:close":e[0]||(e[0]=l=>s.error="")},{default:i(()=>[p("div",qt,[a(P,{class:"mr-2"},{default:i(()=>e[18]||(e[18]=[d("mdi-alert-circle")])),_:1,__:[18]}),d(" "+k(s.error),1)])]),_:1})):V("",!0),s.success?(c(),_(q,{key:1,type:"success",class:"mb-4 mt-3 mx-2",variant:"tonal",border:"start",closable:"","onClick:close":e[1]||(e[1]=l=>s.success="")},{default:i(()=>[p("div",Xt,[a(P,{class:"mr-2"},{default:i(()=>e[19]||(e[19]=[d("mdi-check-circle")])),_:1,__:[19]}),d(" "+k(s.success),1)])]),_:1})):V("",!0),a(De,{modelValue:s.activeTab,"onUpdate:modelValue":e[2]||(e[2]=l=>s.activeTab=l),class:"mb-4 mx-2",color:"primary",rounded:""},{default:i(()=>[a(le,{value:"text",class:"px-5"},{default:i(()=>[a(P,{start:""},{default:i(()=>e[20]||(e[20]=[d("mdi-text-box")])),_:1,__:[20]}),e[21]||(e[21]=d(" 文本粘贴"))]),_:1,__:[21]}),a(le,{value:"file",class:"px-5"},{default:i(()=>[a(P,{start:""},{default:i(()=>e[22]||(e[22]=[d("mdi-file-upload")])),_:1,__:[22]}),e[23]||(e[23]=d(" 文件上传"))]),_:1,__:[23]})]),_:1},8,["modelValue"]),a(Vt,{modelValue:s.formatMode,"onUpdate:modelValue":e[3]||(e[3]=l=>s.formatMode=l),color:"primary",class:"mb-4 mx-2",mandatory:"",density:"comfortable",border:"",rounded:""},{default:i(()=>[a(M,{value:"auto"},{default:i(()=>e[24]||(e[24]=[d("自动检测")])),_:1,__:[24]}),a(M,{value:"json"},{default:i(()=>e[25]||(e[25]=[d("JSON")])),_:1,__:[25]}),a(M,{value:"yaml",disabled:!s.yamlLibLoaded},{default:i(()=>[e[26]||(e[26]=d(" YAML ")),a(ce,{activator:"parent",location:"bottom"},{default:i(()=>[d(k(s.yamlLibLoaded?"YAML解析库已加载":"正在加载YAML解析库..."),1)]),_:1})]),_:1,__:[26]},8,["disabled"])]),_:1},8,["modelValue"]),s.jsonText&&s.formatMode==="auto"?(c(),v("div",Zt," 检测到的格式: "+k(o.isYaml(s.jsonText)?"YAML":"JSON"),1)):V("",!0),a(ke,{modelValue:s.activeTab,"onUpdate:modelValue":e[6]||(e[6]=l=>s.activeTab=l)},{default:i(()=>[a(ue,{value:"text"},{default:i(()=>[p("div",Qt,[a(jt,{modelValue:s.jsonText,"onUpdate:modelValue":e[4]||(e[4]=l=>s.jsonText=l),label:"粘贴JSON或YAML文本",loading:s.loading,disabled:s.loading,"row-height":"25",rows:"6",placeholder:"请在此粘贴CSES格式的数据...",onInput:o.handleTextChange},null,8,["modelValue","loading","disabled","onInput"])])]),_:1}),a(ue,{value:"file"},{default:i(()=>[a(Yt,{modelValue:s.file,"onUpdate:modelValue":e[5]||(e[5]=l=>s.file=l),accept:".js,.json,.yml,.yaml",label:"选择课程表文件","prepend-icon":"mdi-file-upload",loading:s.loading,disabled:s.loading,onChange:o.handleFileChange,hint:"支持JSON、YAML格式文件","persistent-hint":"",rules:[l=>!l||l.size<2e6||"文件大小不能超过 2 MB"]},null,8,["modelValue","loading","disabled","onChange","rules"]),s.file&&s.formatMode==="auto"?(c(),_(q,{key:0,type:"info",class:"mb-4",variant:"tonal",density:"compact"},{default:i(()=>e[27]||(e[27]=[d(" 将根据文件扩展名自动检测格式 ")])),_:1,__:[27]})):V("",!0)]),_:1})]),_:1},8,["modelValue"]),a(J,{cols:"12"},{default:i(()=>[a(H,{flat:"",class:"pa-4 rounded-lg",border:""},{default:i(()=>[p("div",Kt,[a(P,{color:"primary",class:"mr-2"},{default:i(()=>e[28]||(e[28]=[d("mdi-calendar-multiselect")])),_:1,__:[28]}),e[33]||(e[33]=p("h3",{class:"text-subtitle-1 font-weight-medium mr-auto"},"选择导出天数",-1)),a(M,{variant:"text",color:"primary",class:"ml-2",onClick:o.selectAllDays},{default:i(()=>[a(P,{start:"",size:"small"},{default:i(()=>e[29]||(e[29]=[d("mdi-checkbox-multiple-marked")])),_:1,__:[29]}),e[30]||(e[30]=d(" 全选 "))]),_:1,__:[30]},8,["onClick"]),a(M,{variant:"text",color:"error",class:"ml-2",onClick:o.clearSelectedDays},{default:i(()=>[a(P,{start:"",size:"small"},{default:i(()=>e[31]||(e[31]=[d("mdi-checkbox-multiple-blank-outline")])),_:1,__:[31]}),e[32]||(e[32]=d(" 清除 "))]),_:1,__:[32]},8,["onClick"])]),a(Pt,{modelValue:s.selectedDays,"onUpdate:modelValue":e[7]||(e[7]=l=>s.selectedDays=l),multiple:"",class:"mb-2",color:"primary"},{default:i(()=>[(c(),v(D,null,E(7,l=>a(I,{key:l,value:l,filter:"",variant:"tonal",class:"filter-chip",label:""},{default:i(()=>[d(k(s.dayNames[l])+" ",1),o.getDaySchedule(l).length>0?(c(),_(we,{key:0,content:o.getDaySchedule(l).length,color:"primary",inline:""},null,8,["content"])):V("",!0)]),_:2},1032,["value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),a(J,{cols:"12"},{default:i(()=>[a(H,{flat:"",class:"pa-4 rounded-lg",border:""},{default:i(()=>[p("div",$t,[a(P,{color:"primary",class:"mr-2"},{default:i(()=>e[34]||(e[34]=[d("mdi-cog")])),_:1,__:[34]}),e[35]||(e[35]=p("h3",{class:"text-subtitle-1 font-weight-medium"},"显示配置",-1))]),a(ve,null,{default:i(()=>[a(J,{cols:"12",sm:"6"},{default:i(()=>[a(xe,{modelValue:s.settings.hideTeacherName,"onUpdate:modelValue":e[8]||(e[8]=l=>s.settings.hideTeacherName=l),label:"不显示教师姓名",color:"primary",inset:"","hide-details":""},null,8,["modelValue"])]),_:1}),a(J,{cols:"12",sm:"6"},{default:i(()=>[a(xe,{modelValue:s.settings.hideRoom,"onUpdate:modelValue":e[9]||(e[9]=l=>s.settings.hideRoom=l),label:"不显示教室信息",color:"primary",inset:"","hide-details":""},null,8,["modelValue"])]),_:1}),a(J,{cols:"12",sm:"6"},{default:i(()=>[a(Nt,{modelValue:s.settings.totalWeeks,"onUpdate:modelValue":e[10]||(e[10]=l=>s.settings.totalWeeks=l),modelModifiers:{number:!0},label:"总周数",type:"number",min:"1",max:"30",rules:[l=>l>0||"周数必须大于0"],density:"comfortable",variant:"outlined","prepend-inner-icon":"mdi-calendar-week",class:"mt-3"},null,8,["modelValue","rules"])]),_:1})]),_:1})]),_:1})]),_:1}),s.loading?(c(),_(H,{key:3,class:"my-4",outlined:""},{default:i(()=>[a(se,null,{default:i(()=>[a(Et,{type:"table",class:"mx-auto"})]),_:1})]),_:1})):V("",!0),s.processedData?(c(),_(I,{key:4,color:"primary",class:"ml-2","prepend-icon":"mdi-book-open-variant"},{default:i(()=>[d(k(s.processedData.tableData.length)+" 节课程 ",1)]),_:1})):V("",!0),s.processedData&&s.exportPeriods.length===0?(c(),_(q,{key:5,type:"warning",class:"mb-4",closable:""},{default:i(()=>e[36]||(e[36]=[d(" 请选择要导出的节次 ")])),_:1,__:[36]})):V("",!0),s.processedData?(c(),_(H,{key:6,class:"my-4",elevation:"1"},{default:i(()=>[a(de,{class:"d-flex align-center pa-4 bg-primary-lighten-5"},{default:i(()=>[a(P,{color:"primary",class:"mr-2"},{default:i(()=>e[37]||(e[37]=[d("mdi-table")])),_:1,__:[37]}),e[39]||(e[39]=p("span",{class:"font-weight-bold"},"课程表",-1)),a(I,{color:"primary",class:"ml-3",size:"small",pill:""},{default:i(()=>[a(P,{start:"",size:"x-small"},{default:i(()=>e[38]||(e[38]=[d("mdi-book-open-variant")])),_:1,__:[38]}),d(" "+k(s.processedData.tableData.length)+" 节课程 ",1)]),_:1})]),_:1,__:[39]}),a(se,{class:"pa-0"},{default:i(()=>[a(Rt,{"items-selected":s.selectedRows,"onUpdate:itemsSelected":[e[12]||(e[12]=l=>s.selectedRows=l),o.updateSelectedPeriods],headers:s.tableHeaders,items:s.processedData.tableData,"hide-default-footer":"",class:"elevation-1","items-per-page":-1,"item-value":"period","show-select":"","select-strategy":"single-independent","sort-by":[],"disable-sort":""},xt({"item.data-table-select":i(({item:l})=>[a(Ut,{modelValue:s.exportPeriods,"onUpdate:modelValue":e[11]||(e[11]=u=>s.exportPeriods=u),value:l.period,"hide-details":"",density:"compact"},null,8,["modelValue","value"])]),_:2},[E(7,l=>({name:`item.${l}`,fn:i(({item:u})=>[u[l]?(c(),v("div",es,[Array.isArray(u[l])?(c(!0),v(D,{key:0},E(u[l],(f,h)=>(c(),v("div",{key:h,class:"course-item"},[d(k(f.name)+" ",1),!s.settings.hideTeacherName&&f.teacher?(c(),v("span",ts,[e[40]||(e[40]=p("br",null,null,-1)),d(k(f.teacher),1)])):V("",!0),!s.settings.hideRoom&&f.room?(c(),v("span",ss,[e[41]||(e[41]=p("br",null,null,-1)),d(k(f.room),1)])):V("",!0),f.weekType?(c(),v("span",ls,k(f.weekType)+"周 ",1)):V("",!0)]))),128)):(c(),v(D,{key:1},[d(k(u[l].name)+" ",1),!s.settings.hideTeacherName&&u[l].teacher?(c(),v("span",as,[e[42]||(e[42]=p("br",null,null,-1)),d(k(u[l].teacher),1)])):V("",!0),!s.settings.hideRoom&&u[l].room?(c(),v("span",rs,[e[43]||(e[43]=p("br",null,null,-1)),d(k(u[l].room),1)])):V("",!0),u[l].weekType?(c(),v("span",is,k(u[l].weekType)+"周 ",1)):V("",!0)],64))])):V("",!0)])}))]),1032,["items-selected","headers","items","onUpdate:itemsSelected"])]),_:1})]),_:1})):V("",!0),o.hasExportData?(c(),_(H,{key:7,class:"my-4",elevation:"1"},{default:i(()=>[a(de,{class:"d-flex align-center pa-4 bg-primary-lighten-5"},{default:i(()=>[a(P,{color:"primary",class:"mr-2"},{default:i(()=>e[44]||(e[44]=[d("mdi-timetable")])),_:1,__:[44]}),e[48]||(e[48]=p("span",{class:"font-weight-bold"},"每日课程时间表",-1)),a(I,{class:"ml-3",size:"small",color:"primary",pill:""},{default:i(()=>[a(P,{start:"",size:"x-small"},{default:i(()=>e[45]||(e[45]=[d("mdi-clock-outline")])),_:1,__:[45]}),d(" "+k(o.totalClassHours)+" 课时 ",1)]),_:1}),s.exportPeriods.length>0?(c(),_(ce,{key:0},{activator:i(({props:l})=>[a(I,j({class:"ml-2",size:"small",color:"info"},l,{pill:""}),{default:i(()=>[a(P,{start:"",size:"x-small"},{default:i(()=>e[46]||(e[46]=[d("mdi-information-outline")])),_:1,__:[46]}),e[47]||(e[47]=d(" 节次已重排 "))]),_:2,__:[47]},1040)]),default:i(()=>[p("span",null,"已将选中的节次 "+k(s.exportPeriods.join(", "))+" 重新排序为连续的 1-"+k(s.exportPeriods.length),1)]),_:1})):V("",!0)]),_:1,__:[48]}),a(se,null,{default:i(()=>[o.daysWithSchedule.length>0?(c(),_(De,{key:0,modelValue:s.activeDay,"onUpdate:modelValue":e[13]||(e[13]=l=>s.activeDay=l),class:"mb-4",color:"primary",grow:"","align-tabs":"center"},{default:i(()=>[(c(!0),v(D,null,E(o.daysWithSchedule,l=>(c(),_(le,{key:l,value:l,class:"px-2 font-weight-medium"},{default:i(()=>[d(k(s.dayNames[l])+" ",1),a(we,{content:o.getDaySchedule(l).length,color:"primary",inline:""},null,8,["content"])]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])):V("",!0),a(ke,{modelValue:s.activeDay,"onUpdate:modelValue":e[14]||(e[14]=l=>s.activeDay=l)},{default:i(()=>[(c(!0),v(D,null,E(o.daysWithSchedule,l=>(c(),_(ue,{key:l,value:l},{default:i(()=>[a(Mt,{density:"compact",class:"rounded","headers-length":6,"disable-sort":""},{default:i(()=>[e[50]||(e[50]=p("thead",null,[p("tr",null,[p("th",{class:"text-center"},"节次"),p("th",null,"课程"),p("th",null,"时间"),p("th",null,"教师"),p("th",null,"教室"),p("th",null,"周次")])],-1)),p("tbody",null,[(c(!0),v(D,null,E(o.groupByPeriod(o.getDaySchedule(l)),(u,f)=>(c(),v("tr",{key:f},[p("td",os,[d(k(u.period)+" ",1),u.originalPeriod!==u.period?(c(),_(ce,{key:0},{activator:i(({props:h})=>[a(P,j({size:"x-small",ref_for:!0},h,{color:"info",class:"ml-1"}),{default:i(()=>e[49]||(e[49]=[d("mdi-sync")])),_:2,__:[49]},1040)]),default:i(()=>[d(" 原节次: "+k(u.originalPeriod),1)]),_:2},1024)):V("",!0)]),p("td",null,[(c(!0),v(D,null,E(u.items,(h,y)=>(c(),v("div",{key:y,class:"mb-1"},[a(I,{size:"small",color:o.getSubjectColor(h.subject),label:"","text-color":"white",class:"mr-1"},{default:i(()=>[d(k(h.subject),1)]),_:2},1032,["color"]),u.items.length>1?(c(),_(I,{key:0,size:"x-small",class:"ml-1",color:h.weekType==="单"?"warning":"success"},{default:i(()=>[d(k(h.weekType)+"周 ",1)]),_:2},1032,["color"])):V("",!0)]))),128))]),p("td",null,[(c(!0),v(D,null,E(u.uniqueTimeSlots,(h,y)=>(c(),v("div",{key:y,class:"mb-1"},[a(I,{size:"x-small",class:"time-chip"},{default:i(()=>[d(k(o.formatTime(h.startTime))+" - "+k(o.formatTime(h.endTime)),1)]),_:2},1024)]))),128))]),p("td",null,[s.settings.hideTeacherName?(c(),v(D,{key:1},[d("-")],64)):(c(!0),v(D,{key:0},E(u.items,(h,y)=>(c(),v("div",{key:y,class:"mb-1"},k(h.teacher||"-"),1))),128))]),p("td",null,[s.settings.hideRoom?(c(),v(D,{key:1},[d("-")],64)):(c(!0),v(D,{key:0},E(u.items,(h,y)=>(c(),v("div",{key:y,class:"mb-1"},k(h.room||"-"),1))),128))]),p("td",null,[(c(!0),v(D,null,E(u.items,(h,y)=>(c(),v("div",{key:y,class:"mb-1"},k(h.weeks),1))),128))])]))),128))])]),_:2,__:[50]},1024)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"]),o.hasExportData&&o.daysWithSchedule.length===0?(c(),_(q,{key:1,type:"info",class:"mt-3"},{default:i(()=>e[51]||(e[51]=[d(" 没有找到任何课程数据 ")])),_:1,__:[51]})):V("",!0)]),_:1})]),_:1})):V("",!0)]),_:1}),a(Ct,{class:""},{default:i(()=>[a(wt),a(M,{color:"primary",variant:"outlined",loading:s.loading,disabled:!s.jsonText&&!s.file||s.loading,onClick:o.processInput,"prepend-icon":"mdi-cog-refresh"},{default:i(()=>e[52]||(e[52]=[d(" 处理数据 ")])),_:1,__:[52]},8,["loading","disabled","onClick"]),a(M,{color:"info",disabled:!o.hasExportData,onClick:o.showExportPreview,class:"ml-2","prepend-icon":"mdi-eye",border:""},{default:i(()=>e[53]||(e[53]=[d(" 刷新 ")])),_:1,__:[53]},8,["disabled","onClick"]),a(M,{color:"success",variant:"outlined",disabled:!o.hasExportData,onClick:o.downloadCSV,class:"ml-2","prepend-icon":"mdi-download",border:""},{default:i(()=>e[54]||(e[54]=[d(" 下载CSV ")])),_:1,__:[54]},8,["disabled","onClick"])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const xs=kt(Gt,[["render",ns],["__scopeId","data-v-d6c2f846"]]);export{xs as default};
|