Learner view @if (session('status'))
{{ session('status') }}
@endif @if (session('error'))
{{ session('error') }}
@endif @if ($errors->any())
@endif
Learners must tick every lesson; a quiz pass is then required before the course completes. @if ($course->modules->isEmpty() && $course->lessons->isEmpty())

No content yet — add a module, then add lessons to it.

@endif @foreach ($course->modules as $module)

{{ $module->title }}

@if ($module->description)

{{ $module->description }}

@endif
{{ $module->lessons->count() }} lesson(s)
    @foreach ($module->lessons as $lesson)
  • {{ $lesson->title }} {{ $lesson->kind_label }}@if ((int) $lesson->duration_minutes > 0) · {{ $lesson->duration_minutes }} min @endif
    @if ($lesson->file_path) File @endif @can('hrm.training.manage')
    @csrf @method('DELETE')
    @endcan
  • @endforeach @if ($module->lessons->isEmpty())
  • No lessons in this module yet.
  • @endif
@endforeach @php($loose = $course->lessons->whereNull('module_id')) @if ($loose->isNotEmpty())
Unassigned lessons
    @foreach ($loose as $lesson)
  • {{ $lesson->title }} {{ $lesson->kind_label }} @can('hrm.training.manage')
    @csrf @method('DELETE')
    @endcan
  • @endforeach
@endif @can('hrm.training.manage')
Add module
@csrf
Add lesson
@csrf

PDF for a document lesson, MP4/WebM for an uploaded video; up to 100 MB.

@endcan
Each quiz has its own pass mark and attempt limit. A learner passes the course only when every active quiz has been passed. @foreach ($course->quizzes as $quiz)

{{ $quiz->title }}

Pass mark {{ $quiz->pass_score }}% · {{ $quiz->max_attempts }} attempt(s) @if ($quiz->time_limit_minutes) · {{ $quiz->time_limit_minutes }} min @endif

{{ $quiz->questions->count() }} question(s) · {{ $quiz->totalMarks() }} marks
    @foreach ($quiz->questions as $question)
  • {{ $question->question }}

    @foreach ((array) $question->options as $index => $option) {{ chr(65 + $index) }}. {{ $option }}@if (in_array($index, array_map('intval', (array) $question->correct), true)) ✓@endif @endforeach

    {{ ucfirst(str_replace('_', ' ', $question->type)) }} · {{ $question->marks }} mark(s)

    @can('hrm.training.manage')
    @csrf @method('DELETE')
    @endcan
  • @endforeach @if ($quiz->questions->isEmpty())
  • No questions yet.
  • @endif
@can('hrm.training.manage')
Add question
@csrf
@endcan
@endforeach @if ($course->quizzes->isEmpty())

No quizzes yet. A course without a quiz completes when every lesson is ticked.

@endif @can('hrm.training.manage')
Add quiz
@csrf
@endcan
Category
Delivery
{{ ucfirst($course->delivery_mode) }}
Duration
{{ (int) $course->duration_minutes }} minutes
Re-certification
{{ $course->validity_months ? $course->validity_months.' months' : 'Not recurring' }}
Onboarding
{{ $course->auto_onboard ? 'Auto — due within '.$course->onboarding_due_days.' days of joining' : 'Not automatic' }}
Status
@if ($course->description)

{{ $course->description }}

@endif @can('hrm.training.manage')
Edit course
@csrf @method('PUT')
@endcan
@if ($assignments->isEmpty())

Nobody is assigned this course yet.

@else
    @foreach ($assignments as $assignment)
  • {{ $assignment->user?->name ?? '—' }}
    {{ $assignment->progressPercent() }}% · {{ str_replace('_', ' ', $assignment->source) }} {{ $assignment->due_date?->format('d M Y') ?? 'No due date' }}
  • @endforeach
{{ $assignments->links() }}
@endif