ux(ui): beginner-friendly guidance across trainee/admin flows + fix AdminUsers to username

- Chat: add 'How to practice' guide card; render revealed persona as readable
  label:value grid instead of JSON.
- AdminUsers: switch create form to username (matches username login), add step guide,
  role explanation (user=ฝึก, admin=ดูแลระบบ).
- Analytics (admin overview) + MyBoard (personal): add plain-Thai explainer subtitle.
- Rebuild dist. Verified user create with username -> 201.
This commit is contained in:
Macky
2026-08-08 10:34:24 +07:00
parent 39d1aa04e4
commit 22d3e51980
29 changed files with 103 additions and 38 deletions

View File

@@ -1 +0,0 @@
import{k as x,c as r,a,t,u,i as d,w as n,v as m,C as g,e as _,F as U,p as k,q as f,r as p,o as i,z as V}from"./index-B2m5OgR7.js";const b={class:"card",style:{"margin-bottom":"16px"}},C={class:"row"},h={key:0,class:"error"},B={style:{flex:"1"}},M={class:"badge"},D={__name:"AdminUsers",setup(N){const v=p([]),o=p(""),s=p({name:"",email:"",password:"",role:"user"});async function c(){v.value=(await f.adminListUsers()).users}async function w(){o.value="";try{await f.adminCreateUser({...s.value}),s.value={name:"",email:"",password:"",role:"user"},await c()}catch(y){o.value=y.message}}return x(c),(y,l)=>(i(),r("div",null,[a("h2",null,t(u(d).t("users")),1),a("div",b,[a("h4",null,"+ "+t(u(d).t("create"))+" user",1),a("div",C,[n(a("input",{"onUpdate:modelValue":l[0]||(l[0]=e=>s.value.name=e),placeholder:"Name",style:{flex:"1"}},null,512),[[m,s.value.name]]),n(a("input",{"onUpdate:modelValue":l[1]||(l[1]=e=>s.value.email=e),placeholder:"Email",style:{flex:"1"}},null,512),[[m,s.value.email]]),n(a("input",{"onUpdate:modelValue":l[2]||(l[2]=e=>s.value.password=e),type:"password",placeholder:"Temp password",style:{flex:"1"}},null,512),[[m,s.value.password]]),n(a("select",{"onUpdate:modelValue":l[3]||(l[3]=e=>s.value.role=e),style:{flex:"1"}},[...l[4]||(l[4]=[a("option",{value:"user"},"user",-1),a("option",{value:"admin"},"admin",-1)])],512),[[g,s.value.role]]),a("button",{class:"primary",onClick:w},t(u(d).t("create")),1)]),o.value?(i(),r("div",h,t(o.value),1)):_("",!0)]),(i(!0),r(U,null,k(v.value,e=>(i(),r("div",{class:"card",key:e.id,style:{"margin-bottom":"8px",display:"flex","align-items":"center",gap:"12px"}},[a("strong",B,t(e.name)+" ("+t(e.email)+")",1),a("span",M,t(e.role),1),a("span",{class:V(["badge",e.active?"won":"lost"])},t(e.active?"active":"inactive"),3)]))),128))]))}};export{D as default};

View File

@@ -0,0 +1 @@
import{_ as f,k as x,c as o,a as e,t as l,u as d,i,H as w,w as u,v as c,C as U,e as g,F as k,p as V,q as y,r as p,o as n,z as h}from"./index-BhdfH8-z.js";const C={class:"card",style:{"margin-bottom":"16px"}},B={style:{"margin-top":"0"}},L={class:"row"},M={class:"row",style:{"margin-top":"10px"}},N=["disabled"],S={key:0,class:"error"},z={key:0,class:"card empty-state"},A={style:{flex:"1"}},D={class:"badge"},F={__name:"AdminUsers",setup(q){const v=p([]),r=p(""),t=p({username:"",name:"",password:"",role:"user"});async function m(){v.value=(await y.adminListUsers()).users}async function _(){r.value="";try{await y.adminCreateUser({...t.value}),t.value={username:"",name:"",password:"",role:"user"},await m()}catch(b){r.value=b.message}}return x(m),(b,a)=>(n(),o("div",null,[e("h2",null,"👥 "+l(d(i).t("users")),1),a[6]||(a[6]=w('<div class="card guide" data-v-6b85bc80><strong data-v-6b85bc80>📋 วิธีเพิ่มผู้ใช้งาน</strong><ol style="margin:8px 0 0;padding-left:20px;line-height:1.8;" data-v-6b85bc80><li data-v-6b85bc80>กรอก <strong data-v-6b85bc80>ชื่อผู้ใช้ (สำหรับเข้าสู่ระบบ)</strong>, ชื่อ, และรหัสผ่านเริ่มต้น</li><li data-v-6b85bc80>เลือกสิทธิ์: <strong data-v-6b85bc80>user</strong> = ผู้เข้าฝึกขาย, <strong data-v-6b85bc80>admin</strong> = จัดการระบบ</li><li data-v-6b85bc80>กด <strong data-v-6b85bc80>สร้าง</strong> — นำชื่อผู้ใช้ + รหัสผ่านไปแจ้งให้ผู้ใช้นั้นเข้าสู่ระบบได้เลย</li></ol></div>',1)),e("div",C,[e("h4",B," "+l(d(i).t("create"))+" "+l(d(i).t("users").toLowerCase()),1),e("div",L,[u(e("input",{"onUpdate:modelValue":a[0]||(a[0]=s=>t.value.username=s),placeholder:"ชื่อผู้ใช้ (เข้าสู่ระบบ)",style:{flex:"1"}},null,512),[[c,t.value.username]]),u(e("input",{"onUpdate:modelValue":a[1]||(a[1]=s=>t.value.name=s),placeholder:"ชื่อจริง",style:{flex:"1"}},null,512),[[c,t.value.name]]),u(e("input",{"onUpdate:modelValue":a[2]||(a[2]=s=>t.value.password=s),type:"password",placeholder:"รหัสผ่านเริ่มต้น",style:{flex:"1"}},null,512),[[c,t.value.password]])]),e("div",M,[u(e("select",{"onUpdate:modelValue":a[3]||(a[3]=s=>t.value.role=s),style:{flex:"1"}},[...a[4]||(a[4]=[e("option",{value:"user"},"🙂 user — ผู้เข้าฝึก",-1),e("option",{value:"admin"},"🛠 admin — ผู้ดูแลระบบ",-1)])],512),[[U,t.value.role]]),e("button",{class:"primary",onClick:_,disabled:!t.value.username||!t.value.password}," "+l(d(i).t("create")),9,N)]),r.value?(n(),o("div",S,l(r.value),1)):g("",!0)]),v.value.length===0?(n(),o("div",z,[...a[5]||(a[5]=[e("strong",null,"ยังไม่มีผู้ใช้งาน",-1),e("span",null,"สร้างผู้ใช้งานคนแรกด้วยฟอร์มด้านบน",-1)])])):g("",!0),(n(!0),o(k,null,V(v.value,s=>(n(),o("div",{class:"card",key:s.id,style:{"margin-bottom":"8px",display:"flex","align-items":"center",gap:"12px"}},[e("strong",A,l(s.name)+" ("+l(s.username)+")",1),e("span",D,l(s.role),1),e("span",{class:h(["badge",s.active?"won":"lost"])},l(s.active?"active":"inactive"),3)]))),128))]))}},H=f(F,[["__scopeId","data-v-6b85bc80"]]);export{H as default};

View File

@@ -0,0 +1 @@
.guide[data-v-6b85bc80]{background:#eef2ff;border-color:#c7d2fe;margin-bottom:16px}

View File

@@ -1 +0,0 @@
.stat[data-v-9558687f]{text-align:center;min-width:110px}.stat div[data-v-9558687f]{color:var(--muted);font-size:12px}.stat strong[data-v-9558687f]{font-size:20px}.filter-bar[data-v-9558687f]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.filter-bar input[type=date][data-v-9558687f]{width:auto}.grid[data-v-9558687f]{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px}.tier-card[data-v-9558687f]{display:flex;flex-direction:column}.badge.won[data-v-9558687f]{background:#dcfce7;color:#166534}.badge.lost[data-v-9558687f]{background:#fee2e2;color:#991b1b}.badge.not_tried[data-v-9558687f]{background:#eef2ff;color:#4338ca}.bar[data-v-9558687f]{background:#eef0f5;border-radius:999px;height:10px;overflow:hidden;margin-top:10px}.bar-fill[data-v-9558687f]{background:linear-gradient(90deg,var(--accent),var(--accent-2));height:100%;border-radius:999px;transition:width .4s ease}.users-btn[data-v-9558687f]{background:#0ea5e9;border-color:transparent;color:#fff;font-weight:600}.users-btn[data-v-9558687f]:not(:disabled):hover{background:#0284c7;box-shadow:0 6px 16px #0ea5e959}

View File

@@ -1 +0,0 @@
import{_ as x,k,c,a as s,t,u as o,i as l,l as m,m as y,w as h,v as f,n as C,e as N,F as V,p as L,q as A,s as B,r as u,o as _}from"./index-B2m5OgR7.js";const S={class:"row",style:{"align-items":"center","margin-bottom":"16px"}},j={style:{margin:"0"}},z={class:"row",style:{"margin-left":"auto",gap:"10px"}},D={class:"users-btn"},F={class:"primary"},M={class:"card filter-bar"},P={class:"muted"},R=["disabled"],T=["disabled"],U={class:"row",style:{gap:"16px",margin:"16px 0"}},W={class:"card stat"},q={class:"card stat"},E={style:{color:"var(--green)"}},I={class:"card stat"},O={style:{color:"var(--red)"}},G={class:"card stat"},H={class:"card stat"},J={class:"card"},K={class:"row",style:{"justify-content":"space-between","align-items":"center"}},Q={class:"bar"},X={class:"muted",style:{"font-size":"12px","margin-top":"6px"}},Y={style:{"margin-top":"20px"}},Z={key:0,class:"card empty-state"},$={class:"grid"},ss={class:"row",style:{"justify-content":"space-between"}},ts={class:"muted"},es={class:"row",style:{"margin-top":"10px",gap:"8px"}},as={class:"badge won"},os={class:"badge lost"},ls={class:"badge not_tried"},ns={class:"muted",style:{"margin-top":"8px"}},is={__name:"Analytics",setup(rs){const a=u({overall:{total_sessions:0,wins:0,losses:0,close_rate:0,avg_score:0},trainee_count:0,hardest_personas:[]}),i=u(""),r=u(""),d=u(!1);async function v(){d.value=!0;try{a.value=await A.analytics({from:i.value,to:r.value})}finally{d.value=!1}}function w(){v()}function b(){i.value="",r.value="",v()}return k(v),(ds,e)=>{const p=B("router-link");return _(),c("div",null,[s("div",S,[s("h2",j,"📊 "+t(o(l).t("adminOverview")),1),s("div",z,[m(p,{to:"/admin/users"},{default:y(()=>[s("button",D,"👥 "+t(o(l).t("users")),1)]),_:1}),m(p,{to:"/admin/new-group"},{default:y(()=>[s("button",F," "+t(o(l).t("addProduct")),1)]),_:1})])]),s("div",M,[s("span",P,"🗓 "+t(o(l).t("dateRange")),1),h(s("input",{type:"date","onUpdate:modelValue":e[0]||(e[0]=n=>i.value=n)},null,512),[[f,i.value]]),e[2]||(e[2]=s("span",null,"",-1)),h(s("input",{type:"date","onUpdate:modelValue":e[1]||(e[1]=n=>r.value=n)},null,512),[[f,r.value]]),s("button",{class:"primary",onClick:w,disabled:d.value},"→ "+t(o(l).t("apply")),9,R),s("button",{onClick:b,disabled:d.value},t(o(l).t("clear")),9,T)]),s("div",U,[s("div",W,[e[3]||(e[3]=s("div",null,"Sessions",-1)),s("strong",null,t(a.value.overall.total_sessions),1)]),s("div",q,[e[4]||(e[4]=s("div",null,"Wins",-1)),s("strong",E,t(a.value.overall.wins),1)]),s("div",I,[e[5]||(e[5]=s("div",null,"Losses",-1)),s("strong",O,t(a.value.overall.losses),1)]),s("div",G,[e[6]||(e[6]=s("div",null,"Avg score",-1)),s("strong",null,t(a.value.overall.avg_score),1)]),s("div",H,[e[7]||(e[7]=s("div",null,"Trainees",-1)),s("strong",null,t(a.value.trainee_count),1)])]),s("div",J,[s("div",K,[s("strong",null,t(o(l).t("closeRate")),1),s("strong",null,t(a.value.overall.close_rate)+"%",1)]),s("div",Q,[s("div",{class:"bar-fill",style:C({width:(a.value.overall.close_rate||0)+"%"})},null,4)]),s("div",X,t(a.value.overall.wins)+" "+t(o(l).t("won").toLowerCase())+" / "+t(a.value.overall.total_sessions)+" sessions ",1)]),s("h3",Y,t(o(l).t("hardestPersonas")),1),a.value.hardest_personas.length===0?(_(),c("div",Z,[...e[8]||(e[8]=[s("strong",null,"No data",-1),s("span",null,"No sessions in this date range.",-1)])])):N("",!0),s("div",$,[(_(!0),c(V,null,L(a.value.hardest_personas,(n,g)=>(_(),c("div",{key:g,class:"card lift tier-card"},[s("div",ss,[s("strong",null,t(n.persona_name),1),s("span",ts,"#"+t(g+1),1)]),s("div",es,[s("span",as,t(n.wins)+"W",1),s("span",os,t(n.losses)+"L",1),s("span",ls,t(n.plays)+" plays",1)]),s("div",ns,t(o(l).t("score"))+": "+t(n.avg_score),1)]))),128))])])}}},us=x(is,[["__scopeId","data-v-9558687f"]]);export{us as default};

View File

@@ -0,0 +1 @@
import{_ as x,k,c as u,a as s,t,u as a,i as l,l as g,m as y,w as f,v as h,n as C,e as N,F as V,p as L,q as A,s as B,r as c,o as _}from"./index-BhdfH8-z.js";const S={class:"row",style:{"align-items":"center","margin-bottom":"16px"}},j={style:{margin:"0"}},z={class:"row",style:{"margin-left":"auto",gap:"10px"}},D={class:"users-btn"},F={class:"primary"},M={class:"card filter-bar"},P={class:"muted"},R=["disabled"],T=["disabled"],U={class:"row",style:{gap:"16px",margin:"16px 0"}},W={class:"card stat"},q={class:"card stat"},E={style:{color:"var(--green)"}},I={class:"card stat"},O={style:{color:"var(--red)"}},G={class:"card stat"},H={class:"card stat"},J={class:"card"},K={class:"row",style:{"justify-content":"space-between","align-items":"center"}},Q={class:"bar"},X={class:"muted",style:{"font-size":"12px","margin-top":"6px"}},Y={style:{"margin-top":"20px"}},Z={key:0,class:"card empty-state"},$={class:"grid"},ss={class:"row",style:{"justify-content":"space-between"}},ts={class:"muted"},es={class:"row",style:{"margin-top":"10px",gap:"8px"}},os={class:"badge won"},as={class:"badge lost"},ls={class:"badge not_tried"},ns={class:"muted",style:{"margin-top":"8px"}},is={__name:"Analytics",setup(rs){const o=c({overall:{total_sessions:0,wins:0,losses:0,close_rate:0,avg_score:0},trainee_count:0,hardest_personas:[]}),i=c(""),r=c(""),d=c(!1);async function v(){d.value=!0;try{o.value=await A.analytics({from:i.value,to:r.value})}finally{d.value=!1}}function w(){v()}function b(){i.value="",r.value="",v()}return k(v),(ds,e)=>{const p=B("router-link");return _(),u("div",null,[s("div",S,[s("div",null,[s("h2",j,"📊 "+t(a(l).t("adminOverview")),1),e[2]||(e[2]=s("div",{class:"muted",style:{"margin-top":"4px"}},"ภาพรวมผลการฝึกของทีมทั้งหมด — เลือกช่วงเวลาเพื่อดูสถิติ",-1))]),s("div",z,[g(p,{to:"/admin/users"},{default:y(()=>[s("button",D,"👥 "+t(a(l).t("users")),1)]),_:1}),g(p,{to:"/admin/new-group"},{default:y(()=>[s("button",F," "+t(a(l).t("addProduct")),1)]),_:1})])]),s("div",M,[s("span",P,"🗓 "+t(a(l).t("dateRange")),1),f(s("input",{type:"date","onUpdate:modelValue":e[0]||(e[0]=n=>i.value=n)},null,512),[[h,i.value]]),e[3]||(e[3]=s("span",null,"",-1)),f(s("input",{type:"date","onUpdate:modelValue":e[1]||(e[1]=n=>r.value=n)},null,512),[[h,r.value]]),s("button",{class:"primary",onClick:w,disabled:d.value},"→ "+t(a(l).t("apply")),9,R),s("button",{onClick:b,disabled:d.value},t(a(l).t("clear")),9,T)]),s("div",U,[s("div",W,[e[4]||(e[4]=s("div",null,"Sessions",-1)),s("strong",null,t(o.value.overall.total_sessions),1)]),s("div",q,[e[5]||(e[5]=s("div",null,"Wins",-1)),s("strong",E,t(o.value.overall.wins),1)]),s("div",I,[e[6]||(e[6]=s("div",null,"Losses",-1)),s("strong",O,t(o.value.overall.losses),1)]),s("div",G,[e[7]||(e[7]=s("div",null,"Avg score",-1)),s("strong",null,t(o.value.overall.avg_score),1)]),s("div",H,[e[8]||(e[8]=s("div",null,"Trainees",-1)),s("strong",null,t(o.value.trainee_count),1)])]),s("div",J,[s("div",K,[s("strong",null,t(a(l).t("closeRate")),1),s("strong",null,t(o.value.overall.close_rate)+"%",1)]),s("div",Q,[s("div",{class:"bar-fill",style:C({width:(o.value.overall.close_rate||0)+"%"})},null,4)]),s("div",X,t(o.value.overall.wins)+" "+t(a(l).t("won").toLowerCase())+" / "+t(o.value.overall.total_sessions)+" sessions ",1)]),s("h3",Y,t(a(l).t("hardestPersonas")),1),o.value.hardest_personas.length===0?(_(),u("div",Z,[...e[9]||(e[9]=[s("strong",null,"No data",-1),s("span",null,"No sessions in this date range.",-1)])])):N("",!0),s("div",$,[(_(!0),u(V,null,L(o.value.hardest_personas,(n,m)=>(_(),u("div",{key:m,class:"card lift tier-card"},[s("div",ss,[s("strong",null,t(n.persona_name),1),s("span",ts,"#"+t(m+1),1)]),s("div",es,[s("span",os,t(n.wins)+"W",1),s("span",as,t(n.losses)+"L",1),s("span",ls,t(n.plays)+" plays",1)]),s("div",ns,t(a(l).t("score"))+": "+t(n.avg_score),1)]))),128))])])}}},cs=x(is,[["__scopeId","data-v-45823937"]]);export{cs as default};

View File

@@ -0,0 +1 @@
.stat[data-v-45823937]{text-align:center;min-width:110px}.stat div[data-v-45823937]{color:var(--muted);font-size:12px}.stat strong[data-v-45823937]{font-size:20px}.filter-bar[data-v-45823937]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.filter-bar input[type=date][data-v-45823937]{width:auto}.grid[data-v-45823937]{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px}.tier-card[data-v-45823937]{display:flex;flex-direction:column}.badge.won[data-v-45823937]{background:#dcfce7;color:#166534}.badge.lost[data-v-45823937]{background:#fee2e2;color:#991b1b}.badge.not_tried[data-v-45823937]{background:#eef2ff;color:#4338ca}.bar[data-v-45823937]{background:#eef0f5;border-radius:999px;height:10px;overflow:hidden;margin-top:10px}.bar-fill[data-v-45823937]{background:linear-gradient(90deg,var(--accent),var(--accent-2));height:100%;border-radius:999px;transition:width .4s ease}.users-btn[data-v-45823937]{background:#0ea5e9;border-color:transparent;color:#fff;font-weight:600}.users-btn[data-v-45823937]:not(:disabled):hover{background:#0284c7;box-shadow:0 6px 16px #0ea5e959}

View File

@@ -1 +0,0 @@
import{_ as K,k as M,q as k,c as t,l as S,m as D,u as l,a as s,t as e,z as C,e as i,j as m,i as n,F,p as I,w as q,v as E,b as H,h as J,r as c,B as L,s as O,o}from"./index-B2m5OgR7.js";const P={class:"row",style:{"align-items":"center","margin-bottom":"12px"}},R={style:{margin:"0"}},U={key:0,class:"muted"},$=["disabled"],A={key:0,class:"spinner",style:{"margin-right":"4px"}},G={key:0,class:"card task"},Q={key:0},W={key:0,class:"bubble msg-customer muted"},X={key:2,class:"composer"},Y=["disabled","placeholder"],Z=["disabled"],ee={key:3,class:"card debrief"},se={key:0},ae={class:"json"},te={class:"primary",style:{"margin-top":"12px"}},le={__name:"Chat",setup(ne){const N=J(),_=N.params.gid,g=N.params.pid,r=c(null),f=c(!1),v=c([]),p=c(""),d=c(!1),u=c(null),w=c(""),j=c(null);function T(){L(()=>{y.value&&(y.value.scrollTop=y.value.scrollHeight)})}const y=c(null);M(async()=>{r.value=(await k.getPersona(_,g)).persona;const a=await k.chatStart(_,g);j.value=a.session.id,a.session.task&&(w.value=a.session.task),v.value=a.session.messages||[],f.value=!0,v.value.length&&T()});async function V(){if(p.value.trim()){d.value=!0;try{const a=await k.chatSend(_,g,p.value.trim());v.value=a.messages,p.value="",T()}catch(a){alert(a.message)}finally{d.value=!1}}}async function z(){if(confirm(n.t("finish")+"?")){d.value=!0;try{const a=await k.chatFinish(_,g);u.value=a.debrief,v.value=a.session.messages}catch(a){alert(a.message)}finally{d.value=!1}}}return(a,b)=>{const B=O("router-link");return o(),t("div",null,[S(B,{to:`/groups/${l(_)}/personas`,class:"btn-back"},{default:D(()=>[m("← "+e(l(n).t("personas")),1)]),_:1},8,["to"]),s("div",P,[s("h2",R,e(r.value?r.value.name:"..."),1),s("span",{class:C(["badge",r.value&&r.value.channel])},e(r.value?r.value.channel:""),3),r.value?(o(),t("span",U,e(r.value.profession)+" · "+e(r.value.age_group),1)):i("",!0),s("button",{class:"danger",style:{"margin-left":"auto"},onClick:z,disabled:v.value.length===0||!!u.value},[d.value?(o(),t("span",A)):i("",!0),m(e(l(n).t("finish")),1)],8,$)]),f.value?i("",!0):(o(),t("div",G,[s("strong",null,"📣 "+e(l(n).t("sellerInitiated")),1),w.value?(o(),t("div",Q,e(w.value),1)):i("",!0)])),f.value?(o(),t("div",{key:1,class:"thread",ref_key:"thread",ref:y},[(o(!0),t(F,null,I(v.value,(h,x)=>(o(),t("div",{key:x,class:C(["bubble",h.role==="seller"?"msg-seller":"msg-customer"])},e(h.text),3))),128)),d.value?(o(),t("div",W,"...")):i("",!0)],512)):i("",!0),f.value&&!u.value?(o(),t("div",X,[q(s("input",{"onUpdate:modelValue":b[0]||(b[0]=h=>p.value=h),onKeyup:H(V,["enter"]),disabled:d.value,placeholder:l(n).t("send")},null,40,Y),[[E,p.value]]),s("button",{class:"primary",onClick:V,disabled:d.value||!p.value.trim()},e(l(n).t("send")),9,Z)])):i("",!0),u.value?(o(),t("div",ee,[s("h3",null,e(l(n).t("debrief")),1),s("p",null,[s("span",{class:C(["badge",u.value.outcome])},e(u.value.outcome==="won"?l(n).t("won"):l(n).t("lost")),3),m(" — "+e(l(n).t("score"))+": ",1),s("strong",null,e(u.value.score),1)]),s("p",null,[s("strong",null,e(l(n).t("pain"))+":",1),m(" "+e(u.value.pain||"—"),1)]),s("p",null,[s("strong",null,e(l(n).t("why"))+":",1),m(" "+e(u.value.why),1)]),u.value.coaching&&u.value.coaching.length?(o(),t("div",se,[b[1]||(b[1]=s("strong",null,"Coaching:",-1)),s("ul",null,[(o(!0),t(F,null,I(u.value.coaching,(h,x)=>(o(),t("li",{key:x},e(h),1))),128))])])):i("",!0),s("details",null,[s("summary",null,e(l(n).t("reveal")),1),s("pre",ae,e(JSON.stringify(u.value.revealed_persona,null,2)),1)]),S(B,{to:"/"},{default:D(()=>[s("button",te,e(l(n).t("dashboard")),1)]),_:1})])):i("",!0)])}}},ue=K(le,[["__scopeId","data-v-4f54526a"]]);export{ue as default};

1
frontend/dist/assets/Chat-COdP9j9f.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.thread[data-v-4f54526a]{background:#eceff4;border:1px solid var(--border);border-radius:var(--radius);padding:16px;min-height:320px;max-height:52vh;overflow-y:auto;display:flex;flex-direction:column;gap:8px}.bubble[data-v-4f54526a]{max-width:72%;padding:10px 14px;white-space:pre-wrap;word-break:break-word}.composer[data-v-4f54526a]{display:flex;gap:8px;margin-top:12px}.task[data-v-4f54526a]{margin-bottom:12px;background:#fff7ed;border-color:#fed7aa}.debrief[data-v-4f54526a]{margin-top:16px}.json[data-v-4f54526a]{background:#0f172a;color:#9ca3af;padding:10px;border-radius:8px;font-size:11px;overflow:auto;max-height:260px}button.danger[data-v-4f54526a]{background:var(--red);color:#fff;border:none}

View File

@@ -0,0 +1 @@
.thread[data-v-16c880f2]{background:#eceff4;border:1px solid var(--border);border-radius:var(--radius);padding:16px;min-height:320px;max-height:52vh;overflow-y:auto;display:flex;flex-direction:column;gap:8px}.bubble[data-v-16c880f2]{max-width:72%;padding:10px 14px;white-space:pre-wrap;word-break:break-word}.composer[data-v-16c880f2]{display:flex;gap:8px;margin-top:12px}.task[data-v-16c880f2]{margin-bottom:12px;background:#fff7ed;border-color:#fed7aa}.debrief[data-v-16c880f2]{margin-top:16px}.json[data-v-16c880f2]{background:#0f172a;color:#9ca3af;padding:10px;border-radius:8px;font-size:11px;overflow:auto;max-height:260px}button.danger[data-v-16c880f2]{background:var(--red);color:#fff;border:none}.guide[data-v-16c880f2]{background:#eef2ff;border-color:#c7d2fe;margin-bottom:12px}.reveal-grid[data-v-16c880f2]{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}.rev[data-v-16c880f2]{display:flex;flex-direction:column;background:#f8fafc;border:1px solid var(--border);border-radius:8px;padding:8px 10px}.rk[data-v-16c880f2]{font-size:12px;color:var(--muted)}.rv[data-v-16c880f2]{font-size:13px;color:var(--ink);margin-top:2px}@media (max-width: 640px){.reveal-grid[data-v-16c880f2]{grid-template-columns:1fr}}

View File

@@ -1 +1 @@
import{_ as k,c as f,l as V,m as w,a as e,j as r,t as a,u as s,i as u,w as d,v as m,C as _,e as C,s as B,r as c,q as S,g as U,o as h}from"./index-B2m5OgR7.js";const N={class:"card"},D={style:{"margin-top":"0"}},E={class:"row"},G={style:{flex:"1"}},M={value:"facebook"},P={value:"line"},q={style:{flex:"1"}},F={value:"th"},O={value:"en"},T={key:0,class:"error"},j=["disabled"],A={__name:"GroupBuilder",setup(I){const b=U(),t=c({product:"",segment:"",description:"",channel:"facebook",language:"th"}),v=c([]),i=c(""),p=c(!1);function x(n){v.value=Array.from(n.target.files||[])}async function y(){p.value=!0,i.value="";try{const n=new FormData;n.append("product",t.value.product),n.append("segment",t.value.segment),n.append("description",t.value.description),n.append("channel",t.value.channel),n.append("language",t.value.language),v.value.forEach(o=>n.append("files",o));const g=(await S.createGroup(n)).group.id;b.push(`/admin/groups/${g}/edit`)}catch(n){i.value=n.message}finally{p.value=!1}}return(n,l)=>{const g=B("router-link");return h(),f("div",null,[V(g,{to:"/training",class:"btn-back"},{default:w(()=>[r("← "+a(s(u).t("training")),1)]),_:1}),l[7]||(l[7]=e("div",{class:"card guide"},[e("strong",null,"📋 วิธีสร้างกลุ่มบุคคลต้นแบบ"),e("ol",{style:{margin:"8px 0 0","padding-left":"20px","line-height":"1.8"}},[e("li",null,[r("กรอก "),e("strong",null,"ชื่อ/รายละเอียดสินค้าหรือบริการ"),r(" ที่อยากให้ทีมฝึกขาย (ช่องด้านล่าง)")]),e("li",null,"(ไม่บังคับ) ระบุกลุ่มลูกค้าเป้าหมาย หรืออัปโหลดไฟล์เอกสารสินค้า .pdf/.md/.txt"),e("li",null,[r("กด "),e("strong",null,"สร้าง"),r(" — ระบบจะพาไปหน้าสร้างบุคคลต้นแบบ (ลูกค้าจำลอง)")])])],-1)),e("div",N,[e("h2",D,"📦 "+a(s(u).t("addProduct")),1),e("label",null,[r(a(s(u).t("product"))+" ",1),l[5]||(l[5]=e("span",{class:"req"},"*",-1))]),d(e("textarea",{"onUpdate:modelValue":l[0]||(l[0]=o=>t.value.product=o),rows:"3",placeholder:"เช่น ระบบ POS สำหรับร้านอาหาร Cloud POS for small restaurants"},null,512),[[m,t.value.product]]),e("label",null,a(s(u).t("segment")),1),d(e("input",{"onUpdate:modelValue":l[1]||(l[1]=o=>t.value.segment=o),placeholder:"เช่น SMEs ร้านอาหารในกรุงเทพ"},null,512),[[m,t.value.segment]]),e("label",null,a(s(u).t("description")),1),d(e("textarea",{"onUpdate:modelValue":l[2]||(l[2]=o=>t.value.description=o),rows:"3",placeholder:"รายละเอียดเพิ่มเติม เช่น จุดเด่นสินค้า ราคา ฯลฯ (ไม่บังคับ)"},null,512),[[m,t.value.description]]),e("div",E,[e("div",G,[e("label",null,a(s(u).t("channel")),1),d(e("select",{"onUpdate:modelValue":l[3]||(l[3]=o=>t.value.channel=o)},[e("option",M,a(s(u).t("facebook")),1),e("option",P,a(s(u).t("line")),1)],512),[[_,t.value.channel]])]),e("div",q,[e("label",null,a(s(u).t("language")),1),d(e("select",{"onUpdate:modelValue":l[4]||(l[4]=o=>t.value.language=o)},[e("option",F,a(s(u).t("thai")),1),e("option",O,a(s(u).t("english")),1)],512),[[_,t.value.language]])])]),l[6]||(l[6]=e("label",null,"📎 ไฟล์เอกสารสินค้า (.pdf/.md/.txt) — ใช้เป็นข้อมูลให้ระบบได้",-1)),e("input",{type:"file",multiple:"",accept:".pdf,.md,.txt",onChange:x},null,32),i.value?(h(),f("div",T,a(i.value),1)):C("",!0),e("button",{class:"primary",style:{"margin-top":"16px"},disabled:p.value||!t.value.product&&!v.value.length,onClick:y},a(p.value?"กำลังสร้าง…":" สร้างกลุ่มบุคคลต้นแบบ"),9,j)])])}}},$=k(A,[["__scopeId","data-v-c7f3b0ac"]]);export{$ as default};
import{_ as k,c as f,l as V,m as w,a as e,j as r,t as a,u as s,i as u,w as d,v as m,C as _,e as C,s as B,r as c,q as S,g as U,o as h}from"./index-BhdfH8-z.js";const N={class:"card"},D={style:{"margin-top":"0"}},E={class:"row"},G={style:{flex:"1"}},M={value:"facebook"},P={value:"line"},q={style:{flex:"1"}},F={value:"th"},O={value:"en"},T={key:0,class:"error"},j=["disabled"],A={__name:"GroupBuilder",setup(I){const b=U(),t=c({product:"",segment:"",description:"",channel:"facebook",language:"th"}),v=c([]),i=c(""),p=c(!1);function x(n){v.value=Array.from(n.target.files||[])}async function y(){p.value=!0,i.value="";try{const n=new FormData;n.append("product",t.value.product),n.append("segment",t.value.segment),n.append("description",t.value.description),n.append("channel",t.value.channel),n.append("language",t.value.language),v.value.forEach(o=>n.append("files",o));const g=(await S.createGroup(n)).group.id;b.push(`/admin/groups/${g}/edit`)}catch(n){i.value=n.message}finally{p.value=!1}}return(n,l)=>{const g=B("router-link");return h(),f("div",null,[V(g,{to:"/training",class:"btn-back"},{default:w(()=>[r("← "+a(s(u).t("training")),1)]),_:1}),l[7]||(l[7]=e("div",{class:"card guide"},[e("strong",null,"📋 วิธีสร้างกลุ่มบุคคลต้นแบบ"),e("ol",{style:{margin:"8px 0 0","padding-left":"20px","line-height":"1.8"}},[e("li",null,[r("กรอก "),e("strong",null,"ชื่อ/รายละเอียดสินค้าหรือบริการ"),r(" ที่อยากให้ทีมฝึกขาย (ช่องด้านล่าง)")]),e("li",null,"(ไม่บังคับ) ระบุกลุ่มลูกค้าเป้าหมาย หรืออัปโหลดไฟล์เอกสารสินค้า .pdf/.md/.txt"),e("li",null,[r("กด "),e("strong",null,"สร้าง"),r(" — ระบบจะพาไปหน้าสร้างบุคคลต้นแบบ (ลูกค้าจำลอง)")])])],-1)),e("div",N,[e("h2",D,"📦 "+a(s(u).t("addProduct")),1),e("label",null,[r(a(s(u).t("product"))+" ",1),l[5]||(l[5]=e("span",{class:"req"},"*",-1))]),d(e("textarea",{"onUpdate:modelValue":l[0]||(l[0]=o=>t.value.product=o),rows:"3",placeholder:"เช่น ระบบ POS สำหรับร้านอาหาร Cloud POS for small restaurants"},null,512),[[m,t.value.product]]),e("label",null,a(s(u).t("segment")),1),d(e("input",{"onUpdate:modelValue":l[1]||(l[1]=o=>t.value.segment=o),placeholder:"เช่น SMEs ร้านอาหารในกรุงเทพ"},null,512),[[m,t.value.segment]]),e("label",null,a(s(u).t("description")),1),d(e("textarea",{"onUpdate:modelValue":l[2]||(l[2]=o=>t.value.description=o),rows:"3",placeholder:"รายละเอียดเพิ่มเติม เช่น จุดเด่นสินค้า ราคา ฯลฯ (ไม่บังคับ)"},null,512),[[m,t.value.description]]),e("div",E,[e("div",G,[e("label",null,a(s(u).t("channel")),1),d(e("select",{"onUpdate:modelValue":l[3]||(l[3]=o=>t.value.channel=o)},[e("option",M,a(s(u).t("facebook")),1),e("option",P,a(s(u).t("line")),1)],512),[[_,t.value.channel]])]),e("div",q,[e("label",null,a(s(u).t("language")),1),d(e("select",{"onUpdate:modelValue":l[4]||(l[4]=o=>t.value.language=o)},[e("option",F,a(s(u).t("thai")),1),e("option",O,a(s(u).t("english")),1)],512),[[_,t.value.language]])])]),l[6]||(l[6]=e("label",null,"📎 ไฟล์เอกสารสินค้า (.pdf/.md/.txt) — ใช้เป็นข้อมูลให้ระบบได้",-1)),e("input",{type:"file",multiple:"",accept:".pdf,.md,.txt",onChange:x},null,32),i.value?(h(),f("div",T,a(i.value),1)):C("",!0),e("button",{class:"primary",style:{"margin-top":"16px"},disabled:p.value||!t.value.product&&!v.value.length,onClick:y},a(p.value?"กำลังสร้าง…":" สร้างกลุ่มบุคคลต้นแบบ"),9,j)])])}}},$=k(A,[["__scopeId","data-v-c7f3b0ac"]]);export{$ as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as b,c as d,a as e,t as s,u as c,i as o,w as y,v as x,b as w,d as k,e as S,r as l,f,g as V,h as B,o as v}from"./index-B2m5OgR7.js";const C={class:"login-wrap"},D={class:"card login-card"},K={class:"pw-wrap"},E=["type"],L=["aria-label"],M={key:0,class:"error",role:"alert"},N=["disabled"],R={key:0,class:"spinner"},U={key:1},q={__name:"Login",setup(H){const g=B(),_=V(),n=l(""),u=l(""),a=l(!1),r=l(""),i=l(!1);async function m(){r.value="",i.value=!0;try{await f.login(n.value.trim(),u.value),f.mustSetup?_.push({path:"/setup"}):_.push(g.query.redirect||"/")}catch{r.value=o.t("loginError")}finally{i.value=!1}}return(h,t)=>(v(),d("div",C,[e("div",D,[e("h1",null,"🎯 "+s(c(o).t("app")),1),t[3]||(t[3]=e("p",{class:"muted",style:{"margin-top":"-8px"}},"Sales training simulator",-1)),e("label",null,s(c(o).t("username")),1),y(e("input",{"onUpdate:modelValue":t[0]||(t[0]=p=>n.value=p),type:"text",autocomplete:"username",onKeyup:w(m,["enter"])},null,544),[[x,n.value]]),e("label",null,s(c(o).t("password")),1),e("div",K,[y(e("input",{"onUpdate:modelValue":t[1]||(t[1]=p=>u.value=p),type:a.value?"text":"password",autocomplete:"current-password",onKeyup:w(m,["enter"])},null,40,E),[[k,u.value]]),e("button",{type:"button",class:"pw-toggle",onClick:t[2]||(t[2]=p=>a.value=!a.value),"aria-label":a.value?"Hide password":"Show password"},s(a.value?"🙈":"👁"),9,L)]),r.value?(v(),d("div",M,s(r.value),1)):S("",!0),e("button",{class:"primary",style:{width:"100%","margin-top":"16px"},disabled:i.value||!n.value||!u.value,onClick:m},[i.value?(v(),d("span",R)):(v(),d("span",U,s(c(o).t("login")),1))],8,N)])]))}},P=b(q,[["__scopeId","data-v-f7904d9f"]]);export{P as default};
import{_ as b,c as d,a as e,t as s,u as c,i as o,w as y,v as x,b as w,d as k,e as S,r as l,f,g as V,h as B,o as v}from"./index-BhdfH8-z.js";const C={class:"login-wrap"},D={class:"card login-card"},K={class:"pw-wrap"},E=["type"],L=["aria-label"],M={key:0,class:"error",role:"alert"},N=["disabled"],R={key:0,class:"spinner"},U={key:1},q={__name:"Login",setup(H){const g=B(),_=V(),n=l(""),u=l(""),a=l(!1),r=l(""),i=l(!1);async function m(){r.value="",i.value=!0;try{await f.login(n.value.trim(),u.value),f.mustSetup?_.push({path:"/setup"}):_.push(g.query.redirect||"/")}catch{r.value=o.t("loginError")}finally{i.value=!1}}return(h,t)=>(v(),d("div",C,[e("div",D,[e("h1",null,"🎯 "+s(c(o).t("app")),1),t[3]||(t[3]=e("p",{class:"muted",style:{"margin-top":"-8px"}},"Sales training simulator",-1)),e("label",null,s(c(o).t("username")),1),y(e("input",{"onUpdate:modelValue":t[0]||(t[0]=p=>n.value=p),type:"text",autocomplete:"username",onKeyup:w(m,["enter"])},null,544),[[x,n.value]]),e("label",null,s(c(o).t("password")),1),e("div",K,[y(e("input",{"onUpdate:modelValue":t[1]||(t[1]=p=>u.value=p),type:a.value?"text":"password",autocomplete:"current-password",onKeyup:w(m,["enter"])},null,40,E),[[k,u.value]]),e("button",{type:"button",class:"pw-toggle",onClick:t[2]||(t[2]=p=>a.value=!a.value),"aria-label":a.value?"Hide password":"Show password"},s(a.value?"🙈":"👁"),9,L)]),r.value?(v(),d("div",M,s(r.value),1)):S("",!0),e("button",{class:"primary",style:{width:"100%","margin-top":"16px"},disabled:i.value||!n.value||!u.value,onClick:m},[i.value?(v(),d("span",R)):(v(),d("span",U,s(c(o).t("login")),1))],8,N)])]))}},P=b(q,[["__scopeId","data-v-f7904d9f"]]);export{P as default};

View File

@@ -1 +0,0 @@
import{_ as f,k as x,q as v,c as l,a as t,t as s,u as e,i as a,e as m,w as k,x as b,F as B,p as S,r as _,y as c,o as r,z as D}from"./index-B2m5OgR7.js";const M={key:0,class:"row stat-row"},N={class:"card stat"},T={class:"card stat won"},z={class:"card stat lost"},C={class:"card stat"},F={key:1,class:"card"},V={key:2,class:"card empty-state"},j={class:"card",style:{"margin-top":"20px"}},q={style:{"margin-top":"0"}},E={__name:"MyBoard",setup(G){const o=_([]),u=_([]),p=_(!0),y=c(()=>o.value.length),g=c(()=>o.value.filter(n=>n.my_outcome==="won").length),h=c(()=>o.value.filter(n=>n.my_outcome==="lost").length),w=c(()=>o.value.filter(n=>n.my_outcome==="not_tried").length);return x(async()=>{try{o.value=(await v.myBoard()).board||[],u.value=(await v.mySessions()).sessions||[]}finally{p.value=!1}}),(n,i)=>(r(),l("div",null,[t("h2",null,"📊 "+s(e(a).t("myDashboard")),1),p.value?m("",!0):(r(),l("div",M,[t("div",N,[t("span",null,s(e(a).t("total")),1),t("strong",null,s(y.value),1)]),t("div",T,[t("span",null,s(e(a).t("won")),1),t("strong",null,s(g.value),1)]),t("div",z,[t("span",null,s(e(a).t("lost")),1),t("strong",null,s(h.value),1)]),t("div",C,[t("span",null,s(e(a).t("notTried")),1),t("strong",null,s(w.value),1)])])),p.value?(r(),l("div",F,[...i[0]||(i[0]=[t("div",{class:"skeleton",style:{height:"50px"}},null,-1)])])):o.value.length===0?(r(),l("div",V,[...i[1]||(i[1]=[t("strong",null,"No practice yet",-1),t("span",null,"Go to Training and try closing a sale with a persona.",-1)])])):m("",!0),k(t("div",j,[t("h3",q,s(e(a).t("mySessions")),1),(r(!0),l(B,null,S(u.value,d=>(r(),l("div",{key:d.id,style:{display:"flex","justify-content":"space-between",padding:"8px 0","border-bottom":"1px solid var(--border)"}},[t("span",null,s(d.persona_name),1),t("span",{class:D(["badge",d.outcome])},s(d.outcome==="won"?e(a).t("won"):e(a).t("lost")),3)]))),128))],512),[[b,u.value.length]])]))}},L=f(E,[["__scopeId","data-v-1f6ea068"]]);export{L as default};

View File

@@ -0,0 +1 @@
.stat-row[data-v-b92138a0]{gap:16px}.stat[data-v-b92138a0]{text-align:center;min-width:100px}.stat span[data-v-b92138a0]{display:block;font-size:12px;color:var(--muted)}.stat strong[data-v-b92138a0]{font-size:26px}.stat.won strong[data-v-b92138a0]{color:var(--green)}.stat.lost strong[data-v-b92138a0]{color:var(--red)}

View File

@@ -1 +0,0 @@
.stat-row[data-v-1f6ea068]{gap:16px}.stat[data-v-1f6ea068]{text-align:center;min-width:100px}.stat span[data-v-1f6ea068]{display:block;font-size:12px;color:var(--muted)}.stat strong[data-v-1f6ea068]{font-size:26px}.stat.won strong[data-v-1f6ea068]{color:var(--green)}.stat.lost strong[data-v-1f6ea068]{color:var(--red)}

View File

@@ -0,0 +1 @@
import{_ as f,k as x,q as v,c as r,a as t,t as s,u as e,i as a,e as _,w as b,x as k,F as B,p as S,r as m,y as u,o as i,z as D}from"./index-BhdfH8-z.js";const M={style:{margin:"0"}},N={key:0,class:"row stat-row"},T={class:"card stat"},z={class:"card stat won"},C={class:"card stat lost"},F={class:"card stat"},V={key:1,class:"card"},j={key:2,class:"card empty-state"},q={class:"card",style:{"margin-top":"20px"}},E={style:{"margin-top":"0"}},G={__name:"MyBoard",setup(I){const o=m([]),c=m([]),p=m(!0),y=u(()=>o.value.length),g=u(()=>o.value.filter(n=>n.my_outcome==="won").length),h=u(()=>o.value.filter(n=>n.my_outcome==="lost").length),w=u(()=>o.value.filter(n=>n.my_outcome==="not_tried").length);return x(async()=>{try{o.value=(await v.myBoard()).board||[],c.value=(await v.mySessions()).sessions||[]}finally{p.value=!1}}),(n,l)=>(i(),r("div",null,[t("div",null,[t("h2",M,"📈 "+s(e(a).t("myDashboard")),1),l[0]||(l[0]=t("div",{class:"muted",style:{"margin-top":"4px","margin-bottom":"16px"}},"สรุปผลการฝึกของตัวคุณเอง — ดูว่าปิดการขายได้กี่ครั้ง ยังฝึกกับใครบ้าง",-1))]),p.value?_("",!0):(i(),r("div",N,[t("div",T,[t("span",null,s(e(a).t("total")),1),t("strong",null,s(y.value),1)]),t("div",z,[t("span",null,s(e(a).t("won")),1),t("strong",null,s(g.value),1)]),t("div",C,[t("span",null,s(e(a).t("lost")),1),t("strong",null,s(h.value),1)]),t("div",F,[t("span",null,s(e(a).t("notTried")),1),t("strong",null,s(w.value),1)])])),p.value?(i(),r("div",V,[...l[1]||(l[1]=[t("div",{class:"skeleton",style:{height:"50px"}},null,-1)])])):o.value.length===0?(i(),r("div",j,[...l[2]||(l[2]=[t("strong",null,"No practice yet",-1),t("span",null,"Go to Training and try closing a sale with a persona.",-1)])])):_("",!0),b(t("div",q,[t("h3",E,s(e(a).t("mySessions")),1),(i(!0),r(B,null,S(c.value,d=>(i(),r("div",{key:d.id,style:{display:"flex","justify-content":"space-between",padding:"8px 0","border-bottom":"1px solid var(--border)"}},[t("span",null,s(d.persona_name),1),t("span",{class:D(["badge",d.outcome])},s(d.outcome==="won"?e(a).t("won"):e(a).t("lost")),3)]))),128))],512),[[k,c.value.length]])]))}},A=f(G,[["__scopeId","data-v-b92138a0"]]);export{A as default};

View File

@@ -1 +1 @@
import{_ as N,k as V,c as i,l as k,m as u,a as t,t as s,u as a,i as n,f as y,e as b,F as _,p as f,h as z,q as I,s as L,r as x,o,j as w,z as p,A}from"./index-B2m5OgR7.js";const T={class:"row",style:{"align-items":"center"}},j={style:{margin:"0"}},F={class:"muted",style:{"margin-left":"auto"}},q={key:0,class:"card guide"},D={key:1,class:"row",style:{margin:"12px 0",gap:"10px"}},E={class:"primary"},M={class:"grid"},R={class:"row",style:{"justify-content":"space-between"}},S={class:"diff"},G={class:"muted"},H={class:"muted"},J={class:"muted"},K={class:"muted",style:{"margin-top":"6px"}},O={class:"primary",style:{width:"100%"}},Q={class:"primary",style:{width:"100%"}},U={key:1,class:"muted",style:{"margin-top":"auto","font-size":"12px"}},W={__name:"Personas",setup(X){const d=z().params.gid,g=x([]),B=x(!0);async function C(){try{g.value=(await I.listPersonas(d)).personas}finally{B.value=!1}}function P(l){return g.value.filter(r=>r.tier===l)}function $(l){return n.t(l==="A"?"tierA":l==="B"?"tierB":"tierC")}function h(l){return l==="won"?n.t("won"):l==="lost"?n.t("lost"):n.t("notTried")}return V(C),(l,r)=>{const c=L("router-link");return o(),i("div",null,[k(c,{to:"/training",class:"btn-back"},{default:u(()=>[w("← "+s(a(n).t("training")),1)]),_:1}),t("div",T,[t("h2",j,s(a(n).t("personas")),1),t("span",F,s(a(n).t("selectPersona")),1)]),a(y).isAdmin?b("",!0):(o(),i("div",q,[...r[0]||(r[0]=[t("strong",null,"🎯 วิธีฝึก",-1),t("ol",{style:{margin:"8px 0 0","padding-left":"20px","line-height":"1.8"}},[t("li",null,"เลือกลูกค้าจำลอง (บุคคลต้นแบบ) คนหนึ่งที่อยากฝึกด้วย"),t("li",null,"ระดับ A ง่ายสุด → ระดับ C ยากสุด (ดูจากดาว ★ ความยาก)"),t("li",null,"กดปุ่มสำหรับฝึกแชทกับลูกค้าคนนั้น (ฝึกได้คนละครั้งเท่านั้น)")],-1)])])),a(y).isAdmin?(o(),i("div",D,[k(c,{to:`/admin/groups/${a(d)}/edit`},{default:u(()=>[t("button",E,"🛠 "+s(a(n).t("managePersonas")),1)]),_:1},8,["to"]),r[1]||(r[1]=t("span",{class:"muted"},"Admin: full persona data + edit available here.",-1))])):b("",!0),(o(),i(_,null,f(["A","B","C"],m=>t("div",{key:m,style:{margin:"20px 0"}},[t("h4",null,s($(m)),1),t("div",M,[(o(!0),i(_,null,f(P(m),e=>(o(),i("div",{key:e.id,class:"card pcard lift"},[t("div",R,[t("strong",null,s(e.name),1),t("span",{class:p(["badge",e.my_outcome])},s(h(e.my_outcome)),3)]),t("div",S,[(o(),i(_,null,f(5,v=>t("span",{key:v,class:p(["star",{on:v<=(e.difficulty||1)}])},"★",2)),64)),t("span",G,s(a(n).t("difficulty"))+" "+s(e.difficulty||1)+"/5",1)]),t("div",H,[w(s(e.profession)+" · "+s(e.age_group)+" · "+s(e.location),1),r[2]||(r[2]=t("br",null,null,-1)),t("span",{class:p(["badge",e.channel])},s(e.channel),3),t("span",J," · "+s(e.initiation_mode==="seller"?a(n).t("sellerInitiated"):a(n).t("customerInitiated")),1)]),t("div",K,s(e.product_context),1),a(y).isAdmin?(o(),A(c,{key:0,to:`/groups/${a(d)}/chat/${e.id}`,style:{"margin-top":"auto"}},{default:u(()=>[t("button",O,s(a(n).t("chat")),1)]),_:1},8,["to"])):(o(),i(_,{key:1},[e.my_outcome==="not_tried"?(o(),A(c,{key:0,to:`/groups/${a(d)}/chat/${e.id}`,style:{"margin-top":"auto"}},{default:u(()=>[t("button",Q,s(a(n).t("chat")),1)]),_:1},8,["to"])):(o(),i("div",U,"✓ "+s(a(n).t("trained"))+" ("+s(h(e.my_outcome))+")",1))],64))]))),128))])])),64))])}}},tt=N(W,[["__scopeId","data-v-0fa25205"]]);export{tt as default};
import{_ as N,k as V,c as i,l as k,m as u,a as t,t as s,u as a,i as n,f as y,e as b,F as _,p as f,h as z,q as I,s as L,r as x,o,j as w,z as p,A}from"./index-BhdfH8-z.js";const T={class:"row",style:{"align-items":"center"}},j={style:{margin:"0"}},F={class:"muted",style:{"margin-left":"auto"}},q={key:0,class:"card guide"},D={key:1,class:"row",style:{margin:"12px 0",gap:"10px"}},E={class:"primary"},M={class:"grid"},R={class:"row",style:{"justify-content":"space-between"}},S={class:"diff"},G={class:"muted"},H={class:"muted"},J={class:"muted"},K={class:"muted",style:{"margin-top":"6px"}},O={class:"primary",style:{width:"100%"}},Q={class:"primary",style:{width:"100%"}},U={key:1,class:"muted",style:{"margin-top":"auto","font-size":"12px"}},W={__name:"Personas",setup(X){const d=z().params.gid,g=x([]),B=x(!0);async function C(){try{g.value=(await I.listPersonas(d)).personas}finally{B.value=!1}}function P(l){return g.value.filter(r=>r.tier===l)}function $(l){return n.t(l==="A"?"tierA":l==="B"?"tierB":"tierC")}function h(l){return l==="won"?n.t("won"):l==="lost"?n.t("lost"):n.t("notTried")}return V(C),(l,r)=>{const c=L("router-link");return o(),i("div",null,[k(c,{to:"/training",class:"btn-back"},{default:u(()=>[w("← "+s(a(n).t("training")),1)]),_:1}),t("div",T,[t("h2",j,s(a(n).t("personas")),1),t("span",F,s(a(n).t("selectPersona")),1)]),a(y).isAdmin?b("",!0):(o(),i("div",q,[...r[0]||(r[0]=[t("strong",null,"🎯 วิธีฝึก",-1),t("ol",{style:{margin:"8px 0 0","padding-left":"20px","line-height":"1.8"}},[t("li",null,"เลือกลูกค้าจำลอง (บุคคลต้นแบบ) คนหนึ่งที่อยากฝึกด้วย"),t("li",null,"ระดับ A ง่ายสุด → ระดับ C ยากสุด (ดูจากดาว ★ ความยาก)"),t("li",null,"กดปุ่มสำหรับฝึกแชทกับลูกค้าคนนั้น (ฝึกได้คนละครั้งเท่านั้น)")],-1)])])),a(y).isAdmin?(o(),i("div",D,[k(c,{to:`/admin/groups/${a(d)}/edit`},{default:u(()=>[t("button",E,"🛠 "+s(a(n).t("managePersonas")),1)]),_:1},8,["to"]),r[1]||(r[1]=t("span",{class:"muted"},"Admin: full persona data + edit available here.",-1))])):b("",!0),(o(),i(_,null,f(["A","B","C"],m=>t("div",{key:m,style:{margin:"20px 0"}},[t("h4",null,s($(m)),1),t("div",M,[(o(!0),i(_,null,f(P(m),e=>(o(),i("div",{key:e.id,class:"card pcard lift"},[t("div",R,[t("strong",null,s(e.name),1),t("span",{class:p(["badge",e.my_outcome])},s(h(e.my_outcome)),3)]),t("div",S,[(o(),i(_,null,f(5,v=>t("span",{key:v,class:p(["star",{on:v<=(e.difficulty||1)}])},"★",2)),64)),t("span",G,s(a(n).t("difficulty"))+" "+s(e.difficulty||1)+"/5",1)]),t("div",H,[w(s(e.profession)+" · "+s(e.age_group)+" · "+s(e.location),1),r[2]||(r[2]=t("br",null,null,-1)),t("span",{class:p(["badge",e.channel])},s(e.channel),3),t("span",J," · "+s(e.initiation_mode==="seller"?a(n).t("sellerInitiated"):a(n).t("customerInitiated")),1)]),t("div",K,s(e.product_context),1),a(y).isAdmin?(o(),A(c,{key:0,to:`/groups/${a(d)}/chat/${e.id}`,style:{"margin-top":"auto"}},{default:u(()=>[t("button",O,s(a(n).t("chat")),1)]),_:1},8,["to"])):(o(),i(_,{key:1},[e.my_outcome==="not_tried"?(o(),A(c,{key:0,to:`/groups/${a(d)}/chat/${e.id}`,style:{"margin-top":"auto"}},{default:u(()=>[t("button",Q,s(a(n).t("chat")),1)]),_:1},8,["to"])):(o(),i("div",U,"✓ "+s(a(n).t("trained"))+" ("+s(h(e.my_outcome))+")",1))],64))]))),128))])])),64))])}}},tt=N(W,[["__scopeId","data-v-0fa25205"]]);export{tt as default};

View File

@@ -1 +1 @@
import{_ as j,r as v,f as u,c as y,a as e,t as o,u as l,i as s,j as x,w as h,v as b,e as k,z as B,q as S,o as f}from"./index-B2m5OgR7.js";const z={class:"card"},D={style:{"margin-top":"0"}},E={class:"muted"},M=["value"],$={class:"row",style:{gap:"10px","margin-top":"16px"}},q=["disabled"],I={key:0,class:"spinner"},L={class:"card",style:{"margin-top":"16px"}},O={style:{"margin-top":"0"}},A={class:"row",style:{gap:"10px","margin-top":"16px"}},F=["disabled"],G={key:0,class:"spinner"},H={class:"card",style:{"margin-top":"16px"}},J={style:{"margin-top":"0"}},K={class:"row"},Q={key:0,class:"error",role:"alert"},R={key:1,class:"ok",role:"status"},W={__name:"Settings",setup(X){var V,C;const m=v(((V=u.user)==null?void 0:V.name)||""),c=v(((C=u.user)==null?void 0:C.email)||""),i=v(""),_=v(""),r=v(""),p=v(""),w=v(!1),g=v(!1);async function U(){var d,a;r.value="",p.value="",w.value=!0;try{const n={};if(m.value&&m.value!==((d=u.user)==null?void 0:d.name)&&(n.name=m.value),c.value&&c.value!==((a=u.user)==null?void 0:a.email)&&(n.email=c.value),Object.keys(n).length){const t=await S.updateProfile(n);u.user=t.user,p.value=s.t("saved")}}catch(n){r.value=n.message}finally{w.value=!1}}async function N(){var d,a,n;if(r.value="",p.value="",i.value.length<4){r.value=s.t("passwordTooShort");return}if(i.value!==_.value){r.value=s.t("passwordMismatch");return}g.value=!0;try{const t=((d=u.user)==null?void 0:d.username)||((a=u.user)==null?void 0:a.id)||"",T=await S.setup({username:t,email:c.value||((n=u.user)==null?void 0:n.email),password:i.value});u.user=T.user,i.value="",_.value="",p.value=s.t("saved")}catch(t){r.value=t.message}finally{g.value=!1}}function P(d){s.set(d)}return(d,a)=>{var n;return f(),y("div",null,[e("h2",null,"⚙️ "+o(l(s).t("settings")),1),e("div",z,[e("h3",D,"👤 "+o(l(s).t("profile")),1),e("label",null,[x(o(l(s).t("username"))+" ",1),e("span",E,"("+o(l(s).t("readonly"))+")",1)]),e("input",{value:((n=l(u).user)==null?void 0:n.username)||"",disabled:""},null,8,M),e("label",null,o(l(s).t("name")),1),h(e("input",{"onUpdate:modelValue":a[0]||(a[0]=t=>m.value=t),type:"text"},null,512),[[b,m.value]]),e("label",null,o(l(s).t("email")),1),h(e("input",{"onUpdate:modelValue":a[1]||(a[1]=t=>c.value=t),type:"email"},null,512),[[b,c.value]]),e("div",$,[e("button",{class:"primary",disabled:w.value,onClick:U},[w.value?(f(),y("span",I)):k("",!0),x(o(l(s).t("saveProfile")),1)],8,q)])]),e("div",L,[e("h3",O,"🔒 "+o(l(s).t("changePassword")),1),e("label",null,o(l(s).t("newPassword")),1),h(e("input",{"onUpdate:modelValue":a[2]||(a[2]=t=>i.value=t),type:"password",autocomplete:"new-password"},null,512),[[b,i.value]]),e("label",null,o(l(s).t("confirmPassword")),1),h(e("input",{"onUpdate:modelValue":a[3]||(a[3]=t=>_.value=t),type:"password",autocomplete:"new-password"},null,512),[[b,_.value]]),e("div",A,[e("button",{class:"primary",disabled:g.value||!i.value||i.value!==_.value,onClick:N},[g.value?(f(),y("span",G)):k("",!0),x(o(l(s).t("save")),1)],8,F)])]),e("div",H,[e("h3",J,"🌐 "+o(l(s).t("language")),1),e("div",K,[e("button",{class:B({active:l(s).locale==="th"}),onClick:a[4]||(a[4]=t=>P("th"))},"ไทย",2),e("button",{class:B({active:l(s).locale==="en"}),onClick:a[5]||(a[5]=t=>P("en"))},"English",2)])]),r.value?(f(),y("div",Q,o(r.value),1)):k("",!0),p.value?(f(),y("div",R,"✅ "+o(p.value),1)):k("",!0)])}}},Z=j(W,[["__scopeId","data-v-2dca72e5"]]);export{Z as default};
import{_ as j,r as v,f as u,c as y,a as e,t as o,u as l,i as s,j as x,w as h,v as b,e as k,z as B,q as S,o as f}from"./index-BhdfH8-z.js";const z={class:"card"},D={style:{"margin-top":"0"}},E={class:"muted"},M=["value"],$={class:"row",style:{gap:"10px","margin-top":"16px"}},q=["disabled"],I={key:0,class:"spinner"},L={class:"card",style:{"margin-top":"16px"}},O={style:{"margin-top":"0"}},A={class:"row",style:{gap:"10px","margin-top":"16px"}},F=["disabled"],G={key:0,class:"spinner"},H={class:"card",style:{"margin-top":"16px"}},J={style:{"margin-top":"0"}},K={class:"row"},Q={key:0,class:"error",role:"alert"},R={key:1,class:"ok",role:"status"},W={__name:"Settings",setup(X){var V,C;const m=v(((V=u.user)==null?void 0:V.name)||""),c=v(((C=u.user)==null?void 0:C.email)||""),i=v(""),_=v(""),r=v(""),p=v(""),w=v(!1),g=v(!1);async function U(){var d,a;r.value="",p.value="",w.value=!0;try{const n={};if(m.value&&m.value!==((d=u.user)==null?void 0:d.name)&&(n.name=m.value),c.value&&c.value!==((a=u.user)==null?void 0:a.email)&&(n.email=c.value),Object.keys(n).length){const t=await S.updateProfile(n);u.user=t.user,p.value=s.t("saved")}}catch(n){r.value=n.message}finally{w.value=!1}}async function N(){var d,a,n;if(r.value="",p.value="",i.value.length<4){r.value=s.t("passwordTooShort");return}if(i.value!==_.value){r.value=s.t("passwordMismatch");return}g.value=!0;try{const t=((d=u.user)==null?void 0:d.username)||((a=u.user)==null?void 0:a.id)||"",T=await S.setup({username:t,email:c.value||((n=u.user)==null?void 0:n.email),password:i.value});u.user=T.user,i.value="",_.value="",p.value=s.t("saved")}catch(t){r.value=t.message}finally{g.value=!1}}function P(d){s.set(d)}return(d,a)=>{var n;return f(),y("div",null,[e("h2",null,"⚙️ "+o(l(s).t("settings")),1),e("div",z,[e("h3",D,"👤 "+o(l(s).t("profile")),1),e("label",null,[x(o(l(s).t("username"))+" ",1),e("span",E,"("+o(l(s).t("readonly"))+")",1)]),e("input",{value:((n=l(u).user)==null?void 0:n.username)||"",disabled:""},null,8,M),e("label",null,o(l(s).t("name")),1),h(e("input",{"onUpdate:modelValue":a[0]||(a[0]=t=>m.value=t),type:"text"},null,512),[[b,m.value]]),e("label",null,o(l(s).t("email")),1),h(e("input",{"onUpdate:modelValue":a[1]||(a[1]=t=>c.value=t),type:"email"},null,512),[[b,c.value]]),e("div",$,[e("button",{class:"primary",disabled:w.value,onClick:U},[w.value?(f(),y("span",I)):k("",!0),x(o(l(s).t("saveProfile")),1)],8,q)])]),e("div",L,[e("h3",O,"🔒 "+o(l(s).t("changePassword")),1),e("label",null,o(l(s).t("newPassword")),1),h(e("input",{"onUpdate:modelValue":a[2]||(a[2]=t=>i.value=t),type:"password",autocomplete:"new-password"},null,512),[[b,i.value]]),e("label",null,o(l(s).t("confirmPassword")),1),h(e("input",{"onUpdate:modelValue":a[3]||(a[3]=t=>_.value=t),type:"password",autocomplete:"new-password"},null,512),[[b,_.value]]),e("div",A,[e("button",{class:"primary",disabled:g.value||!i.value||i.value!==_.value,onClick:N},[g.value?(f(),y("span",G)):k("",!0),x(o(l(s).t("save")),1)],8,F)])]),e("div",H,[e("h3",J,"🌐 "+o(l(s).t("language")),1),e("div",K,[e("button",{class:B({active:l(s).locale==="th"}),onClick:a[4]||(a[4]=t=>P("th"))},"ไทย",2),e("button",{class:B({active:l(s).locale==="en"}),onClick:a[5]||(a[5]=t=>P("en"))},"English",2)])]),r.value?(f(),y("div",Q,o(r.value),1)):k("",!0),p.value?(f(),y("div",R,"✅ "+o(p.value),1)):k("",!0)])}}},Z=j(W,[["__scopeId","data-v-2dca72e5"]]);export{Z as default};

View File

@@ -1 +1 @@
import{_ as x,c as v,a as e,t,u as s,i as a,j as S,f as _,w,v as f,b as y,e as V,r,g as K,o as m}from"./index-B2m5OgR7.js";const T={class:"setup-wrap"},B={class:"card setup-card"},N={class:"muted"},U={key:0,class:"error",role:"alert"},C=["disabled"],D={key:0,class:"spinner"},M={key:1},P={__name:"Setup",setup(j){const k=K(),i=r(""),l=r(""),p=r(""),o=r(""),d=r(!1);async function c(){if(o.value="",l.value.length<4){o.value=a.t("passwordTooShort");return}if(l.value!==p.value){o.value=a.t("passwordMismatch");return}d.value=!0;try{await _.finishSetup(i.value.trim(),l.value),k.push("/")}catch(h){o.value=h.message}finally{d.value=!1}}return(h,u)=>{var b,g;return m(),v("div",T,[e("div",B,[e("h1",null,"🔐 "+t(s(a).t("setupTitle")),1),e("p",N,[S(t(s(a).t("setupSubtitle"))+" ",1),e("strong",null,t(((b=s(_).user)==null?void 0:b.name)||((g=s(_).user)==null?void 0:g.username)),1)]),e("label",null,t(s(a).t("email")),1),w(e("input",{"onUpdate:modelValue":u[0]||(u[0]=n=>i.value=n),type:"email",autocomplete:"email",onKeyup:y(c,["enter"])},null,544),[[f,i.value]]),e("label",null,t(s(a).t("newPassword")),1),w(e("input",{"onUpdate:modelValue":u[1]||(u[1]=n=>l.value=n),type:"password",autocomplete:"new-password",onKeyup:y(c,["enter"])},null,544),[[f,l.value]]),e("label",null,t(s(a).t("confirmPassword")),1),w(e("input",{"onUpdate:modelValue":u[2]||(u[2]=n=>p.value=n),type:"password",autocomplete:"new-password",onKeyup:y(c,["enter"])},null,544),[[f,p.value]]),o.value?(m(),v("div",U,t(o.value),1)):V("",!0),e("button",{class:"primary",style:{width:"100%","margin-top":"16px"},disabled:d.value||!i.value||!l.value||l.value!==p.value,onClick:c},[d.value?(m(),v("span",D)):(m(),v("span",M,t(s(a).t("save")),1))],8,C)])])}}},I=x(P,[["__scopeId","data-v-f190e120"]]);export{I as default};
import{_ as x,c as v,a as e,t,u as s,i as a,j as S,f as _,w,v as f,b as y,e as V,r,g as K,o as m}from"./index-BhdfH8-z.js";const T={class:"setup-wrap"},B={class:"card setup-card"},N={class:"muted"},U={key:0,class:"error",role:"alert"},C=["disabled"],D={key:0,class:"spinner"},M={key:1},P={__name:"Setup",setup(j){const k=K(),i=r(""),l=r(""),p=r(""),o=r(""),d=r(!1);async function c(){if(o.value="",l.value.length<4){o.value=a.t("passwordTooShort");return}if(l.value!==p.value){o.value=a.t("passwordMismatch");return}d.value=!0;try{await _.finishSetup(i.value.trim(),l.value),k.push("/")}catch(h){o.value=h.message}finally{d.value=!1}}return(h,u)=>{var b,g;return m(),v("div",T,[e("div",B,[e("h1",null,"🔐 "+t(s(a).t("setupTitle")),1),e("p",N,[S(t(s(a).t("setupSubtitle"))+" ",1),e("strong",null,t(((b=s(_).user)==null?void 0:b.name)||((g=s(_).user)==null?void 0:g.username)),1)]),e("label",null,t(s(a).t("email")),1),w(e("input",{"onUpdate:modelValue":u[0]||(u[0]=n=>i.value=n),type:"email",autocomplete:"email",onKeyup:y(c,["enter"])},null,544),[[f,i.value]]),e("label",null,t(s(a).t("newPassword")),1),w(e("input",{"onUpdate:modelValue":u[1]||(u[1]=n=>l.value=n),type:"password",autocomplete:"new-password",onKeyup:y(c,["enter"])},null,544),[[f,l.value]]),e("label",null,t(s(a).t("confirmPassword")),1),w(e("input",{"onUpdate:modelValue":u[2]||(u[2]=n=>p.value=n),type:"password",autocomplete:"new-password",onKeyup:y(c,["enter"])},null,544),[[f,p.value]]),o.value?(m(),v("div",U,t(o.value),1)):V("",!0),e("button",{class:"primary",style:{width:"100%","margin-top":"16px"},disabled:d.value||!i.value||!l.value||l.value!==p.value,onClick:c},[d.value?(m(),v("span",D)):(m(),v("span",M,t(s(a).t("save")),1))],8,C)])])}}},I=x(P,[["__scopeId","data-v-f190e120"]]);export{I as default};

View File

@@ -1 +1 @@
import{_ as k,k as x,q as w,f as d,c as r,a as t,t as e,u as s,i as o,A as _,m,e as y,F as b,p as A,r as h,s as C,o as i,z as f}from"./index-B2m5OgR7.js";const B={class:"row",style:{"align-items":"center","margin-bottom":"16px"}},N={style:{margin:"0"}},P={style:{"margin-left":"auto"}},z={class:"primary"},T={class:"muted"},F={key:0,class:"card",style:{"min-height":"80px"}},L={key:1,class:"card empty-state"},S={key:0},V={key:1},$={class:"grid"},j={class:"card lift train-card"},q={class:"row",style:{"justify-content":"space-between"}},D={class:"muted",style:{margin:"6px 0 12px"}},E={class:"row",style:{gap:"8px"}},G={class:"muted"},I={class:"primary",style:{width:"100%","margin-top":"12px"}},M={__name:"Training",setup(H){const c=h([]),u=h(!0);function v(a){return a.sales_kit&&a.sales_kit.productName||a.input&&a.input.product||""}function g(a){return a.personas||a.persona_count||0}return x(async()=>{try{const a=(await w.listGroups()).groups||[];c.value=d.isAdmin?a:a.filter(l=>l.status==="ready")}finally{u.value=!1}}),(a,l)=>{const p=C("router-link");return i(),r("div",null,[t("div",B,[t("h2",N,"🎯 "+e(s(o).t("training")),1),t("div",P,[s(d).isAdmin?(i(),_(p,{key:0,to:"/admin/new-group"},{default:m(()=>[t("button",z," "+e(s(o).t("addProduct")),1)]),_:1})):y("",!0)])]),t("p",T,e(s(o).t("trainingSubtitle")),1),u.value?(i(),r("div",F,[...l[0]||(l[0]=[t("div",{class:"skeleton",style:{height:"50px"}},null,-1)])])):c.value.length===0?(i(),r("div",L,[t("strong",null,e(s(o).t("noTraining")),1),s(d).isAdmin?(i(),r("span",S,'Click "'+e(s(o).t("addProduct"))+'" to create a persona group.',1)):(i(),r("span",V,"Ask an admin to create a persona group first."))])):y("",!0),t("div",$,[(i(!0),r(b,null,A(c.value,n=>(i(),_(p,{key:n.id,to:s(d).isAdmin?`/admin/groups/${n.id}/edit`:`/groups/${n.id}/personas`,style:{"text-decoration":"none"}},{default:m(()=>[t("div",j,[t("div",q,[t("strong",null,e(n.title),1),t("span",{class:f(["badge",n.status==="ready"?"ready":"draft"])},e(n.status),3)]),t("div",D,e(v(n)),1),t("div",E,[t("span",{class:f(["badge",n.channel||"line"])},e(n.channel||"line"),3),t("span",G,e(g(n))+" "+e(s(o).t("personas").toLowerCase()),1)]),t("button",I,e(s(d).isAdmin?n.status==="ready"?s(o).t("managePersonas"):s(o).t("analyze"):s(o).t("selectPersona")),1)])]),_:2},1032,["to"]))),128))])])}}},K=k(M,[["__scopeId","data-v-901c9d3d"]]);export{K as default};
import{_ as k,k as x,q as w,f as d,c as r,a as t,t as e,u as s,i as o,A as _,m,e as y,F as b,p as A,r as h,s as C,o as i,z as f}from"./index-BhdfH8-z.js";const B={class:"row",style:{"align-items":"center","margin-bottom":"16px"}},N={style:{margin:"0"}},P={style:{"margin-left":"auto"}},z={class:"primary"},T={class:"muted"},F={key:0,class:"card",style:{"min-height":"80px"}},L={key:1,class:"card empty-state"},S={key:0},V={key:1},$={class:"grid"},j={class:"card lift train-card"},q={class:"row",style:{"justify-content":"space-between"}},D={class:"muted",style:{margin:"6px 0 12px"}},E={class:"row",style:{gap:"8px"}},G={class:"muted"},I={class:"primary",style:{width:"100%","margin-top":"12px"}},M={__name:"Training",setup(H){const c=h([]),u=h(!0);function v(a){return a.sales_kit&&a.sales_kit.productName||a.input&&a.input.product||""}function g(a){return a.personas||a.persona_count||0}return x(async()=>{try{const a=(await w.listGroups()).groups||[];c.value=d.isAdmin?a:a.filter(l=>l.status==="ready")}finally{u.value=!1}}),(a,l)=>{const p=C("router-link");return i(),r("div",null,[t("div",B,[t("h2",N,"🎯 "+e(s(o).t("training")),1),t("div",P,[s(d).isAdmin?(i(),_(p,{key:0,to:"/admin/new-group"},{default:m(()=>[t("button",z," "+e(s(o).t("addProduct")),1)]),_:1})):y("",!0)])]),t("p",T,e(s(o).t("trainingSubtitle")),1),u.value?(i(),r("div",F,[...l[0]||(l[0]=[t("div",{class:"skeleton",style:{height:"50px"}},null,-1)])])):c.value.length===0?(i(),r("div",L,[t("strong",null,e(s(o).t("noTraining")),1),s(d).isAdmin?(i(),r("span",S,'Click "'+e(s(o).t("addProduct"))+'" to create a persona group.',1)):(i(),r("span",V,"Ask an admin to create a persona group first."))])):y("",!0),t("div",$,[(i(!0),r(b,null,A(c.value,n=>(i(),_(p,{key:n.id,to:s(d).isAdmin?`/admin/groups/${n.id}/edit`:`/groups/${n.id}/personas`,style:{"text-decoration":"none"}},{default:m(()=>[t("div",j,[t("div",q,[t("strong",null,e(n.title),1),t("span",{class:f(["badge",n.status==="ready"?"ready":"draft"])},e(n.status),3)]),t("div",D,e(v(n)),1),t("div",E,[t("span",{class:f(["badge",n.channel||"line"])},e(n.channel||"line"),3),t("span",G,e(g(n))+" "+e(s(o).t("personas").toLowerCase()),1)]),t("button",I,e(s(d).isAdmin?n.status==="ready"?s(o).t("managePersonas"):s(o).t("analyze"):s(o).t("selectPersona")),1)])]),_:2},1032,["to"]))),128))])])}}},K=k(M,[["__scopeId","data-v-901c9d3d"]]);export{K as default};

File diff suppressed because one or more lines are too long