From 0420b37cc9a2a61bde55bd2e42b9184280ba6dd4 Mon Sep 17 00:00:00 2001 From: "Orace.A" Date: Thu, 27 Mar 2025 22:13:44 +0100 Subject: [PATCH] feat: add link to organization details in data-table --- src/app/admin/organizations/page.tsx | 303 +++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) diff --git a/src/app/admin/organizations/page.tsx b/src/app/admin/organizations/page.tsx index a5fc92e..8341444 100644 --- a/src/app/admin/organizations/page.tsx +++ b/src/app/admin/organizations/page.tsx @@ -1,4 +1,307 @@ +import { useState } from "react"; +import Image from "next/image"; +import { useSession } from "next-auth/react"; +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { ColumnDef } from "@tanstack/react-table"; +import axios from "axios"; +import { DropdownMenu } from "radix-ui"; +import FloatingLabelInput from "#/components/floatingLabelInput"; +import { Modal } from "#/components/modal"; +import Table from "#/components/table/table"; +import Form from "#/components/form/form"; +import { icons } from "#/assets/icons"; +import { adminSchema, companySchema } from "#/schema"; +import { Admin, Company } from "#/types"; +import Link from "next/link"; + +export default function Organizations() { + const { data: session, status } = useSession(); + const [open, setOpen] = useState(false); + const [openModal, setOpenModal] = useState(false); + const [openDeleteModal, setOpenDeleteModal] = useState(false); + const [openEditModal, setOpenEditModal] = useState(false); + const [selectedAdminId, setSelectedAdminId] = useState(null); + + const queryClient = useQueryClient(); + + const { + data: companies, + refetch, + isLoading, + } = useQuery({ + enabled: status === "authenticated", + queryKey: ["companies"], + queryFn: async () => { + try { + const response = await axios.get( + "https://private-docs-api.intside.co/companies", + { + headers: { + Authorization: `Bearer ${session?.user.access_token}`, + }, + } + ); + + if (response.data) { + return response.data.data as Company[]; + } + } catch (error) { + console.error(error); + } + }, + }); + + const { + data: users, + } = useQuery({ + enabled: status === "authenticated", + queryKey: ["organizations"], + queryFn: async () => { + try { + const response = await axios.get( + "https://private-docs-api.intside.co/users", + { + headers: { Authorization: `Bearer ${session?.user.access_token}` }, + } + ); + return response.data.data.map((user: Admin) => ({ + id: user.id, + name: `${user.first_name} ${user.last_name}`, + })); + } catch (error) { + console.error(error); + return []; + } + }, + }); + + const createMutation = useMutation({ + mutationFn: async (data: { + name: string; + description: string; + status: string; + is_premium: string; + owner: string; + }) => { + try { + const response = await axios.post( + "https://private-docs-api.intside.co/companies/", + data, + { headers: { Authorization: `Bearer ${session?.user.access_token}` } } + ); + + if (response.status === 200 || response.status === 201) { + console.log("ajout réussie !"); + setOpenModal(false); + } + } catch (error) { + console.error("Erreur lors de la création", error); + } + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["organizations"] }); + refetch(); + }, + }); + + const updateMutation = useMutation({ + mutationFn: async (data: { + id: string; + last_name: string; + first_name: string; + email: string; + }) => { + try { + const response = await axios.put( + `https://private-docs-api.intside.co/companies/${data.id}/`, + data, + { headers: { Authorization: `Bearer ${session?.user.access_token}` } } + ); + + if (response.status === 200 || response.status === 201) { + console.log("modification réussie !"); + setOpenEditModal(false); + } + } catch (error) { + console.error("Erreur lors de la mise à jour", error); + } + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["organizations"] }); + refetch(); + }, + }); + + const deleteMutation = useMutation({ + mutationFn: async (id: string) => { + try { + const response = await axios.delete( + `https://private-docs-api.intside.co/companies/${id}/`, + { + headers: { Authorization: `Bearer ${session?.user.access_token}` }, + } + ); + + if (response.status === 200 || response.status === 201) { + console.log("Suppresion réussie !"); + setOpenDeleteModal(false); + } + } catch (error) { + console.error("Erreur lors de la suppression", error); + } + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["organizations"] }); + refetch(); + }, + }); + + const bulkDeleteMutation = useMutation({ + mutationFn: async (ids: string[]) => { + try { + const deletePromises = ids.map((id) => + axios.delete(`https://private-docs-api.intside.co/companies/${id}/`, { + headers: { Authorization: `Bearer ${session?.user.access_token}` }, + }) + ); + await Promise.all(deletePromises); + } catch (error) { + console.error("Erreur lors de la suppression groupée", error); + } + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["organizations"] }); + refetch(); + }, + }); + + const columns: ColumnDef[] = [ + { + accessorKey: "name", + header: "Organisations", + cell: ({ row }) => { + const company = row.original; + return ( + +

{company.name}

+ + ); + }, + }, + { + accessorKey: "total_users", + header: "Utilisateurs", + }, + { + header: "Administrateurs", + cell: ({ row }) => { + const value = String(row.original.owner.first_name) + " " + String(row.original.owner.last_name) + const initials = String(row.original.owner.first_name[0]) + String(row.original.owner.last_name[0]) + return( +
+
+ {initials} +
+

{value}

+
+ ) + } + }, + { + accessorKey: "owner.email", + header: "Adresse e-mail" + }, + { + accessorKey: "status", + header: "Statut", + cell: ({ cell }) => { + const status = String(cell.getValue()) + return ( +

+ { + status === "active" ? "Actif" : + status === "inactive" ? "Inactif" : + status === "pending" ? "En attente" : + status === "blocked" ? "Bloquée" : + "" + } +

+ ) + } + }, + { + id: "delete", + cell: ({ row }) => { + const company = row.original; + return ( +
{ mutate(id) }} + > + + {/* Modal de suppression */} + { + if (!isOpen) { + setSelectedAdminId(null); + setOpenDeleteModal(false); + } + }} + trigger={ +
{ + setSelectedAdminId(company.id); + setOpenDeleteModal(true); + }} + > + Supprimer +
+ } + title="Supprimer une organisation" + content={ +
+

Voulez-vous vraiment supprimer cette organisation ?

+
+ + +
+
+ } + /> +
+ ) + } + } + ] export default function Organizations (){ return (