mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
refactor: coming soon backups
This commit is contained in:
@@ -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'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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
Reference in New Issue
Block a user