11import type { User } from "@prisma/client" ;
2+ import _ from "lodash" ;
23import Link from "next/link" ;
34import React from "react" ;
5+ import { MultiSelect } from "react-multi-select-component" ;
46import AddUser from "src/components/AddUtilisateur" ;
5- import { frenchDepartementName } from "src/lib/helpers" ;
6- import { createUser , removeUser } from "src/lib/queries" ;
7+ import { ALL_DEPARTEMENTS , frenchDepartementName } from "src/lib/helpers" ;
8+ import { createUser , removeUser , updateUser } from "src/lib/queries" ;
79import styles from "src/styles/commissions.module.scss" ;
810
911interface Props {
@@ -16,6 +18,36 @@ interface RowProps {
1618}
1719
1820const UserRow : React . FC < RowProps > = ( { user, deleteUser } ) => {
21+ const [ changeDep , setDepartementChange ] = React . useState < boolean > ( false ) ;
22+ const [ selected , setSelected ] = React . useState (
23+ user . departements . map ( ( departement ) => {
24+ return {
25+ key : departement ,
26+ label : frenchDepartementName ( departement ) ,
27+ value : departement ,
28+ } ;
29+ } )
30+ ) ;
31+ const [ newUser , changeUser ] = React . useState < User > ( user ) ;
32+ const [ mountedRef , setMountedRef ] = React . useState < boolean > ( false ) ;
33+
34+ React . useEffect ( ( ) => {
35+ changeUser ( {
36+ ...user ,
37+ departements : _ . map ( selected , "key" ) ,
38+ } ) ;
39+ } , [ selected ] ) ;
40+
41+ React . useEffect ( ( ) => {
42+ setMountedRef ( true ) ;
43+ } ) ;
44+
45+ React . useEffect ( ( ) => {
46+ if ( mountedRef && newUser . id ) {
47+ updateUser ( newUser ) ;
48+ }
49+ } , [ newUser ] ) ;
50+
1951 return (
2052 < div className = { `${ styles . rowUser } card` } >
2153 < div >
@@ -33,7 +65,44 @@ const UserRow: React.FC<RowProps> = ({ user, deleteUser }) => {
3365 < b > { user . role } </ b >
3466 </ div >
3567 < div >
36- < b > { user . departement ? frenchDepartementName ( user . departement ) : "" } </ b >
68+ { changeDep ? (
69+ < MultiSelect
70+ options = { ALL_DEPARTEMENTS . map ( ( u ) => ( {
71+ key : u ,
72+ label : frenchDepartementName ( u ) ,
73+ value : u ,
74+ } ) ) }
75+ value = { selected }
76+ hasSelectAll = { false }
77+ onChange = { ( value ) => {
78+ setSelected (
79+ value as React . SetStateAction <
80+ { key : string ; label : string ; value : string } [ ]
81+ >
82+ ) ;
83+ setDepartementChange ( ! changeDep ) ;
84+ } }
85+ labelledBy = "Département(s)"
86+ />
87+ ) : (
88+ < span >
89+ { newUser . departements . map ( ( departement ) => (
90+ < b key = { departement } >
91+ < li key = { departement } > { frenchDepartementName ( departement ) } </ li >
92+ </ b >
93+ ) ) }
94+ < br />
95+ { user . role === "MEMBRE" && (
96+ < button
97+ onClick = { ( ) => {
98+ setDepartementChange ( ! changeDep ) ;
99+ } }
100+ >
101+ Modifier
102+ </ button >
103+ ) }
104+ </ span >
105+ ) }
37106 </ div >
38107 < div >
39108 < Link href = { `/utilisateurs` } >
@@ -65,6 +134,8 @@ const Utilisateurs: React.FC<Props> = ({ allUsers }) => {
65134 e . preventDefault ( ) ;
66135 const user : User = {
67136 departement : formData . departement ,
137+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
138+ departements : formData . departements || [ "" ] ,
68139 email : formData . email ,
69140 emailVerified : new Date ( ) ,
70141 nom : formData . nom ,
0 commit comments