From 583d128bf870328da3f31b00f85e9e9f06278d2a Mon Sep 17 00:00:00 2001 From: Romulus21 Date: Thu, 15 Feb 2024 21:38:05 +0100 Subject: [PATCH] add finish todos list --- .../Controllers/TimeTrackerController.php | 4 +- app/Http/Controllers/ToDoController.php | 19 ++++++- app/Http/Resources/ToDoResource.php | 2 +- app/Models/User.php | 7 +++ resources/js/components/toDos/ToDoFinish.tsx | 55 +++++++++++++++++++ resources/js/components/toDos/ToDoIndex.tsx | 6 +- resources/js/pages/Home.tsx | 4 +- resources/js/utilities/types.ts | 2 +- routes/api.php | 1 + 9 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 resources/js/components/toDos/ToDoFinish.tsx diff --git a/app/Http/Controllers/TimeTrackerController.php b/app/Http/Controllers/TimeTrackerController.php index 0ae96d2..2ba55b6 100644 --- a/app/Http/Controllers/TimeTrackerController.php +++ b/app/Http/Controllers/TimeTrackerController.php @@ -77,9 +77,7 @@ class TimeTrackerController extends Controller public function stopUserTimeTracker(Request $request) { - $request->user()->currentTimeTracker()->update(['end_at' => now()]); - $request->user()->time_tracker_id = null; - $request->user()->save(); + $request->user()->stopCurrentTimeTracker(); return response()->json([], 204); } diff --git a/app/Http/Controllers/ToDoController.php b/app/Http/Controllers/ToDoController.php index bfed3df..d1a0596 100644 --- a/app/Http/Controllers/ToDoController.php +++ b/app/Http/Controllers/ToDoController.php @@ -14,8 +14,9 @@ class ToDoController extends Controller */ public function index(Request $request) { - //dd($request->user()->toDos); - return response()->json(ToDoResource::collection($request->user()->toDos)); + $toDos = $request->user()->toDos()->whereNull('checked')->get(); + + return response()->json(ToDoResource::collection($toDos)); } /** @@ -47,6 +48,10 @@ class ToDoController extends Controller $data['checked'] = $request->input('checked') ? now() : null; $todo->update($data); + if ($request->user()->currentTimeTracker->to_do_id === $todo->id) { + $request->user()->stopCurrentTimeTracker(); + } + return response()->json(new ToDoResource($todo)); } @@ -59,4 +64,14 @@ class ToDoController extends Controller return response()->noContent(); } + + public function finished(Request $request) + { + $toDos = $request->user()->toDos() + ->whereNotNull('checked') + ->orderBy('checked', 'desc') + ->get(); + + return response()->json(ToDoResource::collection($toDos)); + } } diff --git a/app/Http/Resources/ToDoResource.php b/app/Http/Resources/ToDoResource.php index d146f1f..df484c6 100644 --- a/app/Http/Resources/ToDoResource.php +++ b/app/Http/Resources/ToDoResource.php @@ -18,7 +18,7 @@ class ToDoResource extends JsonResource 'id' => $this->id, 'user_id' => $this->user_id, 'name' => $this->name, - 'checked' => (boolean) $this->checked, + 'checked' => $this->checked, ]; } } diff --git a/app/Models/User.php b/app/Models/User.php index 7f94580..d731b09 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -55,4 +55,11 @@ class User extends Authenticatable { return $this->hasMany(ToDo::class); } + + public function stopCurrentTimeTracker(): void + { + $this->currentTimeTracker()->update(['end_at' => now()]); + $this->time_tracker_id = null; + $this->save(); + } } diff --git a/resources/js/components/toDos/ToDoFinish.tsx b/resources/js/components/toDos/ToDoFinish.tsx new file mode 100644 index 0000000..96d8a0c --- /dev/null +++ b/resources/js/components/toDos/ToDoFinish.tsx @@ -0,0 +1,55 @@ +import React, {FC, useEffect, useState} from "react" +import useAxiosTools from "../../hooks/AxiosTools"; +import {toDo} from "../../utilities/types"; + +const ToDoFinish: FC = ({reload}) => { + + const [showTodos, setShowTodos] = useState(false) + const {loading, setLoading, errorCatch, errorLabel, axiosGet} = useAxiosTools(true) + const [toDos, setToDos] = useState([]) + + useEffect(() => { + if (showTodos) { + setLoading(true) + fetchFinishToDos() + } + }, [reload]) + + const handleShow = () => { + if (! showTodos) { + setLoading(true) + fetchFinishToDos() + } + setShowTodos(!showTodos) + } + + const fetchFinishToDos = async () => { + try { + const res = await axiosGet('api/todos/finished') + setToDos(res.data) + } catch (error) { + errorCatch(error) + } finally { + setLoading(false) + } + } + + return
+ + + {errorLabel()} + {showTodos &&
    + {toDos.map(toDo =>
  • {toDo.checked ? (new Date(toDo.checked)).toSmallFrDate() : ''} {toDo.name}
  • )} +
} +
+} + +export default ToDoFinish + +interface ToDoFinishProps { + reload: Date|null, +} diff --git a/resources/js/components/toDos/ToDoIndex.tsx b/resources/js/components/toDos/ToDoIndex.tsx index f08e8c6..7be590d 100644 --- a/resources/js/components/toDos/ToDoIndex.tsx +++ b/resources/js/components/toDos/ToDoIndex.tsx @@ -6,7 +6,7 @@ import useTracker from "../../hooks/TraskerHook"; import {Simulate} from "react-dom/test-utils"; import load = Simulate.load; -const ToDoIndex: FC = ({reload}) => { +const ToDoIndex: FC = ({reload, setReload}) => { const {loading, setLoading, errorCatch, errorLabel, axiosGet, axiosPut} = useAxiosTools(true) const [toDos, setToDos] = useState([]) @@ -37,6 +37,7 @@ const ToDoIndex: FC = ({reload}) => { console.log(toDo) try { await axiosPut('api/todos/' + toDo.id, {checked: ! toDo.checked}) + setReload(new Date()) await fetchToDos() } catch (error) { errorCatch(error) @@ -51,7 +52,7 @@ const ToDoIndex: FC = ({reload}) => { {toDos.map(toDo =>
  • Move toggleCheck(toDo)} className=""/> void, } diff --git a/resources/js/pages/Home.tsx b/resources/js/pages/Home.tsx index 2cb7e1c..2d3b890 100644 --- a/resources/js/pages/Home.tsx +++ b/resources/js/pages/Home.tsx @@ -2,6 +2,7 @@ import React, {useState} from "react" import useAuthUser from "../hooks/AuthUser"; import ToDoStore from "../components/toDos/ToDoStore"; import ToDoIndex from "../components/toDos/ToDoIndex"; +import ToDoFinish from "../components/toDos/ToDoFinish"; const Home = () => { @@ -12,7 +13,8 @@ const Home = () => { {authUser &&
    - + +
    } diff --git a/resources/js/utilities/types.ts b/resources/js/utilities/types.ts index f92073e..991f51f 100644 --- a/resources/js/utilities/types.ts +++ b/resources/js/utilities/types.ts @@ -2,7 +2,7 @@ export interface toDo { id: number, user_id: number, name: string, - checked: boolean, + checked: string|null, description?: string, } diff --git a/routes/api.php b/routes/api.php index 6f084bb..d22d858 100644 --- a/routes/api.php +++ b/routes/api.php @@ -27,6 +27,7 @@ Route::middleware('auth:sanctum')->group(function () { Route::get('/time-tracker/user', [TimeTrackerController::class, 'userTimeTracker'])->name('time-tracker.user'); Route::get('/todos/{toDo}/time-trackers', [TimeTrackerController::class, 'toDoTimeTrackers'])->name('todos.time-trackers'); + Route::get('/todos/finished', [ToDoController::class, 'finished'])->name('todos.finished'); Route::delete('/time-tracker/user', [TimeTrackerController::class, 'stopUserTimeTracker'])->name('time-tracker.stop'); Route::apiResources([