PageSourceSearch

https://wtfc.ca/assets/CorporateMembershipManager-DRfA1D5k.js

js wtfc.ca collected 2026-10-04 06:22:25 UTC 10,840 bytes, 2 lines download raw bytes

1import{N as V,r as N,d as G,j as e,L as F,n as c,I as i,B as q,aa as y,Q as w}from"./index-CgaGlvxl.js";import{u as D}from"./useMutation-CwBo1lBR.js";import{T as Y}from"./textarea-LY5c2fCR.js";import{T as J,a as W,b as C,c as u,d as X,e as x}from"./table-DsVsTK7f.js";import{D as Z,a as _,b as ee,c as ae,d as se,f as te}from"./dialog-BwXpTk5Z.js";import{i as M,a as S,b as T}from"./isPast-CYuYGN_z.js";import{A as re}from"./arrow-left-BP-rkUH3.js";import{C as ne}from"./chart-column-Cg3iR8BH.js";import{D as ie}from"./download-B17CynDe.js";import{P as le}from"./plus-CX3H_0Xl.js";import{f as v}from"./format-DIePDvv_.js";import{T as oe}from"./trash-2-BWD8Qr7u.js";import"./index-B4dzTveH.js";function de(o){if(!o)return null;const h=new Date(o),p=new Date;return M(h)?{label:"Expired",variant:"destructive",className:""}:S(h,T(p,30))?{label:"Exp. <30d",variant:"secondary",className:"bg-orange-100 text-orange-800 border-orange-300"}:S(h,T(p,90))?{label:"Exp. <90d",variant:"secondary",className:"bg-yellow-100 text-yellow-800 border-yellow-300"}:{label:"Active",variant:"secondary",className:"bg-green-100 text-green-800 border-green-300"}}const $=["Bronze","Silver","Gold","Platinum"],B={firstName:"",lastName:"",companyName:"",email:"",phone:"",sponsorshipTier:"",contributionAmount:"",notes:"",emailSubscribed:!0};function we(){const{toast:o}=V(),[h,p]=N.useState(null),[n,m]=N.useState({}),[z,b]=N.useState(!1),[s,l]=N.useState({...B}),{data:j=[],isLoading:O}=G({queryKey:["/api/corporate-members"]}),E=D({mutationFn:a=>w("DELETE",`/api/corporate-members/${a}`),onSuccess:()=>{y.invalidateQueries({queryKey:["/api/corporate-members"]}),o({title:"Member deleted successfully"})},onError:a=>{o({title:"Error deleting member",description:a.message,variant:"destructive"})}}),A=D({mutationFn:({id:a,data:d})=>w("PATCH",`/api/corporate-members/${a}`,d),onSuccess:()=>{y.invalidateQueries({queryKey:["/api/corporate-members"]}),p(null),m({}),o({title:"Member updated successfully"})},onError:a=>{o({title:"Error updating member",description:a.message,variant:"destructive"})}}),k=D({mutationFn:a=>w("POST","/api/corporate-members",a),onSuccess:()=>{y.invalidateQueries({queryKey:["/api/corporate-members"]}),b(!1),l({...B}),o({title:"Corporate member added successfully"})},onError:a=>{o({title:"Error adding member",description:a.message,variant:"destructive"})}}),I=()=>{if(!s.firstName||!s.lastName||!s.email||!s.companyName){o({title:"Missing required fields",description:"First name, last name, company, and email are required",variant:"destructive"});return}k.mutate(s)},Q=()=>{h&&Object.keys(n).length>0&&A.mutate({id:h,data:n})},H=()=>{const a=["Membership #","Company","First Name","Last Name","Email","Phone","Tier","Amount","Start Date","Renewal Date","Status","Email Subscribed","Notes"],d=j.map(r=>[r.membershipNumber||"",r.companyName,r.firstName,r.lastName,r.email,r.phone||"",r.sponsorshipTier||"",r.contributionAmount||"",r.startDate?v(new Date(r.startDate),"yyyy-MM-dd"):"",r.renewalDate?v(new Date(r.renewalDate),"yyyy-MM-dd"):"",r.status||"active",r.emailSubscribed?"Yes":"No",r.notes||""]),g=[a,...d].map(r=>r.map(U=>`"${U}"`).join(",")).join(`
2`),t=new Blob([g],{type:"text/csv"}),P=URL.createObjectURL(t),f=document.createElement("a");f.href=P,f.download=`corporate-members-${v(new Date,"yyyy-MM-dd")}.csv`,f.click(),URL.revokeObjectURL(P)};if(O)return e.jsx("div",{className:"container mx-auto py-8",children:e.jsx("p",{children:"Loading corporate members..."})});const K=new Date,L=j.filter(a=>a.renewalDate&&M(new Date(a.renewalDate))),R=j.filter(a=>a.renewalDate&&!M(new Date(a.renewalDate))&&S(new Date(a.renewalDate),T(K,30)));return e.jsxs("div",{className:"container mx-auto py-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx(F,{href:"/admin",children:e.jsxs(c,{variant:"outline",size:"sm",children:[e.jsx(re,{className:"w-4 h-4 mr-2"}),"Dashboard"]})}),e.jsx("h1",{className:"text-3xl font-bold flex-1",children:"Corporate Membership"}),e.jsx(F,{href:"/admin/member-reports",children:e.jsxs(c,{variant:"outline",children:[e.jsx(ne,{className:"w-4 h-4 mr-2"}),"Reports"]})}),e.jsxs(c,{onClick:H,variant:"outline",children:[e.jsx(ie,{className:"w-4 h-4 mr-2"}),"Export CSV"]}),e.jsxs(c,{onClick:()=>b(!0),children:[e.jsx(le,{className:"w-4 h-4 mr-2"}),"Add Corporate Member"]})]}),e.jsxs("div",{className:"flex gap-3 mb-4",children:[e.jsxs("div",{className:"text-sm text-muted-foreground bg-muted rounded-lg px-3 py-2",children:[e.jsx("span",{className:"font-semibold text-foreground",children:j.length})," total"]}),L.length>0&&e.jsxs("div",{className:"text-sm rounded-lg px-3 py-2 bg-red-50 text-red-800 border border-red-200",children:[e.jsx("span",{className:"font-semibold",children:L.length})," expired"]}),R.length>0&&e.jsxs("div",{className:"text-sm rounded-lg px-3 py-2 bg-orange-50 text-orange-800 border border-orange-200",children:[e.jsx("span",{className:"font-semibold",children:R.length})," expiring within 30 days"]})]}),e.jsx("div",{className:"border rounded-md overflow-x-auto",children:e.jsxs(J,{children:[e.jsx(W,{children:e.jsxs(C,{children:[e.jsx(u,{className:"w-28",children:"Membership #"}),e.jsx(u,{children:"Company"}),e.jsx(u,{children:"Contact"}),e.jsx(u,{children:"Email"}),e.jsx(u,{children:"Tier"}),e.jsx(u,{children:"Renewal Date"}),e.jsx(u,{children:"Status"}),e.jsx(u,{className:"text-right",children:"Actions"})]})}),e.jsx(X,{children:j.length===0?e.jsx(C,{children:e.jsx(x,{colSpan:8,className:"text-center text-muted-foreground",children:"No corporate members found. Add your first corporate member to get started."})}):j.map(a=>{const d=h===a.id,g=de(a.renewalDate);return e.jsxs(C,{children:[e.jsx(x,{className:"font-mono text-sm font-medium text-primary",children:a.membershipNumber||"—"}),e.jsx(x,{className:"font-medium",children:d?e.jsx(i,{value:n.companyName??a.companyName,onChange:t=>m({...n,companyName:t.target.value})}):a.companyName}),e.jsx(x,{children:d?e.jsxs("div",{className:"flex gap-2",children:[e.jsx(i,{placeholder:"First",value:n.firstName??a.firstName,onChange:t=>m({...n,firstName:t.target.value})}),e.jsx(i,{placeholder:"Last",value:n.lastName??a.lastName,onChange:t=>m({...n,lastName:t.target.value})})]}):`${a.firstName} ${a.lastName}`}),e.jsx(x,{children:d?e.jsx(i,{type:"email",value:n.email??a.email,onChange:t=>m({...n,email:t.target.value})}):a.email}),e.jsx(x,{children:d?e.jsxs("select",{value:n.sponsorshipTier??a.sponsorshipTier??"",onChange:t=>m({...n,sponsorshipTier:t.target.value}),className:"border rounded px-2 py-1 text-sm",children:[e.jsx("option",{value:"",children:"— Select —"}),$.map(t=>e.jsx("option",{value:t,children:t},t))]}):a.sponsorshipTier?e.jsx(q,{variant:"outline",children:a.sponsorshipTier}):"—"}),e.jsx(x,{children:e.jsx("div",{className:"flex flex-col gap-1",children:d?e.jsx(i,{type:"date",value:n.renewalDate?v(new Date(n.renewalDate),"yyyy-MM-dd"):a.renewalDate?v(new Date(a.renewalDate),"yyyy-MM-dd"):"",onCh
2ange:t=>m({...n,renewalDate:t.target.value})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{children:a.renewalDate?v(new Date(a.renewalDate),"MMM d, yyyy"):"—"}),g&&e.jsx(q,{variant:g.variant,className:`text-xs w-fit ${g.className}`,children:g.label})]})})}),e.jsx(x,{children:a.status||"active"}),e.jsx(x,{className:"text-right",children:d?e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(c,{size:"sm",onClick:Q,disabled:A.isPending,children:"Save"}),e.jsx(c,{size:"sm",variant:"outline",onClick:()=>{p(null),m({})},children:"Cancel"})]}):e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(c,{size:"sm",variant:"outline",onClick:()=>{p(a.id),m(a)},children:"Edit"}),e.jsx(c,{size:"sm",variant:"destructive",onClick:()=>{confirm("Delete this member?")&&E.mutate(a.id)},disabled:E.isPending,children:e.jsx(oe,{className:"w-4 h-4"})})]})})]},a.id)})})]})}),e.jsx(Z,{open:z,onOpenChange:b,children:e.jsxs(_,{className:"max-w-lg",children:[e.jsxs(ee,{children:[e.jsx(ae,{children:"Add Corporate Member"}),e.jsx(se,{children:"A membership number will be automatically assigned (e.g. COR-1001)."})]}),e.jsxs("div",{className:"grid gap-4 py-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Company Name *"}),e.jsx(i,{value:s.companyName||"",onChange:a=>l({...s,companyName:a.target.value})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"First Name *"}),e.jsx(i,{value:s.firstName||"",onChange:a=>l({...s,firstName:a.target.value})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Last Name *"}),e.jsx(i,{value:s.lastName||"",onChange:a=>l({...s,lastName:a.target.value})})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Email *"}),e.jsx(i,{type:"email",value:s.email||"",onChange:a=>l({...s,email:a.target.value})})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Phone"}),e.jsx(i,{value:s.phone||"",onChange:a=>l({...s,phone:a.target.value})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Sponsorship Tier"}),e.jsxs("select",{value:s.sponsorshipTier||"",onChange:a=>l({...s,sponsorshipTier:a.target.value}),className:"w-full border rounded px-3 py-2 text-sm",children:[e.jsx("option",{value:"",children:"— Select —"}),$.map(a=>e.jsx("option",{value:a,children:a},a))]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Start Date"}),e.jsx(i,{type:"date",onChange:a=>l({...s,startDate:a.target.value})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Renewal Date"}),e.jsx(i,{type:"date",onChange:a=>l({...s,renewalDate:a.target.value})})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Contribution Amount"}),e.jsx(i,{value:s.contributionAmount||"",placeholder:"e.g. $5,000",onChange:a=>l({...s,contributionAmount:a.target.value})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium",children:"Notes"}),e.jsx(Y,{value:s.notes||"",onChange:a=>l({...s,notes:a.target.value}),rows:2})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"corp-subscribed",checked:s.emailSubscribed||!1,onChange:a=>l({...s,emailSubscribed:a.target.checked})}),e.jsx("label",{htmlFor:"corp-subscribed",className:"text-sm font-medium",children:"Email Subscribed"})]})]}),e.jsxs(te,{children:[e.jsx(c,{variant:"outline",onClick:()=>b(!1),children:"Cancel"}),e.jsx(c,{onClick:I,disabled:k.isPending,children:"Add Member"})]})]})})]})}export{we as default};

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.