307 lines
18 KiB
PHP
307 lines
18 KiB
PHP
@extends('layouts.adminnav')
|
|
|
|
@section('title', 'Exam Results Management - Admin Panel')
|
|
|
|
@section('content')
|
|
<div class="container-fluid">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h3 class="fw-bold text-navy">
|
|
<i class="fa-solid fa-square-poll-vertical me-2"></i>Exam Results Management
|
|
</h3>
|
|
<div>
|
|
<!-- Import Excel Button -->
|
|
<button class="btn btn-success me-2" data-bs-toggle="modal" data-bs-target="#importExcelModal">
|
|
<i class="fa-solid fa-file-excel me-1"></i> Import Excel
|
|
</button>
|
|
<!-- Add Single Result Button -->
|
|
<button class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#addResultModal">
|
|
<i class="fa-solid fa-plus me-1"></i> Add New Result
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
@if(session('success'))
|
|
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
|
<i class="fa-solid fa-circle-check me-2"></i>{{ session('success') }}
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
@endif
|
|
|
|
@if($errors->any())
|
|
<div class="alert alert-danger alert-dismissible fade show" role="alert">
|
|
<i class="fa-solid fa-triangle-exclamation me-2"></i>
|
|
<strong>Please fix the following errors:</strong>
|
|
<ul class="mb-0 mt-1">
|
|
@foreach($errors->all() as $error)
|
|
<li>{{ $error }}</li>
|
|
@endforeach
|
|
</ul>
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
@endif
|
|
|
|
|
|
|
|
<!-- Filter & Search Section -->
|
|
<div class="card border-0 shadow-sm rounded-3 mb-4">
|
|
<div class="card-body">
|
|
<form action="{{ route('admin.results.index') }}" method="GET">
|
|
<div class="row g-3 align-items-end">
|
|
<!-- Search Box -->
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold small text-secondary">Search</label>
|
|
<div class="input-group">
|
|
<span class="input-group-text bg-white"><i class="fa-solid fa-magnifying-glass text-muted"></i></span>
|
|
<input type="text" name="search" class="form-control" placeholder="Student ID, Module Code/Name..." value="{{ request('search') }}">
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Academic Year Filter -->
|
|
<div class="col-md-3">
|
|
<label class="form-label fw-bold small text-secondary">Academic Year</label>
|
|
<input type="text" name="academic_year" class="form-control" placeholder="e.g. 2025/2026" value="{{ request('academic_year') }}">
|
|
</div>
|
|
|
|
<!-- Status Filter -->
|
|
<div class="col-md-3">
|
|
<label class="form-label fw-bold small text-secondary">Status</label>
|
|
<select name="status" class="form-select">
|
|
<option value="">All Statuses</option>
|
|
<option value="Pass" {{ request('status') == 'Pass' ? 'selected' : '' }}>Pass</option>
|
|
<option value="Fail" {{ request('status') == 'Fail' ? 'selected' : '' }}>Fail</option>
|
|
</select>
|
|
</div>
|
|
|
|
<!-- Filter & Reset Buttons -->
|
|
<div class="col-md-2 d-flex gap-2">
|
|
<button type="submit" class="btn btn-navy text-white w-100" style="background-color: #0a192f;">
|
|
<i class="fa-solid fa-filter me-1"></i> Filter
|
|
</button>
|
|
<a href="{{ route('admin.results.index') }}" class="btn btn-outline-secondary" title="Reset Filters">
|
|
<i class="fa-solid fa-rotate-left"></i>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Results Table -->
|
|
<div class="card border-0 shadow-sm rounded-3">
|
|
<div class="card-body p-0">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead class="table-dark">
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Student Log ID</th>
|
|
<th>Module Code</th>
|
|
<th>Module Name</th>
|
|
<th>Academic Year</th>
|
|
<th>Semester</th>
|
|
<th>Marks</th>
|
|
<th>Grade</th>
|
|
<th>Status</th>
|
|
<th class="text-center">Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@forelse($results as $result)
|
|
<tr>
|
|
<td>{{ $result->id }}</td>
|
|
<td><span class="badge bg-secondary">{{ $result->student_log_id }}</span></td>
|
|
<td><strong>{{ $result->module_code }}</strong></td>
|
|
<td>{{ $result->module_name }}</td>
|
|
<td>{{ $result->academic_year }}</td>
|
|
<td>{{ $result->semester }}</td>
|
|
<td><span class="fw-bold">{{ $result->marks }}</span></td>
|
|
<td>
|
|
<span class="badge bg-primary fs-6">{{ $result->grade }}</span>
|
|
</td>
|
|
<td>
|
|
@if(strtolower($result->status) == 'pass')
|
|
<span class="badge bg-success">Pass</span>
|
|
@else
|
|
<span class="badge bg-danger">Fail</span>
|
|
@endif
|
|
</td>
|
|
<td class="text-center">
|
|
<!-- Edit Button -->
|
|
<button class="btn btn-sm btn-outline-primary me-1"
|
|
data-bs-toggle="modal"
|
|
data-bs-target="#editResultModal{{ $result->id }}">
|
|
<i class="fa-solid fa-pen-to-square"></i>
|
|
</button>
|
|
|
|
<!-- Delete Button -->
|
|
<form action="{{ route('admin.results.delete', $result->id) }}" method="POST" class="d-inline" onsubmit="return confirm('Are you sure you want to delete this result?');">
|
|
@csrf
|
|
@method('DELETE')
|
|
<button type="submit" class="btn btn-sm btn-outline-danger">
|
|
<i class="fa-solid fa-trash-can"></i>
|
|
</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
|
|
<!-- Edit Result Modal -->
|
|
<div class="modal fade" id="editResultModal{{ $result->id }}" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header bg-navy text-white">
|
|
<h5 class="modal-title"><i class="fa-solid fa-pen-to-square me-2"></i>Edit Student Result</h5>
|
|
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<form action="{{ route('admin.results.update', $result->id) }}" method="POST">
|
|
@csrf
|
|
@method('PUT')
|
|
<div class="modal-body text-start">
|
|
<div class="row g-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Student Log ID</label>
|
|
<input type="text" name="student_log_id" class="form-control" value="{{ $result->student_log_id }}" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Module Code</label>
|
|
<input type="text" name="module_code" class="form-control" value="{{ $result->module_code }}" required>
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label class="form-label fw-bold">Module Name</label>
|
|
<input type="text" name="module_name" class="form-control" value="{{ $result->module_name }}" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Academic Year</label>
|
|
<input type="text" name="academic_year" class="form-control" value="{{ $result->academic_year }}" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Semester</label>
|
|
<input type="text" name="semester" class="form-control" value="{{ $result->semester }}" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold">Marks</label>
|
|
<input type="number" step="0.01" name="marks" class="form-control" value="{{ $result->marks }}" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold">Grade</label>
|
|
<input type="text" name="grade" class="form-control" value="{{ $result->grade }}" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold">Status</label>
|
|
<select name="status" class="form-select" required>
|
|
<option value="Pass" {{ $result->status == 'Pass' ? 'selected' : '' }}>Pass</option>
|
|
<option value="Fail" {{ $result->status == 'Fail' ? 'selected' : '' }}>Fail</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
|
<button type="submit" class="btn btn-primary">Update Result</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@empty
|
|
<tr>
|
|
<td colspan="10" class="text-center py-4 text-muted">No examination results found.</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Import Excel Modal -->
|
|
<div class="modal fade" id="importExcelModal" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header bg-success text-white">
|
|
<h5 class="modal-title"><i class="fa-solid fa-file-excel me-2"></i>Import Results Excel File</h5>
|
|
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<form action="{{ route('admin.results.import') }}" method="POST" enctype="multipart/form-data">
|
|
@csrf
|
|
<div class="modal-body">
|
|
<div class="mb-3">
|
|
<label class="form-label fw-bold">Choose Excel File (.xlsx, .xls, .csv)</label>
|
|
<input type="file" name="excel_file" class="form-control" accept=".xlsx, .xls, .csv" required>
|
|
</div>
|
|
<div class="alert alert-info py-2 small mb-0">
|
|
<i class="fa-solid fa-circle-info me-1"></i>This Excel <strong>Headers</strong>that should be included in the file for successful import:
|
|
<br><code>student_log_id</code>, <code>module_code</code>, <code>module_name</code>, <code>academic_year</code>, <code>semester</code>, <code>marks</code>, <code>grade</code>, <code>status</code>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
|
<button type="submit" class="btn btn-success"><i class="fa-solid fa-upload me-1"></i> Upload & Process</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Add Result Modal -->
|
|
<div class="modal fade" id="addResultModal" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header bg-navy text-white">
|
|
<h5 class="modal-title"><i class="fa-solid fa-plus-circle me-2"></i>Add New Examination Result</h5>
|
|
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<form action="{{ route('admin.results.store') }}" method="POST">
|
|
@csrf
|
|
<div class="modal-body">
|
|
<div class="row g-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Student Log ID</label>
|
|
<input type="text" name="student_log_id" class="form-control" placeholder="e.g. ST1001" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Module Code</label>
|
|
<input type="text" name="module_code" class="form-control" placeholder="e.g. AME201" required>
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label class="form-label fw-bold">Module Name</label>
|
|
<input type="text" name="module_name" class="form-control" placeholder="e.g. Automobile Technology II" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Academic Year</label>
|
|
<input type="text" name="academic_year" class="form-control" placeholder="e.g. 2025/2026" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label fw-bold">Semester</label>
|
|
<input type="text" name="semester" class="form-control" placeholder="e.g. Semester 1" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold">Marks</label>
|
|
<input type="number" step="0.01" name="marks" class="form-control" placeholder="0 - 100" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold">Grade</label>
|
|
<input type="text" name="grade" class="form-control" placeholder="e.g. A+, B, C" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label fw-bold">Status</label>
|
|
<select name="status" class="form-select" required>
|
|
<option value="Pass">Pass</option>
|
|
<option value="Fail">Fail</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
|
<button type="submit" class="btn btn-success"><i class="fa-solid fa-floppy-disk me-1"></i> Save Result</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
@endsection |