1import{d as we,r as d,q as z,c as K,o as Ue,a as De,D as W,K as u,k as m,E as ee,B as o,u as n,G as l,A as J,z as k,Q as _,W as g,H as h,U as te,F as ze,V as Se,C as f}from"./vendor-vue-Dzwqm9Y9.js";import{a as Te,_ as y,h as X,g as Y,j as S,H as Ve}from"./index-Dg7iAOYr.js";import{u as $e}from"./useClipboard-DI2IZ1WO.js";import{g as Ee}from"./usePersistedPageSize-x0WpaIWh.js";import{_ as Ae}from"./AppLayout.vue_vue_type_script_setup_true_lang-CDGJUeC2.js";import{T as Pe}from"./TablePageLayout-BIDZwWED.js";import{D as Le}from"./DataTable-DjIYOVxu.js";import{P as oe}from"./Pagination-CXXT1YBd.js";import{_ as je}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-DqSEFy-6.js";import{S as se}from"./Select-D8cj2YCx.js";import{u as Me}from"./vendor-i18n-BuoWFzps.js";import"./vendor-misc-B-nM3tYW.js";import"./AppHeader.vue_vue_type_style_index_0_scoped_25b0c839_lang-B0lsvCqV.js";import"./LocaleSwitcher-BZZz6YQD.js";/* empty css */const Fe={class:"flex flex-wrap items-center gap-3"},Be={class:"flex-1 sm:max-w-64"},Re=["placeholder"],Ie={class:"flex flex-1 flex-wrap items-center justify-end gap-2"},Ne=["disabled","title"],qe={class:"flex items-center space-x-2"},Ge={class:"font-mono text-sm text-gray-900 dark:text-gray-100"},He=["onClick","title"],Oe={key:1,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Qe={class:"text-sm font-medium text-gray-900 dark:text-white"},Ke={class:"text-sm text-gray-600 dark:text-gray-300"},We={class:"text-sm text-gray-500 dark:text-dark-400"},Je={class:"text-sm text-gray-500 dark:text-dark-400"},Xe={class:"flex items-center space-x-1"},Ye=["onClick","title"],Ze=["onClick","title"],et=["onClick","title"],tt=["onClick","title"],ot={class:"input-label"},st={class:"ml-1 text-xs font-normal text-gray-400"},at=["placeholder"],nt={class:"input-label"},lt={class:"input-label"},rt={class:"ml-1 text-xs font-normal text-gray-400"},it={class:"input-label"},dt={class:"ml-1 text-xs font-normal text-gray-400"},ut={class:"input-label"},mt={class:"ml-1 text-xs font-normal text-gray-400"},ct=["placeholder"],pt={class:"flex justify-end gap-3"},_t=["disabled"],gt={class:"input-label"},xt={class:"input-label"},vt={class:"input-label"},bt={class:"ml-1 text-xs font-normal text-gray-400"},ft={class:"input-label"},yt={class:"input-label"},ht={class:"ml-1 text-xs font-normal text-gray-400"},kt={class:"input-label"},Ct={class:"ml-1 text-xs font-normal text-gray-400"},wt={class:"flex justify-end gap-3"},Ut=["disabled"],Dt={key:0,class:"flex items-center justify-center py-8"},zt={key:1,class:"py-8 text-center text-gray-500 dark:text-gray-400"},St={key:2,class:"space-y-3"},Tt={class:"flex items-center gap-3"},Vt={class:"flex h-8 w-8 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30"},$t={class:"text-sm font-medium text-gray-900 dark:text-white"},Et={class:"text-xs text-gray-500 dark:text-gray-400"},At={class:"text-right"},Pt={class:"text-sm font-medium text-green-600 dark:text-green-400"},Lt={key:0,class:"mt-4"},jt={class:"flex justify-end"},Zt=we({__name:"PromoCodesView",setup(Mt){const{t:s}=Me(),x=Te(),{copyToClipboard:ae}=$e(),Z=d([]),C=d(!1),T=d(!1),V=d(!1),B=d(""),w=d(null),R=z({status:""}),c=z({page:1,page_size:Ee(),total:0}),$=z({sort_by:"created_at",sort_order:"desc"}),U=d(!1),I=d(!1),E=d(!1),A=d(!1),P=d(null),L=d(null),j=d([]),N=d(!1),q=d(null),D=d(1),M=d(20),G=d(0),i=z({code:"",bonus_amount:1,max_uses:0,expires_at_str:"",notes:""}),r=z({code:"",bonus_amount:0,max_uses:0,status:"active",expires_at_str:"",notes:""}),ne=K(()=>[{value:"",label:s("admin.promo.allStatus")},{value:"active",label:s("admin.promo.statusActive")},{value:"disabled",label:s("admin.promo.statusDisabled")}]),le=K(()=>[{value:"active",label:s("admin.promo.statusActive")},{value:"disabled",label:s("admin.promo.statusDisabled")}]),re=K(()=>[{key:"code",label:s("admin.promo.columns.code")},{key:"bonus_amount",label:s("admin.promo.columns.bonusAmount"),sortable:!0},{key:"usage",label:s("admin.promo.columns.usage")},{key:"status",label:s("admin.promo.columns.status"),sortable:!0},{key:"expires_at",label:s("admin.promo.columns.expiresAt"),sortable:!0},{key:"created_at",label:s("admin.promo.columns.createdAt"),sortable:!0},{key:"actions",label:s("admin.promo.columns.actions")}]),ie=(a,e)=>e.expires_at&&new Date(e.expires_at)<new Date?"badge-danger":e.max_uses>0&&e.used_count>=e.max_uses?"badge-gray":a==="active"?"badge-success":"badge-gray",de
1=(a,e)=>e.expires_at&&new Date(e.expires_at)<new Date?s("admin.promo.statusExpired"):e.max_uses>0&&e.used_count>=e.max_uses?s("admin.promo.statusMaxUsed"):s(a==="active"?"admin.promo.statusActive":"admin.promo.statusDisabled");let v=null;const b=async()=>{v&&v.abort();const a=new AbortController;v=a,C.value=!0;try{const e=await S.promo.list(c.page,c.page_size,{status:R.status||void 0,search:B.value||void 0,sort_by:$.sort_by,sort_order:$.sort_order},{signal:a.signal});if(a.signal.aborted||v!==a)return;Z.value=e.items,c.total=e.total}catch(e){if(a.signal.aborted||v!==a||(e==null?void 0:e.name)==="AbortError"||(e==null?void 0:e.code)==="ERR_CANCELED")return;x.showError(s("admin.promo.failedToLoad")),console.error("Error loading promo codes:",e)}finally{v===a&&(C.value=!1,v=null)}};let H;const ue=()=>{clearTimeout(H),H=setTimeout(()=>{c.page=1,b()},300)},me=a=>{c.page=a,b()},ce=a=>{c.page_size=a,c.page=1,b()},pe=(a,e)=>{$.sort_by=a,$.sort_order=e,c.page=1,b()},_e=async a=>{await ae(a,s("admin.promo.copied"))&&(w.value=a,setTimeout(()=>{w.value=null},2e3))},ge=async()=>{var a,e;T.value=!0;try{await S.promo.create({code:i.code||void 0,bonus_amount:i.bonus_amount,max_uses:i.max_uses,expires_at:i.expires_at_str?Math.floor(new Date(i.expires_at_str).getTime()/1e3):void 0,notes:i.notes||void 0}),x.showSuccess(s("admin.promo.codeCreated")),U.value=!1,xe(),b()}catch(t){x.showError(((e=(a=t.response)==null?void 0:a.data)==null?void 0:e.detail)||s("admin.promo.failedToCreate"))}finally{T.value=!1}},xe=()=>{i.code="",i.bonus_amount=1,i.max_uses=0,i.expires_at_str="",i.notes=""},ve=a=>{P.value=a,r.code=a.code,r.bonus_amount=a.bonus_amount,r.max_uses=a.max_uses,r.status=a.status,r.expires_at_str=a.expires_at?Ve(Math.floor(new Date(a.expires_at).getTime()/1e3)):"",r.notes=a.notes||"",I.value=!0},O=()=>{I.value=!1,P.value=null},be=async()=>{var a,e;if(P.value){V.value=!0;try{await S.promo.update(P.value.id,{code:r.code,bonus_amount:r.bonus_amount,max_uses:r.max_uses,status:r.status,expires_at:r.expires_at_str?Math.floor(new Date(r.expires_at_str).getTime()/1e3):0,notes:r.notes}),x.showSuccess(s("admin.promo.codeUpdated")),O(),b()}catch(t){x.showError(((e=(a=t.response)==null?void 0:a.data)==null?void 0:e.detail)||s("admin.promo.failedToUpdate"))}finally{V.value=!1}}},fe=async a=>{const t=`${window.location.origin}/register?promo=${encodeURIComponent(a.code)}`;try{await navigator.clipboard.writeText(t),x.showSuccess(s("admin.promo.registerLinkCopied"))}catch{const F=document.createElement("textarea");F.value=t,document.body.appendChild(F),F.select(),document.execCommand("copy"),document.body.removeChild(F),x.showSuccess(s("admin.promo.registerLinkCopied"))}},ye=a=>{L.value=a,E.value=!0},he=async()=>{var a,e;if(L.value)try{await S.promo.delete(L.value.id),x.showSuccess(s("admin.promo.codeDeleted")),E.value=!1,L.value=null,b()}catch(t){x.showError(((e=(a=t.response)==null?void 0:a.data)==null?void 0:e.detail)||s("admin.promo.failedToDelete"))}},ke=async a=>{q.value=a,A.value=!0,D.value=1,await Q()},Q=async()=>{var a,e;if(q.value){N.value=!0,j.value=[];try{const t=await S.promo.getUsages(q.value.id,D.value,M.value);j.value=t.items,G.value=t.total}catch(t){x.showError(((e=(a=t.response)==null?void 0:a.data)==null?void 0:e.detail)||s("admin.promo.failedToLoadUsages"))}finally{N.value=!1}}},Ce=a=>{D.value=a,Q()};return Ue(()=>{b()}),De(()=>{clearTimeout(H),v==null||v.abort()}),(a,e)=>(f(),W(Ae,null,{default:u(()=>[m(Pe,null,{filters:u(()=>[o("div",Fe,[o("div",Be,[_(o("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>B.value=t),type:"text",placeholder:n(s)("admin.promo.searchCodes"),class:"input",onInput:ue},null,40,Re),[[g,B.value]])]),m(se,{modelValue:R.status,"onUpdate:modelValue":e[1]||(e[1]=t=>R.status=t),options:ne.value,class:"w-36",onChange:b},null,8,["modelValue","options"]),o("div",Ie,[o("button",{onClick:b,disabled:C.value,class:"btn btn-secondary",title:n(s)("common.refresh")},[m(y,{name:"refresh",size:"md",class:J(C.value?"animate-spin":"")},null,8,["class"])],8,Ne),o("button",{onClick:e[2]||(e[2]=t=>U.value=!0),class:"btn btn-primary"},[m(y,{name:"plus",size:"md",class:"mr-1"}),h(" "+l(n(s)("admin.promo.createCode")),1)])])])]),table:u(()=>[m(Le,{columns:re.value,data:Z.value,loading:C.value,"server-side-sort":!0,"default-sort-key":"created_at","default-sort-order":"desc",onSort:pe},{"cell-code":u(({value:t})=>[o("div",qe,[o("code",Ge,l(t),1),o("button",{onClick:p=>_e(t),class:J(["flex items-center transition-colors",w.value===t?"text-green-500":"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"]),title:w.value===t?n(s)("admin.promo.copied"):n(s)("keys.copyToClipboard")},[w.value!==t?(f(),W(y,{key:0,name:"copy",size:"sm","stroke-width":2})):(f(),k("svg",Oe,[...e[20]||(e[20]=[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"},null,-1)])]))],10,He)])]),"cell-bonus_amount":u(({value:t})=>[o("span",Qe," $"+l(t.toFixed(2)),1)]),"cell-usage":u(({row:t})=>[o("span",Ke,l(t.used_count)+" / "+l(t.max_uses===0?"â":t.max_uses),1)]),"cell-status":u(({value:t,row:p})=>[o("span",{class:J(["badge",ie(t,p)])},l(de(t,p)),3)]),"cell-expires_at":u(({value:t})=>[o("span",We,l(t?n(X)(t):n(s)("admin.promo.neverExpires")),1)]),"cell-created_at":u(({value:t})=>[o("span",Je,l(n(X)(t)),1)]),"cell-actions":u(({row:t})=>[o("div",Xe,[o("button",{onClick:p=>fe(t),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-green-50 hover:text-green-600 dark:hover:bg-green-900/20 dark:hover:text-green-400",title:n(s)("admin.promo.copyRegisterLink")},[m(y,{name:"link",size:"sm"})],8,Ye),o("button",{onClick:p=>ke(t),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-blue-50 hover:text-blue-600 dar
1k:hover:bg-blue-900/20 dark:hover:text-blue-400",title:n(s)("admin.promo.viewUsages")},[m(y,{name:"eye",size:"sm"})],8,Ze),o("button",{onClick:p=>ve(t),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:hover:bg-dark-600 dark:hover:text-gray-300",title:n(s)("common.edit")},[m(y,{name:"edit",size:"sm"})],8,et),o("button",{onClick:p=>ye(t),class:"flex flex-col items-center gap-0.5 rounded-lg p-1.5 text-gray-500 transition-colors hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-900/20 dark:hover:text-red-400",title:n(s)("common.delete")},[m(y,{name:"trash",size:"sm"})],8,tt)])]),_:1},8,["columns","data","loading"])]),pagination:u(()=>[c.total>0?(f(),W(oe,{key:0,page:c.page,total:c.total,"page-size":c.page_size,"onUpdate:page":me,"onUpdate:pageSize":ce},null,8,["page","total","page-size"])):ee("",!0)]),_:1}),m(Y,{show:U.value,title:n(s)("admin.promo.createCode"),width:"normal",onClose:e[9]||(e[9]=t=>U.value=!1)},{footer:u(()=>[o("div",pt,[o("button",{type:"button",onClick:e[8]||(e[8]=t=>U.value=!1),class:"btn btn-secondary"},l(n(s)("common.cancel")),1),o("button",{type:"submit",form:"create-promo-form",disabled:T.value,class:"btn btn-primary"},l(T.value?n(s)("common.creating"):n(s)("common.create")),9,_t)])]),default:u(()=>[o("form",{id:"create-promo-form",onSubmit:te(ge,["prevent"]),class:"space-y-4"},[o("div",null,[o("label",ot,[h(l(n(s)("admin.promo.code"))+" ",1),o("span",st,"("+l(n(s)("admin.promo.autoGenerate"))+")",1)]),_(o("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>i.code=t),type:"text",class:"input font-mono uppercase",placeholder:n(s)("admin.promo.codePlaceholder")},null,8,at),[[g,i.code]])]),o("div",null,[o("label",nt,l(n(s)("admin.promo.bonusAmount")),1),_(o("input",{"onUpdate:modelValue":e[4]||(e[4]=t=>i.bonus_amount=t),type:"number",step:"0.01",min:"0",required:"",class:"input"},null,512),[[g,i.bonus_amount,void 0,{number:!0}]])]),o("div",null,[o("label",lt,[h(l(n(s)("admin.promo.maxUses"))+" ",1),o("span",rt,"("+l(n(s)("admin.promo.zeroUnlimited"))+")",1)]),_(o("input",{"onUpdate:modelValue":e[5]||(e[5]=t=>i.max_uses=t),type:"number",min:"0",class:"input"},null,512),[[g,i.max_uses,void 0,{number:!0}]])]),o("div",null,[o("label",it,[h(l(n(s)("admin.promo.expiresAt"))+" ",1),o("span",dt,"("+l(n(s)("common.optional"))+")",1)]),_(o("input",{"onUpdate:modelValue":e[6]||(e[6]=t=>i.expires_at_str=t),type:"datetime-local",class:"input"},null,512),[[g,i.expires_at_str]])]),o("div",null,[o("label",ut,[h(l(n(s)("admin.promo.notes"))+" ",1),o("span",mt,"("+l(n(s)("common.optional"))+")",1)]),_(o("textarea",{"onUpdate:modelValue":e[7]||(e[7]=t=>i.notes=t),rows:"2",class:"input",placeholder:n(s)("admin.promo.notesPlaceholder")},null,8,ct),[[g,i.notes]])])],32)]),_:1},8,["show","title"]),m(Y,{show:I.value,title:n(s)("admin.promo.editCode"),width:"normal",onClose:O},{footer:u(()=>[o("div",wt,[o("button",{type:"button",onClick:O,class:"btn btn-secondary"},l(n(s)("common.cancel")),1),o("button",{type:"submit",form:"edit-promo-form",disabled:V.value,class:"btn btn-primary"},l(V.value?n(s)("common.saving"):n(s)("common.save")),9,Ut)])]),default:u(()=>[o("form",{id:"edit-promo-form",onSubmit:te(be,["prevent"]),class:"space-y-4"},[o("div",null,[o("label",gt,l(n(s)("admin.promo.code")),1),_(o("input",{"onUpdate:modelValue":e[10]||(e[10]=t=>r.code=t),type:"text",class:"input font-mono uppercase"},null,512),[[g,r.code]])]),o("div",null,[o("label",xt,l(n(s)("admin.promo.bonusAmount")),1),_(o("input",{"onUpdate:modelValue":e[11]||(e[11]=t=>r.bonus_amount=t),type:"number",step:"0.01",min:"0",required:"",class:"input"},null,512),[[g,r.bonus_amount,void 0,{number:!0}]])]),o("div",null,[o("label",vt,[h(l(n(s)("admin.promo.maxUses"))+" ",1),o("span",bt,"("+l(n(s)("admin.promo.zeroUnlimited"))+")",1)]),_(o("input",{"onUpdate:modelValue":e[12]||(e[12]=t=>r.max_uses=t),type:"number",min:"0",class:"input"},null,512),[[g,r.max_uses,void 0,{number:!0}]])]),o("div",null,[o("label",ft,l(n(s)("admin.promo.status")),1),m(se,{modelValue:r.status,"onUpdate:modelValue":e[13]||(e[13]=t=>r.status=t),options:le.value},null,8,["modelValue","options"])]),o("div",null,[o("label",yt,[h(l(n(s)("admin.promo.expiresAt"))+" ",1),o("span",ht,"("+l(n(s)("common.optional"))+")",1)]),_(o("input",{"onUpdate:modelValue":e[14]||(e[14]=t=>r.expires_at_str=t),type:"datetime-local",class:"input"},null,512),[[g,r.expires_at_str]])]),o("div",null,[o("label",kt,[h(l(n(s)("admin.promo.notes"))+" ",1),o("span",Ct,"("+l(n(s)("common.optional"))+")",1)]),_(o("textarea",{"onUpdate:modelValue":e[15]||(e[15]=t=>r.notes=t),rows:"2",class:"input"},null,512),[[g,r.notes]])])],32)]),_:1},8,["show","title"]),m(Y,{show:A.value,title:n(s)("admin.promo.usageRecords"),width:"wide",onClose:e[18]||(e[18]=t=>A.value=!1)},{footer:u(()=>[o("div",jt,[o("button",{type:"button",onClick:e[17]||(e[17]=t=>A.value=!1),class:"btn btn-secondary"},l(n(s)("common.close")),1)])]),default:u(()=>[N.value?(f(),k("div",Dt,[m(y,{name:"refresh",size:"lg",class:"animate-spin text-gray-400"})])):j.value.length===0?(f(),k("div",zt,l(n(s)("admin.promo.noUsages")),1)):(f(),k("div",St,[(f(!0),k(ze,null,Se(j.value,t=>{var p;return f(),k("div",{key:t.id,class:"flex items-center justify-between rounded-lg border border-gray-200 p-3 dark:border-dark-600"},[o("div",Tt,[o("div",Vt,[m(y,{name:"user",size:"sm",class:"text-green-600 dark:text-green-400"})]),o("div",null,[o("p",$t,l(((p=t.user)==null?void 0:p.email)||n(s)("admin.promo.userPrefix",{id:t.user_id})),1),o("p",Et,l(n(X)(t.used_at)),1)])]),o("div",At,[o("span",Pt," +$"+l(t.bonus_amount.toFixed(2)),1)])])}),128)),G.value>M.value?(f(),k("div",Lt,[m(oe,{page:D.value,total:G.value,"page-size":M.value,"onUpdate:page":Ce,"onUpdate:pageSize":e[16]||(e[16]=t=>{M.value=t,D.value=1,Q()})},null,8,["page","total","page-size"])])):ee("",!0)]))]),_:1},8,["show","title"]),m(je,{show:E.value,title:n(s)("admin.promo.deleteCode"),message:n(s)("admin.promo.deleteCodeConfirm"),"confirm-text":n(s)("common.delete"),"cancel-text":n(s)("common.cancel"),danger:"",onConfirm:he,onCancel:e[19]||(e[19]=t=>E.value=!1)},null,8,["show","title","message","confirm-text","cancel-text"])]),_:1}))}});
1export{Zt 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.