From b42540ac2f6f3aab0c175aeaed0f1b8adfdfb8aa Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Thu, 3 Jul 2025 20:15:56 +0200 Subject: [PATCH] feat: show weekday in overview and edit pages refs #33 --- Cargo.lock | 7 ++++++ web/Cargo.toml | 2 +- .../endpoints/availability/get_overview.rs | 2 +- web/src/endpoints/availability/mod.rs | 2 +- web/src/endpoints/events/get_plan.rs | 4 +++- web/src/endpoints/events/mod.rs | 5 +++- web/src/filters.rs | 18 +++++++++++--- web/src/utils/date_time_format.rs | 9 +++++-- web/templates/availability/new_or_edit.html | 24 +++++++++++-------- web/templates/events/new_or_edit.html | 2 +- web/templates/events/plan.html | 8 ++++--- web/templates/index.html | 4 ++-- 12 files changed, 61 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb310878..43de84fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -941,6 +941,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "pure-rust-locales", "serde", "wasm-bindgen", "windows-link", @@ -2643,6 +2644,12 @@ dependencies = [ "cc", ] +[[package]] +name = "pure-rust-locales" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" + [[package]] name = "quick-xml" version = "0.37.5" diff --git a/web/Cargo.toml b/web/Cargo.toml index 7fd13551..e9ba1338 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -14,7 +14,7 @@ argon2 = { version = "0.5.0", features = [ "std"]} anyhow = "1.0.71" actix-session = { version = "0.10.1", features = ["cookie-session"] } actix-identity = "0.8.0" -chrono = { version = "0.4.33", features = ["serde", "now"] } +chrono = { version = "0.4.33", features = ["serde", "now", "unstable-locales"] } actix-files = "0.6.5" futures-util = "0.3.30" serde_json = "1.0.114" diff --git a/web/src/endpoints/availability/get_overview.rs b/web/src/endpoints/availability/get_overview.rs index 5ad390ef..c6609734 100644 --- a/web/src/endpoints/availability/get_overview.rs +++ b/web/src/endpoints/availability/get_overview.rs @@ -9,7 +9,7 @@ use crate::{ utils::{ event_planning_template::generate_vehicles_assigned_and_available, ApplicationError, - DateTimeFormat::{DayMonthYear, DayMonthYearHourMinute, HourMinute}, + DateTimeFormat::{DayMonthYearHourMinute, HourMinute, WeekdayDayMonthYear}, TemplateResponse, }, }; diff --git a/web/src/endpoints/availability/mod.rs b/web/src/endpoints/availability/mod.rs index d2edc438..78c0364b 100644 --- a/web/src/endpoints/availability/mod.rs +++ b/web/src/endpoints/availability/mod.rs @@ -4,7 +4,7 @@ use serde::Deserialize; use crate::{ filters, - utils::DateTimeFormat::{DayMonth, DayMonthYear, DayMonthYearHourMinute, HourMinute}, + utils::DateTimeFormat::{DayMonthHourMinute, HourMinute, WeekdayDayMonth, WeekdayDayMonthYear}, }; use brass_db::models::{Role, User}; diff --git a/web/src/endpoints/events/get_plan.rs b/web/src/endpoints/events/get_plan.rs index 7be0c52a..ec3c0f3c 100644 --- a/web/src/endpoints/events/get_plan.rs +++ b/web/src/endpoints/events/get_plan.rs @@ -10,7 +10,9 @@ use crate::{ generate_availability_assignment_list, generate_status_whether_staff_is_required, generate_vehicles_assigned_and_available, }, - ApplicationError, TemplateResponse, + ApplicationError, + DateTimeFormat::{DayMonthYearHourMinute, HourMinute, WeekdayDayMonthYear}, + TemplateResponse, }, }; use brass_db::models::{Availability, AvailabilityAssignmentState, Event, Role, User, Vehicle}; diff --git a/web/src/endpoints/events/mod.rs b/web/src/endpoints/events/mod.rs index a1867a39..4f66eb64 100644 --- a/web/src/endpoints/events/mod.rs +++ b/web/src/endpoints/events/mod.rs @@ -3,7 +3,10 @@ use chrono::{Days, NaiveDateTime}; use chrono::{NaiveDate, NaiveTime}; use serde::Deserialize; -use crate::{filters, utils::DateTimeFormat::{DayMonthYear, HourMinute, YearMonthDayTHourMinute}}; +use crate::{ + filters, + utils::DateTimeFormat::{HourMinute, WeekdayDayMonthYear, YearMonthDayTHourMinute}, +}; use brass_db::models::{Clothing, Location, Role, User}; pub mod delete; diff --git a/web/src/filters.rs b/web/src/filters.rs index b96744a2..c9aecdd2 100644 --- a/web/src/filters.rs +++ b/web/src/filters.rs @@ -1,6 +1,9 @@ use std::fmt::Display; -use chrono::{NaiveDate, NaiveDateTime, NaiveTime}; +use chrono::{ + format::{DelayedFormat, StrftimeItems}, + NaiveDate, NaiveDateTime, NaiveTime, +}; use maud::html; use tracing::trace; @@ -83,7 +86,8 @@ pub fn fmt_date(v: &NaiveDate, format: DateTimeFormat) -> askama::Result "formatting naivedate into string with format" ); - Ok(v.format(format_string).to_string()) + Ok(v.format_localized(format_string, chrono::Locale::de_DE) + .to_string()) } pub fn fmt_datetime(v: &NaiveDateTime, format: DateTimeFormat) -> askama::Result { @@ -93,7 +97,15 @@ pub fn fmt_datetime(v: &NaiveDateTime, format: DateTimeFormat) -> askama::Result "formatting naivedatetime into string with format" ); - Ok(v.format(format_string).to_string()) + let locale = chrono::Locale::de_DE; + let out = DelayedFormat::new_with_locale( + Some(v.date()), + Some(v.time()), + StrftimeItems::new_with_locale(format_string, locale), + locale, + ); + + Ok(out.to_string()) } pub fn fmt_time(v: &NaiveTime, format: DateTimeFormat) -> askama::Result { diff --git a/web/src/utils/date_time_format.rs b/web/src/utils/date_time_format.rs index 6b7b7c88..a71cdb15 100644 --- a/web/src/utils/date_time_format.rs +++ b/web/src/utils/date_time_format.rs @@ -4,7 +4,10 @@ pub enum DateTimeFormat { DayMonthYear, DayMonthYearHourMinute, YearMonthDayTHourMinute, - HourMinute + /// equivalent to %R, + HourMinute, + WeekdayDayMonth, + WeekdayDayMonthYear, } impl From for &'static str { @@ -15,7 +18,9 @@ impl From for &'static str { DateTimeFormat::DayMonthYear => "%d.%m.%Y", DateTimeFormat::DayMonthYearHourMinute => "%d.%m.%Y %H:%M", DateTimeFormat::YearMonthDayTHourMinute => "%Y-%m-%dT%H:%M", - DateTimeFormat::HourMinute => "%H:%M" // equivalent to %R, + DateTimeFormat::HourMinute => "%H:%M", + DateTimeFormat::WeekdayDayMonth => "%A, %d.%m.", + DateTimeFormat::WeekdayDayMonthYear => "%A, %d.%m.%Y", } } } diff --git a/web/templates/availability/new_or_edit.html b/web/templates/availability/new_or_edit.html index 866a21d3..d4f7d963 100644 --- a/web/templates/availability/new_or_edit.html +++ b/web/templates/availability/new_or_edit.html @@ -5,8 +5,8 @@
{% let is_edit = id.is_some() %}
-

{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Vefügbarkeit für den {{ - date|fmt_date(DayMonthYear) }}

+

{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Vefügbarkeit für {{ + date|fmt_date(WeekdayDayMonthYear) }}

@@ -23,8 +23,9 @@

noch mögliche Zeiträume:

{% for (s, e) in slot_suggestions %} - {{ s|fmt_datetime(DayMonthYearHourMinute) }} - - {{ e|fmt_datetime(DayMonthYearHourMinute) }} + + {{ s|fmt_datetime(DayMonthHourMinute) }} Uhr - {{ e|fmt_datetime(DayMonthHourMinute) }} Uhr + {% endfor %}
{% endif %} @@ -34,7 +35,7 @@ _='on change put the value of me into #et then if (value of the previous ) is greater than (value of me) then set the value of #enddate to "{{ datetomorrow }}" - then put "{{ datetomorrow|fmt_date(DayMonth) }}" into #ed + then put "{{ datetomorrow|fmt_date(WeekdayDayMonth) }}" into #ed then set checked of #radionextday to true end' />
@@ -52,13 +53,13 @@ @@ -82,9 +83,12 @@ {% let start_time = start.unwrap_or(NaiveTime::from_hms_opt(10, 0, 0).unwrap()) %} {% let end_time = end.unwrap_or(NaiveTime::from_hms_opt(20, 0, 0).unwrap()) %} - verfügbar von {{ date|fmt_date(DayMonth) }} {{ start_time|fmt_time(HourMinute) }} Uhr - bis {{ enddate.as_ref().unwrap_or(date)|fmt_date(DayMonth) }} - {{ end_time|fmt_time(HourMinute) }} Uhr + verfügbar von {{ date|fmt_date(WeekdayDayMonth) }} + {{ start_time|fmt_time(HourMinute) }} + Uhr bis + {{ enddate.as_ref().unwrap_or(date)|fmt_date(WeekdayDayMonth) }} + {{ end_time|fmt_time(HourMinute) }} + Uhr

diff --git a/web/templates/events/new_or_edit.html b/web/templates/events/new_or_edit.html index 4ac1dc53..0260911d 100644 --- a/web/templates/events/new_or_edit.html +++ b/web/templates/events/new_or_edit.html @@ -7,7 +7,7 @@ {% if let Some(name) = name %}

Event '{{ name }}' bearbeiten

{% else %} -

Neues Event anlegen für den {{ date|fmt_date(DayMonthYear) }}

+

Neues Event anlegen für {{ date|fmt_date(WeekdayDayMonthYear) }}

{% endif %} diff --git a/web/templates/events/plan.html b/web/templates/events/plan.html index d0fa8911..46080826 100644 --- a/web/templates/events/plan.html +++ b/web/templates/events/plan.html @@ -15,11 +15,12 @@
-

Datum: {{ event.start.format("%d.%m.%Y") }}

+

Datum: {{ event.start|fmt_datetime(WeekdayDayMonthYear) }}

-

Uhrzeit: {{ event.start.format("%R") }} Uhr - {{ event.end.format("%d.%m.%Y %R") }} Uhr

+

Uhrzeit: {{ event.start|fmt_datetime(HourMinute) }} Uhr - {{ + event.end|fmt_datetime(DayMonthYearHourMinute) }} Uhr

@@ -31,7 +32,8 @@
-

Führungsassistent benötigt: {% if event.voluntary_fuehrungsassistent %}ja{% else %}nein{% endif %}

+

Führungsassistent benötigt: {% if event.voluntary_fuehrungsassistent %}ja{% else %}nein{% endif %} +

diff --git a/web/templates/index.html b/web/templates/index.html index a6a8cf52..c050e398 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -99,7 +99,7 @@

- Events am {{ date|fmt_date(DayMonthYear) }} + Events am {{ date|fmt_date(WeekdayDayMonthYear) }}

{% if user.role == Role::Admin || user.role == Role::AreaManager && (selected_area.is_none() || @@ -227,7 +227,7 @@

- Verfügbarkeiten am {{ date|fmt_date(DayMonthYear) }} + Verfügbarkeiten am {{ date|fmt_date(WeekdayDayMonthYear) }}

{% if selected_area.is_none() || selected_area.unwrap() == user.area_id %}