PageSourceSearch

https://8004.ch/assets/AdminExterneKontakte-B4Ly2jJZ.js

js 8004.ch collected 2026-09-25 07:32:01 UTC 12,433 bytes, 1 lines download raw bytes

1import{r,j as e}from"./index-CLTM18rh.js";import{k as z}from"./keinAutofill-D6mTwSM6.js";import{a as N}from"./authFetch-u5HjDcUX.js";import{b as A}from"./bestaetige-CpNFuPQa.js";import{A as K}from"./Aktivitaet-Blgc-LAk.js";import{D as F}from"./DialogHuelle-BTuNtT3I.js";import{A as V}from"./AuditLogViewer-CgrB1xOp.js";import"./Filterleiste-Dovi1-bW.js";const S={mail:"beim Schreiben entstanden",eventplan:"aus dem Veranstaltungsplaner",kontaktformular:"aus dem Kontaktformular",shop:"aus dem Shop",hand:"von Hand erfasst"},y=[{key:"kontakt",label:"Antwort erwünscht",hinweis:"Fragen? Antworte einfach auf diese Mail, sie kommt direkt bei uns an."},{key:"veranstaltungen",label:"Veranstaltungskalender",hinweis:"Was im Quartier läuft, steht in unserem Kalender."},{key:"portal_sie",label:"Mitgliederportal (Sie)",hinweis:"Ihre Daten können Sie jederzeit selbst im Mitgliederportal verwalten."},{key:"portal",label:"Mitgliederportal (Du)",hinweis:"Deine Daten kannst du jederzeit selbst im Mitgliederportal verwalten."},{key:"mitglied_werden",label:"Mitglied werden",hinweis:"Noch nicht Mitglied beim Quartierverein Kreis 4? Hier geht es zur Anmeldung."},{key:"keiner",label:"ohne Fuss",hinweis:"Nur die Vereinszeile, sonst nichts."}],f="w-full rounded-lg border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-900 px-3 py-2 text-sm";function P(){const[t,m]=r.useState(null),[u,h]=r.useState([]),[k,d]=r.useState(null),[p,g]=r.useState(""),[j,l]=r.useState(null),[x,i]=r.useState(null),c=r.useCallback(async()=>{const n=await N("/api/admin/kontakte-extern");if(!n.ok){d("Die Kontakte konnten nicht geladen werden.");return}const o=await n.json();m(o.kontakte??[]),h(o.vorschlaege??[]),d(null)},[]);if(r.useEffect(()=>{c()},[c]),t===null)return e.jsx("p",{className:"text-sm text-zinc-400",children:"Lade Kontakte…"});const a=p.trim().toLowerCase(),b=a.length<2?t:t.filter(n=>[n.email,n.name,n.organisation,n.notiz].some(o=>(o??"").toLowerCase().includes(a)));return e.jsxs("div",{className:"max-w-4xl",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3 mb-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-zinc-900 dark:text-white",children:"Externe Kontakte"}),e.jsx("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 mt-0.5",children:"Leute ausserhalb der Mitgliederdatenbank: Veranstalter, Behörden, andere Vereine, Lieferanten. Mit Verlauf wie bei einem Mitglied."})]}),e.jsx(K,{titel:"Externe Kontakte",hinweis:"Angelegte und geänderte Kontakte sowie die Mails an sie.",children:e.jsx(V,{filter:{or:"target_type.eq.externer_kontakt,target_type.eq.mail_kontakte"},labelFor:n=>({externer_kontakt_created:"Kontakt angelegt",externer_kontakt_updated:"Kontakt geändert",externer_kontakt_deleted:"Kontakt entfernt",mail_sent:"Mail versendet",mail_failed:"Mail gescheitert"})[n]??n,colorFor:n=>n.endsWith("_deleted")||n==="mail_failed"?"bg-red-500":n==="mail_sent"?"bg-red-400":"bg-zinc-400",limit:300})})]}),k&&e.jsx("p",{className:"mb-3 text-sm text-red-600",children:k}),e.jsxs("div",{className:"flex flex-wrap gap-2 mb-4",children:[e.jsx("button",{onClick:()=>i({email:""}),className:"px-3.5 py-2 rounded-lg bg-red-600 text-white text-sm font-semibold hover:bg-red-700",children:"Mail schreiben"}),t.length>4&&e.jsx("input",{value:p,onChange:n=>g(n.target.value),placeholder:"Name, Organisation oder Adresse",className:"flex-1 min-w-[180px] rounded-lg border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-900 px-3 py-2 text-sm"})]}),u.length>0&&e.jsxs("div",{className:"mb-4 rounded-xl border border-zinc-200 dark:border-zinc-700 p-3.5",children:[e.jsxs("p",{className:"text-[11.5px] uppercase tracking-wide text-zinc-400 mb-1.5",children:["Adressen, die wir schon haben (",u.length,")"]}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:u.slice(0,12).map(n=>e.jsx("button",{onClick:()=>i(n),title:`${S[n.herkunft]??n.herkunft} · ${n.email}`,className:"px-2 py-1 rounded-md border border-dashed border-zinc-300 dark:border-zinc-600 text-[12.5px] text-zinc-600 dark:text-zinc-300 hover:border-red-400 hover:text-red-600",children:n.name||n.email},n.email))}),e.jsx("p",{className:"mt-2 text-[11.5px] text-zinc-400",children:"Aus dem Veranstaltungsplaner und dem Shop. Ein Klick öffnet die Mail; der Kontakt entsteht beim Senden."})]}),b.length===0?e.jsx("p",{className:"rounded-xl border border-dashed border-zinc-300 dark:border-zinc-700 p-6 text-[13.5px] text-zinc-500",children:t.length===0?"N
1och keine Kontakte. Schreib jemandem, dann steht er hier — mit allem, was hin und her ging.":"Nichts gefunden."}):e.jsx("div",{className:"flex flex-col gap-3",children:b.map(n=>e.jsx(E,{k:n,offen:j===n.id,onToggle:()=>l(o=>o===n.id?null:n.id),onSchreiben:()=>i(n),onReload:c,setFehler:d},n.id))}),x&&e.jsx(L,{an:x,onClose:()=>i(null),onGesendet:async()=>{i(null),await c()}})]})}function E({k:t,offen:m,onToggle:u,onSchreiben:h,onReload:k,setFehler:d}){const[p,g]=r.useState(!1),[j,l]=r.useState(!1),[x,i]=r.useState("");async function c(a){g(!0),d(null);const b=await N("/api/admin/kontakte-extern",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return g(!1),b.ok?(await k(),!0):(d((await b.json().catch(()=>({}))).error??"Hat nicht geklappt."),!1)}return e.jsxs("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900",children:[e.jsxs("button",{onClick:u,className:"w-full text-left p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2.5 gap-y-1",children:[e.jsx("h2",{className:"text-[15px] font-bold text-zinc-900 dark:text-white",children:t.name||t.email}),t.organisation&&e.jsx("span",{className:"text-[13px] text-zinc-500",children:t.organisation}),t.name&&e.jsx("span",{className:"text-[12px] text-zinc-400",children:t.email}),e.jsx("span",{className:"ml-auto text-[12px] text-zinc-400",children:m?"zuklappen":"öffnen"})]}),e.jsxs("div",{className:"mt-1 flex flex-wrap gap-x-3 gap-y-0.5 text-[12px] text-zinc-400",children:[e.jsxs("span",{children:[t.mails," ",t.mails===1?"Mail":"Mails"]}),t.rueckmeldungen>0&&e.jsxs("span",{className:"text-green-700 dark:text-green-400",children:[t.rueckmeldungen," ",t.rueckmeldungen===1?"Rückmeldung":"Rückmeldungen"]}),e.jsxs("span",{children:["zuletzt ",t.zuletzt.slice(0,10)]}),e.jsx("span",{children:S[t.herkunft]??t.herkunft})]}),t.notiz&&e.jsx("p",{className:"mt-1 text-[13px] text-zinc-500",children:t.notiz})]}),m&&e.jsxs("div",{className:"px-4 pb-4 border-t border-zinc-100 dark:border-zinc-800 pt-3",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{onClick:h,className:"px-2.5 py-1.5 rounded-lg bg-red-600 text-white text-[12.5px] font-semibold hover:bg-red-700",children:"Mail schreiben"}),e.jsx("button",{onClick:()=>l(a=>!a),className:"px-2.5 py-1.5 rounded-lg border border-zinc-300 dark:border-zinc-600 text-[12.5px] font-medium hover:border-red-400 hover:text-red-600",children:"Rückmeldung erfassen"}),e.jsx("button",{disabled:p,onClick:async()=>{await A(`«${t.name||t.email}» entfernen?`,{jaLabel:"Entfernen"})&&c({aktion:"loeschen",id:t.id})},className:"ml-auto px-2 py-1.5 text-[12.5px] text-zinc-400 hover:text-red-600",children:"Entfernen"})]}),j&&e.jsxs("div",{className:"mt-3",children:[e.jsx("textarea",{value:x,onChange:a=>i(a.target.value),rows:3,autoFocus:!0,placeholder:"Was hat sich die Person gemeldet?",className:f}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[e.jsx("button",{disabled:p||x.trim().length<3,onClick:async()=>{await c({aktion:"rueckmeldung",kontakt_id:t.id,text:x.trim()})&&(i(""),l(!1))},className:"px-3 py-1.5 rounded-lg bg-red-600 text-white text-[13px] font-semibold disabled:opacity-40",children:"Erfassen"}),e.jsx("button",{onClick:()=>{l(!1),i("")},className:"px-3 py-1.5 rounded-lg border border-zinc-300 dark:border-zinc-600 text-[13px]",children:"Abbrechen"})]})]}),t.verlauf.length>0&&e.jsx("ol",{className:"mt-4 relative border-l border-zinc-200 dark:border-zinc-700 ml-1.5 pl-4 flex flex-col gap-3",children:t.verlauf.map(a=>e.jsxs("li",{className:"relative",children:[e.jsx("span",{className:`absolute -left-[21px] top-1.5 w-2.5 h-2.5 rounded-full ring-2 ring-white dark:ring-zinc-900 ${a.kind==="mail_sent"?"bg-red-500":a.kind==="rueckmeldung"?"bg-violet-500":"bg-zinc-400"}`}),e.jsxs("div",{className:"flex items-baseline gap-2 flex-wrap",children:[e.jsx("span",{className:"text-[13px] font-semibold text-zinc-900 dark:text-zinc-100",children:a.kind==="mail_sent"?"Mail versendet":a.kind==="rueckmeldung"?"Rückmeldung":"Notiz"}),e.jsx("span",{className:"text-[11.5px] text-zinc-400 tabular-nums",children:a.created_at.slice(0,10)})]}),e.jsx("p",{className:"text-[13px] text-zinc-600 dark:text-zinc-400 mt-0.5 whitespace-pre-line",children:a.summary}),a.meta?.mail?.body&&e.jsxs("details",{className:"mt-1.5",children:[e.jsx("summary",{className:"cursor-pointer text-[12px] text-red-600 dark:text-red-400 hover:underline select-none",children:"Vollständiger Text"}),e.jsx("div",{className:"mt-1.5 rounded-lg border border-zinc-200 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-800/60 p-3",children:e.jsx("pre",{className:"whitespace-pre-wrap font-sans text-[12.5px] leading-relaxed text-zinc-700 dark:text-zinc-300 m-0",children:a.meta.mail.body})})]}),e.jsx("p",{className:"text-[11.5px] text-zinc-400 mt-1",children:a.actor_label??(a.actor==="extern"?"die andere Seite":"Vorstand")})]},a.id))})]})]})}function L({an:t,onClose:m,onGesendet:u}){const[h,k]=r.useState(t.email),[d,p]=r.useState(t.name??""),[g,j]=r.useState(t.organisation??""),[l,x]=r.useState(""),[i,c]=r.useState(""),[a,b]=r.useState("kontakt"),[n,o]=r.useState(!1),[w,v]=r.useState(null);async function C(){o(!0),v(null);const s=await N("/api/admin/kontakte-extern",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({aktion:"mail",email:h.trim(),name:d.trim(),organisation:g.trim(),subject:l.trim(),body:i.trim(),fuss:a})});if(o(!1),!s.ok){v((await s.json().catch(()=>({}))).error??"Senden fehlgeschlagen.");return}await u()}const M=h.includes("@")&&l.trim().length>0&&i.trim().length>=3,_=l.trim().length>0||i.trim().length>0;return e.jsx(F,{schmutzig:_,onClose:m,breite:"max-w-xl",children:e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"text-base font-bold text-zinc-900 dark:text-white",children:"Mail an eine externe Adresse"}),e.jsx("p",{className:"text-[12.5px] text-zinc-500 dark:text-zinc-400 mt-1 mb-3 leading-relaxed",children:"Geht in der Vereinsvorlage raus, wie an ein Mitglied. Antworten landen bei dir, du bekommst eine Blindkopie, und alles steht danach im Verlauf dieses Kontakts."}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsx("input",{value:h,onChange:s=>k(s.target.value),autoFocus:!t.email,...z("zieladresse"),placeholder:"[email protected]",className:`${f} col-span-2`}),e.jsx("input",{value:d,onChange:s=>p(s.target.value),...z("bezeichnung"),placeholder:"Name (freiwillig)",className:f}),e.jsx("input",{value:g,onChange:s=>j(s.target.value),...z("koerperschaft"),placeholder:"Organisation (freiwillig)",className:f})]}
1),e.jsx("input",{value:l,onChange:s=>x(s.target.value),autoFocus:!!t.email,...z("betreffzeile"),placeholder:"Betreff",className:`${f} mt-2`}),e.jsx("textarea",{value:i,onChange:s=>c(s.target.value),rows:9,...z("nachrichtentext"),placeholder:"Leerzeile = neuer Absatz",className:`${f} mt-2 leading-relaxed`}),e.jsxs("div",{className:"mt-2 rounded-lg border border-zinc-200 dark:border-zinc-700 px-3 py-2.5",children:[e.jsx("p",{className:"text-[13px] font-medium text-zinc-700 dark:text-zinc-300 mb-1.5",children:"Fuss der Mail"}),e.jsx("select",{value:a,onChange:s=>b(s.target.value),className:f,children:y.map(s=>e.jsx("option",{value:s.key,children:s.label},s.key))}),e.jsx("p",{className:"mt-1.5 text-[12px] text-zinc-500 dark:text-zinc-400",children:y.find(s=>s.key===a)?.hinweis})]}),w&&e.jsx("p",{className:"mt-3 text-sm text-red-600",children:w}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-2",children:[e.jsx("button",{disabled:n||!M,onClick:C,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:n?"Sende…":"Senden"}),e.jsx("button",{onClick:m,className:"px-3.5 py-2 rounded-lg border border-zinc-300 dark:border-zinc-600 text-sm",children:"Abbrechen"})]})]})})}export{P as AdminExterneKontakte};

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.