203 lines
9.9 KiB
PHP
203 lines
9.9 KiB
PHP
@extends('layouts.admin')
|
||
|
||
@section('title', 'Soalselidik — ' . $program->title)
|
||
@section('header', 'Urus Soalselidik Program')
|
||
|
||
@section('breadcrumb')
|
||
<li class="breadcrumb-item"><a href="{{ route('admin.programs.index') }}">Program</a></li>
|
||
<li class="breadcrumb-item"><a href="{{ route('admin.programs.show', $program) }}">{{ Str::limit($program->title, 30) }}</a></li>
|
||
<li class="breadcrumb-item active">Soalselidik</li>
|
||
@endsection
|
||
|
||
@section('header-actions')
|
||
<div class="d-flex gap-2">
|
||
@if($pq && $pq->questionnaireSet)
|
||
<a href="{{ route('admin.programs.questionnaire.preview', $program) }}" target="_blank"
|
||
class="btn btn-sm btn-outline-primary">
|
||
<i class="bi bi-eye me-1"></i> Pratonton
|
||
</a>
|
||
@endif
|
||
<a href="{{ route('admin.programs.show', $program) }}#tab-questionnaire" class="btn btn-sm btn-outline-secondary">
|
||
<i class="bi bi-arrow-left me-1"></i> Kembali
|
||
</a>
|
||
</div>
|
||
@endsection
|
||
|
||
@section('content')
|
||
|
||
<div class="row g-4">
|
||
{{-- Current Questionnaire --}}
|
||
<div class="col-md-7">
|
||
<div class="card border-0 shadow-sm">
|
||
<div class="card-header bg-white py-3">
|
||
<h6 class="mb-0 fw-semibold"><i class="bi bi-clipboard2-check me-2 text-primary"></i>Soalselidik Semasa</h6>
|
||
</div>
|
||
<div class="card-body">
|
||
|
||
@if($pq && $pq->questionnaireSet)
|
||
<div class="d-flex justify-content-between align-items-start mb-3">
|
||
<div>
|
||
<div class="fw-semibold">{{ $pq->questionnaireSet->title }}</div>
|
||
<div class="text-muted small">{{ $pq->questionnaireSet->questions->count() }} soalan</div>
|
||
@if($pq->questionnaireSet->description)
|
||
<div class="text-muted small mt-1">{{ $pq->questionnaireSet->description }}</div>
|
||
@endif
|
||
</div>
|
||
@if($pq->is_confirmed)
|
||
<span class="badge bg-success fs-6 px-3 py-2">
|
||
<i class="bi bi-check-circle me-1"></i> Disahkan
|
||
</span>
|
||
@else
|
||
<span class="badge bg-warning text-dark fs-6 px-3 py-2">
|
||
<i class="bi bi-exclamation-circle me-1"></i> Belum Disahkan
|
||
</span>
|
||
@endif
|
||
</div>
|
||
|
||
@if($pq->is_confirmed)
|
||
<div class="alert alert-success small mb-3">
|
||
<i class="bi bi-info-circle me-1"></i>
|
||
Disahkan oleh <strong>{{ $pq->confirmedBy?->name ?? '—' }}</strong>
|
||
pada {{ $pq->confirmed_at?->format('d M Y, H:i') }}.
|
||
</div>
|
||
@else
|
||
<div class="alert alert-warning small mb-3">
|
||
<i class="bi bi-exclamation-triangle me-1"></i>
|
||
Soalselidik perlu <strong>disahkan</strong> sebelum peserta boleh menjawab.
|
||
</div>
|
||
<form method="POST" action="{{ route('admin.programs.questionnaire.confirm', $program) }}" class="mb-3">
|
||
@csrf
|
||
<button class="btn btn-success w-100" onclick="return confirm('Sahkan soalselidik ini untuk program?')">
|
||
<i class="bi bi-check-circle me-2"></i> Sahkan Soalselidik
|
||
</button>
|
||
</form>
|
||
@endif
|
||
|
||
{{-- List Questions --}}
|
||
<div class="border rounded p-3 bg-light">
|
||
<div class="small fw-medium text-muted mb-2">Senarai Soalan:</div>
|
||
@php
|
||
$allQs = $pq->questionnaireSet->questions->sortBy('sort_order');
|
||
$topQs = $allQs->whereNull('parent_id');
|
||
$qNum = 0;
|
||
@endphp
|
||
@foreach($topQs as $q)
|
||
@if($q->question_type === 'tajuk')
|
||
<div class="d-flex align-items-center gap-2 mt-2 mb-1">
|
||
<span class="badge bg-dark" style="font-size:0.6rem;">Tajuk</span>
|
||
<div class="small fw-semibold text-dark">{{ $q->question_text }}</div>
|
||
</div>
|
||
@foreach($allQs->where('parent_id', $q->id)->sortBy('sort_order') as $child)
|
||
@php $qNum++ @endphp
|
||
<div class="d-flex align-items-start gap-2 mb-1 ps-3">
|
||
<span class="badge bg-secondary flex-shrink-0" style="min-width:22px;font-size:0.65rem;">{{ $qNum }}</span>
|
||
<div>
|
||
<div class="small">{{ $child->question_text }}</div>
|
||
<span class="badge bg-light text-dark border" style="font-size:0.6rem;">Rating 1–5</span>
|
||
@if($child->is_required)<span class="badge bg-danger bg-opacity-10 text-danger" style="font-size:0.6rem;">Wajib</span>@endif
|
||
</div>
|
||
</div>
|
||
@endforeach
|
||
@else
|
||
@php $qNum++ @endphp
|
||
<div class="d-flex align-items-start gap-2 mb-2">
|
||
<span class="badge bg-secondary flex-shrink-0" style="min-width:22px;font-size:0.65rem;">{{ $qNum }}</span>
|
||
<div>
|
||
<div class="small">{{ $q->question_text }}</div>
|
||
<span class="badge bg-light text-dark border" style="font-size:0.65rem;">
|
||
{{ match($q->question_type) {
|
||
'rating' => 'Rating 1–5',
|
||
'single_choice' => 'Pilihan Tunggal',
|
||
'multiple_choice' => 'Pilihan Berganda',
|
||
'short_text' => 'Teks Pendek',
|
||
'long_text' => 'Teks Panjang',
|
||
default => $q->question_type,
|
||
} }}
|
||
</span>
|
||
@if($q->is_required)<span class="badge bg-danger bg-opacity-10 text-danger" style="font-size:0.65rem;">Wajib</span>@endif
|
||
</div>
|
||
</div>
|
||
@endif
|
||
@endforeach
|
||
</div>
|
||
|
||
{{-- Detach --}}
|
||
<div class="mt-3">
|
||
<form method="POST" action="{{ route('admin.programs.questionnaire.detach', $program) }}"
|
||
onsubmit="return confirm('Tanggalkan soalselidik dari program ini?')">
|
||
@csrf @method('DELETE')
|
||
<button class="btn btn-sm btn-outline-danger">
|
||
<i class="bi bi-x-circle me-1"></i> Tanggalkan Soalselidik
|
||
</button>
|
||
</form>
|
||
</div>
|
||
|
||
@else
|
||
<div class="text-center py-4 text-muted">
|
||
<i class="bi bi-clipboard2-x d-block fs-1 mb-3 opacity-25"></i>
|
||
<p class="mb-0">Belum ada soalselidik dilampirkan untuk program ini.</p>
|
||
</div>
|
||
@endif
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{-- Right: Attach New --}}
|
||
@if(! $pq)
|
||
<div class="col-md-5">
|
||
<div class="card border-0 shadow-sm">
|
||
<div class="card-header bg-white py-3">
|
||
<h6 class="mb-0 fw-semibold"><i class="bi bi-clipboard2-plus me-2 text-success"></i>Lampir Soalselidik</h6>
|
||
</div>
|
||
<div class="card-body">
|
||
|
||
@if($availableSets->isEmpty())
|
||
<div class="alert alert-info small">
|
||
<i class="bi bi-info-circle me-1"></i>
|
||
Tiada set soalselidik yang diterbitkan.
|
||
<a href="{{ route('admin.questionnaires.create') }}">Buat set baru.</a>
|
||
</div>
|
||
@else
|
||
<form method="POST" action="{{ route('admin.programs.questionnaire.attach', $program) }}">
|
||
@csrf
|
||
<div class="mb-3">
|
||
<label class="form-label fw-medium small">Pilih Set Soalselidik <span class="text-danger">*</span></label>
|
||
<select name="questionnaire_set_id"
|
||
class="form-select @error('questionnaire_set_id') is-invalid @enderror">
|
||
<option value="">— Pilih —</option>
|
||
@foreach($availableSets as $qs)
|
||
<option value="{{ $qs->id }}" {{ old('questionnaire_set_id') == $qs->id ? 'selected' : '' }}>
|
||
{{ $qs->title }} ({{ $qs->questions_count }} soalan)
|
||
</option>
|
||
@endforeach
|
||
</select>
|
||
@error('questionnaire_set_id')<div class="invalid-feedback">{{ $message }}</div>@enderror
|
||
</div>
|
||
|
||
<div class="alert alert-info small">
|
||
<i class="bi bi-lightbulb me-1"></i>
|
||
Selepas lampir, anda perlu <strong>sahkan</strong> soalselidik sebelum peserta boleh menjawab.
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-success w-100">
|
||
<i class="bi bi-clipboard2-plus me-2"></i> Lampir & Teruskan
|
||
</button>
|
||
</form>
|
||
@endif
|
||
|
||
<div class="mt-3 text-center">
|
||
<a href="{{ route('admin.questionnaires.index') }}" class="small text-muted">
|
||
<i class="bi bi-gear me-1"></i> Urus Set Soalselidik
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@endif
|
||
|
||
</div>
|
||
|
||
@endsection
|