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

8 lines
36 KiB
JavaScript

import{p as le,a1 as L,g as ye,U as et,$ as Ne,a0 as Re,aw as we,W as Q,ax as W,X as tt,a2 as st,c as pe,ay as lt,d as n,i as y,F as C,E as I,e as Fe,ab as Me,a3 as at,az as rt,Z as it,aA as Le,y as M,n as nt,ac as ot,aB as dt,aC as ut,aD as ct,aE as mt,aF as ft,aG as ht,aH as ce,m as yt,aI as pt,aJ as bt,aK as gt,_ as vt,j as S,o as m,w as i,l as q,q as me,t as c,v as j,S as kt,z as te,B as T,A as p,C as b,D as Tt,G as R,aL as wt,M as xt,x as Dt}from"./index-Cn8n78WY.js";import{V as xe,a as X}from"./VRow-wnB9-z5S.js";import{V as K}from"./VAlert-VK7UgJrJ.js";import{V as We,a as Ct,b as Vt,c as De,d as fe,e as St}from"./VTabsWindowItem-CS5L7r5E.js";import{V as z,a as Ce,m as jt,b as Pt}from"./VChip-DHgLt883.js";import{V as he,a as Ve}from"./VBadge-DJQBaRax.js";import{V as At}from"./VTextarea-UjusT8jF.js";import{a as Et,b as Se,c as je,d as Bt,e as Nt,f as Rt,V as Ft}from"./VTextField-DKNOTL7-.js";import{V as Pe}from"./VSwitch-Dn3d6fMC.js";import{V as Mt}from"./VSkeletonLoader--_7z_lMS.js";import{V as Lt,a as Wt}from"./VDataTable-DLLvkVRb.js";import{V as zt}from"./VContainer-BJhgZZOW.js";import"./VCheckboxBtn-B4CYjYEo.js";import"./filter-DaaCXXZz.js";import"./VMenu-C3lSYlxV.js";function It(){function t(o){var s,r;return[...((s=o.dataTransfer)==null?void 0:s.items)??[]].filter(l=>l.kind==="file").map(l=>l.webkitGetAsEntry()).filter(Boolean).length>0||[...((r=o.dataTransfer)==null?void 0:r.files)??[]].length>0}async function e(o){var r,l;const a=[],s=[...((r=o.dataTransfer)==null?void 0:r.items)??[]].filter(d=>d.kind==="file").map(d=>d.webkitGetAsEntry()).filter(Boolean);if(s.length)for(const d of s){const f=await ze(d,Ie(".",d));a.push(...f.map(h=>h.file))}else a.push(...((l=o.dataTransfer)==null?void 0:l.files)??[]);return a}return{handleDrop:e,hasFilesOrFolders:t}}function ze(t){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";return new Promise((o,a)=>{t.isFile?t.file(r=>o([{file:r,path:e}]),a):t.isDirectory&&t.createReader().readEntries(async r=>{const l=[];for(const d of r)l.push(...await ze(d,Ie(e,d)));o(l)})})}function Ie(t,e){return e.isDirectory?`${t}/${e.name}`:t}const _t=le({filterByType:String},"file-accept");function Ut(t){const e=L(()=>t.filterByType?Ot(t.filterByType):null);function o(a){if(e.value){const s=a.filter(e.value);return{accepted:s,rejected:a.filter(r=>!s.includes(r))}}return{accepted:a,rejected:[]}}return{filterAccepted:o}}function Ot(t){const e=t.split(",").map(r=>r.trim().toLowerCase()),o=e.filter(r=>r.startsWith(".")),a=e.filter(r=>r.endsWith("/*")),s=e.filter(r=>!o.includes(r)&&!a.includes(r));return r=>{var f,h;const l=((f=r.name.split(".").at(-1))==null?void 0:f.toLowerCase())??"",d=((h=r.type.split("/").at(0))==null?void 0:h.toLowerCase())??"";return s.includes(r.type)||o.includes(`.${l}`)||a.includes(`${d}/*`)}}const Yt=le({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))},truncateLength:{type:[Number,String],default:22},...Rt({prependIcon:"$file"}),modelValue:{type:[Array,Object],default:t=>t.multiple?[]:null,validator:t=>Re(t).every(e=>e!=null&&typeof e=="object")},..._t(),...Nt({clearable:!0})},"VFileInput"),Ht=ye()({name:"VFileInput",inheritAttrs:!1,props:Yt(),emits:{"click:control":t=>!0,"mousedown:control":t=>!0,"update:focused":t=>!0,"update:modelValue":t=>!0,rejected:t=>!0},setup(t,e){let{attrs:o,emit:a,slots:s}=e;const{t:r}=et(),{filterAccepted:l}=Ut(t),d=Ne(t,"modelValue",t.modelValue,u=>Re(u),u=>!t.multiple&&Array.isArray(u)?u[0]:u),{isFocused:f,focus:h,blur:v}=Et(t),w=L(()=>typeof t.showSize!="boolean"?t.showSize:void 0),k=L(()=>(d.value??[]).reduce((u,g)=>{let{size:O=0}=g;return u+O},0)),V=L(()=>we(k.value,w.value)),D=L(()=>(d.value??[]).map(u=>{const{name:g="",size:O=0}=u,Y=ie(g);return t.showSize?`${Y} (${we(O,w.value)})`:Y})),G=L(()=>{var g;const u=((g=d.value)==null?void 0:g.length)??0;return t.showSize?r(t.counterSizeString,u,V.value):r(t.counterString,u)}),A=Q(),P=Q(),x=Q(),B=W(()=>f.value||t.active),N=L(()=>["plain","underlined"].includes(t.variant)),E=tt(!1),{handleDrop:J,hasFilesOrFolders:F}=It();function U(){var u;x.value!==document.activeElement&&((u=x.value)==null||u.focus()),f.value||h()}function ae(u){var g;(g=x.value)==null||g.click()}function _(u){a("mousedown:control",u)}function re(u){var g;(g=x.value)==null||g.click(),a("click:control",u)}function be(u){u.stopPropagation(),U(),at(()=>{d.value=[],rt(t["onClick:clear"],u)})}function ie(u){if(u.length<Number(t.truncateLength))return u;const g=Math.floor((Number(t.truncateLength)-1)/2);return`${u.slice(0,g)}${u.slice(u.length-g)}`}function ne(u){u.preventDefault(),u.stopImmediatePropagation(),E.value=!0}function $(u){u.preventDefault(),E.value=!1}async function Ue(u){if(u.preventDefault(),u.stopImmediatePropagation(),E.value=!1,!x.value||!F(u))return;const g=await J(u);ge(g)}function Oe(u){if(!(!u.target||u.repack))if(t.filterByType)ge([...u.target.files]);else{const g=u.target;d.value=[...g.files??[]]}}function ge(u){const g=new DataTransfer,{accepted:O,rejected:Y}=l(u);Y.length&&a("rejected",Y);for(const de of O)g.items.add(de);x.value.files=g.files,d.value=[...g.files];const oe=new Event("change",{bubbles:!0});oe.repack=!0,x.value.dispatchEvent(oe)}return st(d,u=>{(!Array.isArray(u)||!u.length)&&x.value&&(x.value.value="")}),pe(()=>{const u=!!(s.counter||t.counter),g=!!(u||s.details),[O,Y]=lt(o),{modelValue:oe,...de}=Se.filterProps(t),Ye={...je.filterProps(t),"onClick:clear":be},He=o.webkitdirectory!==void 0&&o.webkitdirectory!==!1,Ge=o.accept?String(o.accept):void 0,Je=He?void 0:t.filterByType??Ge;return n(Se,I({ref:A,modelValue:t.multiple?d.value:d.value[0],class:["v-file-input",{"v-file-input--chips":!!t.chips,"v-file-input--dragging":E.value,"v-file-input--hide":t.hideInput,"v-input--plain-underlined":N.value},t.class],style:t.style,"onClick:prepend":ae},O,de,{centerAffix:!N.value,focused:f.value}),{...s,default:ue=>{let{id:ee,isDisabled:Z,isDirty:ve,isReadonly:ke,isValid:qe,hasDetails:Xe}=ue;return n(je,I({ref:P,prependIcon:t.prependIcon,onMousedown:_,onClick:re,"onClick:prependInner":t["onClick:prependInner"],"onClick:appendInner":t["onClick:appendInner"]},Ye,{id:ee.value,active:B.value||ve.value,dirty:ve.value||t.dirty,disabled:Z.value,focused:f.value,details:Xe.value,error:qe.value===!1,onDragover:ne,onDrop:Ue}),{...s,default:Ze=>{var Te;let{props:{class:Ke,...Qe},controlRef:$e}=Ze;return y(C,null,[y("input",I({ref:H=>x.value=$e.value=H,type:"file",accept:Je,readonly:ke.value,disabled:Z.value,multiple:t.multiple,name:t.name,onClick:H=>{H.stopPropagation(),ke.value&&H.preventDefault(),U()},onChange:Oe,onDragleave:$,onFocus:U,onBlur:v},Qe,Y),null),y("div",{class:Fe(Ke)},[!!((Te=d.value)!=null&&Te.length)&&!t.hideInput&&(s.selection?s.selection({fileNames:D.value,totalBytes:k.value,totalBytesReadable:V.value}):t.chips?D.value.map(H=>n(z,{key:H,size:"small",text:H},null)):D.value.join(", "))])])}})},details:g?ue=>{var ee,Z;return y(C,null,[(ee=s.details)==null?void 0:ee.call(s,ue),u&&y(C,null,[y("span",null,null),n(Bt,{active:!!((Z=d.value)!=null&&Z.length),value:G.value,disabled:t.disabled},s.counter)])])}:void 0})}),Me({},A,P,x)}}),_e=le({fixed:Boolean,sliderColor:String,sliderTransition:String,sliderTransitionDuration:[String,Number],hideSlider:Boolean,direction:{type:String,default:"horizontal"},...ot(dt({selectedClass:"v-tab--selected",variant:"text"}),["active","block","flat","location","position","symbol"])},"VTab"),se=ye()({name:"VTab",props:_e(),setup(t,e){let{slots:o,attrs:a}=e;const{textColorClasses:s,textColorStyles:r}=it(()=>t.sliderColor),{backgroundColorClasses:l,backgroundColorStyles:d}=Le(()=>t.sliderColor),f=Q(),h=Q(),v=L(()=>t.direction==="horizontal"),w=L(()=>{var A,P;return((P=(A=f.value)==null?void 0:A.group)==null?void 0:P.isSelected.value)??!1});function k(A,P){return{opacity:[0,1]}}function V(A,P){return t.direction==="vertical"?{transform:["scaleY(0)","scaleY(1)"]}:{transform:["scaleX(0)","scaleX(1)"]}}function D(A,P){const x=P.getBoundingClientRect(),B=A.getBoundingClientRect(),N=v.value?"x":"y",E=v.value?"X":"Y",J=v.value?"right":"bottom",F=v.value?"width":"height",U=x[N],ae=B[N],_=U>ae?x[J]-B[J]:x[N]-B[N],re=Math.sign(_)>0?v.value?"right":"bottom":Math.sign(_)<0?v.value?"left":"top":"center",ie=(Math.abs(_)+(Math.sign(_)<0?x[F]:B[F]))/Math.max(x[F],B[F])||0,ne=x[F]/B[F]||0,$=1.5;return{transform:[`translate${E}(${_}px) scale${E}(${ne})`,`translate${E}(${_/$}px) scale${E}(${(ie-1)/$+1})`,"none"],transformOrigin:Array(3).fill(re)}}function G(A){var x,B;let{value:P}=A;if(P){const N=(B=(x=f.value)==null?void 0:x.$el.parentElement)==null?void 0:B.querySelector(".v-tab--selected .v-tab__slider"),E=h.value;if(!N||!E)return;const J=getComputedStyle(N).color,F={fade:k,grow:V,shift:D}[t.sliderTransition??"shift"]??D,U=Number(t.sliderTransitionDuration)||({fade:400,grow:350,shift:225}[t.sliderTransition??"shift"]??225);ut(E,{backgroundColor:[J,"currentcolor"],...F(E,N)},{duration:U,easing:ct})}}return pe(()=>{const A=M.filterProps(t);return n(M,I({symbol:We,ref:f,class:["v-tab",t.class,w.value?l.value:[]],style:[t.style,w.value?d.value:[]],tabindex:w.value?0:-1,role:"tab","aria-selected":String(w.value),active:!1},A,a,{block:t.fixed,maxWidth:t.fixed?300:void 0,"onGroup:selected":G}),{...o,default:()=>{var P;return y(C,null,[((P=o.default)==null?void 0:P.call(o))??t.text,!t.hideSlider&&y("div",{ref:h,class:Fe(["v-tab__slider",s.value]),style:nt(r.value)},null)])}})}),Me({},f)}});function Gt(t){return t?t.map(e=>gt(e)?e:{text:e,value:e}):[]}const Jt=le({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,inset:Boolean,insetPadding:[String,Number],insetRadius:[String,Number],sliderColor:String,...bt(_e(),["spaced","sliderTransition","sliderTransitionDuration"]),...jt({mandatory:"force",selectedClass:"v-tab-item--selected"}),...pt(),...yt()},"VTabs"),Ae=ye()({name:"VTabs",props:Jt(),emits:{"update:modelValue":t=>!0},setup(t,e){let{attrs:o,slots:a}=e;const s=Ne(t,"modelValue"),r=L(()=>Gt(t.items)),{densityClasses:l}=mt(t),{backgroundColorClasses:d,backgroundColorStyles:f}=Le(()=>t.bgColor),{scopeId:h}=ft();return ht({VTab:{color:W(t,"color"),direction:W(t,"direction"),stacked:W(t,"stacked"),fixed:W(t,"fixedTabs"),sliderColor:W(t,"sliderColor"),sliderTransition:W(t,"sliderTransition"),sliderTransitionDuration:W(t,"sliderTransitionDuration"),hideSlider:W(t,"hideSlider")}}),pe(()=>{const v=Ce.filterProps(t),w=!!(a.window||t.items.length>0);return y(C,null,[n(Ce,I(v,{modelValue:s.value,"onUpdate:modelValue":k=>s.value=k,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--inset":t.inset,"v-tabs--stacked":t.stacked},l.value,d.value,t.class],style:[{"--v-tabs-height":ce(t.height),"--v-tabs-inset-padding":t.inset?ce(t.insetPadding):void 0,"--v-tabs-inset-radius":t.inset?ce(t.insetRadius):void 0},f.value,t.style],role:"tablist",symbol:We},h,o),{default:a.default??(()=>r.value.map(k=>{var V;return((V=a.tab)==null?void 0:V.call(a,{item:k}))??n(se,I(k,{key:k.text,value:k.value,spaced:t.spaced}),{default:a[`tab.${k.value}`]?()=>{var D;return(D=a[`tab.${k.value}`])==null?void 0:D.call(a,{item:k})}:void 0})})),prev:a.prev,next:a.next}),w&&n(Vt,I({modelValue:s.value,"onUpdate:modelValue":k=>s.value=k,key:"tabs-window"},h),{default:()=>{var k;return[r.value.map(V=>{var D;return((D=a.item)==null?void 0:D.call(a,{item:V}))??n(Ct,{value:V.value},{default:()=>{var G;return(G=a[`item.${V.value}`])==null?void 0:G.call(a,{item:V})}})}),(k=a.window)==null?void 0:k.call(a)]}})])}),{}}}),Ee=()=>new Promise((t,e)=>{if(typeof window.jsyaml<"u")return t(window.jsyaml);const o=document.createElement("script");o.src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js",o.async=!0,o.onload=()=>t(window.jsyaml),o.onerror=()=>e(new Error("无法加载YAML解析库")),document.head.appendChild(o)});class Be{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 a of e)this.subjects.push({name:a.name,simplified_name:a.simplified_name||null,teacher:a.teacher||null,room:a.room||null});const o=this.data.schedules||[];for(const a of o){const s=[];for(const r of a.classes||[])s.push({subject:r.subject,start_time:r.start_time,end_time:r.end_time});this.schedules.push({name:a.name,enable_day:a.enable_day,weeks:a.weeks||"all",classes:s})}}getSubjects(){return this.subjects}getSchedules(){return this.schedules}getScheduleByDay(e){const o=this.schedules.find(a=>a.enable_day===e);return o?o.classes:[]}toCsesData(){return{version:this.version,subjects:this.subjects,schedules:this.schedules}}}const qt={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(a=>this.exportPeriods.includes(a.period)),o={};return e.sort((a,s)=>a.period-s.period).forEach((a,s)=>{o[a.period]=s+1}),e.forEach(a=>{for(let s=1;s<=7;s++){if(!this.selectedDays.includes(s))continue;const r=a[s];if(r)if(Array.isArray(r))r.forEach(l=>{!l||!l.name||t.push({originalPeriod:a.period,period:o[a.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(!r.name)continue;t.push({originalPeriod:a.period,period:o[a.period],subject:r.name,day:this.dayNames[s],startTime:r.startTime,endTime:r.endTime,teacher:this.settings.hideTeacherName?"":r.teacher||"",room:this.settings.hideRoom?"":r.room||"",weeks:r.weekType?`1-${this.settings.totalWeeks}${r.weekType}`:`1-${this.settings.totalWeeks}`})}}}),t.sort((a,s)=>{if(a.period!==s.period)return a.period-s.period;const r={周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7};return r[a.day]-r[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 Ee(),this.yamlLibLoaded=!0}catch(e){this.error=`无法加载YAML解析库: ${e.message}`;return}try{const e=new FileReader;e.onload=async o=>{try{this.jsonText=o.target.result,await this.processInput()}catch(a){this.error=`文件读取失败: ${a.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 o=this.parseYaml(this.jsonText);t=new Be(o).toCsesData()}else t=JSON.parse(this.jsonText)}catch(o){throw new Error(`格式解析错误: ${o.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(o=>o.period))}catch(t){this.error="数据处理失败:"+t.message,console.error(t)}finally{this.loading=!1}},validateCsesFormat(t){return t instanceof Be?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:o}=t,a=Object.fromEntries(o.map(l=>[l.name,l])),s=[];let r=0;e.forEach(l=>{l.classes&&l.classes.length>r&&(r=l.classes.length)});for(let l=1;l<=r;l++)s.push({period:l,1:null,2:null,3:null,4:null,5:null,6:null,7:null});return e.forEach(l=>{const d=l.enable_day;if(!d||d<1||d>7)return;let f="";l.weeks==="odd"?f="单":l.weeks==="even"&&(f="双"),l.classes.forEach((h,v)=>{if(!h.subject)return;const w=v+1;if(w>r)return;const k=a[h.subject]||{},V={name:h.subject,teacher:k.teacher||"",room:k.room||"",period:w,startTime:h.start_time,endTime:h.end_time,day:d,weekType:f},D=s[w-1][d];D?f&&D.weekType&&f!==D.weekType?(Array.isArray(s[w-1][d])||(s[w-1][d]=[D]),s[w-1][d].push(V)):f===D.weekType?s[w-1][d]=V:f||(s[w-1][d]=V):s[w-1][d]=V})}),{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 r of this.daysWithSchedule){const l=this.groupByPeriod(this.getDaySchedule(r));for(const d of l)for(const f of d.items){const h={周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7}[f.day],v=this.settings.hideTeacherName?"":f.teacher||"",w=this.settings.hideRoom?"":f.room||"";t+=`${f.subject},${h},${f.period},${f.period},${v},${w},${f.weeks}
`}}const e="\uFEFF",o=new Blob([e+t],{type:"text/csv;charset=utf-8"}),a=document.createElement("a");a.href=URL.createObjectURL(o),a.download=`course_schedule_${this.totalClassHours}课时.csv`,a.click(),URL.revokeObjectURL(a.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(o=>({周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7})[o.day]===t):[]},getUnfilteredTimeTableData(){if(!this.processedData||!this.processedData.tableData)return[];const t=[],e=this.processedData.tableData.filter(a=>this.exportPeriods.includes(a.period)),o={};return e.sort((a,s)=>a.period-s.period).forEach((a,s)=>{o[a.period]=s+1}),e.forEach(a=>{for(let s=1;s<=7;s++){const r=a[s];if(r)if(Array.isArray(r))r.forEach(l=>{!l||!l.name||t.push({originalPeriod:a.period,period:o[a.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(!r.name)continue;t.push({originalPeriod:a.period,period:o[a.period],subject:r.name,day:this.dayNames[s],startTime:r.startTime,endTime:r.endTime,teacher:this.settings.hideTeacherName?"":r.teacher||"",room:this.settings.hideRoom?"":r.room||"",weeks:r.weekType?`1-${this.settings.totalWeeks}${r.weekType}`:`1-${this.settings.totalWeeks}`})}}}),t.sort((a,s)=>{if(a.period!==s.period)return a.period-s.period;const r={周一:1,周二:2,周三:3,周四:4,周五:5,周六:6,周日:7};return r[a.day]-r[s.day]})},groupByPeriod(t){const e={};return t.forEach(o=>{e[o.period]||(e[o.period]={period:o.period,originalPeriod:o.originalPeriod,items:[],timeSlots:[]}),e[o.period].items.push(o),e[o.period].timeSlots.push({startTime:o.startTime,endTime:o.endTime})}),Object.values(e).forEach(o=>{o.uniqueTimeSlots=[],o.timeSlots.forEach(a=>{o.uniqueTimeSlots.some(s=>s.startTime===a.startTime&&s.endTime===a.endTime)||o.uniqueTimeSlots.push(a)}),o.uniqueTimeSlots.sort((a,s)=>a.startTime.localeCompare(s.startTime))}),Object.values(e).sort((o,a)=>o.period-a.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 Ee(),this.yamlLibLoaded=!0}catch(t){this.error=t.message}this.$watch("daysWithSchedule",t=>{t.length>0&&!this.activeDay&&(this.activeDay=t[0])})}},Xt={class:"d-flex align-center"},Zt={class:"d-flex align-center"},Kt={key:2,class:"text-caption mb-2"},Qt={class:"d-flex align-center mb-2"},$t={class:"d-flex align-center mb-3"},es={class:"d-flex align-center mb-3"},ts={key:0,class:"course-cell"},ss={key:0},ls={key:1},as={key:2,class:"week-type"},rs={key:0},is={key:1},ns={key:2,class:"week-type"},os={class:"text-center font-weight-bold"};function ds(t,e,o,a,s,r){return m(),S(zt,{class:"fill-height"},{default:i(()=>[n(xe,null,{default:i(()=>[n(X,{cols:"12"},{default:i(()=>[n(q,{class:"elevation-12",border:""},{default:i(()=>[n(me,{class:"d-flex align-center primary lighten-1 white--text py-3 px-4"},{default:i(()=>[n(j,{color:"white",class:"mr-2"},{default:i(()=>[...e[15]||(e[15]=[c("mdi-swap-horizontal",-1)])]),_:1}),e[16]||(e[16]=c(" 课程表转换工具 ",-1))]),_:1}),n(kt,null,{default:i(()=>[...e[17]||(e[17]=[c(" 将CSES格式的JSON或YAML文本转换为WakeUp软件使用的课程表 ",-1)])]),_:1}),n(te,null,{default:i(()=>[s.error?(m(),S(K,{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(()=>[y("div",Xt,[n(j,{class:"mr-2"},{default:i(()=>[...e[18]||(e[18]=[c("mdi-alert-circle",-1)])]),_:1}),c(" "+b(s.error),1)])]),_:1})):T("",!0),s.success?(m(),S(K,{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(()=>[y("div",Zt,[n(j,{class:"mr-2"},{default:i(()=>[...e[19]||(e[19]=[c("mdi-check-circle",-1)])]),_:1}),c(" "+b(s.success),1)])]),_:1})):T("",!0),n(Ae,{modelValue:s.activeTab,"onUpdate:modelValue":e[2]||(e[2]=l=>s.activeTab=l),class:"mb-4 mx-2",color:"primary",rounded:""},{default:i(()=>[n(se,{value:"text",class:"px-5"},{default:i(()=>[n(j,{start:""},{default:i(()=>[...e[20]||(e[20]=[c("mdi-text-box",-1)])]),_:1}),e[21]||(e[21]=c(" 文本粘贴 ",-1))]),_:1}),n(se,{value:"file",class:"px-5"},{default:i(()=>[n(j,{start:""},{default:i(()=>[...e[22]||(e[22]=[c("mdi-file-upload",-1)])]),_:1}),e[23]||(e[23]=c(" 文件上传 ",-1))]),_:1})]),_:1},8,["modelValue"]),n(Tt,{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(()=>[n(M,{value:"auto"},{default:i(()=>[...e[24]||(e[24]=[c("自动检测",-1)])]),_:1}),n(M,{value:"json"},{default:i(()=>[...e[25]||(e[25]=[c("JSON",-1)])]),_:1}),n(M,{value:"yaml",disabled:!s.yamlLibLoaded},{default:i(()=>[e[26]||(e[26]=c(" YAML ",-1)),n(he,{activator:"parent",location:"bottom"},{default:i(()=>[c(b(s.yamlLibLoaded?"YAML解析库已加载":"正在加载YAML解析库..."),1)]),_:1})]),_:1},8,["disabled"])]),_:1},8,["modelValue"]),s.jsonText&&s.formatMode==="auto"?(m(),p("div",Kt," 检测到的格式: "+b(r.isYaml(s.jsonText)?"YAML":"JSON"),1)):T("",!0),n(De,{modelValue:s.activeTab,"onUpdate:modelValue":e[6]||(e[6]=l=>s.activeTab=l)},{default:i(()=>[n(fe,{value:"text"},{default:i(()=>[y("div",Qt,[n(At,{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:r.handleTextChange},null,8,["modelValue","loading","disabled","onInput"])])]),_:1}),n(fe,{value:"file"},{default:i(()=>[n(Ht,{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:r.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"?(m(),S(K,{key:0,type:"info",class:"mb-4",variant:"tonal",density:"compact"},{default:i(()=>[...e[27]||(e[27]=[c(" 将根据文件扩展名自动检测格式 ",-1)])]),_:1})):T("",!0)]),_:1})]),_:1},8,["modelValue"]),n(X,{cols:"12"},{default:i(()=>[n(q,{flat:"",class:"pa-4 rounded-lg",border:""},{default:i(()=>[y("div",$t,[n(j,{color:"primary",class:"mr-2"},{default:i(()=>[...e[28]||(e[28]=[c("mdi-calendar-multiselect",-1)])]),_:1}),e[33]||(e[33]=y("h3",{class:"text-subtitle-1 font-weight-medium mr-auto"},"选择导出天数",-1)),n(M,{variant:"text",color:"primary",class:"ml-2",onClick:r.selectAllDays},{default:i(()=>[n(j,{start:"",size:"small"},{default:i(()=>[...e[29]||(e[29]=[c("mdi-checkbox-multiple-marked",-1)])]),_:1}),e[30]||(e[30]=c(" 全选 ",-1))]),_:1},8,["onClick"]),n(M,{variant:"text",color:"error",class:"ml-2",onClick:r.clearSelectedDays},{default:i(()=>[n(j,{start:"",size:"small"},{default:i(()=>[...e[31]||(e[31]=[c("mdi-checkbox-multiple-blank-outline",-1)])]),_:1}),e[32]||(e[32]=c(" 清除 ",-1))]),_:1},8,["onClick"])]),n(Pt,{modelValue:s.selectedDays,"onUpdate:modelValue":e[7]||(e[7]=l=>s.selectedDays=l),multiple:"",class:"mb-2",color:"primary"},{default:i(()=>[(m(),p(C,null,R(7,l=>n(z,{key:l,value:l,filter:"",variant:"tonal",class:"filter-chip",label:""},{default:i(()=>[c(b(s.dayNames[l])+" ",1),r.getDaySchedule(l).length>0?(m(),S(Ve,{key:0,content:r.getDaySchedule(l).length,color:"primary",inline:""},null,8,["content"])):T("",!0)]),_:2},1032,["value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),n(X,{cols:"12"},{default:i(()=>[n(q,{flat:"",class:"pa-4 rounded-lg",border:""},{default:i(()=>[y("div",es,[n(j,{color:"primary",class:"mr-2"},{default:i(()=>[...e[34]||(e[34]=[c("mdi-cog",-1)])]),_:1}),e[35]||(e[35]=y("h3",{class:"text-subtitle-1 font-weight-medium"},"显示配置",-1))]),n(xe,null,{default:i(()=>[n(X,{cols:"12",sm:"6"},{default:i(()=>[n(Pe,{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}),n(X,{cols:"12",sm:"6"},{default:i(()=>[n(Pe,{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}),n(X,{cols:"12",sm:"6"},{default:i(()=>[n(Ft,{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?(m(),S(q,{key:3,class:"my-4",outlined:""},{default:i(()=>[n(te,null,{default:i(()=>[n(Mt,{type:"table",class:"mx-auto"})]),_:1})]),_:1})):T("",!0),s.processedData?(m(),S(z,{key:4,color:"primary",class:"ml-2","prepend-icon":"mdi-book-open-variant"},{default:i(()=>[c(b(s.processedData.tableData.length)+" 节课程 ",1)]),_:1})):T("",!0),s.processedData&&s.exportPeriods.length===0?(m(),S(K,{key:5,type:"warning",class:"mb-4",closable:""},{default:i(()=>[...e[36]||(e[36]=[c(" 请选择要导出的节次 ",-1)])]),_:1})):T("",!0),s.processedData?(m(),S(q,{key:6,class:"my-4",elevation:"1"},{default:i(()=>[n(me,{class:"d-flex align-center pa-4 bg-primary-lighten-5"},{default:i(()=>[n(j,{color:"primary",class:"mr-2"},{default:i(()=>[...e[37]||(e[37]=[c("mdi-table",-1)])]),_:1}),e[39]||(e[39]=y("span",{class:"font-weight-bold"},"课程表",-1)),n(z,{color:"primary",class:"ml-3",size:"small",pill:""},{default:i(()=>[n(j,{start:"",size:"x-small"},{default:i(()=>[...e[38]||(e[38]=[c("mdi-book-open-variant",-1)])]),_:1}),c(" "+b(s.processedData.tableData.length)+" 节课程 ",1)]),_:1})]),_:1}),n(te,{class:"pa-0"},{default:i(()=>[n(Lt,{"items-selected":s.selectedRows,"onUpdate:itemsSelected":[e[12]||(e[12]=l=>s.selectedRows=l),r.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":""},wt({"item.data-table-select":i(({item:l})=>[n(St,{modelValue:s.exportPeriods,"onUpdate:modelValue":e[11]||(e[11]=d=>s.exportPeriods=d),value:l.period,"hide-details":"",density:"compact"},null,8,["modelValue","value"])]),_:2},[R(7,l=>({name:`item.${l}`,fn:i(({item:d})=>[d[l]?(m(),p("div",ts,[Array.isArray(d[l])?(m(!0),p(C,{key:0},R(d[l],(f,h)=>(m(),p("div",{key:h,class:"course-item"},[c(b(f.name)+" ",1),!s.settings.hideTeacherName&&f.teacher?(m(),p("span",ss,[e[40]||(e[40]=y("br",null,null,-1)),c(b(f.teacher),1)])):T("",!0),!s.settings.hideRoom&&f.room?(m(),p("span",ls,[e[41]||(e[41]=y("br",null,null,-1)),c(b(f.room),1)])):T("",!0),f.weekType?(m(),p("span",as,b(f.weekType)+"周 ",1)):T("",!0)]))),128)):(m(),p(C,{key:1},[c(b(d[l].name)+" ",1),!s.settings.hideTeacherName&&d[l].teacher?(m(),p("span",rs,[e[42]||(e[42]=y("br",null,null,-1)),c(b(d[l].teacher),1)])):T("",!0),!s.settings.hideRoom&&d[l].room?(m(),p("span",is,[e[43]||(e[43]=y("br",null,null,-1)),c(b(d[l].room),1)])):T("",!0),d[l].weekType?(m(),p("span",ns,b(d[l].weekType)+"周 ",1)):T("",!0)],64))])):T("",!0)])}))]),1032,["items-selected","headers","items","onUpdate:itemsSelected"])]),_:1})]),_:1})):T("",!0),r.hasExportData?(m(),S(q,{key:7,class:"my-4",elevation:"1"},{default:i(()=>[n(me,{class:"d-flex align-center pa-4 bg-primary-lighten-5"},{default:i(()=>[n(j,{color:"primary",class:"mr-2"},{default:i(()=>[...e[44]||(e[44]=[c("mdi-timetable",-1)])]),_:1}),e[48]||(e[48]=y("span",{class:"font-weight-bold"},"每日课程时间表",-1)),n(z,{class:"ml-3",size:"small",color:"primary",pill:""},{default:i(()=>[n(j,{start:"",size:"x-small"},{default:i(()=>[...e[45]||(e[45]=[c("mdi-clock-outline",-1)])]),_:1}),c(" "+b(r.totalClassHours)+" 课时 ",1)]),_:1}),s.exportPeriods.length>0?(m(),S(he,{key:0},{activator:i(({props:l})=>[n(z,I({class:"ml-2",size:"small",color:"info"},l,{pill:""}),{default:i(()=>[n(j,{start:"",size:"x-small"},{default:i(()=>[...e[46]||(e[46]=[c("mdi-information-outline",-1)])]),_:1}),e[47]||(e[47]=c(" 节次已重排 ",-1))]),_:1},16)]),default:i(()=>[y("span",null,"已将选中的节次 "+b(s.exportPeriods.join(", "))+" 重新排序为连续的 1-"+b(s.exportPeriods.length),1)]),_:1})):T("",!0)]),_:1}),n(te,null,{default:i(()=>[r.daysWithSchedule.length>0?(m(),S(Ae,{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(()=>[(m(!0),p(C,null,R(r.daysWithSchedule,l=>(m(),S(se,{key:l,value:l,class:"px-2 font-weight-medium"},{default:i(()=>[c(b(s.dayNames[l])+" ",1),n(Ve,{content:r.getDaySchedule(l).length,color:"primary",inline:""},null,8,["content"])]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])):T("",!0),n(De,{modelValue:s.activeDay,"onUpdate:modelValue":e[14]||(e[14]=l=>s.activeDay=l)},{default:i(()=>[(m(!0),p(C,null,R(r.daysWithSchedule,l=>(m(),S(fe,{key:l,value:l},{default:i(()=>[n(Wt,{density:"compact",class:"rounded","headers-length":6,"disable-sort":""},{default:i(()=>[e[50]||(e[50]=y("thead",null,[y("tr",null,[y("th",{class:"text-center"},"节次"),y("th",null,"课程"),y("th",null,"时间"),y("th",null,"教师"),y("th",null,"教室"),y("th",null,"周次")])],-1)),y("tbody",null,[(m(!0),p(C,null,R(r.groupByPeriod(r.getDaySchedule(l)),(d,f)=>(m(),p("tr",{key:f},[y("td",os,[c(b(d.period)+" ",1),d.originalPeriod!==d.period?(m(),S(he,{key:0},{activator:i(({props:h})=>[n(j,I({size:"x-small"},{ref_for:!0},h,{color:"info",class:"ml-1"}),{default:i(()=>[...e[49]||(e[49]=[c("mdi-sync",-1)])]),_:1},16)]),default:i(()=>[c(" 原节次: "+b(d.originalPeriod),1)]),_:2},1024)):T("",!0)]),y("td",null,[(m(!0),p(C,null,R(d.items,(h,v)=>(m(),p("div",{key:v,class:"mb-1"},[n(z,{size:"small",color:r.getSubjectColor(h.subject),label:"","text-color":"white",class:"mr-1"},{default:i(()=>[c(b(h.subject),1)]),_:2},1032,["color"]),d.items.length>1?(m(),S(z,{key:0,size:"x-small",class:"ml-1",color:h.weekType==="单"?"warning":"success"},{default:i(()=>[c(b(h.weekType)+"周 ",1)]),_:2},1032,["color"])):T("",!0)]))),128))]),y("td",null,[(m(!0),p(C,null,R(d.uniqueTimeSlots,(h,v)=>(m(),p("div",{key:v,class:"mb-1"},[n(z,{size:"x-small",class:"time-chip"},{default:i(()=>[c(b(r.formatTime(h.startTime))+" - "+b(r.formatTime(h.endTime)),1)]),_:2},1024)]))),128))]),y("td",null,[s.settings.hideTeacherName?(m(),p(C,{key:1},[c("-")],64)):(m(!0),p(C,{key:0},R(d.items,(h,v)=>(m(),p("div",{key:v,class:"mb-1"},b(h.teacher||"-"),1))),128))]),y("td",null,[s.settings.hideRoom?(m(),p(C,{key:1},[c("-")],64)):(m(!0),p(C,{key:0},R(d.items,(h,v)=>(m(),p("div",{key:v,class:"mb-1"},b(h.room||"-"),1))),128))]),y("td",null,[(m(!0),p(C,null,R(d.items,(h,v)=>(m(),p("div",{key:v,class:"mb-1"},b(h.weeks),1))),128))])]))),128))])]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"]),r.hasExportData&&r.daysWithSchedule.length===0?(m(),S(K,{key:1,type:"info",class:"mt-3"},{default:i(()=>[...e[51]||(e[51]=[c(" 没有找到任何课程数据 ",-1)])]),_:1})):T("",!0)]),_:1})]),_:1})):T("",!0)]),_:1}),n(xt,{class:""},{default:i(()=>[n(Dt),n(M,{color:"primary",variant:"outlined",loading:s.loading,disabled:!s.jsonText&&!s.file||s.loading,onClick:r.processInput,"prepend-icon":"mdi-cog-refresh"},{default:i(()=>[...e[52]||(e[52]=[c(" 处理数据 ",-1)])]),_:1},8,["loading","disabled","onClick"]),n(M,{color:"info",disabled:!r.hasExportData,onClick:r.showExportPreview,class:"ml-2","prepend-icon":"mdi-eye",border:""},{default:i(()=>[...e[53]||(e[53]=[c(" 刷新 ",-1)])]),_:1},8,["disabled","onClick"]),n(M,{color:"success",variant:"outlined",disabled:!r.hasExportData,onClick:r.downloadCSV,class:"ml-2","prepend-icon":"mdi-download",border:""},{default:i(()=>[...e[54]||(e[54]=[c(" 下载CSV ",-1)])]),_:1},8,["disabled","onClick"])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const Cs=vt(qt,[["render",ds],["__scopeId","data-v-c07f22af"]]);export{Cs as default};