1import{r as a,j as e,L as De,F as nt}from"./index-DeJ875KO.js";import{a as ae}from"./authFetch-B7xfneuy.js";import{l as st,M as at,a as rt}from"./MitgliederAktivitaet-DK0s0ulD.js";import{A as it,a as lt}from"./AuditLogViewer-D0b8z2zg.js";import{A as dt}from"./Aktivitaet-DzMr9wpb.js";import{R as ct}from"./Filterleiste-D-uExNFA.js";import{m as ot}from"./massenversand-8NVIJTcX.js";import{b as J,h as ht}from"./bestaetige-CpNFuPQa.js";import{T as Ce}from"./TextWerkzeuge-BN_QhHQ_.js";import{A as ut}from"./Schritte-D5SCQWLG.js";import{V as mt}from"./VorhabenFeld-D2H27KZC.js";import{V as xt,v as pt,a as gt}from"./Vernehmlassung-JpnGIkcW.js";import{c as ne}from"./callTranslate-CalXByrY.js";import{u as bt}from"./useTranslating-KcMWmN0D.js";import{T as ft}from"./TranslateAllButton-BI0-XwsT.js";import{B as se}from"./BilingualField-BGx16lVF.js";import"./interests-BVslrRIZ.js";import"./Beteiligte-B81lcQdv.js";import"./TranslateButton-DNgF3UDg.js";const Ve=[{label:"{vorname}",text:"{vorname}",titel:"Wird beim Versand durch den Vornamen ersetzt"},{label:"{name}",text:"{name}",titel:"Wird beim Versand durch den ganzen Namen ersetzt"}],kt="Text einer Newsletter-Mail an die Mitglieder eines Quartiervereins";function jt(n,o){return n?n.startsWith("gruppe:")?`Gruppe «${n.slice(7)}»`:n.startsWith("ansicht:")?`Ansicht «${n.slice(8)}»`:o[n]?.label??n:""}const T="px-2.5 py-1.5 rounded-lg border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-900 text-sm text-zinc-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-red-500/40",Me="block text-[11px] font-semibold uppercase tracking-wide text-zinc-400 mb-1",Ae=n=>n?new Date(n).toLocaleString("de-CH",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}):"";function Ut(){const[n,o]=a.useState([]),[y,m]=a.useState({}),[i,_]=a.useState([]),[z,p]=a.useState({}),[$,k]=a.useState("geplant"),[S,x]=a.useState(null),[u,l]=a.useState(!0),[g,M]=a.useState(!1),[X,C]=a.useState(null),[K,U]=a.useState(null),V=a.useCallback(async(d=!1)=>{d||l(!0),C(null);const b=await ae("/api/admin/newsletter"),j=await b.json().catch(()=>({}));if(!b.ok){C(j.error??`Fehler ${b.status}`),l(!1);return}o(j.newsletters??[]),m(j.filter??{}),p(j.vorhaben??{}),l(!1)},[]);a.useEffect(()=>{V()},[V]),a.useEffect(()=>{if(u)return;const d=new URLSearchParams(window.location.search).get("open"),b=d?n.find(j=>j.id===d):null;b&&(k(b.status==="versendet"?"versendet":"geplant"),x(b.id),window.history.replaceState({},"",window.location.pathname))},[u,n]),a.useEffect(()=>{st().then(d=>_(d.map(b=>({id:b.id,name:b.name})))).catch(()=>{})},[]);async function A(d){M(!0),C(null);const b=await ae("/api/admin/newsletter",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)}),j=await b.json().catch(()=>({}));return M(!1),b.ok?j:(C(j.error??`Fehler ${b.status}`),null)}async function G(){const d=await A({aktion:"speichern",subject:"",body:""});d&&(await V(!0),k("geplant"),x(d.id??null))}if(u)return e.jsx("p",{className:"text-sm text-zinc-400",children:"Ladeâ¦"});const W=n.filter(d=>d.status==="entwurf"),P=n.filter(d=>d.status==="versendet"),B=$==="geplant"?W:$==="versendet"?P:[];return e.jsxs("div",{className:"max-w-4xl",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3 mb-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-zinc-900 dark:text-white",children:"Newsletter"}),e.jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400 mt-0.5",children:"E-Mails im QV-Stil an Mitglieder und Kontakte, mit Abmelde-Link in jeder Mail"})]}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsx(dt,{titel:"Newsletter",hinweis:"Entwürfe, Versände, Abmeldungen und jede einzelne Mail.",children:e.jsx(yt,{})}),e.jsx("button",{onClick:G,disabled:g,className:"px-4 py-2 rounded-lg bg-red-600 text-white text-sm font-semibold hover:bg-red-700 disabled:opacity-50",children:"+ Neuer Newsletter"})]})]}),e.jsx(ct,{aktiv:$,onWechsel:d=>{k(d),x(null)},reiter:[{key:"geplant",label:"Geplant",anzahl:W.length},{key:"versendet",label:"Versendet",anzahl:P.length}]}),X&&e.jsx("p",{className:"mb-4 text-sm text-red-600",children:X}),K&&e.jsx("p",{className:"mb-4 text-sm text-green-700 dark:text-green-400",children:K}),B.length===0&&e.jsx("p",{className:"text-sm text-zinc-400",children:$==="geplant"?"Kein Entwurf. Leg einen neuen Newsletter an.":"Noch nichts versendet."}),e.jsx("div",{className:"flex flex-col gap-3",children:B.map(d=>e.jsx(vt,{n:d,offen:S===d.id,busy:g,filterDefs:y,views:i,vorhaben:z[d.id]??[],onToggle:()=>x(S===d.id?null:d.id),onAktion:A,onGesendet:async b=>{U(b),x(null),k("versendet"),await V(!0)},onGeaendert:()=>V(!0)},d.id))})]})}function vt({n,offen:o,busy:y,filterDefs:m,views:i,vorhaben:_,onToggle:z,onAktion:p,onGesendet:$,onGeaendert:k}){const S=n.status==="versendet";return e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 overflow-hidden",children:[e.jsx("div",{onClick:z,className:"flex items-center gap-3 px-4 py-3 cursor-pointer hover:bg-zinc-50 dark:hover:bg-zinc-800/50",children:e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2",children:[e.jsx("span",{className:"font-semibold text-zinc-900 dark:text-white",children:n.subject.trim()||"(ohne Betreff)"}),e.jsx("span",{className:`px-2 py-0.5 rounded-full text-[11px] font-bold ${S?"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-400":"bg-amber-100 text-amber-700 dark:bg-amber-900/40 dark:text-amber-400"}`,children:S?"Versendet":"Entwurf"}),!S&&n.vernehmlassung_id&&e.jsx("span",{className:"px-2 py-0.5 rounded-full text-[11px] font-bold bg-zinc-100 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-300",children:"In Vernehmlassung"})]}),e.jsxs("p",{className:"text-[12px] text-zinc-400 mt-0.5",children:[S?`${Ae(n.sent_at)} von ${n.sent_by_name??"?"} · ${n.recipients_sent??0} von ${n.recipients_total??0}
1 zugestellt`+(n.filter_key?` · ${jt(n.filter_key,m)}`:""):`angelegt ${Ae(n.created_at)}${n.created_by_name?` von ${n.created_by_name}`:""}`,_.map(x=>e.jsxs("span",{children:[" · Vorhaben: ",e.jsx(De,{to:`/admin/veranstaltungsplaner?plan=${x.id}`,onClick:u=>u.stopPropagation(),className:"text-red-600 dark:text-red-400 hover:underline",children:x.title})]},x.verk_id))]})]})}),o&&(S?e.jsx(zt,{n,onAktion:p}):e.jsx(wt,{n,busy:y,filterDefs:m,views:i,onAktion:p,onGesendet:$,onGeaendert:k}))]})}function wt({n,busy:o,filterDefs:y,views:m,onAktion:i,onGesendet:_,onGeaendert:z}){const[p,$]=a.useState(n.subject),[k,S]=a.useState(n.kicker),[x,u]=a.useState(n.body),[l,g]=a.useState(n.button_label??""),[M,X]=a.useState(n.button_url??""),[C,K]=a.useState(n.subject_en??""),[U,V]=a.useState(n.kicker_en??""),[A,G]=a.useState(n.body_en??""),[W,P]=a.useState(n.button_label_en??""),{translating:B,busy:d,translate:b}=bt(),[j,xe]=a.useState(!1),pe=a.useRef(null),[Y,Q]=a.useState(null),[ge,be]=a.useState(!1),[D,Fe]=a.useState(null),fe=a.useRef(null),[ke,re]=a.useState(null),[Ke,We]=a.useState("de"),[N,Pe]=a.useState(null),[je,ve]=a.useState(!1),[O,Oe]=a.useState("mitglieder"),[E,ie]=a.useState(null),[F,R]=a.useState(new Set),[we,Re]=a.useState(!1),[Ie,le]=a.useState(""),[ze,Ne]=a.useState(!1),[ye,de]=a.useState(null),Z=O.startsWith("view:")?m.find(t=>t.id===O.slice(5))??null:null,He=Z?`gruppe:${Z.name}`:O,ee=p!==n.subject||k!==n.kicker||x!==n.body||l!==(n.button_label??"")||M!==(n.button_url??"")||C!==(n.subject_en??"")||U!==(n.kicker_en??"")||A!==(n.body_en??"")||W!==(n.button_label_en??""),I=!!(C.trim()&&A.trim()),ce={subject:p,kicker:k,body:x,button_label:l,button_url:M,subject_en:C,kicker_en:U,body_en:A,button_label_en:W};async function Ue(){xe(!0);const[t,s,c,r]=await Promise.all([ne(p,"Betreff einer Newsletter-Mail"),ne(k,"Kleine Zeile im Kopf einer Mail, ein bis zwei Wörter"),ne(x,"Text einer Newsletter-Mail an die Mitglieder eines Quartiervereins"),ne(l,"Beschriftung eines Knopfes in einer Mail")]);t&&K(t),s&&V(s),c&&G(c),r&&P(r),xe(!1)}async function oe(){const t=await i({aktion:"speichern",id:n.id,...ce});return t&&(Q("Gespeichert."),z(),Ne(!1)),!!t}async function te(){if(de(null),!Z){const h=await i({aktion:"empfaenger",filter:O,id:n.id});if(h){const f=h;ie(f.empfaenger??[]),Je(f.warteschlange??null),R(new Set)}return}let t;try{t=await rt()}catch(h){de("Gruppen brauchen Mitglieder-Leserecht: "+(h instanceof Error?h.message:"nicht lesbar"));return}const s=t.filter(h=>h.gruppen?.includes(Z.id)),c=new Map;for(const h of s)for(const f of h.persons){if(!f.email||!f.optin_newsletter)continue;const H=f.email.toLowerCase();c.has(H)||c.set(H,{person_id:f.id,membership_id:h.id,name:[f.first_name,f.last_name].filter(Boolean).join(" ")||f.email,email:f.email,lang:f.lang==="en"?"en":"de",kontakt:!!h.type?.startsWith("gast_")})}const r=await i({aktion:"versandliste",id:n.id}),v=new Set((r?.empfaenger??[]).filter(h=>h.sent_at).map(h=>h.email.toLowerCase()));ie([...c.values()].map(h=>({...h,erhalten:v.has(h.email.toLowerCase())})).sort((h,f)=>h.name.localeCompare(f.name,"de"))),R(new Set)}async function Se(){ve(!0);const t=await i({aktion:"links",entwurf:ce});ve(!1);const s=t?.links??null;return Pe(s),s}async function Ee(t){const s=await i({aktion:"vorschau",sprache:t,entwurf:ce});s?.html&&(We(t),re(s.html))}async function _e(t="de"){if(ee&&!await oe())return;await i({aktion:"test",id:n.id,sprache:t})&&(Q(t==="en"?"Englische Testmail verschickt. Schau in dein Postfach.":"Testmail verschickt. Schau in dein Postfach."),Ne(!0))}async function $e(t=!1){if(!E||ee&&!await oe())return;if(D){const w=gt(D);if(w.gewarnt&&!await J(`${w.text} 2 3Trotzdem versenden?`,{jaLabel:"Weiter",gefahr:!1}))return}const c=(await Se()??[]).filter(w=>w.stand==="kaputt");if(c.length>0&&!await J(`${c.length===1?"Ein Link funktioniert nicht":`${c.length} Links funktionieren nicht`}: 4 5`+c.map(w=>`${w.url} 6${w.grund??""} (${w.woher})`).join(` 7 8`)+` 9 10Trotzdem versenden?`,{jaLabel:"Trotzdem versenden"}))return;const r=E.filter(w=>!F.has(w.email)&&!w.erhalten);if(r.length===0){await ht("Alle Ausgewählten haben diese Ausgabe schon bekommen.");return}const v=r.filter(w=>w.lang==="en").length;if(!await J(`Newsletter «${p.trim()}» jetzt an ${r.length} ${r.length===1?"Person":"Personen"} senden? 11 12`+(t?`Das ist eine Etappe: Der Entwurf bleibt offen, die Ãbrigen kannst du danach nachziehen. 13 14`:`Damit gilt der Newsletter als versendet und lässt sich nicht mehr ändern. 15 16`+(ue>0?`ACHTUNG: ${ue} ${ue===1?"Person aus diesem Kreis hat":"Personen aus diesem Kreis haben"} die Ausgabe dann nie bekommen, weil du sie nicht angehakt hast. 17 18`:""))+(v>0?I?`Davon ${v} auf Englisch. 19 20`:`${v} davon haben Englisch eingestellt und bekommen trotzdem die deutsche Fassung. 21 22`:"")+"Der Versand lässt sich nicht rückgängig machen.")||!ot(r.length,`Newsletter ${p.trim()}`))return;const h=await i({aktion:"senden",id:n.id,teil:t,filter:He,empfaenger:r});if(!h)return;const f=h,H=f.dauer_minuten??0,tt=H>=60?`gut ${Math.round(H/60*10)/10} Stunden`.replace(".",","):`rund ${H} Minuten`;he(w=>w+1);const Te=`${f.eingereiht} Empfänger eingereiht. Der Versand läuft im Hintergrund und dauert ${tt}; du musst nicht warten.`+(f.vorher?` Früher erreicht: ${f.vorher}.`:"");t?(Q(Te),R(new Set),await te(),z()):await _(Te)}
22async function Ge(){const t=await i({aktion:"weiter",id:n.id});if(!t)return;const s=t;Q(s.grund?s.grund:`${s.verschickt} verschickt${s.gescheitert?`, ${s.gescheitert} gescheitert`:""}, ${s.offen} noch offen.`),he(c=>c+1),await te(),z()}async function Qe(){!await J("Versand anhalten? Die offenen Empfänger bleiben stehen, du kannst jederzeit weitermachen.",{jaLabel:"Anhalten"})||!await i({aktion:"pause",id:n.id})||(Q("Versand angehalten."),he(s=>s+1),await te(),z())}async function Ze(){if(!await J("Diesen Entwurf löschen?"))return;await i({aktion:"loeschen",id:n.id})&&z()}const[qe,Je]=a.useState(null),[Xe,Ye]=a.useState(null),[et,he]=a.useState(0);a.useEffect(()=>{let t=!1;async function s(){const r=await ae("/api/admin/newsletter",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({aktion:"versandstand",id:n.id})}).then(v=>v.ok?v.json():null).catch(()=>null);return!t&&r&&Ye(r),r}s();const c=setInterval(async()=>{const r=await s();r&&!r.aktiv&&r.offen===0&&clearInterval(c)},12e3);return()=>{t=!0,clearInterval(c)}},[n.id,et]);const L=(E??[]).filter(t=>!F.has(t.email)&&!t.erhalten).length,q=(E??[]).filter(t=>t.erhalten).length,ue=(E??[]).filter(t=>!t.erhalten&&F.has(t.email)).length,Le=t=>{const s=(E??[]).filter(r=>!r.erhalten),c=new Set(s.slice(0,t).map(r=>r.email));R(new Set(s.filter(r=>!c.has(r.email)).map(r=>r.email)))},me=(E??[]).filter(t=>t.lang==="en"&&!F.has(t.email)).length;return e.jsxs("div",{className:"border-t border-zinc-100 dark:border-zinc-800 px-4 py-4",children:[e.jsx(ut,{speicher:`newsletter:${n.id}`,schritte:[{key:"entwurf",label:"Entwurf",erledigt:!!(p.trim()&&x.trim()),zusatz:ee?"ungespeichert":null,inhalt:()=>e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ft,{busy:d||j,loading:j,onClick:()=>{Ue()}}),e.jsx("p",{className:"text-[12px] text-zinc-400",children:I?"Wer im Portal Englisch eingestellt hat, bekommt die englische Fassung.":"Ohne englische Fassung geht an alle die deutsche."})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsx("div",{className:"sm:col-span-2",children:e.jsx(se,{label:"Betreff",source:p,onTranslate:()=>b("subject_en",p,K,"Betreff einer Newsletter-Mail"),loading:B==="subject_en",busy:d||j,renderDE:()=>e.jsx("input",{className:`${T} w-full`,value:p,onChange:t=>$(t.target.value),placeholder:"z. B. Neues aus dem Quartierverein, Sommer 2026"}),renderEN:()=>e.jsx("input",{className:`${T} w-full`,value:C,onChange:t=>K(t.target.value),placeholder:"English subjectâ¦"})})}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(se,{label:"Kicker (kleine Zeile im roten Kopf)",source:k,onTranslate:()=>b("kicker_en",k,V,"Kleine Zeile im Kopf einer Mail, ein bis zwei Wörter"),loading:B==="kicker_en",busy:d||j,renderDE:()=>e.jsx("input",{className:`${T} w-full`,value:k,onChange:t=>S(t.target.value)}),renderEN:()=>e.jsx("input",{className:`${T} w-full`,value:U,onChange:t=>V(t.target.value),placeholder:"English kickerâ¦"})})}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[e.jsx("label",{className:Me,children:"Text"}),e.jsx("button",{type:"button",onClick:()=>be(t=>!t),className:"text-[12.5px] text-red-600 dark:text-red-400 hover:underline",children:ge?"Auswahl schliessen":"Aus Website übernehmen"})]}),ge&&e.jsx(St,{onAktion:i,busy:o,onEinfuegen:(t,s)=>{u(c=>[c.trim(),...t].filter(Boolean).join(` 23 24`)),s.length&&i({aktion:"news-verwendet",ids:s}),be(!1)}}),e.jsx(se,{stack:!0,labelEN:"Text (English)",source:x,onTranslate:()=>b("body_en",x,G,kt),loading:B==="body_en",busy:d||j,renderDE:()=>e.jsxs(e.Fragment,{children:[e.jsx(Ce,{feldRef:fe,platzhalter:Ve}),e.jsx("textarea",{ref:fe,rows:10,className:`${T} w-full resize-y font-normal`,value:x,onChange:t=>u(t.target.value),placeholder:"Einfach schreiben. Eine Leerzeile beginnt einen neuen Absatz."}),e.jsxs("p",{className:"mt-1 text-[11.5px] text-zinc-400",children:[nt," Die Mail bekommt automatisch das QV-Layout mit rotem Kopf und Abmelde-Link."," ","Die beiden Bausteine werden je Empfänger ersetzt, im Text und im Betreff."]})]}),renderEN:()=>e.jsxs(e.Fragment,{children:[e.jsx(Ce,{feldRef:pe,platzhalter:Ve}),e.jsx("textarea",{ref:pe,rows:10,className:`${T} w-full resize-y font-normal`,value:A,onChange:t=>G(t.target.value),placeholder:"English textâ¦"})]})})]}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(se,{label:"Knopf-Beschriftung (optional)",source:l,onTranslate:()=>b("button_label_en",l,P,"Beschriftung eines Knopfes in einer Mail"),loading:B==="button_label_en",busy:d||j,renderDE:()=>e.jsx("input",{className:`${T}
24 w-full`,value:l,onChange:t=>g(t.target.value),placeholder:"z. B. Zum Anlass"}),renderEN:()=>e.jsx("input",{className:`${T} w-full`,value:W,onChange:t=>P(t.target.value),placeholder:"e. g. See the event"})})}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx("label",{className:Me,children:"Knopf-Link (optional)"}),e.jsx("input",{className:`${T} w-full`,value:M,onChange:t=>X(t.target.value),placeholder:"https://8004.ch/..."}),M.trim()&&!l.trim()&&e.jsx("p",{className:"mt-1 text-[12px] text-zinc-500",children:"Ohne Beschriftung heisst der Knopf «Jetzt öffnen»."}),!M.trim()&&l.trim()&&e.jsx("p",{className:"mt-1 text-[12px] text-amber-700 dark:text-amber-400",children:"Ohne Adresse erscheint kein Knopf."})]})]}),e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-700 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-zinc-900 dark:text-white mb-1",children:"Vorhaben aus dem Planer"}),e.jsx(mt,{art:"newsletter",objektId:n.id,busy:o,eigenesSchreiben:{verknuepfen:async t=>{const s=!!await i({aktion:"vorhaben",id:n.id,plan_id:t});return s&&z(),s},loesen:async t=>{const s=!!await i({aktion:"vorhaben-loesen",verk_id:t});return s&&z(),s}}})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("button",{type:"button",disabled:o||!p.trim()||!x.trim(),onClick:()=>{Ee("de")},className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm font-medium hover:bg-zinc-50 dark:hover:bg-zinc-800 disabled:opacity-40",children:"Vorschau"}),I&&e.jsx("button",{type:"button",disabled:o,onClick:()=>{Ee("en")},className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm font-medium hover:bg-zinc-50 dark:hover:bg-zinc-800 disabled:opacity-40",children:"Vorschau englisch"}),e.jsx("button",{onClick:oe,disabled:o||!ee,className:"px-3.5 py-2 rounded-lg bg-red-600 text-white text-sm font-semibold hover:bg-red-700 disabled:opacity-40",children:"Speichern"}),e.jsx("button",{type:"button",onClick:()=>{Se()},disabled:o||je,className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm font-medium hover:bg-zinc-50 dark:hover:bg-zinc-800 disabled:opacity-40",children:je?"Prüft Linksâ¦":"Links prüfen"}),e.jsx("button",{onClick:Ze,disabled:o,className:"px-3 py-2 text-sm text-zinc-400 hover:text-red-600",children:"Löschen"}),Y&&e.jsx("span",{className:"text-[12.5px] text-green-700 dark:text-green-400",children:Y})]}),N&&e.jsxs("div",{className:"rounded-lg border border-zinc-200 dark:border-zinc-700 p-3",children:[e.jsxs("p",{className:"text-[12px] font-semibold uppercase tracking-wide text-zinc-400 mb-2",children:["Links (",N.length,")"]}),N.length===0?e.jsx("p",{className:"text-[12.5px] text-zinc-500",children:"Im Text steht keine Adresse."}):N.every(t=>t.stand==="ok")?e.jsxs("p",{className:"text-[12.5px] text-green-700 dark:text-green-400",children:["Alle ",N.length," führen irgendwohin."]}):e.jsxs("div",{className:"space-y-1.5",children:[[...N].sort((t,s)=>(t.stand==="kaputt"?0:t.stand==="unklar"?1:2)-(s.stand==="kaputt"?0:s.stand==="unklar"?1:2)).filter(t=>t.stand!=="ok").map(t=>e.jsxs("div",{className:"text-[12.5px]",children:[e.jsx("span",{className:t.stand==="kaputt"?"font-semibold text-red-600 dark:text-red-400":"font-semibold text-amber-700 dark:text-amber-400",children:t.stand==="kaputt"?"Kaputt":"Unklar"}),e.jsxs("span",{className:"text-zinc-400",children:[" · ",t.woher," · "]}),e.jsx("span",{className:"text-zinc-600 dark:text-zinc-300 break-all",children:t.url}),t.grund&&e.jsxs("span",{className:"text-zinc-500",children:[" â ",t.grund]})]},t.url)),e.jsxs("p",{className:"pt-1 text-[12px] text-zinc-400",children:[N.filter(t=>t.stand==="ok").length," weitere sind in Ordnung."," ","«Unklar» heisst nicht kaputt: Eine geschützte Seite oder ein langsamer fremder Server sieht von aussen gleich aus."]})]})]})]})},{key:"vernehmlassung",label:"Vernehmlassung",erledigt:D?.status==="abgeschlossen",uebersprungen:!D,zusatz:D?pt(D):"keine",titel:D?void 0:"Freiwillig. Versenden geht auch ohne.",inhalt:()=>e.jsx("div",{className:"space-y-4",children:e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-700 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-zinc-900 dark:text-white mb-2",children:"Vernehmlassung"}),e.jsx(xt,{bereich:"newsletter",objektTyp:"newsletter",objektId:n.id,titelVorschlag:p.trim()||"Newsletter",canEdit:!0,onStand:Fe,onGeaendert:t=>{i({aktion:"vernehmlassung",id:n.id,vernehmlassung_id:t})}})]})})},{key:"versand",label:"Versand",anzahl:L||null,inhalt:()=>e.jsxs("div",{className:"space-y-4",children:[(()=>{const t=Xe,s=qe??n.warteschlange,c=t?t.offen:s?.offen??0,r=t?t.verschickt:s?.verschickt??0,v=t?t.aktiv||t.offen>0:!!n.versand_aktiv;return!v&&r===0?null:e.jsx("div",{className:`rounded-lg border px-3.5 py-3 ${v?"border-green-300 dark:border-green-900 bg-green-50 dark:bg-green-950/20":"border-zinc-200 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900/60"}`,children:e.jsxs("div",{className:"flex items-start gap-2.5",children:[v?e.jsx("div",{className:`mt-0.5 w-4 h-4 shrink-0 rounded-full border-2 border-green-300 25 dark:border-green-900 border-t-green-600 animate-spin`}):e.jsx("div",{className:"mt-0.5 w-4 h-4 shrink-0 rounded-full bg-zinc-300 dark:bg-zinc-600"}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:`text-[13px] font-medium ${v?"text-green-900 dark:text-green-200":"text-zinc-700 dark:text-zinc-300"}`,children:[v?`Versand läuft: noch ${c} ${c===1?"Mail":"Mails"} in der Warteschlange`:"Kein Versand am Laufen.",t?.gesamt?` · ${r} von ${t.gesamt}
25 verschickt`:r>0?` · ${r} verschickt`:""]}),e.jsx("p",{className:"mt-0.5 text-[12.5px] text-zinc-500 dark:text-zinc-400",children:v?`Acht Mails alle fünf Minuten, ganz von selbst. Fertig in rund ${Math.ceil(c/8)*5} Minuten. Du kannst das Fenster schliessen.`:"Was du einreihst, verschickt der Hintergrundlauf in Schüben von acht."}),t&&(t.etappen.length>0||t.frueher>0)&&e.jsxs("ul",{className:"mt-2 flex flex-col gap-0.5 text-[12px] text-zinc-500 dark:text-zinc-400",children:[t.etappen.map(h=>e.jsxs("li",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"tabular-nums",children:new Date(h.zeit).toLocaleString("de-CH",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})}),e.jsxs("span",{children:[h.verschickt," verschickt",h.offen>0?`, ${h.offen} offen`:""]})]},h.zeit)),t.frueher>0&&e.jsxs("li",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"tabular-nums",children:"früher"}),e.jsxs("span",{children:[t.frueher," verschickt"]})]})]}),r>0&&e.jsx(De,{to:"/admin/engagement?tab=newsletter",className:"mt-2 inline-block text-[12.5px] text-red-600 hover:underline",children:"Was diese Ausgabe ausgelöst hat"}),v&&e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[e.jsx("button",{onClick:()=>{Ge()},disabled:o,className:`px-3 py-1.5 rounded-lg border border-green-600 text-green-700 26 dark:text-green-400 text-[13px] font-semibold disabled:opacity-40`,children:"Jetzt einen Schub senden"}),e.jsx("button",{onClick:()=>{Qe()},disabled:o,className:`px-3 py-1.5 rounded-lg border border-zinc-300 dark:border-zinc-600 27 text-[13px] disabled:opacity-40`,children:"Anhalten"})]})]})]})})})(),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("button",{onClick:()=>{_e("de")},disabled:o||!p.trim()||!x.trim(),className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm font-medium hover:bg-zinc-50 dark:hover:bg-zinc-800 disabled:opacity-40",children:"Testmail an mich"}),I&&e.jsx("button",{onClick:()=>{_e("en")},disabled:o,className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm font-medium hover:bg-zinc-50 dark:hover:bg-zinc-800 disabled:opacity-40",children:"Testmail englisch"}),Y&&e.jsx("span",{className:"text-[12.5px] text-green-700 dark:text-green-400",children:Y})]}),e.jsxs("div",{className:"rounded-lg border border-zinc-200 dark:border-zinc-700 p-3",children:[e.jsx("p",{className:"text-[12px] font-semibold uppercase tracking-wide text-zinc-400 mb-2",children:"Empfänger"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("select",{className:T,value:O,onChange:t=>{Oe(t.target.value),ie(null),de(null)},children:[e.jsx("optgroup",{label:"Empfängerkreise",children:Object.entries(y).filter(([,t])=>!t.verborgen).map(([t,s])=>e.jsx("option",{value:t,children:s.label},t))}),m.length>0&&e.jsx("optgroup",{label:"Mitgliedergruppen",children:m.map(t=>e.jsx("option",{value:`view:${t.id}`,children:t.name},t.id))})]}),e.jsx("button",{onClick:te,disabled:o,className:"px-3 py-1.5 rounded-lg border border-zinc-300 dark:border-zinc-600 text-[12.5px] font-medium hover:bg-zinc-50 dark:hover:bg-zinc-800 disabled:opacity-40",children:"Liste laden"}),e.jsx("span",{className:"text-[12px] text-zinc-400",children:Z?"Gruppe aus der Mitgliedertabelle; es zählen Personen mit E-Mail und Newsletter-Opt-in.":y[O]?.hinweis})]}),ye&&e.jsx("p",{className:"mt-2 text-[12.5px] text-red-600",children:ye}),E&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"mt-3 mb-1.5 text-[12.5px] text-zinc-500",children:[e.jsxs("span",{className:"font-semibold text-zinc-700 dark:text-zinc-200",children:[L," ",L===1?"Person bekommt":"Personen bekommen"," diese Etappe."]}),q>0&&e.jsxs(e.Fragment,{children:[" ",q," haben die Ausgabe schon."]}),F.size>0&&e.jsxs(e.Fragment,{children:[" ",F.size," lässt du aus."]})," ","Von ",E.length," im Kreis. Häkchen wegnehmen, um jemanden auszulassen."]}),e.jsxs("div",{className:"mb-1.5 flex flex-wrap items-center gap-2 text-[12.5px]",children:[e.jsx("span",{className:"text-zinc-400",children:"Nur die nächsten"}),e.jsx("input",{type:"number",min:1,max:9999,disabled:o,value:Ie,onWheel:t=>t.currentTarget.blur(),onChange:t=>{const s=t.target.value;le(s);const c=Number(s);Number.isFinite(c)&&c>0&&Le(c)},className:"w-16 px-2 py-0.5 rounded-md border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-900 text-zinc-900 dark:text-zinc-100",placeholder:"50"}),[10,25,50,100].map(t=>e.jsx("button",{type:"button",disabled:o,onClick:()=>{le(String(t)),Le(t)},className:"px-2 py-0.5 rounded-md border border-zinc-300 dark:border-zinc-600 hover:border-red-400 hover:text-red-600 disabled:opacity-40",children:t},t)),e.jsx("button",{type:"button",disabled:o,onClick:()=>{le(""),R(new Set)},className:"text-zinc-400 hover:text-red-600 underline underline-offset-2",children:"alle"})]}),me>0&&e.jsxs("p",{className:`mb-1.5 text-[12.5px] ${I?"text-zinc-500":"text-amber-700 dark:text-amber-400"}`,children:[me===1?"Eine Person hat im Portal Englisch eingestellt und bekommt ":`${me} Personen haben im Portal Englisch eingestellt und bekommen `,I?"die englische Fassung.":"mangels englischer Fassung die deutsche."]}),e.jsxs("div",{className:"max-h-64 overflow-y-auto rounded-lg border border-zinc-100 dark:border-zinc-800 divide-y divide-zinc-100 dark:divide-zinc-800",children:[E.filter(t=>!t.erhalten).map(t=>e.jsxs("label",{className:"flex items-center gap-2.5 px-3 py-1.5 text-[13px] curs
27or-pointer hover:bg-zinc-50 dark:hover:bg-zinc-800/50",children:[e.jsx("input",{type:"checkbox",checked:!F.has(t.email),onChange:s=>R(c=>{const r=new Set(c);return s.target.checked?r.delete(t.email):r.add(t.email),r})}),e.jsx("span",{className:"text-zinc-800 dark:text-zinc-200",children:t.name}),e.jsx("span",{className:"text-zinc-400",children:t.email}),t.lang==="en"&&e.jsx("span",{className:"px-1.5 rounded text-[11px] font-semibold bg-zinc-100 dark:bg-zinc-800 text-zinc-500",title:"Bekommt die englische Fassung, sofern es eine gibt",children:"EN"})]},t.email)),q>0&&e.jsx("div",{className:"px-3 py-1.5 bg-zinc-50 dark:bg-zinc-900/60",children:e.jsx("button",{type:"button",onClick:()=>Re(t=>!t),className:"text-[12px] text-zinc-500 hover:text-red-600 underline underline-offset-2",children:we?`${q} mit dieser Ausgabe ausblenden`:`${q} haben sie schon, anzeigen`})}),we&&E.filter(t=>t.erhalten).map(t=>e.jsxs("div",{className:"flex items-center gap-2.5 px-3 py-1.5 text-[13px] bg-zinc-50 dark:bg-zinc-900/60",children:[e.jsx("input",{type:"checkbox",checked:!1,disabled:!0,readOnly:!0,title:"Hat die Ausgabe schon bekommen"}),e.jsx("span",{className:"text-zinc-400 line-through",children:t.name}),e.jsx("span",{className:"text-zinc-400",children:t.email}),e.jsx("span",{className:"px-1.5 rounded text-[11px] font-semibold bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-400",children:"erhalten"})]},t.email)),L===0&&e.jsx("p",{className:"px-3 py-2 text-[12.5px] text-zinc-400",children:E.length===0?"Dieser Filter trifft niemanden.":"In diesem Kreis hat schon jeder die Ausgabe bekommen."})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[L>0&&e.jsx("p",{className:"mt-3 text-[12.5px] text-zinc-500",children:(()=>{const t=Math.ceil(L/8)*5;return`Dauert ${t>=60?`gut ${(Math.round(t/6)/10).toString().replace(".",",")} Stunden`:`rund ${t} Minuten`}: Der Versand läuft im Hintergrund, acht Mails alle fünf Minuten. Du kannst das Fenster schliessen.`})()}),e.jsxs("button",{onClick:()=>{$e(!0)},disabled:o||L===0||!p.trim()||!x.trim(),title:"Reiht die oben angehakten Empfänger ein. Der Entwurf bleibt offen, die Ãbrigen ziehst du danach nach.",className:"px-4 py-2 rounded-lg border border-green-600 text-green-700 dark:text-green-400 text-sm font-semibold hover:bg-green-50 dark:hover:bg-green-950/30 disabled:opacity-40",children:["Diese ",L," einreihen, weitere Etappen offen"]}),e.jsxs("button",{onClick:()=>{$e(!1)},disabled:o||L===0||!p.trim()||!x.trim(),title:ze?"Reiht die oben angehakten Empfänger ein und schliesst den Versand ab. Danach lässt sich nichts mehr nachschicken.":"Tipp: zuerst eine Testmail an dich selbst schicken",className:"px-4 py-2 rounded-lg bg-green-600 text-white text-sm font-semibold hover:bg-green-700 disabled:opacity-40",children:["Diese ",L," einreihen und ganz abschliessen"]}),!ze&&e.jsx("span",{className:"text-[12px] text-amber-700 dark:text-amber-400",children:"Noch keine Testmail verschickt."})]})]})]}),N&&e.jsxs("div",{className:"rounded-lg border border-zinc-200 dark:border-zinc-700 p-3",children:[e.jsxs("p",{className:"text-[12px] font-semibold uppercase tracking-wide text-zinc-400 mb-2",children:["Links (",N.length,")"]}),N.length===0?e.jsx("p",{className:"text-[12.5px] text-zinc-500",children:"Im Text steht keine Adresse."}):N.every(t=>t.stand==="ok")?e.jsxs("p",{className:"text-[12.5px] text-green-700 dark:text-green-400",children:["Alle ",N.length," führen irgendwohin."]}):e.jsxs("div",{className:"space-y-1.5",children:[[...N].sort((t,s)=>(t.stand==="kaputt"?0:t.stand==="unklar"?1:2)-(s.stand==="kaputt"?0:s.stand==="unklar"?1:2)).filter(t=>t.stand!=="ok").map(t=>e.jsxs("div",{className:"text-[12.5px]",children:[e.jsx("span",{className:t.stand==="kaputt"?"font-semibold text-red-600 dark:text-red-400":"font-semibold text-amber-700 dark:text-amber-400",children:t.stand==="kaputt"?"Kaputt":"Unklar"}),e.jsxs("span",{className:"text-zinc-400",children:[" · ",t.woher," · "]}),e.jsx("span",{className:"text-zinc-600 dark:text-zinc-300 break-all",children:t.url}),t.grund&&e.jsxs("span",{className:"text-zinc-500",children:[" â ",t.grund]})]},t.url)),e.jsxs("p",{className:"pt-1 text-[12px] text-zinc-400",children:[N.filter(t=>t.stand==="ok").length," weitere sind in Ordnung."," ","«Unklar» heisst nicht kaputt: Eine geschützte Seite oder ein langsamer fremder Server sieht von aussen gleich aus."]})]})]})]})}]}),ke&&e.jsx("div",{className:"fixed inset-0 z-[70] bg-black/40 flex items-center justify-center p-4",onClick:()=>re(null),children:e.jsxs("div",{onClick:t=>t.stopPropagation(),className:"w-full max-w-2xl h-[85vh] flex flex-col rounded-2xl bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-700 shadow-xl overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-5 py-3 border-b border-zinc-200 dark:border-zinc-700",children:[e.jsxs("div",{children:[e.jsxs("h3",{className:"text-base font-bold text-zinc-900 dark:text-white",children:["Vorschau",Ke==="en"?" (Englisch)":""]}),e.jsx("p",{className:"text-[12px] text-zinc-400",children:"Genau so geht die Mail raus. Der Abmelde-Link ist je Empfänger anders."})]}),e.jsx("button",{type:"button",onClick:()=>re(null),className:"text-zinc-400 hover:text-red-600 text-xl leading-none px-1",children:"Ã"})]}),e.jsx("iframe",{srcDoc:ke,sandbox:"",title:"Vorschau des Newsletters",className:"flex-1 w-full bg-white"})]})})]})}function zt({n,onAktion:o}){const[y,m]=a.useState(null);return a.useEffect(()=>{o({aktion:"versandliste",id:n.id}).then(i=>{i&&m(i.empfaenger??[])})},[n.id]),e.jsxs("div",{className:"border-t border-zinc-100 dark:border-zinc-800 px-4 py-4 space-y-3",children:[e.jsx("div",{className:"text-[13.5px] text-zinc-700 dark:text-zinc-300 whitespace-pre-wrap",children:n.body}),n.button_label&&n.button_url&&e.jsxs("p",{className:"text-[12.5px] text-zinc-500",children:["Knopf: ",n.button_label," â ",n.button_url]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[12px] font-semibold uppercase tracking-wide text-zinc-400 mb-1.5",children:"Rücklauf seit dem Versand"}),e.jsx(at,{newsletterId:n.id})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[12px] font-semibold uppercase tracking-wide text-zinc-400 mb-1.5",children:"Zugestellt an"}),y===null?e.jsx("p",{className:"text-[12.5px] text-zinc-400",children:"lädtâ¦"}):e.jsx("div",{className:"max-h-64 overflow-y-auto rounded-lg border border-zinc-100 dark:border-zinc-800 divide-y divide-zinc-100 dark:divide-zinc-800",children:y.map(i=>e.jsxs("div",{className:"flex items-center gap-2.5 px-3 py-1.5 text-[13px]",children:[e.jsx("span",{className:"text-zinc-800 dark:text-zinc-200",children:i.name??i.email}),e.jsx("span",{className:"text-zinc-400",children:i.email}),i.lang==="en"&&e.jsx("span",{className:"px-1.5 rounded text-[11px] font-semibold bg-zinc-100 dark:bg-zinc-800 text-zinc-500",title:"Auf Englisch verschickt",children:"EN"}),i.error?e.jsx("span",{className:"ml-auto text-[11.5px] text-red-600",children:i.error}):e.jsx("span",{className:"ml-auto text-[11.5px] text-green-700 dark:text-green-400",children:"zugestellt"})]},i.email))})]})]})}const Be="target_type.in.(newsletter,newsletter_abmeldung,mail_newsletter),action.eq.newsletter_sent,action.eq.newsletter_abgemeldet",Nt={newsletter_sent:"Newsletter versendet",newsletter_abgemeldet:"Abmeldung",newsletter_created:"Entwurf er
27stellt",newsletter_updated:"Entwurf bearbeitet",newsletter_deleted:"Entwurf gelöscht",mail_sent:"Mail verschickt",mail_failed:"Mail fehlgeschlagen",vernehmlassung_created:"In Vernehmlassung gegeben",vernehmlassung_updated:"Vernehmlassung geändert",vernehmlassung_deleted:"Vernehmlassung gelöscht",vernehmlassung_rueckmeldung:"Rückmeldung"};function yt(){const[n,o]=a.useState(null);if(a.useEffect(()=>{(async()=>{const i=await(await ae("/api/admin/newsletter",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({aktion:"vernehmlassung-ids"})})).json().catch(()=>({}));o(Array.isArray(i.ids)?i.ids:[])})()},[]),n===null)return e.jsx("p",{className:"text-sm text-zinc-400",children:"Lade Aktivitätâ¦"});const y=n.length>0?`${Be},target_id.in.(${n.join(",")})`:Be;return e.jsx(it,{filter:{or:y},labelFor:m=>Nt[m]??m,colorFor:m=>lt(m,{newsletter_sent:"bg-green-100 text-green-700 dark:bg-green-950/40 dark:text-green-400",newsletter_abgemeldet:"bg-amber-100 text-amber-800 dark:bg-amber-950/40 dark:text-amber-300"})})}function St({onAktion:n,busy:o,onEinfuegen:y}){const[m,i]=a.useState(null),[_,z]=a.useState(new Set);if(a.useEffect(()=>{n({aktion:"website-inhalte"}).then(u=>{const l=u;l&&(i(l),z(new Set(l.news.filter(g=>g.vorgemerkt).map(g=>`news:${g.id}`))))})},[]),!m)return e.jsx("p",{className:"mb-2 text-[12.5px] text-zinc-400",children:"Lade Website-Inhalteâ¦"});const p=[["News (vorgemerkte zuerst)",m.news],["Nächste Veranstaltungen",m.events],["Vorhaben aus dem Planer",m.plaene]],$=[...m.news,...m.events,...m.plaene],k=u=>`${u.art}:${u.id}`,S=u=>z(l=>{const g=new Set(l);return g.has(u)?g.delete(u):g.add(u),g}),x=u=>u?new Date(`${u.slice(0,10)}T12:00:00`).toLocaleDateString("de-CH"):"";return e.jsxs("div",{className:"mb-2 rounded-lg border border-zinc-200 dark:border-zinc-700 p-3 space-y-3 bg-zinc-50/60 dark:bg-zinc-800/40",children:[p.map(([u,l])=>e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-wide text-zinc-400 mb-1",children:u}),l.length===0?e.jsx("p",{className:"text-[12.5px] text-zinc-400",children:"Nichts vorhanden."}):e.jsx("ul",{className:"space-y-1",children:l.map(g=>e.jsx("li",{children:e.jsxs("label",{className:"flex items-start gap-2 text-[13px] text-zinc-800 dark:text-zinc-200 cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:_.has(k(g)),onChange:()=>S(k(g))}),e.jsxs("span",{children:[g.titel,g.datum&&e.jsxs("span",{className:"text-zinc-400",children:[" · ",x(g.datum)]}),g.vorgemerkt&&e.jsx("span",{className:"ml-1.5 px-1.5 py-0.5 rounded-md text-[10.5px] font-semibold bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300",children:"vorgemerkt"})]})]})},k(g)))})]},u)),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("button",{type:"button",disabled:o||_.size===0,onClick:()=>{const u=$.filter(l=>_.has(k(l)));y(u.map(l=>l.text),u.filter(l=>l.art==="news"&&l.vorgemerkt).map(l=>l.id))},className:"px-3 py-1.5 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 text-[12.5px] font-semibold hover:opacity-90 disabled:opacity-40",children:_.size?`${_.size} einfügen`:"Einfügen"}),e.jsx("span",{className:"text-[12px] text-zinc-400",children:"Titel, kurzer Text und Link je Stück; danach im Text kürzen oder umsortieren."})]})]})}export{Ut as AdminNewsletter};
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.