1import{r as l,j as e,s as N}from"./index-CLTM18rh.js";import{S as F}from"./SortableGroupedList-Hif2-Fmb.js";import{u as H}from"./AdminContext-B2hLlcqc.js";import{N as T}from"./NurLesen-BKsmfvXD.js";import{a as $}from"./authFetch-u5HjDcUX.js";import{b as R}from"./bestaetige-CpNFuPQa.js";import{u as I}from"./klappzustand-DoGK2Y88.js";import{C as M}from"./chevron-right-D-hIC4R2.js";const A=o=>new Date(`${o}T12:00:00`).toLocaleDateString("de-CH",{day:"2-digit",month:"2-digit",year:"numeric"}),B=o=>o.datum_text??(o.datum_bis&&o.datum_bis!==o.datum?`${A(o.datum)} bis ${A(o.datum_bis)}`:A(o.datum)),J={neu:"neu",weg:"entfällt",geaendert:"geändert"};function G({canEdit:o}){const u=new Date().getFullYear(),[n,m]=l.useState(u),[r,S]=l.useState(null),[_,k]=I("dokumente:jahresprogramm",!1),[C,y]=l.useState(""),[D,z]=l.useState(""),[p,b]=l.useState(null),[f,j]=l.useState(null),[L,g]=l.useState(null),[w,s]=l.useState(null),i=l.useCallback(async t=>{const a=await $(`/api/admin/jahresprogramm?jahr=${t}`);if(!a.ok){g("Konnte nicht geladen werden.");return}const V=await a.json();S(V),y(V.vorwort??""),z(V.schlusstext??V.schluss_standard)},[]);l.useEffect(()=>{i(n)},[n,i]),l.useEffect(()=>{s(null)},[n]);async function d(t){g(null),j(null);const a=await $("/api/admin/jahresprogramm",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jahr:n,...t})});return{ok:a.ok,data:await a.json().catch(()=>({}))}}async function c(){b("speichern");const{ok:t,data:a}=await d({aktion:"speichern",vorwort:C,schlusstext:D});if(b(null),!t){g(String(a.error??"Hat nicht geklappt."));return}j("Gespeichert. Im PDF steht es nach dem nächsten Publizieren."),await i(n)}async function x(){b("vorschau"),g(null),j(null);const{ok:t,data:a}=await d({aktion:"vorschau"});if(b(null),!t){g(String(a.error??"Die Vorschau liess sich nicht erzeugen."));return}s({url:String(a.url),download:String(a.download_url)})}async function h(){if(!await R(`Jahresprogramm ${n} publizieren? Das PDF wird neu erzeugt und liegt danach öffentlich unter den Vereinsdokumenten.`,{jaLabel:"Publizieren"}))return;b("publizieren");const{ok:t,data:a}=await d({aktion:"publizieren"});if(b(null),!t){g(String(a.error??"Hat nicht geklappt."));return}j(`Publiziert, mit ${a.anzahl} Anlässen.`),await i(n)}if(!r)return null;const v=r.unterschiede.length>0,P="w-full rounded-lg border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-900 px-3 py-2 text-sm",E="px-3 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 disabled:opacity-40";return e.jsxs("section",{className:"mb-8 rounded-2xl border border-zinc-200 dark:border-zinc-700 overflow-hidden",children:[e.jsxs("div",{onClick:()=>k(),role:"button",tabIndex:0,onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),k())},className:`flex flex-wrap items-center gap-x-3 gap-y-1 px-4 py-3 cursor-pointer 2 bg-zinc-50 dark:bg-zinc-800/60 hover:bg-zinc-100 dark:hover:bg-zinc-800`,children:[e.jsx(M,{"aria-hidden":!0,className:`w-3.5 h-3.5 shrink-0 text-zinc-400 transition-transform ${_?"rotate-90":""}`}),e.jsxs("h2",{className:"text-[13px] font-bold uppercase tracking-wide text-zinc-600 dark:text-zinc-300",children:["Jahresprogramm ",n]}),e.jsxs("span",{className:"text-[12.5px] text-zinc-400",children:[r.eintraege.length," ",r.eintraege.length===1?"Anlass":"Anlässe"]}),r.publiziert_am?v?e.jsxs("span",{className:"text-[12.5px] font-semibold text-amber-700 dark:text-amber-400",children:["Entwurf weicht ab, ",r.unterschiede.length," ",r.unterschiede.length===1?"Ãnderung":"Ãnderungen"]}):e.jsx("span",{className:"text-[12.5px] text-green-700 dark:text-green-400",children:"publiziert und aktuell"}):e.jsx("span",{className:"text-[12.5px] text-amber-700 dark:text-amber-400",children:"noch nie publiziert"}),r.dokument&&e.jsx("a",{href:r.dokument.file_url,target:"_blank",rel:"noreferrer",onClick:t=>t.stopPropagation(),className:"ml-auto text-[12px] text-red-600 hover:underline",children:"publizierte Fassung"})]}),_&&e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[[u-1,u,u+1].map(t=>e.jsx("button",{onClick:()=>m(t),className:`px-3 py-1.5 rounded-lg text-[12.5px] font-medium border ${t===n?"bg-red-600 border-red-600 text-white":"border-zinc-300 dark:border-zinc-600 hover:border-red-400"}`,children:t},t)),r.publiziert_am&&e.jsxs("span",{className:"text-[12px] text-zinc-400",children:["Publiziert am ",new Date(r.publiziert_am).toLocaleDateString("de-CH"),r.publiziert_von?` von ${r.publiziert_von}`:""]})]}),v&&e.jsxs("div",{className:"rounded-lg border border-amber-300 dark:border-amber-900 bg-amber-50 dark:bg-amber-950/20 px-3.5 py-2.5",children:[e.jsx("p",{className:"text-[12px] font-semibold uppercase tracking-wide text-amber-800 dark:text-amber-300 mb-1",children:"Seit dem Publizieren geändert"}),e.jsx("ul",{className:"space-y-0.5",children:r.unterschiede.map((t,a)=>e.jsxs("li",{className:"text-[13px] text-amber-900 dark:text-amber-200",children:[e.jsx("span",{className:"text-[11px] uppercase tracking-wide text-amber-700 dark:text-amber-400 mr-1.5",children:J[t.art]}),t.text,t.vorher&&e.jsxs("span",{className:"text-amber-700 dark:text-amber-400",children:[" (vorher: ",t.vorher,")"]})]},a))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[12px] uppercase tracking-wide text-zinc-400 mb-1.5",children:"Inhalt aus dem Kalender"}),r.eintraege.length===0?e.jsx("p",{className:"text-[13px] text-zinc-400",children:"Noch kein Anlass markiert. Der Haken «ins Jahresprogramm» steht im Veranstaltungsformular, bei Anlässen mit Bezug zum Quartierverein."}):e.jsx("ol",{className:"space-y-0.5",children:r.eintraege.map((t,a)=>e.jsxs("li",{className:"flex flex-wrap items-baseline gap-x-2 text-[13px]",children:[e.jsxs("span",{className:"w-5 text-right tabular-nums text-zinc-400",children:[a+1,"."]}
2),e.jsx("span",{className:"text-zinc-800 dark:text-zinc-200",children:t.titel}),t.ort&&e.jsxs("span",{className:"text-zinc-400",children:["(",t.ort,")"]}),e.jsx("span",{className:"ml-auto tabular-nums text-zinc-500",children:B(t)}),t.rolle==="unterstuetzt"&&e.jsx("span",{className:"text-[11.5px] text-zinc-400",children:"unterstützt"}),t.datum_text&&e.jsx("span",{className:"text-[11.5px] text-amber-700 dark:text-amber-400",children:"Datum noch offen"})]},t.id))}),r.ausblick.length>0&&e.jsxs("p",{className:"mt-2 text-[12.5px] text-zinc-500",children:["Dazu kommt ein Ausblick auf ",n+1," mit ",r.ausblick.length," ",r.ausblick.length===1?"Anlass":"Anlässen","."]})]}),o&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[12px] uppercase tracking-wide text-zinc-400 mb-1",children:"Vorwort"}),e.jsx("textarea",{rows:4,value:C,onChange:t=>y(t.target.value),className:P,placeholder:"Ein paar Sätze vor der Liste. Leer lassen, wenn das Programm für sich stehen soll."})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[12px] uppercase tracking-wide text-zinc-400 mb-1",children:"Schlusstext"}),e.jsx("textarea",{rows:4,value:D,onChange:t=>z(t.target.value),className:P}),D.trim()!==r.schluss_standard.trim()&&e.jsx("button",{onClick:()=>z(r.schluss_standard),className:"mt-1 text-[12px] text-red-600 hover:underline",children:"auf den üblichen Text zurücksetzen"})]})]}),L&&e.jsx("p",{className:"text-[13px] text-red-600",children:L}),f&&e.jsx("p",{className:"text-[13px] text-green-700 dark:text-green-400",children:f}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{onClick:()=>{x()},disabled:p!==null||r.eintraege.length===0,className:E,children:p==="vorschau"?"Einen Momentâ¦":"Vorschau ansehen"}),o&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>{c()},disabled:p!==null,className:E,children:p==="speichern"?"Speichereâ¦":"Texte speichern"}),e.jsx("button",{onClick:()=>{h()},disabled:p!==null||r.eintraege.length===0,className:"px-3.5 py-1.5 rounded-lg bg-red-600 text-white text-[12.5px] font-semibold hover:bg-red-700 disabled:opacity-40",children:p==="publizieren"?"Publiziereâ¦":r.publiziert_am?"Neu publizieren":"Publizieren"})]})]}),w&&e.jsxs("div",{children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3 mb-1.5",children:[e.jsx("span",{className:"text-[12px] uppercase tracking-wide text-zinc-400",children:"Vorschau"}),e.jsx("a",{href:w.url,target:"_blank",rel:"noreferrer",className:"text-[12px] text-red-600 hover:underline",children:"gross öffnen"}),e.jsx("a",{href:w.download,className:"text-[12px] text-red-600 hover:underline",children:"herunterladen"}),e.jsx("button",{onClick:()=>s(null),className:"text-[12px] text-zinc-400 hover:text-zinc-600",children:"schliessen"}),e.jsx("span",{className:"text-[12px] text-zinc-400",children:"Der Link gilt zehn Minuten."})]}),e.jsx("iframe",{src:w.url,title:`Jahresprogramm ${n}`,className:"w-full h-[620px] rounded-lg border border-zinc-200 dark:border-zinc-700 bg-white"})]}),e.jsx("p",{className:"text-[11.5px] text-zinc-400",children:"Publizieren erzeugt das PDF neu und legt es unter den Vereinsdokumenten ab, öffentlich sichtbar. Die vorherige Datei bleibt bestehen, damit ein verschickter Link nicht ins Leere zeigt."})]})]})}function U(o){const u=new Map;for(const n of o)u.has(n.group_name)||u.set(n.group_name,{items:[],gso:n.group_sort_order??0}),u.get(n.group_name).items.push(n);return Array.from(u.entries()).map(([n,{items:m,gso:r}])=>({id:n,label:n,sort_order:r,items:m})).sort((n,m)=>n.sort_order-m.sort_order)}function ee({onEdit:o,onNew:u}){const{permissions:n}=H(),m=n.perm_documents,[r,S]=l.useState("public"),[_,k]=l.useState([]),[C,y]=l.useState(!0),[D,z]=l.useState(null),[p,b]=l.useState(null);async function f(){y(!0);const{data:s}=await N.from("documents").select("id, title, group_name, file_url, file_path, sort_order, group_sort_order").eq("visibility",r).order("group_sort_order").order("sort_order").order("created_at",{ascending:!1});k(U(s??[])),y(!1)}l.useEffect(()=>{f()},[r]);async function j(s){z(s);const i=_.flatMap(c=>c.items).find(c=>c.id===s),d=r==="internal"?"documents-internal":"documents";i?.file_path&&await N.storage.from(d).remove([i.file_path]),await N.from("documents").delete().eq("id",s),await f(),z(null)}async function L(s){const i=window.open("","_blank");i&&(i.opener=null);const{data:d}=await N.storage.from("documents-internal").createSignedUrl(s.file_path,3600);d?.signedUrl&&i?i.location.href=d.signedUrl:i?.close()}async function g(s,i){k(x=>x.map(h=>h.id!==s?h:{...h,items:i.map((v,P)=>({...h.items.find(E=>E.id===v),sort_order:P}))}));const c=(await Promise.all(i.map((x,h)=>N.from("documents").update({sort_order:h}).eq("id",x)))).find(x=>x.error);c?.error&&(b(`Reihenfolge nicht gespeichert: ${c.error.message}`),await f())}async function w(s){k(c=>s.map((x,h)=>({...c.find(v=>v.id===x),sort_order:h})));const d=(await Promise.all(s.map((c,x)=>N.from("documents").update({group_sort_order:x}).eq("group_name",c)))).find(c=>c.error);d?.error&&(b(`Reihenfolge nicht gespeichert: ${d.error.message}`),await f())}return e.jsxs("div",{children:[e.jsx(T,{recht:"perm_documents"}),p&&e.jsx("p",{className:"mb-4 text-sm text-red-600 dark:text-red-400",children:p}),e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("h1",{className:"text-xl font-bold text-zinc-900 dark:text-white",children:"Vereinsdokumente"}),e.jsxs("div",{className:"flex rounded-lg border border-zinc-200 dark:border-zinc-700 overflow-hidden text-sm font-medium",children:[e.jsx("button",{onClick:()=>S("public"),className:r==="public"?"px-3 py-1.5 bg-red-600 text-white":"px-3 py-1.5 bg-white dark:bg-zinc-800 text-zinc-600 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-zinc-700",children:"Exter
2n"}),e.jsx("button",{onClick:()=>S("internal"),className:r==="internal"?"px-3 py-1.5 bg-red-600 text-white":"px-3 py-1.5 bg-white dark:bg-zinc-800 text-zinc-600 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-zinc-700",children:"Intern"})]})]}),m&&e.jsxs("button",{onClick:()=>u(r),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("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 4v16m8-8H4"})}),"Neues Dokument"]})]}),r==="public"&&e.jsx(G,{canEdit:m}),C?e.jsx("div",{className:"py-20 text-center text-zinc-400 text-sm",children:"Lädtâ¦"}):e.jsx(F,{klappbar:!0,einheit:["Dokument","Dokumente"],groups:_,deletingId:D,emptyText:r==="internal"?"Noch keine internen Dokumente.":"Noch keine Dokumente.",onReorderItems:g,onReorderGroups:w,onEdit:m?o:void 0,onDelete:m?j:void 0,getItemLabel:s=>s.title,columnHeaders:e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-zinc-400 uppercase tracking-wider",children:"Titel"}),renderCells:s=>e.jsx("td",{className:"px-4 py-3 font-medium text-zinc-900 dark:text-white",children:e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx("span",{className:"truncate",children:s.title}),r==="internal"?e.jsx("button",{onClick:()=>L(s),title:"PDF öffnen",className:"shrink-0 text-red-500 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300",children:e.jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})})}):s.file_url&&e.jsx("a",{href:s.file_url,target:"_blank",rel:"noopener noreferrer",title:"PDF öffnen",className:"shrink-0 text-red-500 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300",children:e.jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})})})]})})})]})}export{ee as AdminDocuments};
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.