PageSourceSearch

https://app.countdowntimer.ai/assets/AdminController-tq8Nc-B_.js

js countdowntimer.ai collected 2026-10-05 11:56:26 UTC 35,922 bytes, 78 lines download raw bytes

1import{u as Le}from"./index-BUMrgcYM.js";import{u as ye}from"./index-BXKDi5BI.js";import{_ as W}from"./Title.vue_vue_type_script_setup_true_lang-CKC_SfhI.js";import{C as q}from"./Card-7Z6zyd7C.js";import{_ as i}from"./Label.vue_vue_type_script_setup_true_lang-DPhggLKj.js";import{S as Te}from"./Switch-CuxZuYQ6.js";import{_ as Se}from"./TextInput.vue_vue_type_script_setup_true_lang-CqOOGp57.js";import{S as ne}from"./Selector-B_zYM8qq.js";import{P as we,_ as O}from"./Button.vue_vue_type_script_setup_true_lang-Ckyg3Q5i.js";import{ar as k,az as g,aq as Ae,aS as _e,aT as ke,d as pe,r as H,o as u,c as A,i as b,a6 as K,a7 as J,n as v,a as t,w as e,u as s,h as r,t as p,b as w,g as C,j as Ce,as as Ee,I as R,D as fe,F as oe,aU as de,e as L,k as I,ad as he,p as ze}from"./index-Ds0GePR4.js";import{g as be}from"./API-DcTJhK_-.js";import{_ as Re}from"./Modal.vue_vue_type_script_setup_true_lang-DqtGYFMi.js";import"./index-C-Yl_KMw.js";import"./inputtext.esm-DvQ1XMsI.js";import"./dropdown.esm-C7rPhhkx.js";const Ie=`query GetCustomersOverview {
2  getCustomersOverview {
3    owner
4    email
5    tier
6    billingPeriod
7    subscribersCount
8    includedSubscribers
9    extraSubscribers
10    subscribersLimit
11    isActive
12    isTrial
13    createdAt
14  }
15}
16`,E=m=>{const _=m.extraSubscribers??0;return{email:null,isActive:!0,isTrial:!1,createdAt:null,extraSubscribers:_,subscribersLimit:m.includedSubscribers+_,...m}};E({owner:"mock-0001",email:"[email protected]",tier:g.PRO,billingPeriod:k.YEAR,subscribersCount:25e3,includedSubscribers:25e3,createdAt:"2025-02-11T09:24:00.000Z"}),E({owner:"mock-0002",email:"[email protected]",tier:g.GROWTH,billingPeriod:k.MONTH,subscribersCount:5210,includedSubscribers:5e3,createdAt:"2025-04-03T14:02:00.000Z"}),E({owner:"mock-0003",email:"[email protected]",tier:g.STARTER,billingPeriod:k.MONTH,subscribersCount:940,includedSubscribers:1e3,createdAt:"2025-05-19T07:48:00.000Z"}),E({owner:"mock-0004",email:"[email protected]",tier:g.GROWTH,billingPeriod:k.YEAR,subscribersCount:3870,includedSubscribers:5e3,extraSubscribers:2e3,createdAt:"2024-11-27T18:15:00.000Z"}),E({owner:"mock-0005",email:"[email protected]",tier:g.BETA,billingPeriod:k.LIFETIME,subscribersCount:1284,includedSubscribers:0,createdAt:"2024-08-01T10:00:00.000Z"}),E({owner:"mock-0006",email:"[email protected]",tier:g.STARTER,billingPeriod:k.MONTH,subscribersCount:812,includedSubscribers:1e3,isTrial:!0,createdAt:"2026-05-22T12:30:00.000Z"}),E({owner:"mock-0007",email:"[email protected]",tier:g.PRO,billingPeriod:k.MONTH,subscribersCount:19920,includedSubscribers:25e3,createdAt:"2025-01-09T16:41:00.000Z"}),E({owner:"mock-0008",email:"[email protected]",tier:g.LTD,billingPeriod:k.LIFETIME,subscribersCount:1015,includedSubscribers:1e3,createdAt:"2024-06-14T08:05:00.000Z"}),E({owner:"mock-0009",email:"[email protected]",tier:g.GROWTH,billingPeriod:k.MONTH,subscribersCount:4490,includedSubscribers:5e3,createdAt:"2025-03-30T21:12:00.000Z"}),E({owner:"mock-0010",email:"[email protected]",tier:g.STARTER,billingPeriod:k.YEAR,subscribersCount:120,includedSubscribers:1e3,createdAt:"2025-06-28T11:55:00.000Z"}),E({owner:"mock-0011",email:"[email protected]",tier:g.PRO,billingPeriod:k.YEAR,subscribersCount:26110,includedSubscribers:25e3,extraSubscribers:5e3,createdAt:"2024-12-02T09:09:00.000Z"}),E({owner:"mock-0012",email:"[email protected]",tier:g.CUSTOM,billingPeriod:k.YEAR,subscribersCount:41200,includedSubscribers:5e4,createdAt:"2025-02-26T13:37:00.000Z"}),E({owner:"mock-0013",email:"[email protected]",tier:g.GROWTH,billingPeriod:k.MONTH,subscribersCount:0,includedSubscribers:5e3,isActive:!1,createdAt:"2025-04-18T06:20:00.000Z"}),E({owner:"mock-0014",email:"[email protected]",tier:g.PREMIUM_LTD,billingPeriod:k.LIFETIME,subscribersCount:8650,includedSubscribers:1e4,createdAt:"2024-09-23T15:48:00.000Z"});const Pe=be();async function Oe(){try{return(await Pe.graphql({query:Ie})).data?.getCustomersOverview??[]}catch(m){return console.log("Failed to load customers overview",m),new Error(m?.errors?.[0]?.message||m.message)}}const Ne={[k.MONTH]:"Monthly",[k.YEAR]:"Yearly",[k.LIFETIME]:"Lifetime"};function $e(m){const _=Ae.find(z=>z.id===m.tier),h=!m.subscribersLimit||m.subscribersLimit<=0;return{...m,percent:ke(m.subscribersCount,m.subscribersLimit),level:_e(m.subscribersCount,m.subscribersLimit),unlimited:h,planLabel:Ne[m.billingPeriod]??m.billingPeriod,tierLabel:_?.label??m.tier}}const De={pill:"bg-slate-100 text-slate-600",dot:"bg-slate-400"},Ve={[g.STARTER]:{pill:"bg-blue-100 text-blue-700",dot:"bg-blue-500"},[g.GROWTH]:{pill:"bg-emerald-100 text-emerald-700",dot:"bg-emerald-500"},[g.PRO]:{pill:"bg-pink-100 text-pink-700",dot:"bg-pink-500"},[g.BETA]:{pill:"bg-violet-100 text-violet-700",dot:"bg-violet-500"}
16,[g.LTD]:{pill:"bg-amber-100 text-amber-700",dot:"bg-amber-500"},[g.PREMIUM_LTD]:{pill:"bg-indigo-100 text-indigo-700",dot:"bg-indigo-500"},[g.CUSTOM]:{pill:"bg-slate-200 text-slate-700",dot:"bg-slate-500"}},Me=[g.STARTER,g.GROWTH,g.PRO,g.BETA,g.LTD,g.PREMIUM_LTD,g.CUSTOM];function ee(m){return Ve[m]??De}const Ue={class:"customers-table w-full overflow-x-auto"},Fe={class:"w-full border-collapse text-left"},Ge={class:"border-b border-gray-200"},Be=["onClick"],He=["onClick"],Ye={class:"px-3 py-3"},je={class:"whitespace-nowrap px-3 py-3"},Ze={class:"whitespace-nowrap px-3 py-3"},qe={class:"whitespace-nowrap px-3 py-3 text-right"},We={class:"text-text-secondary"},Ke={class:"whitespace-nowrap px-3 py-3"},Je={key:0,class:"h-1 w-full overflow-hidden rounded-full bg-gray-100"},Xe={class:"whitespace-nowrap px-3 py-3"},Qe={key:0,class:"inline-block rounded-full bg-red-50 px-2.5 py-1 text-xs font-semibold text-red-600"},et={key:1,class:"inline-block rounded-full bg-blue-50 px-2.5 py-1 text-xs font-semibold text-blue-700"},tt={key:2,class:"inline-block rounded-full bg-emerald-50 px-2.5 py-1 text-xs font-semibold text-emerald-700"},lt={class:"px-3 py-3 text-right"},st=["aria-label","onClick"],at={key:0},rt={colspan:"7",class:"px-3 py-8 text-center"},it=pe({__name:"CustomersTable",props:{rows:{},sortKey:{},sortDir:{}},emits:["sort","select"],setup(m){const _=[{key:"email",label:"Customer"},{key:"tierLabel",label:"Tier"},{key:"planLabel",label:"Plan"},{key:"subscribersCount",label:"Leads this cycle",align:"right"},{key:"percent",label:"Used",align:"right"},{key:"isActive",label:"Status"}],h=z=>{switch(z.level){case"exceeded":case"critical":return"bg-red-500";case"warning":return"bg-orange-400";default:return"bg-brand-quaternary"}};return(z,N)=>{const n=H("Flex");return u(),A("div",Ue,[b("table",Fe,[b("thead",null,[b("tr",Ge,[(u(),A(K,null,J(_,c=>b("th",{key:c.key,class:v(["cursor-pointer select-none whitespace-nowrap px-3 py-3",c.align==="right"?"text-right":"text-left"]),onClick:y=>z.$emit("sort",c.key)},[t(n,{gap:"1",middle:"",right:c.align==="right"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase text-text-secondary"},{default:e(()=>[r(p(c.label),1)]),_:2},1024),m.sortKey===c.key?(u(),w(s(i),{key:0,size:"xs",class:"text-text-secondary"},{default:e(()=>[r(p(m.sortDir==="asc"?"▲":"▼"),1)]),_:1})):C("",!0)]),_:2},1032,["right"])],10,Be)),64)),N[0]||(N[0]=b("th",{class:"w-px px-3 py-3"},[b("span",{class:"sr-only"},"Actions")],-1))])]),b("tbody",null,[(u(!0),A(K,null,J(m.rows,c=>(u(),A("tr",{key:c.owner,class:"cursor-pointer border-b border-gray-100 transition-colors hover:bg-gray-50",onClick:y=>z.$emit("select",c.owner)},[b("td",Ye,[t(n,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(c.email||"—"),1)]),_:2},1024),t(s(i),{size:"xs",class:"text-text-secondary"},{default:e(()=>[r(p(c.owner),1)]),_:2},1024)]),_:2},1024)]),b("td",je,[b("span",{class:v(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-semibold",s(ee)(c.tier).pill])},[b("span",{class:v(["inline-block h-1.5 w-1.5 rounded-full",s(ee)(c.tier).dot])},null,2),r(" "+p(c.tierLabel),1)],2)]),b("td",Ze,[t(s(i),{size:"sm"},{default:e(()=>[r(p(c.planLabel),1)]),_:2},1024)]),b("td",qe,[t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(c.subscribersCount.toLocaleString())+" ",1),b("span",We," / "+p(c.unlimited?"∞":c.subscribersLimit.toLocaleString()),1)]),_:2},1024)]),b("td",Ke,[t(n,{vertical:"",gap:"1",right:"",class:"min-w-[88px]"},{default:e(()=>[t(n,{gap:"2",middle:"",right:""},{default:e(()=>[c.unlimited?C("",!0):(u(),A("span",{key:0,class:v(["inline-block h-2 w-2 rounded-full",h(c)])},null,2)),t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(c.unlimited?"—":`${c.percent}%`),1)]),_:2},1024)]),_:2},1024),c.unlimited?C("",!0):(u(),A("div",Je,[b("div",{class:v(["h-full rounded-full",h(c)]),style:Ce({width:`${c.percent}%`})},null,6)]))]),_:2},1024)]),b("td",Xe,[c.isActive?c.isTrial?(u(),A("span",et," Trial ")):(u(),A("span",tt," Active ")):(u(),A("span",Qe," Inactive "))]),b("td",lt,[b("button",{type:"button",class:"inline-flex h-8 w-8 items-center justify-center rounded-full text-text-secondary transition-colors hover:bg-gray-100 hover:text-brand-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-secondary/40","aria-label":`View details for ${c.email||c.owner}`,onClick:Ee(y=>z.$emit("select",c.owner),["stop"])},[t(s(R),{name:"eye-solid",width:"16px",height:"16px"})],8,st)])],8,He))),128)),m.rows.length?C("",!0):(u(),A("tr",at,[b("td",rt,[t(s(i),{size:"sm",class:"text-text-secondary"},{default:e(()=>[...N[1]||(N[1]=[r(" No customers match the current filters. ",-1)])]),_:1})])]))])])])}}}),nt=`query GetCustomerDetail($owner: String!) {
17  getCustomerDetail(owner: $owner) {
18    owner
19    email
20    name
21    accountEnabled
22    userCreatedAt
23    stripeCustomerId
24    tier
25    billingPeriod
26    price
27    subscribersCount
28    includedSubscribers
29    extraSubscribers
30    subscribersLimit
31    includedCampaigns
32    extraCampaigns
33    isActive
34    isTrial
35    trialEndDate
36    cancelsAt
37    createdAt
38    campaignsCount
39    activeCampaignsCount
40    campaigns {
41      id
42      title
43      type
44      archived
45      createdAt
46    }
47    integrations {
48      id
49      type
50    }
51    recentActions {
52      id
53      adminEmail
54      action
55      details
56      createdAt
57    }
58  }
59}
60`,ot=`mutation PerformAdminAction(
61  $action: AdminActionType!
62  $owner: String!
63  $amount: Int
64  $until: AWSDateTime
65) {
66  performAdminAction(
67    action: $action
68    owner: $owner
69    amount: $amount
70    until: $until
71  ) {
72    ok
73    message
74    owner
75  }
76}
77`,dt=be();async function ut(m){try{return(await dt.graphql({query:nt,variables:{owner:m}})).data?.getCustomerDetail??new Error("Customer not found.")}catch(_){return console.log("Failed to load customer detail",_),new Error(_?.errors?.[0]?.message||_.message)}}const ct=be();async function mt(m){try{return(await ct.graphql({query:ot,variables:{action:m.action,owner:m.owner,amount:m.amount??null,until:m.until??null}})).data?.performAdminAction??new Error("Action failed.")}catch(_){return console.log("Admin action failed",_),new Error(_?.errors?.[0]?.message||_.message)}}const pt={key:0,class:"inline-flex items-center rounded-full bg-amber-50 px-2.5 py-1 text-xs font-semibold text-amber-700"},bt={class:"rounded-2xl bg-gray-50 p-5"},ft={key:0,class:"text-text-tertiary"},gt={key:0,class:"h-2 w-full overflow-hidden rounded-full bg-gray-200"},vt=["href"],xt={key:0,class:"max-h-64 divide-y divide-gray-100 overflow-y-auto rounded-2xl border border-gray-200"},yt={class:"divide-y divide-gray-100 overflow-hidden rounded-2xl border border-gray-200"},wt={class:"rounded-2xl border border-red-200 bg-red-50/60 px-4 py-3"},At={class:"divide-y divide-gray-100 overflow-hidden rounded-2xl border border-gray-200"},_t="inline-flex h-9 items-center justify-center gap-1.5 rounded-full border border-gray-200 bg-white px-4 text-sm font-medium text-text-primary transition-colors hover:border-gray-300 hover:bg-gray-50",ue="inline-flex h-9 items-center justify-center gap-1.5 rounded-full border border-emerald-200 bg-emerald-50 px-4 text-sm font-medium text-emerald-700 transition-colors hover:bg-emerald-100",ge="inline-flex h-9 items-center justify-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-4 text-sm font-medium text-amber-700 transition-colors hover:bg-amber-100",ve="inline-flex h-9 items-center justify-center gap-1.5 rounded-full border border-sky-200 bg-sky-50 px-4 text-sm font-medium text-sky-700 transition-colors hover:bg-sky-100",kt="inline-flex h-9 items-center justify-center gap-1.5 rounded-full bg-brand-secondary px-5 text-sm font-medium text-white transition-colors hover:bg-brand-secondary-dark",Ct="inline-flex h-9 items-center justify-center gap-1.5 rounded-full border border-red-200 bg-white px-4 text-sm font-medium text-red-600 transition-colors hover:bg-red-50",xe="inline-flex h-9 items-center justify-center gap-1.5 rounded-full bg-red-500 px-5 text-sm font-medium text-white transition-colors hover:bg-red-600",ce="h-9 rounded-full border border-gray-200 bg-white px-4 text-sm text-text-primary outline-none transition-colors focus:border-brand-secondary",Lt=pe({__name:"CustomerDetailDrawer",props:{modelValue:{type:Boolean},owner:{}},emits:["update:modelValue","changed"],setup(m,{emit:_}){const h=m,z=_,N=ye(),n=L(null),c=L(!1),y=L(!1),D=L(1e3),$=L(1),P=L(""),T=L(null),M=L(null),U={[k.MONTH]:"Monthly",[k.YEAR]:"Yearly",[k.LIFETIME]:"Lifetime"},te=I(()=>Ae.find(l=>l.id===n.value?.tier)?.label??n.value?.tier??"—"),le=I(()=>n.value?.billingPeriod?U[n.value.billingPeriod]??n.value.billingPeriod:"—"),X=I(()=>ke(n.value?.subscribersCount||0,n.value?.subscribersLimit||0)),se=I(()=>_e(n.value?.subscribersCount||0,n.value?.subscribersLimit||0)),ae=I(()=>{switch(se.value){case"exceeded":case"critical":return"bg-red-500";case"warning":return"bg-orange-400";default:return"bg-brand-quaternary"}}),G=I(()=>!n.value?.subscribersLimit),B=I(()=>n.value?.isActive===!1?{label:"Inactive",class:"bg-red-50 text-red-600"}:n.value?.isTrial?{label:"Trial",class:"bg-blue-50 text-blue-700"}:{label:"Active",class:"bg-emerald-50 text-emerald-700"}),Y=I(()=>n.value?.stripeCustomerId?`https://dashboard.stripe.com/customers/${n.value.stripeCustomerId}`:null),Q=async a=>{c.value=!0,n.value=null,T.value=null;const l=await ut(a);l instanceof Error?N.error(l.message||"Could not load customer."):n.value=l,c.value=!1};fe(()=>[h.modelValue,h.owner],([a,l])=>{a&&l&&Q(l)},{immediate:!0}),fe(T,async a=>{a&&(await he(),M.value?.scrollIntoView({block:"center"}))});const j=()=>z("update:modelValue",!1),V=async(a,l,o)=>{if(!h.owner)return;y.value=!0;const x=await mt({action:a,owner:h.owner,amount:l??null,until:o??null});if(y.value=!1,T.value=null,x instanceof Error){N.error(x.message||"Action failed.");return}if(N.success(x.message||"Done.",{timeout:6e3}),z("changed"),a==="DELETE_CUSTOMER"&&!x.message?.toLowerCase().startsWith("partial")){j();return}await Q(h.owner)},F=a=>{T.value=a},re=()=>{const a=T.value;a&&V(a.action,a.amount,a.until)},Z=a=>a?new Date(a).toLocaleDateString():"—",f=a=>{if(!a)return"";try{return JSON.parse(a).message||a}catch{return a}};return(a,l)=>{const o=H("Flex"),x=H("Grid");return u(),w(s(Re),{"model-value":m.modelValue,title:"Customer","close-on-overlay-click":"","onUpdate:modelValue":j},{default:e(()=>[c.value?(u(),w(o,{key:0,class:"py-16",center:"",middle:""},{default:e(()=>[t(s(we),{size:100})]),_:1})):n.value?(u(),w(o,{key:1,vertical:"",gap:"5"},{default:e(()=>[t(o,{vertical:"",gap:"2"},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(W),{size:"lg",level:"4","semi-bold":""},{default:e(()=>[r(p(n.value.email||n.value.owner),1)]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[r(p(n.value.owner),1)]),_:1})]),_:1}),t(o,{gap:"2",middle:"",wrap:""},{default:e(()=>[b("span",{class:v(["inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-semibold",s(ee)(n.value.tier||"").pill])},[b("span",{class:v(["inline-block h-1.5 w-1.5 rounded-full",s(ee)(n.value.tier||"").dot])},null,2),r(" "+p(te.value),1)],2),b("span",{class:v(["inline-flex items-center rounded-full px-2.5 py-1 text-xs font-semibold",B.value.class])},p(B.value.label),3),n.value.accountEnabled===!1?(u(),A("span",pt," Login suspended ")):C("",!0)]),_:1})]),_:1}),b("div",bt,[t(o,{vertical:"",gap:"4"},{default:e(()=>[t(o,{vertical:"",gap:"2"},{default:e(()=>[t(o,{between:"",middle:"",gap:"2",wrap:""},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[13]||(l[13]=[r(" Leads this cycle ",-1)])]),_:1}),t(s(i),{size:"sm","semi-bold":""},{default:e(()=>
77[r(p((n.value.subscribersCount||0).toLocaleString())+" / "+p(G.value?"∞":(n.value.subscribersLimit||0).toLocaleString())+" ",1),G.value?C("",!0):(u(),A("span",ft," · "+p(X.value)+"% ",1))]),_:1})]),_:1}),G.value?C("",!0):(u(),A("div",gt,[b("div",{class:v(["h-full rounded-full transition-all duration-500",ae.value]),style:Ce({width:`${Math.max(X.value,2)}%`})},null,6)]))]),_:1}),l[18]||(l[18]=b("div",{class:"h-px w-full bg-gray-200"},null,-1)),t(x,{style:{"grid-template-columns":"repeat(2, minmax(0, 1fr))"},gap:"3"},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[14]||(l[14]=[r(" Plan ",-1)])]),_:1}),t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(le.value),1)]),_:1})]),_:1}),t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[15]||(l[15]=[r(" Signed up ",-1)])]),_:1}),t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(Z(n.value.userCreatedAt||n.value.createdAt)),1)]),_:1})]),_:1}),n.value.trialEndDate?(u(),w(o,{key:0,vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[16]||(l[16]=[r(" Trial ends ",-1)])]),_:1}),t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(Z(n.value.trialEndDate)),1)]),_:1})]),_:1})):C("",!0),n.value.extraSubscribers?(u(),w(o,{key:1,vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[17]||(l[17]=[r(" Bonus leads ",-1)])]),_:1}),t(s(i),{size:"sm",medium:""},{default:e(()=>[r(" +"+p((n.value.extraSubscribers||0).toLocaleString()),1)]),_:1})]),_:1})):C("",!0)]),_:1}),Y.value?(u(),A("a",{key:0,href:Y.value,target:"_blank",rel:"noopener",class:"text-xs font-semibold text-stripe hover:underline"}," Open in Stripe ↗ ",8,vt)):C("",!0)]),_:1})]),n.value.campaigns?(u(),w(o,{key:0,vertical:"",gap:"3"},{default:e(()=>[t(o,{between:"",middle:"",gap:"2",wrap:""},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[19]||(l[19]=[r(" Campaigns ",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[r(p(n.value.activeCampaignsCount??0)+" active · "+p(n.value.campaignsCount??0)+" total ",1)]),_:1})]),_:1}),n.value.campaigns.length?(u(),A("div",xt,[(u(!0),A(K,null,J(n.value.campaigns,d=>(u(),w(o,{key:d.id,gap:"3",between:"",middle:"",class:"px-4 py-2.5"},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(d.title),1)]),_:2},1024),t(s(i),{size:"xs",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[r(p(d.type),1)]),_:2},1024)]),_:2},1024),b("span",{class:v(["inline-flex items-center rounded-full px-2.5 py-1 text-xs font-semibold",d.archived?"bg-gray-100 text-text-tertiary":"bg-emerald-50 text-emerald-700"])},p(d.archived?"Archived":"Active"),3)]),_:2},1024))),128))])):(u(),w(s(i),{key:1,size:"sm",class:"text-text-tertiary"},{default:e(()=>[...l[20]||(l[20]=[r(" No campaigns yet. ",-1)])]),_:1}))]),_:1})):C("",!0),n.value.integrations?(u(),w(o,{key:1,vertical:"",gap:"3"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[21]||(l[21]=[r(" Integrations ",-1)])]),_:1}),n.value.integrations.length?(u(),w(o,{key:0,gap:"2",wrap:"",middle:""},{default:e(()=>[(u(!0),A(K,null,J(n.value.integrations,d=>(u(),A("span",{key:d.id,class:"inline-flex items-center rounded-full border border-gray-200 bg-white px-3 py-1 text-xs font-semibold text-text-primary"},p(d.type),1))),128))]),_:1})):(u(),w(s(i),{key:1,size:"sm",class:"text-text-tertiary"},{default:e(()=>[...l[22]||(l[22]=[r(" No integrations connected. ",-1)])]),_:1}))]),_:1})):C("",!0),t(o,{vertical:"",gap:"3"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[23]||(l[23]=[r(" Actions ",-1)])]),_:1}),b("div",yt,[t(o,{class:"px-4 py-3",between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[...l[24]||(l[24]=[r("Grant leads",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[...l[25]||(l[25]=[r(" Add one-off leads to this cycle ",-1)])]),_:1})]),_:1}),t(o,{gap:"2",middle:""},{default:e(()=>[oe(b("input",{"onUpdate:modelValue":l[0]||(l[0]=d=>D.value=d),type:"number",min:"1",class:v([ce,"w-24"])},null,512),[[de,D.value,void 0,{number:!0}]]),t(s(O),{class:v(ue),disabled:y.value,onClick:l[1]||(l[1]=d=>V("GRANT_LEADS",D.value))},{default:e(()=>[t(s(R),{name:"plus",width:"14px",height:"14px"}),l[26]||(l[26]=r(" Grant ",-1))]),_:1},8,["disabled"])]),_:1})]),_:1}),t(o,{class:"px-4 py-3",between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[...l[27]||(l[27]=[r("Grant campaigns",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[...l[28]||(l[28]=[r(" Increase the campaign allowance ",-1)])]),_:1})]),_:1}),t(o,{gap:"2",middle:""},{default:e(()=>[oe(b("input",{"onUpdate:modelValue":l[2]||(l[2]=d=>$.value=d),type:"number",min:"1",class:v([ce,"w-16"])},null,512),[[de,$.value,void 0,{number:!0}]]),t(s(O),{class:v(ue),disabled:y.value,onClick:l[3]||(l[3]=d=>V("GRANT_CAMPAIGNS",$.value))},{default:e(()=>[t(s(R),{name:"plus",width:"14px",height:"14px"}),l[29]||(l[29]=r(" Grant ",-1))]),_:1},8,["disabled"])]),_:1})]),_:1}),t(o,{class:"px-4 py-3",between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[...l[30]||(l[30]=[r("Reset leads",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[...l[31]||(l[31]=[r(" Set this cycle's counter back to 0 ",-1)])]),_:1})]),_:1}),t(s(O),{class:v(ve),disabled:y.value,onClick:l[4]||(l[4]=d=>F({action:"RESET_LEADS",label:"Reset the leads counter to 0 for this cycle?"}))},{default:e(()=>[t(s(R),{name:"arrows-rotate",width:"14px",height:"14px"}),l[32]||(l[32]=r(" Reset ",-1))]),_:1},8,["disabled"])]),_:1}),t(o,{class:"px-4 py-3",between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[...l[33]||(l[33]=[r("Login access",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[r(p(n.value.accountEnabled===!1?"Sign-in is currently blocked":"Customer can sign in"),1)]),_:1})]),_:1}),n.value.accountEnabled!==!1?(u(),w(s(O),{key:0,class:v(ge),disabled:y.value,onClick:l[5]||(l[5]=d=>F({action:"SUSPEND_LOGIN",label:"Suspend login for this account?",destructive:!0}))},{default:e(()=>[t(s(R),{name:"lock",width:"14px",height:"14px"}),l[34]||(l[34]=r(" Suspend login ",-1))]),_:1},8,["disabled"])):(u(),w(s(O),{key:1,class:v(ue),disabled:y.value,onClick:l[6]||(l[6]=d=>V("ENABLE_LOGIN"))},{default:e(()=>[t(s(R),{name:"circle-check",width:"14px",height:"14px"}),l[35]||(l[35]=r(" Enable login ",-1))]),_:1},8,["disabled"]))]),_:1}),t(o,{class:"px-4 py-3",between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[...l[36]||(l[36]=[r("Active sessions",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[...l[37]||(l[37]=[r(" Sign this customer out everywhere ",-1)])]),_:1})]),_:1}),t(s(O),{class:v(ge),disabled:y.value,onClick:l[7]||(l[7]=d=>F({action:"FORCE_SIGN_OUT",label:"Sign this customer out of all sessions?"}))},{default:e(()=>[t(s(R),{name:"logout",width:"14px",height:"14px"}),l[38]||(l[38]=r(" Force sign out ",-1))]),_:1},8,["disabled"])]),_:1}),n.value.isTrial?(u(),w(o,{key:0,class:"px-4 py-3",between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[...l[39]||(l[39]=[r("Extend trial",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[...l[40]||(l[40]=[r(" Push the trial end date forward ",-1)])]),_:1})]),_:1}),t(o,{gap:"2",middle:""},{default:e(()=>[oe(b("input",{"onUpdate:modelValue":l[8]||(l[8]=d=>P.value=d),type:"date",class:v(ce)},null,512),[[de,P.value]]),t(s(O),{class:v(ve),disabled:y.value||!P.value,onClick:l[9]||(l[9]=d=>V("EXTEND_TRIAL",void 0,P.value))},{default:e(()=>[t(s(R),{name:"calendar",width:"14px",height:"14px"}),l[41]||(l[41]=r(" Extend ",-1))]),_:1},8,["disabled"])]),_:1})]),_:1})):C("",!0)]),T.value?(u(),A("div",{key:0,ref_key:"confirmRef",ref:M,class:v(["rounded-2xl border p-4",T.value.destructive?"border-red-200 bg-red-50":"border-gray-200 bg-gray-50"])},[t(o,{gap:"3",between:"",middle:"",wrap:""},{default:e(()=>[t(s(i),{size:"sm",medium:"",class:v(T.value.destructive?"text-red-700":"")},{default:e(()=>[r(p(T.value.label),1)]),_:1},8,["class"]),t(o,{gap:"2",middle:""},{default:e(()=>[t(s(O),{class:v(_t),disabled:y.value,onClick:l[10]||(l[10]=d=>T.value=null)},{default:e(()=>[t(s(R),{name:"xmark",width:"13px",height:"13px"}),l[42]||(l[42]=r(" Cancel ",-1))]),_:1},8,["disabled"]),t(s(O),{class:v(T.value.destructive?xe:kt),loading:y.value,onClick:re},{default:e(()=>[t(s(R),{name:"check",width:"14px",height:"14px"}),l[43]||(l[43]=r(" Confirm ",-1))]),_:1},8,["class","loading"])]),_:1})]),_:1})],2)):C("",!0)]),_:1}),t(o,{vertical:"",gap:"3"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase tracking-wide text-red-500"},{default:e(()=>[...l[44]||(l[44]=[r(" Danger zone ",-1)])]),_:1}),b("div",wt,[t(o,{vertical:"",gap:"3"},{default:e(()=>[t(o,{between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:"",class:"text-red-700"},{default:e(()=>[...l[45]||(l[45]=[r(" Cancel subscription ",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-red-600"},{default:e(()=>[...l[46]||(l[46]=[r(" Deactivates the membership immediately. ",-1)])]),_:1})]),_:1}),t(s(O),{class:v(Ct),disabled:y.value,onClick:l[11]||(l[11]=d=>F({action:"CANCEL_SUBSCRIPTION",label:"Cancel this subscription? This deactivates the membership.",destructive:!0}))},{default:e(()=>[t(s(R),{name:"circle-xmark",width:"14px",height:"14px"}),l[47]||(l[47]=r(" Cancel subscription ",-1))]),_:1},8,["disabled"])]),_:1}),l[51]||(l[51]=b("div",{class:"border-t border-red-200"},null,-1)),t(o,{between:"",middle:"",gap:"3",wrap:""},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:"",class:"text-red-700"},{default:e(()=>[...l[48]||(l[48]=[r(" Delete customer ",-1)])]),_:1}),t(s(i),{size:"xs",class:"text-red-600"},{default:e(()=>[...l[49]||(l[49]=[r(" Permanently removes their login and ALL data. Cannot be undone. ",-1)])]),_:1})]),_:1}),t(s(O),{class:v(xe),disabled:y.value,onClick:l[12]||(l[12]=d=>F({action:"DELETE_CUSTOMER",label:"Permanently delete this customer, their login and ALL their data (campaigns, leads, integrations)? This cannot be undone.",destructive:!0}))},{default:e(()=>[t(s(R),{name:"trash",width:"14px",height:"14px"}),l[50]||(l[50]=r(" Delete customer ",-1))]),_:1},8,["disabled"])]),_:1})]),_:1})])]),_:1}),n.value.recentActions&&n.value.recentActions.length?(u(),w(o,{key:2,vertical:"",gap:"3"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase tracking-wide text-text-tertiary"},{default:e(()=>[...l[52]||(l[52]=[r(" Recent admin activity ",-1)])]),_:1}),b("div",At,[(u(!0),A(K,null,J(n.value.recentActions,d=>(u(),w(o,{key:d.id,gap:"3",between:"",middle:"",class:"px-4 py-2.5"},{default:e(()=>[t(o,{vertical:"",gap:"0"},{default:e(()=>[t(s(i),{size:"sm",medium:""},{default:e(()=>[r(p(d.action),1)]),_:2},1024),t(s(i),{size:"xs",class:"text-text-tertiary"},{default:e(()=>[r(p(f(d.details)),1)]),_:2},1024)]),_:2},1024),t(s(i),{size:"xs",class:"text-text-tertiary","no-wrap":""},{default:e(()=>[r(p(Z(d.createdAt)),1)]),_:2},1024)]),_:2},1024))),128))])]),_:1})):C("",!0)]),_:1})):(u(),w(o,{key:2,class:"py-16",center:"",middle:""},{default:e(()=>[t(s(i),{size:"sm",class:"text-text-tertiary"},{default:e(()=>[...l[53]||(l[53]=[r("Customer not found.",-1)])]),_:1})]),_:1}))]),_:1},8,["model-value"])}}}),me=75,Ft=pe({__name:"AdminController",setup(m){const _=[{id:"ALL",label:"All plans"},{id:"MONTH",label:"Monthly"},{id:"YEAR",label:"Yearly"},{id:"LIFETIME",label:"Lifetime"}],h=[{id:"ALL",label:"All statuses"},{id:"ACTIVE",label:"Active"},{id:"TRIAL",label:"Trial"},{id:"INACTIVE",label:"Inactive"}],z=Le(),N=ye(),n=L([]),c=L(!1),y=L(""),D=L(!1),$=L("ALL"),P=L("ALL"),T=L("ALL"),M=L("percent"),U=L("desc"),te=["subscribersCount","percent"],le=I(()=>{const f=new Map;for(const a of n.value)f.has(a.tier)||f.set(a.tier,a.tierLabel);return[{id:"ALL",label:"All tiers"},...Me.filter(a=>f.has(a)).map(a=>({id:a,label:f.get(a)}))]}),X=f=>f.isActive?f.isTrial?"TRIAL":"ACTIVE":"INACTIVE",se=I(()=>!!y.value.trim()||D.value||$.value!=="ALL"||P.value!=="ALL"||T.value!=="ALL"),ae=()=>{y.value="",D.value=!1,$.value="ALL",P.value="ALL",T.value="ALL"},G=async()=>{const f=await Oe();f instanceof Error?N.error(f.message||"Could not load customers overview."):n.value=f.map($e),c.value=!0,z.toggle(!0)};G();const B=I(()=>{const f=n.value;return{customers:f.length,active:f.filter(a=>a.isActive).length,nearLimit:f.filter(a=>!a.unlimited&&a.percent>=me).length}}),Y=I(()=>{const f=y.value.trim().toLowerCase();let a=n.value;f&&(a=a.filter(x=>
77[x.email,x.owner].filter(Boolean).some(d=>String(d).toLowerCase().includes(f)))),$.value!=="ALL"&&(a=a.filter(x=>x.tier===$.value)),P.value!=="ALL"&&(a=a.filter(x=>x.billingPeriod===P.value)),T.value!=="ALL"&&(a=a.filter(x=>X(x)===T.value)),D.value&&(a=a.filter(x=>!x.unlimited&&x.percent>=me));const l=M.value,o=U.value==="asc"?1:-1;return[...a].sort((x,d)=>{const S=x[l],ie=d[l];return typeof S=="number"&&typeof ie=="number"?(S-ie)*o:String(S??"").localeCompare(String(ie??""))*o})}),Q=f=>{M.value===f?U.value=U.value==="asc"?"desc":"asc":(M.value=f,U.value=te.includes(f)?"desc":"asc")},j=L(null),V=L(!1),F=f=>{j.value=f,V.value=!0},re=f=>{const a=String(f??"");return/[",\n]/.test(a)?`"${a.replace(/"/g,'""')}"`:a},Z=()=>{const f=["Email","Owner","Tier","Plan","Leads this cycle","Limit","Used %","Status"],a=Y.value.map(S=>[S.email??"",S.owner,S.tierLabel,S.planLabel,S.subscribersCount,S.unlimited?"":S.subscribersLimit,S.unlimited?"":S.percent,S.isActive?S.isTrial?"Trial":"Active":"Inactive"]),l=[f,...a].map(S=>S.map(re).join(",")).join(`
78`),o=new Blob([l],{type:"text/csv;charset=utf-8;"}),x=URL.createObjectURL(o),d=document.createElement("a");d.href=x,d.download="customers-overview.csv",d.click(),URL.revokeObjectURL(x)};return(f,a)=>{const l=H("Flex"),o=H("FlexCell"),x=H("Grid");return u(),w(l,{class:"admin-controller relative mx-auto w-full max-w-[1400px] lg:pt-3",gap:"6",vertical:""},{default:e(()=>[t(l,{gap:"4",middle:"",between:"",wrap:""},{default:e(()=>[t(o,null,{default:e(()=>[t(l,{vertical:""},{default:e(()=>[t(s(W),{size:"2xl",level:"3","semi-bold":""},{default:e(()=>[...a[6]||(a[6]=[r("Customers",-1)])]),_:1}),t(s(i),{size:"sm",class:"text-text-secondary"},{default:e(()=>[...a[7]||(a[7]=[r(" Lead usage, tier and plan across all customers. ",-1)])]),_:1})]),_:1})]),_:1}),ze(f.$slots,"header")]),_:3}),c.value?C("",!0):(u(),w(s(q),{key:0},{default:e(()=>[t(l,{class:"w-full py-16",vertical:"",center:"",middle:"",gap:"4"},{default:e(()=>[t(s(we),{size:44}),t(s(i),{size:"sm",class:"text-text-secondary"},{default:e(()=>[...a[8]||(a[8]=[r(" Loading customers… ",-1)])]),_:1})]),_:1})]),_:1})),c.value?(u(),w(x,{key:1,class:"appear-from-top w-full",style:{"grid-template-columns":"repeat(3, minmax(0, 1fr))"},gap:"4"},{default:e(()=>[t(s(q),{type:"gray"},{default:e(()=>[t(l,{vertical:"",gap:"1"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase text-text-secondary"},{default:e(()=>[...a[9]||(a[9]=[r(" Customers ",-1)])]),_:1}),t(s(W),{size:"xl",level:"4","semi-bold":""},{default:e(()=>[r(p(B.value.customers),1)]),_:1})]),_:1})]),_:1}),t(s(q),{type:"gray"},{default:e(()=>[t(l,{vertical:"",gap:"1"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase text-text-secondary"},{default:e(()=>[...a[10]||(a[10]=[r("Active",-1)])]),_:1}),t(s(W),{size:"xl",level:"4","semi-bold":""},{default:e(()=>[r(p(B.value.active),1)]),_:1})]),_:1})]),_:1}),t(s(q),{type:"gray"},{default:e(()=>[t(l,{vertical:"",gap:"1"},{default:e(()=>[t(s(i),{size:"xs",class:"uppercase text-text-secondary"},{default:e(()=>[r(" Near limit (≥"+p(me)+"%) ")]),_:1}),t(s(W),{size:"xl",level:"4","semi-bold":""},{default:e(()=>[r(p(B.value.nearLimit),1)]),_:1})]),_:1})]),_:1})]),_:1})):C("",!0),c.value?(u(),w(s(q),{key:2},{default:e(()=>[t(l,{vertical:"",gap:"4"},{default:e(()=>[t(l,{gap:"4",between:"",bottom:"",wrap:""},{default:e(()=>[t(l,{gap:"4",bottom:"",wrap:""},{default:e(()=>[t(l,{vertical:"",gap:"1",class:"min-w-[200px] max-w-[300px] grow"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase text-text-secondary"},{default:e(()=>[...a[11]||(a[11]=[r(" Search ",-1)])]),_:1}),t(s(Se),{modelValue:y.value,"onUpdate:modelValue":a[0]||(a[0]=d=>y.value=d),placeholder:"Email or name"},null,8,["modelValue"])]),_:1}),t(l,{vertical:"",gap:"1",class:"w-[170px]"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase text-text-secondary"},{default:e(()=>[...a[12]||(a[12]=[r(" Tier ",-1)])]),_:1}),t(s(ne),{modelValue:$.value,"onUpdate:modelValue":a[1]||(a[1]=d=>$.value=d),options:le.value,"clear-hidden":"","limit-width":""},null,8,["modelValue","options"])]),_:1}),t(l,{vertical:"",gap:"1",class:"w-[170px]"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase text-text-secondary"},{default:e(()=>[...a[13]||(a[13]=[r(" Plan ",-1)])]),_:1}),t(s(ne),{modelValue:P.value,"onUpdate:modelValue":a[2]||(a[2]=d=>P.value=d),options:_,"clear-hidden":"","limit-width":""},null,8,["modelValue"])]),_:1}),t(l,{vertical:"",gap:"1",class:"w-[170px]"},{default:e(()=>[t(s(i),{size:"xs","semi-bold":"",class:"uppercase text-text-secondary"},{default:e(()=>[...a[14]||(a[14]=[r(" Status ",-1)])]),_:1}),t(s(ne),{modelValue:T.value,"onUpdate:modelValue":a[3]||(a[3]=d=>T.value=d),options:h,"clear-hidden":"","limit-width":""},null,8,["modelValue"])]),_:1})]),_:1}),t(l,{gap:"4",middle:"",wrap:"",class:"h-[48px]"},{default:e(()=>
78[se.value?(u(),A("button",{key:0,type:"button",class:"text-xs font-semibold text-text-secondary underline-offset-2 hover:text-brand-primary hover:underline",onClick:ae}," Clear filters ")):C("",!0),t(l,{gap:"3",middle:""},{default:e(()=>[t(s(Te),{modelValue:D.value,"onUpdate:modelValue":a[4]||(a[4]=d=>D.value=d)},null,8,["modelValue"]),t(s(i),{size:"sm",medium:"","no-wrap":""},{default:e(()=>[...a[15]||(a[15]=[r("Near limit only",-1)])]),_:1})]),_:1}),b("button",{type:"button",class:"rounded-full bg-gray-100 px-4 py-2 text-xs font-semibold text-text-primary transition-colors hover:bg-gray-200",onClick:Z}," Export CSV ")]),_:1})]),_:1}),t(it,{rows:Y.value,"sort-key":M.value,"sort-dir":U.value,onSort:Q,onSelect:F},null,8,["rows","sort-key","sort-dir"])]),_:1})]),_:1})):C("",!0),t(Lt,{modelValue:V.value,"onUpdate:modelValue":a[5]||(a[5]=d=>V.value=d),owner:j.value,onChanged:G},null,8,["modelValue","owner"])]),_:3})}}});export{Ft 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.