mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
User-selectable weekday start (Sunday/Monday) for review calendar (#12491)
This commit is contained in:
parent
c56e7e7c6c
commit
6addf4d88b
@ -521,7 +521,7 @@ function CalendarFilterButton({
|
|||||||
return (
|
return (
|
||||||
<Popover>
|
<Popover>
|
||||||
<PopoverTrigger asChild>{trigger}</PopoverTrigger>
|
<PopoverTrigger asChild>{trigger}</PopoverTrigger>
|
||||||
<PopoverContent>{content}</PopoverContent>
|
<PopoverContent className="w-auto">{content}</PopoverContent>
|
||||||
</Popover>
|
</Popover>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,9 @@ import { FaCircle } from "react-icons/fa";
|
|||||||
import { getUTCOffset } from "@/utils/dateUtil";
|
import { getUTCOffset } from "@/utils/dateUtil";
|
||||||
import { type DayContentProps } from "react-day-picker";
|
import { type DayContentProps } from "react-day-picker";
|
||||||
import { LAST_24_HOURS_KEY } from "@/types/filter";
|
import { LAST_24_HOURS_KEY } from "@/types/filter";
|
||||||
|
import { usePersistence } from "@/hooks/use-persistence";
|
||||||
|
|
||||||
|
type WeekStartsOnType = 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||||
|
|
||||||
type ReviewActivityCalendarProps = {
|
type ReviewActivityCalendarProps = {
|
||||||
reviewSummary?: ReviewSummary;
|
reviewSummary?: ReviewSummary;
|
||||||
@ -16,6 +19,8 @@ export default function ReviewActivityCalendar({
|
|||||||
selectedDay,
|
selectedDay,
|
||||||
onSelect,
|
onSelect,
|
||||||
}: ReviewActivityCalendarProps) {
|
}: ReviewActivityCalendarProps) {
|
||||||
|
const [weekStartsOn] = usePersistence("weekStartsOn", 0);
|
||||||
|
|
||||||
const disabledDates = useMemo(() => {
|
const disabledDates = useMemo(() => {
|
||||||
const tomorrow = new Date();
|
const tomorrow = new Date();
|
||||||
tomorrow.setHours(tomorrow.getHours() + 24, -1, 0, 0);
|
tomorrow.setHours(tomorrow.getHours() + 24, -1, 0, 0);
|
||||||
@ -72,6 +77,7 @@ export default function ReviewActivityCalendar({
|
|||||||
DayContent: ReviewActivityDay,
|
DayContent: ReviewActivityDay,
|
||||||
}}
|
}}
|
||||||
defaultMonth={selectedDay ?? new Date()}
|
defaultMonth={selectedDay ?? new Date()}
|
||||||
|
weekStartsOn={(weekStartsOn ?? 0) as WeekStartsOnType}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -109,6 +115,8 @@ export function TimezoneAwareCalendar({
|
|||||||
selectedDay,
|
selectedDay,
|
||||||
onSelect,
|
onSelect,
|
||||||
}: TimezoneAwareCalendarProps) {
|
}: TimezoneAwareCalendarProps) {
|
||||||
|
const [weekStartsOn] = usePersistence("weekStartsOn", 0);
|
||||||
|
|
||||||
const timezoneOffset = useMemo(
|
const timezoneOffset = useMemo(
|
||||||
() =>
|
() =>
|
||||||
timezone ? Math.round(getUTCOffset(new Date(), timezone)) : undefined,
|
timezone ? Math.round(getUTCOffset(new Date(), timezone)) : undefined,
|
||||||
@ -162,6 +170,7 @@ export function TimezoneAwareCalendar({
|
|||||||
selected={selectedDay}
|
selected={selectedDay}
|
||||||
onSelect={onSelect}
|
onSelect={onSelect}
|
||||||
defaultMonth={selectedDay ?? new Date()}
|
defaultMonth={selectedDay ?? new Date()}
|
||||||
|
weekStartsOn={(weekStartsOn ?? 0) as WeekStartsOnType}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import {
|
|||||||
} from "../../components/ui/select";
|
} from "../../components/ui/select";
|
||||||
|
|
||||||
const PLAYBACK_RATE_DEFAULT = isSafari ? [0.5, 1, 2] : [0.5, 1, 2, 4, 8, 16];
|
const PLAYBACK_RATE_DEFAULT = isSafari ? [0.5, 1, 2] : [0.5, 1, 2, 4, 8, 16];
|
||||||
|
const WEEK_STARTS_ON = ["Sunday", "Monday"];
|
||||||
|
|
||||||
export default function GeneralSettingsView() {
|
export default function GeneralSettingsView() {
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
@ -53,6 +54,7 @@ export default function GeneralSettingsView() {
|
|||||||
|
|
||||||
const [autoLive, setAutoLive] = usePersistence("autoLiveView", true);
|
const [autoLive, setAutoLive] = usePersistence("autoLiveView", true);
|
||||||
const [playbackRate, setPlaybackRate] = usePersistence("playbackRate", 1);
|
const [playbackRate, setPlaybackRate] = usePersistence("playbackRate", 1);
|
||||||
|
const [weekStartsOn, setWeekStartsOn] = usePersistence("weekStartsOn", 0);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -142,6 +144,41 @@ export default function GeneralSettingsView() {
|
|||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<Separator className="my-2 flex bg-secondary" />
|
<Separator className="my-2 flex bg-secondary" />
|
||||||
|
|
||||||
|
<Heading as="h4" className="my-2">
|
||||||
|
Calendar
|
||||||
|
</Heading>
|
||||||
|
|
||||||
|
<div className="mt-2 space-y-6">
|
||||||
|
<div className="space-y-0.5">
|
||||||
|
<div className="text-md">First Weekday</div>
|
||||||
|
<div className="my-2 text-sm text-muted-foreground">
|
||||||
|
<p>The day that the weeks of the review calendar begin on.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Select
|
||||||
|
value={weekStartsOn?.toString()}
|
||||||
|
onValueChange={(value) => setWeekStartsOn(parseInt(value))}
|
||||||
|
>
|
||||||
|
<SelectTrigger className="w-32">
|
||||||
|
{WEEK_STARTS_ON[weekStartsOn ?? 0]}
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
{WEEK_STARTS_ON.map((day, index) => (
|
||||||
|
<SelectItem
|
||||||
|
key={index}
|
||||||
|
className="cursor-pointer"
|
||||||
|
value={index.toString()}
|
||||||
|
>
|
||||||
|
{day}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
<Separator className="my-2 flex bg-secondary" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user