diff --git a/crates/frontend/public/templates/pages/user.html b/crates/frontend/public/templates/pages/user.html
index c8ff8a2..c1e8765 100644
--- a/crates/frontend/public/templates/pages/user.html
+++ b/crates/frontend/public/templates/pages/user.html
@@ -108,48 +108,51 @@
{% endif %}
-
Create calendar
-
+
+
@@ -186,6 +189,29 @@
{% endfor %}
{% endif %}
+
+
+
{% endblock %}
diff --git a/crates/frontend/src/lib.rs b/crates/frontend/src/lib.rs
index 4378b89..b739d9c 100644
--- a/crates/frontend/src/lib.rs
+++ b/crates/frontend/src/lib.rs
@@ -32,7 +32,7 @@ use oidc_user_store::OidcUserStore;
use crate::{
assets::{Assets, EmbedService},
routes::{
- addressbook::{route_addressbook, route_addressbook_restore},
+ addressbook::{route_addressbook, route_addressbook_restore, route_create_addressbook},
app_token::{route_delete_app_token, route_post_app_token},
calendar::{route_calendar, route_calendar_restore, route_create_calendar},
login::{route_get_login, route_post_login, route_post_logout},
@@ -76,6 +76,10 @@ pub fn frontend_router<
post(route_calendar_restore::),
)
// Addressbook
+ .route(
+ "/user/{user}/addressbook",
+ post(route_create_addressbook::),
+ )
.route(
"/user/{user}/addressbook/{addressbook}",
get(route_addressbook::),
diff --git a/crates/frontend/src/routes/addressbook.rs b/crates/frontend/src/routes/addressbook.rs
index 91f6809..d4eada0 100644
--- a/crates/frontend/src/routes/addressbook.rs
+++ b/crates/frontend/src/routes/addressbook.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
use askama::Template;
use askama_web::WebTemplate;
use axum::{
- Extension,
+ Extension, Form,
extract::Path,
response::{IntoResponse, Redirect, Response},
};
@@ -11,6 +11,7 @@ use axum_extra::TypedHeader;
use headers::Referer;
use http::StatusCode;
use rustical_store::{Addressbook, AddressbookStore, auth::User};
+use serde::{Deserialize, Deserializer};
#[derive(Template, WebTemplate)]
#[template(path = "pages/addressbook.html")]
@@ -32,6 +33,53 @@ pub async fn route_addressbook(
.into_response())
}
+fn empty_to_none<'de, D>(deserializer: D) -> Result