|
|
|
@ -8,6 +8,8 @@ use tracing::info;
|
|
|
|
use chrono::prelude::*;
|
|
|
|
use chrono::prelude::*;
|
|
|
|
use crate::db::positive_adjustment::{get_positive_adjustments_target_date_range, DbPositiveAdjustment};
|
|
|
|
use crate::db::positive_adjustment::{get_positive_adjustments_target_date_range, DbPositiveAdjustment};
|
|
|
|
use crate::error::{AppError, QueryExtractor};
|
|
|
|
use crate::error::{AppError, QueryExtractor};
|
|
|
|
|
|
|
|
use crate::session::SessionUser;
|
|
|
|
|
|
|
|
use crate::util::time::tz_offset_to_string;
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Template)]
|
|
|
|
#[derive(Template)]
|
|
|
|
#[template(path = "history.html")]
|
|
|
|
#[template(path = "history.html")]
|
|
|
|
@ -17,6 +19,7 @@ struct HistoryLogTemplate {
|
|
|
|
start_time: String,
|
|
|
|
start_time: String,
|
|
|
|
end_date: String,
|
|
|
|
end_date: String,
|
|
|
|
end_time: String,
|
|
|
|
end_time: String,
|
|
|
|
|
|
|
|
time_zone: String,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Template)]
|
|
|
|
#[derive(Template)]
|
|
|
|
@ -36,12 +39,15 @@ pub struct DatetimeRangeQueryArgs {
|
|
|
|
pub end_date: Option<String>,
|
|
|
|
pub end_date: Option<String>,
|
|
|
|
#[serde(rename = "end-time", alias = "et")]
|
|
|
|
#[serde(rename = "end-time", alias = "et")]
|
|
|
|
pub end_time: Option<String>,
|
|
|
|
pub end_time: Option<String>,
|
|
|
|
|
|
|
|
#[serde(rename = "timezone-offset", alias = "tz")]
|
|
|
|
|
|
|
|
pub time_zone_offset: Option<i32>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub async fn history_log_handler(
|
|
|
|
pub async fn history_log_handler(
|
|
|
|
QueryExtractor(query): QueryExtractor<DatetimeRangeQueryArgs>,
|
|
|
|
QueryExtractor(query): QueryExtractor<DatetimeRangeQueryArgs>,
|
|
|
|
HxRequest(hx_request): HxRequest,
|
|
|
|
HxRequest(hx_request): HxRequest,
|
|
|
|
State(db): State<SqlitePool>
|
|
|
|
State(db): State<SqlitePool>,
|
|
|
|
|
|
|
|
user: SessionUser
|
|
|
|
) -> Result<Response, AppError> {
|
|
|
|
) -> Result<Response, AppError> {
|
|
|
|
|
|
|
|
|
|
|
|
let today = Local::now().naive_local().date();
|
|
|
|
let today = Local::now().naive_local().date();
|
|
|
|
@ -50,7 +56,8 @@ pub async fn history_log_handler(
|
|
|
|
let start_time = query.start_time.unwrap_or("00:00:00".to_string());
|
|
|
|
let start_time = query.start_time.unwrap_or("00:00:00".to_string());
|
|
|
|
let end_date = query.end_date.unwrap_or(today.to_string());
|
|
|
|
let end_date = query.end_date.unwrap_or(today.to_string());
|
|
|
|
let end_time = query.end_time.unwrap_or("11:59:59".to_string());
|
|
|
|
let end_time = query.end_time.unwrap_or("11:59:59".to_string());
|
|
|
|
let timezone = FixedOffset::west_opt(6 * 3600)
|
|
|
|
let tz_offset = query.time_zone_offset.unwrap_or(user.tz_offset);
|
|
|
|
|
|
|
|
let timezone = FixedOffset::east_opt(tz_offset)
|
|
|
|
.ok_or(anyhow::anyhow!("Invalid timezone"))?;
|
|
|
|
.ok_or(anyhow::anyhow!("Invalid timezone"))?;
|
|
|
|
|
|
|
|
|
|
|
|
let naive_start_date = start_date.parse::<NaiveDate>()?;
|
|
|
|
let naive_start_date = start_date.parse::<NaiveDate>()?;
|
|
|
|
@ -84,12 +91,14 @@ pub async fn history_log_handler(
|
|
|
|
Ok(HistoryLogItemFragmentTemplate {items}.into_response())
|
|
|
|
Ok(HistoryLogItemFragmentTemplate {items}.into_response())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
|
|
|
|
let time_zone = tz_offset_to_string(tz_offset);
|
|
|
|
Ok(HistoryLogTemplate {
|
|
|
|
Ok(HistoryLogTemplate {
|
|
|
|
items,
|
|
|
|
items,
|
|
|
|
start_date,
|
|
|
|
start_date,
|
|
|
|
start_time,
|
|
|
|
start_time,
|
|
|
|
end_date,
|
|
|
|
end_date,
|
|
|
|
end_time,
|
|
|
|
end_time,
|
|
|
|
|
|
|
|
time_zone,
|
|
|
|
}.into_response())
|
|
|
|
}.into_response())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|