diff --git a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx index 34588add..6e8145f5 100644 --- a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx @@ -17,12 +17,13 @@ export type Props = { className?: string, ref?: MutableRefObject playlist?: boolean, - filter: MapFilter - onChange?: (filter: MapFilter) => void - onApply?: (filter: MapFilter) => void + filter: MapFilter, + onChange?: (filter: MapFilter) => void, + onApply?: (filter: MapFilter) => void, + onClose?: (filter: MapFilter) => void } -export function FilterPanel({className, ref, playlist = false, filter, onChange, onApply}: Props) { +export function FilterPanel({className, ref, playlist = false, filter, onChange, onApply, onClose}: Props) { const t = useTranslation(); @@ -148,6 +149,12 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange, onChange(newFilter); } + const handleApply = () => { + onApply(filter); + setHaveChanged(() => false); + onClose?.(filter); + } + return !playlist ? (
@@ -190,7 +197,7 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange,
{onApply && (
- {e.preventDefault(); onApply(filter); setHaveChanged(() => false)}}/> + {haveChanged &&
}
)} diff --git a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx index 8a1d9789..1f40de6e 100644 --- a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx @@ -28,6 +28,7 @@ export const DownloadMapsModal: ModalComponent = ({data}) => { const currentDownload = useObservable(mapsDownloader.currentMapDownload$); const mapsInQueue = useObservable(mapsDownloader.mapsInQueue$); const t = useTranslation(); + const filterContainerRef = useRef(null); const [filter, setFilter] = useState({}); const [query, setQuery] = useState(""); const [maps, setMaps] = useState([]); @@ -156,8 +157,8 @@ export const DownloadMapsModal: ModalComponent = ({data}) => { return (
{e.preventDefault(); handleSearch()}}>
- - + + filterContainerRef.current.close()}/> setQuery(e.target.value)}/> {e.preventDefault(); handleSearch()}}/> diff --git a/src/renderer/components/shared/bsm-dropdown-button.component.tsx b/src/renderer/components/shared/bsm-dropdown-button.component.tsx index 6c067286..15ade593 100644 --- a/src/renderer/components/shared/bsm-dropdown-button.component.tsx +++ b/src/renderer/components/shared/bsm-dropdown-button.component.tsx @@ -1,4 +1,4 @@ -import { useRef, useState } from "react" +import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "react" import { BsmIconType, BsmIcon } from "../svgs/bsm-icon.component" import { BsmButton } from "./bsm-button.component" import { useTranslation } from "renderer/hooks/use-translation.hook" @@ -17,30 +17,42 @@ type Props = { menuTranslationY?: string|number children?: JSX.Element, text?: string, - textClassName?: string } -export function BsmDropdownButton({className, items, align, withBar = true, icon = "settings", buttonClassName, menuTranslationY, children, text, textClassName}: Props) { +export const BsmDropdownButton = forwardRef(({className, items, align, withBar = true, icon = "settings", buttonClassName, menuTranslationY, children, text}: Props, fowardRed) => { const [expanded, setExpanded] = useState(false) const t = useTranslation(); - const ref = useRef(null) + const ref = useRef(fowardRed) useClickOutside(ref, () => setExpanded(false)); + useImperativeHandle(fowardRed, () => ({ + close(){ + setExpanded(() => false); + }, + open(){ + setExpanded(() => true); + } + }), + [], + ) + + const defaultButtonClassName = "relative z-[1] p-1 rounded-md text-inherit w-full h-full shadow-md shadow-black" const handleClickOutside = () => { - if(children){ return; } - setExpanded(false); + if(children){ return; } + setExpanded(false); } const alignClass = (() => { - if(align === "center"){ return "right-1/2 origin-top-right translate-x-[50%]" } - if(align === "left"){ return "left-0 origin-top-left"; } - return "right-0 origin-top-right"; + if(align === "center"){ return "right-1/2 origin-top-right translate-x-[50%]" } + if(align === "left"){ return "left-0 origin-top-left"; } + return "right-0 origin-top-right"; })() return ( + // @ts-ignore
setExpanded(!expanded)} className={buttonClassName ?? defaultButtonClassName} icon={icon} active={expanded} onClickOutside={handleClickOutside} withBar={withBar} text={text}/>
@@ -60,4 +72,4 @@ export function BsmDropdownButton({className, items, align, withBar = true, icon )}
) -} +})