use super::types::*; // Types are already imported from super::types::* use chrono::{Datelike, NaiveDate}; use wasm_bindgen::JsCast; use web_sys::{HtmlInputElement, HtmlSelectElement, HtmlTextAreaElement}; use yew::prelude::*; #[function_component(BasicDetailsTab)] pub fn basic_details_tab(props: &TabProps) -> Html { let data = &props.data; // Event handlers let on_title_input = { let data = data.clone(); Callback::from(move |e: InputEvent| { if let Some(target) = e.target() { if let Ok(input) = target.dyn_into::() { let mut event_data = (*data).clone(); event_data.title = input.value(); if !event_data.changed_fields.contains(&"title".to_string()) { event_data.changed_fields.push("title".to_string()); } data.set(event_data); } } }) }; let on_description_input = { let data = data.clone(); Callback::from(move |e: InputEvent| { if let Some(target) = e.target() { if let Ok(textarea) = target.dyn_into::() { let mut event_data = (*data).clone(); event_data.description = textarea.value(); data.set(event_data); } } }) }; let on_calendar_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(target) = e.target() { if let Ok(select) = target.dyn_into::() { let mut event_data = (*data).clone(); let value = select.value(); let new_calendar = if value.is_empty() { None } else { Some(value) }; if event_data.selected_calendar != new_calendar { event_data.selected_calendar = new_calendar; if !event_data.changed_fields.contains(&"selected_calendar".to_string()) { event_data.changed_fields.push("selected_calendar".to_string()); } } data.set(event_data); } } }) }; let on_all_day_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(target) = e.target() { if let Ok(input) = target.dyn_into::() { let mut event_data = (*data).clone(); event_data.all_day = input.checked(); data.set(event_data); } } }) }; let on_recurrence_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(target) = e.target() { if let Ok(select) = target.dyn_into::() { let mut event_data = (*data).clone(); event_data.recurrence = match select.value().as_str() { "daily" => RecurrenceType::Daily, "weekly" => RecurrenceType::Weekly, "monthly" => RecurrenceType::Monthly, "yearly" => RecurrenceType::Yearly, _ => RecurrenceType::None, }; // Reset recurrence-related fields when changing type event_data.recurrence_days = vec![false; 7]; event_data.recurrence_interval = 1; event_data.recurrence_until = None; event_data.recurrence_count = None; event_data.monthly_by_day = None; event_data.monthly_by_monthday = None; event_data.yearly_by_month = vec![false; 12]; data.set(event_data); } } }) }; let on_reminder_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(target) = e.target() { if let Ok(select) = target.dyn_into::() { let mut event_data = (*data).clone(); event_data.reminder = match select.value().as_str() { "15min" => ReminderType::Minutes15, "30min" => ReminderType::Minutes30, "1hour" => ReminderType::Hour1, "1day" => ReminderType::Day1, "2days" => ReminderType::Days2, "1week" => ReminderType::Week1, _ => ReminderType::None, }; data.set(event_data); } } }) }; let on_recurrence_interval_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { if let Ok(interval) = input.value().parse::() { let mut event_data = (*data).clone(); event_data.recurrence_interval = interval.max(1); data.set(event_data); } } }) }; let on_recurrence_until_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { let mut event_data = (*data).clone(); if input.value().is_empty() { event_data.recurrence_until = None; } else if let Ok(date) = NaiveDate::parse_from_str(&input.value(), "%Y-%m-%d") { event_data.recurrence_until = Some(date); } data.set(event_data); } }) }; let on_recurrence_count_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { let mut event_data = (*data).clone(); if input.value().is_empty() { event_data.recurrence_count = None; } else if let Ok(count) = input.value().parse::() { event_data.recurrence_count = Some(count.max(1)); } data.set(event_data); } }) }; let on_monthly_by_monthday_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { let mut event_data = (*data).clone(); if input.value().is_empty() { event_data.monthly_by_monthday = None; } else if let Ok(day) = input.value().parse::() { if day >= 1 && day <= 31 { event_data.monthly_by_monthday = Some(day); event_data.monthly_by_day = None; // Clear the other option } } data.set(event_data); } }) }; let on_monthly_by_day_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(select) = e.target_dyn_into::() { let mut event_data = (*data).clone(); if select.value().is_empty() || select.value() == "none" { event_data.monthly_by_day = None; } else { event_data.monthly_by_day = Some(select.value()); event_data.monthly_by_monthday = None; // Clear the other option } data.set(event_data); } }) }; let on_weekday_change = { let data = data.clone(); move |day_index: usize| { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { let mut event_data = (*data).clone(); if day_index < event_data.recurrence_days.len() { event_data.recurrence_days[day_index] = input.checked(); data.set(event_data); } } }) } }; let on_yearly_month_change = { let data = data.clone(); move |month_index: usize| { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { let mut event_data = (*data).clone(); if month_index < event_data.yearly_by_month.len() { event_data.yearly_by_month[month_index] = input.checked(); data.set(event_data); } } }) } }; let on_start_date_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { if let Ok(date) = NaiveDate::parse_from_str(&input.value(), "%Y-%m-%d") { let mut event_data = (*data).clone(); event_data.start_date = date; data.set(event_data); } } }) }; let on_start_time_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { if let Ok(time) = chrono::NaiveTime::parse_from_str(&input.value(), "%H:%M") { let mut event_data = (*data).clone(); event_data.start_time = time; data.set(event_data); } } }) }; let on_end_date_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { if let Ok(date) = NaiveDate::parse_from_str(&input.value(), "%Y-%m-%d") { let mut event_data = (*data).clone(); event_data.end_date = date; data.set(event_data); } } }) }; let on_end_time_change = { let data = data.clone(); Callback::from(move |e: Event| { if let Some(input) = e.target_dyn_into::() { if let Ok(time) = chrono::NaiveTime::parse_from_str(&input.value(), "%H:%M") { let mut event_data = (*data).clone(); event_data.end_time = time; data.set(event_data); } } }) }; let on_location_input = { let data = data.clone(); Callback::from(move |e: InputEvent| { if let Some(target) = e.target() { if let Ok(input) = target.dyn_into::() { let mut event_data = (*data).clone(); event_data.location = input.value(); data.set(event_data); } } }) }; html! {
// RECURRENCE OPTIONS GO RIGHT HERE - directly below repeat/reminder! if matches!(data.recurrence, RecurrenceType::Weekly) {
{ ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] .iter() .enumerate() .map(|(i, day)| { let day_checked = data.recurrence_days.get(i).cloned().unwrap_or(false); let on_change = on_weekday_change(i); html! { } }) .collect::() }
} if !matches!(data.recurrence, RecurrenceType::None) {
{match data.recurrence { RecurrenceType::Daily => if data.recurrence_interval == 1 { "day" } else { "days" }, RecurrenceType::Weekly => if data.recurrence_interval == 1 { "week" } else { "weeks" }, RecurrenceType::Monthly => if data.recurrence_interval == 1 { "month" } else { "months" }, RecurrenceType::Yearly => if data.recurrence_interval == 1 { "year" } else { "years" }, RecurrenceType::None => "", }}
{"occurrences"}
// Monthly specific options if matches!(data.recurrence, RecurrenceType::Monthly) {
} // Yearly specific options if matches!(data.recurrence, RecurrenceType::Yearly) {
{ ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] .iter() .enumerate() .map(|(i, month)| { let month_checked = data.yearly_by_month.get(i).cloned().unwrap_or(false); let on_change = on_yearly_month_change(i); html! { } }) .collect::() }
}
} // Date and time fields go here AFTER recurrence options
if !data.all_day {
}
if !data.all_day {
}
} }