1import{_ as H}from"./CgtJtmt7.js";import{_ as I}from"./Dk53qDSH.js";import{_ as V}from"./CRmIUlhp.js";import{B as O,b as W,c as G,j as Z,D as m,k as A,G as q,d as l,e as t,l as p,f as g,t as o,m as M,F as C,r as S,p as L,O as K,o as a,K as B,n as N,g as P}from"#entry";import{C as J,a as Q,L as X,P as Y,b as tt,B as et,p as st,c as at,d as ot,i as lt,e as rt,f as nt}from"./BtWwN_di.js";const it={class:"container mx-auto px-4 py-8 max-w-[1400px]"},dt={key:0,class:"text-center py-12"},ct={key:1,class:"bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-lg mb-6"},ut={key:2,class:"grid grid-cols-1 md:grid-cols-3 gap-6 mb-8"},pt={class:"bg-white border border-gray-200 rounded-lg p-6"},mt={class:"text-3xl font-bold text-gray-900"},gt={class:"bg-white border border-gray-200 rounded-lg p-6"},xt={class:"text-3xl font-bold text-green-600"},yt={class:"text-xs text-gray-500 mt-1"},bt={class:"bg-white border border-gray-200 rounded-lg p-6"},vt={class:"text-3xl font-bold text-blue-600"},ht={class:"text-xs text-gray-500 mt-1"},_t={key:3,class:"space-y-8"},ft={class:"bg-white border border-gray-200 rounded-lg p-6"},kt={class:"h-80"},wt={class:"bg-white border border-gray-200 rounded-lg p-6"},Ct={class:"h-80"},St={class:"bg-white border border-gray-200 rounded-lg p-6"},Lt={class:"overflow-x-auto"},Ut={class:"w-full text-sm"},Dt={class:"py-3 px-4 font-medium"},At={class:"text-right py-3 px-4"},Bt={class:"text-right py-3 px-4 text-blue-600"},Nt={class:"text-right py-3 px-4 text-green-600"},Pt={class:"text-right py-3 px-4 font-semibold"},$t={class:"bg-white border border-gray-200 rounded-lg p-6"},Mt={key:0,class:"text-center py-8"},Ft={key:1,class:"bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-lg mb-4"},Rt={key:2,class:"overflow-x-auto"},zt={class:"w-full text-sm"},Et={class:"py-3 px-4"},Tt={class:"flex items-center gap-3"},jt=["src","alt"],Ht={key:1,class:"w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center text-gray-600 text-xs font-medium"},It={class:"text-gray-900 font-medium"},Vt={class:"py-3 px-4 text-gray-700"},Ot={class:"py-3 px-4"},Wt={class:"py-3 px-4"},Gt={key:0,class:"flex items-center gap-1"},Zt={key:1,class:"text-gray-400 text-xs"},qt={class:"py-3 px-4 text-gray-600"},Kt={class:"py-3 px-4 text-gray-600"},Jt={class:"py-3 px-4 text-center"},Qt={key:0,class:"text-purple-600 font-medium"},Xt={key:1,class:"text-gray-300"},Yt={key:3,class:"mt-6 flex items-center justify-between"},te={class:"text-sm text-gray-600"},ee={class:"flex gap-2"},se={class:"flex items-center gap-1"},de=O({__name:"users",setup(ae){J.register(Q,X,Y,tt,et,st,at,ot,lt),W(),G({robots:"noindex, nofollow"});const v=Z(),r=m(null),x=m(!1),h=m(""),U=m([]),y=m(!1),_=m(""),n=m(null),F=A(()=>r.value?{labels:r.value.monthlyData.map(e=>D(e.month)),datasets:[{label:"Free Users",data:r.value.monthlyData.map(e=>e.free),backgroundColor:"rgba(59, 130, 246, 0.8)",borderColor:"rgba(59, 130, 246, 1)",borderWidth:1},{label:"Paid Users",data:r.value.monthlyData.map(e=>e.paid),backgroundColor:"rgba(34, 197, 94, 0.8)",borderColor:"rgba(34, 197, 94, 1)",borderWidth:1}]}:{labels:[],datasets:[]}),R={responsive:!0,maintainAspectRatio:!1,scales:{x:{stacked:!0,grid:{display:!1}},y:{stacked:!0,beginAtZero:!0,ticks:{precision:0}}},plugins:{legend:{position:"top"},tooltip:{mode:"index",intersect:!1}}},z=A(()=>r.value?{labels:r.value.monthlyData.map(e=>D(e.month)),datasets:[{label:"Total Users",data:r.value.monthlyData.map(e=>e.cumulative),borderColor:"rgba(99, 102, 241, 1)",backgroundColor:"rgba(99, 102, 241, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:3,pointHoverRadius:5}]}:{labels:[],datasets:[]}),E={responsive:!0,maintainAspectRatio:!1,scales:{x:{grid:{display:!1}},y:{beginAtZero:!0,ticks:{precision:0}}},plugins:{legend:{position:"top"},tooltip:{mode:"index",intersect:!1}}},D=i=>{const[e,d]=i.split("-");return new Date(parseInt(e),parseInt(d)-1).toLocaleDateString("en-US",{month:"short",year:"numeric"})},$=i=>new Date(i).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}),T=A(()=>{if(!n.value)return[];const{page:i,totalPages:e}=n.value,d=[];d.push(1);const b=Math.max(2,i-2),k=Math.min(e-1,i+2);b>2&&d.push(-1);for(let u=b;u<=k;u++)d.push(u);return k<e-1&&d.push(-2),e>1&&d.push(e),d.filter(u=>u>0)}),j=async()=>{x.value=!0,h.value="";try{const i=await $fetch("/api/admin/user-stats",{headers:v.token?{Authorization:`Bearer ${v.token}`}:void 0});r.value=i}catch(i){h.value=i.data?.message||i.message||"Failed to load user statistics"}finally{x.value=!1}},f=async(i=1)=>{y.value=!0,_.value="";try{const e=await $fetch("/api/admin/users",{query:{page:i,limit:20},headers:v.token?{Authorization:`Bearer ${v.token}`}:void 0});U.value=e.users,n.value=e.pagination}catch(e){_.value=e.data?.message||e.message||"Failed to load users"}finally{y.value=!1}};return q(()=>{j(),f()}),(i,e)=>{const d=H,b=I,k=V,u=K;return a(),l("div",it,[e[13]||(e[13]=t("div",{class:"mb-6"},[t("h1",{class:"text-3xl font-bold mb-2"},"User Statistics (Admin)"),t("p",{class:"text-gray-600"},"Track user registrations and growth over time")],-1)),x.value?(a(),l("div",dt,[g(d)])):p("",!0),h.value?(a(),l("div",ct,o(h.value),1)):p("",!0),!x.value&&r.value?(a(),l("div",ut,[t("div",pt,[e[2]||(e[2]=t("div",{class:"text-sm font-medium text-gray-600 mb-1"},"Total Users",-1)),t("div",mt,o(r.value.totalStats.total.toLocaleStr
1ing()),1)]),t("div",gt,[e[3]||(e[3]=t("div",{class:"text-sm font-medium text-gray-600 mb-1"},"Paid Users",-1)),t("div",xt,o(r.value.totalStats.paid.toLocaleString()),1),t("div",yt,o((r.value.totalStats.paid/r.value.totalStats.total*100).toFixed(1))+"% conversion ",1)]),t("div",bt,[e[4]||(e[4]=t("div",{class:"text-sm font-medium text-gray-600 mb-1"},"Free Users",-1)),t("div",vt,o(r.value.totalStats.free.toLocaleString()),1),t("div",ht,o((r.value.totalStats.free/r.value.totalStats.total*100).toFixed(1))+"% of total ",1)])])):p("",!0),!x.value&&r.value?(a(),l("div",_t,[t("div",ft,[e[5]||(e[5]=t("h2",{class:"text-xl font-semibold mb-4"},"Monthly New Registrations",-1)),t("div",kt,[g(M(rt),{data:F.value,options:R},null,8,["data"])])]),t("div",wt,[e[6]||(e[6]=t("h2",{class:"text-xl font-semibold mb-4"},"Cumulative User Growth",-1)),t("div",Ct,[g(M(nt),{data:z.value,options:E},null,8,["data"])])]),t("div",St,[e[8]||(e[8]=t("h2",{class:"text-xl font-semibold mb-4"},"Monthly Breakdown",-1)),t("div",Lt,[t("table",Ut,[e[7]||(e[7]=t("thead",null,[t("tr",{class:"border-b border-gray-200"},[t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"Month"),t("th",{class:"text-right py-3 px-4 font-semibold text-gray-700"},"New Users"),t("th",{class:"text-right py-3 px-4 font-semibold text-gray-700"},"Free"),t("th",{class:"text-right py-3 px-4 font-semibold text-gray-700"},"Paid"),t("th",{class:"text-right py-3 px-4 font-semibold text-gray-700"},"Total Users")])],-1)),t("tbody",null,[(a(!0),l(C,null,S(r.value.monthlyData.slice().reverse(),(s,w)=>(a(),l("tr",{key:s.month,class:B([{"bg-gray-50":w%2===0},"border-b border-gray-100"])},[t("td",Dt,o(D(s.month)),1),t("td",At,o(s.total),1),t("td",Bt,o(s.free),1),t("td",Nt,o(s.paid),1),t("td",Pt,o(s.cumulative),1)],2))),128))])])])]),t("div",$t,[e[12]||(e[12]=t("h2",{class:"text-xl font-semibold mb-4"},"Recent Users",-1)),y.value?(a(),l("div",Mt,[g(d)])):p("",!0),_.value?(a(),l("div",Ft,o(_.value),1)):p("",!0),!y.value&&U.value.length>0?(a(),l("div",Rt,[t("table",zt,[e[9]||(e[9]=t("thead",null,[t("tr",{class:"border-b border-gray-200"},[t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"User"),t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"Email"),t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"Plan"),t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"Recent Stocks"),t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"Registered"),t("th",{class:"text-left py-3 px-4 font-semibold text-gray-700"},"Upgraded"),t("th",{class:"text-center py-3 px-4 font-semibold text-gray-700"},"Admin")])],-1)),t("tbody",null,[(a(!0),l(C,null,S(U.value,(s,w)=>(a(),l("tr",{key:s._id,class:B([{"bg-gray-50":w%2===0},"border-b border-gray-100"])},[t("td",Et,[t("div",Tt,[s.picture?(a(),l("img",{key:0,src:s.picture,alt:s.name||s.email,class:"w-8 h-8 rounded-full object-cover"},null,8,jt)):(a(),l("div",Ht,o((s.name||s.email).substring(0,2).toUpperCase()),1)),t("div",It,o(s.name||"-"),1)])]),t("td",Vt,o(s.email),1),t("td",Ot,[t("span",{class:B({"text-green-600 font-medium":s.plan&&s.plan!=="free","text-gray-500":!s.plan||s.plan==="free"})},o(s.plan||"free"),3)]),t("td",Wt,[s.stockHistory&&s.stockHistory.length>0?(a(),l("div",Gt,[(a(!0),l(C,null,S(s.stockHistory,c=>(a(),N(k,{key:c.stockId,to:`/stock/${c.slug?.toLowerCase()||c.symbol?.toLowerCase()||c.isin?.toLowerCase()}`,target:"_blank",class:"hover:scale-110 transition-transform cursor-pointer"},{default:L(()=>[(a(),N(b,{key:c.stockId,symbol:c.symbol,name:c.companyName,logo:c.logo,size:"sm",class:"hover:scale-110 transition-transform cursor-pointer",title:`${c.companyName} (${c.symbol.toUpperCase()})`},null,8,["symbol","name","logo","title"]))]),_:2},1032,["to"]))),128))])):(a(),l("span",Zt,"No activity"))]),t("td",qt,o($(s.createdAt)),1),t("td",Kt,o(s.upgradedAt?$(s.upgradedAt):"-"),1),t("td",Jt,[s.isAdmin?(a(),l("span",Qt,"â")):(a(),l("span",Xt,"-"))])],2))),128))])])])):p("",!0),!y.value&&n.value&&n.value.totalPages>1?(a(),l("div",Yt,[t("div",te," Showing "+o((n.value.page-1)*n.value.limit+1)+" to "+o(Math.min(n.value.page*n.value.limit,n.value.total))+" of "+o(n.value.total)+" users ",1),t("div",ee,[g(u,{size:"sm",variant:"outline",onClick:e[0]||(e[0]=s=>f(n.value.page-1)),disabled:n.value.page===1},{default:L(()=>[...e[10]||(e[10]=[P(" Previous ",-1)])]),_:1},8,["disabled"]),t("div",se,[(a(!0),l(C,null,S(T.value,s=>(a(),N(u,{key:s,size:"sm",variant:s===n.value.page?"default":"outline",onClick:w=>f(s)},{default:L(()=>[P(o(s),1)]),_:2},1032,["variant","onClick"]))),128))]),g(u,{size:"sm",variant:"outline",onClick:e[1]||(e[1]=s=>f(n.value.page+1)),disabled:n.value.page===n.value.totalPages},{default:L(()=>[...e[11]||(e[11]=[P(" Next ",-1)])]),_:1},8,["disabled"])])])):p("",!0)])])):p("",!0)])}}});
1export{de as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.