import { Dispatch, StateUpdater, useEffect, useMemo, useState } from "preact/hooks"; import FNote from "../../entities/fnote"; import { LaunchBarDropdownButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; import { Dayjs, dayjs } from "@triliumnext/commons"; import appContext from "../../components/app_context"; import "./CalendarWidget.css"; import Calendar from "./Calendar"; import ActionButton from "../react/ActionButton"; import { t } from "../../services/i18n"; import FormDropdownList from "../react/FormDropdownList"; import FormTextBox from "../react/FormTextBox"; const MONTHS = [ t("calendar.january"), t("calendar.february"), t("calendar.march"), t("calendar.april"), t("calendar.may"), t("calendar.june"), t("calendar.july"), t("calendar.august"), t("calendar.september"), t("calendar.october"), t("calendar.november"), t("calendar.december") ]; export default function CalendarWidget({ launcherNote }: { launcherNote: FNote }) { const { title, icon } = useLauncherIconAndTitle(launcherNote); const [ date, setDate ] = useState(); return ( { const dateNote = appContext.tabManager.getActiveContextNote()?.getOwnedLabelValue("dateNote"); const activeDate = dateNote ? dayjs(`${dateNote}T12:00:00`) : null; const todaysDate = dayjs(); const date = dayjs(activeDate || todaysDate).startOf('month'); setDate(date); }} dropdownOptions={{ autoClose: "outside" }} > {date &&
}
) } interface CalendarHeaderProps { date: Dayjs; setDate: Dispatch>; } function CalendarHeader(props: CalendarHeaderProps) { return (
) } function CalendarMonthSelector({ date, setDate }: CalendarHeaderProps) { const months = useMemo(() => ( Array.from(MONTHS.entries().map(([ index, text ]) => ({ index: index.toString(), text }))) ), []); return (
{ }} buttonProps={{ "data-calendar-input": "month" }} />
); } function CalendarYearSelector({ date, setDate }: CalendarHeaderProps) { return (
{ const year = parseInt(newValue, 10); if (!Number.isNaN(year)) { setDate(date.set("year", year)); } }} data-calendar-input="year" />
) } function AdjustDateButton({ date, setDate, unit, direction }: CalendarHeaderProps & { direction: "prev" | "next", unit: "month" | "year" }) { return ( { e.stopPropagation(); const newDate = direction === "prev" ? date.subtract(1, unit) : date.add(1, unit); setDate(newDate); }} /> ) }