1import{_ as z}from"./AdminLayout.vue_vue_type_script_setup_true_lang-CoPJOjTU.js";import{_ as h}from"./index-BmOTFpO0.js";import{_ as k}from"./HugeiconsIcon.vue_vue_type_script_setup_true_lang-D36_Is65.js";import{_ as J}from"./AdminPageHeader.vue_vue_type_script_setup_true_lang-CJHOoPWh.js";import{_ as I}from"./Input.vue_vue_type_script_setup_true_lang-D1HhNgzQ.js";import{y as W,r as v,Q as j,d as X,c,o as m,b as o,e,h as Y,w as i,a as d,i as M,f as r,F as E,l as q,t as f,v as Z,j as P,G as ee,R as p,q as te}from"./app-RsKea8o5.js";import"./lodash-D-iDC_mF.js";import{_}from"./Label.vue_vue_type_script_setup_true_lang-CySY6CII.js";import{_ as O}from"./Textarea.vue_vue_type_script_setup_true_lang-CdtpLCUN.js";import{_ as oe}from"./Switch.vue_vue_type_script_setup_true_lang-N7ob7oHT.js";import{_ as ae,a as ne}from"./RadioGroupItem.vue_vue_type_script_setup_true_lang-DzQpEuNs.js";import{_ as se,a as ie,b as re,c as le,d as de}from"./DialogTitle.vue_vue_type_script_setup_true_lang-Dp74P03s.js";import{_ as ue}from"./DialogFooter.vue_vue_type_script_setup_true_lang-BSky3GSp.js";import{_ as me,a as ce,b as pe,c as fe,d as _e,e as be}from"./AlertDialogTitle.vue_vue_type_script_setup_true_lang-D4cQWa4w.js";import{_ as ve,a as ye}from"./AlertDialogCancel.vue_vue_type_script_setup_true_lang-CQcnfFdT.js";import{s as T}from"./index-vmwrf4-U.js";import{V as we}from"./ViewIcon-Do-_kvXx.js";import{M as xe}from"./Mail01Icon-BnQa5Zt3.js";import{L as D}from"./Loading03Icon-CHeztXX0.js";import{M as ke}from"./MailSend01Icon-Dp8jXhIV.js";import"./ImpersonationBanner.vue_vue_type_script_setup_true_lang-DGaRVNpY.js";import"./utils-Cq45lf33.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-Cgx8zpHc.js";import"./RovingFocusGroup-D3QouwLK.js";import"./useForwardExpose-DXi0eF_E.js";import"./Teleport-CpnQCY9y.js";import"./Cancel01Icon-DGojgfc9.js";import"./index-B_siYGUE.js";import"./TooltipTrigger.vue_vue_type_script_setup_true_lang-J3bpJMlW.js";import"./VisuallyHidden-Gnp4jwIA.js";import"./DropdownMenuTrigger.vue_vue_type_script_setup_true_lang-DqLmnnaC.js";import"./ArrowRight01Icon-D04wg_Dq.js";import"./index-DklSXLq-.js";import"./index-Z30Umu-o.js";import"./DropdownMenuSeparator.vue_vue_type_script_setup_true_lang-CrVuA_Y9.js";import"./useAnalytics-Bxkp3130.js";import"./useLocaleSwitcher-DjLXDJUg.js";import"./Settings01Icon-FajSHvbV.js";import"./LogoutSquare02Icon-z0F7OlYo.js";import"./Tick01Icon-CMS0_aRT.js";import"./UserMultipleIcon-BNN4OGHz.js";import"./CreditCardIcon-BTAImhZv.js";import"./Invoice01Icon-DsbBFA6t.js";import"./Shield01Icon-CKvIlKQn.js";import"./Radar01Icon-DMirgx-6.js";import"./BarChartIcon-D1jEOYPh.js";import"./PuzzleIcon-UfmhaZxq.js";import"./Video01Icon-DHVrYei2.js";import"./PlayIcon-CeODAqTp.js";import"./PlayIcon-eNaA-8sj.js";import"./Flag01Icon-BRr2gYMR.js";import"./File02Icon--_N_-4F2.js";import"./WebhookIcon-DJ7KtDbN.js";import"./Sonner.vue_vue_type_style_index_0_lang-VAYwp5ry.js";import"./useFlashToasts-50RPs8wm.js";import"./useFormControl-BRvJDsT8.js";import"./VisuallyHiddenInput-CdGkIGTW.js";import"./RovingFocusItem-OppQ6H3F.js";import"./ohash.D__AXeF1-C-E83dC9.js";import"./DialogDescription-DZJI7Kf4.js";import"./DialogTitle-CmvgSLDH.js";function ge(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"00000000-0000-4000-8000-"+Math.random().toString(16).slice(2,14).padStart(12,"0")}function Ve(){const u=W({subject:"",body_md:"",template:"plain",cta_url:"",cta_label:"",recipients_text:"",include_unknown:!1,idempotency_key:ge()}),w=v(!1);function n(){const l={subject:u.subject,body_md:u.body_md,template:u.template};return u.template==="cta"&&(l.cta_url=u.cta_url,l.cta_label=u.cta_label),l}async function x(){const{data:l}=await j.post(T("admin.broadcasts.resolveRecipients"),{recipients_text:u.recipients_text,include_unknown:u.include_unknown});return l.data}async function U(){const{data:l}=await j.post(T("admin.broadcasts.preview"),n());return l.data}async function R(){const{data:l}=await j.post(T("admin.broadcasts.sendTest"),n());return l.data}async function B(){w.value=!0;try{const{data:l}=await j.post(T("admin.broadcasts.store"),{...n(),recipients_text:u.recipients_text,include_unknown:u.include_unknown,idempotency_key:u.idempotency_key});return l.data}finally{w.value=!1}}function N(l){return l.response?.data?.errors??{}}return{form:u,submitting:w,submitResolveRecipients:x,submitPreview:U,submitSendTest:R,submitStore:B,extractValidationErrors:N}}const $e={class:"space-y-6 p-4 lg:p-8"},Ce={class:"grid gap-4"},Se={class:"text-muted-foreground mt-2 text-xs"},he=["title","onClick"],je={key:0,class:"grid gap-4 sm:grid-cols-2"},Te={class:"mt-2 flex items-center gap-2"},Ue={class:"text-muted-foreground mt-2 text-xs"},Re={class:"flex flex-wrap items-center justify-between gap-2 pt-2"},Be={class:"flex flex-wrap items-center gap-2"},Ne={key:0,class:"flex h-72 items-center justify-center"},Ae=["srcdoc"],Ie={key:0},Me={key:0},Ht=X({__name:"Create",props:{max_recipients:{},templates:{},variables:{},admin:{}},setup(u){const w=[{title:"Admin",href:"/admin/users"},{title:"Broadcasts",href:"/admin/broadcasts"},{title:"New",href:"/admin/broadcasts/create"}],{form:n,submitting:x,submitResolveRecipients:U,submitPreview:R,submitSendTest:B,submitStore:N,extractValidationErrors:l}=Ve(),y=v(!1),A=v(""),g=v(!1),V=v(!1),b=v(null),$=v(!1);async function F(s){const t=document.getElementById("body");if(!t){n.body_md=n.body_md+s;return}const a=t.selectionStart??n.body_md.length,S=t.selectionEnd??n.body_md.length;n.body_md=n.body_md.slice(0,a)+s+n.body_md.slice(S),await ee();const L=a+s.length;t.focus(),t.setSelectionRange(L,L)}function C(s){const t=l(s),a=Object.keys(t)[0];if(a){const S=t[a][0]??"Validation failed";return p.error("Form has errors",{description:S}),!0}return!1}async function H(){g.value=!0,y.value=!0,A.value="";try{const s=await R();A.value=s.html}catch(s){y.value=!1,C(s)||p.error("Preview failed",{description:"Could not render the preview. Check your inputs."})}finally{g.value=!1}}async function K(){try{const s=await B();p.success("Test sent",{description:`A test copy was queued to ${s.sent_to}.`})}catch(s){C(s)||p.error("Test send failed",{description:"Could not queue the test email."})}}async function G(){$.value=!0;try{const s=await U();if(s.would_send_count===0){p.error("No valid recipients",{description:"No matched users in the list. Enable 'include unknown' or fix the addresses."});return}if(s.exceeds_cap){p.error("Recipient cap exceeded",{description:`Limit is ${s.cap}; this list resolves to ${s.would_send_count}.`});return}b.value=s,V.value=!0}catch(s){C(s)||p.error("Could not resolve recipients",{description:"Check the recipient list and try again."})}finally{$.value=!1}}async function Q(){V.value=!1;try{const s=await N();s.idempotent_replay?p.info("Already sent",{description:"This broadcast was already queued."}):p.success("Broadcast queued",{description:"Delivery to each recipient is in progress."}),te.visit(s.redirect_url)}catch(s){C(s)||p.error("Send failed",{description:"Could not queue the broadcast."})}}return(s,t)=>(m(),c(E,null,[o(e(Y),{title:"New broadcast"}),o(z,{breadcrumbs:w},{default:i(()=>[d("div",$e,[o(e(J),{title:"New broadcast",description:"Send a one-off operational or transactional email to a specific list of users. Reply-To is fixed to [email protected]."}),d("div",Ce,[d("div",null,[o(e(_),{for:"subject"},{default:i(()=>t[10]||(t[10]=[r("Subject")])),_:1}),o(e(I),{id:"subject",modelValue:e(n).subject,"onUpdate:modelValue":t[0]||(t[0]=a=>e(n).subject=a),placeholder:"A short, descriptive subject",maxlength:"255",class:"mt-1","data-testid":"broadcast-subject"},null,8,["modelValue"])]),d("div",null,[o(e(_),{for:"body"},{default:i(()=>t[11]||(t[11]=[r("Body (Markdown)")])),_:1}),o(e(O),{id:"body",modelValue:e(n).body_md,"onUpdate:modelValue":t[1]||(t[1]=a=>e(n).body_md=a),rows:"10",placeholder:"Hi {{firstName}}, ...",class:"mt-1 font-mono text-sm","data-testid":"broadcast-body"},null,8,["modelValue"]),d("p",Se,[t[12]||(t[12]=r(" Available variables (click to insert): ")),(m(!0),c(E,null,q(s.variables,a=>(m(),c("button",{key:a.token,type:"button",title:a.description,class:"bg-muted hover:bg-muted/70 focus-visible:ring-ring ms-1 cursor-pointer rounded px-1 py-0.5 font-mono text-xs focus-visible:ring-2 focus-visible:outline-none","data-testid":"broadcast-variable-chip",onClick:S=>F(a.token)},f(a.token),9,he))),128)),t[13]||(t[13]=r(" . Raw HTML is stripped. "))])]),d("div",null,[o(e(_),null,{default:i(()=>t[14]||(t[14]=[r("Template")])),_:1}),o(e(ae),{modelValue:e(n).template,"onUpdate:modelValue":t[2]||(t[2]=a=>e(n).template=a),class:"mt-2 flex flex-wrap gap-4"},{default:i(()=>[(m(!0),c(E,null,q(s.templates,a=>(m(),c("div",{key:a.value,class:"flex items-center gap-2"},[o(e(ne),{id:`template-${a.value}`,value:a.value},null,8,["id","value"]),o(e(_),{for:`template-${a.value}`},{default:i(()=>[r(f(a.label),1)]),_:2},1032,["for"])]))),128))]),_:1},8,["modelValue"])]),e(n).template==="cta"?(m(),c("div",je,[d("div",null,[o(e(_),{for:"cta_url"},{default:i(()=>t[15]||(t[15]=[r("CTA URL")])),_:1}),o(e(I),{id:"cta_url",modelValue:e(n).cta_url,"onUpdate:modelValue":t[3]||(t[3]=a=>e(n).cta_url=a),placeholder:"https://vidow.io/dashboard",class:"mt-1"},null,8,["modelValue"])]),d("div",null,[o(e(_),{for:"cta_label"},{default:i(()=>t[16]||(t[16]=[r("CTA label")])),_:1}),o(e(I),{id:"cta_label",modelValue:e(n).cta_label,"onUpdate:modelValue":t[4]||(t[4]=a=>e(n).cta_label=a),placeholder:"Open my dashboard",maxlength:"64",class:"mt-1"},null,8,["modelValue"])])])):M("",!0),d("div",null,[o(e(_),{for:"recipients"},{default:i(()=>t[17]||(t[17]=[r(" Recipients (one per line, or comma-separated) ")])),_:1}),o(e(O),{id:"recipients",modelValue:e(n).recipients_text,"onUpdate:modelValue":t[5]||(t[5]=a=>e(n).recipients_text=a),rows:"6",placeholder:"[email protected], [email protected]",class:"mt-1 font-mono text-sm","data-testid":"broadcast-recipients"},null,8,["modelValue"]),d("div",Te,[o(e(oe),{id:"include_unknown",modelValue:e(n).include_unknown,"onUpdate:modelValue":t[6]||(t[6]=a=>e(n).include_unknown=a)},null,8,["modelValue"]),o(e(_),{for:"include_unknown",class:"text-sm font-normal"},{default:i(()=>t[18]||(t[18]=[r(" Include unknown addresses (not matched to any user) ")])),_:1})]),d("p",Ue," Max "+f(s.max_recipients)+" recipients per broadcast. ",1)]),d("div",Re,[o(e(Z),{href:s.route("admin.broadcasts.index"),class:"text-muted-foreground hover:text-foreground text-sm"},{default:i(()=>t[19]||(t[19]=[r(" â Back to broadcasts ")])),_:1},8,["href"]),d("div",Be,[o(e(h),{type:"button",variant:"outline",disabled:!e(n).subject||!e(n).body_md||g.value,onClick:H,"data-testid":"broadcast-preview-btn"},{default:i(()=>[o(k,{icon:e(we),class:"me-2 h-4 w-4"},null,8,["icon"]),t[20]||(t[20]=r(" Preview "))]),_:1},8,["disabled"]),o(e(h),{type:"button",variant:"outline",disabled:!e(n).subject||!e(n).body_md,onClick:K,"data-testid":"broadcast-send-test-btn"},{default:i(()=>[o(k,{icon:e(xe),class:"me-2 h-4 w-4"},null,8,["icon"]),r(" Send test to "+f(s.admin.email),1)]),_:1},8,["disabled"]),o(e(h),{type:"button",disabled:!e(n).subject||!e(n).body_md||!e(n).recipients_text||$.value||e(x),onClick:G,"data-testid":"broadcast-send-all-btn"},{default:i(()=>[$.value||e(x)?(m(),P(k,{key:0,icon:e(D),class:"me-2 h-4 w-4 animate-spin"},null,8,["icon"])):(m(),P(k,{key:1,icon:e(ke),class:"me-2 h-4 w-4"},null,8,["icon"])),t[21]||(t[21]=r(" Send to all "))]),_:1},8,["disabled"])])])])]),o(e(se),{open:y.value,"onUpdate:open":t[8]||(t[8]=a=>y.value=a)},{default:i(()=>[o(e(ie),{class:"max-w-3xl"},{default:i(()=>[o(e(re),null,{default:i(()=>[o(e(le),null,{default:i(()=>t[22]||(t[22]=[r("Email preview")])),_:1}),o(e(de),null,{default:i(()=>t[23]||(t[23]=[r(" Rendered server-side using the same path as the actual send. Sample first name: "),d("strong",null,"Alex",-1),r(". ")])),_:1})]),_:1}),g.value?(m(),c("div",Ne,[o(k,{icon:e(D),class:"text-muted-foreground h-6 w-6 animate-spin"},null,8,["icon"])])):(m(),c("iframe",{key:1,srcdoc:A.value,sandbox:"",class:"h-[60vh] w-full rounded-md border bg-white",title:"Broadcast preview","data-testid":"broadcast-preview-iframe"},null,8,Ae)),o(e(ue),null,{default:i(()=>[o(e(h),{variant:"outline",onClick:t[7]||(t[7]=a=>y.value=!1)},{default:i(()=>
1t[24]||(t[24]=[r(" Close ")])),_:1})]),_:1})]),_:1})]),_:1},8,["open"]),o(e(me),{open:V.value,"onUpdate:open":t[9]||(t[9]=a=>V.value=a)},{default:i(()=>[o(e(ce),null,{default:i(()=>[o(e(pe),null,{default:i(()=>[o(e(fe),null,{default:i(()=>[r(" Send to "+f(b.value?.would_send_count??0)+" recipient"+f(b.value?.would_send_count===1?"":"s")+"? ",1)]),_:1}),o(e(_e),null,{default:i(()=>[b.value?(m(),c("span",Ie,[r(f(b.value.matched_count)+" matched users, "+f(b.value.unknown_count)+" unknown addresses. ",1),!e(n).include_unknown&&b.value.unknown_count>0?(m(),c("span",Me,' Unknown addresses will be dropped (toggle "include unknown" to include them). ')):M("",!0)])):M("",!0),t[25]||(t[25]=r(" This action cannot be undone. Once confirmed, deliveries run to completion. "))]),_:1})]),_:1}),o(e(be),null,{default:i(()=>[o(e(ve),null,{default:i(()=>t[26]||(t[26]=[r("Cancel")])),_:1}),o(e(ye),{disabled:e(x),onClick:Q,"data-testid":"broadcast-confirm-send-btn"},{default:i(()=>t[27]||(t[27]=[r(" Send broadcast ")])),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"])]),_:1})],64))}});export{Ht 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.