From 2cae816741c004676693f2ee347a05539f10b01e Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Sun, 26 Jan 2025 13:55:10 +0100 Subject: [PATCH] refactor: style planning --- web/src/models/availabillity.rs | 4 +- web/src/utils/event_planning_template.rs | 2 +- web/static/style.scss | 7 ++ web/static/utils.js | 24 ++++++ web/templates/events/plan_personal_table.html | 80 +++++++++++++------ 5 files changed, 89 insertions(+), 28 deletions(-) diff --git a/web/src/models/availabillity.rs b/web/src/models/availabillity.rs index d05d877b..97d60198 100644 --- a/web/src/models/availabillity.rs +++ b/web/src/models/availabillity.rs @@ -27,7 +27,7 @@ pub enum AvailabillityAssignmentState { // availabillity is assigned to this event as Führungsassistent AssignedFührungsassistent(i32), // availabillity is assigned to this event as Wachhabender - AssignedWachahabender(i32), + AssignedWachhabender(i32), } impl Display for AvailabillityAssignmentState { @@ -37,7 +37,7 @@ impl Display for AvailabillityAssignmentState { AvailabillityAssignmentState::Conflicting => write!(f, "bereits anders zugewiesen"), AvailabillityAssignmentState::AssignedPosten(_) => write!(f, "zugewiesen als Posten"), AvailabillityAssignmentState::AssignedFührungsassistent(_) => write!(f, "zugewiesen als Führungsassistent"), - AvailabillityAssignmentState::AssignedWachahabender(_) => write!(f, "zugewiesen als Wachhabender"), + AvailabillityAssignmentState::AssignedWachhabender(_) => write!(f, "zugewiesen als Wachhabender"), } } } diff --git a/web/src/utils/event_planning_template.rs b/web/src/utils/event_planning_template.rs index 0eeb39a6..2725b107 100644 --- a/web/src/utils/event_planning_template.rs +++ b/web/src/utils/event_planning_template.rs @@ -35,7 +35,7 @@ pub async fn generate_availabillity_assignment_list( ) } Function::Wachhabender => { - AvailabillityAssignmentState::AssignedWachahabender(assignment.availabillity_id) + AvailabillityAssignmentState::AssignedWachhabender(assignment.availabillity_id) } }; diff --git a/web/static/style.scss b/web/static/style.scss index 9a8ae246..0a3ada98 100644 --- a/web/static/style.scss +++ b/web/static/style.scss @@ -17,6 +17,7 @@ $primary: $crimson, @forward "bulma/sass/components/pagination"; @forward "bulma/sass/components/navbar"; @forward "bulma/sass/components/message"; +@forward "bulma/sass/components/dropdown"; @forward "bulma/sass/elements/button"; @forward "bulma/sass/elements/box"; @@ -74,3 +75,9 @@ $primary: $crimson, section.htmx-request { visibility: hidden; } + +a.dropdown-item[disabled] { + color: hsl(221, 14%, 48%); // $grey; + cursor: default; + pointer-events: none; +} diff --git a/web/static/utils.js b/web/static/utils.js index de9dda7d..93646f78 100644 --- a/web/static/utils.js +++ b/web/static/utils.js @@ -11,6 +11,30 @@ document.addEventListener("htmx:afterSwap", () => { document.querySelectorAll("button[hx-trigger='confirmed']").forEach((value) => value.addEventListener("click", fireConfirmModal)); }); +// dropdown activation / deactivation +const toggleDropdown = (event) => { + const classList = event.target.closest('.dropdown').classList + if (!classList.contains('is-active')) { + Array.from(document.querySelectorAll('.dropdown')).forEach((d) => d.classList.remove('is-active')); + } + classList.toggle('is-active'); +}; + +const closeDropdownsIfClickedOutside = (event) => { + const dropdowns = Array.from(document.querySelectorAll('.dropdown')); + if (dropdowns.every((v) => !v.contains(event.target))) { + dropdowns.forEach((d) => d.classList.remove('is-active')) + } +} + +document.querySelectorAll(".dropdown-trigger .button").forEach((value) => value.addEventListener("click", toggleDropdown)); +document.addEventListener("click", closeDropdownsIfClickedOutside); + +document.addEventListener("htmx:afterSwap", () => { + document.querySelectorAll(".dropdown-trigger .button").forEach((value) => value.addEventListener("click", toggleDropdown)); + document.addEventListener("click", closeDropdownsIfClickedOutside); +}); + // light / dark mode interpretation for first load and switch behaviour respecting localStorage and CSS prefers-color-scheme const getCurrentTheme = () => { let current = localStorage.getItem("theme"); diff --git a/web/templates/events/plan_personal_table.html b/web/templates/events/plan_personal_table.html index bbfad358..9e64f84a 100644 --- a/web/templates/events/plan_personal_table.html +++ b/web/templates/events/plan_personal_table.html @@ -14,8 +14,7 @@ Funktion Zeitraum Kommentar - Status - Planen als + Planung @@ -39,32 +38,63 @@ {{ availabillity.comment.as_deref().unwrap_or("") }} - {{ status }} - - -
- - {% if u.function == Function::Wachhabender || u.function == Function::Fuehrungsassistent %} - - {% endif %} - {% if u.function == Function::Wachhabender %} - - {% endif %} + - {% if status != AvailabillityAssignmentState::Unassigned|ref && status != - AvailabillityAssignmentState::Conflicting|ref %} - - {% endif %} {% endfor %}