diff --git a/src/common/table/components/input-text/input-text.component.tsx b/src/common/table/components/input-text/input-text.component.tsx index a07c93e..0bb9ed1 100644 --- a/src/common/table/components/input-text/input-text.component.tsx +++ b/src/common/table/components/input-text/input-text.component.tsx @@ -22,6 +22,7 @@ export const CustomInputText: React.FC = ({
>; - flag?: boolean; setPage?: React.Dispatch>; setPageSize?: React.Dispatch>; rowPerPages?: number[]; @@ -29,7 +28,6 @@ export const TableComponet: React.FC = ({ uniqueKey, page = 1, pageSize = 10, - flag = false, setFlag, setPage, setPageSize, @@ -38,6 +36,8 @@ export const TableComponet: React.FC = ({ // const keysToFilter = row.map((r, index) => r?.key || index); const keysToFilter = row.map((r) => r.key); + const popupRefs = useRef([]); + const [filtersTable, setFiltersTable] = useState( row.map((r, index) => { return { @@ -83,11 +83,11 @@ export const TableComponet: React.FC = ({ console.log("here3", filtersTable); // Update the filters in the parent component filtersTable.forEach((filter: any) => { - if (filter.setFilter) { - filter.setFilter(filter.filter); + if (filter?.setFilter) { + filter?.setFilter(filter.filter); } }); - setFlag && setFlag(!flag); + setFlag && setFlag((prev) => !prev); }; const handleChange = ( @@ -103,9 +103,39 @@ export const TableComponet: React.FC = ({ console.log("handleChange"); }; + const handleReset = (index: number) => { + setFiltersTable((prevFilters: any[]) => + prevFilters.map((filter: any, i: number) => + i === index ? { ...filter, filter: "" } : filter + ) + ); + }; + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + popupRefs.current.forEach((ref, index) => { + if (ref && !ref.contains(event.target as Node)) { + setFiltersTable((prevFilters: any[]) => { + return prevFilters.map((filter: any, i: number) => + i === index ? { ...filter, open: false } : filter + ); + }); + } + }); + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + return (
+ + Total results: {totalData || "No data"} + @@ -115,13 +145,16 @@ export const TableComponet: React.FC = ({ ))} @@ -270,7 +312,7 @@ export const TableComponet: React.FC = ({ className="table_x02_iconPagination" />
- {startRow} - {endRow} of {totalData || "No data"} + {startRow} - {endRow}
{ } }; + // const fetchPaginatedData = ( + // page: number, + // pageSize: number, + // body: any + // ): Promise => { + // return new Promise((resolve) => { + // setTimeout(() => { + // const filters = Object.keys(body).reduce((acc, key) => { + // acc[key] = body[key]?.toLowerCase(); + // return acc; + // }, {} as Record); + // console.log("body1", body); + // let filteredData = mockPaginationData?.products?.filter((item: any) => { + // return Object.keys(filters).every((key) => { + // const filterValue = filters[key]; + // return ( + // !filterValue || item[key]?.toLowerCase().includes(filterValue) + // ); + // }); + // }); + // if (!filteredData || !filteredData.length) { + // filteredData = mockPaginationData?.products; + // } + + // const start = (page - 1) * pageSize; + // const end = start + pageSize; + // const paginatedData = filteredData && filteredData.slice(start, end); + + // resolve({ + // products: paginatedData || [], + // totalProducts: (filteredData && filteredData?.length) || 0, + // }); + // }, 100); + // }); + // }; + const fetchPaginatedData = ( page: number, pageSize: number, @@ -19,25 +55,34 @@ export const useAppFunctions = () => { return new Promise((resolve) => { setTimeout(() => { const filters = Object.keys(body).reduce((acc, key) => { - acc[key] = body[key]?.toLowerCase(); + acc[key] = + typeof body[key] === "number" + ? body[key] + : body[key]?.toLowerCase(); return acc; - }, {} as Record); - console.log("body1", body); + }, {} as Record); + + console.log("Filters:", filters); + let filteredData = mockPaginationData?.products?.filter((item: any) => { return Object.keys(filters).every((key) => { const filterValue = filters[key]; - return ( - !filterValue || item[key]?.toLowerCase().includes(filterValue) - ); + const itemValue = item[key]?.toString().toLowerCase(); + if (typeof filterValue === "number") { + return itemValue.includes(filterValue.toString()); + } else { + return !filterValue || itemValue.includes(filterValue); + } }); }); + if (!filteredData || !filteredData.length) { - filteredData = mockPaginationData?.products; + filteredData = []; } const start = (page - 1) * pageSize; const end = start + pageSize; - const paginatedData = filteredData && filteredData.slice(start, end); + const paginatedData = filteredData.slice(start, end); resolve({ products: paginatedData || [], diff --git a/src/pods/second-page/components/workers-table/workers-table.component.tsx b/src/pods/second-page/components/workers-table/workers-table.component.tsx index c6d6f5f..e3b4374 100644 --- a/src/pods/second-page/components/workers-table/workers-table.component.tsx +++ b/src/pods/second-page/components/workers-table/workers-table.component.tsx @@ -17,7 +17,7 @@ interface Row { export const WorkersTable: React.FC = () => { const { getEmailPrefix, fetchPaginatedData } = useAppFunctions(); const [tableData, setTableData] = useState(); - // const [filterId, setFilterId] = useState(null); + const [filterId, setFilterId] = useState(null); const [filterName, setFilterName] = useState(""); const [filterCity, setFilterCity] = useState(""); const [filterEmail, setFilterEmail] = useState(""); @@ -29,6 +29,9 @@ export const WorkersTable: React.FC = () => { { key: "id", title: "Id", + typeFilter: "number", + setFilter: setFilterId, + filter: filterId, }, { key: "name", @@ -87,7 +90,7 @@ export const WorkersTable: React.FC = () => { useEffect(() => { const body = { - // id: filterId, + id: filterId, name: filterName, city: filterCity, email: filterEmail, @@ -116,7 +119,6 @@ export const WorkersTable: React.FC = () => { page={page} pageSize={pageSize} setFlag={setFlag} - flag={flag} rowPerPages={[5, 10, 25]} totalData={tableData?.totalProducts || 0} columns={tableData?.products || []}
{/* start Filter Pop up */} {r?.typeFilter && filtersTable[index]?.open && ( -
+
(popupRefs.current[index] = el)} + >
toggleFilterOpen(index)}> = ({ handleChange(event, index)} - // handleChange={(event) => - // setFiltersTable({ - // ...filtersTable, - // [event?.target?.name]: - // filtersTable[index]?.filter, - // }) - // } lbl={r?.typeFilter == "date" ? null : r?.title} Styles="table_x02_inputFilter" type={r?.typeFilter || "text"} inputValue={filtersTable[index]?.filter} name={r?.title} /> - +
+ + +
)} {/* end Filter Pop up */} - {r?.title} + + {r?.title} - {r?.typeFilter && ( - toggleFilterOpen(index)} - style={{ cursor: "pointer" }} - /> - )} + {r?.typeFilter && ( + toggleFilterOpen(index)} + style={{ + cursor: "pointer", + color: filtersTable[index]?.filter + ? "var(--color-one)" + : "", + }} + /> + )} +