add loader

This commit is contained in:
Romulus21
2024-03-04 17:42:05 +01:00
parent 6609738650
commit 8fcf3dd680
3 changed files with 37 additions and 10 deletions

View File

@@ -29,6 +29,26 @@ export const EditSVG: FC<ComponentProps<any>> = (props) => SVGSkeleton({
...props ...props
}) })
export const LoaderSVG: FC<ComponentProps<any>> = (props) => SVGSkeleton({
viewBox: "0 0 38 38",
stroke: props.color ?? "#000",
paths: <g fill="none" fillRule="evenodd">
<g transform="translate(1 1)">
<circle strokeOpacity=".5" cx="18" cy="18" r="18"/>
<path d="M36 18c0-9.94-8.06-18-18-18">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="1s"
repeatCount="indefinite"/>
</path>
</g>
</g>,
...props
})
export const PauseSVG: FC<ComponentProps<any>> = (props) => SVGSkeleton({ export const PauseSVG: FC<ComponentProps<any>> = (props) => SVGSkeleton({
paths: <path d="M16 19q-.825 0-1.412-.587T14 17V7q0-.825.588-1.412T16 5q.825 0 1.413.588T18 7v10q0 .825-.587 1.413T16 19m-8 0q-.825 0-1.412-.587T6 17V7q0-.825.588-1.412T8 5q.825 0 1.413.588T10 7v10q0 .825-.587 1.413T8 19"/>, paths: <path d="M16 19q-.825 0-1.412-.587T14 17V7q0-.825.588-1.412T16 5q.825 0 1.413.588T18 7v10q0 .825-.587 1.413T16 19m-8 0q-.825 0-1.412-.587T6 17V7q0-.825.588-1.412T8 5q.825 0 1.413.588T10 7v10q0 .825-.587 1.413T8 19"/>,
...props ...props

View File

@@ -1,12 +1,12 @@
import React, {FC, useEffect, useState} from "react" import React, {FC, useEffect, useState} from "react"
import useAxiosTools from "../../hooks/AxiosTools" import useAxiosTools from "../../hooks/AxiosTools"
import {toDo} from "../../utilities/types" import {toDo} from "../../utilities/types"
import {PlaySVG} from "../SVG" import {LoaderSVG, PlaySVG} from "../SVG"
const ToDoFinish: FC<ToDoFinishProps> = ({reload}) => { const ToDoFinish: FC<ToDoFinishProps> = ({reload}) => {
const [showTodos, setShowTodos] = useState(false) const [showTodos, setShowTodos] = useState(false)
const {loading, setLoading, errorCatch, errorLabel, axiosGet} = useAxiosTools(true) const {loading, setLoading, errorCatch, errorLabel, axiosGet} = useAxiosTools()
const [toDos, setToDos] = useState<toDo[]>([]) const [toDos, setToDos] = useState<toDo[]>([])
useEffect(() => { useEffect(() => {
@@ -26,6 +26,7 @@ const ToDoFinish: FC<ToDoFinishProps> = ({reload}) => {
const fetchFinishToDos = async () => { const fetchFinishToDos = async () => {
try { try {
setLoading(true)
const res = await axiosGet('api/todos/finished') const res = await axiosGet('api/todos/finished')
setToDos(res.data) setToDos(res.data)
} catch (error) { } catch (error) {
@@ -38,18 +39,22 @@ const ToDoFinish: FC<ToDoFinishProps> = ({reload}) => {
return <div> return <div>
<button className="flex w-full cursor-pointer items-center justify-between rounded bg-blue-700 px-2 py-1" <button className="flex w-full cursor-pointer items-center justify-between rounded bg-blue-700 px-2 py-1"
onClick={handleShow}> onClick={handleShow}>
<h2 className="inline">Tâches terminées</h2> <h2 className="inline">
Tâches terminées
{loading && <LoaderSVG className="mb-px ml-2 inline h-5 stroke-white" />}
</h2>
<span><PlaySVG className={`w-4 transition ${showTodos ? 'rotate-90' : 'rotate-180'}`} /></span> <span><PlaySVG className={`w-4 transition ${showTodos ? 'rotate-90' : 'rotate-180'}`} /></span>
</button> </button>
{errorLabel()} {errorLabel()}
{showTodos && <ul className="m-2 list-disc"> {showTodos && <ul className="m-2 list-disc">
{toDos.map(toDo => <li key={toDo.id} className="flex gap-2"> {toDos.length === 0 && <li className="flex">Aucun contenu a disponible</li>}
<span>{toDo.checked ? (new Date(toDo.checked)).toSmallFrDate() : ''}</span> {toDos.map(toDo => <li key={toDo.id} className="flex gap-2">
<span className="flex-1">{toDo.name}</span> <span>{toDo.checked ? (new Date(toDo.checked)).toSmallFrDate() : ''}</span>
<span>{toDo.duration.durationify()}</span> <span className="flex-1">{toDo.name}</span>
<span>{toDo.duration.durationify()}</span>
</li>)} </li>)}
</ul>} </ul>}
</div> </div>
} }

View File

@@ -1,7 +1,7 @@
import React, {useEffect, useState} from "react" import React, {useEffect, useState} from "react"
import useAxiosTools from "../hooks/AxiosTools" import useAxiosTools from "../hooks/AxiosTools"
import {timeTracker} from "../utilities/types" import {timeTracker} from "../utilities/types"
import {EditSVG, PlaySVG} from "../components/SVG" import {EditSVG, LoaderSVG, PlaySVG} from "../components/SVG"
import useTracker from "../hooks/TraskerHook" import useTracker from "../hooks/TraskerHook"
import {Modal} from "../components/Modals" import {Modal} from "../components/Modals"
import TimeTrackerEdit from "../components/TimeTrackers/TimeTrackerEdit" import TimeTrackerEdit from "../components/TimeTrackers/TimeTrackerEdit"
@@ -38,6 +38,8 @@ const TimeTrackersIndex = () => {
return <div className="p-5"> return <div className="p-5">
{errorLabel()} {errorLabel()}
<ul> <ul>
{loading && <LoaderSVG className="mb-px ml-2 inline h-5 stroke-white" />}
{timeTrackers.length === 0 && <li className="flex">Aucun contenu a disponible</li>}
{timeTrackers.map(tracker => <li key={tracker.id} className="flex justify-between gap-5 odd:bg-blue-950"> {timeTrackers.map(tracker => <li key={tracker.id} className="flex justify-between gap-5 odd:bg-blue-950">
<span className="w-24 text-center">{tracker.start_at ? (new Date(tracker.start_at)).toSmallFrDate() : ''}</span> <span className="w-24 text-center">{tracker.start_at ? (new Date(tracker.start_at)).toSmallFrDate() : ''}</span>
<span className="w-24 text-center">{(new Date(tracker.end_at)).toSmallFrDate()}</span> <span className="w-24 text-center">{(new Date(tracker.end_at)).toSmallFrDate()}</span>