diff --git a/src/hooks/useListSearch.tsx b/src/hooks/useListSearch.tsx new file mode 100644 index 00000000..a559b400 --- /dev/null +++ b/src/hooks/useListSearch.tsx @@ -0,0 +1,48 @@ +import {useState, useMemo} from 'react'; +import Input from "@/components/Low/Input"; + +/*fields example = [ + ['id'], + ['companyInformation', 'companyInformation', 'name'] +]*/ + + +const getFieldValue = (fields: string[], data: any): string => { + if(fields.length === 0) return data; + const [key, ...otherFields] = fields; + + if(data[key]) return getFieldValue(otherFields, data[key]); + return data; +} + +export const useListSearch = (fields: string[][], rows: any[]) => { + const [text, setText] = useState(''); + + const renderSearch = () => ( + + ) + + const updatedRows = useMemo(() => { + const searchText = text.toLowerCase(); + return rows.filter((row) => { + return fields.some((fieldsKeys) => { + const value = getFieldValue(fieldsKeys, row); + if(typeof value === 'string') { + return value.toLowerCase().includes(searchText); + } + }) + }) + }, [fields, rows, text]) + + return { + rows: updatedRows, + renderSearch, + } +} \ No newline at end of file diff --git a/src/pages/(admin)/Lists/UserList.tsx b/src/pages/(admin)/Lists/UserList.tsx index 5d83a17c..89b9656a 100644 --- a/src/pages/(admin)/Lists/UserList.tsx +++ b/src/pages/(admin)/Lists/UserList.tsx @@ -2,7 +2,7 @@ import Button from "@/components/Low/Button"; import {PERMISSIONS} from "@/constants/userPermissions"; import useGroups from "@/hooks/useGroups"; import useUsers from "@/hooks/useUsers"; -import {Type, User, userTypes} from "@/interfaces/user"; +import {Type, User, userTypes, CorporateUser} from "@/interfaces/user"; import {Popover, Transition} from "@headlessui/react"; import {createColumnHelper, flexRender, getCoreRowModel, useReactTable} from "@tanstack/react-table"; import axios from "axios"; @@ -19,9 +19,15 @@ import UserCard from "@/components/UserCard"; import {USER_TYPE_LABELS} from "@/resources/user"; import useFilterStore from "@/stores/listFilterStore"; import {useRouter} from "next/router"; +import {isCorporateUser} from '@/resources/user'; +import { useListSearch } from "@/hooks/useListSearch"; const columnHelper = createColumnHelper(); - +const searchFields = [ + ['name'], + ['email'], + ['corporateInformation', 'companyInformation', 'name'], +]; export default function UserList({user, filters = []}: {user: User; filters?: ((user: User) => boolean)[]}) { const [showDemographicInformation, setShowDemographicInformation] = useState(false); const [sorter, setSorter] = useState(); @@ -325,6 +331,15 @@ export default function UserList({user, filters = []}: {user: User; filters?: (( ) as any, cell: (info) => USER_TYPE_LABELS[info.getValue()], }), + columnHelper.accessor('corporateInformation.companyInformation.name', { + header: ( + + ) as any, + cell: (info) => getCorporateName(info.row.original), + }), columnHelper.accessor("subscriptionExpirationDate", { header: (