Refactor create_event_modal into modular components
- Split massive 27K line modal into focused components - Created event_form module with 6 tab components: * BasicDetailsTab - main event info with recurrence options properly positioned * AdvancedTab - status, privacy, priority * PeopleTab - organizer and attendees * CategoriesTab - event categories * LocationTab - location information * RemindersTab - reminder settings - Added shared types and data structures - Created new CreateEventModalV2 using modular architecture - Recurrence options now positioned directly after repeat/reminder pickers 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
63
frontend/src/components/event_form/people.rs
Normal file
63
frontend/src/components/event_form/people.rs
Normal file
@@ -0,0 +1,63 @@
|
||||
use super::types::*;
|
||||
use wasm_bindgen::JsCast;
|
||||
use web_sys::{HtmlInputElement, HtmlTextAreaElement};
|
||||
use yew::prelude::*;
|
||||
|
||||
#[function_component(PeopleTab)]
|
||||
pub fn people_tab(props: &TabProps) -> Html {
|
||||
let data = &props.data;
|
||||
|
||||
let on_organizer_input = {
|
||||
let data = data.clone();
|
||||
Callback::from(move |e: InputEvent| {
|
||||
if let Some(target) = e.target() {
|
||||
if let Ok(input) = target.dyn_into::<HtmlInputElement>() {
|
||||
let mut event_data = (*data).clone();
|
||||
event_data.organizer = input.value();
|
||||
data.set(event_data);
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
let on_attendees_input = {
|
||||
let data = data.clone();
|
||||
Callback::from(move |e: InputEvent| {
|
||||
if let Some(target) = e.target() {
|
||||
if let Ok(textarea) = target.dyn_into::<HtmlTextAreaElement>() {
|
||||
let mut event_data = (*data).clone();
|
||||
event_data.attendees = textarea.value();
|
||||
data.set(event_data);
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
html! {
|
||||
<div class="tab-panel">
|
||||
<div class="form-group">
|
||||
<label for="event-organizer">{"Organizer"}</label>
|
||||
<input
|
||||
type="text"
|
||||
id="event-organizer"
|
||||
class="form-input"
|
||||
value={data.organizer.clone()}
|
||||
oninput={on_organizer_input}
|
||||
placeholder="Event organizer"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="event-attendees">{"Attendees"}</label>
|
||||
<textarea
|
||||
id="event-attendees"
|
||||
class="form-input"
|
||||
value={data.attendees.clone()}
|
||||
oninput={on_attendees_input}
|
||||
placeholder="Add attendees (one per line)"
|
||||
rows="4"
|
||||
></textarea>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user