diff --git a/src/components/tableWrapper/TableWrapper.jsx b/src/components/tableWrapper/TableWrapper.jsx index d666394..95d3ded 100644 --- a/src/components/tableWrapper/TableWrapper.jsx +++ b/src/components/tableWrapper/TableWrapper.jsx @@ -53,7 +53,7 @@ export default function TableWrapper({ },[itemsPerPage]) return ( -
+
{data.length > 0 && filterItem && (
{filterItem.map((item, index) => ( @@ -83,7 +83,7 @@ export default function TableWrapper({ {/* PAGINATION BUTTON */} {newData.length > 0 && -
+
Showing {isLoading ? '----' : `${currentPage + 1}-${currentPage + numberOfSelection >= data.length ? data.length : (currentPage + numberOfSelection)}`} of {data.length}
@@ -118,7 +118,7 @@ export default function TableWrapper({ const TableIsLoading = () => { return ( -
+

Loading...

) diff --git a/src/components/tableWrapper/_TableWrapper.jsx b/src/components/tableWrapper/_TableWrapper.jsx new file mode 100644 index 0000000..d666394 --- /dev/null +++ b/src/components/tableWrapper/_TableWrapper.jsx @@ -0,0 +1,125 @@ +import { ReactNode, useEffect, useState } from "react"; +import MainBtn from "../MainBtn"; +import Icons from "../Icons"; + + +export default function TableWrapper({ + data = [], + itemsPerPage = 5, + filterItem, + children, +}) { + const [isLoading, setIsLoading] = useState(true) + const [searchTerm, setSearchTerm] = useState(""); + const [filteredData, setFilteredData] = useState(data); + + const [currentPage, setCurrentPage] = useState(0); + const [newData, setNewData] = useState([]); + + const numberOfSelection = itemsPerPage; + + const handlePrev = () => { + if (currentPage != 0) { + setCurrentPage((prev) => prev - numberOfSelection); + } + }; + const handleNext = () => { + if (currentPage < data.length) { + setCurrentPage((prev) => prev + numberOfSelection); + } + }; + + const handleSearch = ({ target: { value } }, name) => { + setSearchTerm(value); + let newFilteredData = data.filter((item) => + item[name].toLowerCase().startsWith(value.toLowerCase()) + ); + setFilteredData(newFilteredData); + setCurrentPage(0); + }; + + useEffect(() => { + setIsLoading(true) + setTimeout(()=>{ + setNewData( + filteredData?.slice(currentPage, numberOfSelection + currentPage) + ); + setIsLoading(false) + },1000) + }, [currentPage, filteredData]); + + useEffect(()=>{ + setCurrentPage(0) + },[itemsPerPage]) + + return ( +
+ {data.length > 0 && filterItem && ( +
+ {filterItem.map((item, index) => ( + + ))} +
+ )} + +
+
+ {children({ data: newData })} +
+ + {/* PAGINATION BUTTON */} + {newData.length > 0 && +
+
Showing + {isLoading ? '----' : `${currentPage + 1}-${currentPage + numberOfSelection >= data.length ? data.length : (currentPage + numberOfSelection)}`} of {data.length} +
+ {(newData.length >= itemsPerPage) && +
+ + + + = data.length ? 'bg-primary/50 pointer-events-none' : 'bg-primary'} text-white-light text-center flex justify-center gap-2 items-center`} + disabled={isLoading} + > + + +
+ } +
+ } +
+ + {isLoading && } +
+ ); +} + +const TableIsLoading = () => { + return ( +
+

Loading...

+
+ ) +} diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index f5530f3..94bb17d 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -2,6 +2,8 @@ import React from 'react' import BreadcrumbCom from '../components/breadcrumb/BreadcrumbCom' import CustomCounter from '../components/CustomCounter' import Icons from '../components/Icons' +import TableWrapper from '../components/tableWrapper/TableWrapper' +import Avatar from '../assets/user_avatar.jpg' export default function HomePage() { return ( @@ -69,14 +71,77 @@ export default function HomePage() {
*/}
-
-
-
+
+
+

Members Statistics

Over 500 members

- +
+ +
+ + + {({ data }) => ( + <> + + + + + + + + + + + {data.map(item => ( + + + + + + + ))} + +
+ Authors + + Company + + Progress + + Action +
+
+ Jese image +
+
John Dummy
+
HTML, JS, ReactJS
+
+
+
+ Dummy text + +
+ Dummy +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ + )} +
diff --git a/tailwind.config.js b/tailwind.config.js index df5167a..2051793 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -29,6 +29,8 @@ module.exports = { } }, screens: { + xxs: '300px', + xs: '400px', large: '1535px', max_width: '1700px' },