set lms parts
This commit is contained in:
parent
705917497d
commit
5d76c711f7
|
|
@ -3,40 +3,75 @@
|
|||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Feedback;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class FeedbackController extends Controller
|
||||
{
|
||||
// public function feedback(Request $request)
|
||||
// {
|
||||
|
||||
// $request->validate([
|
||||
// 'feedback_type' => 'required',
|
||||
// 'subject' => 'required|string|max:255',
|
||||
// 'feedback_text' => 'required|string',
|
||||
// ]);
|
||||
public function index(Request $request)
|
||||
{
|
||||
$studentLogId = session('student_log_id') ?? session('student_id');
|
||||
|
||||
if (!$studentLogId) {
|
||||
return redirect('/')->with('error', 'Please login first!');
|
||||
}
|
||||
|
||||
$feedbacks = DB::table('feedback')
|
||||
->where('student_id', $studentLogId)
|
||||
->orderBy('created_at', 'desc')
|
||||
->get();
|
||||
|
||||
return view('Feedback&Complain', compact('feedbacks'));
|
||||
}
|
||||
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$studentLogId = session('student_log_id') ?? session('student_id');
|
||||
|
||||
if (!$studentLogId) {
|
||||
return redirect('/')->with('error', 'Please login first to submit!');
|
||||
}
|
||||
|
||||
|
||||
$isComplaint = $request->has('is_complaint') && $request->is_complaint == "1";
|
||||
|
||||
if ($isComplaint) {
|
||||
|
||||
$request->validate([
|
||||
'complaint_category' => 'required',
|
||||
'complaint_title' => 'required|string|max:255',
|
||||
'complaint_details' => 'required|string',
|
||||
]);
|
||||
|
||||
$type = 'Complaint - ' . $request->complaint_category;
|
||||
$subject = $request->complaint_title;
|
||||
$text = $request->complaint_details;
|
||||
} else {
|
||||
|
||||
$request->validate([
|
||||
'feedback_type' => 'required',
|
||||
'subject' => 'required|string|max:255',
|
||||
'feedback_text' => 'required|string',
|
||||
]);
|
||||
|
||||
$type = 'Feedback - ' . $request->feedback_type;
|
||||
$subject = $request->subject;
|
||||
$text = $request->feedback_text;
|
||||
}
|
||||
|
||||
|
||||
DB::table('feedback')->insert([
|
||||
'student_id' => $studentLogId,
|
||||
'feedback_type' => $type,
|
||||
'subject' => $subject,
|
||||
'feedback_text' => $text,
|
||||
'status' => 'Pending',
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
return redirect()->back()->with('success', ($isComplaint ? 'Complaint' : 'Feedback') . ' submitted successfully!');
|
||||
}
|
||||
|
||||
|
||||
// $studentLogId = session('student_portal_log_id');
|
||||
|
||||
|
||||
// if (!$studentLogId) {
|
||||
// return redirect('/')->with('error', 'Please login first to submit feedback!');
|
||||
// }
|
||||
|
||||
|
||||
// DB::table('feedbacks')->insert([
|
||||
// 'student_id' => $studentLogId,
|
||||
// 'feedback_type' => $request->feedback_type,
|
||||
// 'subject' => $request->subject,
|
||||
// 'feedback_text' => $request->feedback_text,
|
||||
// 'status' => 'Pending',
|
||||
// 'created_at' => now(),
|
||||
// 'updated_at' => now(),
|
||||
// ]);
|
||||
|
||||
|
||||
// return redirect()->back()->with('success', 'Feedback submitted successfully!');
|
||||
// }
|
||||
}
|
||||
|
|
@ -4,43 +4,52 @@ namespace App\Http\Controllers;
|
|||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\StudentPortalLog ;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
|
||||
|
||||
class StudentPortalController extends Controller
|
||||
{
|
||||
|
||||
public function studentlogin(Request $request)
|
||||
{
|
||||
|
||||
$request->validate([
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
'username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
'pin' => 'required|numeric',
|
||||
]);
|
||||
|
||||
|
||||
$student = DB::table('student_portal_logs')
|
||||
->where('email', $request->username)
|
||||
->orWhere('studentid', $request->username)
|
||||
->first();
|
||||
|
||||
|
||||
if ($student && Hash::check($request->password, $student->password) && $student->pin == $request->pin) {
|
||||
if ($student->status !== 'active' && $student->status !== '') {
|
||||
return redirect('/')->with('error', 'Your account is inactive!');
|
||||
}
|
||||
$request->session()->put('student_id', $student->studentid);
|
||||
return redirect()->route('student.portal')->with('success', 'Logged in successfully!');
|
||||
}
|
||||
return redirect('/')->with('error', 'Invalid Email, Password, or PIN!');
|
||||
|
||||
if ($student->status !== 'active' && $student->status !== '' && !is_null($student->status)) {
|
||||
return redirect()->back()->with('error', 'Your account is inactive!');
|
||||
}
|
||||
|
||||
|
||||
$request->session()->put('student_id', $student->studentid);
|
||||
$request->session()->put('student_log_id', $student->id ?? null);
|
||||
|
||||
$name = trim(($student->first_name ?? '') . ' ' . ($student->last_name ?? ''));
|
||||
$request->session()->put('student_name', $name ?: ($student->email ?? $student->studentid));
|
||||
|
||||
return redirect()->route('student.portal')->with('success', 'Logged in successfully!');
|
||||
}
|
||||
|
||||
return redirect()->back()->with('error', 'Invalid Email/Username, Password, or PIN!');
|
||||
}
|
||||
|
||||
public function showProfile(Request $request)
|
||||
{
|
||||
|
||||
$log_id = $request->session()->get('student_log_id');
|
||||
$student_code = $request->session()->get('student_id');
|
||||
|
||||
|
||||
if (!$log_id && !$student_code) {
|
||||
return redirect('/')->with('error', 'Please login first!');
|
||||
}
|
||||
|
|
@ -52,108 +61,33 @@ public function showProfile(Request $request)
|
|||
$query->where('student_portal_log_id', $log_id);
|
||||
}
|
||||
if ($student_code) {
|
||||
|
||||
if ($log_id) {
|
||||
$query->orWhere('student_id', $student_code);
|
||||
} else {
|
||||
$query->where('student_id', $student_code);
|
||||
}
|
||||
}
|
||||
})
|
||||
->first();
|
||||
|
||||
|
||||
if (!$student) {
|
||||
return redirect()->back()->with('error', 'Student details not found in database!');
|
||||
return redirect()->route('student.portal')->with('error', 'Student details not found in database!');
|
||||
}
|
||||
|
||||
|
||||
return view('StudentProfile', compact('student'));
|
||||
}
|
||||
|
||||
public function studentlogout(Request $request)
|
||||
{
|
||||
$request->session()->forget(['student_id', 'student_log_id', 'student_name']);
|
||||
$request->session()->invalidate();
|
||||
$request->session()->regenerateToken();
|
||||
|
||||
return response()->json(['success' => true]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// public function showProfile(Request $request)
|
||||
// {
|
||||
|
||||
// $log_id = $request->session()->get('student_log_id');
|
||||
// $student_code = $request->session()->get('student_id');
|
||||
|
||||
// if (!$log_id && !$student_code) {
|
||||
// return redirect('/')->with('error', 'Please login first!');
|
||||
// }
|
||||
|
||||
|
||||
// $student = DB::table('student_details')
|
||||
// ->where('student_portal_log_id', $log_id)
|
||||
// ->orWhere('student_id', $student_code)
|
||||
// ->first();
|
||||
|
||||
|
||||
// if (!$student) {
|
||||
// return redirect()->back()->with('error', 'Student details not found in database!');
|
||||
// }
|
||||
|
||||
// return view('StudentProfile', compact('student'));
|
||||
// }
|
||||
|
||||
|
||||
// public function showProfile(Request $request)
|
||||
// {
|
||||
|
||||
// $log_id = $request->session()->get('student_log_id');
|
||||
// $student_code = $request->session()->get('student_id');
|
||||
|
||||
// if (!$log_id && !$student_code) {
|
||||
// return redirect('/')->with('error', 'Please login first!');
|
||||
// }
|
||||
|
||||
|
||||
// $student = DB::table('student_details')
|
||||
// ->where('student_portal_log_id', $log_id)
|
||||
// ->orWhere('student_id', $student_code)
|
||||
// ->first();
|
||||
|
||||
|
||||
// if (!$student) {
|
||||
// return redirect()->back()->with('error', 'Student details not found in database!');
|
||||
// }
|
||||
|
||||
// return view('StudentProfile', compact('student'));
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// public function showProfile(Request $request)
|
||||
// {
|
||||
|
||||
// $log_id = $request->session()->get('student_id');
|
||||
|
||||
// if (!$log_id) {
|
||||
// return redirect('/')->with('error', 'Please login first!');
|
||||
// }
|
||||
|
||||
|
||||
// $student = DB::table('student_details')
|
||||
// ->where('student_id', $log_id)
|
||||
// ->orWhere('student_portal_log_id', $log_id)
|
||||
// ->first();
|
||||
|
||||
|
||||
// if (!$student) {
|
||||
// $student = (object)[
|
||||
// 'image' => '',
|
||||
// 'full_name' => 'Data Not Found (Check DB)',
|
||||
// 'student_id' => $log_id,
|
||||
// 'nic_passport' => 'N/A',
|
||||
// 'date_of_birth' => '2000-01-01',
|
||||
// 'gender' => 'N/A',
|
||||
// 'email' => 'N/A',
|
||||
// 'phone' => 'N/A',
|
||||
// 'qualification' => 'N/A',
|
||||
// 'institute' => 'N/A',
|
||||
// 'year_completed' => 'N/A',
|
||||
// 'course_name' => 'N/A',
|
||||
// 'duration' => 'N/A',
|
||||
// 'current_semester' => 'N/A',
|
||||
// 'trainer_name' => 'N/A'
|
||||
// ];
|
||||
// }
|
||||
|
||||
// return view('StudentProfile', compact('student'));
|
||||
// }
|
||||
}
|
||||
|
|
@ -11,11 +11,7 @@ class studentportalnavController extends Controller
|
|||
{
|
||||
|
||||
$request->session()->forget(['student_log_id', 'student_id']);
|
||||
|
||||
|
||||
Auth::logout();
|
||||
|
||||
|
||||
$request->session()->invalidate();
|
||||
$request->session()->regenerateToken();
|
||||
|
||||
|
|
|
|||
|
|
@ -6,21 +6,19 @@
|
|||
|
||||
<!-- Bootstrap 5 -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
|
||||
<!-- Google Font -->
|
||||
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--theme-navy: #2D355B; /* Primary Navy */
|
||||
--theme-navy-dark: #1F2541; /* Dark Navy */
|
||||
--theme-red: #822424; /* Primary Accent Red */
|
||||
--theme-red-hover: #df2c3e; /* Red Hover */
|
||||
--theme-yellow: #FFEA85; /* Accent Yellow/Gold */
|
||||
--bg-light: #F6F6F6; /* Page Background */
|
||||
--theme-navy: #2D355B;
|
||||
--theme-navy-dark: #1F2541;
|
||||
--theme-red: #822424;
|
||||
--theme-red-hover: #df2c3e;
|
||||
--theme-yellow: #FFEA85;
|
||||
--bg-light: #F6F6F6;
|
||||
--white: #ffffff;
|
||||
}
|
||||
|
||||
|
|
@ -29,7 +27,6 @@ body {
|
|||
background: var(--bg-light);
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.feedback-header {
|
||||
background: linear-gradient(135deg, #2B293F 0%, #94A6F959 100%) !important;
|
||||
color: var(--white);
|
||||
|
|
@ -40,16 +37,6 @@ body {
|
|||
border-left: 5px solid var(--theme-red);
|
||||
}
|
||||
|
||||
.feedback-header h2 {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.feedback-header p {
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Cards */
|
||||
.feedback-card {
|
||||
background: var(--white);
|
||||
border: 1px solid #e2e8f0;
|
||||
|
|
@ -70,28 +57,19 @@ body {
|
|||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/* Form Controls */
|
||||
.form-label {
|
||||
font-weight: 600;
|
||||
color: var(--theme-navy);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.form-control,
|
||||
.form-select {
|
||||
.form-control, .form-select {
|
||||
border-radius: 10px;
|
||||
padding: 12px 15px;
|
||||
border: 1px solid #cbd5e1;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.form-control:focus,
|
||||
.form-select:focus {
|
||||
border-color: var(--theme-navy);
|
||||
box-shadow: 0 0 0 0.25rem rgba(45, 53, 91, 0.15);
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.submit-btn {
|
||||
background: var(--theme-red) !important;
|
||||
color: var(--white) !important;
|
||||
|
|
@ -108,7 +86,6 @@ body {
|
|||
color: var(--white) !important;
|
||||
}
|
||||
|
||||
/* History Card */
|
||||
.history-card {
|
||||
margin-top: 35px;
|
||||
background: var(--white);
|
||||
|
|
@ -124,11 +101,6 @@ body {
|
|||
padding: 18px 25px;
|
||||
}
|
||||
|
||||
.history-head h5 {
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.table th {
|
||||
background: #f8fafc;
|
||||
color: var(--theme-navy);
|
||||
|
|
@ -142,7 +114,6 @@ body {
|
|||
padding: 14px 20px;
|
||||
}
|
||||
|
||||
/* Status Badges */
|
||||
.badge-status {
|
||||
padding: 6px 14px;
|
||||
border-radius: 30px;
|
||||
|
|
@ -160,12 +131,6 @@ body {
|
|||
background: #d1e7dd;
|
||||
color: #0f5132;
|
||||
}
|
||||
|
||||
@media(max-width:768px) {
|
||||
.feedback-header, .feedback-card {
|
||||
padding: 25px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="container py-4">
|
||||
|
|
@ -176,7 +141,7 @@ body {
|
|||
<p>Share your suggestions, feedback, or complaints with the Automobile Engineering Academy management team.</p>
|
||||
</div>
|
||||
|
||||
<!-- Alert Messages (Validation & Success) -->
|
||||
<!-- Alert Messages -->
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success alert-dismissible fade show rounded-3 mb-4" role="alert">
|
||||
<i class="fas fa-check-circle me-2"></i>{{ session('success') }}
|
||||
|
|
@ -184,6 +149,13 @@ body {
|
|||
</div>
|
||||
@endif
|
||||
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger alert-dismissible fade show rounded-3 mb-4" role="alert">
|
||||
<i class="fas fa-exclamation-circle me-2"></i>{{ session('error') }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="alert alert-danger rounded-3 mb-4">
|
||||
<ul class="mb-0 ps-3">
|
||||
|
|
@ -238,7 +210,7 @@ body {
|
|||
|
||||
<form id="complaintForm" action="{{ route('feedback.store') }}" method="POST">
|
||||
@csrf
|
||||
<input type="hidden" name="is_complaint" value="1"> <!-- IF NEEDED FOR BACKEND -->
|
||||
<input type="hidden" name="is_complaint" value="1">
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label"> Complaint Category</label>
|
||||
|
|
@ -269,10 +241,10 @@ body {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Previous History Table -->
|
||||
<!-- Dynamic History Table -->
|
||||
<div class="history-card">
|
||||
<div class="history-head">
|
||||
<h5><i class="fas fa-history me-2" style="color: var(--theme-yellow);"></i> Previous Requests</h5>
|
||||
<h5 class="m-0"><i class="fas fa-history me-2" style="color: var(--theme-yellow);"></i> Previous Requests</h5>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
|
|
@ -287,18 +259,31 @@ body {
|
|||
</thead>
|
||||
|
||||
<tbody id="historyTableBody">
|
||||
@forelse ($feedbacks as $item)
|
||||
<tr>
|
||||
<td><span class="fw-semibold" style="color: var(--theme-navy);">Feedback</span></td>
|
||||
<td>Workshop Equipment </td>
|
||||
<td>10 July 2026</td>
|
||||
<td><span class="badge-status resolved"><i class="fas fa-check me-1"></i> Resolved</span></td>
|
||||
<td>
|
||||
<span class="fw-semibold" style="color: var(--theme-navy);">
|
||||
{{ $item->feedback_type }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ $item->subject }}</td>
|
||||
<td>{{ \Carbon\Carbon::parse($item->created_at)->format('d M Y') }}</td>
|
||||
<td>
|
||||
@if(strtolower($item->status) == 'resolved')
|
||||
<span class="badge-status resolved"><i class="fas fa-check me-1"></i> Resolved</span>
|
||||
@else
|
||||
<span class="badge-status pending"><i class="fas fa-clock me-1"></i> {{ $item->status ?? 'Pending' }}</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td><span class="fw-semibold" style="color: var(--theme-navy);">Complaint</span></td>
|
||||
<td>Class Schedule Issue </td>
|
||||
<td>05 July 2026 </td>
|
||||
<td><span class="badge-status pending"><i class="fas fa-clock me-1"></i> Pending </span></td>
|
||||
<td colspan="4" class="text-center py-4 text-muted">
|
||||
<i class="fas fa-inbox fa-2x mb-2 d-block"></i>
|
||||
No feedback or complaints submitted yet.
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -11,14 +11,13 @@
|
|||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
/* Global Root Variables based on Master Layout */
|
||||
:root {
|
||||
--theme-navy: #2D355B; /* Primary Dark Navy */
|
||||
--theme-footer-navy: #1F2541; /* Dark Navy for active/hover states */
|
||||
--theme-red: #822424; /* Primary Accent Red */
|
||||
--theme-red-hover: #df2c3e; /* Red Hover state */
|
||||
--theme-yellow: #FFEA85; /* Accent Yellow/Gold */
|
||||
--theme-bg: #F6F6F6; /* Light Background */
|
||||
--theme-navy: #2D355B;
|
||||
--theme-footer-navy: #1F2541;
|
||||
--theme-red: #822424;
|
||||
--theme-red-hover: #df2c3e;
|
||||
--theme-yellow: #FFEA85;
|
||||
--theme-bg: #F6F6F6;
|
||||
--sidebar-width: 260px;
|
||||
--text-dark: #333333;
|
||||
}
|
||||
|
|
@ -38,7 +37,6 @@
|
|||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
/* ---------- Sidebar Style ---------- */
|
||||
.sidebar {
|
||||
width: var(--sidebar-width);
|
||||
height: 100vh;
|
||||
|
|
@ -91,7 +89,6 @@
|
|||
text-align: center;
|
||||
}
|
||||
|
||||
/* Hover & Active states matched to Main Theme */
|
||||
.sidebar .nav-link:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
color: var(--theme-yellow) !important;
|
||||
|
|
@ -105,7 +102,6 @@
|
|||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* User Profile Section inside Sidebar */
|
||||
.sidebar-user-profile {
|
||||
padding: 15px 24px;
|
||||
border-top: 1px solid rgba(255,255,255,.15);
|
||||
|
|
@ -127,20 +123,6 @@
|
|||
color: var(--theme-yellow);
|
||||
}
|
||||
|
||||
/* Custom Theme Buttons */
|
||||
.btn-theme-register {
|
||||
background-color: var(--theme-red);
|
||||
color: white;
|
||||
border: 1px solid #ffffff;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.btn-theme-register:hover {
|
||||
background-color: var(--theme-red-hover);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* ---------- Main Content Layout ---------- */
|
||||
.main {
|
||||
margin-left: var(--sidebar-width);
|
||||
width: calc(100% - var(--sidebar-width));
|
||||
|
|
@ -150,7 +132,6 @@
|
|||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
/* Mobile Header Toggle Bar */
|
||||
.mobile-header {
|
||||
display: none;
|
||||
background: var(--theme-navy);
|
||||
|
|
@ -187,7 +168,6 @@
|
|||
color: #ffffff;
|
||||
}
|
||||
|
||||
/* Overlay Background when sidebar open on Mobile */
|
||||
.sidebar-overlay {
|
||||
display: none;
|
||||
position: fixed;
|
||||
|
|
@ -206,7 +186,6 @@
|
|||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Responsive Breakpoints */
|
||||
@media (max-width: 991px) {
|
||||
.sidebar {
|
||||
left: calc(-1 * var(--sidebar-width));
|
||||
|
|
@ -239,17 +218,16 @@
|
|||
<i class="fa-solid fa-car-side me-1"></i> AutoEdu Portal
|
||||
</div>
|
||||
|
||||
<!-- Mobile View User Profile Dropdown -->
|
||||
<div class="mobile-user-profile">
|
||||
@if(Auth::check())
|
||||
@if(session()->has('student_id'))
|
||||
<div class="dropdown">
|
||||
<a class="text-white text-decoration-none dropdown-toggle d-flex align-items-center gap-2" href="#" role="button" id="userMenuMobile" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fa-solid fa-circle-user" style="font-size: 26px; color: var(--theme-yellow);"></i>
|
||||
<span class="fw-semibold small">{{ Auth::user()->first_name }}</span>
|
||||
<span class="fw-semibold small">{{ session('student_name') }}</span>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-end shadow" aria-labelledby="userMenuMobile">
|
||||
<li>
|
||||
<a class="dropdown-item" href="/StudentProfile">
|
||||
<a class="dropdown-item" href="{{ route('StudentProfile') }}">
|
||||
<i class="fa-solid fa-user me-2"></i> Profile
|
||||
</a>
|
||||
</li>
|
||||
|
|
@ -262,12 +240,11 @@
|
|||
</ul>
|
||||
</div>
|
||||
@else
|
||||
<a href="/signin" class="btn btn-sm btn-outline-light"><i class="fa-solid fa-right-to-bracket me-1"></i> Sign In</a>
|
||||
<a href="/" class="btn btn-sm btn-outline-light"><i class="fa-solid fa-right-to-bracket me-1"></i> Sign In</a>
|
||||
@endif
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Overlay dim background element -->
|
||||
<div class="sidebar-overlay" id="sidebarOverlay"></div>
|
||||
|
||||
<!-- Sidebar Navigation -->
|
||||
|
|
@ -276,7 +253,6 @@
|
|||
<i class="fa-solid fa-car-side me-2"></i> AutoEdu
|
||||
</div>
|
||||
|
||||
<!-- Navigation Links -->
|
||||
<nav class="nav">
|
||||
<a href="/Dashboard" class="nav-link {{ request()->is('Dashboard*') ? 'active' : '' }}">
|
||||
<i class="fa-solid fa-gauge"></i> Dashboard
|
||||
|
|
@ -296,29 +272,22 @@
|
|||
<a href="/Feedback&Complain" class="nav-link {{ request()->is('Feedback&Complain*') ? 'active' : '' }}">
|
||||
<i class="fa-solid fa-comments"></i> Feedback & Complain
|
||||
</a>
|
||||
<!-- <a href="/StudentProfile" class="nav-link {{ request()->is('StudentProfile*') ? 'active' : '' }}">
|
||||
<i class="fa-solid fa-user"></i> Student Profile
|
||||
</a> -->
|
||||
<a href="{{ route('StudentProfile') }}" class="nav-link {{ request()->routeIs('StudentProfile') ? 'active' : '' }}">
|
||||
<i class="fa-solid fa-user"></i> Student Profile
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<!-- Sidebar User Profile (Desktop View Footer) -->
|
||||
<div class="sidebar-user-profile">
|
||||
@if(Auth::check())
|
||||
@php
|
||||
$displayName = Auth::user()->first_name . ' ' . Auth::user()->last_name;
|
||||
@endphp
|
||||
@if(session()->has('student_id'))
|
||||
<div class="dropdown dropup">
|
||||
<a class="user-dropdown-toggle dropdown-toggle" href="#" role="button" id="userMenuDesktop" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fa-solid fa-circle-user" style="font-size: 24px; color: var(--theme-yellow);"></i>
|
||||
<span class="text-truncate" style="max-width: 150px;">{{ $displayName }}</span>
|
||||
<span class="text-truncate" style="max-width: 150px;">{{ session('student_name') }}</span>
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu dropdown-menu-start shadow w-100" aria-labelledby="userMenuDesktop">
|
||||
<li>
|
||||
<a class="dropdown-item" href="/StudentProfile">
|
||||
<a class="dropdown-item" href="{{ route('StudentProfile') }}">
|
||||
<i class="fa-solid fa-user me-2"></i> Profile
|
||||
</a>
|
||||
</li>
|
||||
|
|
@ -332,24 +301,39 @@
|
|||
</div>
|
||||
@else
|
||||
<div class="d-flex gap-2">
|
||||
<a href="/signin" class="btn btn-outline-light btn-sm w-50">Sign In</a>
|
||||
<a href="/signup" class="btn btn-theme-register btn-sm w-50">Register</a>
|
||||
<a href="/" class="btn btn-outline-light btn-sm w-100">Sign In</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<!-- Main Content Area -->
|
||||
<main class="main">
|
||||
@yield('content')
|
||||
</main>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
|
||||
<script>
|
||||
// Sidebar Toggle Logic
|
||||
const toggleBtn = document.getElementById('toggleBtn');
|
||||
const sidebar = document.getElementById('sidebar');
|
||||
const overlay = document.getElementById('sidebarOverlay');
|
||||
|
||||
if(toggleBtn) {
|
||||
toggleBtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('show');
|
||||
overlay.classList.toggle('show');
|
||||
});
|
||||
}
|
||||
|
||||
if(overlay) {
|
||||
overlay.addEventListener('click', () => {
|
||||
sidebar.classList.remove('show');
|
||||
overlay.classList.remove('show');
|
||||
});
|
||||
}
|
||||
|
||||
// Logout Logic
|
||||
function submitLogout() {
|
||||
const tokenEl = document.querySelector('meta[name="csrf-token"]');
|
||||
|
||||
|
|
@ -364,8 +348,7 @@ function submitLogout() {
|
|||
.then(res => res.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
|
||||
window.location.href = '/signin';
|
||||
window.location.href = '/';
|
||||
} else {
|
||||
alert('Logout failed. Please try again.');
|
||||
}
|
||||
|
|
@ -376,54 +359,5 @@ function submitLogout() {
|
|||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- <script>
|
||||
// Sidebar Toggle Logic
|
||||
const toggleBtn = document.getElementById('toggleBtn');
|
||||
const sidebar = document.getElementById('sidebar');
|
||||
const overlay = document.getElementById('sidebarOverlay');
|
||||
|
||||
toggleBtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('show');
|
||||
overlay.classList.toggle('show');
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', () => {
|
||||
sidebar.classList.remove('show');
|
||||
overlay.classList.remove('show');
|
||||
});
|
||||
|
||||
// Dynamic Logout Logic
|
||||
function submitLogout() {
|
||||
const tokenEl = document.querySelector('meta[name="csrf-token"]');
|
||||
|
||||
fetch('/studentlogout', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
'X-CSRF-TOKEN': tokenEl ? tokenEl.getAttribute('content') : ''
|
||||
}
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) {
|
||||
return res.text().then(text => { throw new Error(text) });
|
||||
}
|
||||
return res.json();
|
||||
})
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
alert('Logged out successfully!');
|
||||
window.location.href = '/students';
|
||||
} else {
|
||||
alert('Logout failed. Please try again.');
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Error:', err);
|
||||
alert('Server side error occurred during logout.');
|
||||
});
|
||||
}
|
||||
</script> -->
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -309,8 +309,8 @@ body {
|
|||
|
||||
.custom-feature-card:hover {
|
||||
transform: translateY(-5px);
|
||||
background: rgba(255, 255, 255, 0.07);
|
||||
border-color: rgba(255, 255, 255, 0.2);
|
||||
background: rgba(0, 0, 0, 0.07);
|
||||
border-color: rgb(255, 255, 255);
|
||||
}
|
||||
|
||||
.icon-box {
|
||||
|
|
|
|||
133
routes/web.php
133
routes/web.php
|
|
@ -6,15 +6,13 @@ use App\Http\Controllers\StudentPortalController;
|
|||
use App\Http\Controllers\ContactMsgController;
|
||||
use App\Http\Controllers\FeedbackController;
|
||||
use App\Http\Controllers\studentportalnavController;
|
||||
use App\Http\Controllers\auth\asswordController;
|
||||
use App\Http\Controllers\Auth\ForgotPasswordController;
|
||||
use App\Http\Controllers\coursesController;
|
||||
use App\Http\Controllers\ApplyController;
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Web Routes
|
||||
| Public Routes & General Pages
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
|
@ -24,85 +22,106 @@ Route::get('/', function () {
|
|||
});
|
||||
|
||||
Route::get('/courses', [coursesController::class, 'index'])->name('courses.index');
|
||||
Route::view('/students', 'students')->name('students');
|
||||
Route::view('/abouts', 'abouts')->name('abouts');
|
||||
Route::view('/contact', 'contacts')->name('contact');
|
||||
|
||||
// Guest Authentication View Routes
|
||||
Route::view('/signin', 'signin')->name('signin');
|
||||
Route::view('/signup', 'signup')->name('signup');
|
||||
|
||||
Route::middleware(['auth'])->group(function () {
|
||||
Route::get('/apply', [ApplyController::class, 'index'])->name('apply.index');
|
||||
Route::post('/apply', [ApplyController::class, 'store'])->name('apply.store');
|
||||
});
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| System Auth & Contact Routes (POST)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
Route::post('/signuppage', [AuthController::class, 'register']);
|
||||
Route::post('/signin', [AuthController::class, 'login']);
|
||||
Route::post('/custom-logout', [AuthController::class, 'logout']);
|
||||
|
||||
Route::post('/contact-submit', [ContactMsgController::class, 'store'])->name('contact.store');
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Routes (For Guest Users)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
Route::middleware('guest')->group(function () {
|
||||
|
||||
Route::get('/password/reset', [ForgotPasswordController::class, 'index'])->name('password.request');
|
||||
Route::post('/resetEmail', [ForgotPasswordController::class, 'resetEmail'])->name('password.email');
|
||||
Route::post('/verify-otp', [ForgotPasswordController::class, 'verifyOtpEmail'])->name('password.verify.otp');
|
||||
Route::post('/update-password', [ForgotPasswordController::class, 'updatePassword'])->name('password.update');
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Route::post('/studentlogout', [studentportalnavController::class, 'logout'])->name('student.logout');
|
||||
|
||||
Route::get('/StudentProfile', [StudentPortalController::class, 'showProfile'])->name('StudentProfile');
|
||||
|
||||
// Route::post('/studentlogout', [studentportalnavController::class, 'logout']);
|
||||
|
||||
Route::post('/feedback/store', [FeedbackController::class, 'feedback']) ->middleware('auth') ->name('feedback.store');
|
||||
|
||||
Route::post('/contact-submit', [ContactMsgController::class, 'store'])->name('contact.store');
|
||||
|
||||
Route::put('/profile/update', [AuthController::class, 'update'])->name('profile.update')->middleware('auth');
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Regular Auth Protected Routes (Laravel Default Auth)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
Route::middleware(['auth'])->group(function () {
|
||||
Route::get('/apply', [ApplyController::class, 'index'])->name('apply.index');
|
||||
Route::post('/apply', [ApplyController::class, 'store'])->name('apply.store');
|
||||
Route::put('/profile/update', [AuthController::class, 'update'])->name('profile.update');
|
||||
Route::get('/profile', [AuthController::class, 'profilview'])->name('profile.view');
|
||||
});
|
||||
|
||||
// Authentication Routes
|
||||
Route::post('/signuppage', [AuthController::class, 'register']);
|
||||
Route::post('/signin', [AuthController::class, 'login']);
|
||||
Route::post('/custom-logout', [AuthController::class, 'logout']);
|
||||
|
||||
|
||||
// --- STUDENT PORTAL SYSTEM ROUTES ---
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| STUDENT PORTAL ROUTES (Session-Based Auth)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
// Student Login & Logout Action Routes
|
||||
Route::post('/student-login', [StudentPortalController::class, 'studentlogin'])->name('student.login.submit');
|
||||
// Route::get('/student-login', [StudentPortalController::class, 'studentlogin'])->name('student.login.submit');
|
||||
|
||||
Route::post('/studentlogout', [StudentPortalController::class, 'studentlogout'])->name('student.logout');
|
||||
|
||||
// Student Portal Section (Protected by Student Session Check)
|
||||
Route::middleware(['web'])->group(function () {
|
||||
|
||||
// Main Portal Landing Page
|
||||
Route::get('/student-portal', function () {
|
||||
if (!session()->has('student_id')) {
|
||||
return redirect()->back()->with('error', 'Please login first!');
|
||||
return redirect('/signin')->with('error', 'Please login first!');
|
||||
}
|
||||
return view('StudentPortal');
|
||||
})->name('student.portal');
|
||||
|
||||
// Route::get('/student-logout', function () {
|
||||
// session()->forget('student_id');
|
||||
// return redirect()->to('/students')->with('success', 'Logged out successfully!');
|
||||
// })->name('student.logout');
|
||||
// Profile Page (DB Dynamic Data)
|
||||
Route::get('/StudentProfile', [StudentPortalController::class, 'showProfile'])->name('StudentProfile');
|
||||
|
||||
// Other Navigation Sub-pages
|
||||
Route::get('/Dashboard', function () {
|
||||
if (!session()->has('student_id')) { return redirect('/signin')->with('error', 'Please login first!'); }
|
||||
return view('StudentPortal');
|
||||
})->name('Dashboard');
|
||||
|
||||
Route::get('/mycourse', function () {
|
||||
if (!session()->has('student_id')) { return redirect('/signin')->with('error', 'Please login first!'); }
|
||||
return view('mycourse');
|
||||
})->name('mycourse');
|
||||
|
||||
Route::get('/timetable', function () {
|
||||
if (!session()->has('student_id')) { return redirect('/signin')->with('error', 'Please login first!'); }
|
||||
return view('timetable');
|
||||
})->name('timetable');
|
||||
|
||||
Route::get('/Assignments', function () {
|
||||
if (!session()->has('student_id')) { return redirect('/signin')->with('error', 'Please login first!'); }
|
||||
return view('Assignments');
|
||||
})->name('Assignments');
|
||||
|
||||
Route::get('/Studentguidelines', function () {
|
||||
if (!session()->has('student_id')) { return redirect('/signin')->with('error', 'Please login first!'); }
|
||||
return view('Studentguidelines');
|
||||
})->name('Studentguidelines');
|
||||
|
||||
Route::get('/results', function () {
|
||||
if (!session()->has('student_id')) { return redirect('/signin')->with('error', 'Please login first!'); }
|
||||
return view('results');
|
||||
})->name('results');
|
||||
|
||||
|
||||
Route::view('/apply', 'apply')->name('apply');
|
||||
// Route::view('/courses', 'courses')->name('courses');
|
||||
Route::view('/students', 'students')->name('students');
|
||||
Route::view('/abouts', 'abouts')->name('abouts');
|
||||
Route::view('/contact', 'contacts')->name('contact');
|
||||
Route::get('/Feedback&Complain', [FeedbackController::class, 'index'])->name('feedback.index');
|
||||
Route::post('/Feedback&Complain/store', [FeedbackController::class, 'store'])->name('feedback.store');
|
||||
|
||||
|
||||
Route::view('/signin', 'signin')->name('signin');
|
||||
Route::view('/signup', 'signup')->name('signup');
|
||||
|
||||
//student protal
|
||||
Route::view('/Dashboard','StudentPortal')->name('Dashboard');
|
||||
Route::view('/mycourse', 'mycourse')->name('mycourse');
|
||||
Route::view('/timetable','timetable')->name('timetable');
|
||||
Route::view('/Assignments','Assignments')->name('Assignments');
|
||||
Route::view('/Studentguidelines','Studentguidelines')->name('Studentguidelines');
|
||||
Route::view('/results','results')->name('results');
|
||||
Route::view('/Feedback&Complain','Feedback&Complain')->name('Feedback&Complain');
|
||||
// Route::view('/StudentProfile','StudentProfile')->name('StudentProfile');
|
||||
});
|
||||
Loading…
Reference in New Issue