popover_menus: Keep element click handlers self-contained.

Hide the popover explicitly inside the event handler of the element.
Also, stop propagating events outside the popover. We add
`navigate_and_close_popover` class to links inside popovers
which don't have any click handler and do the same for them.
This commit is contained in:
Aman Agrawal 2022-12-04 05:46:40 +00:00 committed by Tim Abbott
parent 95224d680f
commit 0b9ef0dcf6
2 changed files with 24 additions and 6 deletions

View File

@ -52,7 +52,18 @@ export function any_active() {
} }
function on_show_prep(instance) { function on_show_prep(instance) {
$(instance.popper).one("click", instance.hide); $(instance.popper).on("click", (e) => {
// Popover is not hidden on click inside it unless the click handler for the
// element explicitly hides the popover when handling the event.
// `stopPropagation` is required here to avoid global click handlers from
// being triggered.
e.stopPropagation();
});
$(instance.popper).one("click", ".navigate_and_close_popover", (e) => {
// Handler for links inside popover which don't need a special click handler.
e.stopPropagation();
instance.hide();
});
popovers.hide_all_except_sidebars(instance); popovers.hide_all_except_sidebars(instance);
} }
@ -99,13 +110,18 @@ export function initialize() {
), ),
); );
compose_mobile_button_popover_displayed = true; compose_mobile_button_popover_displayed = true;
},
onMount(instance) {
const $popper = $(instance.popper); const $popper = $(instance.popper);
$popper.one("click", ".compose_mobile_stream_button", () => { $popper.one("click", ".compose_mobile_stream_button", (e) => {
compose_actions.start("stream", {trigger: "new topic button"}); compose_actions.start("stream", {trigger: "new topic button"});
e.stopPropagation();
instance.hide();
}); });
$popper.one("click", ".compose_mobile_private_button", () => { $popper.one("click", ".compose_mobile_private_button", (e) => {
compose_actions.start("private"); compose_actions.start("private");
e.stopPropagation();
instance.hide();
}); });
}, },
onHidden(instance) { onHidden(instance) {
@ -174,6 +190,8 @@ export function initialize() {
url: "/json/settings", url: "/json/settings",
data: {enter_sends: selected_behaviour}, data: {enter_sends: selected_behaviour},
}); });
e.stopPropagation();
instance.hide();
}); });
}, },
onHidden(instance) { onHidden(instance) {

View File

@ -1,11 +1,11 @@
<ul class="nav nav-list"> <ul class="nav nav-list">
<li> <li>
<a href="#streams/all"> <a href="#streams/all" class="navigate_and_close_popover">
{{t "Browse streams" }} {{t "Browse streams" }}
</a> </a>
</li> </li>
<li> <li>
<a href="#streams/new"> <a href="#streams/new" class="navigate_and_close_popover">
{{t "Create a stream" }} {{t "Create a stream" }}
</a> </a>
</li> </li>