mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
* chore: remove dead comment in database page * fix(data-table): manualPagination support * fix(hooks): useServerDataTable for server-side pagination * fix(database): paginated backup and restoration list actions * fix(database): server-paginate backup list * fix(database): server-paginate restoration list * fix(database): switch tabs via History API instead of router.push * fix(logs): load job logs on demand when the modal opens * perf(database): slim metadata poll and drop eager backup/log loading * fix(database): invalidate backups/restorations list keys on mutations for instant refresh * fix(logs): disable log button when row has no logs * fix(logs): fetch logs on button click, open modal already populated * fix: loading log modal --------- Co-authored-by: charles-gauthereau <charles.gauthereau@soluce-technologies.com>
79 lines
3.1 KiB
TypeScript
79 lines
3.1 KiB
TypeScript
"use client";
|
|
|
|
import {Tabs, TabsContent, TabsList, TabsTrigger} from "@/components/ui/tabs";
|
|
import {useEffect, useState} from "react";
|
|
import {useSearchParams} from "next/navigation";
|
|
import {DatabaseWith} from "@/db/schema/07_database";
|
|
import {Setting} from "@/db/schema/01_setting";
|
|
import {DatabaseBackupList} from "@/features/database/components/database-backup-list";
|
|
import {DatabaseRestoreList} from "@/features/database/components/database-restore-list";
|
|
import {MemberWithUser} from "@/db/schema/03_organization";
|
|
|
|
export type DatabaseTabsProps = {
|
|
settings: Setting,
|
|
isAlreadyRestore: boolean,
|
|
database: DatabaseWith,
|
|
activeMember: MemberWithUser
|
|
};
|
|
|
|
export const backupOnly = ["redis", "valkey"];
|
|
|
|
export const DatabaseTabs = (props: DatabaseTabsProps) => {
|
|
const searchParams = useSearchParams();
|
|
|
|
const [tab, setTab] = useState<string>(() => searchParams.get("tab") ?? "backup");
|
|
|
|
useEffect(() => {
|
|
const onPopState = () => {
|
|
const params = new URLSearchParams(window.location.search);
|
|
setTab(params.get("tab") ?? "backup");
|
|
};
|
|
window.addEventListener("popstate", onPopState);
|
|
return () => window.removeEventListener("popstate", onPopState);
|
|
}, []);
|
|
|
|
const handleChangeTab = (value: string) => {
|
|
setTab(value);
|
|
const params = new URLSearchParams(window.location.search);
|
|
params.set("tab", value);
|
|
window.history.pushState(null, "", `?${params.toString()}`);
|
|
};
|
|
|
|
const isBackupOnly = backupOnly.some((type) => props.database.dbms === type);
|
|
|
|
return (
|
|
<>
|
|
{isBackupOnly ?
|
|
<DatabaseBackupList
|
|
isAlreadyRestore={props.isAlreadyRestore}
|
|
settings={props.settings}
|
|
database={props.database}
|
|
activeMember={props.activeMember}
|
|
/>
|
|
:
|
|
<Tabs className="flex flex-col flex-1" value={tab} onValueChange={handleChangeTab}>
|
|
<TabsList className="grid w-full grid-cols-2">
|
|
<TabsTrigger value="backup">Backup</TabsTrigger>
|
|
<TabsTrigger value="restore">Restoration</TabsTrigger>
|
|
</TabsList>
|
|
<TabsContent className="h-full justify-between" value="backup">
|
|
<DatabaseBackupList
|
|
isAlreadyRestore={props.isAlreadyRestore}
|
|
settings={props.settings}
|
|
database={props.database}
|
|
activeMember={props.activeMember}
|
|
/>
|
|
</TabsContent>
|
|
<TabsContent className="h-full justify-between" value="restore">
|
|
<DatabaseRestoreList
|
|
isAlreadyRestore={props.isAlreadyRestore}
|
|
activeMember={props.activeMember}
|
|
databaseId={props.database.id}
|
|
/>
|
|
</TabsContent>
|
|
</Tabs>
|
|
}
|
|
</>
|
|
);
|
|
};
|