Filip Wiesner
03/26/2025, 8:34 PMAdvancedPopover
but I doesn't seem to support it out of the box. Am I missing some strategy?Filip Wiesner
03/26/2025, 8:35 PMS.
03/26/2025, 8:57 PMFilip Wiesner
03/26/2025, 9:10 PMS.
03/26/2025, 9:13 PMDavid Herman
03/26/2025, 9:13 PMgit clone <https://github.com/varabyte/kobweb>
• kobweb run playground/site
• Go to the WIDGETS tabDavid Herman
03/26/2025, 9:14 PMDavid Herman
03/26/2025, 9:14 PMDavid Herman
03/26/2025, 9:15 PMFilip Wiesner
03/26/2025, 9:55 PMDisposableEffect(Unit) {
val callback: (Event) -> Unit = { popoverStrategy.isOpen = false }
document.addEventListener("click", callback)
onDispose { document.removeEventListener("click", callback) }
}
David Herman
03/26/2025, 9:58 PMFilip Wiesner
03/26/2025, 9:59 PMDavid Herman
03/26/2025, 9:59 PMS.
03/26/2025, 9:59 PMDavid Herman
03/26/2025, 9:59 PMFilip Wiesner
03/26/2025, 10:00 PMDavid Herman
03/26/2025, 10:00 PMFilip Wiesner
03/26/2025, 10:01 PMFilip Wiesner
03/26/2025, 10:03 PMFilip Wiesner
03/26/2025, 10:07 PMopenCloseStrategy
. Only after a while I figured out I also need to override keepOpenStrategy
to be never()
. I thought that something named "open close" should be all I need to control opening and closing.
So take it as API feedback but maybe I am just dumb 😄David Herman
03/26/2025, 10:20 PMkeepOpenStrategy
with never
worked though. It's been a while since I've looked at that code.S.
03/26/2025, 10:20 PMref = disposableRef {
onDispose {
openCloseStrategy.isOpen = false
}
}
Filip Wiesner
03/28/2025, 6:46 AM@Composable
fun DismissablePopover(
isVisible: Boolean,
onDismiss: () -> Unit,
target: ElementTarget = ElementTarget.PreviousSibling,
placementStrategy: PopupPlacementStrategy = PopupPlacementStrategy.of(PopupPlacement.Bottom),
content: @Composable PopupScope.() -> Unit,
) {
val popoverStrategy = remember { OpenClosePopupStrategy.manual() }
SideEffect { popoverStrategy.isOpen = isVisible }
DisposableEffect(Unit) {
val callback: (Event) -> Unit = { onDismiss() }
document.addEventListener("click", callback)
onDispose { document.removeEventListener("click", callback) }
}
AdvancedPopover(
target = target,
placementStrategy = placementStrategy,
openCloseStrategy = popoverStrategy,
keepOpenStrategy = remember { KeepPopupOpenStrategy.never() },
ref = disposableRef { onDispose { onDismiss() } },
content = content,
)
}