/* eslint-disable no-alert */ /* eslint-disable no-nested-ternary */ /* eslint-disable sort-keys */ import { Avatar } from '../components/Avatar'; import { Box } from '../components/Box'; import { CircledIcon } from '../components/CircledIcon'; import { DesignSystemProvider } from '../components/DesignSystemProvider'; import { Pagination } from '../components/Pagination'; import { Table } from '../components/Table'; import { Text } from '../components/Typography'; import { TextLink } from '../components/TextLink'; import React, { useEffect, useRef, useState } from 'react'; const columns = [ { title: 'Beneficiary', value: 'name', width: '30%', minWidth: 14, render: (data: any) => ( {!!data.image ? : } {!!data.name && ( {data.name} )} {data.address} ) }, { title: 'Added on', value: 'added_on', sortable: true, width: '15%', minWidth: 4, render: (data: any) => ( {data.added_on?.toLocaleString('pt-PT')} ) }, { title: 'Claimed', value: 'claimed', width: '20%', minWidth: 8, sortable: true, render: (data: any) => ( ${data.claimed} ) }, { title: 'City', value: 'city', sortable: true, width: '20%', minWidth: 8 }, { width: '15%', minWidth: 8, render: (data: any) => ( alert(`You clicked element: ${data.address}`)} p500> Click me ) } ]; const rows = [ { name: 'Ana', claimed: 34, city: 'London', image: 'https://picsum.photos/120', address: '0x43D2...a12f7', added_on: new Date('2016-03-10 09:32:15') }, { name: 'Pedro', claimed: 20.23, city: 'Lisboa', image: 'https://picsum.photos/120', address: '0xA1C6...a1232', added_on: new Date('2015-07-24 11:24:01') }, { claimed: 100, city: 'Porto', address: '0x23A2...b2f34', added_on: new Date('2021-12-02 07:15:25') }, { claimed: 2350, city: 'Madrid', image: 'https://picsum.photos/120', address: '0x1BD5...c1a3f', added_on: new Date('2018-04-18 19:17:45') }, { claimed: 73.58, city: 'Paris', image: 'https://picsum.photos/120', address: '0x1BD5...c1a3f', added_on: new Date('2019-05-02 20:13:45'), name: 'Juliana' }, { claimed: 25, city: 'Roma', image: 'https://picsum.photos/120', address: '0x1BD5...c1a3f', added_on: new Date('2010-08-15 08:15:45') }, { claimed: 45, city: 'Braga', address: '0x1BD5...c1a3f', added_on: new Date('2011-10-22 11:45:45'), name: 'Sara' }, { claimed: 23.5, city: 'Los Angeles', image: 'https://picsum.photos/120', address: '0x1BD5...c1a3f', added_on: new Date('2021-09-30 12:53:45') }, { claimed: 180, city: 'Barcelona', address: '0x1BD5...c1a3f', added_on: new Date('2017-12-23 17:03:45'), name: 'Miguel' }, { claimed: 215.23, city: 'San Francisco', image: 'https://picsum.photos/120', address: '0x1BD5...c1a3f', added_on: new Date('2018-01-10 20:47:45') }, { claimed: 39.5, city: 'Nice', address: '0x1BD5...c1a3f', added_on: new Date('2019-03-01 18:05:45'), name: 'José' }, { claimed: 10, city: 'Berlim', image: 'https://picsum.photos/120', address: '0x1BD5...c1a3f', added_on: new Date('2020-11-09 10:23:45'), name: 'Paula' } ]; const itemsPerPage = 10; const Example = () => { const tableRef = useRef(null); // Pagination const [currentItems, setCurrentItems] = useState([]) as any; const [pageCount, setPageCount] = useState(0); const [itemOffset, setItemOffset] = useState(0); const [currentPage, setCurrentPage] = useState(0); // Table const [sortKey, setSortKey] = useState({}) as any; const [isLoading, setIsLoading] = useState(false); // Pagination useEffect(() => { setPageCount(Math.ceil(rows.length / itemsPerPage)); }, []); // Table & Pagination useEffect(() => { const endOffset = itemOffset + itemsPerPage; if (sortKey?.key) { rows.sort((a: any, b: any) => { const x = a[sortKey.key]; const y = b[sortKey.key]; if (sortKey.sortDesc) { return x < y ? 1 : x > y ? -1 : 0; } return x < y ? -1 : x > y ? 1 : 0; }); } setCurrentItems(rows.slice(itemOffset, endOffset)); }, [itemOffset, sortKey]); // Pagination const handlePageClick = (event: any, direction?: number) => { setIsLoading(true); let pageChanged = false; if (event.selected >= 0) { const newOffset = (event.selected * itemsPerPage) % rows.length; pageChanged = true; setItemOffset(newOffset); setCurrentPage(event.selected); } else if (direction === 1 && currentPage > 0) { const newPage = currentPage - 1; const newOffset = (newPage * itemsPerPage) % rows.length; pageChanged = true; setItemOffset(newOffset); setCurrentPage(newPage); } else if (direction === 2 && currentPage < pageCount - 1) { const newPage = currentPage + 1; const newOffset = (newPage * itemsPerPage) % rows.length; pageChanged = true; setItemOffset(newOffset); setCurrentPage(newPage); } setIsLoading(false); // Scroll to top of table after clicking a page if (pageChanged && tableRef && tableRef.current) { tableRef.current.scrollIntoView({ behavior: 'smooth' }); } }; // Table const handleSort = (key: string) => { setSortKey({ key, sortDesc: sortKey?.key === key ? !sortKey?.sortDesc : false }); }; return ( } rows={currentItems} sortKey={sortKey} /> ); }; export default Example;