1import{a as V,b as fe,c as I,d as _e}from"./chunk-3DOPPFZZ.js";import{a as be,b as He}from"./chunk-NE22VKN5.js";import"./chunk-AEK7Z5QZ.js";import{a as ke}from"./chunk-BFPYKIIC.js";import{a as Re}from"./chunk-4CVZBQNN.js";import{b as je}from"./chunk-4D5SN44G.js";import"./chunk-6Q5DDO7R.js";import"./chunk-U22BTVEZ.js";import{Cc as de,Ec as se,Gc as Ne,Hc as $e,Kb as re,Mb as le,Qc as me,Wc as pe,d as X,id as ce,jb as oe,k as ee,kh as We,re as xe,se as ue,ve as he,xb as Oe}from"./chunk-X5J6QTCG.js";import{$ as Y,$a as x,Ad as Ie,Fa as o,Hb as F,Ib as e,Jb as h,Ka as P,Kb as f,Lb as H,Lc as Z,Ma as G,Na as K,Qb as M,Rb as O,Sa as S,Sb as N,U as L,Xa as Te,Yc as z,_ as Le,ba as Fe,bb as u,cc as D,d as q,dc as w,ec as Q,fa as j,fi as Me,ga as J,gb as s,hb as i,hd as Be,ib as n,jb as p,lc as b,mc as v,nc as y,pj as ae,qb as B,qc as E,r as Ae,sb as T,tb as c,vd as te,xd as ie,yd as ne}from"./chunk-SMW7PHYX.js";import"./chunk-BMIYOSOG.js";var $=(()=>{let r=class r{constructor(l){this.webAPI=l,this.baseUrl="admin/job-performance"}getOverview(l,m){return this.webAPI.getData(`${this.baseUrl}/overview`,this.buildQueryParams(l,m))}getJobDetail(l,m){return this.webAPI.getData(`${this.baseUrl}/job/${l}`,this.buildQueryParams(m))}getFilterOptions(){return this.webAPI.getData("admin/job-log/filter-options")}buildQueryParams(l,m){let d=new Be().set("days",l.toString());return m&&(d=d.set("jobId",m.toString())),d}};r.\u0275fac=function(m){return new(m||r)(Fe(Me))},r.\u0275prov=Le({token:r,factory:r.\u0275fac,providedIn:"root"});let a=r;return a})();var R=(function(a){return a[a.LAST_1_DAY=1]="LAST_1_DAY",a[a.LAST_7_DAYS=7]="LAST_7_DAYS",a[a.LAST_30_DAYS=30]="LAST_30_DAYS",a[a.LAST_90_DAYS=90]="LAST_90_DAYS",a})(R||{}),ve=[{label:"24 Hours",value:R.LAST_1_DAY},{label:"7 Days",value:R.LAST_7_DAYS},{label:"30 Days",value:R.LAST_30_DAYS},{label:"90 Days",value:R.LAST_90_DAYS}],k=(function(a){return a.AVERAGE="average",a.P95="p95",a.TOTAL="total",a})(k||{}),Ue=[{label:"Average",value:k.AVERAGE},{label:"p95",value:k.P95},{label:"Total time",value:k.TOTAL}];function ge(a){return(a>0?"+":"")+a.toFixed(1)+"%"}function Se(a,r){return a?a>0===r?"text-success":"text-danger":""}function Ee(a){return a>0?"fa-regular fa-arrow-up":a<0?"fa-regular fa-arrow-down":"fa-regular fa-minus"}function A(){let a=getComputedStyle(document.documentElement),r=(t,l)=>a.getPropertyValue(t).trim()||l;return{neutral:r("--dashboard-color-default","#1D6AE5"),success:r("--dashboard-color-success","#00CE9B"),warning:r("--dashboard-color-medium","#FFAA02"),critical:r("--dashboard-color-critical","#EC4F2E"),muted:r("--dashboard-color-low","#c9d5dd"),grid:"#f0f0f0",surface:"#ffffff"}}function U(a){return{beginAtZero:!0,grid:a?{color:a}:{display:!1},ticks:{callback:r=>I(r)}}}function qe(a){let[r,t,l]=a.substring(0,10).split("-").map(Number);return new Date(r,t-1,l).toLocaleDateString(void 0,{month:"short",day:"numeric"})}function ye(a){if(!a?.length)return null;let r=A(),t=(l,m,d)=>({label:l,data:m,backgroundColor:d,borderColor:r.surface,borderWidth:2,borderRadius:3});
1return{type:"bar",data:{labels:a.map(l=>qe(l.date)),datasets:[t("Succeeded",a.map(l=>l.succeededRuns),r.success),t("Completed with errors",a.map(l=>l.completedWithErrorRuns),r.warning),t("Failed",a.map(l=>l.failedRuns),r.critical),t("Canceled",a.map(l=>l.canceledRuns),r.muted)]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{usePointStyle:!0,padding:16}},tooltip:{mode:"index",intersect:!1}},scales:{x:{stacked:!0,grid:{display:!1}},y:{stacked:!0,beginAtZero:!0,grid:{color:r.grid},title:{display:!0,text:"Runs"}}}}}}function we(a){if(!a?.length)return null;let r=A();return{type:"line",data:{labels:a.map(t=>qe(t.date)),datasets:[{label:"Average run",data:a.map(t=>t.averageDurationSeconds??null),borderColor:r.neutral,backgroundColor:"rgba(29, 106, 229, 0.08)",borderWidth:2,fill:!0,tension:.3,pointRadius:3,spanGaps:!0},{label:"Slowest run",data:a.map(t=>t.maxDurationSeconds??null),borderColor:r.warning,backgroundColor:"transparent",borderWidth:2,borderDash:[5,4],fill:!1,tension:.3,pointRadius:3,spanGaps:!0}]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{usePointStyle:!0,padding:16}},tooltip:{mode:"index",intersect:!1,callbacks:{label:t=>`${t.dataset.label}: ${I(t.parsed.y)}`}}},scales:{x:{grid:{display:!1}},y:U(r.grid)}}}}var Je=()=>["/admin/job-logs"],bt=a=>({jobId:a}),ft=()=>({}),Ye=a=>({"text-danger":a}),_t=()=>[25,50,100],Ge=a=>({jobLogId:a}),Ct=(a,r)=>({"text-danger fw-800":a,"text-success":r});function vt(a,r){if(a&1){let t=B();e(0,` 2 `),i(1,"div",12),e(2,` 3 `),i(3,"app-inline-alert",13),e(4),i(5,"button",14),T("click",function(){j(t);let m=c();return J(m.load())}),e(6,` 4 `),p(7,"i",15),e(8,`Retry 5 `),n(),e(9,` 6 `),n(),e(10,` 7 `),n(),e(11,` 8 `)}if(a&2){let t=c();o(4),f(` 9 `,t.error,` 10 `)}}function gt(a,r){a&1&&(e(0,` 11 `),p(1,"app-skeleton-template",16),e(2,` 12 `))}function St(a,r){if(a&1&&(e(0,` 13 `),i(1,"div",31),e(2,` 14 `),p(3,"i"),e(4),n(),e(5,` 15 `)),a&2){let t=c(2);o(),s("ngClass",t.changeClass(t.overview.runsChangePercent,!0)),o(2),F(t.changeIcon(t.overview.runsChangePercent)),o(),f(` 16 `,t.formatChange(t.overview.runsChangePercent),` vs prior window 17 `)}}function Et(a,r){if(a&1&&(e(0,` 18 `),i(1,"div",31),e(2,` 19 `),p(3,"i"),e(4),n(),e(5,` 20 `)),a&2){let t=c(2);o(),s("ngClass",t.changeClass(t.overview.successRateChangePoints,!0)),o(2),F(t.changeIcon(t.overview.successRateChangePoints)),o(),f(` 21 `,t.formatChange(t.overview.successRateChangePoints),` pts vs prior window 22 `)}}function yt(a,r){if(a&1&&(e(0,` 23 `),i(1,"div",31),e(2,` 24 `),p(3,"i"),e(4),n(),e(5,` 25 `)),a&2){let t=c(2);o(),s("ngClass",t.changeClass(t.overview.averageDurationChangePercent,!1)),o(2),F(t.changeIcon(t.overview.averageDurationChangePercent)),o(),f(` 26 `,t.formatChange(t.overview.averageDurationChangePercent),` vs prior window 27 `)}}function wt(a,r){a&1&&(e(0,` 28 `),i(1,"tr"),e(2,` 29 `),i(3,"th"),e(4,"Run"),n(),e(5,` 30 `),i(6,"th"),e(7,"Job"),n(),e(8,` 31 `),i(9,"th"),e(10,"Started"),n(),e(11,` 32 `),n(),e(12,` 33 `))}function Dt(a,r){if(a&1&&(e(0,` 34 `),i(1,"tr"),e(2,` 35 `),i(3,"td"),e(4,` 36 `),i(5,"a",53),e(6),n(),e(7,` 37 `),n(),e(8,` 38 `),i(9,"td")(10,"span",54),e(11),n()(),e(12,` 39 `),i(13,"td"),e(14,` 40 `),i(15,"span",55),e(16),b(17,"utcDate"),n(),e(18,` 41 `),n(),e(19,` 42 `),n(),e(20,` 43 `)),a&2){let t=r.$implicit;o(5),s("routerLink",D(8,Je))("queryParams",w(9,Ge,t.jobLogId)),o(),f("#",t.jobLogId),o(5),h(t.jobName),o(5),h(y(17,5,t.startDate,"MM/dd/yyyy hh:mm a"))}}function Pt(a,r){if(a&1&&(e(0,` 44 `),i(1,"div",49),e(2,` 45 `),i(3,"app-admin-dashboard-card",50),e(4,` 46 `),p(5,"app-tooltip",51),e(6,` 47 `),i(7,"div",47),e(8,` 48 `),i(9,"p-table",52),e(10,` 49 `),S(11,wt,13,0,"ng-template",null,0,E),e(13,` 50 `),S(14,Dt,21,11,"ng-template",null,1,E),e(16,` 51 `),n(),e(17,` 52 `),n(),e(18,` 53 `),n(),e(19,` 54 `),n(),e(20,` 55 `)),a&2){let t=c(3);o(5),s("renderAsLink",!1),o(4),s("value",t.overview.stuckRuns)}}function Tt(a,r){a&1&&(e(0,` 56 `),i(1,"tr"),e(2,` 57 `),i(3,"th"),e(4,"Job"),n(),e(5,` 58 `),i(6,"th"),e(7,"Schedule"),n(),e(8,`
59 `),i(9,"th"),e(10,"Last Run"),n(),e(11,` 60 `),n(),e(12,` 61 `))}function It(a,r){if(a&1&&(e(0,` 62 `),i(1,"span",55),e(2),b(3,"utcDate"),n(),e(4,` 63 `),i(5,"div",26),e(6),b(7,"number"),n(),e(8,` 64 `)),a&2){let t=c().$implicit;o(2),h(y(3,2,t.lastRunDate,"MM/dd/yyyy")),o(4),f("",y(7,5,t.daysSinceLastRun,"1.0-0")," days ago")}}function Rt(a,r){a&1&&(e(0,` 65 `),i(1,"span",59),e(2,"Never"),n(),e(3,` 66 `))}function kt(a,r){if(a&1&&(e(0,` 67 `),i(1,"tr"),e(2,` 68 `),i(3,"td")(4,"span",54),e(5),n()(),e(6,` 69 `),i(7,"td")(8,"span",26),e(9),n()(),e(10,` 70 `),i(11,"td"),e(12,` 71 `),x(13,It,9,8)(14,Rt,4,0),n(),e(15,` 72 `),n(),e(16,` 73 `)),a&2){let t=r.$implicit;o(5),h(t.jobName),o(4),h(t.scheduleDescription||t.cronExpression||"\u2014"),o(4),u(t.lastRunDate?13:14)}}function jt(a,r){if(a&1&&(e(0,` 74 `),i(1,"div",49),e(2,` 75 `),i(3,"app-admin-dashboard-card",56),e(4,` 76 `),p(5,"app-tooltip",57),e(6,` 77 `),i(7,"div",47),e(8,` 78 `),i(9,"p-table",58),e(10,` 79 `),S(11,Tt,13,0,"ng-template",null,0,E),e(13,` 80 `),S(14,kt,17,3,"ng-template",null,1,E),e(16,` 81 `),n(),e(17,` 82 `),n(),e(18,` 83 `),n(),e(19,` 84 `),n(),e(20,` 85 `)),a&2){let t=c(3);o(5),s("renderAsLink",!1),o(4),s("value",t.overview.idleJobs)}}function Jt(a,r){if(a&1&&(e(0,` 86 `),i(1,"div",18),e(2,` 87 `),x(3,Pt,21,2),x(4,jt,21,2),n(),e(5,` 88 `)),a&2){let t=c(2);o(3),u(t.overview.stuckRuns!=null&&t.overview.stuckRuns.length?3:-1),o(),u(t.overview.idleJobs!=null&&t.overview.idleJobs.length?4:-1)}}function At(a,r){if(a&1&&(e(0,` 89 `),p(1,"p-chart",60),e(2,` 90 `)),a&2){let t=c(2);o(),s("data",t.slowestJobsChartData)("options",t.slowestJobsChartOptions)}}function Lt(a,r){a&1&&(e(0,` 91 `),i(1,"div",61),e(2,"No completed runs in this window."),n(),e(3,` 92 `))}function Ft(a,r){if(a&1&&(e(0,` 93 `),p(1,"p-chart",62),e(2,` 94 `)),a&2){let t=c(2);o(),s("type",t.outcomeChart.type)("data",t.outcomeChart.data)("options",t.outcomeChart.options)}}function Bt(a,r){a&1&&(e(0,` 95 `),i(1,"div",61),e(2,"No runs in this window."),n(),e(3,` 96 `))}function Mt(a,r){if(a&1&&(e(0,` 97 `),p(1,"p-chart",63),e(2,` 98 `)),a&2){let t=c(2);o(),s("data",t.failuresByJobChartData)("options",t.failuresByJobChartOptions)}}function Ot(a,r){a&1&&(e(0,` 99 `),i(1,"div",61),e(2,` 100 `),p(3,"i",64),e(4,`No failed runs in this window. 101 `),n(),e(5,` 102 `))}function Nt(a,r){if(a&1&&(e(0,` 103 `),p(1,"p-chart",65),e(2,` 104 `)),a&2){let t=c(2);o(),s("type",t.runLengthChart.type)("data",t.runLengthChart.data)("options",t.runLengthChart.options)}}function $t(a,r){a&1&&(e(0,` 105 `),i(1,"div",61),e(2,"No completed runs in this window."),n(),e(3,` 106 `))}function Wt(a,r){a&1&&(e(0,` 107 `),i(1,"tr"),e(2,` 108 `),i(3,"th",66),e(4,` 109 `),i(5,"div",67),e(6,"Job"),p(7,"p-sortIcon",68),n(),e(8,` 110 `),n(),e(9,` 111 `),i(10,"th",69),e(11,` 112 `),i(12,"div",67),e(13,"Runs"),p(14,"p-sortIcon",70),n(),e(15,` 113 `),n(),e(16,` 114 `),i(17,"th",71),e(18,` 115 `),i(19,"div",67),e(20,"Success"),p(21,"p-sortIcon",72),e(22,` 116 `),n(),e(23,` 117 `),n(),e(24,` 118 `),i(25,"th",73),e(26,` 119 `),i(27,"div",67),e(28,"Avg"),p(29,"p-sortIcon",74),e(30,` 120 `),n(),e(31,` 121 `),n(),e(32,` 122 `),i(33,"th",75),e(34,` 123 `),i(35,"div",67),e(36,"p50"),p(37,"p-sortIcon",76),e(38,` 124 `),n(),e(39,` 125 `),n(),e(40,` 126 `),i(41,"th",77),e(42,` 127 `),i(43,"div",67),e(44,"p95"),p(45,"p-sortIcon",78),n(),e(46,` 128 `),n(),e(47,` 129 `),i(48,"th",79),e(49,` 130 `),i(50,"div",67),e(51,"Max"),p(52,"p-sortIcon",80),n(),e(53,` 131 `),n(),e(54,` 132 `),i(55,"th",81),e(56,` 133 `),i(57,"div",67),e(58,"Total"),p(59,"p-sortIcon",82),e(60,` 134 `),n(),e(61,` 135 `),n(),e(62,` 136 `),i(63,"th",83),e(64,` 137 `),i(65,"div",67),e(66,"Items"),p(67,"p-sortIcon",84),n(),e(68,` 138 `),n(),e(69,` 139 `),i(70,"th",85),e(71,`
140 `),i(72,"div",67),e(73,"Last Run"),p(74,"p-sortIcon",86),n(),e(75,` 141 `),n(),e(76,` 142 `),p(77,"th"),e(78,` 143 `),n(),e(79,` 144 `))}function Ht(a,r){a&1&&(e(0,` 145 `),i(1,"span",91),e(2,"(disabled)"),n(),e(3,` 146 `))}function Vt(a,r){if(a&1&&(e(0,` 147 `),i(1,"div",26),e(2,` 148 `),p(3,"i",90),e(4),x(5,Ht,4,0),n(),e(6,` 149 `)),a&2){let t=c().$implicit;o(4),f("",t.scheduleDescription||t.cronExpression,` 150 `),o(),u(t.enabled?-1:5)}}function Ut(a,r){if(a&1&&(e(0,` 151 `),i(1,"div",26),e(2),n(),e(3,` 152 `)),a&2){let t=c().$implicit;o(2),f("",t.inProgressRuns," running")}}function qt(a,r){if(a&1&&(e(0,` 153 `),i(1,"div",26),e(2),b(3,"number"),n(),e(4,` 154 `)),a&2){let t=c().$implicit;o(2),f(` 155 `,v(3,1,t.failedRuns+t.completedWithErrorRuns),` unclean 156 `)}}function Yt(a,r){if(a&1&&(e(0,` 157 `),i(1,"div",31),e(2,` 158 `),p(3,"i"),e(4),n(),e(5,` 159 `)),a&2){let t=c().$implicit,l=c(2);o(),s("ngClass",l.changeClass(t.averageDurationChangePercent,!1)),o(2),F(l.changeIcon(t.averageDurationChangePercent)),o(),f(` 160 `,l.formatChange(t.averageDurationChangePercent),` 161 `)}}function Gt(a,r){if(a&1&&(e(0,` 162 `),i(1,"div",59),e(2),b(3,"number"),n(),e(4,` 163 `)),a&2){let t=c().$implicit;o(2),f("",v(3,1,t.itemsFailed)," failed")}}function Kt(a,r){if(a&1&&(e(0,` 164 `),i(1,"div",55),e(2),b(3,"utcDate"),n(),e(4,` 165 `),p(5,"app-pill",92),e(6,` 166 `)),a&2){let t=c().$implicit,l=c(2);o(2),h(y(3,4,t.lastRunDate,"MM/dd hh:mm a")),o(3),s("text",t.lastRunStatusName)("status",l.statusPill(t.lastRunStatusId))("nowrap",!0)}}function Qt(a,r){a&1&&(e(0,` 167 `),i(1,"span",54),e(2,"\u2014"),n(),e(3,` 168 `))}function Zt(a,r){if(a&1){let t=B();e(0,` 169 `),i(1,"tr"),e(2,` 170 `),i(3,"td"),e(4,` 171 `),i(5,"button",87),T("click",function(){let m=j(t).$implicit,d=c(2);return J(d.openJob(m.jobId))}),e(6),n(),e(7,` 172 `),x(8,Vt,7,2),n(),e(9,` 173 `),i(10,"td"),e(11,` 174 `),i(12,"span",54),e(13),b(14,"number"),n(),e(15,` 175 `),x(16,Ut,4,1),n(),e(17,` 176 `),i(18,"td"),e(19,` 177 `),i(20,"span",88),e(21),b(22,"number"),n(),e(23,` 178 `),x(24,qt,5,3),n(),e(25,` 179 `),i(26,"td"),e(27,` 180 `),i(28,"span",54),e(29),n(),e(30,` 181 `),x(31,Yt,6,4),n(),e(32,` 182 `),i(33,"td")(34,"span",54),e(35),n()(),e(36,` 183 `),i(37,"td")(38,"span",54),e(39),n()(),e(40,` 184 `),i(41,"td")(42,"span",54),e(43),n()(),e(44,` 185 `),i(45,"td")(46,"span",54),e(47),n()(),e(48,` 186 `),i(49,"td"),e(50,` 187 `),i(51,"span",54),e(52),b(53,"number"),n(),e(54,` 188 `),x(55,Gt,5,3),n(),e(56,` 189 `),i(57,"td"),e(58,` 190 `),x(59,Kt,7,7)(60,Qt,4,0),n(),e(61,` 191 `),i(62,"td"),e(63,` 192 `),i(64,"button",89),T("click",function(){let m=j(t).$implicit,d=c(2);return J(d.openJob(m.jobId))}),e(65,` 193 Drill In 194 `),n(),e(66,` 195 `),n(),e(67,` 196 `),n(),e(68,` 197 `)}if(a&2){let t=r.$implicit,l=c(2);o(5),Te("aria-label","Drill into "+t.jobName),o(),f(` 198 `,t.jobName,` 199 `),o(2),u(t.cronExpression||!t.enabled?8:-1),o(5),h(v(14,18,t.runs)),o(3),u(t.inProgressRuns?16:-1),o(4),s("ngClass",Q(25,Ct,t.failureRatePercent>=25,t.failureRatePercent===0)),o(),f(` 200 `,y(22,20,t.successRatePercent,"1.0-1"),`% 201 `),o(3),u(t.failedRuns+t.completedWithErrorRuns>0?24:-1),o(5),h(l.formatDuration(t.averageDurationSeconds)),o(2),u(t.averageDurationChangePercent?31:-1),o(4),h(l.formatDuration(t.medianDurationSeconds)),o(4),h(l.formatDuration(t.p95DurationSeconds)),o(4),h(l.formatDuration(t.maxDurationSeconds)),o(4),h(l.formatDuration(t.totalDurationSeconds)),o(5),h(v(53,23,t.itemsProcessed)),o(3),u(t.itemsFailed?55:-1),o(4),u(t.lastRunDate?59:60),o(5),Te("aria-label","Drill into "+t.jobName)}}function zt(a,r){a&1&&(e(0,` 202 `),i(1,"tr"),e(2,` 203 `),i(3,"td",93),e(4,` 204 `),i(5,"app-inline-alert",94),e(6,"No jobs ran in this window."),n(),e(7,` 205 `),n(),e(8,` 206 `),n(),e(9,`
207 `)),a&2&&(o(5),s("isInline",!0))}function Xt(a,r){a&1&&(e(0,` 208 `),i(1,"tr"),e(2,` 209 `),i(3,"th"),e(4,"Run"),n(),e(5,` 210 `),i(6,"th"),e(7,"Job"),n(),e(8,` 211 `),i(9,"th"),e(10,"Status"),n(),e(11,` 212 `),i(12,"th"),e(13,"Started"),n(),e(14,` 213 `),i(15,"th"),e(16,"Duration"),n(),e(17,` 214 `),i(18,"th"),e(19,"Processed"),n(),e(20,` 215 `),i(21,"th",97),e(22,"Summary"),n(),e(23,` 216 `),n(),e(24,` 217 `))}function ei(a,r){if(a&1&&(e(0,` 218 `),i(1,"tr"),e(2,` 219 `),i(3,"td"),e(4,` 220 `),i(5,"a",53),e(6),n(),e(7,` 221 `),n(),e(8,` 222 `),i(9,"td")(10,"span",54),e(11),n()(),e(12,` 223 `),i(13,"td"),e(14,` 224 `),p(15,"app-pill",92),e(16,` 225 `),n(),e(17,` 226 `),i(18,"td")(19,"span",55),e(20),b(21,"utcDate"),n()(),e(22,` 227 `),i(23,"td")(24,"span",98),e(25),n()(),e(26,` 228 `),i(27,"td")(28,"span",54),e(29),n()(),e(30,` 229 `),i(31,"td")(32,"span",99),e(33),n()(),e(34,` 230 `),n(),e(35,` 231 `)),a&2){let t=r.$implicit,l=c(3);o(5),s("routerLink",D(14,Je))("queryParams",w(15,Ge,t.jobLogId)),o(),f("#",t.jobLogId),o(5),h(t.jobName),o(4),s("text",t.jobStatusName)("status",l.statusPill(t.jobStatusId))("nowrap",!0),o(5),h(y(21,11,t.startDate,"MM/dd/yyyy hh:mm a")),o(5),h(l.formatDuration(t.durationSeconds)),o(4),h(t.itemsProcessed??"\u2014"),o(4),h(t.summary||"\u2014")}}function ti(a,r){if(a&1&&(e(0,` 232 `),i(1,"div",32),e(2,` 233 `),i(3,"app-admin-dashboard-card",95),e(4,` 234 `),p(5,"app-tooltip",96),e(6,` 235 `),i(7,"div",47),e(8,` 236 `),i(9,"p-table",52),e(10,` 237 `),S(11,Xt,25,0,"ng-template",null,0,E),e(13,` 238 `),S(14,ei,36,17,"ng-template",null,1,E),e(16,` 239 `),n(),e(17,` 240 `),n(),e(18,` 241 `),n(),e(19,` 242 `),n(),e(20,` 243 `)),a&2){let t=c(2);o(5),s("renderAsLink",!1),o(4),s("value",t.overview.slowestRuns)}}function ii(a,r){if(a&1){let t=B();e(0,` 244 `),e(1,` 245 `),i(2,"div",17),e(3,` 246 `),i(4,"div",18),e(5,` 247 `),i(6,"div",19),e(7,` 248 `),i(8,"div",20),e(9,` 249 `),i(10,"span",21),e(11,"Runs"),n(),e(12,` 250 `),i(13,"div",22),e(14),b(15,"number"),n(),e(16,` 251 `),x(17,St,6,4),n(),e(18,` 252 `),n(),e(19,` 253 `),i(20,"div",19),e(21,` 254 `),i(22,"div",20),e(23,` 255 `),i(24,"span",23),e(25,`Success 256 Rate`),n(),e(26,` 257 `),i(27,"div",22),e(28),b(29,"number"),n(),e(30,` 258 `),x(31,Et,6,4),n(),e(32,` 259 `),n(),e(33,` 260 `),i(34,"div",19),e(35,` 261 `),i(36,"div",20),e(37,` 262 `),i(38,"span",24),e(39,`Unclean 263 Runs`),n(),e(40,` 264 `),i(41,"div",25),e(42),b(43,"number"),n(),e(44,` 265 `),i(45,"div",26),e(46),b(47,"number"),b(48,"number"),n(),e(49,` 266 `),n(),e(50,` 267 `),n(),e(51,` 268 `),i(52,"div",19),e(53,` 269 `),i(54,"div",20),e(55,` 270 `),i(56,"span",27),e(57,`Time 271 Running`),n(),e(58,` 272 `),i(59,"div",22),e(60),b(61,"number"),n(),e(62,` 273 `),i(63,"div",26),e(64),b(65,"number"),n(),e(66,` 274 `),n(),e(67,` 275 `),n(),e(68,` 276 `),i(69,"div",19),e(70,` 277 `),i(71,"div",20),e(72,` 278 `),i(73,"span",28),e(74,`Average 279 Run`),n(),e(75,` 280 `),i(76,"div",22),e(77),n(),e(78,` 281 `),x(79,yt,6,4),n(),e(80,` 282 `),n(),e(81,` 283 `),i(82,"div",29),e(83,` 284 `),i(84,"div",20),e(85,` 285 `),i(86,"span",30),e(87,`Items 286 Processed`),n(),e(88,` 287 `),i(89,"div",22),e(90),b(91,"number"),n(),e(92,` 288 `),i(93,"div",31),e(94),b(95,"number"),n(),e(96,` 289 `),n(),e(97,` 290 `),n(),e(98,` 291 `),n(),e(99,` 292 `),n(),e(100,` 293 294 `),e(101,` 295 `),x(102,Jt,6,2),i(103,"div",18),e(104,` 296 `),i(105,"div",32),e(106,` 297 `),i(107,"app-admin-dashboard-card",33),e(108,` 298 `),p(109,"app-tooltip",34),e(110,` 299 300 `),i(111,"div",35),e(112,` 301 `),i(113,"span",36),e(114,"Rank by"),n(),e(115,` 302 `),i(116,"p-selectButton",9),N("ngModelChange",function(m){j(t);let d=c();return O(d.rankMetric,m)||(d.rankMetric=m),J(m)}),T("onChange",function(){j(t);let m=c();return J(m.onRankMetricChange())}),n(),e(117,` 303 `),n(),e(118,` 304 305 `),x(119,At,3,2)(120,Lt,4,0),n(),e(121,` 306 `),n(),e(122,` 307 308 `),i(123,"div",37),e(124,` 309 `),i(125,"app-admin-dashboard-card",38),e(126,` 310 `),p(127,"app-tooltip",39),e(128,` 311 `),x(129,Ft,3,3)(130,Bt,4,0),n(),e(131,` 312 `),n(),e(132,` 313 314 `),i(133,"div",40),e(134,` 315 `),i(135,"app-admin-dashboard-card",41),e(136,` 316 `),p(137,"app-tooltip",42),e(138,` 317 `),x(139,Mt,3,2)(140,Ot,6,0),n(),e(141,` 318 `),n(),e(142,` 319 320 `),i(143,"div",32),e(144,` 321 `),i(145,"app-admin-dashboard-card",43),e(146,` 322 `),p(147,"app-tooltip",44),e(148,` 323 `),x(149,Nt,3,3)(150,$t,4,0),n(),e(151,` 324 `),n(),e(152,` 325 `),n(),e(153,` 326 327 `),e(154,` 328 `),i(155,"div",18),e(156,` 329 `),i(157,"div",32),e(158,` 330 `),i(159,"app-admin-dashboard-card",45),e(160,` 331 `),p(161,"app-tooltip",46),e(162,` 332 `),i(163,"div",47),e(164,` 333 `),i(165,"p-table",48),e(166,` 334 `),S(167,Wt,80,0,"ng-template",null,0,E),e(169,` 335 336 `),S(170,Zt,69,28,"ng-template",null,1,E),e(172,` 337 338 `),S(173,zt,10,1,"ng-template",null,2,E),e(175,` 339 `),n(),e(176,` 340 `),n(),e(177,` 341 `),n(),e(178,` 342 `),n(),e(179,` 343 344 `),x(180,ti,21,2),n(),e(181,` 345 `)}if(a&2){let t=c();o(14),h(v(15,34,t.overview.runs)),o(3),u(t.overview.runsChangePercent!==null&&t.overview.runsChangePercent!==void 0?17:-1),o(11),f("",y(29,36,t.overview.successRatePercent,"1.0-1"),"%"),o(3),u(t.overview.successRateChangePoints!==null&&t.overview.successRateChangePoints!==void 0?31:-1),o(10),s("ngClass",w(54,Ye,t.overview.failedRuns+t.overview.completedWithErrorRuns>0)),o(),f(` 346 `,v(43,39,t.overview.failedRuns+t.overview.completedWithErrorRuns),` 347 `),o(4),H(` 348 `,v(47,41,t.overview.failedRuns)," failed \xB7 ",v(48,43,t.overview.completedWithErrorRuns),` with 349 errors 350 `),o(14),f("",y(61,45,t.overview.totalDurationHours,"1.0-1"),"h"),o(4),f("",v(65,48,t.overview.jobsRun)," jobs ran"),o(13),h(t.formatDuration(t.overview.averageDurationSeconds)),o(2),u(t.overview.averageDurationChangePercent!==null&&t.overview.averageDurationChangePercent!==void 0?79:-1),o(11),h(v(91,50,t.overview.itemsProcessed)),o(3),s("ngClass",w(56,Ye,t.overview.itemsFailed>0)),o(),f(` 351 `,v(95,52,t.overview.itemsFailed),` failed 352 `),o(8),u(t.overview.stuckRuns!=null&&t.overview.stuckRuns.length||t.overview.idleJobs!=null&&t.overview.idleJobs.length?102:-1),o(7),s("renderAsLink",!1),o(7),s("options",t.rankOptions),M("ngModel",t.rankMetric),s("allowEmpty",!1),o(3),u(t.slowestJobsChartData?119:120),o(8),s("renderAsLink",!1),o(2),u(t.outcomeChart?129:130),o(8),s("renderAsLink",!1),o(2),u(t.failuresByJobChartData?139:140),o(8),s("renderAsLink",!1),o(2),u(t.runLengthChart?149:150),o(12),s("renderAsLink",!1),o(4),s("value",t.overview.jobs)("paginator",t.overview.jobs.length>25)("rows",25)("rowsPerPageOptions",D(58,_t))("sortOrder",-1),o(15),u(t.overview.slowestRuns!=null&&t.overview.slowestRuns.length?180:-1)}}var Ke=(()=>
352{let r=class r{constructor(l,m,d,g){this.jobPerformanceService=l,this.siteDataService=m,this.router=d,this.route=g,this.unsubscribe$=new q,this.loading=!0,this.error="",this.selectedRange=R.LAST_7_DAYS,this.rangeOptions=ve,this.selectedJobId=null,this.jobFilterOptions=[{label:"All Jobs",value:null}],this.rankMetric=k.AVERAGE,this.rankOptions=Ue,this.formatDuration=I,this.statusPill=fe,this.formatChange=ge,this.changeClass=Se,this.changeIcon=Ee,this.chartJobLimit=12}ngOnInit(){this.loadFilterOptions(),this.route.queryParams.pipe(L(this.unsubscribe$)).subscribe({next:l=>{this.selectedRange=l.days?+l.days:R.LAST_7_DAYS,this.selectedJobId=l.jobId?+l.jobId:null,this.load()},error:()=>{this.error="Unable to read the dashboard parameters from the URL.",this.siteDataService.hideSiteLoader()}})}ngOnDestroy(){this.unsubscribe$.next(),this.unsubscribe$.complete()}load(){this.loading=!0,this.error="",this.jobPerformanceService.getOverview(this.selectedRange,this.selectedJobId??void 0).pipe(L(this.unsubscribe$)).subscribe({next:l=>{this.overview=l,this.buildCharts(),this.loading=!1,this.siteDataService.hideSiteLoader()},error:l=>{this.error=`Failed to load job performance${l?.status?` (HTTP ${l.status})`:""}. Please try again.`,this.loading=!1,this.siteDataService.hideSiteLoader()}})}onRangeChange(){this.syncFiltersToUrl()}onJobFilterChange(){this.syncFiltersToUrl()}onRankMetricChange(){this.buildSlowestJobsChart()}syncFiltersToUrl(){this.router.navigate([],{relativeTo:this.route,queryParams:{days:this.selectedRange,jobId:this.selectedJobId||null},queryParamsHandling:"merge"})}openJob(l){this.router.navigate(["/admin/job-performance",l],{queryParams:{days:this.selectedRange}})}rankValue(l){switch(this.rankMetric){case k.P95:return l.p95DurationSeconds??0;case k.TOTAL:return l.totalDurationSeconds;default:return l.averageDurationSeconds??0}}get rankMetricLabel(){switch(this.rankMetric){case k.P95:return"95th percentile run";case k.TOTAL:return"Total time spent running";default:return"Average run"}}buildCharts(){this.buildSlowestJobsChart(),this.buildFailuresByJobChart(),this.outcomeChart=ye(this.overview?.trend),this.runLengthChart=we(this.overview?.trend)}buildSlowestJobsChart(){let l=[...this.overview?.jobs??[]].filter(d=>this.rankValue(d)>0).sort((d,g)=>this.rankValue(g)-this.rankValue(d)).slice(0,this.chartJobLimit).reverse();if(!l.length){this.slowestJobsChartData=null;return}let m=A();this.slowestJobsChartData={labels:l.map(d=>d.jobName),datasets:[{label:this.rankMetricLabel,data:l.map(d=>this.rankValue(d)),backgroundColor:m.neutral,borderRadius:4,borderWidth:0,barPercentage:.7}]},this.slowestJobsChartOptions={indexAxis:"y",responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{callbacks:{label:d=>`${this.rankMetricLabel}: ${I(d.parsed.x)}`}}},scales:{x:U(),y:{grid:{display:!1},ticks:{autoSkip:!1,font:{size:11}}}}}}buildFailuresByJobChart(){let l=[...this.overview?.jobs??[]].map(d=>({row:d,unclean:d.failedRuns+d.completedWithErrorRuns})).filter(d=>d.unclean>0).sort((d,g)=>g.unclean-d.unclean).slice(0,this.chartJobLimit).reverse();if(!l.length){this.failuresByJobChartData=null;return}let m=A();this.failuresByJobChartData={labels:l.map(d=>d.row.jobName),datasets:[{label:"Failed",data:l.map(d=>d.row.failedRuns),backgroundColor:m.critical,borderColor:m.surface,borderWidth:2,borderRadius:3,barPercentage:.7},{label:"Completed with errors",data:l.map(d=>d.row.completedWithErrorRuns),backgroundColor:m.warning,borderColor:m.surface,borderWidth:2,borderRadius:3,barPercentage:.7}]},this.failuresByJobChartOptions={indexAxis:"y",responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{usePointStyle:!0,padding:16}},tooltip:{mode:"index",intersect:!1}},scales:{x:{stacked:!0,beginAtZero:!0,grid:{color:m.grid},title:{display:!0,text:"Runs"}},y:{stacked:!0,grid:{display:!1},ticks:{autoSkip:!1,font:{size:11}}}}}}loadFilterOptions(){this.jobPerformanceService.getFilterOptions().pipe(L(this.unsubscribe$)).subscribe({next:l=>{this.jobFilterOptions=[{label:"All Jobs",value:null},...l.jobs||[]]},error:()=>{this.siteDataService.showSiteErrorAlert("Unable to load the job filter list.")}})}};r.\u0275fac=function(m){return new(m||r)(P($),P(ae),P(ie),P(te))},r.\u0275cmp=G({type:r,selectors:[["app-job-performance-dashboard"]],standalone:!1,decls:26,vars:15,consts:[["header",""],["body",""],["emptymessage",""],["role","main"],[1,"d-flex","justify-content-between","align-items-center","flex-wrap","border-bottom","mb-3"],["pageTitle","Job Performance",3,"hideBorder"],[1,"d-flex","align-items-center","flex-wrap","mb
352-2"],["for","jobFilter",1,"sr-only"],["inputId","jobFilter","filterBy","label","appendTo","body",1,"mr-3",3,"ngModelChange","onChange","options","ngModel","filter"],["optionLabel","label","optionValue","value",3,"ngModelChange","onChange","options","ngModel","allowEmpty"],[1,"btn","btn-sm","btn-naked","ml-3",3,"routerLink","queryParams"],[1,"fa-regular","fa-list","mr-1"],[1,"mb-3"],["alertType","error"],["type","button",1,"btn","btn-red","btn-sm","ml-2",3,"click"],[1,"fa-regular","fa-rotate-right","mr-1"],["height","220px"],[1,"card","dashboard-card","p-4","mb-3"],[1,"row"],[1,"col-6","col-lg-2","border-right"],[1,"full-height","py-2","text-center"],["pTooltip","Job runs that started inside the window, whatever their outcome.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"dashboard-big-number"],["pTooltip","Share of finished runs that ended clean. Runs still in progress are left out of the denominator rather than counted as failures.",1,"dashboard-big-number--title","mb-2","hover-dotted"],["pTooltip","Runs that failed outright plus runs that finished but reported item-level errors.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"dashboard-big-number",3,"ngClass"],[1,"text-smallest","text-muted"],["pTooltip","Wall-clock time all jobs spent running in the window. Jobs run in parallel, so this exceeds the elapsed length of the window itself.",1,"dashboard-big-number--title","mb-2","hover-dotted"],["pTooltip","Mean run length, weighted by run count \u2014 a job that ran ten thousand times moves this figure more than a nightly report.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"col-6","col-lg-2"],["pTooltip","Items the jobs reported processing. Only jobs that report item counts contribute.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"text-smallest",3,"ngClass"],[1,"col-12","mb-3","d-flex","flex-column"],["panelTitle","Longest Running Jobs","skeletonHeight","480px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Average is the typical run. p95 is what the slow tail looks like \u2014 a job whose p95 is far above its average is spiky rather than slow. Total time is how much of the worker the job consumed, which a fast job that runs constantly can dominate.",3,"renderAsLink"],["slot","filters",1,"d-flex","align-items-center","flex-wrap","pb-2"],[1,"text-small","text-muted","mr-2"],[1,"col-lg-7","mb-3","d-flex","flex-column"],["panelTitle","Run Outcomes by Day","skeletonHeight","400px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Every run that started each day, stacked by how it ended. A day with no bar is a day on which nothing ran at all \u2014 the trend keeps empty days rather than closing the gap.",3,"renderAsLink"],[1,"col-lg-5","mb-3","d-flex","flex-column"],["panelTitle","Failures by Job","skeletonHeight","400px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Jobs with the most unclean runs, ranked by count rather than rate: a job that failed both of its two runs matters less than one that failed two hundred times. The failure rate for each is in the table below.",3,"renderAsLink"],["panelTitle","Run Length by Day","skeletonHeight","360px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Average and worst run length each day across the jobs in view. Plotted apart from run counts on purpose \u2014 seconds and runs are different scales, and sharing one plot would need a second axis that makes the two lines look comparable when they are not.",3,"renderAsLink"],["panelTitle","All Jobs","bodyClass","card-body p-0","skeletonHeight","420px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Every job that ran in the window. Select a row to drill into its distribution, outliers and failures.",3,"renderAsLink"],[1,"table-responsive"],["dataKey","jobId","sortField","totalDurationSeconds",1,"table","table-striped","table-sm",3,"value","paginator","rows","rowsPerPageOptions","sortOrder"],[1,"col-lg-6","mb-3","d-flex","flex-column"],["panelTitle","Stuck Runs","skeletonHeight","240px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Runs still marked in progress hours after they started. Almost always a worker that died without stamping an end date, which also means their duration never lands in any average.",3,"renderAsLink"],["dataKey","jobLogId",1,"table","table-striped","table-sm",3,"value"],[3,"routerLink","queryParams"],[1,"text-small"],[1,"text-smallest"],["panelTitle","Scheduled But Silent","skeletonHeight","240px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Enabled jobs with a schedule that recorded no run at all in this window. A job that stopped firing leaves no failure behind, so it is invisible on every other chart here.",3,"renderAsLink"],["dataKey","jobId",1,"table","table-striped","table-sm",3,"value"],[1,"text-smallest","text-danger"],["type","bar","height","420px",3,"data","options"],[1,"text-center","text-muted","py-4"],["height","340px",3,"type","data","options"],["type","bar","height","340px",3,"data","options"],[1,"fa-regular","fa-circle-check","text-success","mr-1"],["height","300px",3,"type","data","options"],["pSortableColumn","jobName"],[1,"d-flex","align-items-center"],["field","jobName"],["pSortableColumn","runs"],["field","runs"],["pSortableColumn","successRatePercent"],["field","successRatePercent"],["pSortableColumn","averageDurationSeconds"],["field","averageDurationSeconds"],["pSortableColumn","medianDurationSeconds"],["field","medianDurationSeconds"],["pSortableColumn","p95DurationSeconds"],["field","p95DurationSeconds"],["pSortableColumn","maxDurationSeconds"],["field","maxDurationSeconds"],["pSortableColumn","totalDurationSeconds"],["field","totalDurationSeconds"],["pSortableColumn","itemsProcessed"],["field","itemsProcessed"],["pSortableColumn","lastRunDate"],["field","lastRunDate"],["type","button",1,"btn","btn-naked","btn-sm","px-0","text-left",3,"click"],[1,"text-small",3,"ngClass"],["type","button",1,"btn","btn-sm",3,"click"],[1,"fa-regular","fa-clock","mr-1"],[1,"text-danger","ml-1"],[3,"text","status","nowrap"],["colspan","11",1,"text-center","py-4"],[3,"isInline"],["panelTitle","Each Job's Slowe
352st Run","bodyClass","card-body p-0","skeletonHeight","320px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Every job's own worst run in the window, ranked against the other jobs \u2014 the ones worth opening when a chart shows a job's p95 pulling away from its average. One run per job, so a single pathological job cannot fill the list; drill into a job to see its ten slowest.",3,"renderAsLink"],[2,"width","30%"],[1,"text-small","fw-800"],[1,"text-small","text-break"]],template:function(m,d){m&1&&(i(0,"main",3),e(1,` 353 `),i(2,"div",4),e(3,` 354 `),p(4,"app-admin-header",5),e(5,` 355 `),i(6,"div",6),e(7,` 356 `),i(8,"label",7),e(9,"Job"),n(),e(10,` 357 `),i(11,"p-select",8),N("ngModelChange",function(_){return O(d.selectedJobId,_)||(d.selectedJobId=_),_}),T("onChange",function(){return d.onJobFilterChange()}),n(),e(12,` 358 `),i(13,"p-selectButton",9),N("ngModelChange",function(_){return O(d.selectedRange,_)||(d.selectedRange=_),_}),T("onChange",function(){return d.onRangeChange()}),n(),e(14,` 359 `),i(15,"a",10),e(16,` 360 `),p(17,"i",11),e(18,`Job Logs 361 `),n(),e(19,` 362 `),n(),e(20,` 363 `),n(),e(21,` 364 365 `),x(22,vt,12,1),x(23,gt,3,0)(24,ii,182,59),n(),e(25,` 366`)),m&2&&(o(4),s("hideBorder",!0),o(7),s("options",d.jobFilterOptions),M("ngModel",d.selectedJobId),s("filter",!0),o(2),s("options",d.rangeOptions),M("ngModel",d.selectedRange),s("allowEmpty",!1),o(2),s("routerLink",D(11,Je))("queryParams",d.selectedJobId?w(12,bt,d.selectedJobId):D(14,ft)),o(7),u(d.error?22:-1),o(),u(d.loading?23:d.overview?24:-1))},dependencies:[Z,X,ee,ne,me,re,pe,le,ue,xe,he,se,Ne,$e,Oe,oe,de,be,z,ce],encapsulation:2});let a=r;return a})();var ni=a=>({days:a}),De=()=>["/admin/job-logs"],ai=a=>({jobId:a}),Qe=a=>({jobLogId:a}),oi=a=>["/admin/error-logs",a],ri=(a,r)=>({jobId:a,clubId:r});function li(a,r){if(a&1){let t=B();e(0,` 367 `),i(1,"div",10),e(2,` 368 `),i(3,"app-inline-alert",11),e(4),i(5,"button",12),T("click",function(){j(t);let m=c();return J(m.load())}),e(6,` 369 `),p(7,"i",13),e(8,`Retry 370 `),n(),e(9,` 371 `),n(),e(10,` 372 `),n(),e(11,` 373 `)}if(a&2){let t=c();o(4),f(` 374 `,t.error,` 375 `)}}function di(a,r){a&1&&(e(0,` 376 `),p(1,"app-skeleton-template",14),e(2,` 377 `))}function si(a,r){if(a&1&&(e(0,` 378 `),i(1,"span",45),e(2,` 379 `),p(3,"i",46),e(4),i(5,"code",47),e(6),n(),e(7,` 380 `),n(),e(8,` 381 `)),a&2){let t=c(2);o(4),f("",t.detail.summary.scheduleDescription||"Schedule",` 382 `),o(2),h(t.detail.summary.cronExpression)}}function mi(a,r){a&1&&(e(0,` 383 `),p(1,"app-pill",48),e(2,`
384 `)),a&2&&(o(),s("nowrap",!0))}function pi(a,r){if(a&1&&(e(0,` 385 `),i(1,"span",49),e(2,"Last run"),n(),e(3,` 386 `),p(4,"app-pill",50),e(5,` 387 `),i(6,"span",51),e(7),b(8,"utcDate"),n(),e(9,` 388 `)),a&2){let t=c(2);o(4),s("text",t.detail.summary.lastRunStatusName)("status",t.statusPill(t.detail.summary.lastRunStatusId))("nowrap",!0),o(3),h(y(8,4,t.detail.summary.lastRunDate,"MM/dd/yyyy hh:mm a"))}}function ci(a,r){if(a&1&&(e(0,` 389 `),i(1,"div",52),e(2),b(3,"number"),n(),e(4,` 390 `)),a&2){let t=c(2);o(),s("pTooltip","The schedule implies about "+t.detail.expectedRuns+" runs over this window. Approximate \u2014 the cadence is read off the cron expression, and a fire is skipped while the previous run is still going."),o(),f(` 391 `,y(3,2,t.detail.scheduleAdherencePercent,"1.0-0"),`% of schedule 392 `)}}function xi(a,r){if(a&1&&(e(0,` 393 `),i(1,"div",53),e(2,` 394 `),p(3,"i"),e(4),n(),e(5,` 395 `)),a&2){let t=c(2);o(),s("ngClass",t.changeClass(t.detail.summary.averageDurationChangePercent,!1)),o(2),F(t.changeIcon(t.detail.summary.averageDurationChangePercent)),o(),f(` 396 `,t.formatChange(t.detail.summary.averageDurationChangePercent),` vs prior window 397 `)}}function ui(a,r){if(a&1&&(e(0),b(1,"number")),a&2){let t=c(2);f(` 398 `,y(1,1,t.detail.summary.itemsPerSecond,"1.0-2"),`/s 399 `)}}function hi(a,r){if(a&1&&(e(0,` 400 `),i(1,"span",54),e(2),b(3,"number"),n(),e(4,` 401 `)),a&2){let t=c(2);o(2),f("",v(3,1,t.detail.summary.itemsFailed)," failed")}}function bi(a,r){if(a&1&&(e(0,` 402 `),i(1,"div",55),e(2,` 403 `),p(3,"i",56),e(4),n(),e(5,` 404 `)),a&2){let t=c(2);o(4),H(` 405 Longest quiet stretch between runs: `,t.formatDuration(t.detail.longestGapMinutes*60),` (average 406 `,t.formatDuration(t.detail.averageGapMinutes*60),`). 407 `)}}function fi(a,r){if(a&1&&(e(0,` 408 `),i(1,"app-inline-alert",57),e(2),b(3,"number"),b(4,"number"),n(),e(5,` 409 `)),a&2){let t=c(2);o(),s("isInline",!0),o(),H(` 410 Showing the `,v(3,3,t.detail.runsSampled)," most recent of ",v(4,5,t.detail.summary.runs),` runs. The 411 charts below cover the whole window. 412 `)}}function _i(a,r){if(a&1&&(e(0,` 413 `),i(1,"div",59),e(2),b(3,"number"),n(),e(4,` 414 `)),a&2){let t=c(3);o(2),f(` 415 `,v(3,1,t.outlierCount),` of the plotted runs ran longer than the p95. 416 `)}}function Ci(a,r){if(a&1&&(e(0,` 417 `),p(1,"p-chart",58),e(2,` 418 `),x(3,_i,5,3)),a&2){let t=c(2);o(),s("type",t.scatterChart.type)("data",t.scatterChart.data)("options",t.scatterChart.options),o(2),u(t.outlierCount?3:-1)}}function vi(a,r){a&1&&(e(0,` 419 `),i(1,"div",60),e(2,"No completed runs in this window."),n(),e(3,` 420 `))}function gi(a,r){if(a&1&&(e(0,` 421 `),p(1,"p-chart",61),e(2,` 422 `)),a&2){let t=c(2);o(),s("type",t.histogramChart.type)("data",t.histogramChart.data)("options",t.histogramChart.options)}}function Si(a,r){a&1&&(e(0,` 423 `),i(1,"div",60),e(2,"No completed runs in this window."),n(),e(3,` 424 `))}function Ei(a,r){if(a&1&&(e(0,` 425 `),p(1,"p-chart",61),e(2,` 426 `)),a&2){let t=c(2);o(),s("type",t.outcomeChart.type)("data",t.outcomeChart.data)("options",t.outcomeChart.options)}}function yi(a,r){a&1&&(e(0,` 427 `),i(1,"div",60),e(2,"No runs in this window."),n(),e(3,` 428 `))}function wi(a,r){if(a&1&&(e(0,` 429 `),p(1,"p-chart",62),e(2,` 430 `)),a&2){let t=c(2);o(),s("type",t.runLengthChart.type)("data",t.runLengthChart.data)("options",t.runLengthChart.options)}}function Di(a,r){a&1&&(e(0,` 431 `),i(1,"div",60),e(2,"No completed runs in this window."),n(),e(3,` 432 `))}function Pi(a,r){a&1&&(e(0,` 433 `),i(1,"tr"),e(2,` 434 `),i(3,"th"),e(4,"Run"),n(),e(5,` 435 `),i(6,"th"),e(7,"Started"),n(),e(8,` 436 `),i(9,"th"),e(10,"Duration"),n(),e(11,` 437 `),i(12,"th"),e(13,"Processed"),n(),e(14,` 438 `),i(15,"th"),e(16,"Status"),n(),e(17,` 439 `),n(),e(18,` 440 `))}function Ti(a,r){if(a&1&&(e(0,` 441 `),i(1,"tr"),e(2,` 442 `),i(3,"td"),e(4,` 443 `),i(5,"a",63),e(6),n(),e(7,` 444 `),n(),e(8,` 445 `),i(9,"td")(10,"span",64),e(11),b(12,"utcDate"),n()(),e(13,` 446 `),i(14,"td")(15,"span",65),e(16),n()(),e(17,` 447 `),i(18,"td")(19,"span",66),e(20),n()(),e(21,` 448 `),i(22,"td"),e(23,` 449 `),p(24,"app-pill",67),e(25,` 450 `),n(),e(26,` 451 `),n(),e(27,` 452 `)),a&2){let t=r.$implicit,l=c(2);o(5),s("routerLink",D(12,De))("queryParams",w(13,Qe,t.jobLogId)),o(),f("#",t.jobLogId),o(5),h(y(12,9,t.startDate,"MM/dd hh:mm a")),o(5),h(l.formatDuration(t.durationSeconds)),o(4),h(t.itemsProcessed??"\u2014"),o(4),s("text",t.jobStatusName)("status",l.statusPill(t.jobStatusId))("nowrap",!0)}}function Ii(a,r){a&1&&(e(0,` 453 `),i(1,"tr"),e(2,` 454 `),i(3,"td",68),e(4,` 455 `),i(5,"app-inline-alert",69),e(6,"No completed runs in this window."),n(),e(7,` 456 `),n(),e(8,` 457 `),n(),e(9,`
458 `)),a&2&&(o(5),s("isInline",!0))}function Ri(a,r){a&1&&(e(0,` 459 `),i(1,"tr"),e(2,` 460 `),i(3,"th"),e(4,"Run"),n(),e(5,` 461 `),i(6,"th"),e(7,"Started"),n(),e(8,` 462 `),i(9,"th"),e(10,"Status"),n(),e(11,` 463 `),i(12,"th"),e(13,"Failed"),n(),e(14,` 464 `),i(15,"th",70),e(16,"Summary"),n(),e(17,` 465 `),n(),e(18,` 466 `))}function ki(a,r){if(a&1&&(e(0,` 467 `),i(1,"a",73),e(2,` 468 `),p(3,"i",74),e(4),n(),e(5,` 469 `)),a&2){let t=c().$implicit;o(),s("routerLink",w(2,oi,t.errorId)),o(3),f("Error #",t.errorId,` 470 `)}}function ji(a,r){if(a&1&&(e(0,` 471 `),i(1,"tr"),e(2,` 472 `),i(3,"td"),e(4,` 473 `),i(5,"a",63),e(6),n(),e(7,` 474 `),n(),e(8,` 475 `),i(9,"td")(10,"span",64),e(11),b(12,"utcDate"),n()(),e(13,` 476 `),i(14,"td"),e(15,` 477 `),p(16,"app-pill",67),e(17,` 478 `),n(),e(18,` 479 `),i(19,"td")(20,"span",71),e(21),n()(),e(22,` 480 `),i(23,"td"),e(24,` 481 `),i(25,"span",72),e(26),n(),e(27,` 482 `),x(28,ki,6,4),n(),e(29,` 483 `),n(),e(30,` 484 `)),a&2){let t=r.$implicit,l=c(2);o(5),s("routerLink",D(13,De))("queryParams",w(14,Qe,t.jobLogId)),o(),f("#",t.jobLogId),o(5),h(y(12,10,t.startDate,"MM/dd hh:mm a")),o(5),s("text",t.jobStatusName)("status",l.statusPill(t.jobStatusId))("nowrap",!0),o(5),h(t.itemsFailed??"\u2014"),o(5),h(t.summary||"\u2014"),o(2),u(t.errorId?28:-1)}}function Ji(a,r){a&1&&(e(0,` 485 `),i(1,"tr"),e(2,` 486 `),i(3,"td",68),e(4,` 487 `),i(5,"app-inline-alert",69),e(6,` 488 `),p(7,"i",75),e(8,`No failures in this window. 489 `),n(),e(9,` 490 `),n(),e(10,` 491 `),n(),e(11,`
492 `)),a&2&&(o(5),s("isInline",!0))}function Ai(a,r){a&1&&(e(0,` 493 `),i(1,"tr"),e(2,` 494 `),i(3,"th"),e(4,"Club"),n(),e(5,` 495 `),i(6,"th"),e(7,"Runs Affected"),n(),e(8,` 496 `),i(9,"th"),e(10,"Items Failed"),n(),e(11,` 497 `),p(12,"th"),e(13,` 498 `),n(),e(14,` 499 `))}function Li(a,r){if(a&1&&(e(0,` 500 `),i(1,"a",79),e(2,` 501 View runs 502 `),n(),e(3,` 503 `)),a&2){let t=c().$implicit,l=c(3);o(),s("routerLink",D(2,De))("queryParams",Q(3,ri,l.jobId,t.clubId))}}function Fi(a,r){if(a&1&&(e(0,` 504 `),i(1,"tr"),e(2,` 505 `),i(3,"td"),e(4,` 506 `),i(5,"span",66),e(6),n(),e(7,` 507 `),n(),e(8,` 508 `),i(9,"td")(10,"span",66),e(11),b(12,"number"),n()(),e(13,` 509 `),i(14,"td")(15,"span",71),e(16),b(17,"number"),n()(),e(18,` 510 `),i(19,"td"),e(20,` 511 `),x(21,Li,4,6),n(),e(22,` 512 `),n(),e(23,` 513 `)),a&2){let t=r.$implicit;o(6),h(t.clubName||(t.clubId?"Club "+t.clubId:"No club")),o(5),h(v(12,4,t.failedDetails)),o(5),h(v(17,6,t.itemsFailed)),o(5),u(t.clubId?21:-1)}}function Bi(a,r){if(a&1&&(e(0,` 514 `),i(1,"div",29),e(2,` 515 `),i(3,"app-admin-dashboard-card",76),e(4,` 516 `),p(5,"app-tooltip",77),e(6,` 517 `),i(7,"div",41),e(8,` 518 `),i(9,"p-table",78),e(10,` 519 `),S(11,Ai,15,0,"ng-template",null,0,E),e(13,` 520 `),S(14,Fi,24,8,"ng-template",null,1,E),e(16,` 521 `),n(),e(17,` 522 `),n(),e(18,` 523 `),n(),e(19,` 524 `),n(),e(20,` 525 `)),a&2){let t=c(2);o(5),s("renderAsLink",!1),o(4),s("value",t.detail.topFailingClubs)}}function Mi(a,r){if(a&1&&(e(0,` 526 `),e(1,` 527 `),i(2,"div",15),e(3,` 528 `),i(4,"div",16),e(5,` 529 `),x(6,si,9,2),x(7,mi,3,1),x(8,pi,10,7),n(),e(9,` 530 531 `),i(10,"div",17),e(11,` 532 `),i(12,"div",18),e(13,` 533 `),i(14,"div",19),e(15,` 534 `),i(16,"span",20),e(17,"Runs"),n(),e(18,` 535 `),i(19,"div",21),e(20),b(21,"number"),n(),e(22,` 536 `),x(23,ci,5,5),n(),e(24,` 537 `),n(),e(25,` 538 `),i(26,"div",18),e(27,` 539 `),i(28,"div",19),e(29,` 540 `),i(30,"span",22),e(31,"Success Rate"),n(),e(32,` 541 `),i(33,"div",21),e(34),b(35,"number"),n(),e(36,` 542 `),i(37,"div",23),e(38),b(39,"number"),n(),e(40,` 543 `),n(),e(41,` 544 `),n(),e(42,` 545 `),i(43,"div",18),e(44,` 546 `),i(45,"div",19),e(46,` 547 `),i(47,"span",24),e(48,`Average 548 Run`),n(),e(49,` 549 `),i(50,"div",21),e(51),n(),e(52,` 550 `),x(53,xi,6,4),n(),e(54,` 551 `),n(),e(55,` 552 `),i(56,"div",18),e(57,` 553 `),i(58,"div",19),e(59,` 554 `),i(60,"span",25),e(61,`p50 555 / p95`),n(),e(62,` 556 `),i(63,"div",21),e(64),n(),e(65,` 557 `),i(66,"div",23),e(67),n(),e(68,` 558 `),n(),e(69,` 559 `),n(),e(70,` 560 `),i(71,"div",18),e(72,` 561 `),i(73,"div",19),e(74,` 562 `),i(75,"span",26),e(76,"Time Running"),n(),e(77,` 563 `),i(78,"div",21),e(79),n(),e(80,` 564 `),i(81,"div",23),e(82),n(),e(83,` 565 `),n(),e(84,` 566 `),n(),e(85,` 567 `),i(86,"div",27),e(87,` 568 `),i(88,"div",19),e(89,` 569 `),i(90,"span",28),e(91,"Items"),n(),e(92,` 570 `),i(93,"div",21),e(94),b(95,"number"),n(),e(96,` 571 `),i(97,"div",23),e(98,` 572 `),x(99,ui,2,4),x(100,hi,5,3),n(),e(101,` 573 `),n(),e(102,` 574 `),n(),e(103,` 575 `),n(),e(104,` 576 577 `),x(105,bi,6,2),n(),e(106,` 578 579 `),i(107,"div",17),e(108,` 580 `),e(109,` 581 `),i(110,"div",29),e(111,` 582 `),i(112,"app-admin-dashboard-card",30),e(113,` 583 `),p(114,"app-tooltip",31),e(115,` 584 585 `),x(116,fi,6,7),x(117,Ci,4,4)(118,vi,4,0),n(),e(119,` 586 `),n(),e(120,` 587 588 `),i(121,"div",32),e(122,` 589 `),i(123,"app-admin-dashboard-card",33),e(124,` 590 `),p(125,"app-tooltip",34),e(126,` 591 `),x(127,gi,3,3)(128,Si,4,0),n(),e(129,` 592 `),n(),e(130,` 593 594 `),i(131,"div",32),e(132,` 595 `),i(133,"app-admin-dashboard-card",35),e(134,` 596 `),p(135,"app-tooltip",36),e(136,` 597 `),x(137,Ei,3,3)(138,yi,4,0),n(),e(139,` 598 `),n(),e(140,` 599 600 `),i(141,"div",29),e(142,` 601 `),i(143,"app-admin-dashboard-card",37),e(144,` 602 `),p(145,"app-tooltip",38),e(146,` 603 `),x(147,wi,3,3)(148,Di,4,0),n(),e(149,` 604 `),n(),e(150,` 605 `),n(),e(151,` 606 607 `),i(152,"div",17),e(153,` 608 `),e(154,` 609 `),i(155,"div",32),e(156,` 610 `),i(157,"app-admin-dashboard-card",39),e(158,`
611 `),p(159,"app-tooltip",40),e(160,` 612 `),i(161,"div",41),e(162,` 613 `),i(163,"p-table",42),e(164,` 614 `),S(165,Pi,19,0,"ng-template",null,0,E),e(167,` 615 `),S(168,Ti,28,15,"ng-template",null,1,E),e(170,` 616 `),S(171,Ii,10,1,"ng-template",null,2,E),e(173,` 617 `),n(),e(174,` 618 `),n(),e(175,` 619 `),n(),e(176,` 620 `),n(),e(177,` 621 622 `),i(178,"div",32),e(179,` 623 `),i(180,"app-admin-dashboard-card",43),e(181,` 624 `),p(182,"app-tooltip",44),e(183,` 625 `),i(184,"div",41),e(185,` 626 `),i(186,"p-table",42),e(187,` 627 `),S(188,Ri,19,0,"ng-template",null,0,E),e(190,` 628 `),S(191,ji,31,16,"ng-template",null,1,E),e(193,` 629 `),S(194,Ji,12,1,"ng-template",null,2,E),e(196,` 630 `),n(),e(197,` 631 `),n(),e(198,` 632 `),n(),e(199,` 633 `),n(),e(200,` 634 635 `),x(201,Bi,21,2),n(),e(202,` 636 `)),a&2){let t=c();o(6),u(t.detail.summary.cronExpression?6:-1),o(),u(t.detail.summary.enabled?-1:7),o(),u(t.detail.summary.lastRunStatusName?8:-1),o(12),h(v(21,31,t.detail.summary.runs)),o(3),u(t.detail.scheduleAdherencePercent!==null&&t.detail.scheduleAdherencePercent!==void 0?23:-1),o(11),f("",y(35,33,t.detail.summary.successRatePercent,"1.0-1"),"%"),o(4),f(` 637 `,v(39,36,t.detail.summary.failedRuns+t.detail.summary.completedWithErrorRuns),` unclean 638 `),o(13),h(t.formatDuration(t.detail.summary.averageDurationSeconds)),o(2),u(t.detail.summary.averageDurationChangePercent?53:-1),o(11),h(t.formatDuration(t.detail.summary.medianDurationSeconds)),o(3),f("p95 ",t.formatDuration(t.detail.summary.p95DurationSeconds)),o(12),h(t.formatDuration(t.detail.summary.totalDurationSeconds)),o(3),f("max ",t.formatDuration(t.detail.summary.maxDurationSeconds)),o(12),h(v(95,38,t.detail.summary.itemsProcessed)),o(5),u(t.detail.summary.itemsPerSecond?99:-1),o(),u(t.detail.summary.itemsFailed?100:-1),o(5),u(t.detail.longestGapMinutes?105:-1),o(9),s("renderAsLink",!1),o(2),u(t.runsTruncated?116:-1),o(),u(t.scatterChart?117:118),o(8),s("renderAsLink",!1),o(2),u(t.histogramChart?127:128),o(8),s("renderAsLink",!1),o(2),u(t.outcomeChart?137:138),o(8),s("renderAsLink",!1),o(2),u(t.runLengthChart?147:148),o(12),s("renderAsLink",!1),o(4),s("value",t.detail.slowestRuns),o(19),s("renderAsLink",!1),o(4),s("value",t.detail.recentFailures),o(15),u(t.detail.topFailingClubs!=null&&t.detail.topFailingClubs.length?201:-1)}}var Ze=(()=>{let r=class r{constructor(l,m,d,g){this.jobPerformanceService=l,this.siteDataService=m,this.router=d,this.route=g,this.unsubscribe$=new q,this.loading=!0,this.error="",this.selectedRange=R.LAST_7_DAYS,this.rangeOptions=ve,this.formatDuration=I,this.statusPill=fe,this.formatChange=ge,this.changeClass=Se,this.changeIcon=Ee}ngOnInit(){Ae([this.route.params,this.route.queryParams]).pipe(L(this.unsubscribe$)).subscribe({next:([l,m])=>{this.jobId=+l.jobID,m.days&&(this.selectedRange=+m.days),this.jobId>0?this.load():(this.error="No job was named in the URL.",this.loading=!1,this.siteDataService.hideSiteLoader())},error:()=>{this.error="Unable to read the job from the URL.",this.loading=!1,this.siteDataService.hideSiteLoader()}})}ngOnDestroy(){this.unsubscribe$.next(),this.unsubscribe$.complete()}load(){this.loading=!0,this.error="",this.jobPerformanceService.getJobDetail(this.jobId,this.selectedRange).pipe(L(this.unsubscribe$)).subscribe({next:l=>{this.detail=l,this.buildCharts(),this.loading=!1,this.siteDataService.hideSiteLoader()},error:l=>{this.error=l?.status===404?"That job no longer exists.":`Failed to load this job's performance${l?.status?` (HTTP ${l.status})`:""}. Please try again.`,this.loading=!1,this.siteDataService.hideSiteLoader()}})}onRangeChange(){this.router.navigate([],{relativeTo:this.route,queryParams:{days:this.selectedRange},queryParamsHandling:"merge"})}get runsTruncated(){return!!this.detail&&this.detail.runsSampled<this.detail.summary.runs}get outlierCount(){return this.detail?.runs?.filter(l=>l.isOutlier).length??0}buildCharts(){this.outcomeChart=ye(this.detail?.trend),this.runLengthChart=we(this.detail?.trend),this.buildScatterChart(),this.buildHistogramChart()}buildScatterChart(){let l=(this.detail?.runs??[]).filter(C=>C.durationSeconds!==null&&C.durationSeconds!==void 0);if(!l.length){this.scatterChart=null;return}let m=A(),d=(C,W,Xe)=>({label:C,data:l.filter(Xe).map(Pe=>({x:_e(Pe.startDate),y:Pe.durationSeconds,jobLogId:Pe.jobLogId})),backgroundColor:W,borderColor:m.surface,borderWidth:1,pointRadius:4,pointHoverRadius:7}),g=[d("Succeeded",m.success,C=>C.jobStatusId===V.SUCCESS),d("Completed with errors",m.warning,C=>C.jobStatusId===V.COMPLETED_WITH_ERRORS),d("Failed",m.critical,C=>C.jobStatusId===V.FAILURE),d("Canceled",m.muted,C=>C.jobStatusId===V.CANCELED)].filter(C=>C.data.length),_=this.detail.summary.p95DurationSeconds;if(_){let C=_e(l[0].startDate),W=_e(l[l.length-1].startDate);g.push({type:"line",label:`p95 (${I(_)})`,data:[{x:C,y:_},{x:W,y:_}],borderColor:m.neutral,borderWidth:2,borderDash:[6,4],pointRadius:0,fill:!1})}this.scatterChart={type:"scatter",data:{datasets:g},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{usePointStyle:!0,padding:16}},tooltip:{callbacks:{title:C=>
638new Date(C[0].parsed.x).toLocaleString(),label:C=>{let W=C.raw?.jobLogId?` \u2014 run #${C.raw.jobLogId}`:"";return`${C.dataset.label}: ${I(C.parsed.y)}${W}`}}}},scales:{x:{type:"linear",grid:{display:!1},ticks:{maxTicksLimit:8,callback:C=>new Date(C).toLocaleDateString(void 0,{month:"short",day:"numeric"})}},y:U(m.grid)}}}}buildHistogramChart(){let l=this.detail?.durationHistogram??[],m=l.map(_=>_.runs>0).lastIndexOf(!0);if(m<0){this.histogramChart=null;return}let d=A(),g=l.slice(0,m+1);this.histogramChart={type:"bar",data:{labels:g.map(_=>_.label),datasets:[{label:"Runs",data:g.map(_=>_.runs),backgroundColor:d.neutral,borderColor:d.surface,borderWidth:2,borderRadius:4}]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{callbacks:{label:_=>`${_.parsed.y} run${_.parsed.y===1?"":"s"}`}}},scales:{x:{grid:{display:!1},title:{display:!0,text:"Run length"}},y:{beginAtZero:!0,grid:{color:d.grid},title:{display:!0,text:"Runs"}}}}}}};r.\u0275fac=function(m){return new(m||r)(P($),P(ae),P(ie),P(te))},r.\u0275cmp=G({type:r,selectors:[["app-job-performance-detail"]],standalone:!1,decls:21,vars:15,consts:[["header",""],["body",""],["emptymessage",""],["role","main"],[1,"d-flex","justify-content-between","align-items-center","flex-wrap","border-bottom","mb-3"],["parentLinkText","Job Performance","parentLinkUrl","/admin/job-performance",3,"pageTitle","hideBorder","parentLinkQueryParams"],[1,"d-flex","align-items-center","flex-wrap","mb-2"],["optionLabel","label","optionValue","value",3,"ngModelChange","onChange","options","ngModel","allowEmpty"],[1,"btn","btn-sm","btn-naked","ml-3",3,"routerLink","queryParams"],[1,"fa-regular","fa-list","mr-1"],[1,"mb-3"],["alertType","error"],["type","button",1,"btn","btn-red","btn-sm","ml-2",3,"click"],[1,"fa-regular","fa-rotate-right","mr-1"],["height","220px"],[1,"card","dashboard-card","p-4","mb-3"],[1,"d-flex","align-items-center","flex-wrap","mb-3"],[1,"row"],[1,"col-6","col-lg-2","border-right"],[1,"full-height","py-2","text-center"],["pTooltip","Runs that started inside the window.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"dashboard-big-number"],["pTooltip","Share of finished runs that ended clean.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"text-smallest","text-muted"],["pTooltip","The typical run. Compare against p95 below: a job whose p95 sits far above its average is spiky rather than uniformly slow.",1,"dashboard-big-number--title","mb-2","hover-dotted"],["pTooltip","Median (p50) and 95th percentile run lengths. Half of runs finish inside the median; one in twenty takes longer than the p95.",1,"dashboard-big-number--title","mb-2","hover-dotted"],["pTooltip","Wall-clock time this job spent running across the whole window.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"col-6","col-lg-2"],["pTooltip","Items this job reported processing, and how fast it got through them.",1,"dashboard-big-number--title","mb-2","hover-dotted"],[1,"col-12","mb-3","d-flex","flex-column"],["panelTitle","Run Length Over Time","skeletonHeight","420px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","One point per run, coloured by how it ended. The dashed line is this window's 95th percentile \u2014 points above it are the slow tail worth opening.",3,"renderAsLink"],[1,"col-lg-6","mb-3","d-flex","flex-column"],["panelTitle","Run Length Distribution","skeletonHeight","380px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","How this job's run lengths are spread. One tall bar means a job that behaves the same every time; two separated humps mean it has two modes \u2014 usually a cheap no-op run and a real one.",3,"renderAsLink"],["panelTitle","Outcomes by Day","skeletonHeight","380px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","This job's runs each day, stacked by how they ended. A day with no bar is a day the job did not run at all.",3,"renderAsLink"],["panelTitle","Run Length by Day","skeletonHeight","340px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Average against worst run each day. The gap between the two lines is how spiky the job is \u2014 a rising average with a flat worst case is a different problem from a rising worst case alone.",3,"renderAsLink"],["panelTitle","Slowest Runs","bodyClass","card-body p-0","skeletonHeight","320px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","This job's longest runs in the window. Open one to see the summary, per-club detail and result payload it recorded.",3,"renderAsLink"],[1,"table-responsive"],["dataKey","jobLogId",1,"table","table-striped","table-sm",3,"value"],["panelTitle","Recent Failures","bodyClass","card-body p-0","skeletonHeight","320px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Runs that failed outright, finished with errors, or reported failed items \u2014 most recent first, with a link to the error each one logged.",3,"renderAsLink"],[1,"text-small","text-muted","mr-3"],[1,"fa-regular","fa-clock","mr-1"],[1,"ml-1"],["text","Disabled","status","error",3,"nowrap"],[1,"text-small","text-muted","mr-2"],[1,"mr-2",3,"text","status","nowrap"],[1,"text-small","text-muted"],[1,"text-smallest","text-muted","hover-dotted",3,"pTooltip"],[1,"text-smallest",3,"ngClass"],[1,"text-danger","ml-1"],[1,"text-smallest","text-muted","mt-3"],[1,"fa-regular","fa-circle-info","mr-1"],[1,"mb-2",3,"isInline"],["height","360px",3,"type","data","options"],[1,"text-smallest","text-muted","mt-2"],[1,"text-center","text-muted","py-4"],["height","320px",3,"type","data","options"],["height","280px",3,"type","data","options"],[3,"routerLink","queryParams"],[1,"text-smallest"],[1,"text-small","fw-800"],[1,"text-small"],[3,"text","status","nowrap"],["colspan","5",1,"text-center","py-4"],[3,"isInline"],[2,"width","40%"],[1,"text-small","text-danger","fw-800"],[1,"text-smallest","text-break"],[1,"d-block","text-smallest",3,"routerLink"],[1,"fa-regular","fa-triangle-exclamation","mr-1"],[1,"fa-regular","fa-circle-check","text-success","mr-1"],["panelTitle","Clubs With The Most Failures","bodyClass","card-body p-0","skeletonHeight","300px"],["slot","titleSuffix","tooltipPosition","top","tooltipText","Built from the per-club detail rows this job records. A single club dominating the list usually means bad data for that club rather than a broken job.",3,"renderAsLink"],["dataKey","clubId",1,"table","table-striped","table-sm",3,"value"],[1,"text-small",3,"routerLink","queryParams"]],template:function(m,d){m&1&&(i(0,"main",3),e(1,` 639 `),i(2,"div",4),e(3,` 640 `),p(4,"app-admin-header",5),e(5,` 641 `),i(6,"div",6),e(7,` 642 `),i(8,"p-selectButton",7),N("ngModelChange",function(_){return O(d.selectedRange,_)||(
642d.selectedRange=_),_}),T("onChange",function(){return d.onRangeChange()}),n(),e(9,` 643 `),i(10,"a",8),e(11,` 644 `),p(12,"i",9),e(13,`Runs 645 `),n(),e(14,` 646 `),n(),e(15,` 647 `),n(),e(16,` 648 649 `),x(17,li,12,1),x(18,di,3,0)(19,Mi,203,40),n(),e(20,` 650`)),m&2&&(o(4),s("pageTitle",(d.detail==null||d.detail.summary==null?null:d.detail.summary.jobName)||"Job Performance")("hideBorder",!0)("parentLinkQueryParams",w(10,ni,d.selectedRange)),o(4),s("options",d.rangeOptions),M("ngModel",d.selectedRange),s("allowEmpty",!1),o(2),s("routerLink",D(12,De))("queryParams",w(13,ai,d.jobId)),o(7),u(d.error?17:-1),o(),u(d.loading?18:d.detail?19:-1))},dependencies:[Z,X,ee,ne,me,re,pe,le,ue,xe,he,se,oe,de,be,z,ce],encapsulation:2});let a=r;return a})();var Oi=[{path:"",component:Ke,canActivate:[Re,ke,je],data:{admin:!0,metaTitle:"Job Performance"}},{path:":jobID",component:Ze,canActivate:[Re,ke,je],data:{admin:!0,metaTitle:"Job Performance"}}],ze=(()=>{let r=class r{};r.\u0275fac=function(m){return new(m||r)},r.\u0275mod=K({type:r}),r.\u0275inj=Y({imports:[Ie.forChild(Oi),Ie]});let a=r;return a})();var Rn=(()=>{let r=class r{};r.\u0275fac=function(m){return new(m||r)},r.\u0275mod=K({type:r}),r.\u0275inj=Y({providers:[$],imports:[We,He,ze]});let a=r;return a})();export{Rn as JobPerformanceModule};
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.