Files
Document_Translator/frontend/dist/js/JobListView-706a3b08.js
2025-09-02 10:31:35 +08:00

2 lines
12 KiB
JavaScript

import{_ as st}from"./_plugin-vue_export-helper-af00840d.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as P,A as S,af as R,o as at,w as ot,c as d,d as e,e as s,f as n,m as c,t as r,K as w,h as f,F,B,i as lt,E as nt,z as it,ae as rt,v as ut,ag as dt,l as i,W as ct,s as m,ah as z,Y as _t,a9 as pt,n as gt,C as $,a2 as ft,ai as mt,aj as vt,ac as ht,ak as wt,a8 as yt,a3 as Et,a1 as kt,L as Ct,al as bt,G as D,ad as St,a4 as It,S as Tt,U as Dt,I as Nt,a5 as xt}from"./index-cb898b04.js";import{u as Lt}from"./jobs-6be64b92.js";import{i as Mt}from"./websocket-9a0b24f7.js";const Pt={class:"job-list-view"},Rt={class:"page-header"},Ft={class:"page-actions"},Bt={class:"content-card"},zt={class:"filters-section"},$t={class:"filters-row"},Gt={class:"filter-group"},Jt={class:"filter-group"},Vt={class:"filter-actions"},Ot={class:"stats-row"},Ut={class:"stat-item"},At={class:"stat-value"},Yt={class:"stat-item"},Wt={class:"stat-value stat-pending"},Kt={class:"stat-item"},Ht={class:"stat-value stat-processing"},qt={class:"stat-item"},Qt={class:"stat-value stat-completed"},Xt={class:"stat-item"},Zt={class:"stat-value stat-failed"},jt={class:"content-card"},te={class:"card-body"},ee={key:0,class:"loading-state"},se={key:1,class:"empty-state"},ae={class:"empty-title"},oe={class:"empty-description"},le={key:2,class:"jobs-grid"},ne=["onClick"],ie={class:"job-header"},re={class:"job-title-section"},ue={class:"job-title-info"},de=["title"],ce={class:"job-meta"},_e={class:"file-size"},pe={class:"upload-time"},ge={class:"job-languages"},fe={class:"language-info"},me={class:"language-tag source"},ve={class:"language-arrow"},he={class:"language-info"},we={class:"language-tags"},ye={class:"job-status-section"},Ee={class:"status-info"},ke={key:0,class:"retry-count"},Ce={key:0,class:"job-progress"},be={class:"progress-info"},Se={key:1,class:"error-message"},Ie={class:"job-footer"},Te={class:"job-info-grid"},De={key:0,class:"info-item"},Ne={class:"info-value"},xe={key:1,class:"info-item"},Le={class:"info-value"},Me={key:2,class:"info-item"},Pe={class:"info-value"},Re={key:3,class:"info-item"},Fe={class:"info-value"},Be={key:3,class:"pagination-section"},ze={__name:"JobListView",setup($e){const G=lt(),_=Lt(),b=P(!1),g=P({status:"all",search:""}),v=S(()=>_.jobs),h=S(()=>_.pagination),y=S(()=>_.jobStats),N=S(()=>{let o=v.value;if(g.value.status!=="all"&&(o=o.filter(t=>t.status===g.value.status)),g.value.search.trim()){const t=g.value.search.toLowerCase().trim();o=o.filter(l=>l.original_filename.toLowerCase().includes(t))}return o}),J={auto:"自動偵測","zh-TW":"繁中","zh-CN":"簡中",en:"英文",ja:"日文",ko:"韓文",vi:"越文",th:"泰文",id:"印尼文",ms:"馬來文"},E=async()=>{b.value=!0;try{await _.fetchJobs({page:h.value.page,per_page:h.value.per_page,status:g.value.status==="all"?void 0:g.value.status})}catch(o){console.error("刷新任務列表失敗:",o)}finally{b.value=!1}},V=()=>{g.value.status="all",g.value.search="",x()},x=R(()=>{E()},300),O=R(()=>{},300),U=o=>{_.pagination.page=o,E()},A=o=>{_.pagination.per_page=o,_.pagination.page=1,E()},L=o=>{G.push(`/job/${o}`)},Y=async(o,t)=>{switch(o){case"view":L(t.job_uuid);break;case"download":try{if(t.target_languages.length===1){const l=I(t.original_filename),u=`${t.original_filename.replace(/\.[^/.]+$/,"")}_${t.target_languages[0]}_translated.${l}`;await _.downloadFile(t.job_uuid,t.target_languages[0],u)}else{const l=`${t.original_filename.replace(/\.[^/.]+$/,"")}_translated.zip`;await _.downloadAllFiles(t.job_uuid,l)}}catch(l){console.error("下載失敗:",l)}break;case"retry":try{await D.confirm("確定要重新翻譯此檔案嗎?","確認重試",{confirmButtonText:"確定",cancelButtonText:"取消",type:"warning"}),await _.retryJob(t.job_uuid)}catch(l){l!=="cancel"&&console.error("重試任務失敗:",l)}break;case"cancel":try{await D.confirm("確定要取消此任務嗎?","確認取消",{confirmButtonText:"確定",cancelButtonText:"取消",type:"warning"}),await _.cancelJob(t.job_uuid)}catch(l){l!=="cancel"&&console.error("取消任務失敗:",l)}break;case"delete":try{await D.confirm("確定要刪除此任務嗎?此操作無法撤銷。","確認刪除",{confirmButtonText:"確定",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0,message:`<strong>檔案:</strong> ${t.original_filename}<br/><strong>注意:</strong> 刪除後無法恢復`}),await _.deleteJob(t.job_uuid)}catch(l){l!=="cancel"&&console.error("刪除任務失敗:",l)}break}},I=o=>o.split(".").pop().toLowerCase(),W=o=>{if(o===0)return"0 B";const t=1024,l=["B","KB","MB","GB"],u=Math.floor(Math.log(o)/Math.log(t));return parseFloat((o/Math.pow(t,u)).toFixed(1))+" "+l[u]},T=o=>{if(!o)return"";const t=new Date,l=new Date(o),u=t-l;return u<6e4?"剛剛":u<36e5?`${Math.floor(u/6e4)} 分鐘前`:u<864e5?`${Math.floor(u/36e5)} 小時前`:u<2592e6?`${Math.floor(u/864e5)} 天前`:l.toLocaleDateString("zh-TW",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})},M=o=>J[o]||o,K=o=>({PENDING:"等待中",PROCESSING:"處理中",COMPLETED:"已完成",FAILED:"失敗",RETRY:"重試中"})[o]||o,H=o=>({PENDING:"Clock",PROCESSING:"Loading",COMPLETED:"SuccessFilled",FAILED:"CircleCloseFilled",RETRY:"RefreshRight"})[o]||"InfoFilled";return at(async()=>{Mt(),await E(),v.value.filter(t=>["PENDING","PROCESSING","RETRY"].includes(t.status)).forEach(t=>{_.subscribeToJobUpdates(t.job_uuid)})}),ot(v,(o,t)=>{const l=(t==null?void 0:t.map(p=>p.job_uuid))||[];o.filter(p=>["PENDING","PROCESSING","RETRY"].includes(p.status)&&!l.includes(p.job_uuid)).forEach(p=>{_.subscribeToJobUpdates(p.job_uuid)})},{deep:!0}),(o,t)=>{const l=nt,u=it,p=St,q=rt,Q=ut,X=It,k=Tt,Z=Dt,j=Nt,tt=xt,et=dt;return i(),d("div",Pt,[e("div",Rt,[t[7]||(t[7]=e("h1",{class:"page-title"},"任務列表",-1)),e("div",Ft,[s(u,{type:"primary",onClick:t[0]||(t[0]=a=>o.$router.push("/upload"))},{default:n(()=>[s(l,null,{default:n(()=>[s(c(ct))]),_:1}),t[6]||(t[6]=m(" 上傳檔案 ",-1))]),_:1})])]),e("div",Bt,[e("div",zt,[e("div",$t,[e("div",Gt,[t[8]||(t[8]=e("label",null,"狀態篩選:",-1)),s(q,{modelValue:g.value.status,"onUpdate:modelValue":t[1]||(t[1]=a=>g.value.status=a),onChange:c(x),style:{width:"120px"}},{default:n(()=>[s(p,{label:"全部",value:"all"}),s(p,{label:"等待中",value:"PENDING"}),s(p,{label:"處理中",value:"PROCESSING"}),s(p,{label:"已完成",value:"COMPLETED"}),s(p,{label:"失敗",value:"FAILED"}),s(p,{label:"重試中",value:"RETRY"})]),_:1},8,["modelValue","onChange"])]),e("div",Jt,[t[9]||(t[9]=e("label",null,"檔案搜尋:",-1)),s(Q,{modelValue:g.value.search,"onUpdate:modelValue":t[2]||(t[2]=a=>g.value.search=a),placeholder:"請輸入檔案名稱",style:{width:"200px"},clearable:"",onInput:c(O)},{prefix:n(()=>[s(l,null,{default:n(()=>[s(c(z))]),_:1})]),_:1},8,["modelValue","onInput"])]),e("div",Vt,[s(u,{onClick:E,loading:b.value},{default:n(()=>[s(l,null,{default:n(()=>[s(c(_t))]),_:1}),t[10]||(t[10]=m(" 刷新 ",-1))]),_:1},8,["loading"]),s(u,{onClick:V},{default:n(()=>[s(l,null,{default:n(()=>[s(c(pt))]),_:1}),t[11]||(t[11]=m(" 清除篩選 ",-1))]),_:1})])]),e("div",Ot,[e("div",Ut,[t[12]||(t[12]=e("span",{class:"stat-label"},"總計:",-1)),e("span",At,r(y.value.total),1)]),e("div",Yt,[t[13]||(t[13]=e("span",{class:"stat-label"},"等待:",-1)),e("span",Wt,r(y.value.pending),1)]),e("div",Kt,[t[14]||(t[14]=e("span",{class:"stat-label"},"處理:",-1)),e("span",Ht,r(y.value.processing),1)]),e("div",qt,[t[15]||(t[15]=e("span",{class:"stat-label"},"完成:",-1)),e("span",Qt,r(y.value.completed),1)]),e("div",Xt,[t[16]||(t[16]=e("span",{class:"stat-label"},"失敗:",-1)),e("span",Zt,r(y.value.failed),1)])])])]),e("div",jt,[e("div",te,[b.value&&v.value.length===0?(i(),d("div",ee,[s(X,{rows:5,animated:""})])):N.value.length===0?(i(),d("div",se,[s(l,{class:"empty-icon"},{default:n(()=>[v.value.length===0?(i(),w(c(gt),{key:0})):(i(),w(c(z),{key:1}))]),_:1}),e("div",ae,r(v.value.length===0?"暫無任務記錄":"未找到符合條件的任務"),1),e("div",oe,r(v.value.length===0?"開始上傳您的第一個檔案進行翻譯吧!":"請嘗試調整篩選條件或搜尋關鍵字"),1),v.value.length===0?(i(),w(u,{key:0,type:"primary",onClick:t[3]||(t[3]=a=>o.$router.push("/upload"))},{default:n(()=>[...t[17]||(t[17]=[m(" 立即上傳 ",-1)])]),_:1})):f("",!0)])):(i(),d("div",le,[(i(!0),d(F,null,B(N.value,a=>(i(),d("div",{key:a.job_uuid,class:"job-card",onClick:C=>L(a.job_uuid)},[e("div",ie,[e("div",re,[e("div",{class:$(["file-icon",I(a.original_filename)])},r(I(a.original_filename).toUpperCase()),3),e("div",ue,[e("div",{class:"job-title",title:a.original_filename},r(a.original_filename),9,de),e("div",ce,[e("span",_e,r(W(a.file_size)),1),e("span",pe,r(T(a.created_at)),1)])])]),e("div",{class:"job-actions",onClick:t[4]||(t[4]=ft(()=>{},["stop"]))},[s(j,{trigger:"click",onCommand:C=>Y(C,a),placement:"bottom-end"},{dropdown:n(()=>[s(Z,null,{default:n(()=>[s(k,{command:"view"},{default:n(()=>[s(l,null,{default:n(()=>[s(c(mt))]),_:1}),t[18]||(t[18]=m(" 查看詳情 ",-1))]),_:1}),a.status==="COMPLETED"?(i(),w(k,{key:0,command:"download"},{default:n(()=>[s(l,null,{default:n(()=>[s(c(vt))]),_:1}),t[19]||(t[19]=m(" 下載檔案 ",-1))]),_:1})):f("",!0),a.status==="FAILED"?(i(),w(k,{key:1,command:"retry"},{default:n(()=>[s(l,null,{default:n(()=>[s(c(ht))]),_:1}),t[20]||(t[20]=m(" 重新翻譯 ",-1))]),_:1})):f("",!0),["PENDING","PROCESSING"].includes(a.status)?(i(),w(k,{key:2,command:"cancel"},{default:n(()=>[s(l,null,{default:n(()=>[s(c(wt))]),_:1}),t[21]||(t[21]=m(" 取消任務 ",-1))]),_:1})):f("",!0),s(k,{command:"delete",divided:""},{default:n(()=>[s(l,null,{default:n(()=>[s(c(yt))]),_:1}),t[22]||(t[22]=m(" 刪除 ",-1))]),_:1})]),_:2},1024)]),default:n(()=>[s(u,{type:"text",size:"small"},{default:n(()=>[s(l,null,{default:n(()=>[s(c(Et))]),_:1})]),_:1})]),_:2},1032,["onCommand"])])]),e("div",ge,[e("div",fe,[t[23]||(t[23]=e("span",{class:"language-label"},"來源:",-1)),e("span",me,r(M(a.source_language)),1)]),e("div",ve,[s(l,null,{default:n(()=>[s(c(kt))]),_:1})]),e("div",he,[t[24]||(t[24]=e("span",{class:"language-label"},"目標:",-1)),e("div",we,[(i(!0),d(F,null,B(a.target_languages,C=>(i(),d("span",{key:C,class:"language-tag target"},r(M(C)),1))),128))])])]),e("div",ye,[e("div",Ee,[e("div",{class:$(["status-badge",a.status.toLowerCase()])},[s(l,null,{default:n(()=>[(i(),w(Ct(H(a.status))))]),_:2},1024),e("span",null,r(K(a.status)),1)],2),a.retry_count>0?(i(),d("div",ke," 重試 "+r(a.retry_count)+" 次 ",1)):f("",!0)]),a.status==="PROCESSING"&&a.progress>0?(i(),d("div",Ce,[e("div",be,[t[25]||(t[25]=e("span",null,"翻譯進度",-1)),e("span",null,r(Math.round(a.progress))+"%",1)]),s(tt,{percentage:a.progress,"stroke-width":6,"show-text":!1,status:"success"},null,8,["percentage"])])):f("",!0),a.status==="FAILED"&&a.error_message?(i(),d("div",Se,[s(l,null,{default:n(()=>[s(c(bt))]),_:1}),e("span",null,r(a.error_message),1)])):f("",!0)]),e("div",Ie,[e("div",Te,[a.processing_started_at?(i(),d("div",De,[t[26]||(t[26]=e("span",{class:"info-label"},"開始:",-1)),e("span",Ne,r(T(a.processing_started_at)),1)])):f("",!0),a.completed_at?(i(),d("div",xe,[t[27]||(t[27]=e("span",{class:"info-label"},"完成:",-1)),e("span",Le,r(T(a.completed_at)),1)])):f("",!0),a.total_cost>0?(i(),d("div",Me,[t[28]||(t[28]=e("span",{class:"info-label"},"成本:",-1)),e("span",Pe,"$"+r(a.total_cost.toFixed(4)),1)])):f("",!0),a.total_tokens>0?(i(),d("div",Re,[t[29]||(t[29]=e("span",{class:"info-label"},"Token:",-1)),e("span",Fe,r(a.total_tokens.toLocaleString()),1)])):f("",!0)])])],8,ne))),128))])),h.value.pages>1?(i(),d("div",Be,[s(et,{"current-page":h.value.page,"onUpdate:currentPage":t[5]||(t[5]=a=>h.value.page=a),"page-size":h.value.per_page,total:h.value.total,"page-sizes":[10,20,50,100],layout:"total, sizes, prev, pager, next, jumper",onSizeChange:A,onCurrentChange:U},null,8,["current-page","page-size","total"])])):f("",!0)])])])}}},Xe=st(ze,[["__scopeId","data-v-7a02c778"]]);export{Xe as default};