11import React , { useEffect , useMemo , useState } from "react" ;
2- import { Alert , AlertIcon , CloseButton , Flex , Box } from "@chakra-ui/react" ;
2+ import { Alert , AlertIcon , CloseButton , Flex } from "@chakra-ui/react" ;
33import UserAPIClient from "../APIClients/UserAPIClient" ;
44import { User } from "../types/UserTypes" ;
55
66import Filter from "../components/common/Filter" ;
77import Search from "../components/common/Search" ;
8- import SingleSelect from "../components/common/SingleSelect" ;
9- import MultiSelect from "../components/common/MultiSelect" ;
108import UserManagementTable from "../components/user-management/UserManagementTable" ;
11- import { AnimalTag , ColorLevel } from "../types/TaskTypes" ;
129
13- // Import star icon for color levels
14- import { ReactComponent as StarIcon } from "../assets/icons/star.svg" ;
1510import Pagination from "../components/common/Pagination" ;
1611
17- // const handleUserSubmit = async (formData: AddUserRequest) => {
18- // eslint-disable-next-line no-useless-catch
19- // try {
20- // await UserAPIClient.create({
21- // firstName: formData.firstName,
22- // lastName: formData.lastName,
23- // phoneNumber: formData.phoneNumber,
24- // email: formData.email,
25- // colorLevel: formData.colorLevel as unknown as string,
26- // role: formData.role as
27- // | "Administrator"
28- // | "Animal Behaviourist"
29- // | "Staff"
30- // | "Volunteer",
31- // });
32- // await UserAPIClient.invite(formData.email);
33- // } catch (error) {
34- // throw error;
35- // }
36- // };
37-
3812const UserManagementPage = ( ) : React . ReactElement => {
3913 const [ users , setUsers ] = useState < User [ ] > ( [ ] ) ;
4014 const [ errorMessage , setErrorMessage ] = useState < string | null > ( null ) ;
4115 const [ filters , setFilters ] = useState < Record < string , string [ ] > > ( { } ) ;
4216 const [ search , setSearch ] = useState < string > ( "" ) ;
43-
44- // Testing for the Select Component Filters
45- const [ selectedColorLevel , setSelectedColorLevel ] = useState < string | null > (
46- null ,
47- ) ;
48- const [ selectedAnimalTags , setSelectedAnimalTags ] = useState < string [ ] > ( [ ] ) ;
49-
50- const handleClearFilters = ( ) => {
51- setFilters ( { } ) ;
52- setSearch ( "" ) ;
53- // Testing for the Select Component Filters
54- setSelectedColorLevel ( null ) ;
55- setSelectedAnimalTags ( [ ] ) ;
56- } ;
5717 const [ page , setPage ] = useState < number > ( 1 ) ;
5818
5919 const numUsersPerPage = 10 ; // You can adjust this value as needed
@@ -65,6 +25,12 @@ const UserManagementPage = (): React.ReactElement => {
6525 const handleSearchChange = ( value : string ) => {
6626 setSearch ( value ) ;
6727 } ;
28+
29+ const handleClearFilters = ( ) => {
30+ setFilters ( { } ) ;
31+ setSearch ( "" ) ;
32+ } ;
33+
6834 const filteredUsers = useMemo ( ( ) => {
6935 return users
7036 . filter ( ( user ) => {
@@ -83,31 +49,8 @@ const UserManagementPage = (): React.ReactElement => {
8349 return filterVals . includes ( value as string ) ;
8450 } ) ;
8551 } )
86- . filter ( ( user ) => user . name . toLowerCase ( ) . includes ( search . toLowerCase ( ) ) )
87- . filter ( ( user ) => {
88- // Apply SingleSelect Color Level filter
89- if ( selectedColorLevel ) {
90- const colorLevelMap : Record < string , number > = {
91- Green : 1 ,
92- Yellow : 2 ,
93- Orange : 3 ,
94- Red : 4 ,
95- Blue : 5 ,
96- } ;
97- return user . colorLevel === colorLevelMap [ selectedColorLevel ] ;
98- }
99- return true ;
100- } )
101- . filter ( ( user ) => {
102- // Apply MultiSelect Animal Tags filter
103- if ( selectedAnimalTags . length > 0 ) {
104- return selectedAnimalTags . some ( ( tag ) =>
105- user . animalTags . includes ( tag as AnimalTag ) ,
106- ) ;
107- }
108- return true ;
109- } ) ;
110- } , [ filters , search , users , selectedColorLevel , selectedAnimalTags , page ] ) ;
52+ . filter ( ( user ) => user . name . toLowerCase ( ) . includes ( search . toLowerCase ( ) ) ) ;
53+ } , [ filters , search , users ] ) ;
11154
11255 const filteredUsersLength = filteredUsers . length ;
11356
@@ -127,12 +70,6 @@ const UserManagementPage = (): React.ReactElement => {
12770 getUsers ( ) ;
12871 } , [ ] ) ;
12972
130- // Testing for the Select Component Filters
131- const colorLevelOptions = Object . values ( ColorLevel ) ; // ["Green", "Yellow", "Orange", "Red", "Blue"]
132- const animalTagOptions = Object . values ( AnimalTag ) ; // ["Bird", "Bunny", "Cat", "Dog", "Small Animal"]
133- const animalTagColors = [ "blue" , "orange" , "yellow" , "green" , "purple" ] ; // Colors for each animal tag
134- const colorLevelIcons = [ StarIcon , StarIcon , StarIcon , StarIcon , StarIcon ] ; // Star icons for each color level
135-
13673 return (
13774 < Flex direction = "column" gap = "2rem" width = "100%" pt = "2rem" >
13875 { errorMessage && (
@@ -164,43 +101,10 @@ const UserManagementPage = (): React.ReactElement => {
164101 search = { search }
165102 />
166103 </ Flex >
167-
168- { /* Testing for the Select Component Filters */ }
169- < Flex
170- padding = "0 2.5rem"
171- gap = "1.5rem"
172- wrap = "wrap"
173- align = "stretch"
174- maxWidth = "100%"
175- >
176- < Box minWidth = "250px" maxWidth = "350px" flex = "1" >
177- < SingleSelect
178- values = { colorLevelOptions }
179- onSelect = { setSelectedColorLevel }
180- selected = { selectedColorLevel }
181- placeholder = "Any level"
182- icons = { colorLevelIcons }
183- label = "Color Level"
184- required
185- maxHeight = "160px"
186- />
187- </ Box >
188- < Box minWidth = "250px" maxWidth = "350px" flex = "1" >
189- < MultiSelect
190- values = { animalTagOptions }
191- onSelect = { setSelectedAnimalTags }
192- selected = { selectedAnimalTags }
193- placeholder = "Any tags"
194- colours = { animalTagColors }
195- label = "Animal Tags"
196- maxHeight = "180px"
197- />
198- </ Box >
199- </ Flex >
200104 < UserManagementTable
201- users = { filteredUsers . splice (
105+ users = { filteredUsers . slice (
202106 ( page - 1 ) * numUsersPerPage ,
203- numUsersPerPage ,
107+ page * numUsersPerPage ,
204108 ) }
205109 clearFilters = { handleClearFilters }
206110 />
0 commit comments