Files
2026-02-17 19:29:10 +01:00

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>
)}
/>
)}
</>
);
};