add finish todos list
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
55
resources/js/components/toDos/ToDoFinish.tsx
Normal file
55
resources/js/components/toDos/ToDoFinish.tsx
Normal 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,
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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([
|
||||||
|
|||||||
Reference in New Issue
Block a user