1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AdminEventAreasMap-DfxFTN4M.js","assets/index-DeJ875KO.js","assets/index-CZfeF0t2.css","assets/TileLayer-DcggYX2f.js","assets/CircleMarker-CLSFBseY.js","assets/hooks-C5QpEg7c.js"])))=>i.map(i=>d[i]); 2import{r as o,j as e,s as p,P as C,M as T,_ as $,u as V}from"./index-DeJ875KO.js";import{R as G}from"./Filterleiste-D-uExNFA.js";import{b as _}from"./bestaetige-CpNFuPQa.js";import{T as R}from"./trash-2-DJk0pE7p.js";async function w(c,l={}){const{data:{session:a}}=await p.auth.getSession();return fetch(c,{...l,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a?.access_token??""}`,...l.headers??{}}})}function P(){const[c,l]=o.useState(null),[a,r]=o.useState(!0),[i,d]=o.useState(null),[x,h]=o.useState(null),[u,g]=o.useState(!1);o.useEffect(()=>{let s=!1;return w("/api/admin/events/display-settings").then(m=>m.ok?m.json():Promise.reject(new Error(`HTTP ${m.status}`))).then(m=>{s||(l(m),r(!1))}).catch(m=>{s||(h(m instanceof Error?m.message:String(m)),r(!1))}),()=>{s=!0}},[]);async function n(s,m){if(!c)return;d(s),h(null),g(!1);const v=await w("/api/admin/events/display-settings",{method:"PATCH",body:JSON.stringify({[s]:m})});if(v.ok)l(await v.json()),g(!0),setTimeout(()=>g(!1),2500);else{const j=await v.json().catch(()=>({}));h(j.error??"Speichern fehlgeschlagen.")}d(null)}return a?e.jsx("div",{className:"py-20 text-center text-zinc-400 text-sm",children:"Lädtâ¦"}):x||!c?e.jsx("div",{className:"py-20 text-center text-red-500 text-sm",children:x??"Laden fehlgeschlagen."}):e.jsxs("div",{className:"max-w-2xl",children:[e.jsx("h1",{className:"text-xl font-bold text-zinc-900 dark:text-white mb-2",children:"Einstellungen"}),e.jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400 mb-6",children:"Steuert, wie Veranstaltungen auf der öffentlichen Website angezeigt werden. Die Angaben bleiben in der Verwaltung immer sichtbar und bearbeitbar."}),e.jsxs("div",{className:"bg-white dark:bg-zinc-900 rounded-xl border border-zinc-200 dark:border-zinc-800 divide-y divide-zinc-100 dark:divide-zinc-800",children:[e.jsx(N,{title:"Veranstalter anzeigen",on:c.show_organizer,saving:i==="show_organizer",onToggle:s=>n("show_organizer",s),descOn:"Der Veranstalter wird auf der öffentlichen Veranstaltungsseite angezeigt.",descOff:"Der Veranstalter wird auf der Website ausgeblendet (in der Verwaltung weiterhin sichtbar)."}),e.jsx(N,{title:"«Als Nächstes»-Vorschau anzeigen",on:c.show_featured,saving:i==="show_featured",onToggle:s=>n("show_featured",s),descOn:"Die hervorgehobene «Als Nächstes»-Leiste mit den nächsten Veranstaltungen erscheint oben auf der Agenda.",descOff:"Die «Als Nächstes»-Leiste ist ausgeblendet â die Agenda beginnt direkt mit der Wochenliste."})]}),u&&e.jsx("p",{className:"mt-3 text-sm text-green-600 dark:text-green-400",children:"Gespeichert â"})]})}function N({title:c,on:l,saving:a,onToggle:r,descOn:i,descOff:d}){return e.jsxs("div",{className:"p-5 flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h2",{className:"text-base font-semibold text-zinc-900 dark:text-white",children:c}),e.jsx("span",{className:`px-2 py-0.5 rounded-full text-xs font-medium ${l?"bg-green-100 dark:bg-green-950/40 text-green-700 dark:text-green-400":"bg-zinc-100 dark:bg-zinc-800 text-zinc-500"}`,children:l?"Aktiv":"Inaktiv"})]}),e.jsx("p",{className:"text-sm text-zinc-600 dark:text-zinc-400",children:l?i:d})]}),e.jsx("label",{className:"flex items-center gap-2 cursor-pointer flex-shrink-0",children:e.jsx("input",{type:"checkbox",checked:l,disabled:a,onChange:x=>r(x.target.checked),className:"w-4 h-4 rounded border-zinc-300 text-red-600 focus:ring-red-500"})})]})}const B=o.lazy(()=>$(()=>import("./AdminEventAreasMap-DfxFTN4M.js"),__vite__mapDeps([0,1,2,3,4,5])));async function z(c,l={}){const{data:{session:a}}=await p.auth.getSession();return fetch(c,{...l,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a?.access_token??""}`,...l.headers??{}}})}const y=[47.3785,8.52];function D(){const[c,l]=o.useState([]),[a,r]=o.useState(!0),[i,d]=o.use
2State(null),[x,h]=o.useState(!1),[u,g]=o.useState(null),n=o.useCallback(async()=>{r(!0);const t=await z("/api/admin/event-areas").then(f=>f.json()).catch(()=>[]);l(Array.isArray(t)?t:[]),r(!1)},[]);o.useEffect(()=>{n()},[n]);function s(t){g(t),setTimeout(()=>g(null),2500)}function m(t){d({id:t.id,name:t.name,center_lat:t.center_lat,center_lng:t.center_lng,radius_m:t.radius_m,active:t.active})}function v(){d({id:null,name:"",center_lat:y[0],center_lng:y[1],radius_m:350,active:!0})}function j(t,f){d(b=>b&&{...b,center_lat:t,center_lng:f})}async function S(){if(!i)return;if(!i.name.trim()){s("Name fehlt.");return}h(!0);const t={name:i.name.trim(),center_lat:i.center_lat,center_lng:i.center_lng,radius_m:i.radius_m,active:i.active},f=i.id?await z(`/api/admin/event-areas/${i.id}`,{method:"PUT",body:JSON.stringify(t)}):await z("/api/admin/event-areas",{method:"POST",body:JSON.stringify({...t,sort_order:c.length+1})});if(h(!1),!f.ok){const b=await f.json().catch(()=>({}));s(b.error??"Speichern fehlgeschlagen.");return}s("Gespeichert."),d(null),await n()}async function A(t){await _(`Gebiet «${t.name}» entfernen?`)&&(await z(`/api/admin/event-areas/${t.id}`,{method:"DELETE"}),i?.id===t.id&&d(null),await n(),s("Entfernt."))}async function E(t){l(f=>f.map(b=>b.id===t.id?{...b,active:!b.active}:b)),await z(`/api/admin/event-areas/${t.id}`,{method:"PUT",body:JSON.stringify({active:!t.active})})}return e.jsxs("div",{className:"max-w-5xl",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2 gap-3 flex-wrap",children:[e.jsx("h1",{className:"text-xl font-bold text-zinc-900 dark:text-white",children:"Quartier-Gebiete"}),e.jsxs("button",{onClick:v,className:"flex items-center gap-2 px-4 py-2 bg-red-600 hover:bg-red-700 text-white text-sm font-medium rounded-lg transition-colors",children:[e.jsx(C,{className:"w-4 h-4"})," Neues Gebiet"]})]}),e.jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400 mb-5",children:"Quartier-Teilgebiete (Hard, Bäckeranlage, Europaallee â¦) für den Ortsfilter der Veranstaltungen. Jedes Gebiet ist ein Kreis (Mittelpunkt + Radius); eine Veranstaltung wird automatisch dem nächstgelegenen Gebiet zugeordnet, in dessen Kreis ihr Standort fällt. Mittelpunkt setzen: Gebiet auswählen, dann auf die Karte klicken."}),e.jsxs("div",{className:"grid lg:grid-cols-[1fr_320px] gap-5 items-start",children:[e.jsx("div",{className:"rounded-xl overflow-hidden border border-zinc-200 dark:border-zinc-700 h-[480px] order-2 lg:order-1",children:e.jsx(o.Suspense,{fallback:e.jsx("div",{className:"h-full bg-zinc-100 dark:bg-zinc-800 flex items-center justify-center text-zinc-400 text-sm",children:"Karte wird geladenâ¦"}),children:e.jsx(B,{areas:c,draft:i,onMapClick:j})})}),e.jsxs("div",{className:"order-1 lg:order-2 space-y-4",children:[i&&e.jsxs("div",{className:"rounded-xl border border-red-200 dark:border-red-900/50 bg-red-50/40 dark:bg-red-950/20 p-4 space-y-3",children:[e.jsx("p",{className:"text-xs font-semibold text-red-700 dark:text-red-400 uppercase tracking-wider",children:i.id?"Gebiet bearbeiten":"Neues Gebiet"}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs font-medium text-zinc-500 mb-1",children:"Name"}),e.jsx("input",{className:"w-full px-3 py-2 text-sm rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-800 text-zinc-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-red-500",value:i.name,onChange:t=>d({...i,name:t.target.value}),placeholder:"z. B. Bäckeranlage"})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-xs font-medium text-zinc-500 mb-1",children:["Radius: ",i.radius_m," m"]}),e.jsx("input",{type:"range",min:100,max:800,step:10,value:i.radius_m,onChange:t=>d({...i,radius_m:Number(t.target.value)}),className:"w-full accent-red-600"})]}),e.jsxs("p",{className:"text-xs text-zinc-500 dark:text-zinc-400 flex items-center gap-1",children:[e.jsx(T,{className:"w-3 h-3"}),i.center_lat.toFixed(4),", ",i.center_lng.toFixed(4)," â auf Karte klicken zum Verschieben"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300",children:[e.jsx("input",{type:"checkbox",checked:i.active,onChange:t=>d({...i,active:t.target.checked}),className:"w-4 h-4 rounded border-zinc-300 text-red-600 focus:ring-red-500"}),"Aktiv (im Ortsfilter sichtbar)"]}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("button",{onClick:S,disabled:x,className:"px-4 py-2 text-sm font-medium bg-red-600 hover:bg-red-700 disabled:opacity-50 text-white rounded-lg transition-colors",children:x?"Speichertâ¦":"Speichern"}),e.jsx("button",{onClick:()=>d(null),className:"px-3 py-2 text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900",children:"Abbrechen"})]})]}),e.jsx("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 divide-y divide-zinc-100 dark:divide-zinc-800",children:a?e.jsx("div",{className:"py-10 text-center text-zinc-400 text-sm",children:"Lädtâ¦"}):c.length===0?e.jsx("div",{className:"py-10 text-center text-zinc-400 text-sm",children:"Noch keine Gebiete."}):c.map(t=>e.jsxs("div",{className:`flex items-center gap-2 px-3 py-2 ${i?.id===t.id?"bg-red-50/50 dark:bg-red-950/20":""}`,children:[e.jsxs("button",{onClick:()=>m(t),className:"flex-1 min-w-0 text-left",children:[e.jsx("span",{className:`text-sm font-medium ${t.active?"text-zinc-900 dark:text-white":"text-zinc-400 line-through"}`,children:t.name}),e.jsxs("span",{className:"text-xs text-zinc-400 ml-2",children:[t.radiu
2s_m," m"]})]}),e.jsx("button",{onClick:()=>E(t),title:t.active?"Deaktivieren":"Aktivieren",className:`text-[10px] font-medium px-2 py-0.5 rounded-full ${t.active?"bg-green-100 dark:bg-green-950/40 text-green-700 dark:text-green-400":"bg-zinc-100 dark:bg-zinc-800 text-zinc-500"}`,children:t.active?"Aktiv":"Inaktiv"}),e.jsx("button",{onClick:()=>A(t),title:"Entfernen",className:"text-zinc-400 hover:text-red-500 p-1",children:e.jsx(R,{className:"w-3.5 h-3.5"})})]},t.id))})]})]}),u&&e.jsx("div",{className:"fixed bottom-6 left-1/2 -translate-x-1/2 bg-zinc-900 text-white text-sm font-medium px-5 py-3 rounded-lg shadow-lg z-50",children:u})]})}const k="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";function O(){const[c,l]=o.useState([]),[a,r]=o.useState(!1),[i,d]=o.useState(null),x=o.useCallback(async()=>{const{data:n,error:s}=await p.from("event_richtlinien").select("*").order("sort_order");s?d(s.message):l(n??[])},[]);o.useEffect(()=>{x()},[x]);async function h(n,s){r(!0);const{error:m}=await p.from("event_richtlinien").update({...s,updated_at:new Date().toISOString()}).eq("id",n);if(r(!1),m){d(m.message);return}await x()}async function u(){r(!0);const{error:n}=await p.from("event_richtlinien").insert({titel:"Neue Richtlinie",sort_order:c.length*10+10});if(r(!1),n){d(n.message);return}await x()}async function g(n){await _(`Richtlinie «${n.titel}» löschen?`)&&(r(!0),await p.from("event_richtlinien").delete().eq("id",n.id),r(!1),await x())}return e.jsxs("div",{className:"max-w-3xl",children:[e.jsx("h1",{className:"text-2xl font-bold text-zinc-900 dark:text-white mb-1",children:"Richtlinien"}),e.jsxs("div",{className:"flex items-start justify-between gap-3 mb-4",children:[e.jsxs("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 max-w-xl",children:["Was der Quartierverein unterstützt und was nicht. ",e.jsx("span",{className:"font-semibold text-green-700 dark:text-green-400",children:"Ja"})," heisst: spricht dafür. ",e.jsx("span",{className:"font-semibold text-red-600 dark:text-red-400",children:"Nein"})," heisst: schliesst aus. Die Regeln stehen so im öffentlichen Antragsformular und dienen zugleich dem Auto-Import als Filter. Entschieden wird nie automatisch."]}),e.jsx("button",{onClick:u,disabled:a,className:"shrink-0 px-3 py-1.5 rounded-lg bg-red-600 text-white text-[12.5px] font-semibold hover:bg-red-700 disabled:opacity-40",children:"+ Richtlinie"})]}),i&&e.jsx("p",{className:"mb-3 text-sm text-red-600",children:i}),e.jsx("div",{className:"flex flex-col gap-2",children:c.map(n=>e.jsxs("div",{className:`rounded-xl border p-3 ${n.aktiv?"border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900":"border-dashed border-zinc-300 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900/40 opacity-70"}`,children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mb-2",children:[e.jsxs("div",{className:"inline-flex rounded-lg border border-zinc-300 dark:border-zinc-600 overflow-hidden",children:[e.jsx("button",{type:"button",disabled:a,onClick:()=>n.art!=="kriterium"&&h(n.id,{art:"kriterium"}),className:`px-3 py-1.5 text-[12.5px] font-bold ${n.art==="kriterium"?"bg-green-600 text-white":"text-zinc-500 hover:bg-zinc-50 dark:hover:bg-zinc-800"}`,children:"Ja"}),e.jsx("button",{type:"button",disabled:a,onClick:()=>n.art!=="ausschluss"&&h(n.id,{art:"ausschluss"}),className:`px-3 py-1.5 text-[12.5px] font-bold border-l border-zinc-300 dark:border-zinc-600 ${n.art==="ausschluss"?"bg-red-600 text-white":"text-zinc-500 hover:bg-zinc-50 dark:hover:bg-zinc-800"}`,children:"Nein"})]}),e.jsxs("select",{className:k,value:n.gilt_fuer,disabled:a,onChange:s=>h(n.id,{gilt_fuer:s.target.value}),children:[e.jsx("option",{value:"beide",children:"Ãberall"}),e.jsx("option",{value:"antrag",children:"Nur Anträge"}),e.jsx("option",{value:"import",children:"Nur Import"})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-[12.5px] text-zinc-600 dark:text-zinc-300",children:[e.jsx("input",{type:"checkbox",checked:n.aktiv,disabled:a,onChange:s=>h(n.id,{aktiv:s.target.checked})}),"aktiv"]}),e.jsx("button",{onClick:()=>g(n),disabled:a,className:"ml-auto text-[12px] text-zinc-400 hover:text-red-600",children:"Löschen"})]}),e.jsx("input",{className:`${k} w-full font-semibold mb-1.5`,defaultValue:n.titel,disabled:a,placeholder:"Kurz, ohne «keine»: Politische Veranstaltungen",onBlur:s=>s.target.value.trim()&&s.target.value!==n.titel&&h(n.id,{titel:s.target.value.trim()})}),e.jsx("textarea",{rows:2,className:`${k} w-full resize-y`,defaultValue:n.beschreibung??"",disabled:a,placeholder:"Erklärung, auch für Grenzfälle. Steht so im öffentlichen Formular.",onBlur:s=>s.target.value!==(n.beschreibung??"")&&h(n.id,{beschreibung:s.target.value||null})}),e.jsx(L,{r:n,busy:a,onSpeichern:s=>h(n.id,s)})]},n.id))})]})}function L({r:c,busy:l,onSpeichern:a}
2){const r=c.stichworte??[],[i,d]=o.useState("");function x(){const u=i.trim().toLowerCase();if(!u||r.some(g=>g.toLowerCase()===u)){d("");return}a({stichworte:[...r,u]}),d("")}function h(u){a({stichworte:r.filter(g=>g!==u)})}return e.jsxs("div",{className:"mt-2 rounded-lg bg-zinc-50 dark:bg-zinc-800/50 p-2.5",children:[e.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-wide text-zinc-400 mb-1.5",children:"Beispiele"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[r.map(u=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-md text-[12px] bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-700 text-zinc-700 dark:text-zinc-200",children:[u,e.jsx("button",{onClick:()=>h(u),disabled:l,title:"Beispiel entfernen",className:"text-zinc-400 hover:text-red-600 leading-none",children:"Ã"})]},u)),e.jsx("input",{className:`${k} w-44 py-1 text-[12.5px]`,value:i,disabled:l,placeholder:r.length===0?"z. B. Gottesdienst":"weiteres Beispiel",onChange:u=>d(u.target.value),onKeyDown:u=>{u.key==="Enter"&&(u.preventDefault(),x())},onBlur:x})]}),e.jsx("p",{className:"mt-1.5 text-[11.5px] text-zinc-400",children:c.art==="ausschluss"?"Steht eines dieser Wörter im Titel einer importierten Veranstaltung, wird sie automatisch verworfen und gar nicht erst zur Prüfung angeboten. Sie bleibt in der Warteschlange unter «verworfen» sichtbar und lässt sich zurückholen. Zusammensetzungen zählen mit: «Gottesdienst» fängt auch «Kreis-Gottesdienst».":"Nur zur Erklärung. Was dafür spricht, lässt sich nicht an einem Wort festmachen, das beurteilt die Prüfung im Einzelfall."})]})}function M({start:c}){const[l]=V(),a=l.get("tab"),[r,i]=o.useState(c??(["anzeige","gebiete","richtlinien"].includes(a)?a:"anzeige"));return e.jsxs("div",{className:"max-w-5xl",children:[e.jsxs("div",{className:"mb-4",children:[e.jsx("h1",{className:"text-2xl font-bold text-zinc-900 dark:text-white",children:"Einstellungen Veranstaltungen"}),e.jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400 mt-0.5",children:"Anzeige im Kalender, Quartier-Gebiete und die Richtlinien, was in den Kalender gehört."})]}),e.jsx(G,{aktiv:r,onWechsel:i,reiter:[{key:"anzeige",label:"Anzeige"},{key:"gebiete",label:"Quartier-Gebiete"},{key:"richtlinien",label:"Richtlinien"}]}),r==="anzeige"&&e.jsx(P,{}),r==="gebiete"&&e.jsx(D,{}),r==="richtlinien"&&e.jsx(O,{})]})}export{M as AdminEventEinstellungen};
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.