Implement calendar deletion with right-click context menu

Added complete calendar deletion functionality including:
- Context menu component with right-click activation on calendar items
- Backend API endpoint for calendar deletion with CalDAV DELETE method
- Frontend integration with calendar list refresh after deletion
- Fixed URL construction to prevent double /dav.php path issue
- Added proper error handling and user feedback

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Connor Johnstone
2025-08-28 21:31:58 -04:00
parent f9c87369e5
commit c454104c69
9 changed files with 341 additions and 5 deletions

View File

@@ -658,6 +658,42 @@ impl CalDAVClient {
Err(CalDAVError::ServerError(status.as_u16()))
}
}
/// Delete a calendar from the CalDAV server
pub async fn delete_calendar(&self, calendar_path: &str) -> Result<(), CalDAVError> {
let full_url = if calendar_path.starts_with("http") {
calendar_path.to_string()
} else {
// Handle case where calendar_path already contains /dav.php
let clean_path = if calendar_path.starts_with("/dav.php") {
calendar_path.trim_start_matches("/dav.php")
} else {
calendar_path
};
format!("{}{}", self.config.server_url.trim_end_matches('/'), clean_path)
};
println!("Deleting calendar at: {}", full_url);
let response = self.http_client
.delete(&full_url)
.header("Authorization", format!("Basic {}", self.config.get_basic_auth()))
.send()
.await
.map_err(|e| CalDAVError::ParseError(e.to_string()))?;
println!("Calendar deletion response status: {}", response.status());
if response.status().is_success() || response.status().as_u16() == 204 {
println!("✅ Calendar deleted successfully at {}", calendar_path);
Ok(())
} else {
let status = response.status();
let error_body = response.text().await.unwrap_or_default();
println!("❌ Calendar deletion failed: {} - {}", status, error_body);
Err(CalDAVError::ServerError(status.as_u16()))
}
}
}
/// Helper struct for extracting calendar data from XML responses