import { Dropdown as BootstrapDropdown } from "bootstrap"; import { ComponentChildren } from "preact"; import Icon from "./Icon"; import { useEffect, useMemo, useRef, type CSSProperties } from "preact/compat"; import "./FormList.css"; import { CommandNames } from "../../components/app_context"; interface FormListOpts { children: ComponentChildren; onSelect?: (value: string) => void; style?: CSSProperties; fullHeight?: boolean; } export default function FormList({ children, onSelect, style, fullHeight }: FormListOpts) { const wrapperRef = useRef(null); const triggerRef = useRef(null); useEffect(() => { if (!triggerRef.current || !wrapperRef.current) { return; } const $wrapperRef = $(wrapperRef.current); const dropdown = BootstrapDropdown.getOrCreateInstance(triggerRef.current); $wrapperRef.on("hide.bs.dropdown", (e) => e.preventDefault()); return () => { $wrapperRef.off("hide.bs.dropdown"); dropdown.dispose(); } }, [ triggerRef, wrapperRef ]); const builtinStyles = useMemo(() => { const style: CSSProperties = {}; if (fullHeight) { style.height = "100%"; style.overflow = "auto"; } return style; }, [ fullHeight ]); return (
); } export interface FormListBadge { className?: string; text: string; } interface FormListItemOpts { children: ComponentChildren; icon?: string; value?: string; title?: string; active?: boolean; badges?: FormListBadge[]; disabled?: boolean; checked?: boolean | null; selected?: boolean; onClick?: (e: MouseEvent) => void; triggerCommand?: CommandNames; description?: string; className?: string; rtl?: boolean; } export function FormListItem({ children, icon, value, title, active, badges, disabled, checked, onClick, description, selected, rtl, triggerCommand }: FormListItemOpts) { if (checked) { icon = "bx bx-check"; } return (  
{children} {badges && badges.map(({ className, text }) => ( {text} ))} {description &&
{description}
}
); } interface FormListHeaderOpts { text: string; } export function FormListHeader({ text }: FormListHeaderOpts) { return (
  • {text}
  • ) } export function FormDropdownDivider() { return
    ; }