refactor: coming soon backups

This commit is contained in:
Nicolas Meienberger
2025-09-26 22:21:37 +02:00
parent 604e92ab1e
commit 5b87050013
3 changed files with 439 additions and 422 deletions

View File

@@ -134,6 +134,7 @@ export const VolumeBackupsTabContent = ({ volume }: Props) => {
}; };
return ( return (
<div className="relative">
<div className="grid gap-4 xl:grid-cols-[minmax(0,_2.3fr)_minmax(320px,_1fr)]"> <div className="grid gap-4 xl:grid-cols-[minmax(0,_2.3fr)_minmax(320px,_1fr)]">
<Form {...form}> <Form {...form}>
<form onSubmit={form.handleSubmit(handleSubmit)} className="grid gap-4"> <form onSubmit={form.handleSubmit(handleSubmit)} className="grid gap-4">
@@ -323,7 +324,9 @@ export const VolumeBackupsTabContent = ({ volume }: Props) => {
<FormControl> <FormControl>
<Input placeholder="ironmount-backups" value={field.value} onChange={field.onChange} /> <Input placeholder="ironmount-backups" value={field.value} onChange={field.onChange} />
</FormControl> </FormControl>
<FormDescription>Ensure the bucket has versioning and lifecycle rules as needed.</FormDescription> <FormDescription>
Ensure the bucket has versioning and lifecycle rules as needed.
</FormDescription>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -353,7 +356,9 @@ export const VolumeBackupsTabContent = ({ volume }: Props) => {
<FormControl> <FormControl>
<Input placeholder="volume-name/backups" value={field.value} onChange={field.onChange} /> <Input placeholder="volume-name/backups" value={field.value} onChange={field.onChange} />
</FormControl> </FormControl>
<FormDescription>Backups will be stored under this key prefix inside the bucket.</FormDescription> <FormDescription>
Backups will be stored under this key prefix inside the bucket.
</FormDescription>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
@@ -366,7 +371,9 @@ export const VolumeBackupsTabContent = ({ volume }: Props) => {
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle>SFTP target</CardTitle> <CardTitle>SFTP target</CardTitle>
<CardDescription>Connect to a remote host that will receive encrypted backup archives.</CardDescription> <CardDescription>
Connect to a remote host that will receive encrypted backup archives.
</CardDescription>
</CardHeader> </CardHeader>
<CardContent className="grid gap-4 md:grid-cols-2"> <CardContent className="grid gap-4 md:grid-cols-2">
<FormField <FormField
@@ -586,5 +593,20 @@ export const VolumeBackupsTabContent = ({ volume }: Props) => {
</CardContent> </CardContent>
</Card> </Card>
</div> </div>
<div className="pointer-events-auto absolute inset-0 z-20 flex cursor-not-allowed select-none flex-col items-center justify-center gap-6 bg-gradient-to-br from-background/95 via-background/80 to-background/40 px-6 text-center backdrop-blur-x">
<div className="inline-flex items-center gap-2 rounded-full border border-muted-foreground/30 bg-muted/40 px-4 py-1.5 text-xs font-semibold uppercase tracking-[0.35em] text-muted-foreground">
<span className="tracking-[0.2em]">Preview</span>
</div>
<div className="max-w-md space-y-3 text-balance">
<h3 className="text-2xl font-semibold">Automated backups are coming soon</h3>
<p className="text-sm text-muted-foreground">
We&apos;re working hard to bring robust backup and snapshot capabilities to Ironmount.
</p>
</div>
<div className="rounded-xl border border-dashed border-muted-foreground/30 bg-background/70 px-4 py-2 text-xs text-muted-foreground">
Coming soon stay tuned!
</div>
</div>
</div>
); );
}; };

View File

@@ -19,7 +19,7 @@ export const VolumeInfoTabContent = ({ volume, statfs }: Props) => {
<div className="lg:row-span-1"> <div className="lg:row-span-1">
<HealthchecksCard volume={volume} /> <HealthchecksCard volume={volume} />
</div> </div>
<div className=""> <div>
<StorageChart statfs={statfs} /> <StorageChart statfs={statfs} />
</div> </div>
</div> </div>

View File

@@ -80,13 +80,8 @@ const mount = async (config: BackendConfig, path: string) => {
} }
logger.error("Error mounting WebDAV volume", { error: errorMsg }); logger.error("Error mounting WebDAV volume", { error: errorMsg });
if (errorMsg.includes("No such device")) {
return { if (errorMsg.includes("option") && errorMsg.includes("requires argument")) {
status: BACKEND_STATUS.error,
error:
"WebDAV filesystem not supported. Please ensure davfs2 is properly installed and the kernel module is loaded.",
};
} else if (errorMsg.includes("option") && errorMsg.includes("requires argument")) {
return { return {
status: BACKEND_STATUS.error, status: BACKEND_STATUS.error,
error: "Invalid mount options. Please check your WebDAV server configuration.", error: "Invalid mount options. Please check your WebDAV server configuration.",