diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 7ae3c93..52d27d4 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -2,7 +2,10 @@ namespace App\Http\Controllers; +use App\Http\Requests\Project\StoreProjectRequest; +use App\Http\Requests\Project\UpdateProjectRequest; use App\Models\Project; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use App\Models\User; @@ -39,18 +42,16 @@ class ProjectController extends Controller /** * Store a newly created project in storage. */ - public function store(Request $request) + public function store(StoreProjectRequest $request): RedirectResponse { $user = User::find(auth()->user()->id); - $data = $request->validate([ - 'name' => 'required|unique:projects|max:255', - 'description' => 'nullable|max:255', - ]); + $data = $request->validated(); $user->projects()->save(new Project($data)); - return redirect()->route('project.index'); + return redirect()->route('project.index') + ->with('info', 'Project created!'); } /** @@ -68,26 +69,25 @@ class ProjectController extends Controller */ public function edit(Project $project) { - // + return view('project.edit', [ + 'project' => $project, + ]); } /** * Update the specified Project in storage. */ - public function update(Request $request, Project $project) + public function update(UpdateProjectRequest $request, Project $project): RedirectResponse { $user = User::find(auth()->user()->id); $projects = $user->projects; $project = $projects->find($project->id); - $data = $request->validate([ - 'name' => 'required|unique:projects|max:255', - 'description' => 'nullable|max:255', - ]); + $data = $request->validated(); $project->update($data); - return back()->with('status', 'Project updated!'); + return back()->with('info', 'Project updated!'); } /** diff --git a/app/Http/Controllers/ProjectTodoController.php b/app/Http/Controllers/ProjectTodoController.php index a5c7234..202e808 100644 --- a/app/Http/Controllers/ProjectTodoController.php +++ b/app/Http/Controllers/ProjectTodoController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers; //use App\Http\Requests\StoreTodoRequest; //use App\Http\Requests\UpdateTodoRequest; +use App\Http\Requests\Project\StoreTodoRequest; +use App\Http\Requests\Project\UpdateTodoRequest; use App\Models\Todo; use App\Models\User; use Illuminate\Contracts\View\Factory; @@ -16,6 +18,7 @@ use Illuminate\Support\Carbon; class ProjectTodoController extends Controller { private string $timezone = 'Asia/Singapore'; + /** * Display a listing of all Todos for a Project. */ @@ -27,7 +30,7 @@ class ProjectTodoController extends Controller $todos = $project->todos; - return view('project.todo', [ + return view('todo.index', [ 'todos' => $todos->whereNull('completed_at')->values(), 'completed' => $todos->whereNotNull('completed_at')->values(), 'project' => $project, @@ -39,21 +42,15 @@ class ProjectTodoController extends Controller */ public function create(): Factory|View|Application { - return view('project.create'); + return view('todo.create'); } /** * Store a newly created Todo in storage. */ - public function store($project_id, Request $request) + public function store($project_id, StoreTodoRequest $request): RedirectResponse { - $validatedData = Request::validate([ - 'title' => 'required|max:255', - 'description' => 'nullable|max:255', - 'due_start' => 'nullable|date', - // due_end is not required, but if it is provided, it must be after due_start - 'due_end' => 'nullable|after:due_start', - ]); + $validatedData = $request->validated(); $due_end = match (true) { isset($validatedData['due_end']) => strtotime($validatedData['due_end']), @@ -93,7 +90,7 @@ class ProjectTodoController extends Controller $projects = $user->projects; $project = $projects->find($project_id); - return view('project.todo.show', compact('project', 'todo')); + return view('todo.show', compact('project', 'todo')); } /** @@ -105,14 +102,22 @@ class ProjectTodoController extends Controller $projects = $user->projects; $project = $projects->find($project_id); - return view('project.edit', compact('project', 'todo')); + // Check if the given todo is in the given project (Reverse find with todo's project_id) + if ($todo->project->id !== $project_id) + return back()->with('error', 'Todo not found in the given project'); + + return view('todo.edit', compact('project', 'todo')); } /** - * Update the specified resource in storage. + * Update Todo in storage based on the given project */ public function update($project_id, Request $request, Todo $todo) { + if ($todo->project->id !== $project_id) { + return back()->with('error', 'Todo not found in the given project'); + } + $data = Request::only(['title', 'description', 'due_start', 'due_end', 'completed_at']); if (Request::filled('completed_at')) { @@ -147,7 +152,7 @@ class ProjectTodoController extends Controller /** * Remove the specified resource from storage. */ - public function destroy($project_id, Todo $todo) + public function destroy($project_id, Todo $todo): RedirectResponse { $todo->delete(); diff --git a/app/Http/Requests/StoreTodoRequest.php b/app/Http/Requests/Project/StoreProjectRequest.php similarity index 55% rename from app/Http/Requests/StoreTodoRequest.php rename to app/Http/Requests/Project/StoreProjectRequest.php index 3891072..8b1fc08 100644 --- a/app/Http/Requests/StoreTodoRequest.php +++ b/app/Http/Requests/Project/StoreProjectRequest.php @@ -1,10 +1,11 @@ + * @return array */ public function rules(): array { return [ - // + 'name' => 'required|string|max:255', + 'description' => 'nullable|string|max:255', ]; } } diff --git a/app/Http/Requests/Project/StoreRequest.php b/app/Http/Requests/Project/StoreTodoRequest.php similarity index 79% rename from app/Http/Requests/Project/StoreRequest.php rename to app/Http/Requests/Project/StoreTodoRequest.php index 3b96f42..879a499 100644 --- a/app/Http/Requests/Project/StoreRequest.php +++ b/app/Http/Requests/Project/StoreTodoRequest.php @@ -2,9 +2,10 @@ namespace App\Http\Requests\Project; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; -class StoreRequest extends FormRequest +class StoreTodoRequest extends FormRequest { /** * Determine if the user is authorized to make this request. @@ -17,7 +18,7 @@ class StoreRequest extends FormRequest /** * Get the validation rules that apply to the request. * - * @return array + * @return array */ public function rules(): array { diff --git a/app/Http/Requests/UpdateTodoRequest.php b/app/Http/Requests/Project/UpdateProjectRequest.php similarity index 55% rename from app/Http/Requests/UpdateTodoRequest.php rename to app/Http/Requests/Project/UpdateProjectRequest.php index b9c2319..bb75516 100644 --- a/app/Http/Requests/UpdateTodoRequest.php +++ b/app/Http/Requests/Project/UpdateProjectRequest.php @@ -1,10 +1,11 @@ + * @return array */ public function rules(): array { return [ - // + 'name' => 'required|string|max:255', + 'description' => 'nullable|string|max:255', ]; } } diff --git a/app/Http/Requests/Project/UpdateRequest.php b/app/Http/Requests/Project/UpdateTodoRequest.php similarity index 92% rename from app/Http/Requests/Project/UpdateRequest.php rename to app/Http/Requests/Project/UpdateTodoRequest.php index cdaa88a..56b4c83 100644 --- a/app/Http/Requests/Project/UpdateRequest.php +++ b/app/Http/Requests/Project/UpdateTodoRequest.php @@ -5,7 +5,7 @@ namespace App\Http\Requests\Project; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; -class UpdateRequest extends FormRequest +class UpdateTodoRequest extends FormRequest { /** * Determine if the user is authorized to make this request. diff --git a/app/Models/Project.php b/app/Models/Project.php index ff98aa5..a8fd42c 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -16,6 +16,7 @@ class Project extends Model use HasFactory, UuidTrait; protected $dateFormat = 'U'; + protected $table = 'projects'; protected $fillable = [ 'name', diff --git a/app/Models/Todo.php b/app/Models/Todo.php index b856553..f7edc7b 100644 --- a/app/Models/Todo.php +++ b/app/Models/Todo.php @@ -15,6 +15,7 @@ class Todo extends Model use HasFactory, UuidTrait; protected $dateFormat = 'U'; + protected $table = 'todos'; protected $fillable = [ 'title', diff --git a/app/Models/User.php b/app/Models/User.php index c983ac4..b065d87 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -16,6 +16,9 @@ class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, UuidTrait; + protected $dateFormat = 'U'; + protected $table = 'users'; + /** * The attributes that are mass assignable. * diff --git a/resources/views/flashView/flashmessages.blade.php b/resources/views/flashView/flashmessages.blade.php new file mode 100644 index 0000000..d0f5669 --- /dev/null +++ b/resources/views/flashView/flashmessages.blade.php @@ -0,0 +1,43 @@ +@if ($message = Session::get('success')) +
+ {{ $message }} +
+@endif + + +@if ($message = Session::get('error')) +
+ {{ $message }} +
+@endif + + +@if ($message = Session::get('warning')) +
+ {{ $message }} +
+@endif + + +@if ($message = Session::get('info')) +
+ {{ $message }} +
+@endif + +@if ($message = Session::get('status')) +
+ {{ $message }} +
+@endif + +@if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ +@endif diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 9069c10..02de404 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -27,6 +27,9 @@ @endif + + @include('flashView.flashmessages') +
{{ $slot }} diff --git a/resources/views/project/edit.blade.php b/resources/views/project/edit.blade.php index bd9a4a4..b1c9ba3 100644 --- a/resources/views/project/edit.blade.php +++ b/resources/views/project/edit.blade.php @@ -1,26 +1,12 @@

- {{ __('Edit Todo') }} + {{ __('Edit Project') }}

- - @if(session('success')) -
- {{ session('success') }} -
- @endif - - @if(session('error')) -
- {{ session('error') }} -
- @endif -
-
+ @csrf @method('PUT')
@@ -28,10 +14,10 @@
- - Name + + value="{{ old('name', $project->name) }}"> @error('title')
{{ $message }} @@ -42,7 +28,7 @@
+ class="bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-700 focus:ring-2 focus:ring-blue-500 rounded-lg w-full p-4 @error('description') border-red-500 @enderror">{{ old('description', $project->description) }} @error('description')
{{ $message }} @@ -50,29 +36,6 @@ @enderror
-
-
- - - @error('due_start') -
- {{ $message }} -
- @enderror -
-
- - - @error('due_end') -
- {{ $message }} -
- @enderror -
@@ -115,7 +78,7 @@
- @csrf @method('DELETE') @@ -123,7 +86,7 @@