From 267ee23c6d3332d6e23afc8e92d8abe0e2995f45 Mon Sep 17 00:00:00 2001 From: Oussama El Benney Date: Thu, 4 Jul 2024 16:32:03 +0100 Subject: [PATCH 1/2] fixed minor issues and added user presence table to consult reservation --- .../BookedUsersTable.jsx | 43 ++++++++ .../consultation-reservations/page.jsx | 99 +++++++++++++++---- .../(dashboard)/projects/ProjectsFilter.jsx | 35 ++++--- src/app/(dashboard)/projects/page.jsx | 2 +- 4 files changed, 145 insertions(+), 34 deletions(-) create mode 100644 src/app/(dashboard)/consultation-reservations/BookedUsersTable.jsx diff --git a/src/app/(dashboard)/consultation-reservations/BookedUsersTable.jsx b/src/app/(dashboard)/consultation-reservations/BookedUsersTable.jsx new file mode 100644 index 0000000..f16e486 --- /dev/null +++ b/src/app/(dashboard)/consultation-reservations/BookedUsersTable.jsx @@ -0,0 +1,43 @@ +import React from 'react' +import EditIcon from "@/static/image/svg/edit.svg"; +import DeleteIcon from "@/static/image/svg/trash-bold.svg"; + + +const BookedUsersTable = ({bookedPlaces, presence}) => { + return ( + <> +
+ {presence && + } + {!presence && + } + + + + + + + + + + {bookedPlaces.filter((bookedPlace) => bookedPlace.presence === presence).map((bookedPlace, index) => ( + + + + + + ))} + +
NomPrénomProjet
{bookedPlace.first_name}{bookedPlace.last_name}{bookedPlace.project_name}
+
+ + ) +} + +export default BookedUsersTable \ No newline at end of file diff --git a/src/app/(dashboard)/consultation-reservations/page.jsx b/src/app/(dashboard)/consultation-reservations/page.jsx index 32ddab3..43f20d1 100644 --- a/src/app/(dashboard)/consultation-reservations/page.jsx +++ b/src/app/(dashboard)/consultation-reservations/page.jsx @@ -7,6 +7,8 @@ import Loader from '@/components/Loader/Loader' import {useNotification} from '@/context/NotificationContext' import ArrowUturnLeft from "@/static/image/svg/arrow-uturn-left.svg"; import SearchIcon from "@/static/image/svg/search.svg"; +import Select from "react-select"; +import BookedUsersTable from "@/app/(dashboard)/consultation-reservations/BookedUsersTable"; export const ReservationContext = React.createContext() @@ -23,6 +25,7 @@ const Reservation = () => { const [floors, setFloors] = useState([]) const [selectedZone, setSelectedZone] = useState({floorId: null, zoneId: null}) const [NameProjectFilter, setNameProjectFilter] = useState("") + useEffect(() => { const getPlan = async () => { try { @@ -45,7 +48,6 @@ const Reservation = () => { getPlan() }, []) - useEffect(() => { const getSyncData = async () => { const getProjectsData = async () => { @@ -83,7 +85,8 @@ const Reservation = () => { created_at: element.created_at, first_name: element.id_user.first_name, last_name: element.id_user.last_name, - role: element.id_user.role.name + role: element.id_user.role.name, + project_name: element.id_user.projects[0].nom }))) } else { console.log(errors) @@ -147,13 +150,14 @@ const Reservation = () => { console.log("day", dateSelected.day); setDate({day: dateSelected.day, week: dateSelected.weekMonthly, date: dateSelected.date}) // setSelectedEtage(null) - setSelectedZone({floorId: null, zoneId: null}) + // setSelectedZone({floorId: null, zoneId: null}) } else { setDate({day: null, week: null}) // setSelectedEtage(null) } } + const concernedZones = filteredProjectsData?.map((element) => element.zones.map((zone) => zone.id)).flatMap((element) => element) || [] const concernedFloors = floors?.filter((element) => element.zones.map((zone) => zone.id).some((element) => concernedZones.includes(element))).map(element => element.id) || [] const allPlaces = filteredProjectsData?.map((project) => project.zones.map((zone) => zone.places.map((place) => ({ @@ -193,6 +197,11 @@ const Reservation = () => { const selectedZoneData = floors.find((element) => element.id == selectedZone.floorId)?.zones.find((zone) => zone.id === selectedZone.zoneId) + const handleProjectChange = (selectedOption) => { + const selectedProjects = selectedOption.map((element) => element.value) + setFilteredProjectsData(projectsData.filter((element) => selectedProjects.includes(element.project_id))) + } + return ( <>
{

Recherche

-
- - setNameProjectFilter(event.target.value)} - type="text" name="name" id="name" - className="rounded-md px-3 w-full duration-150 delay-75 focus:ring ring-offset-1 ring-sushi-200 border h-10 border-neutral-300 outline-none"/> +
+ + { // event.target.value to int - setSelectedZone({floorId: parseInt(event.target.value), zoneId: null})}} + setSelectedZone({floorId: parseInt(event.target.value), zoneId: null}) + }} disabled={!(date.day && date.week) || isLoadingData} name="etage" id='etage' @@ -247,7 +306,10 @@ const Reservation = () => {
-
-
-
-
-
@@ -48,15 +59,7 @@ const ProjectsFilter = ({setFilter}) => {
diff --git a/src/app/(dashboard)/projects/page.jsx b/src/app/(dashboard)/projects/page.jsx index c6deb1d..d35d5bc 100644 --- a/src/app/(dashboard)/projects/page.jsx +++ b/src/app/(dashboard)/projects/page.jsx @@ -145,7 +145,7 @@ const Projects = () => { return ( <> - +
-- GitLab From 9ea9c58e0708262a6aa0114cc09eb97737ab5e37 Mon Sep 17 00:00:00 2001 From: Oussama El Benney Date: Fri, 5 Jul 2024 09:49:24 +0100 Subject: [PATCH 2/2] routing after login --- src/app/auth/login/page.jsx | 68 +++++++++++++++++++++---------------- src/middleware.js | 8 ++--- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/app/auth/login/page.jsx b/src/app/auth/login/page.jsx index 6ed5663..62afb33 100644 --- a/src/app/auth/login/page.jsx +++ b/src/app/auth/login/page.jsx @@ -1,10 +1,10 @@ 'use client'; -import { useState } from 'react'; +import {useState} from 'react'; import Link from 'next/link'; import Cookies from 'js-cookie'; -import { createSession } from "@/app/lib/session"; -import { useRouter } from 'next/navigation' +import {createSession} from "@/app/lib/session"; +import {useRouter} from 'next/navigation' import Loader from '@/components/Loader/Loader'; import UserIcon from "@/static/image/svg/perm_identity.svg"; import VisibilityIcon from "@/static/image/svg/visibility_off.svg"; @@ -35,7 +35,7 @@ const LoginPage = () => { headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ username, password }), + body: JSON.stringify({username, password}), }); const data = await response.json(); console.log(data) @@ -44,7 +44,12 @@ const LoginPage = () => { setMessages("Email ou mot de passe incorrect. Veuillez réessayer."); } else { await createSession(data); - router.push('/'); + // if role ='super-admin'or 'rh' role redirect to reporting + if (data.role === 'super-admin' || data.role === 'rh') { + router.push('/reporting') + } else { + router.push('/reservation'); + } } } catch (error) { setMessages('An error occurred'); @@ -53,43 +58,48 @@ const LoginPage = () => { return ( <>
-
+
{TeambookVertical}

Connectez-vous à notre plateforme

-

Vous n avez pas de compte ? Créer un compte

+

Vous n avez pas de compte ? Créer un compte +

- setUsername(e.target.value)} - /> - + setUsername(e.target.value)} + /> +
- setPassword(e.target.value)} - /> - + setPassword(e.target.value)} + /> +
-

Mot de passe oublié?

+

Mot de + passe oublié?

{messages && (

diff --git a/src/middleware.js b/src/middleware.js index c746b76..98b3441 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -28,10 +28,10 @@ export default async function middleware(req) { const hasPrivileges = userPrivileges.some(privilege => path.startsWith(`/${privilege}`)); console.log('hasPrivileges', hasPrivileges) - // if (isProtectedRoute && !hasPrivileges) { - // console.log('.') - // return NextResponse.redirect(new URL('/no-access', req.nextUrl)); - // } + if (isProtectedRoute && !hasPrivileges) { + console.log('.') + return NextResponse.redirect(new URL('/no-access', req.nextUrl)); + } // 7. Redirect to /dashboard if the user is authenticated if ( -- GitLab