|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
use leptos::*;
|
|
|
|
|
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 cfg_if::cfg_if;
|
|
|
|
|
use chrono::{NaiveDate, NaiveTime};
|
|
|
|
@ -89,9 +89,9 @@ cfg_if! { if #[cfg(feature = "ssr")] {
|
|
|
|
|
.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 view = if let Some(s) = state {
|
|
|
|
|
let view = if let Some(s) = &state {
|
|
|
|
|
query_as::<_, ResAllView>(
|
|
|
|
|
"SELECT r.from, r.to, p.name, p.description, s.*, c.full_name, c.email, c.phone \
|
|
|
|
|
FROM reservation r \
|
|
|
|
@ -131,7 +131,7 @@ cfg_if! { if #[cfg(feature = "ssr")] {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if view.is_empty() {
|
|
|
|
|
return Ok(vec![])
|
|
|
|
|
return Ok((vec![], 0))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let mut ret = view.into_iter().fold(HashMap::new(), |mut m, v| {
|
|
|
|
@ -148,7 +148,14 @@ cfg_if! { if #[cfg(feature = "ssr")] {
|
|
|
|
|
}).collect::<Vec<_>>();
|
|
|
|
|
|
|
|
|
|
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> {
|
|
|
|
@ -363,16 +370,18 @@ impl ForValidation for CreateReservation {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[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 chrono::{Days, Local};
|
|
|
|
|
use crate::backend::data::ReservationState;
|
|
|
|
|
|
|
|
|
|
perm_check!(is_logged_in);
|
|
|
|
|
|
|
|
|
|
Ok(ApiResponse::Data(reservations_in_range(&Local::now().date_naive(),
|
|
|
|
|
&Local::now().checked_add_days(Days::new(7)).unwrap().date_naive(),
|
|
|
|
|
Some(ReservationState::New)).await?))
|
|
|
|
|
let res = reservations_in_range(&Local::now().date_naive(),
|
|
|
|
|
&Local::now().checked_add_days(Days::new(60)).unwrap().date_naive(),
|
|
|
|
|
Some(ReservationState::New), page).await?;
|
|
|
|
|
|
|
|
|
|
Ok(ApiResponse::Data(PagedResponse::new(res.0, page, res.1)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[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(),
|
|
|
|
|
&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")]
|
|
|
|
@ -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> {
|
|
|
|
|
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(),
|
|
|
|
|
None).await?;
|
|
|
|
|
None, Page::default()).await?;
|
|
|
|
|
|
|
|
|
|
Ok(ApiResponse::Data(data))
|
|
|
|
|
Ok(ApiResponse::Data(data.0))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[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"))?,
|
|
|
|
|
&NaiveDate::from_ymd_opt(year, month, num_days(month, year).to_u32().unwrap_or_default())
|
|
|
|
|
.ok_or(ServerFnError::new("Cannot parse date"))?,
|
|
|
|
|
None)
|
|
|
|
|
None, Page::default())
|
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
|
|
Ok(ApiResponse::Data(ret))
|
|
|
|
|
Ok(ApiResponse::Data(ret.0))
|
|
|
|
|
}
|