The Vue SPA is now built locally and its frontend/dist/ committed (force-added). Dockerfile is a single-stage runtime: copy prebuilt dist + python:3.11 + Flask. No node/npm inside the image -> deterministic, no npm/esbuild postinstall flakiness. To update UI: edit src, npm run build, commit frontend/dist/.
2 lines
1.6 KiB
JavaScript
2 lines
1.6 KiB
JavaScript
import{k as i,p as d,c as l,a as s,t as a,u as v,i as _,F as u,n as c,r as p,o as n}from"./index-B1lw4PRH.js";import{_ as g}from"./_plugin-vue_export-helper-DlAUqK2U.js";const m={class:"row",style:{gap:"16px",margin:"16px 0"}},y={class:"card stat"},f={class:"card stat"},w={style:{color:"var(--green)"}},x={class:"card stat"},h={style:{color:"var(--red)"}},k={class:"card stat"},b={class:"card stat"},A={class:"badge lost"},B={class:"badge won"},L={class:"muted"},F={__name:"Analytics",setup(S){const o=p({overall:{total_sessions:0,wins:0,losses:0,close_rate:0,avg_score:0},trainee_count:0,hardest_personas:[]});return i(async()=>{o.value=await d.analytics()}),(W,t)=>(n(),l("div",null,[s("h2",null,a(v(_).t("analytics")),1),s("div",m,[s("div",y,[t[0]||(t[0]=s("div",null,"Sessions",-1)),s("strong",null,a(o.value.overall.total_sessions),1)]),s("div",f,[t[1]||(t[1]=s("div",null,"Wins",-1)),s("strong",w,a(o.value.overall.wins),1)]),s("div",x,[t[2]||(t[2]=s("div",null,"Losses",-1)),s("strong",h,a(o.value.overall.losses),1)]),s("div",k,[t[3]||(t[3]=s("div",null,"Close rate",-1)),s("strong",null,a(o.value.overall.close_rate)+"%",1)]),s("div",b,[t[4]||(t[4]=s("div",null,"Avg score",-1)),s("strong",null,a(o.value.overall.avg_score),1)])]),s("h3",null,"Trainees: "+a(o.value.trainee_count),1),t[5]||(t[5]=s("h3",null,"Hardest personas",-1)),(n(!0),l(u,null,c(o.value.hardest_personas,(e,r)=>(n(),l("div",{class:"card",key:r,style:{"margin-bottom":"8px"}},[s("strong",null,a(e.persona_name),1),s("span",A,a(e.losses)+"L",1),s("span",B,a(e.wins)+"W",1),s("span",L,"· avg "+a(e.avg_score),1)]))),128))]))}},E=g(F,[["__scopeId","data-v-8828276e"]]);export{E as default};
|