Skip to content

Commit 12e2f05

Browse files
Tony QiuTony Qiu
authored andcommitted
linting
1 parent 9fc4601 commit 12e2f05

File tree

2 files changed

+73
-165
lines changed

2 files changed

+73
-165
lines changed

frontend/src/components/common/Pagination.tsx

Lines changed: 62 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { FC, useState } from "react";
1+
import React, { FC } from "react";
22
import { ChevronLeft, ChevronRight } from "lucide-react";
33
import {
44
Flex,
@@ -24,86 +24,90 @@ const Pagination: FC<PaginationProps> = ({
2424
itemsPerPage,
2525
className = "",
2626
}) => {
27-
const [curPageNumber, setCurPageNumber] = useState(value);
2827
const MAX_NUM_OF_PAGES = ceil(numberOfItems / itemsPerPage);
2928
const theme = useTheme();
3029

31-
const onPageChange = (newPageNumber: number) => {
32-
if (newPageNumber < 1) {
33-
setCurPageNumber(1);
34-
} else if (newPageNumber > MAX_NUM_OF_PAGES) {
35-
setCurPageNumber(MAX_NUM_OF_PAGES);
30+
const handlePrevClick = () => {
31+
if (value > 1) {
32+
onChange(value - 1);
3633
} else {
37-
setCurPageNumber(newPageNumber);
38-
onChange(newPageNumber);
34+
onChange(1);
3935
}
4036
};
4137

42-
const onInputChange = (newPageNumber: number) => {
43-
setCurPageNumber(newPageNumber);
38+
const handleNextClick = () => {
39+
if (value < MAX_NUM_OF_PAGES) {
40+
onChange(value + 1);
41+
} else {
42+
onChange(MAX_NUM_OF_PAGES);
43+
}
44+
};
45+
46+
const handleInputChange = (val: string) => {
47+
const newPageNumber = Number(val);
4448
onChange(newPageNumber);
4549
};
4650

4751
return (
4852
<Flex
53+
width="100%"
54+
maxWidth="25rem"
4955
alignItems="center"
50-
gap="1.5rem"
5156
justifyContent="space-between"
52-
width="25rem"
5357
alignSelf="center"
5458
className={className}
5559
>
5660
<ChevronLeft
5761
size={30}
58-
color={
59-
curPageNumber <= 1 ? theme.colors.gray[300] : theme.colors.gray[700]
60-
}
61-
onClick={() => onPageChange(curPageNumber - 1)}
62+
color={value <= 1 ? theme.colors.gray[300] : theme.colors.gray[700]}
63+
onClick={handlePrevClick}
6264
/>
63-
<Text
64-
m={0}
65-
fontSize="18px"
66-
color={theme.colors.gray[700]}
67-
fontWeight="400"
68-
>
69-
Page
70-
</Text>
71-
<NumberInput
72-
onChange={(val) => onInputChange(Number(val))}
73-
inputMode="numeric"
74-
value={curPageNumber}
75-
max={MAX_NUM_OF_PAGES}
76-
min={1}
77-
clampValueOnBlur={true}
78-
defaultValue={1}
79-
size="sm"
80-
focusBorderColor={theme.colors.gray[500]}
81-
textColor="gray.700"
82-
fontWeight="400"
83-
>
84-
<NumberInputField
85-
height="2.5rem"
86-
padding="0.35rem"
87-
maxW="3rem"
88-
alignContent="center"
89-
borderColor={theme.colors.gray[500]}
90-
borderRadius="0.35rem"
91-
textAlign="center"
92-
/>
93-
</NumberInput>
94-
<Text
95-
m={0}
96-
fontSize="18px"
97-
color={theme.colors.gray[700]}
98-
fontWeight="400"
99-
>
100-
of {MAX_NUM_OF_PAGES}
101-
</Text>
65+
<Flex gap="1.25rem" alignItems="center">
66+
<Text
67+
m={0}
68+
fontSize="18px"
69+
color={theme.colors.gray[700]}
70+
fontWeight="400"
71+
>
72+
Page
73+
</Text>
74+
<NumberInput
75+
onChange={handleInputChange}
76+
inputMode="numeric"
77+
value={value}
78+
max={MAX_NUM_OF_PAGES}
79+
min={1}
80+
clampValueOnBlur
81+
defaultValue={1}
82+
size="sm"
83+
focusBorderColor={theme.colors.gray[500]}
84+
textColor="gray.700"
85+
fontWeight="400"
86+
>
87+
<NumberInputField
88+
height="2.5rem"
89+
padding="0.35rem"
90+
maxW="3rem"
91+
alignContent="center"
92+
borderColor={theme.colors.gray[500]}
93+
borderRadius="0.35rem"
94+
textAlign="center"
95+
/>
96+
</NumberInput>
97+
<Text
98+
m={0}
99+
fontSize="18px"
100+
color={theme.colors.gray[700]}
101+
fontWeight="400"
102+
>
103+
of {MAX_NUM_OF_PAGES}
104+
</Text>
105+
</Flex>
102106
<ChevronRight
103107
size={30}
104-
onClick={() => onPageChange(curPageNumber + 1)}
108+
onClick={handleNextClick}
105109
color={
106-
curPageNumber >= MAX_NUM_OF_PAGES
110+
value >= MAX_NUM_OF_PAGES
107111
? theme.colors.gray[300]
108112
: theme.colors.gray[700]
109113
}

frontend/src/pages/UserManagementPage.tsx

Lines changed: 11 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,19 @@
11
import 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";
33
import UserAPIClient from "../APIClients/UserAPIClient";
44
import { User } from "../types/UserTypes";
55

66
import Filter from "../components/common/Filter";
77
import Search from "../components/common/Search";
8-
import SingleSelect from "../components/common/SingleSelect";
9-
import MultiSelect from "../components/common/MultiSelect";
108
import 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";
1510
import 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-
3812
const 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

Comments
 (0)