Training Instance Scheduler

{{ filteredInstances().length }} of {{ totalCount() }} instances

search
{{ totalCount() }} Total
{{ draftCount() }} Draft
{{ openCount() }} Open
{{ inProgressCount() }} In Progress
{{ completedCount() }} Completed
@for (inst of filteredInstances(); track inst.InstanceId) {
{{ inst.TrainingDomainName || 'General' }} {{ STATUS_LABELS[inst.InstanceStatus] }} @if (inst.Priority === 3) { ● Critical }

{{ inst.InstanceTitle }}

{{ inst.InstanceCode }} · {{ inst.ProgrammeCode || '—' }} · {{ inst.VenueName || '—' }}

calendar_today {{ inst.PlannedStartDate | date:'d MMM yyyy' }} – {{ inst.PlannedEndDate | date:'d MMM yyyy' }}
Enrollment
{{ inst.EnrolledCount }} /{{ inst.MaxCapacity }}
{{ getSeatsLeft(inst) }} seats left
@if (inst.InstanceStatus === 3) { } @else if (inst.InstanceStatus === 1) { }
@if (expandedCardId() === inst.InstanceId) {
@if (!sessionsLoaded()) {
refresh Loading sessions...
} @else if (expandedSessions().length === 0) {
No sessions added for this instance.
} @else {
# Session Date & Time Trainer Status
@for (s of expandedSessions(); track s.InstanceSessionId; let odd = $odd) {
{{ s.SlNo }} {{ s.SessionTitle }} {{ s.ScheduledDate | date:'d MMM' }} · {{ s.StartTime }}–{{ s.EndTime }} {{ s.TrainerName || '—' }} {{ SESSION_STATUS_LABELS[s.SessionStatus] }}
} }
} @if (feedbackExpandedId() === inst.InstanceId) { }
} @if (filteredInstances().length === 0) {
event_note

No training instances found.

}
@if (trainerType() === 1) {
}
@if (showBulkImport()) {
Bulk Import Training Instances
clear

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 }}
}
}
}