Complete drag-to-create event functionality with proper timezone handling

Integrate drag-to-create functionality with the full event creation pipeline:

- Connect WeekView drag events to CreateEventModal via callback chain
- Add event creation request callback through Calendar → RouteHandler → App
- Implement proper timezone conversion throughout the entire flow
- Fix pixels_to_time calculation (1px = 1 minute, not complex formula)
- Add initial_start_time/initial_end_time props to CreateEventModal
- Convert local times to UTC in both event creation and update functions
- Ensure modal displays correct local times while backend receives UTC
- Support both temporary drag events and real server events in modal

The complete flow now works: drag selection → modal with correct times →
proper UTC conversion → backend storage → correct display in calendar.

🤖 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:33:14 -04:00
parent 53815c4814
commit 1c0140292f
5 changed files with 120 additions and 18 deletions

View File

@@ -24,6 +24,8 @@ pub struct RouteHandlerProps {
pub on_calendar_context_menu: Option<Callback<(web_sys::MouseEvent, chrono::NaiveDate)>>,
#[prop_or_default]
pub view: ViewMode,
#[prop_or_default]
pub on_create_event_request: Option<Callback<crate::components::EventCreationData>>,
}
#[function_component(RouteHandler)]
@@ -34,6 +36,7 @@ pub fn route_handler(props: &RouteHandlerProps) -> Html {
let on_event_context_menu = props.on_event_context_menu.clone();
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();
html! {
<Switch<Route> render={move |route| {
@@ -43,6 +46,7 @@ pub fn route_handler(props: &RouteHandlerProps) -> Html {
let on_event_context_menu = on_event_context_menu.clone();
let on_calendar_context_menu = on_calendar_context_menu.clone();
let view = view.clone();
let on_create_event_request = on_create_event_request.clone();
match route {
Route::Home => {
@@ -67,6 +71,7 @@ pub fn route_handler(props: &RouteHandlerProps) -> Html {
on_event_context_menu={on_event_context_menu}
on_calendar_context_menu={on_calendar_context_menu}
view={view}
on_create_event_request={on_create_event_request}
/>
}
} else {
@@ -87,6 +92,8 @@ pub struct CalendarViewProps {
pub on_calendar_context_menu: Option<Callback<(web_sys::MouseEvent, chrono::NaiveDate)>>,
#[prop_or_default]
pub view: ViewMode,
#[prop_or_default]
pub on_create_event_request: Option<Callback<crate::components::EventCreationData>>,
}
use gloo_storage::{LocalStorage, Storage};
@@ -246,6 +253,7 @@ pub fn calendar_view(props: &CalendarViewProps) -> Html {
on_event_context_menu={props.on_event_context_menu.clone()}
on_calendar_context_menu={props.on_calendar_context_menu.clone()}
view={props.view.clone()}
on_create_event_request={props.on_create_event_request.clone()}
/>
</div>
}
@@ -259,6 +267,7 @@ pub fn calendar_view(props: &CalendarViewProps) -> Html {
on_event_context_menu={props.on_event_context_menu.clone()}
on_calendar_context_menu={props.on_calendar_context_menu.clone()}
view={props.view.clone()}
on_create_event_request={props.on_create_event_request.clone()}
/>
}
}