mirror of
https://github.com/nicotsx/zerobyte.git
synced 2026-04-19 14:28:54 -04:00
138 lines
4.1 KiB
TypeScript
138 lines
4.1 KiB
TypeScript
import { CronInput } from "~/client/components/cron-input";
|
|
import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "~/client/components/ui/form";
|
|
import { Input } from "~/client/components/ui/input";
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/client/components/ui/select";
|
|
import { Button } from "~/client/components/ui/button";
|
|
import type { UseFormReturn } from "react-hook-form";
|
|
import type { InternalFormValues } from "./types";
|
|
import { weeklyDays } from "./types";
|
|
|
|
type FrequencySectionProps = {
|
|
form: UseFormReturn<InternalFormValues>;
|
|
frequency: string;
|
|
};
|
|
|
|
export const FrequencySection = ({ form, frequency }: FrequencySectionProps) => {
|
|
return (
|
|
<>
|
|
<FormField
|
|
control={form.control}
|
|
name="frequency"
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>Backup frequency</FormLabel>
|
|
<FormControl>
|
|
<Select {...field} onValueChange={field.onChange}>
|
|
<SelectTrigger>
|
|
<SelectValue placeholder="Select frequency" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="hourly">Hourly</SelectItem>
|
|
<SelectItem value="daily">Daily</SelectItem>
|
|
<SelectItem value="weekly">Weekly</SelectItem>
|
|
<SelectItem value="monthly">Specific days</SelectItem>
|
|
<SelectItem value="cron">Custom (Cron)</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</FormControl>
|
|
<FormDescription>Define how often snapshots should be taken.</FormDescription>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
|
|
{frequency === "cron" && (
|
|
<FormField
|
|
control={form.control}
|
|
name="cronExpression"
|
|
render={({ field, fieldState }) => (
|
|
<CronInput value={field.value || ""} onChange={field.onChange} error={fieldState.error?.message} />
|
|
)}
|
|
/>
|
|
)}
|
|
|
|
{frequency !== "hourly" && frequency !== "cron" && (
|
|
<FormField
|
|
control={form.control}
|
|
name="dailyTime"
|
|
render={({ field }) => (
|
|
<FormItem>
|
|
<FormLabel>Execution time</FormLabel>
|
|
<FormControl>
|
|
<Input type="time" {...field} />
|
|
</FormControl>
|
|
<FormDescription>Time of day when the backup will run.</FormDescription>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
)}
|
|
|
|
{frequency === "weekly" && (
|
|
<FormField
|
|
control={form.control}
|
|
name="weeklyDay"
|
|
render={({ field }) => (
|
|
<FormItem className="@medium:col-span-2">
|
|
<FormLabel>Execution day</FormLabel>
|
|
<FormControl>
|
|
<Select {...field} onValueChange={field.onChange}>
|
|
<SelectTrigger>
|
|
<SelectValue placeholder="Select a day" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{weeklyDays.map((day) => (
|
|
<SelectItem key={day.value} value={day.value}>
|
|
{day.label}
|
|
</SelectItem>
|
|
))}
|
|
</SelectContent>
|
|
</Select>
|
|
</FormControl>
|
|
<FormDescription>Choose which day of the week to run the backup.</FormDescription>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
)}
|
|
|
|
{frequency === "monthly" && (
|
|
<FormField
|
|
control={form.control}
|
|
name="monthlyDays"
|
|
render={({ field }) => (
|
|
<FormItem className="@medium:col-span-2">
|
|
<FormLabel>Days of the month</FormLabel>
|
|
<FormControl>
|
|
<div className="grid grid-cols-7 gap-4 w-max">
|
|
{Array.from({ length: 31 }, (_, i) => {
|
|
const day = (i + 1).toString();
|
|
const isSelected = field.value?.includes(day);
|
|
return (
|
|
<Button
|
|
type="button"
|
|
key={day}
|
|
variant={isSelected ? "primary" : "secondary"}
|
|
size="icon"
|
|
onClick={() => {
|
|
const current = field.value || [];
|
|
const next = isSelected ? current.filter((d) => d !== day) : [...current, day];
|
|
field.onChange(next);
|
|
}}
|
|
>
|
|
{day}
|
|
</Button>
|
|
);
|
|
})}
|
|
</div>
|
|
</FormControl>
|
|
<FormDescription>Select one or more days when the backup should run.</FormDescription>
|
|
<FormMessage />
|
|
</FormItem>
|
|
)}
|
|
/>
|
|
)}
|
|
</>
|
|
);
|
|
};
|