From c2bc0218f4e17ad113afd8c1b01a7717df2afd6b Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Sun, 17 Aug 2025 22:43:23 +0200 Subject: [PATCH] refactor: foreign availabilities --- ...real_for_availabilities_in_his_area-2.snap | 49 ++++++++++++++++--- ..._areal_for_availabilities_in_his_area.snap | 49 ++++++++++++++++--- .../endpoints/availability/put_cross_areal.rs | 30 +++++++++--- web/static/utils.js | 2 +- web/templates/availability/new_or_edit.html | 9 ++-- web/templates/calendar.html | 40 ++------------- .../calendar_cross_areal_button.html | 8 --- web/templates/calendar_tr_availability.html | 45 +++++++++++++++++ 8 files changed, 161 insertions(+), 71 deletions(-) delete mode 100644 web/templates/calendar_cross_areal_button.html create mode 100644 web/templates/calendar_tr_availability.html diff --git a/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area-2.snap b/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area-2.snap index ca3ef7be..b7c4063d 100644 --- a/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area-2.snap +++ b/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area-2.snap @@ -3,11 +3,44 @@ source: web/src/endpoints/availability/put_cross_areal.rs expression: disable_body snapshot_kind: text --- - + + Max Mustermann + +
Posten
+ + + 10:00 Uhr bis + 01.02.2025 10:00 Uhr + + + nein + + +
+ + + + + + + + + +
+ + + diff --git a/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area.snap b/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area.snap index d7875200..5fc63a8a 100644 --- a/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area.snap +++ b/web/snapshots/brass_web__endpoints__availability__put_cross_areal__tests__inner_area_manager_can_toggle_cross_areal_for_availabilities_in_his_area.snap @@ -3,11 +3,44 @@ source: web/src/endpoints/availability/put_cross_areal.rs expression: enable_body snapshot_kind: text --- - + + Max Mustermann + +
Posten
+ + + 10:00 Uhr bis + 01.02.2025 10:00 Uhr + + + ja + + +
+ + + + + + + + + +
+ + + diff --git a/web/src/endpoints/availability/put_cross_areal.rs b/web/src/endpoints/availability/put_cross_areal.rs index 180119ec..747b9a76 100644 --- a/web/src/endpoints/availability/put_cross_areal.rs +++ b/web/src/endpoints/availability/put_cross_areal.rs @@ -1,18 +1,26 @@ use actix_web::{web, HttpResponse, Responder}; -use askama::Template; +use askama::{filters::urlencode, Template}; use serde_json::json; use sqlx::PgPool; use crate::{ endpoints::IdPath, - utils::{ApplicationError, TemplateResponse}, + filters, + utils::{ + ApplicationError, + DateTimeFormat::{DayMonthYearHourMinute, HourMinute}, + TemplateResponse, + }, }; + use brass_db::models::{Assignment, Availability, Role, User}; #[derive(Template)] -#[template(path = "calendar_cross_areal_button.html")] -struct CalendarPartialCrossArealButtonTemplate { +#[template(path = "calendar_tr_availability.html")] +struct CalendarAvailabilityTableRowTemplate { + user: User, availability: Availability, + u: User, } #[actix_web::put("/availability/{id}/makeNonCrossAreal")] @@ -60,7 +68,7 @@ async fn handle_cross_areal( let trigger = json!({ "showToast": { "type": "danger", - "message": "Verfügbarkeit bereits verplant!" + "message": urlencode("Verfügbarkeit bereits verplant!").unwrap().to_string() } }) .to_string(); @@ -75,7 +83,13 @@ async fn handle_cross_areal( availability.cross_areal = cross_areal; } - let template = CalendarPartialCrossArealButtonTemplate { availability }; + let u = availability.user.as_ref().unwrap().clone(); + + let template = CalendarAvailabilityTableRowTemplate { + availability, + user: user.into_inner(), + u, + }; Ok(template.to_response()?) } @@ -102,7 +116,9 @@ mod tests { RequestConfig::new("/availability/1/makeCrossAreal").with_role(Role::AreaManager); create_test_login_user(&context.db_pool, &config).await; - User::create(&context.db_pool, &Faker.fake()).await.unwrap(); + let mut changeset: UserChangeset = Faker.fake(); + changeset.name = "Max Mustermann".to_string(); + User::create(&context.db_pool, &changeset).await.unwrap(); Availability::create( &context.db_pool, 2, diff --git a/web/static/utils.js b/web/static/utils.js index 0ed13c6a..ce0dd5ed 100644 --- a/web/static/utils.js +++ b/web/static/utils.js @@ -60,7 +60,7 @@ setThemeSwitcherIconTo(isCurrentlyLight ? "moon" : "sun"); htmx.on("showToast", (e) => { const toast = document.getElementById("toast"); const toastProgress = document.getElementById("toast-progress"); - document.getElementById("toast-message").innerText = e.detail.message; + document.getElementById("toast-message").innerText = decodeURI(e.detail.message); toast.classList.add(`is-${e.detail.type}`); toastProgress.classList.add(`has-background-${e.detail.type}-90`) diff --git a/web/templates/availability/new_or_edit.html b/web/templates/availability/new_or_edit.html index 1c8a8484..86d77d5c 100644 --- a/web/templates/availability/new_or_edit.html +++ b/web/templates/availability/new_or_edit.html @@ -13,6 +13,8 @@ {% if other_users.len() != 0 %} + +
@@ -21,12 +23,13 @@
- {% for u in other_users %} - {% endfor %} diff --git a/web/templates/calendar.html b/web/templates/calendar.html index e0b951ed..08ddeaba 100644 --- a/web/templates/calendar.html +++ b/web/templates/calendar.html @@ -305,48 +305,16 @@ Funktion Zeitraum Kommentar + {% if user.role == Role::AreaManager || user.role == Role::Admin %} + bereichsübergreifend + {% endif %} {% for availability in availabilities %} {% let u = availability.user.as_ref().unwrap() %} - - {{ u.name }} - - {{ u.function|show_tree|safe }} - - - {{ availability.start|fmt_datetime(HourMinute) }} Uhr bis - {{ availability.end|fmt_datetime(DayMonthYearHourMinute) }} Uhr - - - {{ availability.comment.as_deref().unwrap_or_default() }} - - - {% if availability.user_id == user.id || user.role == Role::Admin || user.role == Role::AreaManager %} -
- - - - - - - {% if user.role == Role::Admin || (user.role == Role::AreaManager && user.area_id == - availability.user.as_ref().unwrap().area_id) %} - {% include "calendar_cross_areal_button.html" %} - {% endif %} -
- {% endif %} - - + {% include "calendar_tr_availability.html" %} {% endfor %} diff --git a/web/templates/calendar_cross_areal_button.html b/web/templates/calendar_cross_areal_button.html deleted file mode 100644 index 7abb8867..00000000 --- a/web/templates/calendar_cross_areal_button.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/web/templates/calendar_tr_availability.html b/web/templates/calendar_tr_availability.html new file mode 100644 index 00000000..06474a93 --- /dev/null +++ b/web/templates/calendar_tr_availability.html @@ -0,0 +1,45 @@ + + {{ u.name }} + + {{ u.function|show_tree|safe }} + + + {{ availability.start|fmt_datetime(HourMinute) }} Uhr bis + {{ availability.end|fmt_datetime(DayMonthYearHourMinute) }} Uhr + + + {{- availability.comment.as_deref().unwrap_or_default() -}} + + {%- if user.role == Role::AreaManager || user.role == Role::Admin %} + {% if availability.cross_areal %}ja{% else %}nein{% endif %} + {% endif -%} + + {% if availability.user_id == user.id || user.role == Role::Admin || user.role == Role::AreaManager %} +
+ + + + + + + {% if user.role == Role::Admin || (user.role == Role::AreaManager && user.area_id == u.area_id) %} + + {% endif %} +
+ {% endif %} + +