Merge pull request 'also be able to cancel trips (not only events)' (#929) from zero-rower-events into staging
Reviewed-on: #929
This commit was merged in pull request #929.
	This commit is contained in:
		| @@ -7,7 +7,7 @@ use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD; | |||||||
|  |  | ||||||
| use self::{ | use self::{ | ||||||
|     event::{Event, EventWithDetails}, |     event::{Event, EventWithDetails}, | ||||||
|     trip::{Trip, TripWithUserAndType}, |     trip::{Trip, TripWithDetails}, | ||||||
|     waterlevel::Waterlevel, |     waterlevel::Waterlevel, | ||||||
|     weather::Weather, |     weather::Weather, | ||||||
| }; | }; | ||||||
| @@ -45,7 +45,7 @@ pub mod weather; | |||||||
| pub struct Day { | pub struct Day { | ||||||
|     day: NaiveDate, |     day: NaiveDate, | ||||||
|     events: Vec<EventWithDetails>, |     events: Vec<EventWithDetails>, | ||||||
|     trips: Vec<TripWithUserAndType>, |     trips: Vec<TripWithDetails>, | ||||||
|     is_pinned: bool, |     is_pinned: bool, | ||||||
|     regular_sees_this_day: bool, |     regular_sees_this_day: bool, | ||||||
|     max_waterlevel: Option<WaterlevelDay>, |     max_waterlevel: Option<WaterlevelDay>, | ||||||
|   | |||||||
| @@ -30,11 +30,12 @@ pub struct Trip { | |||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Serialize, Debug)] | #[derive(Serialize, Debug)] | ||||||
| pub struct TripWithUserAndType { | pub struct TripWithDetails { | ||||||
|     #[serde(flatten)] |     #[serde(flatten)] | ||||||
|     pub trip: Trip, |     pub trip: Trip, | ||||||
|     pub rower: Vec<Registration>, |     pub rower: Vec<Registration>, | ||||||
|     trip_type: Option<TripType>, |     trip_type: Option<TripType>, | ||||||
|  |     cancelled: bool, | ||||||
| } | } | ||||||
|  |  | ||||||
| pub struct TripUpdate<'a> { | pub struct TripUpdate<'a> { | ||||||
| @@ -52,7 +53,7 @@ impl<'a> TripUpdate<'a> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl TripWithUserAndType { | impl TripWithDetails { | ||||||
|     pub async fn from(db: &SqlitePool, trip: Trip) -> Self { |     pub async fn from(db: &SqlitePool, trip: Trip) -> Self { | ||||||
|         let mut trip_type = None; |         let mut trip_type = None; | ||||||
|         if let Some(trip_type_id) = trip.trip_type_id { |         if let Some(trip_type_id) = trip.trip_type_id { | ||||||
| @@ -60,8 +61,9 @@ impl TripWithUserAndType { | |||||||
|         } |         } | ||||||
|         Self { |         Self { | ||||||
|             rower: Registration::all_rower(db, trip.trip_details_id.unwrap()).await, |             rower: Registration::all_rower(db, trip.trip_details_id.unwrap()).await, | ||||||
|             trip, |  | ||||||
|             trip_type, |             trip_type, | ||||||
|  |             cancelled: trip.is_cancelled(), | ||||||
|  |             trip, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -268,12 +270,12 @@ WHERE trip.id=? | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub async fn get_for_today(db: &SqlitePool) -> Vec<TripWithUserAndType> { |     pub async fn get_for_today(db: &SqlitePool) -> Vec<TripWithDetails> { | ||||||
|         let today = Local::now().date_naive(); |         let today = Local::now().date_naive(); | ||||||
|         Self::get_for_day(db, today).await |         Self::get_for_day(db, today).await | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<TripWithUserAndType> { |     pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<TripWithDetails> { | ||||||
|         let day = format!("{day}"); |         let day = format!("{day}"); | ||||||
|         let trips = sqlx::query_as!( |         let trips = sqlx::query_as!( | ||||||
|             Trip, |             Trip, | ||||||
| @@ -292,7 +294,7 @@ WHERE day=? | |||||||
|  |  | ||||||
|         let mut ret = Vec::new(); |         let mut ret = Vec::new(); | ||||||
|         for trip in trips { |         for trip in trips { | ||||||
|             ret.push(TripWithUserAndType::from(db, trip).await); |             ret.push(TripWithDetails::from(db, trip).await); | ||||||
|         } |         } | ||||||
|         ret |         ret | ||||||
|     } |     } | ||||||
| @@ -336,9 +338,7 @@ WHERE day=? | |||||||
|         .unwrap(); //Okay, as trip_details can only be created with proper DB backing |         .unwrap(); //Okay, as trip_details can only be created with proper DB backing | ||||||
|  |  | ||||||
|         if update.cancelled() && !was_already_cancelled { |         if update.cancelled() && !was_already_cancelled { | ||||||
|             let rowers = TripWithUserAndType::from(db, update.trip.clone()) |             let rowers = TripWithDetails::from(db, update.trip.clone()).await.rower; | ||||||
|                 .await |  | ||||||
|                 .rower; |  | ||||||
|             for user in rowers { |             for user in rowers { | ||||||
|                 if let Some(user) = User::find_by_name(db, &user.name).await { |                 if let Some(user) = User::find_by_name(db, &user.name).await { | ||||||
|                     let notes = match update.notes { |                     let notes = match update.notes { | ||||||
| @@ -462,7 +462,7 @@ WHERE day=? | |||||||
|     pub(crate) async fn get_pinned_for_day( |     pub(crate) async fn get_pinned_for_day( | ||||||
|         db: &sqlx::Pool<sqlx::Sqlite>, |         db: &sqlx::Pool<sqlx::Sqlite>, | ||||||
|         day: NaiveDate, |         day: NaiveDate, | ||||||
|     ) -> Vec<TripWithUserAndType> { |     ) -> Vec<TripWithDetails> { | ||||||
|         let mut trips = Self::get_for_day(db, day).await; |         let mut trips = Self::get_for_day(db, day).await; | ||||||
|         trips.retain(|e| e.trip.always_show); |         trips.retain(|e| e.trip.always_show); | ||||||
|         trips |         trips | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ use sqlx::{FromRow, SqlitePool}; | |||||||
|  |  | ||||||
| use super::{ | use super::{ | ||||||
|     notification::Notification, |     notification::Notification, | ||||||
|     trip::{Trip, TripWithUserAndType}, |     trip::{Trip, TripWithDetails}, | ||||||
|     triptype::TripType, |     triptype::TripType, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -138,7 +138,7 @@ WHERE day = ? AND planned_starting_time = ? | |||||||
|                 // This trip_details belongs to a planned_event, no need to do anything |                 // This trip_details belongs to a planned_event, no need to do anything | ||||||
|                 continue; |                 continue; | ||||||
|             }; |             }; | ||||||
|             let pot_coxes = TripWithUserAndType::from(db, trip.clone()).await; |             let pot_coxes = TripWithDetails::from(db, trip.clone()).await; | ||||||
|             let pot_coxes = pot_coxes.rower; |             let pot_coxes = pot_coxes.rower; | ||||||
|             for user in pot_coxes { |             for user in pot_coxes { | ||||||
|                 let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap(); |                 let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap(); | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ use sqlx::{FromRow, SqlitePool}; | |||||||
|  |  | ||||||
| use super::{ | use super::{ | ||||||
|     notification::Notification, |     notification::Notification, | ||||||
|     trip::{Trip, TripWithUserAndType}, |     trip::{Trip, TripWithDetails}, | ||||||
|     tripdetails::TripDetails, |     tripdetails::TripDetails, | ||||||
|     user::{SteeringUser, User}, |     user::{SteeringUser, User}, | ||||||
| }; | }; | ||||||
| @@ -158,7 +158,7 @@ impl UserTrip { | |||||||
|                 .unwrap() |                 .unwrap() | ||||||
|                 .cancelled() |                 .cancelled() | ||||||
|             { |             { | ||||||
|                 let trip = TripWithUserAndType::from(db, trip.clone()).await; |                 let trip = TripWithDetails::from(db, trip.clone()).await; | ||||||
|                 if trip.rower.len() == 1 { |                 if trip.rower.len() == 1 { | ||||||
|                     trip_to_delete = Some(trip.trip); |                     trip_to_delete = Some(trip.trip); | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -240,7 +240,11 @@ | |||||||
|                                                         <input type="hidden" name="_method" value="put" /> |                                                         <input type="hidden" name="_method" value="put" /> | ||||||
|                                                         <input type="hidden" name="id" value="{{ event.id }}" /> |                                                         <input type="hidden" name="id" value="{{ event.id }}" /> | ||||||
|                                                         {{ macros::input(label='Titel', name='name', type='input', value=event.name) }} |                                                         {{ macros::input(label='Titel', name='name', type='input', value=event.name) }} | ||||||
|                                                         {{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='0') }} |                                                         {% if event.cancelled %} | ||||||
|  |                                                           <input type="hidden" name="max_people" value="-1" /> | ||||||
|  |                                                         {% else %} | ||||||
|  |                                                           {{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='0') }} | ||||||
|  |                                                         {% endif %} | ||||||
|                                                         {{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }} |                                                         {{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }} | ||||||
|                                                         {{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }} |                                                         {{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }} | ||||||
|                                                         {{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }} |                                                         {{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }} | ||||||
| @@ -300,7 +304,7 @@ | |||||||
|                                             {% if trip.always_show and not day.regular_sees_this_day %} |                                             {% if trip.always_show and not day.regular_sees_this_day %} | ||||||
|                                                 <span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span> |                                                 <span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span> | ||||||
|                                             {% endif -%} |                                             {% endif -%} | ||||||
|                                             {% if trip.max_people == 0 %} |                                             {% if trip.cancelled %} | ||||||
|                                                 <strong class="text-[#f43f5e]">⚠ |                                                 <strong class="text-[#f43f5e]">⚠ | ||||||
|                                                     {{ trip.planned_starting_time }} |                                                     {{ trip.planned_starting_time }} | ||||||
|                                                 Uhr</strong> |                                                 Uhr</strong> | ||||||
| @@ -322,7 +326,7 @@ | |||||||
|                                             {% endif %} |                                             {% endif %} | ||||||
|                                             <br /> |                                             <br /> | ||||||
|                                             <a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong> |                                             <a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong> | ||||||
|                                                 {% if trip.max_people == 0 %}⚠{% endif %} |                                                 {% if trip.cancelled %}⚠{% endif %} | ||||||
|                                                 {{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }}) |                                                 {{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }}) | ||||||
|                                                 {% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %} |                                                 {% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %} | ||||||
|                                                 {% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %} |                                                 {% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %} | ||||||
| @@ -351,7 +355,7 @@ | |||||||
|                                     {# --- START Sidebar Content --- #} |                                     {# --- START Sidebar Content --- #} | ||||||
|                                     <div class="hidden"> |                                     <div class="hidden"> | ||||||
|                                         <div id="trip{{ trip.trip_details_id }}"> |                                         <div id="trip{{ trip.trip_details_id }}"> | ||||||
|                                             {% if trip.max_people == 0 %} |                                             {% if trip.cancelled %} | ||||||
|                                                 {# --- border-[#f43f5e] bg-[#f43f5e] --- #} |                                                 {# --- border-[#f43f5e] bg-[#f43f5e] --- #} | ||||||
|                                                 {{ macros::box(participants=trip.rower,bg='[#f43f5e]',header='Absage', trip_details_id=trip.trip_details_id, allow_removing=loggedin_user.id == trip.cox_id) }} |                                                 {{ macros::box(participants=trip.rower,bg='[#f43f5e]',header='Absage', trip_details_id=trip.trip_details_id, allow_removing=loggedin_user.id == trip.cox_id) }} | ||||||
|                                             {% else %} |                                             {% else %} | ||||||
| @@ -391,7 +395,7 @@ | |||||||
|                                                     </a> |                                                     </a> | ||||||
|                                                 </div> |                                                 </div> | ||||||
|                                             {% else %} |                                             {% else %} | ||||||
|                                                 {% if trip.max_people == 0 %} |                                                 {% if trip.cancelled %} | ||||||
|                                                     Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen. |                                                     Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen. | ||||||
|                                                 {% else %} |                                                 {% else %} | ||||||
|                                                     <div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md"> |                                                     <div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md"> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user