mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-04 05:28:59 +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