diff --git a/apps/client/src/widgets/launch_bar/CalendarWidget.tsx b/apps/client/src/widgets/launch_bar/CalendarWidget.tsx index 1bdeba620..9a89b2507 100644 --- a/apps/client/src/widgets/launch_bar/CalendarWidget.tsx +++ b/apps/client/src/widgets/launch_bar/CalendarWidget.tsx @@ -1,4 +1,4 @@ -import { Dispatch, StateUpdater, useEffect, useMemo, useState } from "preact/hooks"; +import { Dispatch, StateUpdater, useEffect, useMemo, useRef, useState } from "preact/hooks"; import FNote from "../../entities/fnote"; import { LaunchBarDropdownButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; import { Dayjs, dayjs } from "@triliumnext/commons"; @@ -11,6 +11,7 @@ import FormDropdownList from "../react/FormDropdownList"; import FormTextBox from "../react/FormTextBox"; import toast from "../../services/toast"; import date_notes from "../../services/date_notes"; +import { Dropdown } from "bootstrap"; const MONTHS = [ t("calendar.january"), @@ -31,6 +32,7 @@ export default function CalendarWidget({ launcherNote }: { launcherNote: FNote } const { title, icon } = useLauncherIconAndTitle(launcherNote); const [ calendarArgs, setCalendarArgs ] = useState>(); const [ date, setDate ] = useState(); + const dropdownRef = useRef(null); return ( & { icon: string }) { +export function LaunchBarDropdownButton({ children, icon, ...props }: Pick & { icon: string }) { return ( , "id" | "c onShown?: () => void; onHidden?: () => void; dropdownOptions?: Partial; + dropdownRef?: MutableRef; } -export default function Dropdown({ id, className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, hideToggleArrow, iconAction, disabled, noSelectButtonStyle, noDropdownListStyle, forceShown, onShown: externalOnShown, onHidden: externalOnHidden, dropdownOptions, buttonProps }: DropdownProps) { - const dropdownRef = useRef(null); +export default function Dropdown({ id, className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, hideToggleArrow, iconAction, disabled, noSelectButtonStyle, noDropdownListStyle, forceShown, onShown: externalOnShown, onHidden: externalOnHidden, dropdownOptions, buttonProps, dropdownRef }: DropdownProps) { + const containerRef = useRef(null); const triggerRef = useRef(null); const [ shown, setShown ] = useState(false); @@ -39,6 +40,9 @@ export default function Dropdown({ id, className, buttonClassName, isStatic, chi if (!triggerRef.current) return; const dropdown = BootstrapDropdown.getOrCreateInstance(triggerRef.current, dropdownOptions); + if (dropdownRef) { + dropdownRef.current = dropdown; + } if (forceShown) { dropdown.show(); setShown(true); @@ -57,9 +61,9 @@ export default function Dropdown({ id, className, buttonClassName, isStatic, chi }, []); useEffect(() => { - if (!dropdownRef.current) return; + if (!containerRef.current) return; - const $dropdown = $(dropdownRef.current); + const $dropdown = $(containerRef.current); $dropdown.on("show.bs.dropdown", onShown); $dropdown.on("hide.bs.dropdown", onHidden); @@ -73,7 +77,7 @@ export default function Dropdown({ id, className, buttonClassName, isStatic, chi const ariaId = useUniqueName("button"); return ( -
+