Files
2026-07-08 08:03:57 +00:00

2 lines
26 KiB
JavaScript
Raw Permalink 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 ce}from"./DRkNpQ1P.js";import{e as se,B as O,c as d,a as e,t as s,y as X,C as J,F as I,r as Q,k as C,j as U,l as _,m,o as u,s as pe,g as ve,z as he,b as ee,d as Y,D as fe,h as xe,w as te}from"./CQHa_U7G.js";const ge={class:"bg-slate-800 rounded-xl border border-slate-700 p-5"},_e={class:"flex items-center justify-between mb-4"},me={class:"text-sm font-semibold text-white"},be={class:"text-xs text-slate-400 mt-0.5"},ye={value:"7"},we={value:"14"},ke={value:"30"},$e={value:"90"},Ce={key:0,class:"flex items-center justify-center py-12"},Me={key:1,class:"flex flex-col items-center justify-center py-12 text-center"},Be={class:"text-slate-500 text-xs"},je={key:2,class:"relative"},De=["viewBox"],Ue=["x1","y1","x2","y2"],ze=["x","y"],Te=["onMouseenter"],Ae=["x","y","width","height","fill","opacity"],Ve={key:0},Le=["x","y","width"],He=["x","y"],Fe=["x","y"],Se={class:"flex items-center justify-between mt-4 pt-3 border-t border-slate-700/50"},We={class:"flex items-center gap-4 text-xs"},Pe={class:"flex items-center gap-1.5"},Ee={class:"text-slate-400"},Ne={class:"text-slate-400"},Re={class:"text-white font-semibold ml-1"},Ie={class:"text-slate-400"},Ye={class:"text-white font-semibold ml-1"},Oe={key:0,class:"flex items-center gap-1 text-xs"},Xe={key:0,class:"w-3.5 h-3.5 text-emerald-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Qe={key:1,class:"w-3.5 h-3.5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},qe={class:"text-slate-500"},F=800,G=220,Ge=se({__name:"UserTrendChart",props:{data:{},loading:{type:Boolean}},setup(K){const S=K,$=_("30"),z=_(null),p={top:10,right:16,bottom:30,left:36},h=m(()=>{const o=parseInt($.value,10);if(!S.data||S.data.length===0)return[];const a=[...S.data].sort((r,c)=>new Date(r.date).getTime()-new Date(c.date).getTime()),n=new Date;return n.setDate(n.getDate()-o),a.filter(r=>new Date(r.date)>=n)}),b=m(()=>h.value.length===0?1:Math.max(...h.value.map(o=>o.count),1)),y=G-p.top-p.bottom,k=m(()=>{const o=[];for(let a=0;a<=4;a++)o.push(p.top+y/4*a);return o}),x=m(()=>{const o=[];for(let a=0;a<=4;a++){const n=p.top+y/4*a,r=Math.round(b.value-b.value/4*a);o.push({y:n,text:r.toString()})}return o}),g=m(()=>{const o=h.value.length;if(o===0)return 0;const a=F-p.left-p.right,n=32,r=a/o*.7;return Math.min(r,n)}),M=m(()=>{const o=h.value.length;if(o===0)return[];const a=F-p.left-p.right,n=o>1?(a-g.value*o)/(o-1):0;return h.value.map((r,c)=>{const v=p.left+c*(g.value+n),P=b.value>0?r.count/b.value*y:0,A=G-p.bottom-P,V=b.value>0?r.count/b.value:0;let L;V>.8?L="#6366f1":V>.5?L="#818cf8":V>.3?L="#a5b4fc":L="#c7d2fe";const q=`${r.count} ${T(r.date)}`,E=q.length*7+16;let H=v+g.value/2-E/2;H<p.left&&(H=p.left),H+E>F-p.right&&(H=F-p.right-E);const Z=A-4;return{x:v,y:A,height:P,color:L,tooltipX:H,tooltipY:Z,tooltipWidth:E,tooltipText:q}})}),B=m(()=>{const o=h.value.length;if(o===0)return[];const a=F-p.left-p.right,n=o>1?(a-g.value*o)/(o-1):0;let r=1;return o>14&&(r=2),o>30&&(r=5),o>60&&(r=10),h.value.map((c,v)=>{const P=p.left+v*(g.value+n),A=new Date(c.date),V=`${A.getMonth()+1}/${A.getDate()}`;return{x:P,label:V,idx:v}}).filter((c,v)=>v%r===0||v===o-1)}),j=m(()=>{if(h.value.length===0)return 0;const o=h.value.reduce((a,n)=>a+n.count,0);return Math.round(o/h.value.length)}),D=m(()=>h.value.reduce((o,a)=>o+a.count,0)),w=m(()=>{const o=h.value;if(o.length<4)return"stable";const a=Math.floor(o.length/2),n=o.slice(0,a).reduce((c,v)=>c+v.count,0)/a,r=o.slice(a).reduce((c,v)=>c+v.count,0)/(o.length-a);return r>n*1.05?"up":r<n*.95?"down":"stable"}),f=m(()=>{const o=h.value;if(o.length<4)return 0;const a=Math.floor(o.length/2),n=o.slice(0,a).reduce((c,v)=>c+v.count,0)/a;if(n===0)return 100;const r=o.slice(a).reduce((c,v)=>c+v.count,0)/(o.length-a);return Math.round(Math.abs((r-n)/n)*100)});function T(o){try{const a=new Date(o);return`${a.getMonth()+1}/${a.getDate()}`}catch{return o}}function W(){z.value=null}return O(()=>S.data,()=>{W()}),(o,a)=>(u(),d("div",ge,[e("div",_e,[e("div",null,[e("h3",me,s(o.$t("users.trend_title")),1),e("p",be,s(o.$t("users.trend_subtitle")),1)]),X(e("select",{"onUpdate:modelValue":a[0]||(a[0]=n=>$.value=n),class:"px-2.5 py-1.5 text-xs bg-slate-700 border border-slate-600 rounded-lg text-slate-300 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 transition",onChange:W},[e("option",ye,s(o.$t("users.trend_7d")),1),e("option",we,s(o.$t("users.trend_14d")),1),e("option",ke,s(o.$t("users.trend_30d")),1),e("option",$e,s(o.$t("users.trend_90d")),1)],544),[[J,$.value]])]),K.loading?(u(),d("div",Ce,[...a[2]||(a[2]=[e("svg",{class:"w-6 h-6 text-indigo-400 animate-spin",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)])])):h.value.length===0?(u(),d("div",Me,[a[3]||(a[3]=e("svg",{class:"w-10 h-10 text-slate-600 mb-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"})],-1)),e("p",Be,s(o.$t("users.trend_no_data")),1)])):(u(),d("div",je,[(u(),d("svg",{viewBox:`0 0 ${F} ${G}`,class:"w-full h-auto overflow-visible",preserveAspectRatio:"xMidYMid meet"},[(u(!0),d(I,null,Q(k.value,(n,r)=>(u(),d("line",{key:"grid-"+r,x1:p.left,y1:n,x2:F-p.right,y2:n,stroke:"currentColor",class:"text-slate-700/50","stroke-width":"1","stroke-dasharray":"4,4"},null,8,Ue))),128)),(u(!0),d(I,null,Q(x.value,(n,r)=>(u(),d("text",{key:"ylabel-"+r,x:p.left-8,y:n.y+4,"text-anchor":"end",class:"fill-slate-500","font-size":"10"},s(n.text),9,ze))),128)),(u(!0),d(I,null,Q(M.value,(n,r)=>(u(),d("g",{key:"bar-"+r,class:"chart-bar-group",onMouseenter:c=>z.value=r,onMouseleave:a[1]||(a[1]=c=>z.value=null)},[e("rect",{x:n.x,y:n.y,width:g.value,height:n.height,rx:3,ry:3,fill:n.color,opacity:z.value===r?.9:.7,class:"transition-all duration-200 cursor-pointer"},null,8,Ae),z.value===r?(u(),d("g",Ve,[e("rect",{x:n.tooltipX,y:n.tooltipY-28,width:n.tooltipWidth,height:"22",rx:"4",fill:"#1e293b",stroke:"#475569","stroke-width":"1"},null,8,Le),e("text",{x:n.tooltipX+n.tooltipWidth/2,y:n.tooltipY-13,"text-anchor":"middle",fill:"#e2e8f0","font-size":"11","font-weight":"600"},s(n.tooltipText),9,He)])):U("",!0)],40,Te))),128)),(u(!0),d(I,null,Q(B.value,(n,r)=>(u(),d("text",{key:"xlabel-"+r,x:n.x+g.value/2,y:G-p.bottom+16,"text-anchor":"middle",class:"fill-slate-500","font-size":"9"},s(n.label),9,Fe))),128))],8,De)),e("div",Se,[e("div",We,[e("div",Pe,[a[4]||(a[4]=e("span",{class:"w-2.5 h-2.5 rounded-sm bg-indigo-500/70"},null,-1)),e("span",Ee,s(o.$t("users.trend_daily")),1)]),e("div",null,[e("span",Ne,s(o.$t("users.trend_avg"))+":",1),e("span",Re,s(j.value),1)]),e("div",null,[e("span",Ie,s(o.$t("users.trend_total"))+":",1),e("span",Ye,s(D.value),1)])]),w.value!=="stable"?(u(),d("div",Oe,[w.value==="up"?(u(),d("svg",Xe,[...a[5]||(a[5]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"},null,-1)])])):(u(),d("svg",Qe,[...a[6]||(a[6]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 17h8m0 0V9m0 8l-8-8-4 4-6-6"},null,-1)])])),e("span",{class:C([w.value==="up"?"text-emerald-400":"text-red-400","font-medium"])},s(f.value)+"% ",3),e("span",qe,s(o.$t("users.trend_vs_prev")),1)])):U("",!0)])]))]))}}),Je={class:"mb-8"},Ke={class:"text-2xl font-bold text-white"},Ze={class:"text-slate-400 mt-1"},et={class:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 mb-6"},tt={class:"relative flex-1 max-w-md"},st=["placeholder"],ot={class:"flex items-center gap-2 flex-wrap"},lt={value:"all"},at={value:"active"},nt={value:"inactive"},rt={value:"deleted"},it={value:"banned"},dt={value:"all"},ut={value:"user"},ct={value:"admin"},pt={value:"staff"},vt={value:"superadmin"},ht={value:"all"},ft={value:"FREE"},xt={value:"PREMIUM"},gt={value:"ENTERPRISE"},_t={key:0,class:"flex items-center justify-center py-20"},mt={class:"flex flex-col items-center gap-3"},bt={class:"text-slate-400 text-sm"},yt={key:1,class:"flex flex-col items-center justify-center py-20 text-center"},wt={class:"text-red-400 text-sm mb-2"},kt={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-4 mb-8"},$t={class:"bg-slate-800 rounded-xl border border-slate-700 p-4"},Ct={class:"flex items-center gap-3"},Mt={class:"text-xs text-slate-400 uppercase tracking-wider"},Bt={class:"text-2xl font-bold text-white"},jt={class:"bg-slate-800 rounded-xl border border-slate-700 p-4"},Dt={class:"flex items-center gap-3"},Ut={class:"text-xs text-slate-400 uppercase tracking-wider"},zt={class:"text-2xl font-bold text-emerald-400"},Tt={class:"bg-slate-800 rounded-xl border border-slate-700 p-4"},At={class:"flex items-center gap-3"},Vt={class:"text-xs text-slate-400 uppercase tracking-wider"},Lt={class:"text-2xl font-bold text-red-400"},Ht={class:"bg-slate-800 rounded-xl border border-slate-700 p-4"},Ft={class:"flex items-center gap-3"},St={class:"text-xs text-slate-400 uppercase tracking-wider"},Wt={class:"text-2xl font-bold text-amber-400"},Pt={class:"bg-slate-800 rounded-xl border border-slate-700 p-4"},Et={class:"flex items-center gap-3"},Nt={class:"text-xs text-slate-400 uppercase tracking-wider"},Rt={class:"text-2xl font-bold text-cyan-400"},It={class:"mb-8"},Yt={key:0,class:"mb-4 text-xs text-slate-500"},Ot={class:"text-slate-300 font-semibold"},Xt={key:1,class:"mb-4 px-4 py-3 bg-indigo-900/30 border border-indigo-700/50 rounded-xl flex items-center justify-between"},Qt={class:"text-sm text-indigo-300"},qt={class:"flex items-center gap-2"},Gt={class:"bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden"},Jt={class:"overflow-x-auto"},Kt={class:"w-full text-sm"},Zt={class:"border-b border-slate-700 bg-slate-800/80"},es={class:"text-left py-3.5 px-4 w-10"},ts=["checked"],ss={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},os={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},ls={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},as={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},ns={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},rs={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},is={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},ds={class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},us={class:"py-3.5 px-4"},cs=["checked","onChange"],ps={class:"py-3.5 px-4 text-slate-400 font-mono text-xs"},vs={class:"py-3.5 px-4"},hs={class:"py-3.5 px-4"},fs={class:"text-slate-300"},xs={class:"py-3.5 px-4"},gs={class:"py-3.5 px-4"},_s={class:"py-3.5 px-4"},ms={class:"py-3.5 px-4 text-slate-300 text-xs"},bs={class:"py-3.5 px-4"},ys={class:"text-slate-400 text-xs uppercase"},ws={class:"py-3.5 px-4"},ks={class:"flex items-center gap-2"},$s=["onClick"],Cs={key:0,class:"flex flex-col items-center justify-center py-16 text-center"},Ms={class:"text-slate-400 text-sm"},Bs={key:2,class:"flex items-center justify-between mt-6"},js={class:"text-xs text-slate-500"},Ds={class:"flex items-center gap-2"},Us=["disabled"],zs=["disabled"],Vs=se({__name:"index",setup(K){const S=fe(),$=pe(),z=m(()=>$.isAdmin?!0:!!$.user?.system_capabilities?.["users:view"]),p=m(()=>$.isAdmin?!0:!!$.user?.system_capabilities?.["users:edit"]);!z.value&&!$.isAdmin&&S.push("/");const h=_(!0),b=_(null),y=_([]),k=_(0),x=_(0),g=_(50),M=_(""),B=_("all"),j=_("all"),D=_("all"),w=_({total_users:0,active_users:0,deleted_users:0,banned_users:0,new_users_today:0,new_users_this_week:0,new_users_this_month:0,users_by_role:{},users_by_plan:{},users_by_language:{},users_with_person:0,users_without_person:0,registration_trend:[],active_organizations_count:0,total_memberships:0}),f=_([]),T=_(null);let W=null;function o(){W&&clearTimeout(W),W=setTimeout(()=>{x.value=0,c()},400)}O(M,()=>{o()}),O(B,()=>{x.value=0,c()}),O(j,()=>{x.value=0,c()}),O(D,()=>{x.value=0,c()});const a=m(()=>M.value!==""||B.value!=="all"||j.value!=="all"||D.value!=="all"),n=m(()=>y.value.length>0&&f.value.length===y.value.length);function r(){const l=xe("access_token").value;return l?{Authorization:`Bearer ${l}`}:{}}async function c(){h.value=!0,b.value=null;try{const t={skip:x.value,limit:g.value};if(M.value&&(t.search_term=M.value),B.value!=="all")switch(B.value){case"active":t.is_active=!0;break;case"inactive":t.is_active=!1;break;case"deleted":t.is_deleted=!0;break;case"banned":t.is_active=!1;break}j.value!=="all"&&(t.role=j.value),D.value!=="all"&&(t.plan_filter=D.value);const l=await $fetch("/api/v1/admin/users",{params:t,headers:r()});y.value=l.users,k.value=l.total}catch(t){console.error("[Users] Failed to fetch users:",t),b.value=t?.data?.detail||t?.message||"Failed to load users"}finally{h.value=!1}}async function v(){try{const t=await $fetch("/api/v1/admin/users/stats",{headers:r()});w.value=t}catch(t){console.error("[Users] Failed to fetch stats:",t)}}function P(){x.value+g.value<k.value&&(x.value+=g.value,c())}function A(){x.value>0&&(x.value=Math.max(0,x.value-g.value),c())}function V(){n.value?f.value=[]:f.value=y.value.map(t=>t.id)}function L(t){const l=f.value.indexOf(t);l===-1?f.value.push(t):f.value.splice(l,1)}function q(){f.value=[]}async function E(){if(f.value.length!==0)try{await $fetch("/api/v1/admin/users/bulk-action",{method:"POST",headers:{...r(),"Content-Type":"application/json"},body:{user_ids:f.value,action:"activate"}}),N("success",`${f.value.length} user(s) activated successfully`),f.value=[],await c(),await v()}catch(t){console.error("[Users] Bulk activate failed:",t),N("error",t?.data?.detail||t?.message||"Bulk activate failed")}}async function H(){if(f.value.length!==0)try{await $fetch("/api/v1/admin/users/bulk-action",{method:"POST",headers:{...r(),"Content-Type":"application/json"},body:{user_ids:f.value,action:"deactivate"}}),N("success",`${f.value.length} user(s) deactivated successfully`),f.value=[],await c(),await v()}catch(t){console.error("[Users] Bulk deactivate failed:",t),N("error",t?.data?.detail||t?.message||"Bulk deactivate failed")}}async function Z(t){const l=!t.is_active;try{await $fetch(`/api/v1/admin/users/${t.id}`,{method:"PATCH",headers:{...r(),"Content-Type":"application/json"},body:{is_active:l}}),N("success",`User "${t.email}" ${l?"activated":"deactivated"} successfully`),await c(),await v()}catch(R){console.error("[Users] Toggle status failed:",R),N("error",R?.data?.detail||R?.message||"Failed to toggle user status")}}function oe(t){const l=t.toLowerCase();return l==="superadmin"?"bg-purple-500/20 text-purple-300":l==="admin"?"bg-indigo-500/20 text-indigo-300":l==="staff"?"bg-cyan-500/20 text-cyan-300":"bg-slate-500/20 text-slate-300"}function le(t){const l=t.toLowerCase();return l==="superadmin"?"Superadmin":l==="admin"?"Admin":l==="staff"?"Staff":"User"}function ae(t){return t.is_deleted?"bg-red-500/10 text-red-400":t.is_active?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"}function ne(t){return t.is_deleted?"bg-red-400":t.is_active?"bg-emerald-400":"bg-amber-400"}function re(t){return t.is_deleted?"Deleted":t.is_active?"Active":"Inactive"}function ie(t){const l=(t||"").toLowerCase();return l.includes("enterprise")||l.includes("vip")?"bg-purple-500/20 text-purple-300":l.includes("premium")||l.includes("pro")?"bg-amber-500/20 text-amber-300":"bg-slate-500/20 text-slate-300"}function de(t){if(!t)return"—";try{return new Date(t).toLocaleDateString("hu-HU",{year:"numeric",month:"short",day:"numeric"})}catch{return t}}function N(t,l){T.value={type:t,message:l},setTimeout(()=>{T.value=null},4e3)}return ve(()=>{c(),v()}),(t,l)=>{const R=ce;return u(),d("div",null,[e("div",Je,[e("h1",Ke,s(t.$t("users.title")),1),e("p",Ze,s(t.$t("users.subtitle")),1)]),e("div",et,[e("div",tt,[l[4]||(l[4]=e("svg",{class:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1)),X(e("input",{"onUpdate:modelValue":l[0]||(l[0]=i=>M.value=i),type:"text",placeholder:t.$t("common.search_placeholder"),class:"w-full pl-10 pr-4 py-2.5 bg-slate-800 border border-slate-700 rounded-lg text-sm text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 focus:border-indigo-500 transition"},null,8,st),[[he,M.value]])]),e("div",ot,[X(e("select",{"onUpdate:modelValue":l[1]||(l[1]=i=>B.value=i),class:"px-3 py-2.5 bg-slate-800 border border-slate-700 rounded-lg text-sm text-slate-300 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 transition"},[e("option",lt,s(t.$t("users.all_statuses")),1),e("option",at,s(t.$t("users.status_active")),1),e("option",nt,s(t.$t("users.status_inactive")),1),e("option",rt,s(t.$t("users.status_deleted")),1),e("option",it,s(t.$t("users.status_banned")),1)],512),[[J,B.value]]),X(e("select",{"onUpdate:modelValue":l[2]||(l[2]=i=>j.value=i),class:"px-3 py-2.5 bg-slate-800 border border-slate-700 rounded-lg text-sm text-slate-300 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 transition"},[e("option",dt,s(t.$t("users.all_roles")),1),e("option",ut,s(t.$t("users.role_user")),1),e("option",ct,s(t.$t("users.role_admin")),1),e("option",pt,s(t.$t("users.role_staff")),1),e("option",vt,s(t.$t("users.role_superadmin")),1)],512),[[J,j.value]]),X(e("select",{"onUpdate:modelValue":l[3]||(l[3]=i=>D.value=i),class:"px-3 py-2.5 bg-slate-800 border border-slate-700 rounded-lg text-sm text-slate-300 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 transition"},[e("option",ht,s(t.$t("users.all_plans")),1),e("option",ft,s(t.$t("users.plan_free")),1),e("option",xt,s(t.$t("users.plan_premium")),1),e("option",gt,s(t.$t("users.plan_enterprise")),1)],512),[[J,D.value]])])]),h.value?(u(),d("div",_t,[e("div",mt,[l[5]||(l[5]=e("svg",{class:"w-8 h-8 text-indigo-400 animate-spin",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)),e("p",bt,s(t.$t("common.loading")),1)])])):b.value?(u(),d("div",yt,[l[6]||(l[6]=e("svg",{class:"w-12 h-12 text-red-500 mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"})],-1)),e("p",wt,s(b.value),1),e("button",{onClick:c,class:"px-4 py-2 text-sm bg-indigo-600/20 text-indigo-300 hover:bg-indigo-600/30 rounded-lg transition"},s(t.$t("common.retry")),1)])):(u(),d(I,{key:2},[e("div",kt,[e("div",$t,[e("div",Ct,[l[7]||(l[7]=e("div",{class:"p-2 rounded-lg bg-indigo-500/10 text-indigo-400"},[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"})])],-1)),e("div",null,[e("p",Mt,s(t.$t("users.total_users")),1),e("p",Bt,s(w.value.total_users),1)])])]),e("div",jt,[e("div",Dt,[l[8]||(l[8]=e("div",{class:"p-2 rounded-lg bg-emerald-500/10 text-emerald-400"},[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1)),e("div",null,[e("p",Ut,s(t.$t("users.active_users")),1),e("p",zt,s(w.value.active_users),1)])])]),e("div",Tt,[e("div",At,[l[9]||(l[9]=e("div",{class:"p-2 rounded-lg bg-red-500/10 text-red-400"},[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})])],-1)),e("div",null,[e("p",Vt,s(t.$t("users.deleted_users")),1),e("p",Lt,s(w.value.deleted_users),1)])])]),e("div",Ht,[e("div",Ft,[l[10]||(l[10]=e("div",{class:"p-2 rounded-lg bg-amber-500/10 text-amber-400"},[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"})])],-1)),e("div",null,[e("p",St,s(t.$t("users.banned_users")),1),e("p",Wt,s(w.value.banned_users),1)])])]),e("div",Pt,[e("div",Et,[l[11]||(l[11]=e("div",{class:"p-2 rounded-lg bg-cyan-500/10 text-cyan-400"},[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1)),e("div",null,[e("p",Nt,s(t.$t("users.new_today")),1),e("p",Rt,s(w.value.new_users_today),1)])])])]),e("div",It,[ee(Ge,{data:w.value.registration_trend,loading:h.value},null,8,["data","loading"])]),a.value?(u(),d("div",Yt,[Y(s(t.$t("users.filtered_results"))+": ",1),e("span",Ot,s(y.value.length),1),Y(" / "+s(k.value)+" db ",1)])):U("",!0),f.value.length>0&&p.value?(u(),d("div",Xt,[e("p",Qt,s(t.$t("users.selected_count",{count:f.value.length})),1),e("div",qt,[e("button",{onClick:E,class:"px-3 py-1.5 text-xs font-medium bg-emerald-600/20 text-emerald-300 hover:bg-emerald-600/30 rounded-lg transition"},s(t.$t("users.bulk_activate")),1),e("button",{onClick:H,class:"px-3 py-1.5 text-xs font-medium bg-red-600/20 text-red-300 hover:bg-red-600/30 rounded-lg transition"},s(t.$t("users.bulk_deactivate")),1),e("button",{onClick:q,class:"px-3 py-1.5 text-xs font-medium bg-slate-600/20 text-slate-300 hover:bg-slate-600/30 rounded-lg transition"},s(t.$t("users.clear_selection")),1)])])):U("",!0),e("div",Gt,[e("div",Jt,[e("table",Kt,[e("thead",null,[e("tr",Zt,[e("th",es,[e("input",{type:"checkbox",checked:n.value,onChange:V,class:"rounded border-slate-600 bg-slate-700 text-indigo-600 focus:ring-indigo-500/50"},null,40,ts)]),l[12]||(l[12]=e("th",{class:"text-left py-3.5 px-4 text-xs font-semibold uppercase tracking-wider text-slate-400"},"ID",-1)),e("th",ss,s(t.$t("common.email")),1),e("th",os,s(t.$t("common.name")),1),e("th",ls,s(t.$t("users.role")),1),e("th",as,s(t.$t("common.status")),1),e("th",ns,s(t.$t("users.package")),1),e("th",rs,s(t.$t("users.registration")),1),e("th",is,s(t.$t("users.language")),1),e("th",ds,s(t.$t("common.actions")),1)])]),e("tbody",null,[(u(!0),d(I,null,Q(y.value,i=>(u(),d("tr",{key:i.id,class:"border-b border-slate-700/50 hover:bg-slate-700/30 transition"},[e("td",us,[e("input",{type:"checkbox",checked:f.value.includes(i.id),onChange:ue=>L(i.id),class:"rounded border-slate-600 bg-slate-700 text-indigo-600 focus:ring-indigo-500/50"},null,40,cs)]),e("td",ps,s(i.id),1),e("td",vs,[ee(R,{to:"/users/"+i.id,class:"text-sm font-medium text-white hover:underline cursor-pointer hover:text-indigo-400 transition-colors"},{default:te(()=>[Y(s(i.email),1)]),_:2},1032,["to"])]),e("td",hs,[e("span",fs,s(i.person_name||"—"),1)]),e("td",xs,[e("span",{class:C(["inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",oe(i.role)])},s(le(i.role)),3)]),e("td",gs,[e("span",{class:C(["inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",ae(i)])},[e("span",{class:C(["w-1.5 h-1.5 rounded-full mr-1.5",ne(i)])},null,2),Y(" "+s(re(i)),1)],2)]),e("td",_s,[e("span",{class:C(["px-2.5 py-0.5 rounded-full text-xs font-medium",ie(i.subscription_plan)])},s(i.subscription_plan||"—"),3)]),e("td",ms,s(de(i.created_at)),1),e("td",bs,[e("span",ys,s(i.preferred_language||"—"),1)]),e("td",ws,[e("div",ks,[ee(R,{to:"/users/"+i.id,class:"px-3 py-1.5 text-xs font-medium bg-slate-600/20 text-slate-300 hover:bg-slate-600/30 rounded-lg transition"},{default:te(()=>[Y(s(t.$t("common.view")),1)]),_:1},8,["to"]),!i.is_deleted&&p.value?(u(),d("button",{key:0,onClick:ue=>Z(i),class:C(["px-3 py-1.5 text-xs font-medium rounded-lg transition",i.is_active?"bg-red-500/10 text-red-300 hover:bg-red-500/20":"bg-emerald-500/10 text-emerald-300 hover:bg-emerald-500/20"])},s(i.is_active?t.$t("common.deactivate"):t.$t("common.activate")),11,$s)):U("",!0)])])]))),128))])])]),y.value.length===0&&!h.value?(u(),d("div",Cs,[l[13]||(l[13]=e("svg",{class:"w-12 h-12 text-slate-600 mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"})],-1)),e("p",Ms,s(t.$t("common.no_results")),1)])):U("",!0)]),k.value>g.value?(u(),d("div",Bs,[e("p",js,s(t.$t("users.showing"))+" "+s(x.value+1)+""+s(Math.min(x.value+g.value,k.value))+" / "+s(k.value),1),e("div",Ds,[e("button",{onClick:A,disabled:x.value===0,class:C(["px-3 py-1.5 text-xs font-medium rounded-lg transition disabled:opacity-30 disabled:cursor-not-allowed",x.value>0?"bg-slate-700 text-slate-300 hover:bg-slate-600":"bg-slate-800 text-slate-600"])},s(t.$t("common.prev")),11,Us),e("button",{onClick:P,disabled:x.value+g.value>=k.value,class:C(["px-3 py-1.5 text-xs font-medium rounded-lg transition disabled:opacity-30 disabled:cursor-not-allowed",x.value+g.value<k.value?"bg-slate-700 text-slate-300 hover:bg-slate-600":"bg-slate-800 text-slate-600"])},s(t.$t("common.next")),11,zs)])])):U("",!0)],64)),T.value?(u(),d("div",{key:3,class:C(["fixed bottom-6 right-6 px-5 py-3 rounded-xl shadow-xl text-sm font-medium z-50",T.value.type==="success"?"bg-emerald-600 text-white":"bg-red-600 text-white"])},s(T.value.message),3)):U("",!0)])}}});export{Vs as default};