add finish todos list

This commit is contained in:
Romulus21
2024-02-15 21:38:05 +01:00
parent 04b8f7566c
commit 583d128bf8
9 changed files with 90 additions and 10 deletions

View File

@@ -77,9 +77,7 @@ class TimeTrackerController extends Controller
public function stopUserTimeTracker(Request $request) public function stopUserTimeTracker(Request $request)
{ {
$request->user()->currentTimeTracker()->update(['end_at' => now()]); $request->user()->stopCurrentTimeTracker();
$request->user()->time_tracker_id = null;
$request->user()->save();
return response()->json([], 204); return response()->json([], 204);
} }

View File

@@ -14,8 +14,9 @@ class ToDoController extends Controller
*/ */
public function index(Request $request) public function index(Request $request)
{ {
//dd($request->user()->toDos); $toDos = $request->user()->toDos()->whereNull('checked')->get();
return response()->json(ToDoResource::collection($request->user()->toDos));
return response()->json(ToDoResource::collection($toDos));
} }
/** /**
@@ -47,6 +48,10 @@ class ToDoController extends Controller
$data['checked'] = $request->input('checked') ? now() : null; $data['checked'] = $request->input('checked') ? now() : null;
$todo->update($data); $todo->update($data);
if ($request->user()->currentTimeTracker->to_do_id === $todo->id) {
$request->user()->stopCurrentTimeTracker();
}
return response()->json(new ToDoResource($todo)); return response()->json(new ToDoResource($todo));
} }
@@ -59,4 +64,14 @@ class ToDoController extends Controller
return response()->noContent(); return response()->noContent();
} }
public function finished(Request $request)
{
$toDos = $request->user()->toDos()
->whereNotNull('checked')
->orderBy('checked', 'desc')
->get();
return response()->json(ToDoResource::collection($toDos));
}
} }

View File

@@ -18,7 +18,7 @@ class ToDoResource extends JsonResource
'id' => $this->id, 'id' => $this->id,
'user_id' => $this->user_id, 'user_id' => $this->user_id,
'name' => $this->name, 'name' => $this->name,
'checked' => (boolean) $this->checked, 'checked' => $this->checked,
]; ];
} }
} }

View File

@@ -55,4 +55,11 @@ class User extends Authenticatable
{ {
return $this->hasMany(ToDo::class); return $this->hasMany(ToDo::class);
} }
public function stopCurrentTimeTracker(): void
{
$this->currentTimeTracker()->update(['end_at' => now()]);
$this->time_tracker_id = null;
$this->save();
}
} }

View File

@@ -0,0 +1,55 @@
import React, {FC, useEffect, useState} from "react"
import useAxiosTools from "../../hooks/AxiosTools";
import {toDo} from "../../utilities/types";
const ToDoFinish: FC<ToDoFinishProps> = ({reload}) => {
const [showTodos, setShowTodos] = useState(false)
const {loading, setLoading, errorCatch, errorLabel, axiosGet} = useAxiosTools(true)
const [toDos, setToDos] = useState<toDo[]>([])
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 <div>
<button className="flex justify-between w-full bg-blue-700 px-2 py-1 rounded cursor-pointer"
onClick={handleShow}>
<h2 className="inline">Tâches terminées</h2>
<span>Show</span>
</button>
{errorLabel()}
{showTodos && <ul className="list-disc ml-5">
{toDos.map(toDo => <li key={toDo.id}>{toDo.checked ? (new Date(toDo.checked)).toSmallFrDate() : ''} {toDo.name}</li>)}
</ul>}
</div>
}
export default ToDoFinish
interface ToDoFinishProps {
reload: Date|null,
}

View File

@@ -6,7 +6,7 @@ import useTracker from "../../hooks/TraskerHook";
import {Simulate} from "react-dom/test-utils"; import {Simulate} from "react-dom/test-utils";
import load = Simulate.load; import load = Simulate.load;
const ToDoIndex: FC<ToDoIndexProps> = ({reload}) => { const ToDoIndex: FC<ToDoIndexProps> = ({reload, setReload}) => {
const {loading, setLoading, errorCatch, errorLabel, axiosGet, axiosPut} = useAxiosTools(true) const {loading, setLoading, errorCatch, errorLabel, axiosGet, axiosPut} = useAxiosTools(true)
const [toDos, setToDos] = useState<toDo[]>([]) const [toDos, setToDos] = useState<toDo[]>([])
@@ -37,6 +37,7 @@ const ToDoIndex: FC<ToDoIndexProps> = ({reload}) => {
console.log(toDo) console.log(toDo)
try { try {
await axiosPut('api/todos/' + toDo.id, {checked: ! toDo.checked}) await axiosPut('api/todos/' + toDo.id, {checked: ! toDo.checked})
setReload(new Date())
await fetchToDos() await fetchToDos()
} catch (error) { } catch (error) {
errorCatch(error) errorCatch(error)
@@ -51,7 +52,7 @@ const ToDoIndex: FC<ToDoIndexProps> = ({reload}) => {
{toDos.map(toDo => <li key={toDo.id} className="flex gap-2"> {toDos.map(toDo => <li key={toDo.id} className="flex gap-2">
<span>Move</span> <span>Move</span>
<input type={"checkbox"} <input type={"checkbox"}
checked={toDo.checked} checked={!!toDo.checked}
onChange={() =>toggleCheck(toDo)} onChange={() =>toggleCheck(toDo)}
className=""/> className=""/>
<Link to={"/todos/" + toDo.id} <Link to={"/todos/" + toDo.id}
@@ -71,4 +72,5 @@ export default ToDoIndex
interface ToDoIndexProps { interface ToDoIndexProps {
reload: Date|null, reload: Date|null,
setReload: (date: Date) => void,
} }

View File

@@ -2,6 +2,7 @@ import React, {useState} from "react"
import useAuthUser from "../hooks/AuthUser"; import useAuthUser from "../hooks/AuthUser";
import ToDoStore from "../components/toDos/ToDoStore"; import ToDoStore from "../components/toDos/ToDoStore";
import ToDoIndex from "../components/toDos/ToDoIndex"; import ToDoIndex from "../components/toDos/ToDoIndex";
import ToDoFinish from "../components/toDos/ToDoFinish";
const Home = () => { const Home = () => {
@@ -12,7 +13,8 @@ const Home = () => {
{authUser && {authUser &&
<div className="px-5 pt-10"> <div className="px-5 pt-10">
<ToDoStore setReload={setReload} /> <ToDoStore setReload={setReload} />
<ToDoIndex reload={reload} /> <ToDoIndex reload={reload} setReload={setReload} />
<ToDoFinish reload={reload} />
</div> </div>
} }
</div> </div>

View File

@@ -2,7 +2,7 @@ export interface toDo {
id: number, id: number,
user_id: number, user_id: number,
name: string, name: string,
checked: boolean, checked: string|null,
description?: string, description?: string,
} }

View File

@@ -27,6 +27,7 @@ Route::middleware('auth:sanctum')->group(function () {
Route::get('/time-tracker/user', [TimeTrackerController::class, 'userTimeTracker'])->name('time-tracker.user'); 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/{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::delete('/time-tracker/user', [TimeTrackerController::class, 'stopUserTimeTracker'])->name('time-tracker.stop');
Route::apiResources([ Route::apiResources([