Fix context menu click-outside behavior to prevent underlying actions

When a context menu is open, clicking outside should only close the menu
without triggering underlying actions (like drag-to-create in week view).

Implementation:
- Enhanced global click handler to prevent default actions when menus are open
- Added context menu state propagation through component hierarchy
- Modified interactive components to check context menu state before acting
- Provides double protection at both global and component levels

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Connor Johnstone
2025-08-29 11:58:17 -04:00
parent edb216347d
commit 4fbef8a5dc
4 changed files with 42 additions and 1 deletions

View File

@@ -26,6 +26,8 @@ pub struct RouteHandlerProps {
pub view: ViewMode,
#[prop_or_default]
pub on_create_event_request: Option<Callback<crate::components::EventCreationData>>,
#[prop_or_default]
pub context_menus_open: bool,
}
#[function_component(RouteHandler)]
@@ -37,6 +39,7 @@ pub fn route_handler(props: &RouteHandlerProps) -> Html {
let on_calendar_context_menu = props.on_calendar_context_menu.clone();
let view = props.view.clone();
let on_create_event_request = props.on_create_event_request.clone();
let context_menus_open = props.context_menus_open;
html! {
<Switch<Route> render={move |route| {
@@ -47,6 +50,7 @@ pub fn route_handler(props: &RouteHandlerProps) -> Html {
let on_calendar_context_menu = on_calendar_context_menu.clone();
let view = view.clone();
let on_create_event_request = on_create_event_request.clone();
let context_menus_open = context_menus_open;
match route {
Route::Home => {
@@ -72,6 +76,7 @@ pub fn route_handler(props: &RouteHandlerProps) -> Html {
on_calendar_context_menu={on_calendar_context_menu}
view={view}
on_create_event_request={on_create_event_request}
context_menus_open={context_menus_open}
/>
}
} else {
@@ -94,6 +99,8 @@ pub struct CalendarViewProps {
pub view: ViewMode,
#[prop_or_default]
pub on_create_event_request: Option<Callback<crate::components::EventCreationData>>,
#[prop_or_default]
pub context_menus_open: bool,
}
use gloo_storage::{LocalStorage, Storage};
@@ -254,6 +261,7 @@ pub fn calendar_view(props: &CalendarViewProps) -> Html {
on_calendar_context_menu={props.on_calendar_context_menu.clone()}
view={props.view.clone()}
on_create_event_request={props.on_create_event_request.clone()}
context_menus_open={props.context_menus_open}
/>
</div>
}
@@ -268,6 +276,7 @@ pub fn calendar_view(props: &CalendarViewProps) -> Html {
on_calendar_context_menu={props.on_calendar_context_menu.clone()}
view={props.view.clone()}
on_create_event_request={props.on_create_event_request.clone()}
context_menus_open={props.context_menus_open}
/>
}
}