complete loading table - design pagination -
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
export const Loading = () => {
|
||||||
|
return (
|
||||||
|
<div className="w-full flex justify-center items-center p-5 animate-pulse">
|
||||||
|
<svg className="text-gray-300 animate-spin" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="35" height="35">
|
||||||
|
<path
|
||||||
|
d="M32 3C35.8083 3 39.5794 3.75011 43.0978 5.20749C46.6163 6.66488 49.8132 8.80101 52.5061 11.4939C55.199 14.1868 57.3351 17.3837 58.7925 20.9022C60.2499 24.4206 61 28.1917 61 32C61 35.8083 60.2499 39.5794 58.7925 43.0978C57.3351 46.6163 55.199 49.8132 52.5061 52.5061C49.8132 55.199 46.6163 57.3351 43.0978 58.7925C39.5794 60.2499 35.8083 61 32 61C28.1917 61 24.4206 60.2499 20.9022 58.7925C17.3837 57.3351 14.1868 55.199 11.4939 52.5061C8.801 49.8132 6.66487 46.6163 5.20749 43.0978C3.7501 39.5794 3 35.8083 3 32C3 28.1917 3.75011 24.4206 5.2075 20.9022C6.66489 17.3837 8.80101 14.1868 11.4939 11.4939C14.1868 8.80099 17.3838 6.66487 20.9022 5.20749C24.4206 3.7501 28.1917 3 32 3L32 3Z"
|
||||||
|
stroke="currentColor" strokeWidth="5" strokeLinecap="round" strokeLinejoin="round"></path>
|
||||||
|
<path
|
||||||
|
d="M32 3C36.5778 3 41.0906 4.08374 45.1692 6.16256C49.2477 8.24138 52.7762 11.2562 55.466 14.9605C58.1558 18.6647 59.9304 22.9531 60.6448 27.4748C61.3591 31.9965 60.9928 36.6232 59.5759 40.9762"
|
||||||
|
stroke="currentColor" strokeWidth="5" strokeLinecap="round" strokeLinejoin="round" className="text-gray-900">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,18 +1,20 @@
|
|||||||
import { flexRender, getCoreRowModel, SortingState, useReactTable } from "@tanstack/react-table"
|
import { flexRender, getCoreRowModel, getPaginationRowModel, SortingState, useReactTable } from "@tanstack/react-table"
|
||||||
import { ArrowDown2, ArrowUp2, SearchNormal1 } from "iconsax-react"
|
import { ArrowDown2, ArrowLeft2, ArrowRight2, ArrowUp2, SearchNormal1 } from "iconsax-react"
|
||||||
import { FC } from "react"
|
import { FC } from "react"
|
||||||
import { Input } from "./input"
|
import { Input } from "./input"
|
||||||
import { ComboBox } from "./combo-box"
|
import { ComboBox } from "./combo-box"
|
||||||
|
import { Loading } from "./loading"
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
columns: any
|
columns: any
|
||||||
data: any
|
data: any
|
||||||
sorting: SortingState,
|
sorting: SortingState,
|
||||||
setSorting: React.Dispatch<React.SetStateAction<SortingState>>,
|
setSorting: React.Dispatch<React.SetStateAction<SortingState>>,
|
||||||
tableStatus?: string | number
|
tableStatus?: string | number,
|
||||||
|
isLoading?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Table: FC<Props> = ({ columns, data, setSorting, sorting, tableStatus }) => {
|
export const Table: FC<Props> = ({ columns, data, setSorting, sorting, tableStatus, isLoading = false }) => {
|
||||||
|
|
||||||
const table = useReactTable({
|
const table = useReactTable({
|
||||||
data: data ? data : [],
|
data: data ? data : [],
|
||||||
@@ -27,6 +29,7 @@ export const Table: FC<Props> = ({ columns, data, setSorting, sorting, tableStat
|
|||||||
sorting
|
sorting
|
||||||
},
|
},
|
||||||
onSortingChange: setSorting,
|
onSortingChange: setSorting,
|
||||||
|
getPaginationRowModel: getPaginationRowModel()
|
||||||
})
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -39,7 +42,7 @@ export const Table: FC<Props> = ({ columns, data, setSorting, sorting, tableStat
|
|||||||
<ComboBox placeholder="100" className="bg-auth-form" />
|
<ComboBox placeholder="100" className="bg-auth-form" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="block max-w-full overflow-x-auto overflow-y-hidden bg-auth-form rounded-[40px] shadow-sm p-4 xl:p-9 relative">
|
<div className="block max-w-full overflow-x-auto overflow-y-hidden bg-auth-form rounded-[40px] shadow-sm p-4 pb-0 xl:p-9 xl:pb-0 relative">
|
||||||
<table>
|
<table>
|
||||||
<thead className="border-b border-b-secondary-color">
|
<thead className="border-b border-b-secondary-color">
|
||||||
{table.getHeaderGroups().map((headerGroup: any, index: number) => (
|
{table.getHeaderGroups().map((headerGroup: any, index: number) => (
|
||||||
@@ -55,7 +58,7 @@ export const Table: FC<Props> = ({ columns, data, setSorting, sorting, tableStat
|
|||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
{!isLoading && <tbody>
|
||||||
{table.getRowModel().rows.map((row: any, index: number) => (
|
{table.getRowModel().rows.map((row: any, index: number) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
{row.getVisibleCells().map((cell: any, index: number) => (
|
{row.getVisibleCells().map((cell: any, index: number) => (
|
||||||
@@ -65,9 +68,16 @@ export const Table: FC<Props> = ({ columns, data, setSorting, sorting, tableStat
|
|||||||
))}
|
))}
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>}
|
||||||
</table>
|
</table>
|
||||||
{tableStatus && <div className="absolute text-sm bottom-1.5 lg:left-10 lg:top-5 lg:text-lg text-primary-text-color font-normal">امتیاز من: {tableStatus}</div>}
|
{isLoading ? <Loading /> : <>
|
||||||
|
<div className="flex flex-row justify-center items-center border-t p-4 gap-x-3 mt-3">
|
||||||
|
<ArrowRight2 color="#11212D" size={19} className="cursor-pointer" onClick={() => table.getCanNextPage() && table.nextPage()} />
|
||||||
|
<p className="text-base font-normal text-primary-text-color">1-{table.getPageCount()}</p>
|
||||||
|
<ArrowLeft2 color="#11212D" size={19} className="cursor-pointer" onClick={() => table.getCanPreviousPage() && table.previousPage()} />
|
||||||
|
</div>
|
||||||
|
{tableStatus && <div className="absolute text-sm bottom-1.5 lg:left-10 lg:top-5 lg:text-lg text-primary-text-color font-normal">امتیاز من: {tableStatus}</div>}
|
||||||
|
</>}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -15,9 +15,8 @@ export const InstallationReports = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("data =>", data)
|
console.log("data =>", data)
|
||||||
}, [data])
|
}, [data])
|
||||||
|
|
||||||
if (isLoading) return <p>LODING .....</p>
|
|
||||||
return (
|
return (
|
||||||
<Table columns={installationReportsCol} data={data?.data?.data} sorting={sorting} setSorting={setSorting} />
|
<Table columns={installationReportsCol} data={data?.data?.data} sorting={sorting} setSorting={setSorting} isLoading={isLoading} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { Loading } from "../common/loading"
|
||||||
|
|
||||||
|
export const ManagementBankCardSkeleton = () => {
|
||||||
|
return (
|
||||||
|
<div className={`w-full flex flex-col rounded-[40px] bg-auth-form p-[18px] cursor-pointer bank-bg min-h-[226px] animate-pulse items-center justify-center`}>
|
||||||
|
<Loading />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import { DeleteCardDialog } from "./delete-card"
|
|||||||
import { useQuery } from "@tanstack/react-query"
|
import { useQuery } from "@tanstack/react-query"
|
||||||
import { getUserCardsList } from "../../services/api/bank-card"
|
import { getUserCardsList } from "../../services/api/bank-card"
|
||||||
import { BankCart } from "./bank-cart"
|
import { BankCart } from "./bank-cart"
|
||||||
|
import { ManagementBankCardSkeleton } from "./bank-card-skeleton"
|
||||||
|
|
||||||
export const ManagementBankAccounts = () => {
|
export const ManagementBankAccounts = () => {
|
||||||
const [selectedCard, setSelectedCard] = useState<string | number | null>(null)
|
const [selectedCard, setSelectedCard] = useState<string | number | null>(null)
|
||||||
@@ -15,17 +16,15 @@ export const ManagementBankAccounts = () => {
|
|||||||
})
|
})
|
||||||
const [showDialog, setShowDialog] = useState<boolean>(false)
|
const [showDialog, setShowDialog] = useState<boolean>(false)
|
||||||
const handleCloseDialog = () => setShowDialog(false)
|
const handleCloseDialog = () => setShowDialog(false)
|
||||||
const handleOpenDialog = () => setShowDialog(true)
|
const handleOpenDialog = () => !isLoading && setShowDialog(true)
|
||||||
const [showDeleteDialog, setShowDeleteDialog] = useState<boolean>(false)
|
const [showDeleteDialog, setShowDeleteDialog] = useState<boolean>(false)
|
||||||
const handleOpenDeleteDialog = () => setShowDeleteDialog(true)
|
const handleOpenDeleteDialog = () => !isLoading && setShowDeleteDialog(true)
|
||||||
const handleCloseDeleteDialog = () => setShowDeleteDialog(false)
|
const handleCloseDeleteDialog = () => setShowDeleteDialog(false)
|
||||||
|
|
||||||
if (isLoading) return <p>LOADING...</p>
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="w-full grid grid-cols-1 xl:grid-cols-2 2xl:grid-cols-3 gap-6">
|
<div className="w-full grid grid-cols-1 xl:grid-cols-2 2xl:grid-cols-3 gap-6">
|
||||||
<CreateNewCart handleOpenDialog={handleOpenDialog} />
|
<CreateNewCart handleOpenDialog={handleOpenDialog} />
|
||||||
{data?.data?.cardBank?.map((item: CardBank) => <BankCart key={item?.id} item={item} handleOpenDeleteDialog={handleOpenDeleteDialog} setSelectedCard={setSelectedCard} />)}
|
{!isLoading ? data?.data?.cardBank?.map((item: CardBank) => <BankCart key={item?.id} item={item} handleOpenDeleteDialog={handleOpenDeleteDialog} setSelectedCard={setSelectedCard} />) : <ManagementBankCardSkeleton />}
|
||||||
</div>
|
</div>
|
||||||
<AddNewCardDialog isOpen={showDialog} close={handleCloseDialog} />
|
<AddNewCardDialog isOpen={showDialog} close={handleCloseDialog} />
|
||||||
<DeleteCardDialog isOpen={showDeleteDialog} close={handleCloseDeleteDialog} id={selectedCard} />
|
<DeleteCardDialog isOpen={showDeleteDialog} close={handleCloseDeleteDialog} id={selectedCard} />
|
||||||
|
|||||||
@@ -16,9 +16,7 @@ export const Score = () => {
|
|||||||
console.log("data =>", data)
|
console.log("data =>", data)
|
||||||
}, [data])
|
}, [data])
|
||||||
|
|
||||||
if (isLoading) return <p>LOADING ...</p>
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Table sorting={sorting} setSorting={setSorting} columns={scoresCol} data={data?.data} tableStatus={data?.score} />
|
<Table sorting={sorting} setSorting={setSorting} columns={scoresCol} data={data?.data} tableStatus={data?.score} isLoading={isLoading} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -16,9 +16,7 @@ export const Transactions = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("data=>", data)
|
console.log("data=>", data)
|
||||||
}, [data])
|
}, [data])
|
||||||
|
|
||||||
if (isLoading) return <p>LOADING ....</p>
|
|
||||||
return (
|
return (
|
||||||
<Table sorting={sorting} setSorting={setSorting} columns={transactionsCol} data={data?.data?.data} />
|
<Table sorting={sorting} setSorting={setSorting} columns={transactionsCol} data={data?.data?.data} isLoading={isLoading} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user