PageSourceSearch

https://admin.hellobox.co/build/assets/Home-Cq-kjDv_.js

js hellobox.co collected 2026-10-01 11:53:45 UTC 10,368 bytes, 1 lines download raw bytes

1import{B as V,A as D}from"./BulkButton-CQwaq411.js";import{I as E}from"./Icon-_6oLRAba.js";import{_ as B,e as C,u as I,a as A}from"./VueFinalModal.esm-B_ZhvDz4.js";import{L}from"./ListFilter-D5x_7sb5.js";import{B as w}from"./Button-DiH6GFIf.js";import{P as U}from"./Pill-B4RsouOn.js";import{S as F}from"./Select-BMe8l0CI.js";import{c as N}from"./confirm-DA03X5fI.js";import{F as q}from"./Field-D1qez_hM.js";import{I as Y}from"./Input-OOB3C693.js";import{O as M}from"./OptionList-C68Bz6O3.js";import{S as H}from"./SlideOver-Ch-8ZX38.js";import{a as P}from"./apiPost-Dloe6BMu.js";import{i as j}from"./isEmailValid-Cq8bst8j.js";import{g as O,x as l,j as n,k as p,q as v,t as S,v as o,E as W,y as b,F as _,u as m,s as k}from"./charts-DjP_BkTY.js";import{a as z}from"./apiDelete-DGG-oJMu.js";import{f as R}from"./formatDate-C1YYpkoX.js";import{u as G}from"./ucfirst-rWDqDg0g.js";import"./vue3-pagination.esm-Bhx_T4CS.js";import"./StateBlock-BWH1Mpfj.js";import"./control-UkHg6rIs.js";import"./stack-CqRwrtjq.js";const J={props:{roles:{type:Array,required:!1}},components:{Button:w,Field:q,Input:Y,OptionList:M,SlideOver:H},data(){return{loading:!1,visible:!1,subscriber:null,emailError:null}},mounted(){this.eventBus.on("toggle-subscriber-panel",this.toggle)},beforeUnmount(){this.eventBus.off("toggle-subscriber-panel",this.toggle)},computed:{...C(I),isSelf(){return this.subscriber!=null&&this.adminStore.getCurrUser!=null&&this.subscriber.user_id==this.adminStore.getCurrUser.id},confirmedOptions(){return[{value:!0,label:"Yes"},{value:!1,label:"No"}]},frequencyOptions(){return[{value:"weekly",label:"Weekly"},{value:"fortnightly",label:"Fortnightly"},{value:"monthly",label:"Monthly"},{value:"never",label:"Never"}]}},methods:{toggle(e){this.visible=!this.visible,this.visible&&(this.emailError=null,this.subscriber=e!=null?e.subscriber:null,this.$nextTick(()=>this.$refs.email?.$el?.select()))},close(){this.eventBus.emit("toggle-subscriber-panel")},async submit(){if(this.emailError=null,this.subscriber.email==null||!j(this.subscriber.email)){this.emailError="Please type a valid email.";return}this.loading=!0;const e=await P("/site/newsletter/save",{getWhat:"subscribers",siteId:this.subscriber.site_id,subscriber:this.subscriber},this.adminStore.getToken);this.loading=!1;const t=await e.body;if(t!=null&&t.error!=null){this.emailError=t.error;return}this.eventBus.emit("get-subscribers"),this.close(),this.eventBus.emit("notification-event",{type:"success",message:"Subscriber saved successfully"})}}},Q={key:0,class:"flex flex-col gap-ad-field"};function X(e,t,i,x,s,r){const f=n("Input"),c=n("Field"),d=n("OptionList"),h=n("Button"),y=n("SlideOver");return p(),O(y,{open:s.visible,title:"Edit subscriber",subtitle:s.subscriber!=null?s.subscriber.email:"","testid-prefix":"subscriber-panel","close-label":"Close subscriber panel","onUpdate:open":r.close},{footer:l(()=>[o(h,{variant:"primary",loading:s.loading,"data-testid":"subscriber-save",onClick:r.submit},{default:l(()=>[...t[3]||(t[3]=[b("Save",-1)])]),_:1},8,["loading","onClick"])]),default:l(()=>[s.subscriber!=null?(p(),v("div",Q,[o(c,{label:"Email",error:s.emailError},{default:l(u=>[o(f,W(u,{ref:"email",modelValue:s.subscriber.email,"onUpdate:modelValue":t[0]||(t[0]=g=>s.subscriber.email=g),type:"email",disabled:s.loading,placeholder:"[email protected]","data-testid":"subscriber-email"}),null,16,["modelValue","disabled"])]),_:1},8,["error"]),o(c,{label:"Email confirmed?",group:""},{default:l(()=>[o(d,{modelValue:s.subscriber.confirmed,"onUpdate:modelValue":t[1]||(t[1]=u=>s.subscriber.confirmed=u),type:"radio",options:r.confirmedOptions,disabled:r.isSelf,"data-testid":"subscriber-confirmed"},null,8,["modelValue","options","disabled"])]),_:1}),o(c,{label:"Newsletter frequency",group:""},{default:l(()=>[o(d,{modelValue:s.subscriber.newsletter_frequency,"onUpdate:modelValue":t[2]||(t[2]=u=>s.subscriber.newsletter_frequency=u),type:"radio",options:r.frequencyOptions,"data-testid":"subscriber-frequency"},null,8,["modelValue","options"])]),_:1})])):S("",!0)]),_:1},8,["open","subtitle","onUpdate:open"])}const Z=B(J,[["render",X]]),K={components:{AdminList:D,BulkButton:V,Button:w,Icon:E,ListFilter:L,Pill:U,Select:F,SubscriberPanel:Z},watch:{$route:{immediate:!0,handler:async function(e,t){this.resetParams(),Ob
1ject.keys(e.params).length>0&&this.setParams(e.params),this.getData()}}},data(){return{site:null,subscribers:null,failed:!1,selectedIds:[],params:{}}},async created(){this.site=this.adminStore.getCurrSite},mounted(){this.eventBus.on("get-subscribers",this.getData)},unmounted(){this.eventBus.off("get-subscribers",this.getData)},computed:{...C(I),columns(){return[{key:"email",label:"Email",sortable:!0},{key:"newsletter_frequency",label:"Frequency",sortable:!0,format:e=>G(e)},{key:"confirmed",label:"Confirmed?",sortable:!0},{key:"created_at",label:"Created",sortable:!0,format:e=>R(e,"YYYY-MM-DD HH:mm:ss","YYYY-MM-DD",!0)}]},confirmedOptions(){return[{value:"all",label:"Anyone"},{value:"approved",label:"Confirmed"},{value:"unapproved",label:"Not confirmed"}]},totalSubscribers(){return this.subscribers==null||this.subscribers.length==0?0:parseInt(this.subscribers[0].total||this.subscribers.length)}},methods:{subscriberSelectable(e){const t=this.site!=null&&e.user_id==this.site.user_id,i=this.adminStore.getCurrUser!=null&&e.user_id==this.adminStore.getCurrUser.id;return t||i?"This user is the owner of this site and cannot be deleted.":!0},openPanel(e){this.eventBus.emit("toggle-subscriber-panel",{subscriber:e})},filterChanged(e){this.paramsChanged([{key:e,value:this.params[e]},{key:"offset",value:0}])},sorted({column:e,orderType:t}){this.paramsChanged([{key:"orderBy",value:e},{key:"orderType",value:t},{key:"offset",value:0}])},updateHandler(e){this.paramsChanged([{key:"offset",value:this.params.limit*(e-1)}])},paramsChanged(e){for(let i=0;i<e.length;i++)this.params[e[i].key]=e[i].value;let t={name:"subscribers-search",params:this.getSearchRouteParams()};this.$router.push(t)},resetParams(){this.params={getWhat:"subscribers",tab:"all",siteId:this.adminStore.getCurrSite.id,orderBy:"created_at",orderType:"desc",limit:50,offset:0}},setParams(e){for(let t=0;t<Object.keys(e).length;t++){let i=Object.keys(e)[t];this.params[i]=["limit","offset"].includes(i)?parseInt(e[i]):e[i]}},getSearchRouteParams(){return{siteId:this.site.id,tab:this.params.tab,orderBy:this.params.orderBy,orderType:this.params.orderType,limit:this.params.limit,offset:this.params.offset}},async getData(){this.failed=!1,this.subscribers=null;try{const e=await A("/site/newsletter/data",this.params,this.adminStore.getToken);if(e==null){this.failed=!0;return}this.subscribers=Array.isArray(e.body)?e.body:[]}catch{this.failed=!0}},deleteSelected(){N(this.eventBus,{count:this.selectedIds.length,singular:"subscriber",body:"They stop receiving the newsletter. Their forum account, if they have one, is untouched.",onConfirm:async()=>{const t=await(await z("/site/newsletter/delete",{siteId:this.adminStore.getCurrSite.id,subscriberIds:this.selectedIds},this.adminStore.getToken)).body;if(t!=null&&t.error!=null)return{error:t.error};this.selectedIds=[],this.eventBus.emit("get-subscribers"),this.eventBus.emit("get-num-approved-unapproved"),this.eventBus.emit("notification-event",{type:"success",message:"Subscribers deleted successfully"})}})},approveSelected(){const e=this.selectedIds.length!==1;this.eventBus.emit("confirm",{destructive:!1,title:`Approve ${this.selectedIds.length} ${e?"subscribers":"subscriber"}?`,body:"They start receiving the newsletter from the next send.",confirmLabel:e?"Approve subscribers":"Approve subscriber",cancelLabel:"Not yet",onConfirm:async()=>{const i=await(await P("/site/newsletter/approve",{getWhat:"subscribers",siteId:this.adminStore.getCurrSite.id,subscriberIds:this.selectedIds},this.adminStore.getToken)).body;if(i!=null&&i.error!=null)return{error:i.error};this.selectedIds=[],this.eventBus.emit("get-subscribers"),this.eventBus.emit("get-num-approved-unapproved"),this.eventBus.emit("notification-event",{type:"success",message:"Subscribers approved successfully"})}})}}},$={class:"sr-only"},ee={class:"truncate"};function te(e,t,i,x,s,r){const f=n("Select"),c=n("ListFilter"),d=n("BulkButton"),h=n("Icon"),y=n("Pill"),u=n("Button"),g=n("AdminList"),T=n("SubscriberPanel");return p(),v(_,null,[o(g,{"selected-ids":s.selectedIds,"onUpdate:selectedIds":t[2]||(t[2]=a=>s.selectedIds=a),title:"Subscribers",noun:"subscribers","testid-prefix":"subscribers",columns:r.columns,rows:s.subscribers,total:r.totalSubscribers,limit:s.params.limit,offset:s.params.offset,"order-by":s.params.orderBy,"order-type":s.params.orderType,state:s.failed?"error":null,"row-selectable-by":r.subscriberSelectable,"empty-title":"No subscribers yet","empty-body":"People who sign up for your newsletter will appear here.",onSort:r.sorted,onPage:r.updateHandler,onOpen:r.openPanel},{filters:l(()=>[o(c,{label:"Confirmed"},{default:l(()=>[o(f,{modelValue:s.params.tab,"onUpdate:modelValue":[t[0]||(t[0]=a=>
1s.params.tab=a),t[1]||(t[1]=a=>r.filterChanged("tab"))],size:"compact",class:"w-[170px]",options:r.confirmedOptions,"data-testid":"subscribers-confirmed-filter"},null,8,["modelValue","options"])]),_:1})]),bulk:l(({selectedIds:a})=>[s.params.tab!="approved"?(p(),O(d,{key:0,"data-testid":"bulk-approve",onClick:r.approveSelected},{default:l(()=>[b(" Mark confirmed ("+m(a.length)+") ",1)]),_:2},1032,["onClick"])):S("",!0),o(d,{variant:"destructive","data-testid":"bulk-delete",onClick:r.deleteSelected},{default:l(()=>[b(" Delete "+m(a.length),1)]),_:2},1032,["onClick"])]),"col-email":l(({row:a})=>[r.subscriberSelectable(a)!==!0?(p(),v(_,{key:0},[o(h,{name:"lock",size:15,class:"shrink-0 text-ad-muted"}),k("span",$,m(r.subscriberSelectable(a)),1)],64)):S("",!0),k("span",ee,m(a.email),1)]),"col-confirmed":l(({row:a})=>[o(y,{tone:a.confirmed?"good":"neutral",dot:""},{default:l(()=>[b(m(a.confirmed?"Confirmed":"Not confirmed"),1)]),_:2},1032,["tone"])]),"error-action":l(()=>[o(u,{variant:"secondary",size:"compact","data-testid":"subscribers-retry",onClick:r.getData},{default:l(()=>[...t[3]||(t[3]=[b("Try again",-1)])]),_:1},8,["onClick"])]),_:1},8,["selected-ids","columns","rows","total","limit","offset","order-by","order-type","state","row-selectable-by","onSort","onPage","onOpen"]),o(T)],64)}const Ce=B(K,[["render",te]]);export{Ce 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.