diff --git a/server/src/email_extract.rs b/server/src/email_extract.rs index ba3fe02..1cd1d87 100644 --- a/server/src/email_extract.rs +++ b/server/src/email_extract.rs @@ -1687,7 +1687,7 @@ pub fn render_ical_summary(ical_data: &str) -> Result { "DTSTART" => { dtstart = prop.value.as_deref(); if let Some(params) = &prop.params { - if let Some((k, values)) = params.iter().find(|(k, _)| k == "TZID") { + if let Some((_, values)) = params.iter().find(|(k, _)| k == "TZID") { if let Some(val) = values.get(0) { tzid = Some(val.clone()); } @@ -1716,8 +1716,13 @@ pub fn render_ical_summary(ical_data: &str) -> Result { .unwrap_or("UTC") .parse() .unwrap_or(chrono_tz::UTC); - let fallback = - tz.from_utc_datetime(&chrono::NaiveDateTime::from_timestamp_opt(0, 0).unwrap()); + let fallback = chrono::DateTime::::from_timestamp(0, 0) + .map(|dt| dt.with_timezone(&tz)) + .unwrap_or_else(|| { + tz.with_ymd_and_hms(1970, 1, 1, 0, 0, 0) + .single() + .unwrap_or_else(|| tz.timestamp_opt(0, 0).single().unwrap()) + }); let start = parse_ical_datetime_tz(dtstart, tz).unwrap_or(fallback); let end = dtend .and_then(|d| parse_ical_datetime_tz(d, tz)) @@ -1736,7 +1741,7 @@ pub fn render_ical_summary(ical_data: &str) -> Result { local_end.format("%-I:%M %p %a %b %e, %Y").to_string() }; let mut days = vec![]; - let mut d = start.date_naive(); + let d = start.date_naive(); let mut end_d = end.date_naive(); // Check for all-day event (DATE, not DATE-TIME) let allday = dtstart.len() == 8 && (dtend.map(|s| s.len() == 8).unwrap_or(false)); @@ -1833,67 +1838,6 @@ pub fn render_ical_summary(ical_data: &str) -> Result { Ok(summary_parts.join("
")) } -fn render_merged_calendar_table(event_days: &[NaiveDate]) -> String { - use chrono::Datelike; - let first_event = event_days.first().unwrap(); - let last_event = event_days.last().unwrap(); - let first_of_month = - NaiveDate::from_ymd_opt(first_event.year(), first_event.month(), 1).unwrap(); - let last_of_month = { - let next_month = if last_event.month() == 12 { - NaiveDate::from_ymd_opt(last_event.year() + 1, 1, 1).unwrap() - } else { - NaiveDate::from_ymd_opt(last_event.year(), last_event.month() + 1, 1).unwrap() - }; - next_month.pred_opt().unwrap() - }; - let mut cal_start = first_of_month; - while cal_start.weekday() != chrono::Weekday::Sun { - cal_start = cal_start.pred_opt().unwrap(); - } - let mut cal_end = last_of_month; - while cal_end.weekday() != chrono::Weekday::Sat { - cal_end = cal_end.succ_opt().unwrap(); - } - let mut all_days = vec![]; - let mut d = cal_start; - while d <= cal_end { - all_days.push(d); - d = d.succ_opt().unwrap(); - } - let start_month = first_event.format("%B %Y"); - let end_month = last_event.format("%B %Y"); - let caption = if start_month.to_string() == end_month.to_string() { - start_month.to_string() - } else { - format!("{} – {}", start_month, end_month) - }; - let mut calendar_html = String::new(); - calendar_html.push_str(&format!( - "" - )); - calendar_html.push_str(&format!("", caption)); - calendar_html.push_str(""); - for wd in ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] { - calendar_html.push_str(&format!("", wd)); - } - calendar_html.push_str(""); - for week in all_days.chunks(7) { - calendar_html.push_str(""); - for day in week { - let is_event = event_days.contains(day); - let style = if is_event { - "background:#ffd700; color:#222; font-weight:bold; border:1px solid #aaa; border-radius:4px; text-align:center;" - } else { - "border:1px solid #eee; text-align:center;background:#f7f7f7;color:#bbb;" - }; - calendar_html.push_str(&format!("", style, day.day())); - } - calendar_html.push_str(""); - } - calendar_html.push_str("
{}
{}
{}
"); - calendar_html -} fn parse_ical_datetime_tz(dt: &str, tz: Tz) -> Option> { let dt = dt.split(':').last().unwrap_or(dt); diff --git a/server/src/nm.rs b/server/src/nm.rs index 85d47a0..639640a 100644 --- a/server/src/nm.rs +++ b/server/src/nm.rs @@ -812,6 +812,6 @@ mod tests { #[test] fn test_parse_tls_report_v1() { - let report: TlsRpt = serde_json::from_str(REPORT_V1).unwrap(); + let _report: TlsRpt = serde_json::from_str(REPORT_V1).unwrap(); } }