From aada49e548c7cef430d359119c1113c7716ac427 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 5 Sep 2025 16:02:35 +0300 Subject: [PATCH] chore(react/collections/calendar): get calendar to render --- .../src/widgets/collections/NoteList.tsx | 3 ++ .../widgets/collections/calendar/calendar.tsx | 29 +++++++++++++ .../widgets/collections/calendar/index.tsx | 42 +++++++++++++++++++ .../src/widgets/view_widgets/calendar_view.ts | 14 ------- 4 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 apps/client/src/widgets/collections/calendar/calendar.tsx create mode 100644 apps/client/src/widgets/collections/calendar/index.tsx diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index f19d983c8..a963c50ef 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -6,6 +6,7 @@ import { ListView, GridView } from "./legacy/ListOrGridView"; import { useEffect, useMemo, useRef, useState } from "preact/hooks"; import GeoView from "./geomap"; import ViewModeStorage from "../view_widgets/view_mode_storage"; +import CalendarView from "./calendar"; interface NoteListProps { note?: FNote | null; @@ -82,6 +83,8 @@ function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps< return ; case "geoMap": return ; + case "calendar": + return } } diff --git a/apps/client/src/widgets/collections/calendar/calendar.tsx b/apps/client/src/widgets/collections/calendar/calendar.tsx new file mode 100644 index 000000000..b036a7bdd --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/calendar.tsx @@ -0,0 +1,29 @@ +import { useEffect, useRef } from "preact/hooks"; +import { Calendar as FullCalendar, PluginDef } from "@fullcalendar/core"; + +interface CalendarProps { + view: string; + tabIndex?: number; + plugins: PluginDef[]; +} + +export default function Calendar({ tabIndex, view, plugins }: CalendarProps) { + const calendarRef = useRef(); + const containerRef = useRef(null); + + useEffect(() => { + if (!containerRef.current) return; + + const calendar = new FullCalendar(containerRef.current, { + initialView: view, + plugins: plugins + }); + calendar.render(); + + return () => calendar.destroy(); + }, [ containerRef ]); + + return ( +
+ ); +} diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx new file mode 100644 index 000000000..93ec300df --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -0,0 +1,42 @@ +import { PluginDef } from "@fullcalendar/core/index.js"; +import { ViewModeProps } from "../interface"; +import Calendar from "./calendar"; +import { useEffect, useState } from "preact/hooks"; + +interface CalendarViewData { + +} + +export default function CalendarView({ note, noteIds }: ViewModeProps) { + const plugins = usePlugins(false, false); + + return (plugins && + + ); +} + +function usePlugins(isEditable: boolean, isCalendarRoot: boolean) { + const [ plugins, setPlugins ] = useState(); + + useEffect(() => { + async function loadPlugins() { + const plugins: PluginDef[] = []; + plugins.push((await import("@fullcalendar/daygrid")).default); + plugins.push((await import("@fullcalendar/timegrid")).default); + plugins.push((await import("@fullcalendar/list")).default); + plugins.push((await import("@fullcalendar/multimonth")).default); + if (isEditable || isCalendarRoot) { + plugins.push((await import("@fullcalendar/interaction")).default); + } + setPlugins(plugins); + } + + loadPlugins(); + }, [ isEditable, isCalendarRoot ]); + + return plugins; +} diff --git a/apps/client/src/widgets/view_widgets/calendar_view.ts b/apps/client/src/widgets/view_widgets/calendar_view.ts index ff32474f1..1befd1bb5 100644 --- a/apps/client/src/widgets/view_widgets/calendar_view.ts +++ b/apps/client/src/widgets/view_widgets/calendar_view.ts @@ -98,9 +98,6 @@ const TPL = /*html*/` overflow: hidden; } - -
-
`; @@ -148,14 +145,6 @@ export default class CalendarView extends ViewMode<{}> { const isEditable = !this.isCalendarRoot; const { Calendar } = await import("@fullcalendar/core"); - const plugins: PluginDef[] = []; - plugins.push((await import("@fullcalendar/daygrid")).default); - plugins.push((await import("@fullcalendar/timegrid")).default); - plugins.push((await import("@fullcalendar/list")).default); - plugins.push((await import("@fullcalendar/multimonth")).default); - if (isEditable || this.isCalendarRoot) { - plugins.push((await import("@fullcalendar/interaction")).default); - } let eventBuilder: EventSourceFunc; if (!this.isCalendarRoot) { @@ -165,7 +154,6 @@ export default class CalendarView extends ViewMode<{}> { } // Parse user's initial view, if valid. - let initialView = "dayGridMonth"; const userInitialView = this.parentNote.getLabelValue("calendar:view"); if (userInitialView && CALENDAR_VIEWS.includes(userInitialView)) { initialView = userInitialView; @@ -253,8 +241,6 @@ export default class CalendarView extends ViewMode<{}> { end: `${CALENDAR_VIEWS.join(",")} today prev,next` } }); - calendar.render(); - this.calendar = calendar; new ResizeObserver(() => calendar.updateSize()) .observe(this.$calendarContainer[0]);