PageSourceSearch

https://buildersacademynz.web.app/chunk-OOJZ4VDL.js

js buildersacademynz.web.app collected 2026-10-03 12:20:39 UTC 81,064 bytes, 2 lines download raw bytes

1import{a as H}from"./chunk-XLBEV5CW.js";import{D as wt,E as kt,J as Et,N as Ft,Q as Mt,U as Tt,V as Vt,Z as Nt,_ as At,b as dt,c as ut,da as Ot,h as mt,i as pt,j as ht,k as gt,l as _t,m as ft,n as St,o as yt,p as xt,q as bt,t as Ct,u as Pt,y as vt}from"./chunk-KMXQE4KL.js";import{G as $t,Ia as Yt,J as zt,a as Bt,da as Ut,e as Ht,n as Qt,pa as Kt,t as Rt}from"./chunk-R5WJRIHB.js";import{a as qt}from"./chunk-NFYWOYC5.js";import"./chunk-ITMFNP22.js";import{b as It,c as Lt,d as Dt}from"./chunk-LFRTPRFK.js";import"./chunk-GUZO7ZNK.js";import{Aa as O,Ab as st,Bb as at,Db as rt,Ga as w,Ha as S,Ia as p,Ib as ot,J as B,N as y,O as x,Qa as W,Rb as lt,Sa as et,Ta as it,Ua as l,Va as _,Vc as ct,Wa as b,Xa as R,aa as o,fa as X,jb as $,ka as D,lb as F,mb as q,nb as L,qa as k,sa as E,ua as tt,va as N,vb as nt,wa as A,xa as v,ya as r,za as s}from"./chunk-3RYB6SVN.js";import"./chunk-QYJGY2IR.js";import"./chunk-YGHZJLBQ.js";import"./chunk-G35TH3HO.js";import"./chunk-QUJFQN2Y.js";import"./chunk-TQCPDUT3.js";import"./chunk-USX6FYMP.js";import"./chunk-LPZTKJWE.js";import"./chunk-PW6GA5NL.js";import"./chunk-S5XOBH6Y.js";import"./chunk-MKFP4TZ3.js";import"./chunk-JQVI6FS2.js";import"./chunk-BCFU56ZB.js";import"./chunk-PT3YUHTI.js";import"./chunk-MTEZNQW4.js";import"./chunk-PTASOGFN.js";import"./chunk-4K53T7NJ.js";import"./chunk-MTHZ7MWU.js";import"./chunk-WI5MSH4N.js";import"./chunk-N2ITJEWR.js";import"./chunk-CKP3SGE2.js";import"./chunk-RFGOEN6H.js";import"./chunk-Y7EQJLOB.js";import"./chunk-4EXU7QX3.js";import"./chunk-YG5PFMJ7.js";import"./chunk-NER57BGA.js";import"./chunk-DSHYVPZD.js";import"./chunk-PD2PSGYJ.js";import"./chunk-YGDXWWXH.js";import"./chunk-JNMFIV4M.js";import"./chunk-DXRS3GW7.js";import"./chunk-ZDL7X67C.js";import"./chunk-CLVRMGG4.js";import{a as f,b as V,g as I}from"./chunk-NMDLJX5Q.js";var j=()=>[],jt=(a,u)=>u.key,K=(a,u)=>u.label,G=(a,u)=>u.assessorId+u.assessorName,Wt=(a,u)=>u.title,J=(a,u)=>u.studentId+u.studentName,Gt=(a,u)=>u.courseName+u.moduleName;function Jt(a,u){if(a&1&&(r(0,"ion-note",7),l(1),s()),a&2){let i=p();o(),_(i.statsLoadError)}}function Zt(a,u){a&1&&(r(0,"ion-col",19)(1,"div",22)(2,"div",23),O(3,"div",24)(4,"div",25),s(),O(5,"div",26),r(6,"div",27),O(7,"span")(8,"span")(9,"span")(10,"span"),s()()())}function Xt(a,u){if(a&1&&(r(0,"div",8)(1,"ion-grid",18)(2,"ion-row"),N(3,Zt,11,0,"ion-col",19,tt),s()(),r(5,"div",20),O(6,"ion-spinner",21),s()()),a&2){let i=p();o(3),A(i.facultyStatisticsLoadingPlaceholders)}}function te(a,u){if(a&1&&(r(0,"div",38)(1,"span"),l(2),s(),r(3,"span"),l(4),s(),r(5,"span"),l(6),s()()),a&2){let i=u.$implicit;o(2),_(i.label),o(2),_(i.onTrack),o(2),_(i.behind)}}
1function ee(a,u){if(a&1&&(r(0,"div",33)(1,"div",37)(2,"span"),l(3,"Metric"),s(),r(4,"span"),l(5,"On Track"),s(),r(6,"span"),l(7,"Behind"),s()(),N(8,te,7,3,"div",38,K),s()),a&2){let i=p().$implicit;o(8),A(i.qualificationRows||$(0,j))}}function ie(a,u){if(a&1&&(r(0,"div",39)(1,"span"),l(2),s(),r(3,"strong"),l(4),s()()),a&2){let i=u.$implicit;o(2),_(i.label),o(2),_(i.value)}}function ne(a,u){if(a&1&&(r(0,"div",34),N(1,ie,5,2,"div",39,K),s()),a&2){let i=p().$implicit;o(),A(i.userRows||$(0,j))}}function se(a,u){if(a&1&&(r(0,"div",39)(1,"span"),l(2),s(),r(3,"strong"),l(4),s()()),a&2){let i=u.$implicit;o(2),_(i.label),o(2),_(i.value)}}function ae(a,u){if(a&1&&(r(0,"div",34),N(1,se,5,2,"div",39,K),s()),a&2){let i=p().$implicit;o(),A(i.studentEntryRows||$(0,j))}}function re(a,u){if(a&1&&(r(0,"div",38)(1,"span"),l(2),s(),r(3,"span"),l(4),s()()),a&2){let i=u.$implicit;o(2),_(i.label),o(2),_(i.value)}}function oe(a,u){if(a&1&&(r(0,"div",33),N(1,re,5,2,"div",38,K),s()),a&2){let i=p().$implicit;o(),A(i.siteVisitRows||$(0,j))}}function le(a,u){if(a&1&&(r(0,"div",35),l(1),s()),a&2){let i=p().$implicit;o(),_(i.value)}}function ce(a,u){if(a&1&&(r(0,"div",36),l(1),s()),a&2){let i=p().$implicit;o(),_(i.subtitle)}}function de(a,u){if(a&1){let i=w();r(0,"ion-col",19)(1,"ion-card",28),S("click",function(){let e=y(i).$implicit,n=p(2);return x(n.openFacultyStatisticsModal(e.key))}),r(2,"ion-card-content")(3,"div",23)(4,"div",29),O(5,"ion-icon",30),s(),r(6,"ion-badge",31),l(7,"View stats"),s()(),r(8,"div",32),l(9),s(),k(10,ee,10,1,"div",33)(11,ne,3,1,"div",34)(12,ae,3,1,"div",34)(13,oe,3,1,"div",33)(14,le,2,1,"div",35),k(15,ce,2,1,"div",36),s()()()}if(a&2){let i=u.$implicit;o(4),it("faculty-stat-icon-"+i.color),o(),v("name",i.icon),o(),v("color",i.color),o(3),_(i.title),o(),E(i.key==="qualificationProgress"?10:i.key==="users"?11:i.key==="studentEntries"?12:i.key==="siteVisits"?13:14),o(5),E(i.subtitle?15:-1)}}function ue(a,u){if(a&1&&(r(0,"ion-grid",9)(1,"ion-row"),N(2,de,16,7,"ion-col",19,jt),s()()),a&2){let i=p();o(2),A(i.facultyStatisticsCards)}}function me(a,u){if(a&1){let i=w();r(0,"button",52),S("click",function(){let e=y(i).$implicit,n=p(3);return x(n.openQualificationAssessorModal(e))}),r(1,"div",53)(2,"span",54),l(3),s(),r(4,"span",55),l(5),s()(),r(6,"div",56)(7,"div",57),l(8),s(),r(9,"div",58),l(10),s()()()}if(a&2){let i=u.$implicit,t=p(3);o(3),_(i.assessorName),o(2),b("",i.studentCount," students"),o(2),W("width",t.getQualificationAssessorMetric(i).behindPercent,"%"),o(),b(" ",t.formatPercent(t.getQualificationAssessorMetric(i).behindPercent)," "),o(),W("width",t.getQualificationAssessorMetric(i).onTrackPercent,"%"),o(),b(" ",t.formatPercent(t.getQualificationAssessorMetric(i).onTrackPercent)," ")}}function pe(a,u){if(a&1){let i=w();r(0,"div",44)(1,"ion-button",45),S("click",function(){y(i);let e=p(2);return x(e.setQualificationBenchmarkMetric("elements"))}),l(2," Elements/LO's "),s(),r(3,"ion-button",45),S("click",function(){y(i);let e=p(2);return x(e.setQualificationBenchmarkMetric("units"))}),l(4," Units "),s(),r(5,"ion-button",45),S("click",function(){y(i);let e=p(2);return x(e.setQualificationBenchmarkMetric("modules"))}),l(6," Courses/Modules "),s(),r(7,"ion-button",45),S("click",function(){y(i);let e=p(2);return x(e.setQualificationBenchmarkMetric("years"))}),l(8," Year Progress "),s()(),r(9,"div",46)(10,"span",47),O(11,"span",48),l(12,"Behind"),s(),r(13,"span",47),O(14,"span",49),l(15,"On Track"),s()(),r(16,"div",50),N(17,me,11,8,"button",51,G),s()}if(a&2){let i=p(2);o(),v("fill",i.qualificationBenchmarkMetric==="elements"?"solid":"outline"),o(2),v("fill",i.qualificationBenchmarkMetric==="units"?"solid":"outline"),o(2),v("fill",i.qualificationBenchmarkMetric==="modules"?"solid":"outline"),o(2),v("fill",i.qualificationBenchmarkMetric==="years"?"solid":"outline"),o(10),A(i.qualificationAssessorBreakdown)}}function he(a,u){if(a&1){let i=w();r(0,"button",52),S("click",function(){let e=y(i).$implicit,n=p(3);return x(n.openStudentEntryAssessorModal(e))}),r(1,"div",61)(2,"div",62)(3,"span",54),l(4),s(),r(5,"span",55),l(6),s()(),r(7,"span"),l(8),F(9,"number"),s(),r(10,"span"),l(11),F(12,"number"),s(),r(13,"span"),l(14),s()()()}if(a&2){let i=u.$implicit;o(4),_(i.assessorName),o(2),b("",i.studentCount," students"),o(2),_(L(9,5,i.entriesLast30,"1.0-0")),o(3),_(L(12,8,i.studentsWithEntryLast30,"1.0-0")),o(3),_(i.averagePerStudentLast30.toFixed(1))}}function ge(a,u){if(a&1){let i=w();r(0,"div",59)(1,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntrySort("assessorFirstName"))}),l(2),s(),r(3,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntrySort("entriesLast30"))}),l(4),s(),r(5,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntrySort("studentsWithEntryLast30"))}),l(6),s(),r(7,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntrySort("averagePerStudentLast30"))}),l(8),s()(),r(9,"div",50),N(10,he,15,11,"button",51,G),s()}if(a&2){let i=p(2);o(2),b(" Assessor/Tutor",i.getStudentEntrySortIndicator("assessorFirstName")," "),o(2),b(" Total entries (30d)",i.getStudentEntrySortIndicator("entriesLast30")," "),o(2),b(" Students with entry (30d)",i.getStudentEntrySortIndicator("studentsWithEntryLast30")," "),o(2),b(" Average per student",i.getStudentEntrySortIndicator("averagePerStudentLast30")," "),o(2),A(i.studentEntryAssessorBreakdown)}}function _e(a,u){if(a&1){let i=w();r(0,"button",52),S("click",function(){let e=y(i).$implicit,n=p(3);return x(n.openSiteVisitAssessorModal(e))}),r(1,"div",64)(2,"div",65)(3,"span",54),l(4),s(),r(5,"span",55),l(6),s()(),r(7,"span"),l(8),s(),r(9,"span"),l(10),s(),r(11,"span"),l(12),s()()()}if(a&2){let i=u.$implicit,t=p(3);o(4),_(i.assessorName),o(2),b("",i.studentCount," students"),o(2),_(t.formatPercent(i.completedLast30Percent)),o(2),_(t.formatPercent(i.bookedNext30Percent)),o(2),_(t.formatPercent(i.reportCompletedLast30Percent))}}function fe(a,u){if(a&1){let i=w();r(0,"div",63)(1,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitSort("assessorFirstName"))}),l(2),s(),r(3,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitSort("completedLast30Percent"))}),l(4),s(),r(5,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitSort("bookedNext30Percent"))}),l(6),s(),r(7,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitSort("reportCompletedLast30Percent"))}),l(8),s()(),r(9,"div",50),N(10,_e,13,5,"button",51,G),s()}if(a&2){let i=p(2);o(2),b(" Assessor/Tutor",i.getSiteVisitSortIndicator("assessorFirstName")," "),o(2),b(" Last visit 30d",i.getSiteVisitSortIndicator("completedLast30Percent")," "),o(2),b(" Booked +30d",i.getSiteVisitSortIndicator("bookedNext30Percent")," "),o(2),b(" Report complete 30d",i.getSiteVisitSortIndicator("reportCompletedLast30Percent")," "),o(2),A(i.siteVisitAssessorBreakdown)}}function Se(a,u){if(a&1&&(r(0,"p"),l(1),s()),a&2){let i=p().$implicit;o(),_(i.note)}}function ye(a,u){if(a&1&&(r(0,"ion-item",67)(1,"ion-label")(2,"h4"),l(3),s()(),r(4,"ion-badge",0),l(5),s()()),a&2){let i=u.$implicit;o(3),_(i.label),o(2),_(i.value)}}function xe(a,u){if(a&1&&(r(0,"div",66)(1,"h3"),l(2),s(),k(3,Se,2,1,"p"),s(),N(4,ye,6,2,"ion-item",67,K)),a&2){let i=u.$implicit;o(2),_(i.title),o(),E(i.note?3:-1),o(),A(i.rows)}}function be(a,u){if(a&1&&(r(0,"ion-list",43),N(1,xe,6,2,null,null,Wt),s()),a&2){let i=p(2);o(),A(i.activeFacultyStatisticsGroups)}}function Ce(a,u){if(a&1){let i=w();r(0,"ion-header")(1,"ion-toolbar")(2,"ion-title"),l(3),s(),r(4,"ion-buttons",40)(5,"ion-button",41),S("click",function(){y(i);let e=p();return x(e.closeFacultyStatisticsModal())}),l(6,"Close"),s()()()(),r(7,"ion-content",3)(8,"div",42)(9,"p"),l(10),s(),r(11,"ion-note"),l(12,"We'll make these stats editable so you can hide/show what you want to see, in the meantime they're here to give you ideas on what is possible"),s()(),k(13,pe,19,4)(14,ge,12,4)(15,fe,12,4)(16,be,3,0,"ion-list",43),s()}if(a&2){let i=p();o(3),_(i.activeFacultyStatisticsTitle),o(7),_(i.activeFacultyStatisticsSubtitle),o(3),E(i.activeStatisticsKey==="qualificationProgress"?13:i.activeStatisticsKey==="studentEntries"?14:i.activeStatisticsKey==="siteVisits"?15:16)}}
1function Pe(a,u){a&1&&(r(0,"div",68),O(1,"ion-spinner",21),s())}function ve(a,u){if(a&1){let i=w();r(0,"ion-item",70),S("click",function(){let e=y(i).$implicit,n=p(3);return x(n.openQualificationForStudent(e))}),r(1,"ion-label")(2,"h4"),l(3),s(),r(4,"p"),l(5),s()(),r(6,"ion-badge",71),l(7),s()()}if(a&2){let i=u.$implicit,t=p(3);o(3),_(i.studentName),o(2),R(" Completion: ",t.formatPercent(t.getQualificationStudentStatus(i).completionPercent)," | Expected: ",t.formatPercent(t.getQualificationStudentStatus(i).expectedPercent)," "),o(),v("color",t.getQualificationStudentStatus(i).status==="On track"?"success":"danger"),o(),b(" ",t.getQualificationStudentStatus(i).status," ")}}function we(a,u){if(a&1&&(r(0,"ion-list",43),N(1,ve,8,5,"ion-item",69,J),s()),a&2){let i=p(2);o(),A(i.selectedQualificationAssessorStudents)}}function ke(a,u){if(a&1){let i=w();r(0,"ion-header")(1,"ion-toolbar")(2,"ion-title"),l(3),s(),r(4,"ion-buttons",40)(5,"ion-button",41),S("click",function(){y(i);let e=p();return x(e.closeQualificationAssessorModal())}),l(6,"Close"),s()()()(),r(7,"ion-content",3)(8,"div",42)(9,"p"),l(10),s()(),k(11,Pe,2,0,"div",68)(12,we,3,0,"ion-list",43),s()}if(a&2){let i=p();o(3),_((i.selectedQualificationAssessor==null?null:i.selectedQualificationAssessor.assessorName)||"Assessor"),o(7),b("",i.qualificationBenchmarkMetricLabel," status for this assessor's students."),o(),E(i.isLoadingQualificationAssessorStudents?11:12)}}function Ee(a,u){a&1&&(r(0,"div",68),O(1,"ion-spinner",21),s())}function Fe(a,u){if(a&1&&(r(0,"div",74)(1,"span",75),l(2),s(),r(3,"span"),l(4),F(5,"date"),s(),r(6,"span"),l(7),F(8,"date"),s(),r(9,"span"),l(10),F(11,"date"),s()()),a&2){let i=u.$implicit;o(2),_(i.studentName),o(2),_(i.lastCompletedVisitDate?L(5,4,i.lastCompletedVisitDate,"dd/MM/yyyy"):"No site visit"),o(3),_(i.nextBookedVisitDate?L(8,7,i.nextBookedVisitDate,"dd/MM/yyyy"):"No upcoming booking"),o(3),_(i.lastReportCompletedDate?L(11,10,i.lastReportCompletedDate,"dd/MM/yyyy"):"No completed report")}}function Me(a,u){if(a&1){let i=w();r(0,"div",72)(1,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitStudentSort("studentName"))}),l(2),s(),r(3,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitStudentSort("lastCompletedVisitDate"))}),l(4),s(),r(5,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitStudentSort("nextBookedVisitDate"))}),l(6),s(),r(7,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setSiteVisitStudentSort("lastReportCompletedDate"))}),l(8),s()(),r(9,"div",73),N(10,Fe,12,13,"div",74,J),s()}if(a&2){let i=p(2);o(2),b(" Student",i.getSiteVisitStudentSortIndicator("studentName")," "),o(2),b(" Last site visit",i.getSiteVisitStudentSortIndicator("lastCompletedVisitDate")," "),o(2),b(" Next booked",i.getSiteVisitStudentSortIndicator("nextBookedVisitDate")," "),o(2),b(" Last report completed",i.getSiteVisitStudentSortIndicator("lastReportCompletedDate")," "),o(2),A(i.selectedSiteVisitAssessorStudents)}}function Te(a,u){if(a&1){let i=w();r(0,"ion-header")(1,"ion-toolbar")(2,"ion-title"),l(3),s(),r(4,"ion-buttons",40)(5,"ion-button",41),S("click",function(){y(i);let e=p();return x(e.closeSiteVisitAssessorModal())}),l(6,"Close"),s()()()(),r(7,"ion-content",3)(8,"div",42)(9,"p"),l(10,"Student site visit milestones for this assessor/tutor."),s()(),k(11,Ee,2,0,"div",68)(12,Me,12,4),s()}if(a&2){let i=p();o(3),_((i.selectedSiteVisitAssessor==null?null:i.selectedSiteVisitAssessor.assessorName)||"Assessor"),o(8),E(i.isLoadingSiteVisitAssessorStudents?11:12)}}function Ve(a,u){a&1&&(r(0,"div",68),O(1,"ion-spinner",21),s())}function Ne(a,u){if(a&1){let i=w();r(0,"button",79),S("click",function(){let e=y(i).$implicit,n=p(3);return x(n.openStudentEntryStudentModal(e))}),r(1,"span",75),l(2),s(),r(3,"span"),l(4),F(5,"number"),s(),r(6,"span"),l(7),F(8,"number"),s()()}if(a&2){let i=u.$implicit;o(2),_(i.studentName),o(2),_(L(5,3,i.totalEntries,"1.0-0")),o(3),_(L(8,6,i.entriesLast30,"1.0-0"))}}function Ae(a,u){if(a&1){let i=w();r(0,"div",76)(1,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntryStudentSort("studentName"))}),l(2),s(),r(3,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntryStudentSort("totalEntries"))}),l(4),s(),r(5,"button",60),S("click",function(){y(i);let e=p(2);return x(e.setStudentEntryStudentSort("entriesLast30"))}),l(6),s()(),r(7,"div",77),N(8,Ne,9,9,"button",78,J),s()}if(a&2){let i=p(2);o(2),b(" Student",i.getStudentEntryStudentSortIndicator("studentName")," "),o(2),b(" Total entries",i.getStudentEntryStudentSortIndicator("totalEntries")," "),o(2),b(" Entries last 30",i.getStudentEntryStudentSortIndicator("entriesLast30")," "),o(2),A(i.selectedStudentEntryAssessorStudents)}}function Oe(a,u){if(a&1){let i=w();r(0,"ion-header")(1,"ion-toolbar")(2,"ion-title"),l(3),s(),r(4,"ion-buttons",40)(5,"ion-button",41),S("click",function(){y(i);let e=p();return x(e.closeStudentEntryAssessorModal())}),l(6,"Close"),s()()()(),r(7,"ion-content",3)(8,"div",42)(9,"p"),l(10,"Student entries for this assessor/tutor. Tap a student to view their totals."),s()(),k(11,Ve,2,0,"div",68)(12,Ae,10,3),s()}if(a&2){let i=p();o(3),_((i.selectedStudentEntryAssessor==null?null:i.selectedStudentEntryAssessor.assessorName)||"Assessor"),o(8),E(i.isLoadingStudentEntryAssessorStudents?11:12)}}function Ie(a,u){if(a&1&&(r(0,"ion-item",83)(1,"ion-label")(2,"h4"),l(3,"Elements/Learning Outcomes"),s(),r(4,"p"),l(5),s()(),r(6,"ion-badge",71),l(7),s()()),a&2){let i=p(3);o(5),R("Completion: ",i.formatPercent(i.selectedStudentQualification.elements.completionPercent)," | Expected: ",i.formatPercent(i.selectedStudentQualification.elements.expectedPercent)),o(),v("color",i.selectedStudentQualification.elements.status==="On track"?"success":"danger"),o(),b(" ",i.selectedStudentQualification.elements.status," ")}}function Le(a,u){if(a&1&&(r(0,"ion-item",83)(1,"ion-label")(2,"h4"),l(3,"Units"),s(),r(4,"p"),l(5),s()(),r(6,"ion-badge",71),l(7),s()()),a&2){let i=p(3);o(5),R("Completion: ",i.formatPercent(i.selectedStudentQualification.units.completionPercent)," | Expected: ",i.formatPercent(i.selectedStudentQualification.units.expectedPercent)),o(),v("color",i.selectedStudentQualification.units.status==="On track"?"success":"danger"),o(),b(" ",i.selectedStudentQualification.units.status," ")}}function De(a,u){if(a&1&&(r(0,"ion-item",83)(1,"ion-label")(2,"h4"),l(3,"Courses/Modules"),s(),r(4,"p"),l(5),s()(),r(6,"ion-badge",71),l(7),s()()),a&2){let i=p(3);o(5),R("Completion: ",i.formatPercent(i.selectedStudentQualification.modules.completionPercent)," | Expected: ",i.formatPercent(i.selectedStudentQualification.modules.expectedPercent)),o(),v("color",i.selectedStudentQualification.modules.status==="On track"?"success":"danger"),o(),b(" ",i.selectedStudentQualification.modules.status," ")}}function qe(a,u){if(a&1&&(r(0,"ion-item",88)(1,"ion-label")(2,"h4"),l(3),s(),r(4,"p"),l(5),s()(),r(6,"ion-badge"),l(7),s()()),a&2){let i=u.$implicit,t=p(4);o(3),_(i.courseName),o(2),_(i.moduleName),o(),et(t.getStatusBadgeStyle(i.statusDisplay||i.status)),o(),b(" ",t.getStatusDisplayText(i.statusDisplay||i.status)," ")}}
1function Be(a,u){if(a&1&&(r(0,"ion-list",86),N(1,qe,8,5,"ion-item",88,Gt),s()),a&2){let i=p(3);o(),A(i.selectedStudentQualification.unitRecords)}}function He(a,u){a&1&&(r(0,"p",87),l(1,"No unit records found"),s())}function Qe(a,u){if(a&1&&(r(0,"div",84)(1,"div",85)(2,"h3"),l(3,"Debug"),s()(),r(4,"pre",89),l(5),s()()),a&2){let i=p(3);o(5),_(i.formatDebugJson(i.selectedStudentQualification.debug))}}function Re(a,u){if(a&1&&(r(0,"div",80)(1,"ion-list",81)(2,"div",82)(3,"h3"),l(4),s()(),k(5,Ie,8,4,"ion-item",83),k(6,Le,8,4,"ion-item",83),k(7,De,8,4,"ion-item",83),s()(),r(8,"div",84)(9,"div",85)(10,"h3"),l(11,"Units"),s()(),k(12,Be,3,0,"ion-list",86)(13,He,2,0,"p",87),s(),k(14,Qe,6,1,"div",84)),a&2){let i=p(2);o(4),_(i.qualificationBenchmarkMetricLabel),o(),E(i.qualificationBenchmarkMetric==="elements"?5:-1),o(),E(i.qualificationBenchmarkMetric==="units"?6:-1),o(),E(i.qualificationBenchmarkMetric==="modules"?7:-1),o(5),E(i.selectedStudentQualification.unitRecords&&i.selectedStudentQualification.unitRecords.length>0?12:13),o(2),E(i.selectedStudentQualification.debug?14:-1)}}function $e(a,u){if(a&1){let i=w();r(0,"ion-header")(1,"ion-toolbar")(2,"ion-title"),l(3),s(),r(4,"ion-buttons",40)(5,"ion-button",41),S("click",function(){y(i);let e=p();return x(e.closeStudentQualificationModal())}),l(6,"Close"),s()()()(),r(7,"ion-content",3),k(8,Re,15,6),s()}if(a&2){let i=p();o(3),R("",(i.selectedStudentQualification==null?null:i.selectedStudentQualification.studentName)||"Student"," - ",i.selectedStudentQualification==null?null:i.selectedStudentQualification.studentQual),o(5),E(i.selectedStudentQualification?8:-1)}}function ze(a,u){if(a&1&&(r(0,"ion-list",43)(1,"ion-item",67)(2,"ion-label")(3,"h4"),l(4,"Total entries"),s()(),r(5,"ion-badge",0),l(6),F(7,"number"),s()(),r(8,"ion-item",67)(9,"ion-label")(10,"h4"),l(11,"Entries in last 30 days"),s()(),r(12,"ion-badge",0),l(13),F(14,"number"),s()()()),a&2){let i=p(2);o(6),_(L(7,2,i.selectedStudentEntryStudent.totalEntries,"1.0-0")),o(7),_(L(14,5,i.selectedStudentEntryStudent.entriesLast30,"1.0-0"))}}function Ue(a,u){if(a&1){let i=w();r(0,"ion-header")(1,"ion-toolbar")(2,"ion-title"),l(3),s(),r(4,"ion-buttons",40)(5,"ion-button",41),S("click",function(){y(i);let e=p();return x(e.closeStudentEntryStudentModal())}),l(6,"Close"),s()()()(),r(7,"ion-content",3),k(8,ze,15,8,"ion-list",43),s()}if(a&2){let i=p();o(3),_((i.selectedStudentEntryStudent==null?null:i.selectedStudentEntryStudent.studentName)||"Student"),o(5),E(i.selectedStudentEntryStudent?8:-1)}}function Ke(a,u){a&1&&(r(0,"div",90),O(1,"ion-spinner"),s())}var z={users:{total:0,students:0,tutors:0,employers:0,archived:0},studentEntries:{total:0,studentsWithEntries:0,recent30:0,averagePerStudent:0,assessorBreakdown:[]},qualificationProgress:{totalRows:0,unitRows:0,elementRows:0,uniqueStudents:0,completedRows:0,recent30:0,onTrackPercent:0,behindPercent:0,benchmarkedStudents:0,benchmarkChecksTotal:0,benchmarkChecksOnTrack:0,benchmarkChecksBehind:0,benchmarks:{elements:{onTrackPercent:0,behindPercent:0,onTrackCount:0,behindCount:0},units:{onTrackPercent:0,behindPercent:0,onTrackCount:0,behindCount:0},modules:{onTrackPercent:0,behindPercent:0,onTrackCount:0,behindCount:0},years:{onTrackPercent:0,behindPercent:0,onTrackCount:0,behindCount:0}},assessorBreakdown:[]},siteVisits:{total:0,activeStudents:0,draft:0,inProgress:0,completed:0,recent30:0,benchmarkedStudents:0,completedLast30Students:0,completedLast30Percent:0,bookedNext30Students:0,bookedNext30Percent:0,reportCompletedLast30Students:0,reportCompletedLast30Percent:0,assessorBreakdown:[]}},M={allTime:0,last30:0,thisYear:0},U={users:{total:f({},M),students:f({},M),tutors:f({},M),employers:f({},M),archived:f({},M)},studentEntries:{total:f({},M),studentsWithEntries:f({},M)},qualificationProgress:{totalRows:f({},M),unitRows:f({},M),elementRows:f({},M),uniqueStudents:f({},M),completedRows:f({},M)},siteVisits:{total:f({},M),activeStudents:f({},M),draft:f({},M),inProgress:f({},M),completed:f({},M)}},li=(()=>{let u=class u{constructor(){this.router=B(lt),this.http=B(ot),this.alertCtrl=B(Nt),this.loadingCtrl=B(At),this.translate=B(It),this.global=B(qt),this.facultyStats={totalStudents:0,activeStudents:0,completedStudents:0,totalActiveAccounts:0,totalAssessors:0,activeAssessors:0,employerAccounts:0},this.facultyStatistics=f({},z),this.facultyStatisticsPeriods=f({},U),this.facultyStatisticsCards=[],this.facultyStatisticsLoadingPlaceholders=[0,1,2,3],this.activeStatisticsKey="users",this.showStatisticsModal=!1,this.showQualificationAssessorModal=!1,this.showStudentQualificationModal=!1,this.showSiteVisitAssessorModal=!1,this.showStudentEntryAssessorModal=!1,this.showStudentEntryStudentModal=!1,this.qual
1ificationBenchmarkMetric="elements",this.selectedQualificationAssessor=null,this.selectedStudentQualification=null,this.selectedSiteVisitAssessor=null,this.selectedStudentEntryAssessor=null,this.selectedStudentEntryStudent=null,this.siteVisitSortKey="completedLast30Percent",this.siteVisitSortDirection="desc",this.studentEntrySortKey="entriesLast30",this.studentEntrySortDirection="desc",this.siteVisitStudentSortKey="studentName",this.siteVisitStudentSortDirection="asc",this.studentEntryStudentSortKey="entriesLast30",this.studentEntryStudentSortDirection="desc",this.isLoadingQualificationAssessorStudents=!1,this.isLoadingSiteVisitAssessorStudents=!1,this.isLoadingStudentEntryAssessorStudents=!1,this.isLoadingStats=!1,this.statsLoadError="",this.statsLoadTimer=null,this.isFacultyViewActive=!1,this.statsLoadVersion=0,this.statsCacheTtlMs=180*1e3,this.assessorDetailsCacheTtlMs=180*1e3,this.assessorDetailsCache=new Map,this.assessorDetailsInFlight=new Map,this.activeFacultyId="",this.userData=null,this.facultyName="",this.isLoading=!1,Bt({arrowBack:Ht,settingsOutline:Yt,documentTextOutline:zt,listOutline:Ut,peopleOutline:Kt,checkmarkCircleOutline:Rt,createOutline:$t,calendarOutline:Qt})}ngOnInit(){this.loadUserData()}ionViewWillEnter(){this.isFacultyViewActive=!0,this.loadUserData(),this.scheduleFacultyStatisticsLoad()}ionViewWillLeave(){this.isFacultyViewActive=!1,this.isLoadingStats=!1,this.statsLoadTimer&&(clearTimeout(this.statsLoadTimer),this.statsLoadTimer=null)}scheduleFacultyStatisticsLoad(){this.statsLoadTimer&&clearTimeout(this.statsLoadTimer),this.statsLoadTimer=setTimeout(()=>{this.statsLoadTimer=null,!(!this.isFacultyViewActive||this.isLoadingStats)&&this.loadFacultyStatistics()},25)}loadUserData(){let t=this.activeFacultyId;try{let d=localStorage.getItem("user"),c=localStorage.getItem("currentTutorItem"),g=null,m=null;try{g=d?JSON.parse(d):null}catch{g=null}try{m=c?JSON.parse(c):null}catch{m=null}this.userData=g||m||null}catch{this.userData=null}let e=String(this.userData?.faculty||"").trim();t!==e&&(this.statsLoadVersion+=1,this.assessorDetailsCache.clear(),this.assessorDetailsInFlight.clear(),this.facultyStatistics=f({},z),this.facultyStatisticsPeriods=f({},U),this.statsLoadError="",this.buildFacultyStatisticsCards()),this.activeFacultyId=e,e?this.resolveFacultyName(e):this.facultyName=""}resolveFacultyName(t){return I(this,null,function*(){if(t)try{let e=[];try{let d=localStorage.getItem("listByFaculty");d&&(e=JSON.parse(d))}catch{e=[]}if(!e.length)try{e=yield this.global.loadFacultyList()}catch{e=[]}let n=e.find(d=>(d?.list_id??d?.id??d?.list)?.toString()===t.toString());if(String(this.activeFacultyId||"").trim()!==String(t||"").trim())return;this.facultyName=(n?.name??n?.faculty_name??n?.faculty)?.toString().trim()||""}catch{this.facultyName=""}})}extractResponseRows(t){let e=[t,t?.data,t?.users,t?.list,t?.result,t?.payload,t?.payload?.data,t?.payload?.users,t?.payload?.list];for(let n of e){if(Array.isArray(n))return n;if(n&&typeof n=="object"){let d=Object.values(n);if(d.length>0&&d.every(c=>c&&typeof c=="object"))return d}}return[]}toFiniteNumber(t,e=0){let n=Number(t);return Number.isFinite(n)?n:e}parseFacultyStatisticsSummary(t){let e=t?.data?.stats??t?.stats??t?.data;if(!e||typeof e!="object")return null;let n=e?.users,d=e?.studentEntries,c=e?.qualificationProgress,g=e?.siteVisits;return!n||!d||!c||!g?null:{users:{total:this.toFiniteNumber(n?.total),students:this.toFiniteNumber(n?.students),tutors:this.toFiniteNumber(n?.tutors),employers:this.toFiniteNumber(n?.employers),archived:this.toFiniteNumber(n?.archived)},studentEntries:{total:this.toFiniteNumber(d?.total),studentsWithEntries:this.toFiniteNumber(d?.studentsWithEntries),recent30:this.toFiniteNumber(d?.recent30),averagePerStudent:this.toFiniteNumber(d?.averagePerStudent),assessorBreakdown:Array.isArray(d?.assessorBreakdown)?d.assessorBreakdown.map(m=>({assessorId:String(m?.assessorId??""),assessorName:String(m?.assessorName??"Unassigned").trim()||"Unassigned",studentCount:this.toFiniteNumber(m?.studentCount),entriesLast30:this.toFiniteNumber(m?.entriesLast30),studentsWithEntryLast30:this.toFiniteNumber(m?.studentsWithEntryLast30),averagePerStudentLast30:this.toFiniteNumber(m?.averagePerStudentLast30),students:Array.isArray(m?.students)?m.students.map(h=>({studentId:String(h?.studentId??""),studentName:String(h?.studentName??"").trim()||"Student",totalEntries:this.toFiniteNumber(h?.totalEntries),entriesLast30:this.toFiniteNumber(h?.entriesLast30)})):[]})):[]},qualificationProgress:{totalRows:this.toFiniteNumber(c?.totalRows),unitRows:this.toFiniteNumber(c?.unitRows),elementRows:this.toFiniteNumber(c?.elementRows),uniqueStudents:this.toFiniteNumber(c?.uniqueStudents),completedRows:this.toFiniteNumber(c?.completedRows),recent30:this.toFiniteNumber(c?.recent30),onTrackPercent:this.toFiniteNumber(c?.onTrackPercent),behindPercent:this.toFiniteNumber(c?.behindPercent),benchmarkedStudents:this.toFiniteNumber(c?.benchmarkedStudents),benchmarkChecksTotal:this.toFiniteNumber(c?.benchmarkChecksTotal),benchmarkChecksOnTrack:this.toFiniteNumber(c?.benchmarkChecksOnTrack),benchmarkChecksBehind:this.toFiniteNumber(c?.benchmarkChecksBehind),benchmarks:{elements:{onTrackPercent:this.toFiniteNumber(c?.benchmarks?.elements?.onTrackPercent),behindPercent:this.toFiniteNumber(c?.benchmarks?.elements?.behindPercent),onTrackCount:this.toFiniteNumber(c?.benchmarks?.elements?.onTrackCount),behindCount:this.toFiniteNumber(c?.benchmarks?.elements?.behindCount)},units:{onTrackPercent:this.toFiniteNumber(c?.benchmarks?.units?.onTrackPercent),behindPercent:this.toFiniteNumber(c?.benchmarks?.units?.behindPercent),onTrackCount:this.toFiniteNumber(c?.benchmarks?.units?.onTrackCount),behindCount:this.toFiniteNumber(c?.benchmarks?.units?.behindCount)},modules:{onTrackPercent:this.toFiniteNumber(c?.benchmarks?.modules?.onTrackPercent),behindPercent:this.toFiniteNumber(c?.benchmarks?.modules?.behindPercent),onTrackCount:this.toFiniteNumber(c?.benchmarks?.modules?.onTrackCount),behindCount:this.toFiniteNumber(c?.benchmarks?.modules?.behindCount)},years:{onTrackPercent:this.toFiniteNumber(c?.benchmarks?.years?.onTrackPercent),behindPercent:this.toFiniteNumber(c?.benchmarks?.years?.behindPercent),onTrackCount:this.toFiniteNumber(c?.benchmarks?.years?.onTrackCount),behindCount:this.toFiniteNumber(c?.benchmarks?.years?.behindCount)}},assessorBreakdown:Array.isArray(c?.assessorBreakdown)?c.assessorBreakdown.map(m=>({assessorId:String(m?.assessorId??""),assessorName:String(m?.assessorName??"Unassigned").trim()||"Unassigned",studentCount:this.toFiniteNumber(m?.studentCount),elements:{onTrackPercent:this.toFiniteNumber(m?.elements?.onTrackPercent),behindPercent:this.toFiniteNumber(m?.elements?.behindPercent),onTrackCount:this.toFiniteNumber(m?.elements?.onTrackCount),behindCount:this.toFiniteNumber(m?.elements?.behindCount)},units:{onTrackPercent:this.toFiniteNumber(m?.units?.onTrackPercent),behindPercent:this.toFiniteNumber(m?.units?.behindPercent),onTrackCount:this.toFiniteNumber(m?.units?.onTrackCount),behindCount:this.toFiniteNumber(m?.units?.behindCount)},modules:{onTrackPercent:this.toFiniteNumber(m?.modules?.onTrackPercent),behindPercent:this.toFiniteNumber(m?.modules?.behindPercent),onTrackCount:this.toFiniteNumber(m?.modules?.onTrackCount),behindCount:this.toFiniteNumber(m?.modules?.behindCount)},years:{onTrackPercent:this.toFiniteNumber(m?.years?.onTrackPercent),behindPercent:this.toFiniteNumber(m?.years?.behindPercent),onTrackCount:this.toFiniteNumber(m?.years?.onTrackCount),behindCount:this.toFiniteNumber(m?.years?.behindCount)},students:Array.isArray(m?.students)?m.students.map(h=>({studentId:String(h?.studentId??""),studentName:String(h?.studentName??"").trim()||"Student",studentQual:String(h?.studentQual??"").trim(),studentFaculty:String(h?.studentFaculty??"").trim(),studentProvider:String(h?.studentProvider??"").trim(),studentTutor:String(h?.studentTutor??"").trim(),elements:{status:String(h?.elements?.status??"Behind"),completionPercent:this.toFiniteNumber(h?.elements?.completionPercent),expectedPercent:this.toFiniteNumber(h?.elements?.expectedPercent)},units:{status:String(h?.units?.status??"Behind"),completionPercent:this.toFiniteNumber(h?.units?.completionPercent),expectedPercent:this.toFiniteNumber(h?.units?.expectedPercent)},modules:{status:String(h?.modules?.status??"Behind"),completionPercent:this.toFiniteNumber(h?.modules?.completionPercent),expectedPercent:this.toFiniteNumber(h?.modules?.expectedPercent)},years:{status:String(h?.years?.status??"Behind"),completionPercent:this.toFiniteNumber(h?.years?.completionPercent),expectedPercent:this.toFiniteNumber(h?.years?.expectedPercent)},unitRecords:Array.isArray(h?.unitRecords)?h.unitRecords.map(P=>({moduleName:String(P?.moduleName??"").trim()||"Unassigned Module",courseName:String(P?.courseName??"").trim()||"Course",status:String(P?.status??"").trim(),statusDisplay:String(P?.statusDisplay??"").trim()||"In Progress"})):[],debug:h?.debug??null})):[]})):[]},siteVisits:{total:this.toFiniteNumber(g?.total),activeStudents:this.toFiniteNumber(g?.activeStudents),draft:this.toFiniteNumber(g?.draft),inProgress:this.toFiniteNumber(g?.inProgress),completed:this.toFiniteNumber(g?.completed),recent30:this.toFiniteNumber(g?.recent30),benchmarkedStudents:this.toFiniteNumber(g?.benchmarkedStudents),completedLast30Students:this.toFiniteNumber(g?.completedLast30Students),completedLast30Percent:this.toFiniteNumber(g?.completedLast30Percent),bookedNext30Students:this.toFiniteNumber(g?.bookedNext30Students),bookedNext30Percent:this.toFiniteNumber(g?.bookedNext30Percent),reportCompletedLast30Students:this.toFiniteNumber(g?.reportCompletedLast30Students),reportCompletedLast30Percent:this.toFiniteNumber(g?.reportCompletedLast30Percent),assessorBreakdown:Array.isArray(g?.assessorBreakdown)?g.assessorBreakdown.map(m=>({assessorId:String(m?.assessorId??""),assessorName:String(m?.assessorName??"Unassigned").trim()||"Unassigned",studentCount:this.toFiniteNumber(m?.studentCount),completedLast30Count:this.toFiniteNumber(m?.completedLast30Count),completedLast30Percent:this.toFiniteNumber(m?.completedLast30Percent),bookedNext30Count:this.toFiniteNumber(m?.bookedNext30Count),bookedNext30Percent:this.toFiniteNumber(m?.bookedNext30Percent),reportCompletedLast30Count:this.toFiniteNumber(m?.reportCompletedLast30Count),reportCompletedLast30Percent:this.toFiniteNumber(m?.reportCompletedLast30Percent),students:Array.isArray(m?.students)?m.students.map(h=>({studentId:String(h?.studentId??""),studentName:String(h?.studentName??"").trim()||"Student",last
1CompletedVisitDate:h?.lastCompletedVisitDate?String(h.lastCompletedVisitDate):null,nextBookedVisitDate:h?.nextBookedVisitDate?String(h.nextBookedVisitDate):null,lastReportCompletedDate:h?.lastReportCompletedDate?String(h.lastReportCompletedDate):null})):[]})):[]}}}parsePeriodValue(t,e=0,n=0,d=0){return{allTime:this.toFiniteNumber(t?.allTime,e),last30:this.toFiniteNumber(t?.last30,n),thisYear:this.toFiniteNumber(t?.thisYear,d)}}parseFacultyStatisticsPeriods(t,e){let n=t?.data?.statsPeriods??t?.statsPeriods??{};return{users:{total:this.parsePeriodValue(n?.users?.total,e.users.total,0,0),students:this.parsePeriodValue(n?.users?.students,e.users.students,0,0),tutors:this.parsePeriodValue(n?.users?.tutors,e.users.tutors,0,0),employers:this.parsePeriodValue(n?.users?.employers,e.users.employers,0,0),archived:this.parsePeriodValue(n?.users?.archived,e.users.archived,0,0)},studentEntries:{total:this.parsePeriodValue(n?.studentEntries?.total,e.studentEntries.total,e.studentEntries.recent30,0),studentsWithEntries:this.parsePeriodValue(n?.studentEntries?.studentsWithEntries,e.studentEntries.studentsWithEntries,0,0)},qualificationProgress:{totalRows:this.parsePeriodValue(n?.qualificationProgress?.totalRows,e.qualificationProgress.totalRows,e.qualificationProgress.recent30,0),unitRows:this.parsePeriodValue(n?.qualificationProgress?.unitRows,e.qualificationProgress.unitRows,0,0),elementRows:this.parsePeriodValue(n?.qualificationProgress?.elementRows,e.qualificationProgress.elementRows,0,0),uniqueStudents:this.parsePeriodValue(n?.qualificationProgress?.uniqueStudents,e.qualificationProgress.uniqueStudents,0,0),completedRows:this.parsePeriodValue(n?.qualificationProgress?.completedRows,e.qualificationProgress.completedRows,0,0)},siteVisits:{total:this.parsePeriodValue(n?.siteVisits?.total,e.siteVisits.total,e.siteVisits.recent30,0),activeStudents:this.parsePeriodValue(n?.siteVisits?.activeStudents,e.siteVisits.activeStudents,0,0),draft:this.parsePeriodValue(n?.siteVisits?.draft,e.siteVisits.draft,0,0),inProgress:this.parsePeriodValue(n?.siteVisits?.inProgress,e.siteVisits.inProgress,0,0),completed:this.parsePeriodValue(n?.siteVisits?.completed,e.siteVisits.completed,0,0)}}}formatPeriodValue(t){return`${this.formatCount(t.allTime)} | ${this.formatCount(t.last30)} | ${this.formatCount(t.thisYear)}`}buildPeriodRows(t,e,n){return[{label:`${t} (All Time)`,value:this.formatCount(e.allTime),note:n},{label:`${t} (Last 30 Days)`,value:this.formatCount(e.last30),note:n},{label:`${t} (This Year)`,value:this.formatCount(e.thisYear),note:n}]}buildPeriodGroup(t,e,n){return{title:t,note:n,rows:[{label:"All Time",value:this.formatCount(e.allTime)},{label:"Last 30 Days",value:this.formatCount(e.last30)},{label:"This Year",value:this.formatCount(e.thisYear)}]}}buildAverageGroup(t,e,n,d){return{title:t,note:d,rows:[{label:"All Time",value:this.formatAverageValue(e.allTime,n.allTime)},{label:"Last 30 Days",value:this.formatAverageValue(e.last30,n.last30)},{label:"This Year",value:this.formatAverageValue(e.thisYear,n.thisYear)}]}}formatAverageValue(t,e){return e>0?(t/e).toFixed(1):"0.0"}formatPeriodAverage(t,e){let n=(d,c)=>c>0?(d/c).toFixed(1):"0.0";return`${n(t.allTime,e.allTime)} | ${n(t.last30,e.last30)} | ${n(t.thisYear,e.thisYear)}`}getFacultyStatsCacheKey(t){return`hodFacultyStatsSummary_v2_${t}`}readFacultyStatsCache(t){if(!t)return null;try{let e=localStorage.getItem(this.getFacultyStatsCacheKey(t));if(!e)return null;let n=JSON.parse(e),d=Number(n?.cachedAt??0);return!d||Date.now()-d>this.statsCacheTtlMs||!n?.stats||!n?.periods?null:{stats:n.stats,periods:n.periods,cachedAt:d}}catch{return null}}writeFacultyStatsCache(t){if(t)try{let e={stats:this.facultyStatistics,periods:this.facultyStatisticsPeriods,cachedAt:Date.now()};localStorage.setItem(this.getFacultyStatsCacheKey(t),JSON.stringify(e))}catch{}}buildStatsApiErrorMessage(t){let e=Number(t?.status??0),n=String(t?.error?.error_msg??t?.message??"").trim();return e===401?"Faculty stats API returned 401 (unauthorized). Please log out and log in again.":e===404?"Faculty stats API endpoint was not found (404). Confirm faculty_stats_summary.php is uploaded to the active API path.":e===500?n?`Faculty stats API returned 500: ${n}`:"Faculty stats API returned 500 (server error).":e===0?"Faculty stats API is unreachable (network/CORS/SSL issue).":n?`Faculty stats API request failed (${e||"unknown"}): ${n}`:`Faculty stats API request failed (${e||"unknown"}).`}loadFacultyStatisticsFromSummaryEndpoint(t){return I(this,null,function*(){let e=this.global.getApiBaseUrl(),n=[`faculty=${encodeURIComponent(t)}`,"windowDays=30","includeAssessorStudents=0"],d=`${e}faculty_stats_summary.php?${n.join("&")}`,c=yield this.http.get(d).toPromise().catch(h=>(this.statsLoadError=this.buildStatsApiErrorMessage(h),null));if(!c)return null;if(c?.error){let h=String(c?.error_msg??"").trim();return this.statsLoadError=h||"Faculty stats API returned an error response.",null}let g=this.parseFacultyStatisticsSummary(c);if(!g)return this.statsLoadError="Faculty stats API returned an unexpected response shape.",null;this.facultyStatisticsPeriods=this.parseFacultyStatisticsPeriods(c,g);let m=Array.isArray(c?.data?.warnings)?c.data.warnings.map(h=>
1String(h??"").trim()).filter(Boolean):[];return m.length>0?this.statsLoadError=`Faculty stats loaded with partial data. Query warnings: ${m.join(", ")}`:this.statsLoadError="",g})}getAssessorDetailsCacheKey(t,e){return`${t}::${e}`}readAssessorDetailsCache(t,e){let n=this.getAssessorDetailsCacheKey(t,e),d=this.assessorDetailsCache.get(n);return d?Date.now()-d.cachedAt>this.assessorDetailsCacheTtlMs?(this.assessorDetailsCache.delete(n),null):d.stats:null}writeAssessorDetailsCache(t,e,n){let d=this.getAssessorDetailsCacheKey(t,e);this.assessorDetailsCache.set(d,{stats:n,cachedAt:Date.now()})}loadFacultyAssessorDetailSummary(t,e){return I(this,null,function*(){let n=this.readAssessorDetailsCache(t,e);if(n)return n;let d=this.getAssessorDetailsCacheKey(t,e),c=this.assessorDetailsInFlight.get(d);if(c)return c;let g=I(this,null,function*(){let m=this.global.getApiBaseUrl(),h=[`faculty=${encodeURIComponent(t)}`,"windowDays=30","includeAssessorStudents=1",`assessorId=${encodeURIComponent(e)}`],P=`${m}faculty_stats_summary.php?${h.join("&")}`,T=yield this.http.get(P).toPromise().catch(()=>null),C=T?this.parseFacultyStatisticsSummary(T):null;return C&&this.writeAssessorDetailsCache(t,e,C),C});this.assessorDetailsInFlight.set(d,g);try{return yield g}finally{this.assessorDetailsInFlight.delete(d)}})}isArchivedUser(t){return H(t?.user_roles,"archived")||H(t?.user_roles,"archive")}isStudentUser(t){return H(t?.user_roles,"student")}isTutorUser(t){return H(t?.user_roles,"tutor")||H(t?.user_roles,"hod")}isEmployerUser(t){return H(t?.user_roles,"boss")}normalizeStatStatus(t){return String(t??"").trim().toLowerCase()}parseStatDateToTimestamp(t){if(t==null)return null;if(t instanceof Date){let c=t.getTime();return Number.isNaN(c)?null:c}if(typeof t=="number"&&Number.isFinite(t))return t>1e12?t:t*1e3;let e=String(t).trim();if(!e)return null;if(/^\d+$/.test(e)){let c=Number(e);if(Number.isFinite(c))return c>1e12?c:c*1e3}let n=new Date(e).getTime();if(!Number.isNaN(n))return n;let d=e.match(/^(\d{1,2})[\/\-.](\d{1,2})[\/\-.](\d{2,4})(?:\s+(\d{1,2}):(\d{2})(?::(\d{2}))?)?$/);if(d){let c=Number(d[1]),g=Number(d[2])-1,m=Number(d[3]),h=m<100?2e3+m:m,P=Number(d[4]??0),T=Number(d[5]??0),C=Number(d[6]??0),Q=new Date(h,g,c,P,T,C).getTime();return Number.isNaN(Q)?null:Q}return null}isRecentDate(t,e){let n=this.parseStatDateToTimestamp(t);return n!==null&&n>=e}extractRecentDateFromEntry(t){return t?.created??t?.created_at??t?.date_created??t?.inventory_purchased??t?.date??t?.entry_date??t?.work_date??t?.updated??""}fetchAllStudentEntries(t){return I(this,null,function*(){let e=String(t||"").trim();if(!e)return[];let n=200,d=100,c=[],g=0,m="";for(let h=0;h<d;h+=1){let P=`${this.global.getApiBaseUrl()}search_inventory_by_student.php?student=${encodeURIComponent(e)}&limit=${n}&offset=${g}&order=desc&include_images=0&include_notes=0`,T=yield this.http.get(P).toPromise().catch(()=>({data:[]})),C=this.extractResponseRows(T);if(!C.length)break;let Q=String(C[0]?.inventory_id??C[0]?.id??"").trim(),Y=String(C[C.length-1]?.inventory_id??C[C.length-1]?.id??"").trim(),Z=`${Q}:${Y}:${C.length}`;if(Z===m||(m=Z,c.push(...C),C.length<n))break;g+=n}return c})}formatCount(t){return Number(t||0).toLocaleString()}formatPercent(t){return`${this.toFiniteNumber(t,0).toFixed(1)}%`}getStatusDisplayText(t){let e=String(t||"").trim().toLowerCase();return!e||e==="not assessed"||e==="not started"?"Not Assessed":e==="completed"?"Completed":"In Progress"}getStatusBadgeStyle(t){let e=this.getStatusDisplayText(t);return e==="Completed"?{color:"#181818",background:"#2dd36f"}:e==="Not Assessed"?{color:"#fff",background:"#92949c"}:{color:"#fff",background:"#7044ff"}}formatDebugJson(t){try{return JSON.stringify(t??{},null,2)}catch{return String(t??"")}}get qualificationBenchmarkMetricLabel(){switch(this.qualificationBenchmarkMetric){case"units":return"Units";case"modules":return"Courses/Modules";case"years":return"Year Progress";default:return"Elements/LO's"}}get qualificationAssessorBreakdown(){return[...this.facultyStatistics.qualificationProgress.assessorBreakdown||[]].sort((e,n)=>{let d=this.getQualificationAssessorMetric(e),g=this.getQualificationAssessorMetric(n).behindPercent-d.behindPercent;return Math.abs(g)>.001?g:e.assessorName.localeCompare(n.assessorName)})}get selectedQualificationAssessorStudents(){return this.selectedQualificationAssessor?.students||[]}get studentEntryAssessorBreakdown(){return[...this.facultyStatistics.studentEntries.assessorBreakdown||[]].sort((e,n)=>{let d=this.studentEntrySortKey,c=this.studentEntrySortDirection;if(d==="assessorFirstName"){let P=this.getAssessorFirstName(e?.assessorName),T=this.getAssessorFirstName(n?.assessorName),C=P.localeCompare(T);return C!==0?c==="asc"?C:-C:String(e?.assessorName||"").localeCompare(String(n?.assessorName||""))}let g=this.toFiniteNumber(e?.[d],0),m=this.toFiniteNumber(n?.[d],0),h=g-m;return Math.abs(h)>.001?c==="asc"?h:-h:e.assessorName.localeCompare(n.assessorName)})}get selectedStudentEntryAssessorStudents(){let t=this.selectedStudentEntryAssessor?.students||[],e=this.studentEntryStudentSortKey,n=this.studentEntryStudentSortDirection;return[...t].sort((d,c)=>{if(e==="studentName"){let P=String(d?.studentName||"").trim().toLowerCase(),T=String(c?.studentName||"").trim().toLowerCase(),C=P.localeCompare(T);return n==="asc"?C:-C}let g=this.toFiniteNumber(d?.[e],0),m=this.toFiniteNumber(c?.[e],0),h=g-m;return Math.abs(h)>.001?n==="asc"?h:-h:String(d?.studentName||"").localeCompare(String(c?.studentName||""))})}get siteVisitAssessorBreakdown(){return[...this.facultyStatistics.siteVisits.assessorBreakdown||[]].sort((e,n)=>{let d=this.siteVisitSortKey,c=this.siteVisitSortDirection;if(d==="assessorFirstName"){let P=this.getAssessorFirstName(e?.assessorName),T=this.getAssessorFirstName(n?.assessorName),C=P.localeCompare(T);return C!==0?c==="asc"?C:-C:String(e?.assessorName||"").localeCompare(String(n?.assessorName||""))}let g=this.toFiniteNumber(e?.[d],0),m=this.toFiniteNumber(n?.[d],0),h=g-m;return Math.abs(h)>.001?c==="asc"?h:-h:e.assessorName.localeCompare(n.assessorName)})}getAssessorFirstName(t){let e=String(t||"").trim();if(!e)return"";
1let n=e.split(/\s+/).filter(Boolean);return n.length>0?n[0].toLowerCase():e.toLowerCase()}setSiteVisitSort(t){if(this.siteVisitSortKey===t){this.siteVisitSortDirection=this.siteVisitSortDirection==="asc"?"desc":"asc";return}this.siteVisitSortKey=t,this.siteVisitSortDirection="desc"}getSiteVisitSortIndicator(t){return this.siteVisitSortKey!==t?"":this.siteVisitSortDirection==="asc"?" \u25B2":" \u25BC"}setStudentEntrySort(t){if(this.studentEntrySortKey===t){this.studentEntrySortDirection=this.studentEntrySortDirection==="asc"?"desc":"asc";return}this.studentEntrySortKey=t,this.studentEntrySortDirection="desc"}getStudentEntrySortIndicator(t){return this.studentEntrySortKey!==t?"":this.studentEntrySortDirection==="asc"?" \u25B2":" \u25BC"}setStudentEntryStudentSort(t){if(this.studentEntryStudentSortKey===t){this.studentEntryStudentSortDirection=this.studentEntryStudentSortDirection==="asc"?"desc":"asc";return}this.studentEntryStudentSortKey=t,this.studentEntryStudentSortDirection=t==="studentName"?"asc":"desc"}getStudentEntryStudentSortIndicator(t){return this.studentEntryStudentSortKey!==t?"":this.studentEntryStudentSortDirection==="asc"?" \u25B2":" \u25BC"}openStudentEntryAssessorModal(t){return I(this,null,function*(){if(this.selectedStudentEntryAssessor=V(f({},t),{students:Array.isArray(t.students)?t.students:[]}),this.showStudentEntryAssessorModal=!0,Array.isArray(this.selectedStudentEntryAssessor.students)&&this.selectedStudentEntryAssessor.students.length>0)return;let e=String(this.userData?.faculty||"").trim(),n=String(t?.assessorId||"").trim();if(!(!e||!n)){this.isLoadingStudentEntryAssessorStudents=!0;try{let c=(yield this.loadFacultyAssessorDetailSummary(e,n))?.studentEntries?.assessorBreakdown?.find(g=>String(g?.assessorId||"").trim()===n);c&&this.selectedStudentEntryAssessor&&(this.selectedStudentEntryAssessor=V(f({},this.selectedStudentEntryAssessor),{students:Array.isArray(c.students)?c.students:[]}),this.facultyStatistics=V(f({},this.facultyStatistics),{studentEntries:V(f({},this.facultyStatistics.studentEntries),{assessorBreakdown:this.facultyStatistics.studentEntries.assessorBreakdown.map(g=>String(g?.assessorId||"").trim()!==n?g:V(f({},g),{students:this.selectedStudentEntryAssessor?.students||[]}))})}))}finally{this.isLoadingStudentEntryAssessorStudents=!1}}})}openStudentEntryStudentModal(t){this.selectedStudentEntryStudent=t,this.showStudentEntryStudentModal=!0}closeStudentEntryAssessorModal(){this.showStudentEntryAssessorModal=!1,this.isLoadingStudentEntryAssessorStudents=!1,this.selectedStudentEntryAssessor=null}closeStudentEntryStudentModal(){this.showStudentEntryStudentModal=!1,this.selectedStudentEntryStudent=null}get selectedSiteVisitAssessorStudents(){let t=this.selectedSiteVisitAssessor?.students||[],e=this.siteVisitStudentSortKey,n=this.siteVisitStudentSortDirection;return[...t].sort((d,c)=>{if(e==="studentName"){let C=String(d?.studentName||"").trim().toLowerCase(),Q=String(c?.studentName||"").trim().toLowerCase(),Y=C.localeCompare(Q);return n==="asc"?Y:-Y}let g=this.getDateSortValue(d?.[e]),m=this.getDateSortValue(c?.[e]),h=Number.isFinite(g),P=Number.isFinite(m);if(!h&&!P)return String(d?.studentName||"").localeCompare(String(c?.studentName||""));if(!h)return 1;if(!P)return-1;let T=g-m;return Math.abs(T)>.001?n==="asc"?T:-T:String(d?.studentName||"").localeCompare(String(c?.studentName||""))})}setSiteVisitStudentSort(t){if(this.siteVisitStudentSortKey===t){this.siteVisitStudentSortDirection=this.siteVisitStudentSortDirection==="asc"?"desc":"asc";return}this.siteVisitStudentSortKey=t,this.siteVisitStudentSortDirection=t==="nextBookedVisitDate"?"asc":"desc"}getSiteVisitStudentSortIndicator(t){return this.siteVisitStudentSortKey!==t?"":this.siteVisitStudentSortDirection==="asc"?" \u25B2":" \u25BC"}getDateSortValue(t){if(!t)return Number.NaN;let e=Date.parse(t);return Number.isFinite(e)?e:Number.NaN}openSiteVisitAssessorModal(t){return I(this,null,function*(){if(this.selectedSiteVisitAssessor=V(f({},t),{students:Array.isArray(t.students)?t.students:[]}),this.showSiteVisitAssessorModal=!0,Array.isArray(this.selectedSiteVisitAssessor.students)&&this.selectedSiteVisitAssessor.students.length>0)return;let e=String(this.userData?.faculty||"").trim(),n=String(t?.asse
1ssorId||"").trim();if(!(!e||!n)){this.isLoadingSiteVisitAssessorStudents=!0;try{let c=(yield this.loadFacultyAssessorDetailSummary(e,n))?.siteVisits?.assessorBreakdown?.find(g=>String(g?.assessorId||"").trim()===n);c&&this.selectedSiteVisitAssessor&&(this.selectedSiteVisitAssessor=V(f({},this.selectedSiteVisitAssessor),{students:Array.isArray(c.students)?c.students:[]}),this.facultyStatistics=V(f({},this.facultyStatistics),{siteVisits:V(f({},this.facultyStatistics.siteVisits),{assessorBreakdown:this.facultyStatistics.siteVisits.assessorBreakdown.map(g=>String(g?.assessorId||"").trim()!==n?g:V(f({},g),{students:this.selectedSiteVisitAssessor?.students||[]}))})}))}finally{this.isLoadingSiteVisitAssessorStudents=!1}}})}closeSiteVisitAssessorModal(){this.showSiteVisitAssessorModal=!1,this.isLoadingSiteVisitAssessorStudents=!1,this.selectedSiteVisitAssessor=null}setQualificationBenchmarkMetric(t){this.qualificationBenchmarkMetric=t}getQualificationAssessorMetric(t){switch(this.qualificationBenchmarkMetric){case"units":return t.units;case"modules":return t.modules;case"years":return t.years;default:return t.elements}}getQualificationStudentStatus(t){switch(this.qualificationBenchmarkMetric){case"units":return t.units;case"modules":return t.modules;case"years":return t.years;default:return t.elements}}openQualificationAssessorModal(t){return I(this,null,function*(){if(this.selectedQualificationAssessor=V(f({},t),{students:Array.isArray(t.students)?t.students:[]}),this.showQualificationAssessorModal=!0,Array.isArray(this.selectedQualificationAssessor.students)&&this.selectedQualificationAssessor.students.length>0)return;let e=String(this.userData?.faculty||"").trim(),n=String(t?.assessorId||"").trim();if(!(!e||!n)){this.isLoadingQualificationAssessorStudents=!0;try{let c=(yield this.loadFacultyAssessorDetailSummary(e,n))?.qualificationProgress?.assessorBreakdown?.find(g=>String(g?.assessorId||"").trim()===n);c&&this.selectedQualificationAssessor&&(this.selectedQualificationAssessor=V(f({},this.selectedQualificationAssessor),{students:Array.isArray(c.students)?c.students:[]}),this.facultyStatistics=V(f({},this.facultyStatistics),{qualificationProgress:V(f({},this.facultyStatistics.qualificationProgress),{assessorBreakdown:this.facultyStatistics.qualificationProgress.assessorBreakdown.map(g=>String(g?.assessorId||"").trim()!==n?g:V(f({},g),{students:this.selectedQualificationAssessor?.students||[]}))})}))}finally{this.isLoadingQualificationAssessorStudents=!1}}})}openQualificationForStudent(t){this.selectedStudentQualification=t,this.showStudentQualificationModal=!0}closeStudentQualificationModal(){this.showStudentQualificationModal=!1,this.selectedStudentQualification=null}closeQualificationAssessorModal(){this.showQualificationAssessorModal=!1,this.isLoadingQualificationAssessorStudents=!1,this.selectedQualificationAssessor=null}formatMainCardPeriodRows(t){return[`All Time: ${this.formatCount(t.allTime)}`,`Last 30 Days: ${this.formatCount(t.last30)}`,`This Year: ${this.formatCount(t.thisYear)}`].join(`
2`)}buildFacultyStatisticsCards(){let t=this.facultyStatistics,e=this.facultyStatisticsPeriods;this.facultyStatisticsCards=[{key:"users",title:"Students / Trainees",value:"",userRows:[{label:"All users",value:this.formatCount(e.users.total.allTime)},{label:"Students",value:this.formatCount(e.users.students.allTime)},{label:"Assessors/Tutors",value:this.formatCount(e.users.tutors.allTime)},{label:"Employers",value:this.formatCount(e.users.employers.allTime)}],subtitle:"",icon:"people-outline",color:"primary"},{key:"studentEntries",title:"Student Entries",value:"",studentEntryRows:[{label:"Total entries (all time)",value:this.formatCount(e.studentEntries.total.allTime)},{label:"Total entries (last 30)",value:this.formatCount(e.studentEntries.total.last30)},{label:"Students with an entry (last 30)",value:this.formatCount(e.studentEntries.studentsWithEntries.last30)},{label:"Average per student (last 30)",value:this.formatAverageValue(e.studentEntries.total.last30,e.users.students.allTime)}],subtitle:"",icon:"document-text-outline",color:"tertiary"},{key:"qualificationProgress",title:"Qualification Progress",value:"",qualificationRows:[{label:"Elements/LO's",onTrack:this.formatPercent(t.qualificationProgress.benchmarks.elements.onTrackPercent),behind:this.formatPercent(t.qualificationProgress.benchmarks.elements.behindPercent)},{label:"Units",onTrack:this.formatPercent(t.qualificationProgress.benchmarks.units.onTrackPercent),behind:this.formatPercent(t.qualificationProgress.benchmarks.units.behindPercent)},{label:"Courses/modules",onTrack:this.formatPercent(t.qualificationProgress.benchmarks.modules.onTrackPercent),behind:this.formatPercent(t.qualificationProgress.benchmarks.modules.behindPercent)},{label:"Year Progress",onTrack:this.formatPercent(t.qualificationProgress.benchmarks.years.onTrackPercent),behind:this.formatPercent(t.qualificationProgress.benchmarks.years.behindPercent)}],subtitle:"",icon:"create-outline",color:"success"},{key:"siteVisits",title:"Site Visits",value:"",siteVisitRows:[{label:"Last site visit in last 30 days",value:this.formatPercent(t.siteVisits.completedLast30Percent)},{label:"Booked in next 30 days",value:this.formatPercent(t.siteVisits.bookedNext30Percent)},{label:"Report completed in last 30 days",value:this.formatPercent(t.siteVisits.reportCompletedLast30Percent)}],subtitle:"",icon:"calendar-outline",color:"warning"}]}loadFacultyStatistics(){return I(this,null,function*(){let t=++this.statsLoadVersion;if(!this.isFacultyViewActive)return;if(!this.userData?.faculty){this.facultyStatistics=f({},z),this.facultyStatisticsPeriods=f({},U),this.buildFacultyStatisticsCards();return}let e=String(this.userData.faculty||"").trim(),n=this.readFacultyStatsCache(e);n?(this.facultyStatistics=n.stats,this.facultyStatisticsPeriods=n.periods,this.buildFacultyStatisticsCards(),this.isLoadingStats=!1,this.statsLoadError=""):(this.isLoadingStats=!0,this.statsLoadError="");try{let d=yield this.loadFacultyStatisticsFromSummaryEndpoint(e);if(!this.isFacultyViewActive||(this.facultyStatistics=d||f({},z),d?this.writeFacultyStatsCache(e):this.facultyStatisticsPeriods=f({},U),t!==this.statsLoadVersion||!this.isFacultyViewActive))return;this.buildFacultyStatisticsCards()}catch{if(t!==this.statsLoadVersion||!this.isFacultyViewActive)return;n||(this.facultyStatistics=f({},z),this.facultyStatisticsPeriods=f({},U),this.buildFacultyStatisticsCards())}finally{this.isFacultyViewActive&&t===this.statsLoadVersion&&(this.isLoadingStats=!1)}})}get activeFacultyStatisticsTitle(){switch(this.activeStatisticsKey){case"studentEntries":return"Student Entries";case"qualificationProgress":return"Qualification Progress";case"siteVisits":return"Site Visits";default:return"Users"}}get activeFacultyStatisticsSubtitle(){switch(this.activeStatisticsKey){case"studentEntries":return"Overview of logged work entries for students in this faculty.";case"qualificationProgress":return"On track vs behind percentages based on the same three qualification progress lines shown on the student menu.";case"siteVisits":return"Site visit completion, booking, and report completion percentages by tutor/assessor.";default:return"User metrics for last 30 days and this year will be incorrect until we update the students."}}get activeFacultyStatisticsGroups(){let t=this.facultyStatistics,e=this.facultyStatisticsPeriods;switch(this.activeStatisticsKey){case"studentEntries":return[this.buildPeriodGroup("Total entries",e.studentEntries.total,"Rows matching students in this faculty."),this.buildPeriodGroup("Students with entries",e.studentEntries.studentsWithEntries,"Distinct students with at least one matching entry."),{title:"Average per student",note:"Average entr
2ies per student in this faculty.",rows:[{label:"All Time",value:this.formatAverageValue(e.studentEntries.total.allTime,e.users.students.allTime)},{label:"Last 30 Days",value:this.formatAverageValue(e.studentEntries.total.last30,e.users.students.allTime)},{label:"This Year",value:this.formatAverageValue(e.studentEntries.total.thisYear,e.users.students.allTime)}]}];case"qualificationProgress":return[{title:`Overall student status (${this.formatCount(t.qualificationProgress.benchmarkedStudents)} students)`,note:"Aggregated from the three student-menu progress lines.",rows:[{label:"On Track",value:this.formatPercent(t.qualificationProgress.onTrackPercent)},{label:"Behind",value:this.formatPercent(t.qualificationProgress.behindPercent)}]},{title:"Elements/LO's line",note:"Student-menu line: % of elements/LO's complete.",rows:[{label:"On Track",value:this.formatPercent(t.qualificationProgress.benchmarks.elements.onTrackPercent)},{label:"Behind",value:this.formatPercent(t.qualificationProgress.benchmarks.elements.behindPercent)}]},{title:"Units line",note:"Student-menu line: % of units completed.",rows:[{label:"On Track",value:this.formatPercent(t.qualificationProgress.benchmarks.units.onTrackPercent)},{label:"Behind",value:this.formatPercent(t.qualificationProgress.benchmarks.units.behindPercent)}]},{title:"Courses/modules line",note:"Student-menu line: % of courses/modules completed.",rows:[{label:"On Track",value:this.formatPercent(t.qualificationProgress.benchmarks.modules.onTrackPercent)},{label:"Behind",value:this.formatPercent(t.qualificationProgress.benchmarks.modules.behindPercent)}]}];case"siteVisits":return[{title:"Faculty site visit coverage",note:"Percentages are based on active students in this faculty.",rows:[{label:"Last site visit in last 30 days",value:this.formatPercent(t.siteVisits.completedLast30Percent)},{label:"Site visit booked in next 30 days",value:this.formatPercent(t.siteVisits.bookedNext30Percent)},{label:"Report completed in last 30 days",value:this.formatPercent(t.siteVisits.reportCompletedLast30Percent)}]}];default:return[this.buildPeriodGroup("Total users",e.users.total,"Users matching this faculty in this period."),this.buildPeriodGroup("Students",e.users.students,"Student users in this period."),this.buildPeriodGroup("Tutors / assessors",e.users.tutors,"Tutor/HOD users in this period."),this.buildPeriodGroup("Employers",e.users.employers,"Employer users in this period."),this.buildPeriodGroup("Archived users",e.users.archived,"Archived users in this period.")]}}openFacultyStatisticsModal(t){this.activeStatisticsKey=t,t==="qualificationProgress"&&(this.qual
2ificationBenchmarkMetric="elements"),this.showStatisticsModal=!0}closeFacultyStatisticsModal(){this.showStatisticsModal=!1,this.closeQualificationAssessorModal(),this.closeSiteVisitAssessorModal(),this.closeStudentEntryAssessorModal(),this.closeStudentEntryStudentModal()}goToMenuContent(){this.blurActiveElement(),this.router.navigate(["/hod-menu-content"])}goToManageStaff(){this.blurActiveElement(),this.router.navigate(["/hod-manage-staff"])}goToQualificationContent(){this.blurActiveElement(),this.router.navigate(["/hod-qualification-content"])}goToFacultySettings(){this.blurActiveElement(),this.router.navigate(["/hod-faculty-settings"])}goBack(){this.blurActiveElement(),this.router.navigate(["/main"])}blurActiveElement(){let t=document.activeElement;t&&typeof t.blur=="function"&&t.blur()}};u.\u0275fac=function(e){return new(e||u)},u.\u0275cmp=X({type:u,selectors:[["app-hod-faculty"]],decls:56,vars:30,consts:[["color","primary"],["slot","start"],["defaultHref","/main",3,"click"],[1,"ion-padding"],[1,"faculty-stats-section-card"],[1,"faculty-stats-section-header"],["color","danger"],["color","warning"],[1,"faculty-stats-loading-state"],[1,"faculty-stats-grid"],[3,"didDismiss","isOpen"],["expand","block","color","primary",1,"management-btn",3,"click"],["slot","start","name","people-outline"],["slot","start","name","list-outline"],["expand","block",1,"management-btn",3,"click"],["slot","start","name","document-text-outline"],["slot","start","name","settings-outline"],["class","loading-overlay",4,"ngIf"],["aria-hidden","true",1,"faculty-stats-grid"],["size","12","sizeMd","6"],[1,"faculty-stats-loading-overlay"],["name","crescent"],[1,"faculty-stat-card","faculty-stat-card-placeholder"],[1,"faculty-stat-card-top"],[1,"faculty-stat-placeholder-icon"],[1,"faculty-stat-placeholder-badge"],[1,"faculty-stat-placeholder-title"],[1,"faculty-stat-placeholder-grid"],["button","true",1,"faculty-stat-card",3,"click"],[1,"faculty-stat-icon-wrap"],[3,"name"],[1,"faculty-stat-badge",3,"color"],[1,"faculty-stat-title"],[1,"faculty-stat-qual-rows"],[1,"faculty-stat-six-grid"],[1,"faculty-stat-value"],[1,"faculty-stat-subtitle"],[1,"faculty-stat-qual-head"],[1,"faculty-stat-qual-row"],[1,"faculty-stat-six-cell"],["slot","end"],[3,"click"],[1,"faculty-stats-modal-copy"],["lines","none",1,"faculty-stats-detail-list"],[1,"qualification-benchmark-toggle"],["size","small",3,"click","fill"],[1,"qualification-benchmark-legend"],[1,"legend-item"],[1,"legend-swatch","legend-behind"],[1,"legend-swatch","legend-on-track"],[1,"qualification-assessor-graph-list"],["type","button",1,"qualification-assessor-graph-row"],["type","button",1,"qualification-assessor-graph-row",3,"click"],[1,"qualification-assessor-row-info"],[1,"qualification-assessor-name"],[1,"qualification-assessor-count"],[1,"qualification-assessor-bar-wrap"],[1,"qualification-assessor-bar-segment","segment-behind"],[1,"qualification-assessor-bar-segment","segment-on-track"],[1,"student-entry-assessor-header"],["type","button",3,"click"],[1,"student-entry-assessor-grid"],[1,"student-entry-assessor-name-wrap"],[1,"site-visit-assessor-header"],[1,"site-visit-assessor-grid"],[1,"site-visit-assessor-name-wrap"],[1,"faculty-stats-group-line-header"],[1,"faculty-stats-detail-item"],[1,"faculty-stats-loading-wrap"],["button","true",1,"faculty-stats-detail-item"],["button","true",1,"faculty-stats-detail-item",3,"click"],[3,"color"],[1,"site-visit-student-table-header"],[1,"site-visit-student-table-body"],[1,"site-visit-student-table-row"],[1,"site-visit-student-name"],[1,"student-entry-student-table-header"],[1,"student-entry-student-table-body"],["type","button",1,"student-entry-student-table-row"],["type","button",1,"student-entry-student-table-row",3,"click"],[1,"student-qualification-view"],["lines","none",1,"student-qualification-metrics"],[1,"student-qualification-metric-header"],[1,"student-qualification-metric-item"],[1,"student-units-section"],[1,"student-units-header"],["lines","none",1,"student-units-list"],[1,"student-units-empty"],[1,"student-unit-item"],[1,"student-debug-json"],[1,"loading-overlay"]],template:function(e,n){e&1&&(r(0,"ion-header")(1,"ion-toolbar",0)(2,"ion-buttons",1)(3,"ion-back-button",2),S("click",function(){return n.goBack()}),s()(),r(4,"ion-title"),l(5),F(6,"translate"),s()()(),r(7,"ion-content",3)(8,"ion-card",4)(9,"ion-card-header",5)(10,"ion-card-title"),l(11),F(12,"translate"),s(),r(13,"ion-card-subtitle"),l(14,"Tap a card to open a deeper breakdown for that category."),s(),r(15,"ion-note",6),l(16,"These statistics are a work in progress and we will be making them editable, Please contact us with what options you want."),s(),k(17,Jt,2,1,"ion-note",7),s(),r(18,"ion-card-content"),k(19,Xt,7,
20,"div",8)(20,ue,4,0,"ion-grid",9),s()(),r(21,"ion-modal",10),S("didDismiss",function(){return n.closeFacultyStatisticsModal()}),D(22,Ce,17,3,"ng-template"),s(),r(23,"ion-modal",10),S("didDismiss",function(){return n.closeQualificationAssessorModal()}),D(24,ke,13,3,"ng-template"),s(),r(25,"ion-modal",10),S("didDismiss",function(){return n.closeSiteVisitAssessorModal()}),D(26,Te,13,2,"ng-template"),s(),r(27,"ion-modal",10),S("didDismiss",function(){return n.closeStudentEntryAssessorModal()}),D(28,Oe,13,2,"ng-template"),s(),r(29,"ion-modal",10),S("didDismiss",function(){return n.closeStudentQualificationModal()}),D(30,$e,9,3,"ng-template"),s(),r(31,"ion-modal",10),S("didDismiss",function(){return n.closeStudentEntryStudentModal()}),D(32,Ue,9,2,"ng-template"),s(),r(33,"ion-card")(34,"ion-card-header")(35,"ion-card-title"),l(36),F(37,"translate"),s()(),r(38,"ion-card-content")(39,"ion-button",11),S("click",function(){return n.goToManageStaff()}),O(40,"ion-icon",12),l(41),F(42,"translate"),s(),r(43,"ion-button",11),S("click",function(){return n.goToMenuContent()}),O(44,"ion-icon",13),l(45),F(46,"translate"),s(),r(47,"ion-button",14),S("click",function(){return n.goToQualificationContent()}),O(48,"ion-icon",15),l(49),F(50,"translate"),s(),r(51,"ion-button",11),S("click",function(){return n.goToFacultySettings()}),O(52,"ion-icon",16),l(53),F(54,"translate"),s()()(),D(55,Ke,2,0,"div",17),s()),e&2&&(o(5),_(q(6,16,"Faculty Management")),o(6),_(q(12,18,"Faculty Statistics")),o(6),E(!n.isLoadingStats&&n.statsLoadError?17:-1),o(2),E(n.isLoadingStats?19:20),o(2),v("isOpen",n.showStatisticsModal),o(2),v("isOpen",n.showQualificationAssessorModal),o(2),v("isOpen",n.showSiteVisitAssessorModal),o(2),v("isOpen",n.showStudentEntryAssessorModal),o(2),v("isOpen",n.showStudentQualificationModal),o(2),v("isOpen",n.showStudentEntryStudentModal),o(5),_(q(37,20,"Content Management")),o(5),b(" ",q(42,22,"Manage Staff")," "),o(4),b(" ",q(46,24,"Menu Content")," "),o(4),b(" ",q(50,26,"Qualification Content")," "),o(4),b(" ",q(54,28,"Faculty Settings")," "),o(2),v("ngIf",n.isLoading))},dependencies:[rt,nt,ct,Dt,Pt,Vt,ht,dt,Tt,bt,gt,ft,yt,_t,St,pt,Ot,Ct,Ft,xt,mt,kt,Et,ut,vt,wt,Mt,at,st,Lt],styles:[".faculty-stats-section-card[_ngcontent-%COMP%]{overflow:hidden}.faculty-stats-section-header[_ngcontent-%COMP%]{padding-bottom:0}.faculty-stats-grid[_ngcontent-%COMP%]{padding:0}.faculty-stats-loading-wrap[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;padding:18px 0 6px}.faculty-stats-loading-state[_ngcontent-%COMP%]{position:relative}.faculty-stats-loading-overlay[_ngcontent-%COMP%]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none}.faculty-stat-card[_ngcontent-%COMP%]{margin:0;height:100%;border:1px solid rgba(0,0,0,.05);border-radius:18px;box-shadow:0 10px 30px #21293614;transition:transform .14s ease,box-shadow .14s ease,border-color .14s ease;cursor:pointer}.faculty-stat-card[_ngcontent-%COMP%]:hover{transform:translateY(-2px);box-shadow:0 16px 34px #2129361f;border-color:rgba(var(--ion-color-primary-rgb),.28)}.faculty-stat-card[_ngcontent-%COMP%]   ion-card-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px}.faculty-stat-card-placeholder[_ngcontent-%COMP%]{min-height:178px;padding:16px;cursor:default;opacity:.55;background:#f8fafc}.faculty-stat-card-placeholder[_ngcontent-%COMP%]:hover{transform:none;box-shadow:0 10px 30px #21293614;border-color:#0000000d}.faculty-stat-placeholder-icon[_ngcontent-%COMP%], .faculty-stat-placeholder-badge[_ngcontent-%COMP%], .faculty-stat-placeholder-title[_ngcontent-%COMP%], .faculty-stat-placeholder-grid[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{border-radius:999px;background:linear-gradient(90deg,#e5e7eb,#f3f4f6,#e5e7eb)}.faculty-stat-placeholder-icon[_ngcontent-%COMP%]{width:42px;height:42px;border-radius:14px}.faculty-stat-placeholder-badge[_ngcontent-%COMP%]{width:78px;height:22px}.faculty-stat-placeholder-title[_ngcontent-%COMP%]{width:55%;height:18px;margin-top:14px}.faculty-stat-placeholder-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:12px}.faculty-stat-placeholder-grid[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{height:46px;border-radius:10px}.faculty-stat-card-top[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}.faculty-stat-icon-wrap[_ngcontent-%COMP%]{width:42px;height:42px;border-radius:14px;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:1.1rem}.faculty-stat-icon-primary[_ngcontent-%COMP%]{background:linear-gradient(135deg,var(--ion-color-primary),var(--ion-color-primary-tint))}.faculty-stat-icon-tertiary[_ngcontent-%COMP%]{background:linear-gradient(135deg,var(--ion-color-tertiary),var(--ion-color-tertiary-tint))}.faculty-stat-icon-success[_ngcontent-%COMP%]{background:linear-gradient(135deg,var(--ion-color-success),#4ade80)}.faculty-stat-icon-warning[_ngcontent-%COMP%]{background:linear-gradient(135deg,var(--ion-color-warning),#f59e0b)}.faculty-stat-badge[_ngcontent-%COMP%]{--padding-start: 10px;--padding-end: 10px;font-size:.7rem}.faculty-stat-title[_ngcontent-%COMP%]{font-size:.95rem;font-weight:700;color:var(--ion-color-dark)}.faculty-stat-value[_ngcontent-%COMP%]{font-size:2rem;line-height:1;font-weight:800;letter-spacing:-.02em;color:var(--ion-color-dark)}.faculty-stat-split-values[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.faculty-stat-split-col[_ngcontent-%COMP%]{padding:6px 8px;border-radius:10px}.faculty-stat-split-label[_ngcontent-%COMP%]{font-size:.78rem;font-weight:700;color:var(--ion-color-medium-shade);text-transform:uppercase;letter-spacing:.02em}.faculty-stat-split-value[_ngcontent-%COMP%]{margin-top:2px;font-size:1.35rem;font-weight:800;line-height:1.1;color:var(--ion-color-dark)}.faculty-stat-qual-rows[_ngcontent-%COMP%]{display:grid;gap:3px}.faculty-stat-six-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.faculty-stat-six-cell[_ngcontent-%COMP%]{padding:8px;border-radius:10px;border:1px solid rgba(0,0,0,.05);min-height:62px;display:grid;align-content:space-between;gap:6px}.faculty-stat-six-cell[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{font-size:.72rem;color:var(--ion-color-medium-shade);line-height:1.2}.faculty-stat-six-cell[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{font-size:1.05rem;line-height:1;color:var(--ion-color-dark)}.faculty-stat-qual-head[_ngcontent-%COMP%], .faculty-stat-qual-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.3fr .8fr .8fr;gap:6px;align-items:center}.faculty-stat-qual-head[_ngcontent-%COMP%]{font-size:.72rem;text-transform:uppercase;color:var(--ion-color-medium-shade);font-weight:700}.faculty-stat-qual-row[_ngcontent-%COMP%]{font-size:.82rem;padding:2px 0;border-bottom:1px solid rgba(0,0,0,.05)}.faculty-stat-qual-row[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]:nth-child(2), .faculty-stat-qual-row[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]:nth-child(3){font-weight:700}.faculty-stat-subtitle[_ngcontent-%COMP%]{font-size:.9rem;color:var(--ion-color-medium-shade);line-height:1.35;white-space:pre-line}.faculty-stats-modal-copy[_ngcontent-%COMP%]{display:grid;gap:8px;margin-bottom:14px}.faculty-stats-modal-copy[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0;line-height:1.45;color:var(--ion-color-medium-shade)}.faculty-stats-detail-list[_ngcontent-%COMP%]{background:transparent}.faculty-stats-group-line-header[_ngcontent-%COMP%]{margin:6px 0 2px;padding-top:6px;border-top:1px solid var(--ion-color-light-shade)}.faculty-stats-group-line-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0 0 4px;font-size:.92rem;font-weight:700;color:var(--ion-color-dark)}.faculty-stats-group-line-header[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0;font-size:.82rem;color:var(--ion-color-medium-shade)}.faculty-stats-detail-item[_ngcontent-%COMP%]{--min-height: 28px;--padding-start: 0;--padding-end: 0;--inner-padding-top: 0;--inner-padding-bottom: 0;--inner-padding-end: 0;--background: transparent;margin-bottom:1px;border-bottom:1px solid rgba(0,0,0,.06);padding:2px 0;align-items:flex-start}
2.faculty-stats-detail-item[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]{margin:0;font-size:.86rem;font-weight:600;color:var(--ion-color-dark)}.faculty-stats-detail-item[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--ion-color-medium-shade)}.faculty-stats-detail-item[_ngcontent-%COMP%]   ion-badge[_ngcontent-%COMP%]{align-self:center;margin-left:8px;font-size:.82rem}.qualification-benchmark-toggle[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.qualification-benchmark-legend[_ngcontent-%COMP%]{display:flex;gap:12px;margin:4px 0 10px;font-size:.82rem;color:var(--ion-color-medium-shade)}.legend-item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px}.legend-swatch[_ngcontent-%COMP%]{width:10px;height:10px;border-radius:999px}.legend-behind[_ngcontent-%COMP%]{background:#d90429}.legend-on-track[_ngcontent-%COMP%]{background:#7fb685}.qualification-assessor-graph-list[_ngcontent-%COMP%]{display:grid;gap:10px}.site-visit-assessor-header[_ngcontent-%COMP%], .site-visit-assessor-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(160px,1.6fr) repeat(3,minmax(90px,.8fr));gap:10px;align-items:center}.site-visit-assessor-header[_ngcontent-%COMP%]{margin-bottom:8px;font-size:.72rem;text-transform:uppercase;color:var(--ion-color-medium-shade);font-weight:700}.site-visit-assessor-header[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;text-align:left;color:inherit;font-size:inherit;font-weight:inherit;text-transform:inherit;cursor:pointer}.site-visit-assessor-grid[_ngcontent-%COMP%]{width:100%}.site-visit-assessor-grid[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{font-size:.92rem;font-weight:700}.site-visit-assessor-name-wrap[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;min-width:0}.student-entry-assessor-header[_ngcontent-%COMP%], .student-entry-assessor-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(170px,1.5fr) repeat(3,minmax(110px,.85fr));gap:10px;align-items:center}.student-entry-assessor-header[_ngcontent-%COMP%]{margin-bottom:8px;font-size:.72rem;text-transform:uppercase;color:var(--ion-color-medium-shade);font-weight:700}.student-entry-assessor-header[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;text-align:left;color:inherit;font-size:inherit;font-weight:inherit;text-transform:inherit;cursor:pointer}.student-entry-assessor-grid[_ngcontent-%COMP%]{width:100%;padding:10px 12px;border-radius:12px;border:1px solid rgba(0,0,0,.06)}.student-entry-assessor-grid[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{font-size:.92rem;font-weight:700}.student-entry-assessor-name-wrap[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;min-width:0}.student-entry-student-table-header[_ngcontent-%COMP%], .student-entry-student-table-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(170px,1.4fr) repeat(2,minmax(110px,.9fr));gap:10px;align-items:center}.student-entry-student-table-header[_ngcontent-%COMP%]{margin-bottom:8px;font-size:.72rem;text-transform:uppercase;color:var(--ion-color-medium-shade);font-weight:700}.student-entry-student-table-header[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;text-align:left;color:inherit;font-size:inherit;font-weight:inherit;text-transform:inherit;cursor:pointer}.student-entry-student-table-body[_ngcontent-%COMP%]{display:grid;gap:8px}.student-entry-student-table-row[_ngcontent-%COMP%]{width:100%;border:1px solid rgba(0,0,0,.06);border-radius:10px;background:#ffffffeb;padding:10px 12px;text-align:left;cursor:pointer}.student-entry-student-table-row[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{font-size:.92rem;font-weight:700}.site-visit-student-table-header[_ngcontent-%COMP%], .site-visit-student-table-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(150px,1.3fr) repeat(3,minmax(120px,1fr));gap:10px;align-items:center}.site-visit-student-table-header[_ngcontent-%COMP%]{margin-bottom:8px;padding:0 2px;font-size:.72rem;text-transform:uppercase;color:var(--ion-color-medium-shade);font-weight:700}.site-visit-student-table-header[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;text-align:left;color:inherit;font-size:inherit;font-weight:inherit;text-transform:inherit;cursor:pointer}.site-visit-student-table-body[_ngcontent-%COMP%]{display:grid;gap:8px}.site-visit-student-table-row[_ngcontent-%COMP%]{border:1px solid var(--ion-color-light-shade);border-radius:10px;padding:10px}.site-visit-student-table-row[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{font-size:.84rem;color:var(--ion-color-dark)}
2.site-visit-student-name[_ngcontent-%COMP%]{font-weight:600}.qualification-assessor-graph-row[_ngcontent-%COMP%]{border:1px solid var(--ion-color-light-shade);border-radius:10px;padding:8px 10px;text-align:left;display:flex;align-items:center;gap:10px}.qualification-assessor-row-info[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;min-width:140px;flex-shrink:0}.qualification-assessor-name[_ngcontent-%COMP%]{font-size:.85rem;font-weight:600;color:var(--ion-color-dark)}.qualification-assessor-count[_ngcontent-%COMP%]{font-size:.75rem;color:var(--ion-color-medium-shade)}.qualification-assessor-bar-wrap[_ngcontent-%COMP%]{display:flex;flex:1;min-width:160px;min-height:26px;border-radius:8px;overflow:hidden}.qualification-assessor-bar-segment[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700;color:#fff;white-space:nowrap}.segment-behind[_ngcontent-%COMP%]{background:#d90429}.segment-on-track[_ngcontent-%COMP%]{background:#7fb685}.student-qualification-view[_ngcontent-%COMP%]{display:grid;gap:12px}.student-qualification-metrics[_ngcontent-%COMP%]{background:transparent}.student-qualification-metric-header[_ngcontent-%COMP%]{margin:6px 0 8px;padding-bottom:4px;border-bottom:1px solid var(--ion-color-light-shade)}.student-qualification-metric-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0;font-size:.9rem;font-weight:700;color:var(--ion-color-dark)}.student-qualification-metric-item[_ngcontent-%COMP%]{--min-height: 28px;--padding-start: 0;--padding-end: 0;--inner-padding-top: 0;--inner-padding-bottom: 0;--inner-padding-end: 0;--background: transparent;margin-bottom:1px;border-bottom:1px solid rgba(0,0,0,.06);padding:6px 0;align-items:flex-start}.student-qualification-metric-item[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]{margin:0;font-size:.88rem;font-weight:600;color:var(--ion-color-dark)}.student-qualification-metric-item[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:2px 0 0;font-size:.82rem;color:var(--ion-color-medium-shade)}.student-qualification-metric-item[_ngcontent-%COMP%]   ion-badge[_ngcontent-%COMP%]{align-self:center;margin-left:8px;font-size:.78rem}.student-units-section[_ngcontent-%COMP%]{margin-top:16px;border-top:1px solid var(--ion-color-light-shade);padding-top:12px}.student-units-header[_ngcontent-%COMP%]{margin-bottom:8px}.student-units-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:0;font-size:.9rem;font-weight:700;color:var(--ion-color-dark)}.student-units-list[_ngcontent-%COMP%]{background:transparent}.student-unit-item[_ngcontent-%COMP%]{--min-height: 28px;--padding-start: 0;--padding-end: 0;--inner-padding-top: 0;--inner-padding-bottom: 0;--inner-padding-end: 0;--background: transparent;margin-bottom:1px;border-bottom:1px solid rgba(0,0,0,.06);padding:6px 0;align-items:flex-start}.student-unit-item[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]{margin:0;font-size:.85rem;font-weight:600;color:var(--ion-color-dark)}.student-unit-item[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:2px 0 0;font-size:.78rem;color:var(--ion-color-medium-shade)}.student-unit-item[_ngcontent-%COMP%]   ion-badge[_ngcontent-%COMP%]{align-self:center;margin-left:8px;font-size:.72rem}.student-units-empty[_ngcontent-%COMP%]{margin:8px 0 0;font-size:.82rem;color:var(--ion-color-medium-shade);text-align:center}.student-debug-json[_ngcontent-%COMP%]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;border:1px solid var(--ion-color-light-shade);color:#2a2f3a;font-size:.72rem;line-height:1.35;white-space:pre-wrap;word-break:break-word}.management-btn[_ngcontent-%COMP%]{margin-bottom:12px;text-align:start}.loading-overlay[_ngcontent-%COMP%]{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0000004d;z-index:1000}ion-card[_ngcontent-%COMP%]{margin-bottom:16px;box-shadow:0 2px 4px #0000001a}"]});let a=u;return a})();export{li as HodFacultyPage};

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.