2 lines
8.8 KiB
JavaScript
2 lines
8.8 KiB
JavaScript
import{_ as j}from"./_plugin-vue_export-helper-af00840d.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{u as H,r as M,A as D,o as W,c as _,d as s,s as c,m as u,K as w,f as n,h as p,t as d,e,F as B,B as T,i as K,R as F,V as Y,E as X,z as Z,l as r,W as q,X as Q,Y as tt,Z as st,_ as et,$ as ot,a0 as at,a1 as nt,n as lt,C,a2 as it,a3 as dt,L as rt,G as I,a4 as ct,a5 as ut,S as _t,U as mt,I as ft}from"./index-cb898b04.js";import{u as pt}from"./jobs-6be64b92.js";const vt={class:"home-view"},gt={class:"welcome-section"},wt={class:"welcome-card content-card"},yt={class:"welcome-content"},ht={class:"welcome-text"},kt={class:"welcome-title"},Ct={class:"welcome-subtitle"},Et={class:"welcome-actions"},bt={class:"stats-section"},St={class:"section-title"},$t={class:"stats-grid"},xt={class:"stat-card"},Mt={class:"stat-icon primary"},Dt={class:"stat-value"},Bt={class:"stat-card"},Tt={class:"stat-icon warning"},Ft={class:"stat-value"},It={class:"stat-card"},zt={class:"stat-icon success"},At={class:"stat-value"},Nt={class:"stat-card"},Jt={class:"stat-icon danger"},Lt={class:"stat-value"},Vt={class:"recent-jobs-section"},Pt={class:"content-card"},Ot={class:"card-header"},Rt={class:"card-actions"},Gt={class:"card-body"},Ut={key:0,class:"loading-state"},jt={key:1,class:"empty-state"},Ht={key:2,class:"job-list"},Wt=["onClick"],Kt={class:"job-icon"},Yt={class:"job-info"},Xt={class:"job-name"},Zt={class:"job-details"},qt={class:"job-size"},Qt={class:"job-languages"},ts={class:"job-status"},ss={key:0,class:"job-progress"},es={class:"job-time"},os={key:0,class:"announcements-section"},as={class:"content-card"},ns={class:"card-body"},ls={class:"announcements-list"},is={class:"announcement-icon"},ds={class:"announcement-content"},rs={class:"announcement-title"},cs={class:"announcement-message"},us={class:"announcement-time"},_s={key:0,class:"announcement-actions"},ms={__name:"HomeView",setup(fs){const z=K(),E=H(),m=pt(),y=M(!1),b=M([{id:1,type:"info",title:"系統更新通知",message:"系統已更新至最新版本,新增了批量下載功能。",created_at:new Date().toISOString(),actionText:"了解更多"},{id:2,type:"warning",title:"維護通知",message:"系統將於本週日凌晨 2:00-4:00 進行定期維護。",created_at:new Date(Date.now()-864e5).toISOString()}]),v=D(()=>m.jobStats),S=D(()=>m.jobs.slice(0,5)),A=async()=>{try{await m.fetchJobs({per_page:10}),F.success("統計資料已刷新")}catch(a){console.error("刷新統計失敗:",a)}},$=a=>{z.push(`/job/${a}`)},N=async(a,t)=>{switch(a){case"view":$(t.job_uuid);break;case"download":if(t.target_languages.length===1){const i=`${t.original_filename.replace(/\.[^/.]+$/,"")}_${t.target_languages[0]}_translated.${h(t.original_filename)}`;await m.downloadFile(t.job_uuid,t.target_languages[0],i)}else{const i=`${t.original_filename.replace(/\.[^/.]+$/,"")}_translated.zip`;await m.downloadAllFiles(t.job_uuid,i)}break;case"retry":try{await I.confirm("確定要重新翻譯此檔案嗎?","確認重試",{confirmButtonText:"確定",cancelButtonText:"取消",type:"warning"}),await m.retryJob(t.job_uuid)}catch(i){i!=="cancel"&&console.error("重試任務失敗:",i)}break;case"delete":try{await I.confirm("確定要刪除此任務嗎?此操作無法撤銷。","確認刪除",{confirmButtonText:"確定",cancelButtonText:"取消",type:"warning"}),await m.deleteJob(t.job_uuid)}catch(i){i!=="cancel"&&console.error("刪除任務失敗:",i)}break}},J=a=>{a.actionUrl?window.open(a.actionUrl,"_blank"):F.info("功能開發中,敬請期待")},h=a=>a.split(".").pop().toLowerCase(),L=a=>{if(a===0)return"0 B";const t=1024,i=["B","KB","MB","GB"],l=Math.floor(Math.log(a)/Math.log(t));return parseFloat((a/Math.pow(t,l)).toFixed(1))+" "+i[l]},V=a=>({PENDING:"等待中",PROCESSING:"處理中",COMPLETED:"已完成",FAILED:"失敗",RETRY:"重試中"})[a]||a,x=a=>{const t=new Date,i=new Date(a),l=t-i;return l<6e4?"剛剛":l<36e5?`${Math.floor(l/6e4)} 分鐘前`:l<864e5?`${Math.floor(l/36e5)} 小時前`:l<2592e6?`${Math.floor(l/864e5)} 天前`:i.toLocaleDateString("zh-TW")},P=a=>({info:"InfoFilled",warning:"WarningFilled",success:"CircleCheckFilled",error:"CircleCloseFilled"})[a]||"InfoFilled";return W(async()=>{y.value=!0;try{await m.fetchJobs({per_page:10})}catch(a){console.error("載入任務失敗:",a)}finally{y.value=!1}}),(a,t)=>{const i=Y,l=X,f=Z,O=ct,R=ut,g=_t,G=mt,U=ft;return r(),_("div",vt,[s("div",gt,[s("div",wt,[s("div",yt,[s("div",ht,[s("h1",kt,[t[6]||(t[6]=c(" 歡迎使用 PANJIT 文件翻譯系統 ",-1)),u(E).isAdmin?(r(),w(i,{key:0,type:"warning",size:"small"},{default:n(()=>[...t[5]||(t[5]=[c("管理員",-1)])]),_:1})):p("",!0)]),s("p",Ct," 歡迎回來,"+d(u(E).userName)+"! 今天是個適合處理翻譯任務的好日子。 ",1)]),s("div",Et,[e(f,{type:"primary",size:"large",onClick:t[0]||(t[0]=o=>a.$router.push("/upload"))},{default:n(()=>[e(l,null,{default:n(()=>[e(u(q))]),_:1}),t[7]||(t[7]=c(" 開始上傳檔案 ",-1))]),_:1}),e(f,{size:"large",onClick:t[1]||(t[1]=o=>a.$router.push("/jobs"))},{default:n(()=>[e(l,null,{default:n(()=>[e(u(Q))]),_:1}),t[8]||(t[8]=c(" 查看我的任務 ",-1))]),_:1})])])])]),s("div",bt,[s("div",St,[t[10]||(t[10]=s("h2",null,"任務統計",-1)),e(f,{type:"text",onClick:A},{default:n(()=>[e(l,null,{default:n(()=>[e(u(tt))]),_:1}),t[9]||(t[9]=c(" 刷新 ",-1))]),_:1})]),s("div",$t,[s("div",xt,[s("div",Mt,[e(l,null,{default:n(()=>[e(u(st))]),_:1})]),s("div",Dt,d(v.value.total),1),t[11]||(t[11]=s("div",{class:"stat-label"},"總任務數",-1))]),s("div",Bt,[s("div",Tt,[e(l,null,{default:n(()=>[e(u(et))]),_:1})]),s("div",Ft,d(v.value.pending+v.value.processing),1),t[12]||(t[12]=s("div",{class:"stat-label"},"處理中",-1))]),s("div",It,[s("div",zt,[e(l,null,{default:n(()=>[e(u(ot))]),_:1})]),s("div",At,d(v.value.completed),1),t[13]||(t[13]=s("div",{class:"stat-label"},"已完成",-1))]),s("div",Nt,[s("div",Jt,[e(l,null,{default:n(()=>[e(u(at))]),_:1})]),s("div",Lt,d(v.value.failed),1),t[14]||(t[14]=s("div",{class:"stat-label"},"失敗",-1))])])]),s("div",Vt,[s("div",Pt,[s("div",Ot,[t[16]||(t[16]=s("h3",{class:"card-title"},"最近任務",-1)),s("div",Rt,[e(f,{type:"text",onClick:t[2]||(t[2]=o=>a.$router.push("/jobs"))},{default:n(()=>[t[15]||(t[15]=c(" 查看全部 ",-1)),e(l,null,{default:n(()=>[e(u(nt))]),_:1})]),_:1})])]),s("div",Gt,[y.value?(r(),_("div",Ut,[e(O,{rows:3,animated:""})])):S.value.length===0?(r(),_("div",jt,[e(l,{class:"empty-icon"},{default:n(()=>[e(u(lt))]),_:1}),t[18]||(t[18]=s("div",{class:"empty-title"},"暫無任務記錄",-1)),t[19]||(t[19]=s("div",{class:"empty-description"}," 開始上傳您的第一個檔案進行翻譯吧! ",-1)),e(f,{type:"primary",onClick:t[3]||(t[3]=o=>a.$router.push("/upload"))},{default:n(()=>[...t[17]||(t[17]=[c(" 立即上傳 ",-1)])]),_:1})])):(r(),_("div",Ht,[(r(!0),_(B,null,T(S.value,o=>(r(),_("div",{key:o.job_uuid,class:"job-item",onClick:k=>$(o.job_uuid)},[s("div",Kt,[s("div",{class:C(["file-icon",h(o.original_filename)])},d(h(o.original_filename).toUpperCase()),3)]),s("div",Yt,[s("div",Xt,d(o.original_filename),1),s("div",Zt,[s("span",qt,d(L(o.file_size)),1),s("span",Qt,d(o.target_languages.join(", ")),1)])]),s("div",ts,[s("div",{class:C(["status-badge",o.status.toLowerCase()])},d(V(o.status)),3),o.progress>0&&o.status==="PROCESSING"?(r(),_("div",ss,[e(R,{percentage:o.progress,"stroke-width":4,"show-text":!1,color:"#409eff"},null,8,["percentage"])])):p("",!0)]),s("div",es,d(x(o.created_at)),1),s("div",{class:"job-actions",onClick:t[4]||(t[4]=it(()=>{},["stop"]))},[e(U,{trigger:"click",onCommand:k=>N(k,o)},{dropdown:n(()=>[e(G,null,{default:n(()=>[e(g,{command:"view"},{default:n(()=>[...t[20]||(t[20]=[c("查看詳情",-1)])]),_:1}),o.status==="COMPLETED"?(r(),w(g,{key:0,command:"download"},{default:n(()=>[...t[21]||(t[21]=[c(" 下載檔案 ",-1)])]),_:1})):p("",!0),o.status==="FAILED"?(r(),w(g,{key:1,command:"retry"},{default:n(()=>[...t[22]||(t[22]=[c(" 重新翻譯 ",-1)])]),_:1})):p("",!0),e(g,{command:"delete",divided:""},{default:n(()=>[...t[23]||(t[23]=[c("刪除",-1)])]),_:1})]),_:2},1024)]),default:n(()=>[e(f,{type:"text",size:"small"},{default:n(()=>[e(l,null,{default:n(()=>[e(u(dt))]),_:1})]),_:1})]),_:2},1032,["onCommand"])])],8,Wt))),128))]))])])]),b.value.length>0?(r(),_("div",os,[s("div",as,[t[24]||(t[24]=s("div",{class:"card-header"},[s("h3",{class:"card-title"},"系統公告")],-1)),s("div",ns,[s("div",ls,[(r(!0),_(B,null,T(b.value,o=>(r(),_("div",{key:o.id,class:C(["announcement-item",o.type])},[s("div",is,[e(l,null,{default:n(()=>[(r(),w(rt(P(o.type))))]),_:2},1024)]),s("div",ds,[s("div",rs,d(o.title),1),s("div",cs,d(o.message),1),s("div",us,d(x(o.created_at)),1)]),o.actionText?(r(),_("div",_s,[e(f,{type:"text",size:"small",onClick:k=>J(o)},{default:n(()=>[c(d(o.actionText),1)]),_:2},1032,["onClick"])])):p("",!0)],2))),128))])])])])):p("",!0)])}}},Es=j(ms,[["__scopeId","data-v-953480c1"]]);export{Es as default};
|