mirror of
https://github.com/zadam/trilium.git
synced 2025-11-01 12:09:02 +01:00
chore(react/collections/calendar): get calendar to render
This commit is contained in:
parent
c79dd43105
commit
aada49e548
@ -6,6 +6,7 @@ import { ListView, GridView } from "./legacy/ListOrGridView";
|
|||||||
import { useEffect, useMemo, useRef, useState } from "preact/hooks";
|
import { useEffect, useMemo, useRef, useState } from "preact/hooks";
|
||||||
import GeoView from "./geomap";
|
import GeoView from "./geomap";
|
||||||
import ViewModeStorage from "../view_widgets/view_mode_storage";
|
import ViewModeStorage from "../view_widgets/view_mode_storage";
|
||||||
|
import CalendarView from "./calendar";
|
||||||
|
|
||||||
interface NoteListProps<T extends object> {
|
interface NoteListProps<T extends object> {
|
||||||
note?: FNote | null;
|
note?: FNote | null;
|
||||||
@ -82,6 +83,8 @@ function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps<
|
|||||||
return <GridView {...props} />;
|
return <GridView {...props} />;
|
||||||
case "geoMap":
|
case "geoMap":
|
||||||
return <GeoView {...props} />;
|
return <GeoView {...props} />;
|
||||||
|
case "calendar":
|
||||||
|
return <CalendarView {...props} />
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
29
apps/client/src/widgets/collections/calendar/calendar.tsx
Normal file
29
apps/client/src/widgets/collections/calendar/calendar.tsx
Normal file
@ -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<FullCalendar>();
|
||||||
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!containerRef.current) return;
|
||||||
|
|
||||||
|
const calendar = new FullCalendar(containerRef.current, {
|
||||||
|
initialView: view,
|
||||||
|
plugins: plugins
|
||||||
|
});
|
||||||
|
calendar.render();
|
||||||
|
|
||||||
|
return () => calendar.destroy();
|
||||||
|
}, [ containerRef ]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div ref={containerRef} className="calendar-container" tabIndex={tabIndex} />
|
||||||
|
);
|
||||||
|
}
|
||||||
42
apps/client/src/widgets/collections/calendar/index.tsx
Normal file
42
apps/client/src/widgets/collections/calendar/index.tsx
Normal file
@ -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<CalendarViewData>) {
|
||||||
|
const plugins = usePlugins(false, false);
|
||||||
|
|
||||||
|
return (plugins &&
|
||||||
|
<Calendar
|
||||||
|
plugins={plugins}
|
||||||
|
tabIndex={100}
|
||||||
|
view="dayGridMonth"
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function usePlugins(isEditable: boolean, isCalendarRoot: boolean) {
|
||||||
|
const [ plugins, setPlugins ] = useState<PluginDef[]>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@ -98,9 +98,6 @@ const TPL = /*html*/`
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="calendar-container" tabindex="100">
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@ -148,14 +145,6 @@ export default class CalendarView extends ViewMode<{}> {
|
|||||||
const isEditable = !this.isCalendarRoot;
|
const isEditable = !this.isCalendarRoot;
|
||||||
|
|
||||||
const { Calendar } = await import("@fullcalendar/core");
|
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;
|
let eventBuilder: EventSourceFunc;
|
||||||
if (!this.isCalendarRoot) {
|
if (!this.isCalendarRoot) {
|
||||||
@ -165,7 +154,6 @@ export default class CalendarView extends ViewMode<{}> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse user's initial view, if valid.
|
// Parse user's initial view, if valid.
|
||||||
let initialView = "dayGridMonth";
|
|
||||||
const userInitialView = this.parentNote.getLabelValue("calendar:view");
|
const userInitialView = this.parentNote.getLabelValue("calendar:view");
|
||||||
if (userInitialView && CALENDAR_VIEWS.includes(userInitialView)) {
|
if (userInitialView && CALENDAR_VIEWS.includes(userInitialView)) {
|
||||||
initialView = userInitialView;
|
initialView = userInitialView;
|
||||||
@ -253,8 +241,6 @@ export default class CalendarView extends ViewMode<{}> {
|
|||||||
end: `${CALENDAR_VIEWS.join(",")} today prev,next`
|
end: `${CALENDAR_VIEWS.join(",")} today prev,next`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
calendar.render();
|
|
||||||
this.calendar = calendar;
|
|
||||||
|
|
||||||
new ResizeObserver(() => calendar.updateSize())
|
new ResizeObserver(() => calendar.updateSize())
|
||||||
.observe(this.$calendarContainer[0]);
|
.observe(this.$calendarContainer[0]);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user