- Backend DELETE /api/groups/<gid> (admin, own-org enforced via _get_owned_group); cascades removal of the group's sessions. GroupStore.delete added. - Training.vue: each group card gets a trash (Trash2 line icon) delete button shown only to admins (auth.isAdmin); confirm dialog; @click.stop so it doesn't navigate. Card restructured so the delete button is not inside the clickable router-link. - test_user_journey: trainee cannot delete (403), admin deletes, group gone (404). All suites pass. Rebuilt dist.
7 lines
3.9 KiB
JavaScript
7 lines
3.9 KiB
JavaScript
import{c as b,_ as C,p as A,y as f,h as l,a as d,b as e,l as c,u as t,m,t as o,i,q as _,f as z,g as h,F as M,x as T,r as v,z as B,o as r,C as k,D as N}from"./index-CvsGOA4u.js";import{T as P}from"./target-BHq78myU.js";import{B as V}from"./book-open-BPDJkLfy.js";import{P as $}from"./plus-BSRzoT5b.js";/**
|
|
* @license lucide-vue-next v1.0.0 - ISC
|
|
*
|
|
* This source code is licensed under the ISC license.
|
|
* See the LICENSE file in the root directory of this source tree.
|
|
*/const j=b("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]),G={class:"row",style:{"align-items":"center","margin-bottom":"16px"}},L={style:{margin:"0"}},D={class:"row",style:{"margin-left":"auto",gap:"10px"}},F={class:"soft"},I={class:"primary"},S={class:"muted"},q={key:0,class:"card",style:{"min-height":"80px"}},E={key:1,class:"card empty-state"},H={key:0},O={key:1},J={class:"grid"},K={class:"row",style:{"justify-content":"space-between"}},Q={class:"row",style:{gap:"6px","align-items":"center"}},R=["onClick"],U={class:"muted",style:{margin:"6px 0 12px"}},W={class:"row",style:{gap:"8px"}},X={class:"muted"},Y={class:"primary",style:{width:"100%","margin-top":"12px"}},Z={__name:"Training",setup(tt){const u=v([]),y=v(!0);function g(s){return s.sales_kit&&s.sales_kit.productName||s.input&&s.input.product||""}function w(s){return s.personas||s.persona_count||0}async function x(s){if(confirm(`ลบกลุ่ม "${s.title}" และบุคคลต้นแบบทั้งหมด? (ติดลบถาวร)`))try{await f.deleteGroup(s.id),u.value=u.value.filter(n=>n.id!==s.id)}catch(n){alert(n.message)}}return A(async()=>{try{const s=(await f.listGroups()).groups||[];u.value=l.isAdmin?s:s.filter(n=>n.status==="ready")}finally{y.value=!1}}),(s,n)=>{const p=B("router-link");return r(),d("div",null,[e("div",G,[e("h2",L,[c(t(P),{size:22,"stroke-width":1.8,style:{"vertical-align":"-4px"}}),m(" "+o(t(i).t("training")),1)]),e("div",D,[c(p,{to:"/guide"},{default:_(()=>[e("button",F,[c(t(V),{size:18,"stroke-width":1.8}),n[0]||(n[0]=m(" คู่มือ",-1))])]),_:1}),t(l).isAdmin?(r(),z(p,{key:0,to:"/admin/new-group"},{default:_(()=>[e("button",I,[c(t($),{size:18,"stroke-width":2}),m(" "+o(t(i).t("addProduct")),1)])]),_:1})):h("",!0)])]),e("p",S,o(t(i).t("trainingSubtitle")),1),y.value?(r(),d("div",q,[...n[1]||(n[1]=[e("div",{class:"skeleton",style:{height:"50px"}},null,-1)])])):u.value.length===0?(r(),d("div",E,[e("strong",null,o(t(i).t("noTraining")),1),t(l).isAdmin?(r(),d("span",H,'Click "'+o(t(i).t("addProduct"))+'" to create a persona group.',1)):(r(),d("span",O,"Ask an admin to create a persona group first."))])):h("",!0),e("div",J,[(r(!0),d(M,null,T(u.value,a=>(r(),d("div",{key:a.id,class:"card lift train-card"},[e("div",K,[c(p,{to:t(l).isAdmin?`/admin/groups/${a.id}/edit`:`/groups/${a.id}/personas`,style:{"text-decoration":"none",color:"inherit","min-width":"0"}},{default:_(()=>[e("strong",null,o(a.title),1)]),_:2},1032,["to"]),e("div",Q,[e("span",{class:k(["badge",a.status==="ready"?"ready":"draft"])},o(a.status),3),t(l).isAdmin?(r(),d("button",{key:0,class:"del-btn",title:"ลบกลุ่มนี้ (ติดลบถาวร)",onClick:N(et=>x(a),["prevent","stop"])},[c(t(j),{size:16,"stroke-width":1.8})],8,R)):h("",!0)])]),c(p,{to:t(l).isAdmin?`/admin/groups/${a.id}/edit`:`/groups/${a.id}/personas`,style:{"text-decoration":"none",color:"inherit"}},{default:_(()=>[e("div",U,o(g(a)),1),e("div",W,[e("span",{class:k(["badge",a.channel||"line"])},o(a.channel||"line"),3),e("span",X,o(w(a))+" "+o(t(i).t("personas").toLowerCase()),1)]),e("button",Y,o(t(l).isAdmin?a.status==="ready"?t(i).t("managePersonas"):t(i).t("analyze"):t(i).t("selectPersona")),1)]),_:2},1032,["to"])]))),128))])])}}},it=C(Z,[["__scopeId","data-v-b1b30fec"]]);export{it as default};
|