| 
						
						
						
					 | 
					 | 
					@ -1,6 +1,6 @@
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					use leptos::*;
 | 
					 | 
					 | 
					 | 
					use leptos::*;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					use validator::Validate;
 | 
					 | 
					 | 
					 | 
					use validator::Validate;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					use crate::backend::data::{ApiResponse, CrReservation, Reservation, PublicFormData, ResSumWithItems};
 | 
					 | 
					 | 
					 | 
					use crate::backend::data::{ApiResponse, CrReservation, Reservation, PublicFormData, ResSumWithItems, Page, PagedResponse};
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					use crate::components::data_form::ForValidation;
 | 
					 | 
					 | 
					 | 
					use crate::components::data_form::ForValidation;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					use cfg_if::cfg_if;
 | 
					 | 
					 | 
					 | 
					use cfg_if::cfg_if;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					use chrono::{NaiveDate, NaiveTime};
 | 
					 | 
					 | 
					 | 
					use chrono::{NaiveDate, NaiveTime};
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -89,9 +89,9 @@ cfg_if! { if #[cfg(feature = "ssr")] {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            .await?)
 | 
					 | 
					 | 
					 | 
					            .await?)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    async fn reservations_in_range(from: &NaiveDate, to: &NaiveDate, state: Option<ReservationState>) -> Result<Vec<ResSumWithItems>, ServerFnError> {
 | 
					 | 
					 | 
					 | 
					    async fn reservations_in_range(from: &NaiveDate, to: &NaiveDate, state: Option<ReservationState>, page: Page) -> Result<(Vec<ResSumWithItems>, i64), ServerFnError> {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        let pool = get_pool().await?;
 | 
					 | 
					 | 
					 | 
					        let pool = get_pool().await?;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        let view = if let Some(s) = state {
 | 
					 | 
					 | 
					 | 
					        let view = if let Some(s) = &state {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            query_as::<_, ResAllView>(
 | 
					 | 
					 | 
					 | 
					            query_as::<_, ResAllView>(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                "SELECT r.from, r.to, p.name, p.description, s.*, c.full_name, c.email, c.phone \
 | 
					 | 
					 | 
					 | 
					                "SELECT r.from, r.to, p.name, p.description, s.*, c.full_name, c.email, c.phone \
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    FROM reservation r \
 | 
					 | 
					 | 
					 | 
					                    FROM reservation r \
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -131,7 +131,7 @@ cfg_if! { if #[cfg(feature = "ssr")] {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        };
 | 
					 | 
					 | 
					 | 
					        };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if view.is_empty() {
 | 
					 | 
					 | 
					 | 
					        if view.is_empty() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            return Ok(vec![])
 | 
					 | 
					 | 
					 | 
					            return Ok((vec![], 0))
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        let mut ret = view.into_iter().fold(HashMap::new(), |mut m, v| {
 | 
					 | 
					 | 
					 | 
					        let mut ret = view.into_iter().fold(HashMap::new(), |mut m, v| {
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -148,7 +148,14 @@ cfg_if! { if #[cfg(feature = "ssr")] {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }).collect::<Vec<_>>();
 | 
					 | 
					 | 
					 | 
					        }).collect::<Vec<_>>();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ret.sort_by(|a, b| a.summary.date.cmp(&b.summary.date) );
 | 
					 | 
					 | 
					 | 
					        ret.sort_by(|a, b| a.summary.date.cmp(&b.summary.date) );
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        Ok(ret)
 | 
					 | 
					 | 
					 | 
					        let count = ret.len() as i64;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        let last = if page.limit() == i32::MAX || ((page.offset() + page.limit()) as usize > ret.len()) { ret.len() }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            else { (page.offset() + page.limit()) as usize };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        let ret_paged = ret[page.offset() as usize..last]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            .iter()
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            .map(|i| i.clone())
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            .collect::<Vec<_>>();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        Ok((ret_paged, count))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    async fn set_state(uuid: Uuid, state: ReservationState) -> Result<(), ServerFnError> {
 | 
					 | 
					 | 
					 | 
					    async fn set_state(uuid: Uuid, state: ReservationState) -> Result<(), ServerFnError> {
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -363,16 +370,18 @@ impl ForValidation for CreateReservation {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#[server]
 | 
					 | 
					 | 
					 | 
					#[server]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					pub async fn get_new_reservations() -> Result<ApiResponse<Vec<ResSumWithItems>>, ServerFnError> {
 | 
					 | 
					 | 
					 | 
					pub async fn get_new_reservations(page: Page) -> Result<ApiResponse<PagedResponse<ResSumWithItems>>, ServerFnError> {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    use crate::perm_check;
 | 
					 | 
					 | 
					 | 
					    use crate::perm_check;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    use chrono::{Days, Local};
 | 
					 | 
					 | 
					 | 
					    use chrono::{Days, Local};
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    use crate::backend::data::ReservationState;
 | 
					 | 
					 | 
					 | 
					    use crate::backend::data::ReservationState;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    perm_check!(is_logged_in);
 | 
					 | 
					 | 
					 | 
					    perm_check!(is_logged_in);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(reservations_in_range(&Local::now().date_naive(),
 | 
					 | 
					 | 
					 | 
					    let res = reservations_in_range(&Local::now().date_naive(),
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                               &Local::now().checked_add_days(Days::new(7)).unwrap().date_naive(),
 | 
					 | 
					 | 
					 | 
					                                    &Local::now().checked_add_days(Days::new(60)).unwrap().date_naive(),
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                               Some(ReservationState::New)).await?))
 | 
					 | 
					 | 
					 | 
					                                    Some(ReservationState::New), page).await?;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(PagedResponse::new(res.0, page, res.1)))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#[server]
 | 
					 | 
					 | 
					 | 
					#[server]
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -385,7 +394,7 @@ pub async fn get_next_reservations() -> Result<ApiResponse<Vec<ResSumWithItems>>
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(reservations_in_range(&Local::now().date_naive(),
 | 
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(reservations_in_range(&Local::now().date_naive(),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                               &Local::now().checked_add_days(Days::new(7)).unwrap().date_naive(),
 | 
					 | 
					 | 
					 | 
					                                               &Local::now().checked_add_days(Days::new(7)).unwrap().date_naive(),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                               Some(ReservationState::Approved)).await?))
 | 
					 | 
					 | 
					 | 
					                                               Some(ReservationState::Approved), Page::default()).await?.0))
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#[cfg(feature = "ssr")]
 | 
					 | 
					 | 
					 | 
					#[cfg(feature = "ssr")]
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -402,9 +411,9 @@ fn num_days(month: u32, year: i32) -> i64 {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					pub async fn get_reservations_for_month(month: u32, year: i32) -> Result<ApiResponse<Vec<ResSumWithItems>>, ServerFnError> {
 | 
					 | 
					 | 
					 | 
					pub async fn get_reservations_for_month(month: u32, year: i32) -> Result<ApiResponse<Vec<ResSumWithItems>>, ServerFnError> {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    let data = reservations_in_range(&NaiveDate::from_ymd_opt(year, month, 1).unwrap(),
 | 
					 | 
					 | 
					 | 
					    let data = reservations_in_range(&NaiveDate::from_ymd_opt(year, month, 1).unwrap(),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        &NaiveDate::from_ymd_opt(year, month, num_days(month, year).to_u32().unwrap_or_default()).unwrap(),
 | 
					 | 
					 | 
					 | 
					        &NaiveDate::from_ymd_opt(year, month, num_days(month, year).to_u32().unwrap_or_default()).unwrap(),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        None).await?;
 | 
					 | 
					 | 
					 | 
					        None, Page::default()).await?;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(data))
 | 
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(data.0))
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#[server]
 | 
					 | 
					 | 
					 | 
					#[server]
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -522,8 +531,8 @@ pub async fn reservations_in_month(year: i32, month: u32) -> Result<ApiResponse<
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    let ret = reservations_in_range(&NaiveDate::from_ymd_opt(year, month, 1).ok_or(ServerFnError::new("Cannot parse date"))?,
 | 
					 | 
					 | 
					 | 
					    let ret = reservations_in_range(&NaiveDate::from_ymd_opt(year, month, 1).ok_or(ServerFnError::new("Cannot parse date"))?,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                          &NaiveDate::from_ymd_opt(year, month, num_days(month, year).to_u32().unwrap_or_default())
 | 
					 | 
					 | 
					 | 
					                          &NaiveDate::from_ymd_opt(year, month, num_days(month, year).to_u32().unwrap_or_default())
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                              .ok_or(ServerFnError::new("Cannot parse date"))?,
 | 
					 | 
					 | 
					 | 
					                              .ok_or(ServerFnError::new("Cannot parse date"))?,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                          None)
 | 
					 | 
					 | 
					 | 
					                          None, Page::default())
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        .await?;
 | 
					 | 
					 | 
					 | 
					        .await?;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(ret))
 | 
					 | 
					 | 
					 | 
					    Ok(ApiResponse::Data(ret.0))
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 |