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') +
| ID | +Title | +Resource Person | +Organisation | +Target Audience | +Department | +Faculty | +Start Date | +End Date | +Num Days | +Venue | +Activity Type | +Category | +Level | +Participants | +Actions | +
|---|
+ Fill in the details of the activity you organised. +
+