filter_alt

Select a training domain

Choose a domain above to load its training plan dashboard.

{{ summary.TotalInstances }}

event_note
Total Instances {{ summary.TotalEnrollments }} enrollments · {{ summary.CompletedThisYear }} completed this year

{{ summary.OverallCompletionRate | number:'1.0-0' }}%

trending_up
Completion Rate Pass rate {{ summary.OverallPassRate | number:'1.0-0' }}%

{{ summary.PendingNominations + summary.PendingHRApprovals }}

schedule
Pending Review {{ summary.PendingNominations }} nominations · {{ summary.PendingHRApprovals }} HR approval

{{ summary.CertificatesIssuedThisYear }}

military_tech
Certificates Issued {{ summary.ExpiringCertificates30Days }} expiring in 30 days
{{ summary.TotalTrainingNeeds }} Training Needs {{ summary.TotalDomains }} Domains {{ summary.TotalTrainers }} Trainers {{ summary.TotalProgrammes }} Programmes {{ summary.TotalEmployeesTrained }} Employees Trained
{{ filteredAssociateRows.length }} of {{ associatesCount }} associates
Associate
{{ m.MonthLabel }}
W{{ w }}
{{ row.employee.EmployeeName }} {{ STATUS_PILL_LABELS[row.status] }}
#{{ row.employee.EmployeeCode }} · {{ row.primaryDomain }}
Plan
Actual
{{ seg.label }}

No associates match the current filters.

Training Type Legend
{{ l.LegendLabel }}
Plan
Actual
Delay
Retraining

Enrollment Funnel

Where enrolments currently stand, stage by stage

{{ stage.label }}
{{ stage.value }}
Total enrollments tracked: {{ funnel.Total }}
Training Type Legend
{{ l.LegendLabel }}

Associates Needing Attention

Running behind their planned training schedule

{{ row.employee.EmployeeName }}

Delayed
#{{ row.employee.EmployeeCode }} · {{ row.primaryDomain }}

{{ row.delayedStageCount }} stage(s) running behind plan. Schedule a retraining review.

Active Instances

Instances currently open, in progress or awaiting kickoff

event {{ instances.length }} instance(s)
Instance Programme Domain Dates Venue Capacity Status Actions
event_note

{{ inst.InstanceTitle }}

{{ inst.InstanceCode }} · Retraining
{{ inst.ProgrammeTitle }} {{ inst.DomainName || '—' }} {{ inst.PlannedStartDate | date:'dd MMM' }} - {{ inst.PlannedEndDate | date:'dd MMM yyyy' }} location_on {{ inst.VenueName || '—' }}
{{ inst.EnrolledCount }}/{{ inst.MaxCapacity }}
{{ getInstanceStatusLabel(inst.InstanceStatus) }}

No active instances right now.

Domain Completion

Enrolment outcomes by training domain

Domain Instances Enrollments Employees Completion Rate Pass Rate Avg Score Certificates Actions

{{ d.DomainName }}

{{ d.DomainCode }}
{{ d.TotalInstances }} {{ d.TotalEnrollments }} {{ d.TotalEmployees }}
{{ d.CompletionRate | number:'1.0-1' }}%
{{ d.PassRate | number:'1.0-1' }}%
{{ d.AvgPostAssessmentScore ? (d.AvgPostAssessmentScore | number:'1.0-1') : '—' }} {{ d.CertificatesIssued }}

No domain activity yet.

Programme Performance

Outcomes rolled up by training programme

Programme Type Instances Enrollments Completion Rate Avg Score / Pass Mark Certificates Actions

{{ p.ProgrammeTitle }}

{{ p.ProgrammeCode }} · {{ p.DomainName }}
{{ p.TrainingTypeName }} {{ p.TotalInstances }} {{ p.TotalEnrollments }}
{{ p.CompletionRate | number:'1.0-1' }}%
{{ p.AvgPostAssessmentScore ? (p.AvgPostAssessmentScore | number:'1.0-1') : '—' }} / {{ p.PassMark | number:'1.0-0' }} {{ p.CertificatesIssued }}

No programme activity yet.

Trainer Workload

Instance assignments per trainer

{{ t.TrainerName || t.TrainerCode }} {{ getTrainerTypeLabel(t.TrainerType) }}
{{ t.TrainerCode }}
{{ t.AssignedInstances }} Instances
{{ t.TotalEnrollees }} Enrollees
{{ t.CompletedEnrollees }} Completed

No trainers assigned yet.

Training Needs

Raised needs awaiting action

{{ n.NeedTitle }}

{{ n.IsMandatory ? 'Mandatory' : 'Optional' }}
{{ n.NeedCode }} · {{ n.DomainName || '—' }}

{{ n.Description }}

Priority
{{ isNeedOverdue(n) ? 'Overdue · ' : '' }}{{ n.ComplianceDeadline ? (n.ComplianceDeadline | date:'dd MMM yyyy') : '—' }}

No training needs raised.

@if (showBulkImport()) {
Import Plan Schedule
clear

This imports the Training Instances that make up a plan's schedule (there's no separate "Training Plan" record — the dashboard is an aggregate view built from Instances/Needs/Programmes). Domain, Programme, Venue and Trainer are matched by name against their master screens automatically — no need to look up numeric ids. Dates must be in YYYY-MM-DD format.

@if (bulkLookupsLoading()) {
Loading Domain / Programme / Venue / Trainer master lists…
} @if (bulkLookupsError()) {
Couldn't load the master lists needed to match names. Retry
}
@if (bulkFileName()) { {{ bulkFileName() }} }
@if (bulkRows().length === 0) {

Expected columns:

    @for (col of bulkColumns; track col.key) {
  • {{ col.label }} @if (col.required) { * } @if (col.hint) { — {{ col.hint }} }
  • }
} @if (bulkRows().length > 0) {
{{ bulkRows().length }} rows @if (bulkInvalidCount() > 0) { {{ bulkInvalidCount() }} invalid } @if (bulkSuccessCount() > 0) { {{ bulkSuccessCount() }} imported } @if (bulkErrorCount() > 0) { {{ bulkErrorCount() }} failed } @if (bulkImporting()) { Importing… {{ bulkProcessedCount() }} / {{ bulkValidCount() }} }
@for (col of bulkColumns; track col.key) { } @for (row of bulkRows(); track row._rowNum) { @for (col of bulkColumns; track col.key) { } }
#{{ col.label }}Status
{{ row._rowNum }}{{ row[col.key] }} {{ row._status }} @if (row._errors.length) {
{{ row._errors.join(', ') }}
} @if (row._message) {
{{ row._message }}
}
}
}