PageSourceSearch

https://bci-edu-6qu8apwz.manus.space/assets/AdminCertificates-55OhqP3Q.js

js bci-edu-6qu8apwz.manus.space collected 2026-10-03 05:00:54 UTC 13,584 bytes, 1 lines download raw bytes

1import{j as e}from"./trpc-vendor-Bv0iaNDN.js";import{A as P}from"./AdminLayout-BvvhRFUw.js";import{t as m,A as N,p as c,b as w,D as R,q as L,r as O,v as F,L as n,I as d,J as G,T as b}from"./index-Bp5xQ-En.js";import{r as p}from"./react-vendor-CGOjsTCb.js";import{R as U}from"./refresh-cw-DS2mrj9R.js";import{P as v}from"./plus-BMR_veRJ.js";import{P as $}from"./pen-Dnn-27wF.js";import{T as q}from"./trash-2-DEzeex90.js";import{B as H}from"./bell-DDfP3iQl.js";import"./image-NXvCck6X.js";import"./message-square-D7ASK-H8.js";import"./graduation-cap-DtyfmjZD.js";import"./phone-call-DR-uxlHF.js";import"./radix-vendor-BsQgJgbQ.js";import"./charts-DUKIMxkY.js";const D={name:"",certNumber:"",issuedBy:"",issueDate:"",expiryDate:"",reminderDays:30,notes:""};function J(s){return Math.ceil((new Date(s).getTime()-Date.now())/864e5)}function Q({days:s}){return s<0?e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:42",className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-red-100 text-red-700 font-medium",children:[e.jsx(b,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:42",size:12})," Expired"]}):s<=30?e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:44",className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-orange-100 text-orange-700 font-medium",children:[e.jsx(b,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:44",size:12})," ",s,"d left"]}):s<=90?e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:46",className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-yellow-100 text-yellow-700 font-medium",children:[e.jsx(H,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:46",size:12})," ",s,"d left"]}):e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:47",className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-green-100 text-green-700 font-medium",children:[e.jsx(w,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:47",size:12})," Valid"]})}function re(){const s=m.useUtils(),{data:g=[],isLoading:S}=m.reminders.certificates.list.useQuery(),u=m.reminders.certificates.create.useMutation({onSuccess:()=>{s.reminders.certificates.list.invalidate(),r(!1)}}),C=m.reminders.certificates.update.useMutation({onSuccess:()=>{s.reminders.certificates.list.invalidate(),r(!1)}}),k=m.reminders.certificates.delete.useMutation({onSuccess:()=>s.reminders.certificates.list.invalidate()}),f=m.reminders.certificates.checkExpiry.useMutation(),[z,r]=p.useState(!1),[x,h]=p.useState(null),[i,o]=p.useState(D),[y,A]=p.useState(null);function j(){h(null),o(D),r(!0)}function B(t){h(t.id),o({name:t.name,certNumber:t.certNumber??"",issuedBy:t.issuedBy??"",issueDate:t.issueDate?new Date(t.issueDate).toISOString().slice(0,10):"",expiryDate:new Date(t.expiryDate).toISOString().slice(0,10),reminderDays:t.reminderDays,notes:t.notes??""}),r(!0)}function E(){const t={name:i.name,certNumber:i.certNumber||void 0,issuedBy:i.issuedBy||void 0,issueDate:i.issueDate?new Date(i.issueDate):void 0,expiryDate:new Date(i.expiryDate),reminderDays:i.reminderDays,notes:i.notes||void 0};x!==null?C.mutate({id:x,...t}):u.mutate(t)}function T(t,a){confirm(`Delete certificate "${a}"? This cannot be undone.`)&&k.mutate({id:t})}async function I(){const t=await f.mutateAsync();A(`Checked. ${t.notified} notification(s) sent.`),setTimeout(()=>A(null),4e3)}const l=t=>a=>o(M=>({...M,[t]:a.target.value}));return e.jsx(P,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:116",title:"Certificate Management",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:117",className:"max-w-4xl mx-auto",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:119",className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:120",children:[e.jsxs("h1",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:121",className:"text-xl font-serif font-bold text-gray-900 flex items-center gap-2",children:[e.jsx(N,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:122",size:22,className:"text-bci"})," Certificate Management"]}),e.jsx("p",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:124",className:"text-sm text-gray-500 mt-0.5",children:"Track certification expiry dates and receive automatic reminders 30 days before expiry."})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:128",className:"flex gap-2",children:[e.jsxs(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:129",variant:"outline",size:"sm",onClick:I,disabled:f.isPending,children:[e.jsx(U,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:130",size:14,className:f.isPending?"animate-spin":""}),"Check Now"]}),e.jsxs(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:133",size:"sm",onClick:j,className:"bg-bci hover:bg-bci/90 text-white",children:[e.jsx(v,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:134",size:14})," Add Certificate"]})]})]}),y&&e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:140",className:"mb-4 px-4 py-2 bg-green-50 border border-green-200 rounded text-sm text-green-700 flex items-center gap-2",children:[e.jsx(w,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:141",size:14})," ",y]}),S?e.jsx("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:147",className:"text-center py-12 text-gray-400",children:"Loading..."}):g.length===0?e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:149",className:"text-center py-16 border-2 border-dashed border-gray-200 rounded-xl",children:[e.jsx(N,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:150",size:36,className:"mx-auto text-gray-300 mb-3"}),e.jsx("p",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:151",className:"text-gray-500 font-medium",children:"No certificates yet"}),e.jsx("p",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:152",className:"text-sm text-gray-400 mt-1",children:"Add your first certificate to start tracking expiry dates."}),e.jsxs(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:153",size:"sm",className:"mt-4 bg-bci hover:bg-bci/90 text-white",onClick:j,children:[e.jsx(v,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:154",size:14})," Add Certificate"]})]}):e.jsx("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:158",className:"overflow-x-auto rounded-xl border border-gray-200",children:e.jsxs("table",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:159",className:"w-full text-sm",children:[e.jsx("thead",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:160",className:"bg-gray-50 border-b border-gray-200",children:e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:161",children:[e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:162",className:"text-left px-4 py-3 font-medium text-gray-600",children:"Certificate"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:163",className:"text-left px-4 py-3 font-medium text-gray-600",children:"Cert No."}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:164",className:"text-left px-4 py-3 font-medium text-gray-600",children:"Issued By"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:165",className:"text-left px-4 py-3 font-medium text-gray-600",children:"Expiry Date"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:166",className:"text-left px-4 py-3 font-medium text-gray-600",children:"Status"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:167",className:"text-left px-4 py-3 font-medium text-gray-600",children:"Reminder"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:168",className:"px-4 py-3"})]})}),e.jsx("tbody",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:171",className:"divide-y divide-gray-100",children:g.map(t=>{const a=J(t.expiryDate);return e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:175",className:"hover:bg-gray-50 transition-colors",children:[e.jsx("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:176",className:"px-4 py-3 font-medium text-gray-900",children:t.name}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:177",className:"px-4 py-3 text-gray-600",children:t.certNumber??"—"}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:178",className:"px-4 py-3 text-gray-600",children:t.issuedBy??"—"}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:179",className:"px-4 py-3 text-gray-600",children:new Date(t.expiryDate).toLocaleDateString("en-GB")}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:180",className:"px-4 py-3",children:e.jsx(Q,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:180",days:a})}),e.jsxs("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:181",className:"px-4 py-3 text-gray-500",children:[t.reminderDays," days before"]}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:182",className:"px-4 py-3",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:183",className:"flex gap-1 justify-end",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:184",variant:"ghost",size:"sm",onClick:()=>B(t),children:e.jsx($,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:184",size:14})}),e.jsx(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:185",variant:"ghost",size:"sm",className:"text-red-500 hover:text-red-700",onClick:()=>T(t.id,t.name),children:e.jsx(q,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:185",size:14})})]})})]},t.id)})})]})}),e.jsx(R,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:197",open:z,onOpenChange:r,children:e.jsxs(L,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:198",className:"max-w-md",children:[e.jsx(O,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:199",children:e.jsx(F,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:200",children:x!==null?"Edit Certificate":"Add Certificate"})}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:202",className:"space-y-3 py-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:203",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:204",children:"Certificate Name *"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:205",value:i.name,onChange:l("name"),placeholder:"e.g. EduTrust Singapore",className:"mt-1"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:207",className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:208",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:209",children:"Certificate Number"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:210",value:i.certNumber,onChange:l("certNumber"),placeholder:"e.g. EDU-3-3197",className:"mt-1"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:212",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:213",children:"Issued By"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:214",value:i.issuedBy,onChange:l("issuedBy"),placeholder:"e.g. SSG",className:"mt-1"})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:217",className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:218",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:219",children:"Issue Date"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:220",type:"date",value:i.issueDate,onChange:l("issueDate"),className:"mt-1"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:222",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:223",children:"Expiry Date *"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:224",type:"date",value:i.expiryDate,onChange:l("expiryDate"),className:"mt-1"})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:227",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:228",children:"Reminder (days before expiry)"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:229",type:"number",min:1,value:i.reminderDays,onChange:t=>o(a=>({...a,reminderDays:parseInt(t.target.value)||30})),className:"mt-1"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:237",children:[e.jsx(n,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:238",children:"Notes"}),e.jsx(d,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:239",value:i.notes,onChange:l("notes"),placeholder:"Optional notes",className:"mt-1"})]})]}),e.jsxs(G,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:242",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:243",variant:"outline",onClick:()=>r(!1),children:"Cancel"}),e.jsx(c,{"data-loc":"client/src/pages/admin/AdminCertificates.tsx:244",className:"bg-bci hover:bg-bci/90 text-white",onClick:E,disabled:!i.name||!i.expiryDate||u.isPending||C.isPending,children:x!==null?"Save Changes":"Add Certificate"})]})]})})]})})}export{re 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.