2 lines
9.4 KiB
JavaScript
2 lines
9.4 KiB
JavaScript
import{B as m,C as h,s as J,e as Q,a as y}from"./index-Bx7gSOle.js";import{_ as X,r as c,c as Y,o as Z,a as f,b as t,d as D,e as g,f as d,w as n,u as o,F as N,g as R,h as u,i as r,t as a,n as tt,j as lt}from"./index-D2VmGkBi.js";import{M as L,B as b}from"./Badge-B139BweD.js";const st={class:"dashboard"},et={class:"dashboard-header"},at={class:"header-actions"},nt={class:"server-grid"},ot={class:"server-header"},it={class:"server-title"},dt={class:"server-actions"},ut={class:"server-info"},rt={class:"info-row"},ct={class:"value"},vt={class:"info-row"},ft={class:"value"},mt={class:"info-row"},_t={key:0,class:"progress-section"},pt={class:"progress-header"},ht={class:"status-text"},yt={class:"progress-bar-container"},gt={class:"progress-details"},bt={class:"empty-content"},Ct={key:1,class:"stats-section"},kt={class:"stats-grid"},Ft={class:"stats-table-wrapper"},wt={class:"stats-table"},At=["title"],St={class:"count-col critical"},Nt={class:"count-col error"},Rt={class:"count-col warn"},Et={class:"count-col total"},It={class:"stats-table-wrapper"},Pt={class:"stats-table"},xt={class:"count-col"},$t={class:"count-col total"},Vt={class:"section-header"},Bt={class:"error-table"},Dt=["onClick"],Lt={class:"summary-cell"},Mt={key:0,class:"error-detail"},zt={class:"detail-grid"},Tt={class:"detail-item"},Ut={class:"detail-item"},Wt={class:"detail-item"},Gt={class:"detail-item"},Ot={class:"detail-item"},jt={class:"detail-item"},Kt={class:"detail-section"},qt={class:"summary-box"},Ht={class:"detail-section"},Jt={class:"context-box"},Qt={__name:"Dashboard",setup(Xt){const C=c([]),E=c(!1),k=c(null),_=c(!1),i=c({}),I=c([]),P=c([]),x=c([]),p=c(!1),$=c(!1),F=c(!1),v=c(null),M=Y(()=>C.value.filter(s=>s.active)),V=async()=>{E.value=!0;try{C.value=await J.getAll()}catch(s){console.error("Failed to load servers:",s)}finally{E.value=!1}},w=async()=>{try{const s=await Q.search({page:0,size:10});I.value=s.content||[]}catch(s){console.error("Failed to load recent errors:",s)}},A=async()=>{try{const[s,l]=await Promise.all([y.getStatsByFile(),y.getStatsByPattern()]);P.value=s||[],x.value=l||[]}catch(s){console.error("Failed to load stats:",s)}},z=s=>{k.value=s.id,i.value[s.id]={status:"RUNNING",currentPath:"",currentFile:"",totalFiles:0,scannedFiles:0,errorsFound:0},y.startWithProgress(s.id,l=>{i.value[s.id]=l},l=>{k.value=null,l.success?i.value[s.id]={...i.value[s.id],status:"SUCCESS",message:`완료: ${l.filesScanned}개 파일, ${l.errorsFound}개 에러`}:i.value[s.id]={...i.value[s.id],status:"FAILED",message:l.error},V(),w(),A(),setTimeout(()=>{delete i.value[s.id]},5e3)},l=>{k.value=null,i.value[s.id]={...i.value[s.id],status:"FAILED",message:l}})},T=()=>{_.value=!0,y.startAllWithProgress(s=>{i.value[s.serverId]=s},s=>{_.value=!1,V(),w(),A(),setTimeout(()=>{i.value={}},5e3)},s=>{_.value=!1,alert("분석 실패: "+s)})},U=()=>{p.value=!0},W=async()=>{$.value=!0;try{await y.resetAll(),p.value=!1,w(),A(),alert("초기화 완료")}catch(s){console.error("Failed to reset:",s),alert("초기화 실패")}finally{$.value=!1}},G=s=>{v.value=s,F.value=!0},S=s=>s?new Date(s).toLocaleString("ko-KR"):"-",O=(s,l)=>s?s.length>l?s.substring(0,l)+"...":s:"",j=s=>s?s.split("/").pop():"",K=s=>s.status==="SUCCESS"?s.message||"완료":s.status==="FAILED"?s.message||"실패":s.currentFile?`분석중: ${s.currentFile}`:s.currentPath?`경로: ${s.currentPath}`:"준비중...",q=s=>s.totalFiles===0?0:Math.round(s.scannedFiles/s.totalFiles*100),B=s=>({CRITICAL:"critical",ERROR:"error",WARN:"warn"})[s]||"default";return Z(()=>{V(),w(),A()}),(s,l)=>(u(),f("div",st,[t("div",et,[l[8]||(l[8]=t("h2",null,"대시보드",-1)),t("div",at,[d(o(m),{variant:"danger",onClick:U,disabled:_.value},{default:n(()=>[...l[6]||(l[6]=[r(" 초기화 ",-1)])]),_:1},8,["disabled"]),d(o(m),{onClick:T,loading:_.value,disabled:M.value.length===0},{default:n(()=>[...l[7]||(l[7]=[r(" 전체 분석 ",-1)])]),_:1},8,["loading","disabled"])])]),t("div",nt,[(u(!0),f(N,null,R(C.value,e=>(u(),D(o(h),{key:e.id,class:"server-card"},{header:n(()=>[t("div",ot,[t("div",it,[d(o(b),{variant:e.active?"success":"default",size:"sm"},{default:n(()=>[r(a(e.active?"활성":"비활성"),1)]),_:2},1032,["variant"]),t("h4",null,a(e.name),1)]),t("div",dt,[d(o(m),{size:"sm",onClick:H=>z(e),loading:k.value===e.id,disabled:!e.active||_.value},{default:n(()=>[...l[9]||(l[9]=[r(" 분석 ",-1)])]),_:1},8,["onClick","loading","disabled"])])])]),default:n(()=>[t("div",ut,[t("div",rt,[l[10]||(l[10]=t("span",{class:"label"},"호스트",-1)),t("span",ct,a(e.host)+":"+a(e.port),1)]),t("div",vt,[l[11]||(l[11]=t("span",{class:"label"},"마지막 분석",-1)),t("span",ft,a(S(e.lastScanAt)),1)]),t("div",mt,[l[12]||(l[12]=t("span",{class:"label"},"마지막 에러",-1)),t("span",{class:tt(["value",{"has-error":e.lastErrorAt}])},a(S(e.lastErrorAt)),3)])]),i.value[e.id]?(u(),f("div",_t,[t("div",pt,[t("span",ht,a(K(i.value[e.id])),1),d(o(b),{variant:i.value[e.id].status==="RUNNING"?"warn":"success"},{default:n(()=>[r(a(i.value[e.id].status),1)]),_:2},1032,["variant"])]),t("div",yt,[t("div",{class:"progress-bar",style:lt({width:q(i.value[e.id])+"%"})},null,4)]),t("div",gt,[t("span",null,"파일: "+a(i.value[e.id].scannedFiles)+" / "+a(i.value[e.id].totalFiles),1),t("span",null,"에러: "+a(i.value[e.id].errorsFound)+"건",1)])])):g("",!0)]),_:2},1024))),128))]),C.value.length===0&&!E.value?(u(),D(o(h),{key:0,class:"empty-card"},{default:n(()=>[t("div",bt,[l[14]||(l[14]=t("p",null,"등록된 서버가 없습니다.",-1)),d(o(m),{onClick:l[0]||(l[0]=e=>s.$router.push("/servers"))},{default:n(()=>[...l[13]||(l[13]=[r("서버 등록하기",-1)])]),_:1})])]),_:1})):g("",!0),P.value.length>0||x.value.length>0?(u(),f("div",Ct,[t("div",kt,[d(o(h),{class:"stats-card"},{header:n(()=>[...l[15]||(l[15]=[t("h3",null,"파일별 에러 통계",-1)])]),default:n(()=>[t("div",Ft,[t("table",wt,[l[16]||(l[16]=t("thead",null,[t("tr",null,[t("th",null,"파일"),t("th",{class:"count-col"},"CRITICAL"),t("th",{class:"count-col"},"ERROR"),t("th",{class:"count-col"},"WARN"),t("th",{class:"count-col"},"합계")])],-1)),t("tbody",null,[(u(!0),f(N,null,R(P.value,e=>(u(),f("tr",{key:e.filePath},[t("td",{class:"file-path-cell",title:e.filePath},a(j(e.filePath)),9,At),t("td",St,a(e.criticalCount||0),1),t("td",Nt,a(e.errorCount||0),1),t("td",Rt,a(e.warnCount||0),1),t("td",Et,a(e.totalCount),1)]))),128))])])])]),_:1}),d(o(h),{class:"stats-card"},{header:n(()=>[...l[17]||(l[17]=[t("h3",null,"패턴별 에러 통계",-1)])]),default:n(()=>[t("div",It,[t("table",Pt,[l[18]||(l[18]=t("thead",null,[t("tr",null,[t("th",null,"패턴"),t("th",{class:"count-col"},"심각도"),t("th",{class:"count-col"},"건수")])],-1)),t("tbody",null,[(u(!0),f(N,null,R(x.value,e=>(u(),f("tr",{key:e.patternId},[t("td",null,a(e.patternName),1),t("td",xt,[d(o(b),{variant:B(e.severity)},{default:n(()=>[r(a(e.severity),1)]),_:2},1032,["variant"])]),t("td",$t,a(e.count),1)]))),128))])])])]),_:1})])])):g("",!0),I.value.length>0?(u(),D(o(h),{key:2,class:"recent-errors"},{header:n(()=>[t("div",Vt,[l[20]||(l[20]=t("h3",null,"최근 에러",-1)),d(o(m),{size:"sm",variant:"secondary",onClick:l[1]||(l[1]=e=>s.$router.push("/errors"))},{default:n(()=>[...l[19]||(l[19]=[r("전체보기",-1)])]),_:1})])]),default:n(()=>[t("table",Bt,[l[21]||(l[21]=t("thead",null,[t("tr",null,[t("th",null,"시간"),t("th",null,"서버"),t("th",null,"심각도"),t("th",null,"요약")])],-1)),t("tbody",null,[(u(!0),f(N,null,R(I.value,e=>(u(),f("tr",{key:e.id,onClick:H=>G(e)},[t("td",null,a(S(e.occurredAt)),1),t("td",null,a(e.serverName),1),t("td",null,[d(o(b),{variant:B(e.severity)},{default:n(()=>[r(a(e.severity),1)]),_:2},1032,["variant"])]),t("td",Lt,a(O(e.summary,80)),1)],8,Dt))),128))])])]),_:1})):g("",!0),d(o(L),{modelValue:F.value,"onUpdate:modelValue":l[3]||(l[3]=e=>F.value=e),title:"에러 상세",width:"800px"},{footer:n(()=>[d(o(m),{variant:"secondary",onClick:l[2]||(l[2]=e=>F.value=!1)},{default:n(()=>[...l[30]||(l[30]=[r("닫기",-1)])]),_:1})]),default:n(()=>[v.value?(u(),f("div",Mt,[t("div",zt,[t("div",Tt,[l[22]||(l[22]=t("label",null,"서버",-1)),t("span",null,a(v.value.serverName),1)]),t("div",Ut,[l[23]||(l[23]=t("label",null,"심각도",-1)),d(o(b),{variant:B(v.value.severity)},{default:n(()=>[r(a(v.value.severity),1)]),_:1},8,["variant"])]),t("div",Wt,[l[24]||(l[24]=t("label",null,"파일",-1)),t("span",null,a(v.value.filePath),1)]),t("div",Gt,[l[25]||(l[25]=t("label",null,"라인",-1)),t("span",null,a(v.value.lineNumber),1)]),t("div",Ot,[l[26]||(l[26]=t("label",null,"발생시간",-1)),t("span",null,a(S(v.value.occurredAt)),1)]),t("div",jt,[l[27]||(l[27]=t("label",null,"패턴",-1)),t("span",null,a(v.value.patternName),1)])]),t("div",Kt,[l[28]||(l[28]=t("label",null,"요약",-1)),t("div",qt,a(v.value.summary),1)]),t("div",Ht,[l[29]||(l[29]=t("label",null,"컨텍스트",-1)),t("pre",Jt,a(v.value.context),1)])])):g("",!0)]),_:1},8,["modelValue"]),d(o(L),{modelValue:p.value,"onUpdate:modelValue":l[5]||(l[5]=e=>p.value=e),title:"분석 결과 초기화",width:"400px"},{footer:n(()=>[d(o(m),{variant:"secondary",onClick:l[4]||(l[4]=e=>p.value=!1)},{default:n(()=>[...l[31]||(l[31]=[r("취소",-1)])]),_:1}),d(o(m),{variant:"danger",onClick:W,loading:$.value},{default:n(()=>[...l[32]||(l[32]=[r("초기화",-1)])]),_:1},8,["loading"])]),default:n(()=>[l[33]||(l[33]=t("p",null,"전체 분석 결과를 초기화하시겠습니까?",-1)),l[34]||(l[34]=t("p",{class:"warning-text"},"에러 로그, 스캔 이력이 모두 삭제됩니다.",-1))]),_:1},8,["modelValue"])]))}},ll=X(Qt,[["__scopeId","data-v-af1336d8"]]);export{ll as default};
|