1import{r as n,j as e}from"./react-vendor-DDlTsOEd.js";import{K as E,R as $,aj as L,aa as M,U,a8 as q,I as Q,J as I,k as u,f as B,d as J}from"./index-BBAL-XO_.js";import{A as K}from"./AdminLayout-B0DIBAYd.js";import"./megaphone-c2Ccoqv-.js";import"./clipboard-check-B-VFQxDc.js";import"./database-CfQ3DoFp.js";import"./tag-finmna5A.js";import"./credit-card-jC5ykv7d.js";const G=new Intl.NumberFormat("en-IN",{style:"currency",currency:"INR",maximumFractionDigits:0});function w(a){return G.format(Number(a??0)/100)}function t(a){return new Intl.NumberFormat("en-IN").format(Number(a??0))}function A(a){return a?new Intl.DateTimeFormat("en-IN",{dateStyle:"medium",timeStyle:"short"}).format(new Date(a)):"Not available"}function O(a){const r=a.toLowerCase();return["paid","graded","evaluated","closed","resolved","issued"].includes(r)?"bg-emerald-50 text-emerald-700":["failed","cancelled","overdue"].includes(r)?"bg-rose-50 text-rose-700":["created","pending","submitted","open"].includes(r)?"bg-amber-50 text-amber-700":"bg-slate-100 text-slate-700"}function _({label:a,value:r,hint:i,icon:g}){return e.jsxs("div",{className:"rounded-lg border border-slate-200 bg-white p-4 shadow-sm",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500",children:a}),e.jsx("p",{className:"mt-2 text-2xl font-bold text-slate-950",children:r})]}),e.jsx("div",{className:"rounded-lg bg-blue-50 p-2 text-blue-600",children:g})]}),e.jsx("p",{className:"mt-3 text-xs text-slate-500",children:i})]})}function m({title:a,action:r,children:i}){return e.jsxs("section",{className:"rounded-lg border border-slate-200 bg-white shadow-sm",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-b border-slate-100 px-4 py-3",children:[e.jsx("h2",{className:"text-base font-semibold text-slate-950",children:a}),r]}),e.jsx("div",{className:"p-4",children:i})]})}function l({label:a,value:r}){return e.jsxs("div",{className:"rounded-lg bg-slate-50 px-3 py-2",children:[e.jsx("p",{className:"text-xs text-slate-500",children:a}),e.jsx("p",{className:"mt-1 text-lg font-semibold text-slate-950",children:r})]})}function S({label:a}){return e.jsx("p",{className:"rounded-lg bg-slate-50 px-3 py-4 text-sm text-slate-500",children:a})}function te(){const[a,r]=n.useState(null),[i,g]=n.useState(!0),[P,R]=n.useState(""),[b,z]=n.useState(""),[N,k]=n.useState(""),[v,D]=n.useState(""),[f,T]=n.useState(""),F=n.useMemo(()=>{const s=new URLSearchParams;b&&s.set("courseId",b),N&&s.set("from",N),v&&s.set("to",v),f.trim()&&s.set("student",f.trim());const y=s.toString();return y?`?${y}`:""},[b,N,v,f]);async function C(){g(!0),R("");try{const s=await J.get(`/admin/operations${F}`);r(s.data??null)}catch{R("Operations data could not be loaded.")}finally{g(!1)}}n.useEffect(()=>{C()},[]);const d=a?.overview,c=a?.registrations,p=a?.progress,o=a?.payments,h=a?.assignments,j=a?.certificates,x=a?.support;return e.jsx(K,{children:e.jsxs("div",{className:"mx-auto max-w-7xl space-y-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-slate-500",children:"Enterprise Ops"}),e.jsx("h1",{className:"text-3xl font-bold text-slate-950",children:"Operations Dashboard"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-slate-600",children:"Owner view for registrations, payments, learning progress, certificates, assignments, and support queues."})]}),e.jsxs(E,{onClick:()=>C(),disabled:i,className:"gap-2",children:[e.jsx($,{size:16,className:i?"animate-spin":""}),"Refresh"]})]}),P&&e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-700",children:[e.jsx(L,{size:16}),P]}),i&&!a?e.jsx("div",{className:"rounded-lg border border-slate-200 bg-white p-8 text-center text-sm text-slate-500 shadow-sm",children:"Loading operations data..."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[e.jsx(_,{label:"Today's registrations",value:t(d?.today_registrations),hint:"Student accounts created today",icon:e.jsx(M,{size:20})}),e.jsx(_,{label:"Total students",value:t(d?.total_students),hint:`${t(d?.active_students)} active in the last 30 days`,icon:e.jsx(U,{size:20})}),e.jsx(_,{label:"Paid enrollments",value:t(d?.paid_enrollments),hint:`${t(d?.pending_payments)} pending payment records`,icon:e.jsx(q,{size:20})}),e.jsx(_,{label:"Revenue",value:w(d?.lifetime_revenue_paise),hint:`${w(d?.month_revenue_paise)} collected this month`,icon:e.jsx(Q,{size:20})})]}),e.jsxs(m,{title:"Payment Monitoring",action:e.jsx(u,{href:"/admin/payments",className:"text-sm font-medium text-blue-600 hover:text-blue-700",children:"Open payments"}),children:[e.jsxs("div",{className:"grid gap-3 lg:grid-cols-[1fr_1fr_1fr_1fr_auto]",children:[e.jsxs("select",{value:b,onChange:s=>
1z(s.target.value),className:"h-10 rounded-md border border-slate-200 bg-white px-3 text-sm text-slate-700",children:[e.jsx("option",{value:"",children:"All courses"}),a?.courses.map(s=>e.jsx("option",{value:s.id,children:s.title},s.id))]}),e.jsx(I,{type:"date",value:N,onChange:s=>k(s.target.value),"aria-label":"From date"}),e.jsx(I,{type:"date",value:v,onChange:s=>D(s.target.value),"aria-label":"To date"}),e.jsx(I,{value:f,onChange:s=>T(s.target.value),placeholder:"Student name or email","aria-label":"Student filter"}),e.jsx(E,{type:"button",onClick:()=>C(),disabled:i,children:"Apply"})]}),e.jsxs("div",{className:"mt-4 grid gap-3 sm:grid-cols-2 lg:grid-cols-5",children:[e.jsx(l,{label:"Successful",value:t(o?.byStatus.paid?.count)}),e.jsx(l,{label:"Failed",value:t(o?.byStatus.failed?.count)}),e.jsx(l,{label:"Pending",value:t(o?.byStatus.pending?.count)}),e.jsx(l,{label:"Refunded",value:t(o?.byStatus.refunded?.count)}),e.jsx(l,{label:"Abandoned checkout",value:t(o?.abandonedCheckout)})]}),e.jsx("div",{className:"mt-4 overflow-x-auto",children:o?.recent.length?e.jsxs("table",{className:"w-full min-w-[760px] text-left text-sm",children:[e.jsx("thead",{className:"border-b border-slate-100 text-xs uppercase text-slate-500",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-2 pr-3",children:"Student"}),e.jsx("th",{className:"py-2 pr-3",children:"Course"}),e.jsx("th",{className:"py-2 pr-3",children:"Amount"}),e.jsx("th",{className:"py-2 pr-3",children:"Status"}),e.jsx("th",{className:"py-2 pr-3",children:"Created"})]})}),e.jsx("tbody",{children:o.recent.map(s=>e.jsxs("tr",{className:"border-b border-slate-50",children:[e.jsxs("td",{className:"py-3 pr-3",children:[e.jsx("p",{className:"font-medium text-slate-900",children:s.studentName??"Unnamed student"}),e.jsx("p",{className:"text-xs text-slate-500",children:s.studentEmail??"No email"})]}),e.jsx("td",{className:"py-3 pr-3 text-slate-700",children:s.courseTitle??`Course #${s.courseId}`}),e.jsx("td",{className:"py-3 pr-3 font-medium text-slate-900",children:w(s.amountPaise)}),e.jsx("td",{className:"py-3 pr-3",children:e.jsx("span",{className:`rounded-full px-2 py-1 text-xs font-medium ${O(s.status)}`,children:s.status})}),e.jsx("td",{className:"py-3 pr-3 text-slate-500",children:A(s.createdAt)})]},s.id))})]}):e.jsx(S,{label:"No payment records match the current filters."})})]}),e.jsxs("div",{className:"grid gap-5 xl:grid-cols-2",children:[e.jsxs(m,{title:"Registration Monitoring",children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[e.jsx(l,{label:"New registrations, 7 days",value:t(c?.new_registrations_7d)}),e.jsx(l,{label:"Email verified",value:c?.email_verified==null?"Not tracked":t(c.email_verified)}),e.jsx(l,{label:"Incomplete profiles",value:t(c?.incomplete_registrations)}),e.jsx(l,{label:"Duplicate emails",value:t(c?.duplicate_registrations)}),e.jsx(l,{label:"Abandoned registrations",value:t(c?.abandoned_registrations)})]}),e.jsx("div",{className:"mt-4 space-y-2",children:c?.recent_registrations?.map(s=>e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-lg bg-slate-50 px-3 py-2 text-sm",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"truncate font-medium text-slate-900",children:s.name??"Unnamed student"}),e.jsx("p",{className:"truncate text-xs text-slate-500",children:s.email})]}),e.jsx("span",{className:"shrink-0 text-xs text-slate-500",children:A(s.createdAt??s.created_at)})]},s.id))})]}),e.jsxs(m,{title:"Student Progress",action:e.jsx(u,{href:"/admin/students",className:"text-sm font-medium text-blue-600 hover:text-blue-700",children:"Open students"}),children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[e.jsx(l,{label:"Never started",value:t(p?.never_started)}),e.jsx(l,{label:"In progress",value:t(p?.in_progress)}),e.jsx(l,{label:"Completed",value:t(p?.completed)}),e.jsx(l,{label:"Certificate eligible",value:t(p?.certificate_eligible)}),e.jsx(l,{label:"Inactive students",value:t(p?.inactive)})]}),e.jsx("p",{className:"mt-4 rounded-lg bg-blue-50 px-3 py-2 text-xs text-blue-700",children:"Inactive students are based on lesson progress activity older than 30 days."})]})]}),e.jsx(m,{title:"Course Analytics",action:e.jsx(u,{href:"/admin/courses",className:"text-sm font-medium text-blue-600 hover:text-blue-700",children:"Manage courses"}),children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full min-w-[960px] text-left text-sm",children:[e.jsx("thead",{className:"border-b border-slate-100 text-xs uppercase text-slate-500",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-2 pr-3",children:"Course"}),e.jsx("th",{className:"py-2 pr-3",children:"Enrollments"}),e.jsx("th",{className:"py-2 pr-3",children:"Purchases"}),e.jsx("th",{className:"py-2 pr-3",children:"Revenue"}),e.jsx("th",{className:"py-2 pr-3",children:"Progress"}),e.jsx("th",{className:"py-2 pr-3",children:"Completion"}
1),e.jsx("th",{className:"py-2 pr-3",children:"Quiz Avg"}),e.jsx("th",{className:"py-2 pr-3",children:"Assignments"})]})}),e.jsx("tbody",{children:a?.courseAnalytics.map(s=>e.jsxs("tr",{className:"border-b border-slate-50",children:[e.jsxs("td",{className:"py-3 pr-3",children:[e.jsx("p",{className:"font-medium text-slate-900",children:s.title}),e.jsxs("p",{className:"text-xs text-slate-500",children:[t(s.lessonCount)," lessons · ",s.status]})]}),e.jsx("td",{className:"py-3 pr-3",children:t(s.enrollmentCount)}),e.jsx("td",{className:"py-3 pr-3",children:t(s.purchases)}),e.jsx("td",{className:"py-3 pr-3",children:w(s.revenuePaise)}),e.jsxs("td",{className:"py-3 pr-3",children:[s.averageProgress,"%"]}),e.jsxs("td",{className:"py-3 pr-3",children:[s.completionRate,"%"]}),e.jsxs("td",{className:"py-3 pr-3",children:[s.averageQuizScore,"%"]}),e.jsxs("td",{className:"py-3 pr-3",children:[t(s.assignmentSubmissions)," / ",t(s.assignments)]})]},s.id))})]})})}),e.jsxs("div",{className:"grid gap-5 xl:grid-cols-3",children:[e.jsxs(m,{title:"Assignment Review",action:e.jsx(u,{href:"/admin/assignments-all",className:"text-sm font-medium text-blue-600 hover:text-blue-700",children:"Open assignments"}),children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-3 xl:grid-cols-1",children:[e.jsx(l,{label:"Pending submissions",value:t(h?.pending_submissions)}),e.jsx(l,{label:"Recently graded",value:t(h?.recently_graded)}),e.jsx(l,{label:"Overdue grading",value:t(h?.overdue_grading)})]}),e.jsx("div",{className:"mt-4 space-y-2",children:h?.recent_submissions?.length?h.recent_submissions.slice(0,4).map(s=>e.jsxs("div",{className:"rounded-lg bg-slate-50 px-3 py-2 text-sm",children:[e.jsx("p",{className:"font-medium text-slate-900",children:s.assignmentTitle}),e.jsx("p",{className:"text-xs text-slate-500",children:s.studentName??s.studentEmail})]},s.id)):e.jsx(S,{label:"No assignment submissions yet."})})]}),e.jsxs(m,{title:"Certificate Queue",action:e.jsx(u,{href:"/admin/certificates",className:"text-sm font-medium text-blue-600 hover:text-blue-700",children:"Open certificates"}),children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-3 xl:grid-cols-1",children:[e.jsx(l,{label:"Ready",value:t(j?.ready)}),e.jsx(l,{label:"Issued",value:t(j?.issued)}),e.jsx(l,{label:"Pending review",value:t(j?.pending_review)})]}),e.jsx("div",{className:"mt-4 space-y-2",children:j?.recent_issued?.length?j.recent_issued.slice(0,4).map(s=>e.jsxs("div",{className:"rounded-lg bg-slate-50 px-3 py-2 text-sm",children:[e.jsx("p",{className:"font-medium text-slate-900",children:s.studentName??s.studentEmail}),e.jsx("p",{className:"text-xs text-slate-500",children:s.courseTitle})]},s.id)):e.jsx(S,{label:"No certificates issued yet."})})]}),e.jsxs(m,{title:"Support Dashboard",action:e.jsx(u,{href:"/admin/enterprise/support",className:"text-sm font-medium text-blue-600 hover:text-blue-700",children:"Open support"}),children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-1",children:[e.jsx(l,{label:"Password resets, 30 days",value:t(x?.password_reset_requests_30d)}),e.jsx(l,{label:"Payment issues",value:t(x?.payment_issues)}),e.jsx(l,{label:"Enrollment issues",value:t(x?.enrollment_issues)}),e.jsx(l,{label:"Content issues",value:t(x?.content_issues)})]}),e.jsx("div",{className:"mt-4 space-y-2",children:x?.recent_tickets?.length?x.recent_tickets.slice(0,4).map(s=>e.jsxs("div",{className:"rounded-lg bg-slate-50 px-3 py-2 text-sm",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("p",{className:"truncate font-medium text-slate-900",children:["#",s.id," ",s.subject]}),e.jsx("span",{className:`shrink-0 rounded-full px-2 py-1 text-xs font-medium ${O(s.status)}`,children:s.status})]}),e.jsxs("p",{className:"text-xs text-slate-500",children:[s.category," · ",s.studentName??s.studentEmail]})]},s.id)):e.jsx(S,{label:"No support tickets yet."})})]})]}),e.jsx("div",{className:"rounded-lg border border-slate-200 bg-white p-4 text-sm text-slate-600 shadow-sm",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(B,{className:"mt-0.5 text-emerald-600",size:18}),e.jsxs("div",{children:[e.jsx("p",{className:"font-semibold text-slate-900",children:"Data source notes"}),e.jsx("ul",{className:"mt-2 grid gap-1",children:Object.entries(a?.trackingNotes??{}).map(([s,y])=>e.jsx("li",{children:y},s))}),a?.generatedAt&&e.jsxs("p",{className:"mt-2 text-xs text-slate-500",children:["Last generated: ",A(a.generatedAt)]})]})]})})]})]})})}export{te 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.