diff --git a/app/Http/Controllers/ActivitiesOrganisedController.php b/app/Http/Controllers/ActivitiesOrganisedController.php new file mode 100644 index 0000000..b45d4e4 --- /dev/null +++ b/app/Http/Controllers/ActivitiesOrganisedController.php @@ -0,0 +1,190 @@ +validate([ + 'title' => 'required|string', + 'resource_person_name' => 'required|string', + 'resource_person_organization' => 'required|string', + 'target_audience' => 'required|string', + 'number_of_participants' => 'required|integer', + 'objective' => 'required|string', + 'outcomes' => 'required|string', + 'venue' => 'required|string', + 'start_date' => 'required|date', + 'start_time' => 'required|date_format:H:i', + 'end_date' => 'required|date', + 'end_time' => 'required|date_format:H:i', + 'num_days' => 'required|integer', + 'activity_type' => 'required|string', + 'category' => 'required|string', + 'level' => 'required|string', + 'proof' => 'nullable|mimes:jpg,jpeg,png,pdf,doc,docx,zip', + ]); + + // Combine start date and time + $startDateTime = date('Y-m-d H:i:s', strtotime("{$validated['start_date']} {$validated['start_time']}")); + $endDateTime = date('Y-m-d H:i:s', strtotime("{$validated['end_date']} {$validated['end_time']}")); + + // Handle the file upload if a new file is provided + if ($request->hasFile('proof')) { + // Delete old file if exists + if ($response->proof && Storage::disk('public')->exists($response->proof)) { + Storage::disk('public')->delete($response->proof); + } + + // Extract year from start_date + $year = date('Y', strtotime($validated['start_date'])); + $username = $response->user->name; + + $originalName = $request->file('proof')->getClientOriginalName(); + $fileName = $username . '_' . $originalName; + + // Create path structure: year/faculty_name + $folderPath = 'proofs/' . $year . '/' . $username; + + // Store file in the specified path + $proofPath = $request->file('proof')->storeAs($folderPath, $fileName, 'public'); + + $response->proof = $proofPath; + } + + // Update other fields + $response->title = $validated['title']; + $response->resource_person_name = $validated['resource_person_name']; + $response->resource_person_organization = $validated['resource_person_organization']; + $response->target_audience = $validated['target_audience']; + $response->number_of_participants = $validated['number_of_participants']; + $response->objective = $validated['objective']; + $response->outcomes = $validated['outcomes']; + $response->venue = $validated['venue']; + $response->start_date = $startDateTime; + $response->end_date = $endDateTime; + $response->num_days = $validated['num_days']; + $response->activity_type = $validated['activity_type']; + $response->category = $validated['category']; + $response->level = $validated['level']; + + $response->save(); + + $userRole = auth()->user()->role->name; + + if ($userRole === 'Admin') { + return redirect()->route('admin.ActivitiesOrganisedResponses') + ->with('status', 'Response updated successfully'); + } elseif ($userRole === 'Coordinator') { + return redirect()->route('coordinator.ActivitiesOrganisedResponses') + ->with('status', 'Response updated successfully'); + } else { + // For regular users + return redirect()->route('faculty.ActivitiesOrganisedResponses') + ->with('status', 'Response updated successfully'); + } + } + + public function destroy($id) + { + $response = ActivitiesOrganised::findOrFail($id); + + // Delete the file if it exists + if ($response->proof && Storage::disk('public')->exists($response->proof)) { + Storage::disk('public')->delete($response->proof); + } + + $response->delete(); + + return response()->json(['success' => 'Record deleted successfully']); + } + + public function getActivitiesOrganisedResponses() + { + $user = auth()->user(); + $isAdmin = $user->role->name === 'Admin'; + $isCoordinator = $user->role->name === 'Coordinator'; + + // Query based on role + if ($isAdmin) { + // Admin sees all records + $responses = ActivitiesOrganised::with('user', 'department'); + } elseif ($isCoordinator) { + // Coordinator sees only their department's records + $responses = ActivitiesOrganised::with('user', 'department') + ->whereHas('user', function ($query) use ($user) { + $query->where('department_id', $user->department_id); + }); + } else { + // Regular users see only their own records + $responses = ActivitiesOrganised::with('user', 'department') + ->where('faculty_id', $user->id); + } + + return DataTables::of($responses) + ->addColumn('user_name', function ($response) { + return $response->user->name ?? 'Unknown'; + }) + ->addColumn('department_name', function ($response) { + return $response->department->name ?? 'Unknown'; + }) + ->addColumn('start_date', function ($response) { + return \Carbon\Carbon::parse($response->start_date)->format('d-m-Y'); + }) + ->addColumn('start_time', function ($response) { + return \Carbon\Carbon::parse($response->start_date)->format('h:i A'); + }) + ->addColumn('end_date', function ($response) { + return \Carbon\Carbon::parse($response->end_date)->format('d-m-Y'); + }) + ->addColumn('end_time', function ($response) { + return \Carbon\Carbon::parse($response->end_date)->format('h:i A'); + }) + ->addColumn('action', function ($response) { + $actions = []; + + // View proof button for everyone + if ($response->proof) { + $actions[] = 'View'; + } else { + $actions[] = 'No Proof'; + } + + // Edit button with role-appropriate route + $userRole = auth()->user()->role->name; + // Determine the appropriate route based on user role + if ($userRole === 'Admin') { + $editRoute = route('admin.ActivitiesOrganised.edit', $response->id); + } elseif ($userRole === 'Coordinator') { + $editRoute = route('coordinator.ActivitiesOrganised.edit', $response->id); + } else { + $editRoute = route('faculty.ActivitiesOrganised.edit', $response->id); + } + + $actions[] = 'Edit'; + + $deleteRoute = route('activitiesOrganised.destroy', $response->id); + $actions[] = ''; + + return implode(' ', $actions); + }) + ->rawColumns(['action']) + ->make(true); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 9fcccb9..efccd2c 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -22,5 +22,9 @@ class AdminController extends Controller { return view('activities-attended.index'); } + public function viewActivitiesOrganisedResponses() + { + return view('activities-organised.index'); + } } diff --git a/app/Http/Controllers/CoordinatorController.php b/app/Http/Controllers/CoordinatorController.php index b88ccb9..41c0884 100644 --- a/app/Http/Controllers/CoordinatorController.php +++ b/app/Http/Controllers/CoordinatorController.php @@ -20,5 +20,10 @@ class CoordinatorController extends Controller { return view('activities-attended.index'); } + + public function viewActivitiesOrganisedResponses() + { + return view('activities-organised.index'); + } } diff --git a/app/Http/Controllers/FacultyController.php b/app/Http/Controllers/FacultyController.php index 4a1ae6f..b3f053b 100644 --- a/app/Http/Controllers/FacultyController.php +++ b/app/Http/Controllers/FacultyController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\ActivitiesAttended; +use App\Models\ActivitiesOrganised; class FacultyController extends Controller { @@ -24,6 +25,16 @@ class FacultyController extends Controller { return view('activities-attended.index'); } + public function ActivitiesOrganisedForm() + { + // Logic to show the response form + return view('faculty.activities-organised-form'); + } + + public function viewActivitiesOrganisedResponses() + { + return view('activities-organised.index'); + } public function ActivitiesAttendedFormResponse(Request $request) { @@ -94,4 +105,77 @@ class FacultyController extends Controller return back()->withErrors('An error occurred while submitting your response: ' . $e->getMessage()); } } + + public function ActivitiesOrganisedFormResponse(Request $request) +{ + try { + // Validate the request data + $validated = $request->validate([ + 'title' => 'required|string', + 'resource_person_name' => 'required|string', + 'resource_person_organization' => 'required|string', + 'target_audience' => 'required|string', + 'number_of_participants' => 'required|integer', + 'objective' => 'required|string', + 'outcomes' => 'required|string', + 'venue' => 'required|string', + 'start_date' => 'required|date', + 'start_time' => 'required|date_format:H:i', + 'end_date' => 'required|date', + 'end_time' => 'required|date_format:H:i', + 'num_days' => 'required|integer', + 'activity_type' => 'required|string', + 'category' => 'required|string', + 'level' => 'required|string', + 'proof' => 'nullable|mimes:jpg,jpeg,png,pdf,doc,docx,zip', + ]); + + // Combine start date and time + $startDateTime = date('Y-m-d H:i:s', strtotime("{$validated['start_date']} {$validated['start_time']}")); + $endDateTime = date('Y-m-d H:i:s', strtotime("{$validated['end_date']} {$validated['end_time']}")); + + // Handle the file upload + $proofPath = null; + if ($request->hasFile('proof')) { + $originalName = $request->file('proof')->getClientOriginalName(); + $username = auth()->user()->name; + $fileName = $username . '_' . $originalName; + + // Extract year from start_date + $year = date('Y', strtotime($validated['start_date'])); + + // Create path structure: year/faculty_name + $folderPath = 'proofs/' . $year . '/' . $username; + + // Store file in the specified path + $proofPath = $request->file('proof')->storeAs($folderPath, $fileName, 'public'); + } + + // Save the response to the database + ActivitiesOrganised::create([ + 'title' => $validated['title'], + 'resource_person_name' => $validated['resource_person_name'], + 'resource_person_organization' => $validated['resource_person_organization'], + 'target_audience' => $validated['target_audience'], + 'number_of_participants' => $validated['number_of_participants'], + 'objective' => $validated['objective'], + 'outcomes' => $validated['outcomes'], + 'department_id' => auth()->user()->department->id, + 'faculty_id' => auth()->user()->id, + 'venue' => $validated['venue'], + 'start_date' => $startDateTime, + 'end_date' => $endDateTime, + 'num_days' => $validated['num_days'], + 'activity_type' => $validated['activity_type'], + 'category' => $validated['category'], + 'level' => $validated['level'], + 'proof' => $proofPath, + ]); + + return redirect()->route('faculty.dashboard')->with('status', 'Response submitted successfully'); + } catch (\Exception $e) { + // Handle the exception and provide an error message + return back()->withErrors('An error occurred while submitting your response: ' . $e->getMessage()); + } +} } diff --git a/app/Models/ActivitiesOrganised.php b/app/Models/ActivitiesOrganised.php new file mode 100644 index 0000000..f6b0098 --- /dev/null +++ b/app/Models/ActivitiesOrganised.php @@ -0,0 +1,56 @@ + 'datetime', + 'end_date' => 'datetime', + 'number_of_participants' => 'integer', + 'num_days' => 'integer' + ]; + + /** + * Get the department that owns the activity. + */ + public function department() + { + return $this->belongsTo(Department::class); + } + + /** + * Get the faculty user that owns the activity. + */ + public function user() + { + return $this->belongsTo(User::class, 'faculty_id'); + } +} \ No newline at end of file diff --git a/database/migrations/2025_03_23_192054_create_activities_organiseds.php b/database/migrations/2025_03_23_192054_create_activities_organiseds.php new file mode 100644 index 0000000..d6e881b --- /dev/null +++ b/database/migrations/2025_03_23_192054_create_activities_organiseds.php @@ -0,0 +1,46 @@ +id(); + $table->string('title'); + $table->string('resource_person_name'); + $table->text('resource_person_organization'); + $table->string('target_audience'); + $table->integer('number_of_participants'); + $table->text('objective'); + $table->text('outcomes'); + $table->unsignedBigInteger('department_id'); + $table->unsignedBigInteger('faculty_id'); // assuming faculty_id refers to user_id + $table->dateTime('start_date'); + $table->dateTime('end_date'); + $table->integer('num_days'); + $table->string('venue'); + $table->string('activity_type'); + $table->string('category'); + $table->string('level'); + $table->string('proof')->nullable(); // For file path + $table->foreign('faculty_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('department_id')->references('id')->on('departments')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('activities_organiseds'); + } +}; diff --git a/resources/views/activities-attended/index.blade.php b/resources/views/activities-attended/index.blade.php index 84463e7..885aa3b 100644 --- a/resources/views/activities-attended/index.blade.php +++ b/resources/views/activities-attended/index.blade.php @@ -236,8 +236,7 @@ }); }; // Replace this event handler in your script - $('#responses-table').on('click', '.delete-btn', function() { - console.log("hsjda"); + $('#responses-table').on('click', '.delete-btn', function() { if (confirm('Are you sure you want to delete this record?')) { const id = $(this).data('id'); const url = $(this).data('url'); // Use the data-url attribute instead of hardcoded path diff --git a/resources/views/activities-organised/edit.blade.php b/resources/views/activities-organised/edit.blade.php new file mode 100644 index 0000000..9ee4805 --- /dev/null +++ b/resources/views/activities-organised/edit.blade.php @@ -0,0 +1,219 @@ +```blade +@extends('layouts.app') + +@section('content') +
+
+
+

+ Edit Activities Organised +

+
+ +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + @method('PUT') + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + @if ($response->proof) +
+ Current file: + View +
+ @endif + +

Upload new proof (JPG, JPEG, PNG, PDF, DOC, DOCX, ZIP)

+
+
+ +
+ + Cancel + + +
+
+
+
+
+@endsection + +@section('scripts') + +@endsection +``` \ No newline at end of file diff --git a/resources/views/activities-organised/index.blade.php b/resources/views/activities-organised/index.blade.php new file mode 100644 index 0000000..e5f92b4 --- /dev/null +++ b/resources/views/activities-organised/index.blade.php @@ -0,0 +1,234 @@ +@extends('layouts.app') + +@section('content') +
+
+
+

+ All Activities Organised +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
IDTitleResource PersonOrganisationTarget AudienceDepartmentFacultyStart DateEnd DateNum DaysVenueActivity TypeCategoryLevelParticipantsActions
+
+
+
+
+@endsection + +@section('scripts') + + + + + + + + + + + +@endsection \ No newline at end of file diff --git a/resources/views/faculty/activities-organised-form.blade.php b/resources/views/faculty/activities-organised-form.blade.php new file mode 100644 index 0000000..67bc648 --- /dev/null +++ b/resources/views/faculty/activities-organised-form.blade.php @@ -0,0 +1,176 @@ +@extends('layouts.app') + +@section('content') +
+
+
+

+ Submit Activities Organised +

+

+ Fill in the details of the activity you organised. +

+
+
+
+ @csrf +
+
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ +
+ + +
+ + +
+ + +

Accepted formats: JPG, JPEG, PNG, PDF, DOC, DOCX, ZIP

+
+
+
+ + +
+ +
+ +
+
+
+
+ + +@endsection \ No newline at end of file diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 5e21df4..93599f6 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -21,14 +21,23 @@ {{ __('Activities Attended') }} - @elseif(auth()->user()->role->name === 'Coordinator') + + {{ __('Activities Organised') }} + + @elseif(auth()->user()->role->name === 'Coordinator') {{ __('Activities Attended') }} - @elseif(auth()->user()->role->name === 'Faculty') + + {{ __('Activities Organised') }} + + @elseif(auth()->user()->role->name === 'Faculty') {{ __('Activities Attended') }} + + {{ __('Activities Organised') }} + @endif diff --git a/routes/web.php b/routes/web.php index ed52f14..175503f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,6 +1,7 @@ group(function () { Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); }); +// Activities Attended common routes Route::delete('/activities-attended/{id}', [ActivitiesAttendedController::class, 'destroy'])->name('activitiesAttended.destroy'); + +// Activities Organised common routes +Route::delete('/activities-organised/{id}', [ActivitiesOrganisedController::class, 'destroy'])->name('activitiesOrganised.destroy'); + // Admin routes Route::middleware(['auth', CheckRole::class . ':Admin'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.dashboard'); + + // Activities Attended Routes Route::get('/admin/ActivitiesAttendedResponses', [AdminController::class, 'viewActivitiesAttendedResponses'])->name('admin.ActivitiesAttendedResponses'); Route::get('/admin/ActivitiesAttendedResponses/data', [ActivitiesAttendedController::class, 'getActivitiesAttendedResponses'])->name('admin.ActivitiesAttendedResponses.data'); - // In your routes file (web.php) - // Route::get('/admin/activities-attended/{id}/edit', 'Admin\ActivitiesAttendedController@edit')->name('admin.ActivitiesAttended.edit'); - // Route::put('/admin/activities-attended/{id}', 'Admin\ActivitiesAttendedController@update')->name('admin.ActivitiesAttended.update'); - // Route::delete('/admin/activities-attended/{id}', 'Admin\ActivitiesAttendedController@destroy')->name('admin.ActivitiesAttended.destroy'); Route::get('/admin/activities-attended/{id}/edit', [ActivitiesAttendedController::class, 'edit'])->name('admin.ActivitiesAttended.edit'); Route::put('/admin/activities-attended/{id}', [ActivitiesAttendedController::class, 'update'])->name('admin.ActivitiesAttended.update'); Route::delete('/admin/activities-attended/{id}', [ActivitiesAttendedController::class, 'destroy'])->name('admin.ActivitiesAttended.destroy'); + + // Activities Organised Routes + Route::get('/admin/ActivitiesOrganisedResponses', [AdminController::class, 'viewActivitiesOrganisedResponses'])->name('admin.ActivitiesOrganisedResponses'); + Route::get('/admin/ActivitiesOrganisedResponses/data', [ActivitiesOrganisedController::class, 'getActivitiesOrganisedResponses'])->name('admin.ActivitiesOrganisedResponses.data'); + Route::get('/admin/activities-organised/{id}/edit', [ActivitiesOrganisedController::class, 'edit'])->name('admin.ActivitiesOrganised.edit'); + Route::put('/admin/activities-organised/{id}', [ActivitiesOrganisedController::class, 'update'])->name('admin.ActivitiesOrganised.update'); + Route::delete('/admin/activities-organised/{id}', [ActivitiesOrganisedController::class, 'destroy'])->name('admin.ActivitiesOrganised.destroy'); }); // Coordinator routes Route::middleware(['auth', CheckRole::class . ':Coordinator'])->group(function () { Route::get('/coordinator', [CoordinatorController::class, 'index'])->name('coordinator.dashboard'); + + // Activities Attended Routes Route::get('/coordinator/ActivitiesAttendedResponses', [CoordinatorController::class, 'viewActivitiesAttendedResponses'])->name('coordinator.ActivitiesAttendedResponses'); Route::get('/coordinator/ActivitiesAttendedResponses/data', [ActivitiesAttendedController::class, 'getActivitiesAttendedResponses'])->name('coordinator.ActivitiesAttendedResponses.data'); Route::get('/coordinator/activities-attended/{id}/edit', [ActivitiesAttendedController::class, 'edit'])->name('coordinator.ActivitiesAttended.edit'); Route::put('/coordinator/activities-attended/{id}', [ActivitiesAttendedController::class, 'update'])->name('coordinator.ActivitiesAttended.update'); Route::delete('/coordinator/activities-attended/{id}', [ActivitiesAttendedController::class, 'destroy'])->name('coordinator.ActivitiesAttended.destroy'); + + // Activities Organised Routes + Route::get('/coordinator/ActivitiesOrganisedResponses', [CoordinatorController::class, 'viewActivitiesOrganisedResponses'])->name('coordinator.ActivitiesOrganisedResponses'); + Route::get('/coordinator/ActivitiesOrganisedResponses/data', [ActivitiesOrganisedController::class, 'getActivitiesOrganisedResponses'])->name('coordinator.ActivitiesOrganisedResponses.data'); + Route::get('/coordinator/activities-organised/{id}/edit', [ActivitiesOrganisedController::class, 'edit'])->name('coordinator.ActivitiesOrganised.edit'); + Route::put('/coordinator/activities-organised/{id}', [ActivitiesOrganisedController::class, 'update'])->name('coordinator.ActivitiesOrganised.update'); + Route::delete('/coordinator/activities-organised/{id}', [ActivitiesOrganisedController::class, 'destroy'])->name('coordinator.ActivitiesOrganised.destroy'); }); - // Faculty routes Route::middleware(['auth', CheckRole::class . ':Faculty'])->group(function () { Route::get('/faculty', [FacultyController::class, 'index'])->name('faculty.dashboard'); + + // Activities Attended Routes Route::get('/faculty/ActivitiesAttendedForm', [FacultyController::class, 'ActivitiesAttendedForm'])->name('faculty.ActivitiesAttendedForm'); Route::post('/faculty/ActivitiesAttendedFormResponse', [FacultyController::class, 'ActivitiesAttendedFormResponse'])->name('faculty.ActivitiesAttendedFormResponse'); Route::get('/faculty/ActivitiesAttendedResponses', [FacultyController::class, 'viewActivitiesAttendedResponses'])->name('faculty.ActivitiesAttendedResponses'); Route::get('/faculty/ActivitiesAttendedResponses/data', [ActivitiesAttendedController::class, 'getActivitiesAttendedResponses'])->name('faculty.ActivitiesAttendedResponses.data'); Route::get('/faculty/activities-attended/{id}/edit', [ActivitiesAttendedController::class, 'edit'])->name('faculty.ActivitiesAttended.edit'); Route::put('/faculty/activities-attended/{id}', [ActivitiesAttendedController::class, 'update'])->name('faculty.ActivitiesAttended.update'); + + // Activities Organised Routes + Route::get('/faculty/ActivitiesOrganisedForm', [FacultyController::class, 'ActivitiesOrganisedForm'])->name('faculty.ActivitiesOrganisedForm'); + Route::post('/faculty/ActivitiesOrganisedFormResponse', [FacultyController::class, 'ActivitiesOrganisedFormResponse'])->name('faculty.ActivitiesOrganisedFormResponse'); + Route::get('/faculty/ActivitiesOrganisedResponses', [FacultyController::class, 'viewActivitiesOrganisedResponses'])->name('faculty.ActivitiesOrganisedResponses'); + Route::get('/faculty/ActivitiesOrganisedResponses/data', [ActivitiesOrganisedController::class, 'getActivitiesOrganisedResponses'])->name('faculty.ActivitiesOrganisedResponses.data'); + Route::get('/faculty/activities-organised/{id}/edit', [ActivitiesOrganisedController::class, 'edit'])->name('faculty.ActivitiesOrganised.edit'); + Route::put('/faculty/activities-organised/{id}', [ActivitiesOrganisedController::class, 'update'])->name('faculty.ActivitiesOrganised.update'); }); // API Resources @@ -81,4 +110,4 @@ Route::apiResources([ 'users' => UserController::class, ]); -require __DIR__ . '/auth.php'; +require __DIR__ . '/auth.php'; \ No newline at end of file