User search in admin page
This commit is contained in:
@@ -8,15 +8,23 @@ import {
|
|||||||
TableRow,
|
TableRow,
|
||||||
Button,
|
Button,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
|
Input,
|
||||||
} from "@nextui-org/react";
|
} from "@nextui-org/react";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import instance from "../security/http";
|
import instance from "../security/http";
|
||||||
import config from "../config";
|
import config from "../config";
|
||||||
import { popErrorToast, popToast } from "../utilities";
|
import { popErrorToast, popToast } from "../utilities";
|
||||||
import { ArchiveBoxIcon, ClipboardDocumentIcon, LifebuoyIcon } from "../icons";
|
import {
|
||||||
|
ArchiveBoxIcon,
|
||||||
|
ClipboardDocumentIcon,
|
||||||
|
LifebuoyIcon,
|
||||||
|
MagnifyingGlassIcon,
|
||||||
|
XMarkIcon,
|
||||||
|
} from "../icons";
|
||||||
|
|
||||||
export default function UsersManagement() {
|
export default function UsersManagement() {
|
||||||
const [userInformationlist, setUserInformationList] = useState<any>([]);
|
const [userInformationlist, setUserInformationList] = useState<any>([]);
|
||||||
|
const [searchQuery, setSearchQuery] = useState("");
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
key: "firstName",
|
key: "firstName",
|
||||||
@@ -54,7 +62,11 @@ export default function UsersManagement() {
|
|||||||
|
|
||||||
const populateUserInformationList = () => {
|
const populateUserInformationList = () => {
|
||||||
instance
|
instance
|
||||||
.get(`${config.serverAddress}/users/all`)
|
.get(
|
||||||
|
`${config.serverAddress}/users/all${
|
||||||
|
searchQuery.length > 0 ? `?search=${searchQuery}` : ""
|
||||||
|
}`
|
||||||
|
)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
setUserInformationList(response.data);
|
setUserInformationList(response.data);
|
||||||
console.log(userInformationlist);
|
console.log(userInformationlist);
|
||||||
@@ -68,6 +80,16 @@ export default function UsersManagement() {
|
|||||||
populateUserInformationList();
|
populateUserInformationList();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const debounceTimer = setTimeout(() => {
|
||||||
|
populateUserInformationList();
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
clearTimeout(debounceTimer);
|
||||||
|
};
|
||||||
|
}, [searchQuery]);
|
||||||
|
|
||||||
const handleCopyID = (userId: string, firstName: string) => {
|
const handleCopyID = (userId: string, firstName: string) => {
|
||||||
navigator.clipboard.writeText(userId);
|
navigator.clipboard.writeText(userId);
|
||||||
popToast(firstName + "'s User ID has been copied!", 1);
|
popToast(firstName + "'s User ID has been copied!", 1);
|
||||||
@@ -81,7 +103,7 @@ export default function UsersManagement() {
|
|||||||
}/${userId}`
|
}/${userId}`
|
||||||
)
|
)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
window.location.reload();
|
populateUserInformationList();
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
popErrorToast(error);
|
popErrorToast(error);
|
||||||
@@ -92,7 +114,30 @@ export default function UsersManagement() {
|
|||||||
<div>
|
<div>
|
||||||
{userInformationlist && (
|
{userInformationlist && (
|
||||||
<div className="flex flex-col gap-8 p-8">
|
<div className="flex flex-col gap-8 p-8">
|
||||||
<p className="text-4xl font-bold">Users Onboard</p>
|
<div className="flex flex-row justify-between *:my-auto">
|
||||||
|
<p className="text-4xl font-bold">Users Onboard</p>
|
||||||
|
<Input
|
||||||
|
className="max-w-96"
|
||||||
|
placeholder="Search"
|
||||||
|
value={searchQuery}
|
||||||
|
onValueChange={setSearchQuery}
|
||||||
|
startContent={<MagnifyingGlassIcon />}
|
||||||
|
endContent={
|
||||||
|
searchQuery.length > 0 && (
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
isIconOnly
|
||||||
|
variant="light"
|
||||||
|
onPress={() => {
|
||||||
|
setSearchQuery("");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<XMarkIcon />
|
||||||
|
</Button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<Table aria-label="User Information Table">
|
<Table aria-label="User Information Table">
|
||||||
<TableHeader columns={columns}>
|
<TableHeader columns={columns}>
|
||||||
{(column) => (
|
{(column) => (
|
||||||
@@ -182,6 +227,11 @@ export default function UsersManagement() {
|
|||||||
)}
|
)}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
</Table>
|
</Table>
|
||||||
|
{userInformationlist.length <= 0 && (
|
||||||
|
<div className="flex-grow w-full h-full text-center">
|
||||||
|
<p className="text-2xl opacity-70">No users to display.</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -78,8 +78,12 @@ router.get("/all", async (req, res) => {
|
|||||||
let search = req.query.search;
|
let search = req.query.search;
|
||||||
if (search) {
|
if (search) {
|
||||||
condition[Op.or] = [
|
condition[Op.or] = [
|
||||||
{ title: { [Op.like]: `%${search}%` } },
|
{ id: { [Op.like]: `%${search}%` } },
|
||||||
{ description: { [Op.like]: `%${search}%` } },
|
{ firstName: { [Op.like]: `%${search}%` } },
|
||||||
|
{ lastName: { [Op.like]: `%${search}%` } },
|
||||||
|
{ email: { [Op.like]: `%${search}%` } },
|
||||||
|
{ phoneNumber: { [Op.like]: `%${search}%` } },
|
||||||
|
{ townCouncil: { [Op.like]: `%${search}%` } },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user