mirror of
https://github.com/khairul169/db-backup-tool.git
synced 2025-04-28 16:49:34 +07:00
86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
import Card from "@/components/ui/card";
|
|
import DataTable from "@/components/ui/data-table";
|
|
import SectionTitle from "@/components/ui/section-title";
|
|
import { DatabaseType, backupsColumns } from "../table";
|
|
import { useQuery } from "react-query";
|
|
import { useParams } from "react-router-dom";
|
|
import api, { parseJson } from "@/lib/api";
|
|
import { useQueryParams } from "@/hooks/useQueryParams";
|
|
import Button from "@/components/ui/button";
|
|
import { IoRefresh } from "react-icons/io5";
|
|
import Select from "@/components/ui/select";
|
|
|
|
type BackupSectionProps = {
|
|
databases: DatabaseType[];
|
|
};
|
|
|
|
type QueryParams = {
|
|
page: number;
|
|
limit: number;
|
|
databaseId?: string;
|
|
};
|
|
|
|
const BackupSection = ({ databases }: BackupSectionProps) => {
|
|
const id = useParams().id!;
|
|
const [query, setQuery] = useQueryParams<QueryParams>({
|
|
page: 1,
|
|
limit: 10,
|
|
});
|
|
|
|
const backups = useQuery({
|
|
queryKey: ["backups/by-server", id, query],
|
|
queryFn: async () => {
|
|
return api.backups
|
|
.$get({
|
|
query: {
|
|
serverId: id,
|
|
limit: String(query.limit),
|
|
page: String(query.page),
|
|
databaseId: query.databaseId,
|
|
},
|
|
})
|
|
.then(parseJson);
|
|
},
|
|
refetchInterval: 3000,
|
|
});
|
|
|
|
return (
|
|
<div className="flex flex-col">
|
|
<div className="flex items-end gap-2">
|
|
<SectionTitle className="mt-8">Backups</SectionTitle>
|
|
<Button
|
|
icon={IoRefresh}
|
|
variant="ghost"
|
|
size="icon"
|
|
className="text-2xl -mb-1"
|
|
onClick={() => backups.refetch()}
|
|
isLoading={backups.isRefetching}
|
|
/>
|
|
<div className="flex-1" />
|
|
<Select
|
|
options={databases.map((i) => ({ label: i.name, value: i.id }))}
|
|
onChange={(i) => setQuery({ databaseId: i })}
|
|
value={query.databaseId}
|
|
placeholder="Select Database"
|
|
className="min-w-[120px]"
|
|
/>
|
|
</div>
|
|
<Card className="mt-4 px-2 flex-1">
|
|
<DataTable
|
|
columns={backupsColumns as never}
|
|
data={backups?.data?.rows || []}
|
|
pagination
|
|
progressPending={backups.isLoading}
|
|
paginationServer
|
|
paginationPerPage={query.limit}
|
|
paginationTotalRows={backups?.data?.count}
|
|
onChangeRowsPerPage={(limit) => setQuery({ limit })}
|
|
onChangePage={(page) => setQuery({ page })}
|
|
/>
|
|
</Card>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default BackupSection;
|