PageSourceSearch

https://aspirebm.co.uk/assets/EventManager-CteFQ1P-.js

js aspirebm.co.uk collected 2026-10-05 05:16:01 UTC 8,895 bytes, 2 lines download raw bytes

1import{j as e,ai as _,_ as G,b as J,n as Q,i as W,C as Z,al as z,ah as R,ag as I,q as A,aq as D,k as ee,X as se}from"./vendor-ui-NH_ejEPi.js";import{r as h,L as N}from"./vendor-react-BaFKGkTN.js";import{x as te,u as b,z as ae,A as f,K as $,l as g,F as y,H as re}from"./vendor-firebase-lOQEsijG.js";import{u as ie,d as c}from"./index-BB7qmMf9.js";function ce(){const{userRole:L}=ie(),j=L==="aspire-admin",[w,q]=h.useState([]),[M,P]=h.useState(!0),[E,C]=h.useState(null),[v,u]=h.useState({}),[F,k]=h.useState({}),[o,p]=h.useState(null);h.useEffect(()=>{S()},[]);const S=async()=>{try{const s=te(b(c,"events"),ae("date","asc")),a=(await f(s)).docs.map(n=>({id:n.id,...n.data()}));q(a);const t={};for(const n of a){const l=await f(b(c,`events/${n.id}/registrations`));t[n.id]=l.size}k(t)}catch(s){console.error("Error fetching events:",s)}finally{P(!1)}},U=async s=>{try{const a=(await f(b(c,`events/${s}/registrations`))).docs.map(t=>({id:t.id,...t.data()}));a.sort((t,n)=>new Date(t.registeredAt).getTime()-new Date(n.registeredAt).getTime()),u(t=>({...t,[s]:a}))}catch(i){console.error("Error fetching registrations:",i)}},B=async s=>{E===s?C(null):(C(s),v[s]||await U(s))},T=async(s,i,a)=>{try{await y(g(c,`events/${s}/registrations/${i}`),{arrived:!a}),u(t=>({...t,[s]:t[s].map(n=>n.id===i?{...n,arrived:!a}:n)}))}catch(t){console.error("Error updating arrival status:",t)}},H=async(s,i)=>{if(confirm("Are you sure you want to remove this attendee?"))try{await $(g(c,`events/${s}/registrations/${i}`)),await y(g(c,"events",s),{registrationCount:re(-1)}),u(a=>({...a,[s]:a[s].filter(t=>t.id!==i)})),k(a=>({...a,[s]:Math.max(0,(a[s]||0)-1)}))}catch(a){console.error("Failed to delete registration:",a),alert("Error deleting registration. Please try again.")}},O=(s,i)=>{p({eventId:s,regId:i.id,name:i.name,email:i.email,school:i.school})},V=()=>{p(null)},K=async()=>{if(!o)return;const{eventId:s,regId:i,name:a,email:t,school:n}=o;if(!a.trim()||!t.trim()){alert("Name and email are required.");return}try{await y(g(c,`events/${s}/registrations/${i}`),{name:a,email:t,school:n}),u(l=>({...l,[s]:l[s].map(r=>r.id===i?{...r,name:a,email:t,school:n}:r)})),p(null)}catch(l){console.error("Failed to update registration:",l),alert("Error updating registration. Please try again.")}},X=(s,i)=>{const a=v[s]||[],t=["Name","Email","School/Organisation","Registered","Arrived"],n=a.map(m=>[m.name,m.email,m.school,new Date(m.registeredAt).toLocaleDateString(),m.arrived?"Yes":"No"]),l=[t,...n].map(m=>m.join(",")).join(`
2`),r=new Blob([l],{type:"text/csv"}),x=URL.createObjectURL(r),d=document.createElement("a");d.href=x,d.download=`${i.replace(/\s+/g,"-")}-registrations.csv`,d.click()},Y=async s=>{confirm("Are you sure you want to delete this event?")&&(await $(g(c,"events",s)),S())};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between items-center mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-slate-900",children:"Events"}),!j&&e.jsxs(N,{to:"/admin/events/new",className:"bg-brand-pink text-white px-4 py-2 rounded-lg flex items-center gap-2 hover:bg-pink-600 transition-colors",children:[e.jsx(_,{size:18}),"Create New Event"]})]}),e.jsx("div",{className:"bg-white rounded-xl shadow-sm border border-slate-200 overflow-hidden",children:M?e.jsx("div",{className:"p-8 text-center text-slate-500",children:"Loading events..."}):w.length===0?e.jsxs("div",{className:"p-12 text-center text-slate-500",children:[e.jsx("p",{className:"mb-4",children:"No scheduled events."}),e.jsx(N,{to:"/admin/events/new",className:"text-brand-pink hover:underline",children:"Schedule an event"})]}):e.jsx("div",{className:"divide-y divide-slate-100",children:w.map(s=>{const i=F[s.id]||0,a=Math.max(0,s.slots-i),t=E===s.id,n=v[s.id]||[],l=n.filter(r=>r.arrived).length;return e.jsxs("div",{children:[e.jsx("div",{className:"p-5",children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h3",{className:"font-bold text-lg text-slate-900 mb-2",children:s.title}),e.jsxs("div",{className:"flex flex-wrap gap-4 text-sm text-slate-600",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(G,{size:14,className:"text-brand-pink"}),e.jsxs("span",{children:[new Date(s.date).toLocaleDateString()," at ",s.time]})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(J,{size:14,className:"text-brand-pink"}),e.jsx("span",{children:s.location})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(Q,{size:14,className:"text-brand-pink"}),e.jsxs("span",{children:[e.jsx("strong",{children:i})," registered · ",e.jsx("strong",{children:a})," places remaining"]})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:()=>B(s.id),className:"flex items-center gap-1 text-sm text-brand-blue hover:underline font-medium p-1",children:[t?e.jsx(W,{size:16}):e.jsx(Z,{size:16}),t?"Hide":"Attendees"]}),!j&&e.jsxs(e.Fragment,{children:[e.jsx(N,{to:`/admin/events/edit/${s.id}`,className:"text-slate-400 hover:text-brand-blue p-1 ml-2",children:e.jsx(z,{size:16})}),e.jsx("button",{onClick:()=>Y(s.id),className:"text-slate-400 hover:text-red-500 p-1",children:e.jsx(R,{size:16})})]})]})]})}),t&&e.jsxs("div",{className:"bg-slate-50 border-t border-slate-100 p-5",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h4",{className:"font-semibold text-slate-700 text-sm",children:["Registered Attendees (",i,")",n.length>0&&e.jsxs("span",{className:"text-slate-400 font-normal ml-2",children:["· ",l," arrived"]})]}),n.length>0&&e.jsxs("button",{onClick:()=>X(s.id,s.title),className:"text-xs text-brand-blue hover:underline flex items-center gap-1",children:[e.jsx(I,{size:12})," Export CSV"]})]}),n.length===0?e.jsx("p",{className:"text-sm text-slate-400",children:"No registrations yet."}):e.jsx("div",{className:"overflow-x-auto font-sans",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-xs uppercase text-slate-400 border-b border-slate-200",children:[e.jsx("th",{className:"py-2 pr-4 w-10",children:"Arrived"}),e.jsx("th",{className:"py-2 pr-4",children:"Name"}),e.jsx("th",{className:"py-2 pr-4",children:"Email"}),e.jsx("th",{className:"py-2 pr-4",children:"School"}),e.jsx("th",{className:"py-2 pr-4",children:"Registered"}),e.jsx("th",{className:"py-2 text-right",children:"Actions"})]})}),e.jsx("tbody",{className:"divide-y divide-slate-100",children:n.map(r=>{const x=o?.regId===r.id;return e.jsxs("tr",{className:"hover:bg-slate-50/50 transition-colors",children:[e.jsx("td",{className:"py-2.5 pr-4",children:j?e.jsx("div",{className:r.arrived?"text-green-500":"text-slate-300",children:r.arrived?e.jsx(A,{size:20}):e.jsx(D,{size:20})}):e.jsx("button",{onClick:()=>T(s.id,r.id,!!r.arrived),className:`transition-colors ${r.arrived?"text-green-500":"text-slate-300 hover:text-slate-500"}`,title:r.arrived?"Mark as not arrived":"Mark as arrived",disabled:x,children:r.arrived?e.jsx(A,{size:20}):e.jsx(D,{size:20})})}),e.jsx("td",{className:"py-2.5 pr-4",children:x?e.jsx("input",{type:"text",className:"px-2 py-1 border border-slate-300 rounded text-sm w-full font-medium",value:o.name,onChange:d=>p({...o,name:d.target.value})}
2):e.jsx("span",{className:`font-medium ${r.arrived?"text-slate-900":"text-slate-600"}`,children:r.name})}),e.jsx("td",{className:"py-2.5 pr-4 text-slate-500",children:x?e.jsx("input",{type:"email",className:"px-2 py-1 border border-slate-300 rounded text-sm w-full",value:o.email,onChange:d=>p({...o,email:d.target.value})}):r.email}),e.jsx("td",{className:"py-2.5 pr-4 text-slate-500",children:x?e.jsx("input",{type:"text",className:"px-2 py-1 border border-slate-300 rounded text-sm w-full",value:o.school,onChange:d=>p({...o,school:d.target.value})}):r.school}),e.jsx("td",{className:"py-2.5 pr-4 text-slate-400 text-xs",children:new Date(r.registeredAt).toLocaleDateString()}),e.jsx("td",{className:"py-2.5 text-right whitespace-nowrap",children:x?e.jsxs("div",{className:"flex gap-2 justify-end",children:[e.jsx("button",{onClick:K,className:"p-1 text-green-600 hover:bg-green-50 rounded",title:"Save changes",children:e.jsx(ee,{size:16})}),e.jsx("button",{onClick:V,className:"p-1 text-slate-400 hover:bg-slate-100 rounded",title:"Cancel editing",children:e.jsx(se,{size:16})})]}):e.jsxs("div",{className:"flex gap-2 justify-end",children:[e.jsx("button",{onClick:()=>O(s.id,r),className:"p-1 text-slate-400 hover:text-brand-blue hover:bg-slate-50 rounded",title:"Edit attendee details",children:e.jsx(z,{size:16})}),e.jsx("button",{onClick:()=>H(s.id,r.id),className:"p-1 text-slate-400 hover:text-red-500 hover:bg-red-50 rounded",title:"Remove attendee",children:e.jsx(R,{size:16})})]})})]},r.id)})})]})})]})]},s.id)})})})]})}export{ce as EventManager};

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.