Files
Document_Translator/frontend/dist/js/UploadView-f997be6d.js
2025-09-02 10:31:35 +08:00

2 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{_ as Y}from"./_plugin-vue_export-helper-af00840d.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as w,a as Z,A as ee,o as se,w as ae,c as v,d as a,e as s,f as l,C as z,t as f,F as V,B as P,h as y,i as te,R as m,G as le,z as oe,a6 as ne,j as re,a5 as ie,l as p,m as h,X as j,s as b,a7 as ue,a8 as de,a9 as ce,aa as pe,W as ge,K as E,$ as ve,a0 as fe,ab as _e,ac as me,E as he,ad as be,ae as xe,x as ye}from"./index-cb898b04.js";import{u as ke}from"./jobs-6be64b92.js";const we={class:"upload-view"},Le={class:"page-header"},Ce={class:"page-actions"},Fe={class:"upload-content"},ze={class:"content-card"},$e={class:"card-body"},Be={class:"upload-content-inner"},Ee={key:0,class:"selected-files"},Ue={class:"files-header"},Me={class:"files-list"},Se={class:"file-icon"},Ve={class:"file-info"},Pe={class:"file-name"},je={class:"file-details"},Te={class:"file-size"},Ne={class:"file-type-text"},Re={class:"file-actions"},De={key:0,class:"content-card"},Ie={class:"card-body"},Oe={class:"form-tip"},Xe={class:"translation-actions"},Je={key:1,class:"content-card"},We={class:"card-body"},qe={class:"upload-progress"},Ge={key:0,class:"overall-progress"},Ke={class:"progress-info"},Ae={class:"files-progress"},He={class:"file-info"},Qe={class:"file-icon"},Ye={class:"file-details"},Ze={class:"file-name"},es={class:"file-status"},ss={key:0,class:"file-progress"},as={key:1,class:"file-actions"},ts={key:1,class:"upload-complete-actions"},ls={__name:"UploadView",setup(os){const T=te(),N=ke(),R=w(),$=w(),u=w([]),g=w(!1),C=w(0),d=w([]),c=Z({sourceLanguage:"auto",targetLanguages:[]}),D={targetLanguages:[{required:!0,message:"請至少選擇一個目標語言",trigger:"change"},{type:"array",min:1,message:"請至少選擇一個目標語言",trigger:"change"}]},I={docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",doc:"application/msword",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",ppt:"application/vnd.ms-powerpoint",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",xls:"application/vnd.ms-excel",pdf:"application/pdf"},U=ee(()=>d.value.length===0?0:d.value.reduce((e,r)=>r.status==="success"||r.status==="error"?e+100:e+(r.progress||0),0)/u.value.length),O=t=>{const e=k(t.name);if(!I[e])return m.error(`不支援的檔案類型: ${e}`),!1;const r=25*1024*1024;return t.size>r?(m.error(`檔案大小不能超過 25MB當前檔案: ${M(t.size)}`),!1):u.value.some(x=>x.name===t.name)?(m.warning("檔案已存在於列表中"),!1):(u.value.push(t),m.success(`已添加檔案: ${t.name}`),!1)},X=t=>{const e=u.value[t].name;u.value.splice(t,1),m.info(`已移除檔案: ${e}`)},J=async()=>{try{await le.confirm("確定要清空所有已選檔案嗎?","確認清空",{confirmButtonText:"確定",cancelButtonText:"取消",type:"warning"}),u.value=[],m.success("已清空檔案列表")}catch{}},W=async()=>{try{if(!await $.value.validate())return;if(u.value.length===0){m.warning("請先選擇要翻譯的檔案");return}g.value=!0,C.value=0,d.value=[],u.value.forEach(o=>{d.value.push({filename:o.name,status:"waiting",progress:0,jobUuid:null,error:null})});for(let o=0;o<u.value.length;o++){C.value=o;const x=u.value[o],n=o;try{d.value[n].status="uploading";const _=new FormData;_.append("file",x),_.append("source_language",c.sourceLanguage),_.append("target_languages",JSON.stringify(c.targetLanguages));const L=await N.uploadFile(_,B=>{d.value[n].progress=B});d.value[n].status="success",d.value[n].progress=100,d.value[n].jobUuid=L.job_uuid}catch(_){console.error(`檔案 ${x.name} 上傳失敗:`,_),d.value[n].status="error",d.value[n].error=_.message||"上傳失敗",m.error(`檔案 ${x.name} 上傳失敗: ${_.message||"未知錯誤"}`)}}const e=d.value.filter(o=>o.status==="success").length,r=d.value.filter(o=>o.status==="error").length;e>0&&m.success(`成功上傳 ${e} 個檔案`),r>0&&m.error(`${r} 個檔案上傳失敗`)}catch(t){console.error("批量上傳失敗:",t),m.error("批量上傳失敗")}finally{g.value=!1}},q=()=>{var t;u.value=[],c.sourceLanguage="auto",c.targetLanguages=[],d.value=[],(t=$.value)==null||t.resetFields()},G=()=>{d.value=[],C.value=0},K=t=>{T.push(`/job/${t}`)},k=t=>t.split(".").pop().toLowerCase(),A=t=>{const e=k(t);return{docx:"Word 文件",doc:"Word 文件",pptx:"PowerPoint 簡報",ppt:"PowerPoint 簡報",xlsx:"Excel 試算表",xls:"Excel 試算表",pdf:"PDF 文件"}[e]||e.toUpperCase()},M=t=>{if(t===0)return"0 B";const e=1024,r=["B","KB","MB","GB"],o=Math.floor(Math.log(t)/Math.log(e));return parseFloat((t/Math.pow(e,o)).toFixed(1))+" "+r[o]},H=t=>({waiting:"等待中",uploading:"上傳中",success:"上傳成功",error:"上傳失敗"})[t]||t;return se(()=>{const t=localStorage.getItem("translation_settings");if(t)try{const e=JSON.parse(t);c.sourceLanguage=e.sourceLanguage||"auto",c.targetLanguages=e.targetLanguages||[]}catch(e){console.error("載入設定失敗:",e)}}),ae([()=>c.sourceLanguage,()=>c.targetLanguages],()=>{const t={sourceLanguage:c.sourceLanguage,targetLanguages:c.targetLanguages};localStorage.setItem("translation_settings",JSON.stringify(t))},{deep:!0}),(t,e)=>{const r=he,o=oe,x=ne,n=be,_=xe,L=ye,B=re,S=ie;return p(),v("div",we,[a("div",Le,[e[5]||(e[5]=a("h1",{class:"page-title"},"檔案上傳",-1)),a("div",Ce,[s(o,{onClick:e[0]||(e[0]=i=>t.$router.push("/jobs"))},{default:l(()=>[s(r,null,{default:l(()=>[s(h(j))]),_:1}),e[4]||(e[4]=b(" 查看任務列表 ",-1))]),_:1})])]),a("div",Fe,[a("div",ze,[e[8]||(e[8]=a("div",{class:"card-header"},[a("h3",{class:"card-title"},"選擇要翻譯的檔案"),a("div",{class:"card-subtitle"}," 支援 DOCX、DOC、PPTX、XLSX、XLS、PDF 格式,單檔最大 25MB ")],-1)),a("div",$e,[s(x,{ref_key:"uploadRef",ref:R,class:z(["upload-dragger",{disabled:g.value}]),drag:"",multiple:!0,"show-file-list":!1,"before-upload":O,"http-request":()=>{},disabled:g.value},{default:l(()=>[a("div",Be,[s(r,{class:"upload-icon"},{default:l(()=>[s(h(ue))]),_:1}),e[6]||(e[6]=a("div",{class:"upload-text"},[a("div",{class:"upload-title"},"拖拽檔案至此或點擊選擇檔案"),a("div",{class:"upload-hint"}," 支援 .docx, .doc, .pptx, .xlsx, .xls, .pdf 格式 ")],-1))])]),_:1},8,["class","disabled"]),u.value.length>0?(p(),v("div",Ee,[a("div",Ue,[a("h4",null,"已選擇的檔案 ("+f(u.value.length)+")",1),s(o,{type:"text",onClick:J,disabled:g.value},{default:l(()=>[s(r,null,{default:l(()=>[s(h(de))]),_:1}),e[7]||(e[7]=b(" 清空 ",-1))]),_:1},8,["disabled"])]),a("div",Me,[(p(!0),v(V,null,P(u.value,(i,F)=>(p(),v("div",{key:F,class:"file-item"},[a("div",Se,[a("div",{class:z(["file-type",k(i.name)])},f(k(i.name).toUpperCase()),3)]),a("div",Ve,[a("div",Pe,f(i.name),1),a("div",je,[a("span",Te,f(M(i.size)),1),a("span",Ne,f(A(i.name)),1)])]),a("div",Re,[s(o,{type:"text",size:"small",onClick:Q=>X(F),disabled:g.value},{default:l(()=>[s(r,null,{default:l(()=>[s(h(ce))]),_:1})]),_:2},1032,["onClick","disabled"])])]))),128))])])):y("",!0)])]),u.value.length>0?(p(),v("div",De,[e[11]||(e[11]=a("div",{class:"card-header"},[a("h3",{class:"card-title"},"翻譯設定")],-1)),a("div",Ie,[s(B,{ref_key:"translationFormRef",ref:$,model:c,rules:D,"label-width":"120px",size:"large"},{default:l(()=>[s(L,{label:"來源語言",prop:"sourceLanguage"},{default:l(()=>[s(_,{modelValue:c.sourceLanguage,"onUpdate:modelValue":e[1]||(e[1]=i=>c.sourceLanguage=i),placeholder:"請選擇來源語言",style:{width:"100%"},disabled:g.value},{default:l(()=>[s(n,{label:"自動偵測",value:"auto"}),s(n,{label:"繁體中文",value:"zh-TW"}),s(n,{label:"簡體中文",value:"zh-CN"}),s(n,{label:"英文",value:"en"}),s(n,{label:"日文",value:"ja"}),s(n,{label:"韓文",value:"ko"}),s(n,{label:"越南文",value:"vi"})]),_:1},8,["modelValue","disabled"])]),_:1}),s(L,{label:"目標語言",prop:"targetLanguages"},{default:l(()=>[s(_,{modelValue:c.targetLanguages,"onUpdate:modelValue":e[2]||(e[2]=i=>c.targetLanguages=i),multiple:"",placeholder:"請選擇目標語言(可多選)",style:{width:"100%"},disabled:g.value,"collapse-tags":"","collapse-tags-tooltip":""},{default:l(()=>[s(n,{label:"英文",value:"en"}),s(n,{label:"越南文",value:"vi"}),s(n,{label:"繁體中文",value:"zh-TW"}),s(n,{label:"簡體中文",value:"zh-CN"}),s(n,{label:"日文",value:"ja"}),s(n,{label:"韓文",value:"ko"}),s(n,{label:"泰文",value:"th"}),s(n,{label:"印尼文",value:"id"}),s(n,{label:"馬來文",value:"ms"})]),_:1},8,["modelValue","disabled"]),a("div",Oe,[s(r,null,{default:l(()=>[s(h(pe))]),_:1}),e[9]||(e[9]=b(" 可以同時選擇多個目標語言,系統會分別生成對應的翻譯檔案 ",-1))])]),_:1}),s(L,null,{default:l(()=>[a("div",Xe,[s(o,{type:"primary",size:"large",loading:g.value,disabled:u.value.length===0||c.targetLanguages.length===0,onClick:W},{default:l(()=>[s(r,null,{default:l(()=>[s(h(ge))]),_:1}),b(" "+f(g.value?"上傳中...":`開始翻譯 (${u.value.length} 個檔案)`),1)]),_:1},8,["loading","disabled"]),s(o,{size:"large",onClick:q,disabled:g.value},{default:l(()=>[...e[10]||(e[10]=[b(" 重置 ",-1)])]),_:1},8,["disabled"])])]),_:1})]),_:1},8,["model"])])])):y("",!0),g.value||d.value.length>0?(p(),v("div",Je,[e[15]||(e[15]=a("div",{class:"card-header"},[a("h3",{class:"card-title"},"上傳進度")],-1)),a("div",We,[a("div",qe,[g.value?(p(),v("div",Ge,[a("div",Ke,[a("span",null,"整體進度: "+f(C.value+1)+" / "+f(u.value.length),1),a("span",null,f(Math.round(U.value))+"%",1)]),s(S,{percentage:U.value,"stroke-width":8,"show-text":!1,status:"success"},null,8,["percentage"])])):y("",!0),a("div",Ae,[(p(!0),v(V,null,P(d.value,(i,F)=>(p(),v("div",{key:F,class:z(["file-progress-item",i.status])},[a("div",He,[a("div",Qe,[a("div",{class:z(["file-type",k(i.filename)])},f(k(i.filename).toUpperCase()),3)]),a("div",Ye,[a("div",Ze,f(i.filename),1),a("div",es,[i.status==="success"?(p(),E(r,{key:0},{default:l(()=>[s(h(ve))]),_:1})):i.status==="error"?(p(),E(r,{key:1},{default:l(()=>[s(h(fe))]),_:1})):(p(),E(r,{key:2},{default:l(()=>[s(h(_e))]),_:1})),a("span",null,f(H(i.status)),1)])])]),i.status==="uploading"?(p(),v("div",ss,[s(S,{percentage:i.progress||0,"stroke-width":4,"show-text":!1},null,8,["percentage"])])):y("",!0),i.status==="success"?(p(),v("div",as,[s(o,{type:"text",size:"small",onClick:Q=>K(i.jobUuid)},{default:l(()=>[...e[12]||(e[12]=[b(" 查看任務 ",-1)])]),_:2},1032,["onClick"])])):y("",!0)],2))),128))]),!g.value&&d.value.length>0?(p(),v("div",ts,[s(o,{type:"primary",onClick:e[3]||(e[3]=i=>t.$router.push("/jobs"))},{default:l(()=>[s(r,null,{default:l(()=>[s(h(j))]),_:1}),e[13]||(e[13]=b(" 查看所有任務 ",-1))]),_:1}),s(o,{onClick:G},{default:l(()=>[s(r,null,{default:l(()=>[s(h(me))]),_:1}),e[14]||(e[14]=b(" 重新上傳 ",-1))]),_:1})])):y("",!0)])])])):y("",!0)])])}}},vs=Y(ls,[["__scopeId","data-v-12459c2b"]]);export{vs as default};