|
@@ -13,8 +13,8 @@ use flowy_error::{ErrorCode, FlowyError, FlowyResult};
|
|
|
use crate::entities::{DateCellDataPB, DateFilterPB, FieldType};
|
|
|
use crate::services::cell::{CellDataChangeset, CellDataDecoder};
|
|
|
use crate::services::field::{
|
|
|
- default_order, DateCellChangeset, DateCellData, DateCellDataWrapper, DateFormat, TimeFormat,
|
|
|
- TypeOption, TypeOptionCellDataCompare, TypeOptionCellDataFilter, TypeOptionCellDataSerde,
|
|
|
+ default_order, DateCellChangeset, DateCellData, DateFormat, TimeFormat, TypeOption,
|
|
|
+ TypeOptionCellDataCompare, TypeOptionCellDataFilter, TypeOptionCellDataSerde,
|
|
|
TypeOptionTransform,
|
|
|
};
|
|
|
use crate::services::sort::SortCondition;
|
|
@@ -27,7 +27,6 @@ pub struct DateTypeOption {
|
|
|
pub date_format: DateFormat,
|
|
|
pub time_format: TimeFormat,
|
|
|
pub timezone_id: String,
|
|
|
- pub field_type: FieldType,
|
|
|
}
|
|
|
|
|
|
impl Default for DateTypeOption {
|
|
@@ -36,7 +35,6 @@ impl Default for DateTypeOption {
|
|
|
date_format: Default::default(),
|
|
|
time_format: Default::default(),
|
|
|
timezone_id: Default::default(),
|
|
|
- field_type: FieldType::DateTime,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -59,15 +57,10 @@ impl From<TypeOptionData> for DateTypeOption {
|
|
|
.map(TimeFormat::from)
|
|
|
.unwrap_or_default();
|
|
|
let timezone_id = data.get_str_value("timezone_id").unwrap_or_default();
|
|
|
- let field_type = data
|
|
|
- .get_i64_value("field_type")
|
|
|
- .map(FieldType::from)
|
|
|
- .unwrap_or(FieldType::DateTime);
|
|
|
Self {
|
|
|
date_format,
|
|
|
time_format,
|
|
|
timezone_id,
|
|
|
- field_type,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -78,7 +71,6 @@ impl From<DateTypeOption> for TypeOptionData {
|
|
|
.insert_i64_value("date_format", data.date_format.value())
|
|
|
.insert_i64_value("time_format", data.time_format.value())
|
|
|
.insert_str_value("timezone_id", data.timezone_id)
|
|
|
- .insert_i64_value("field_type", data.field_type.value())
|
|
|
.build()
|
|
|
}
|
|
|
}
|
|
@@ -88,7 +80,16 @@ impl TypeOptionCellDataSerde for DateTypeOption {
|
|
|
&self,
|
|
|
cell_data: <Self as TypeOption>::CellData,
|
|
|
) -> <Self as TypeOption>::CellProtobufType {
|
|
|
- self.today_desc_from_timestamp(cell_data)
|
|
|
+ let timestamp = cell_data.timestamp;
|
|
|
+ let include_time = cell_data.include_time;
|
|
|
+ let (date, time) = self.formatted_date_time_from_timestamp(×tamp);
|
|
|
+
|
|
|
+ DateCellDataPB {
|
|
|
+ date,
|
|
|
+ time,
|
|
|
+ timestamp: timestamp.unwrap_or_default(),
|
|
|
+ include_time,
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
fn parse_cell(&self, cell: &Cell) -> FlowyResult<<Self as TypeOption>::CellData> {
|
|
@@ -97,46 +98,50 @@ impl TypeOptionCellDataSerde for DateTypeOption {
|
|
|
}
|
|
|
|
|
|
impl DateTypeOption {
|
|
|
- pub fn new(field_type: FieldType) -> Self {
|
|
|
- Self {
|
|
|
- field_type,
|
|
|
- ..Default::default()
|
|
|
- }
|
|
|
+ pub fn new() -> Self {
|
|
|
+ Self::default()
|
|
|
}
|
|
|
|
|
|
pub fn test() -> Self {
|
|
|
Self {
|
|
|
timezone_id: "Etc/UTC".to_owned(),
|
|
|
- field_type: FieldType::DateTime,
|
|
|
..Self::default()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fn today_desc_from_timestamp(&self, cell_data: DateCellData) -> DateCellDataPB {
|
|
|
- let timestamp = cell_data.timestamp.unwrap_or_default();
|
|
|
- let include_time = cell_data.include_time;
|
|
|
-
|
|
|
- let (date, time) = match cell_data.timestamp {
|
|
|
- Some(timestamp) => {
|
|
|
- let naive = chrono::NaiveDateTime::from_timestamp_opt(timestamp, 0).unwrap();
|
|
|
- let offset = self.get_timezone_offset(naive);
|
|
|
- let date_time = DateTime::<Local>::from_utc(naive, offset);
|
|
|
-
|
|
|
- let fmt = self.date_format.format_str();
|
|
|
- let date = format!("{}", date_time.format(fmt));
|
|
|
- let fmt = self.time_format.format_str();
|
|
|
- let time = format!("{}", date_time.format(fmt));
|
|
|
+ fn formatted_date_time_from_timestamp(&self, timestamp: &Option<i64>) -> (String, String) {
|
|
|
+ if let Some(timestamp) = timestamp {
|
|
|
+ let naive = chrono::NaiveDateTime::from_timestamp_opt(*timestamp, 0).unwrap();
|
|
|
+ let offset = self.get_timezone_offset(naive);
|
|
|
+ let date_time = DateTime::<Local>::from_utc(naive, offset);
|
|
|
+
|
|
|
+ let fmt = self.date_format.format_str();
|
|
|
+ let date = format!("{}", date_time.format(fmt));
|
|
|
+ let fmt = self.time_format.format_str();
|
|
|
+ let time = format!("{}", date_time.format(fmt));
|
|
|
+ (date, time)
|
|
|
+ } else {
|
|
|
+ ("".to_owned(), "".to_owned())
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- (date, time)
|
|
|
+ fn naive_time_from_time_string(
|
|
|
+ &self,
|
|
|
+ include_time: bool,
|
|
|
+ time_str: Option<String>,
|
|
|
+ ) -> FlowyResult<Option<NaiveTime>> {
|
|
|
+ match (include_time, time_str) {
|
|
|
+ (true, Some(time_str)) => {
|
|
|
+ let result = NaiveTime::parse_from_str(&time_str, self.time_format.format_str());
|
|
|
+ match result {
|
|
|
+ Ok(time) => Ok(Some(time)),
|
|
|
+ Err(_e) => {
|
|
|
+ let msg = format!("Parse {} failed", time_str);
|
|
|
+ Err(FlowyError::new(ErrorCode::InvalidDateTimeFormat, msg))
|
|
|
+ },
|
|
|
+ }
|
|
|
},
|
|
|
- None => ("".to_owned(), "".to_owned()),
|
|
|
- };
|
|
|
-
|
|
|
- DateCellDataPB {
|
|
|
- date,
|
|
|
- time,
|
|
|
- include_time,
|
|
|
- timestamp,
|
|
|
+ _ => Ok(None),
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -211,7 +216,14 @@ impl CellDataDecoder for DateTypeOption {
|
|
|
}
|
|
|
|
|
|
fn stringify_cell_data(&self, cell_data: <Self as TypeOption>::CellData) -> String {
|
|
|
- self.today_desc_from_timestamp(cell_data).date
|
|
|
+ let timestamp = cell_data.timestamp;
|
|
|
+ let include_time = cell_data.include_time;
|
|
|
+ let (date_string, time_string) = self.formatted_date_time_from_timestamp(×tamp);
|
|
|
+ if include_time && timestamp.is_some() {
|
|
|
+ format!("{} {}", date_string, time_string)
|
|
|
+ } else {
|
|
|
+ date_string
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
fn stringify_cell(&self, cell: &Cell) -> String {
|
|
@@ -236,15 +248,12 @@ impl CellDataChangeset for DateTypeOption {
|
|
|
};
|
|
|
|
|
|
if changeset.clear_flag == Some(true) {
|
|
|
- let (timestamp, include_time) = (None, include_time);
|
|
|
-
|
|
|
let cell_data = DateCellData {
|
|
|
- timestamp,
|
|
|
+ timestamp: None,
|
|
|
include_time,
|
|
|
};
|
|
|
|
|
|
- let cell_wrapper: DateCellDataWrapper = (self.field_type.clone(), cell_data.clone()).into();
|
|
|
- return Ok((Cell::from(cell_wrapper), cell_data));
|
|
|
+ return Ok((Cell::from(&cell_data), cell_data));
|
|
|
}
|
|
|
|
|
|
// update include_time if necessary
|
|
@@ -256,27 +265,12 @@ impl CellDataChangeset for DateTypeOption {
|
|
|
// order to change the day without changing the time, the old time string
|
|
|
// should be passed in as well.
|
|
|
|
|
|
- let changeset_timestamp = changeset.date;
|
|
|
-
|
|
|
- // parse the time string, which is in the local timezone
|
|
|
- let parsed_time = match (include_time, changeset.time) {
|
|
|
- (true, Some(time_str)) => {
|
|
|
- let result = NaiveTime::parse_from_str(&time_str, self.time_format.format_str());
|
|
|
- match result {
|
|
|
- Ok(time) => Ok(Some(time)),
|
|
|
- Err(_e) => {
|
|
|
- let msg = format!("Parse {} failed", time_str);
|
|
|
- Err(FlowyError::new(ErrorCode::InvalidDateTimeFormat, msg))
|
|
|
- },
|
|
|
- }
|
|
|
- },
|
|
|
- _ => Ok(None),
|
|
|
- }?;
|
|
|
+ let parsed_time = self.naive_time_from_time_string(include_time, changeset.time)?;
|
|
|
|
|
|
let timestamp = self.timestamp_from_parsed_time_previous_and_new_timestamp(
|
|
|
parsed_time,
|
|
|
previous_timestamp,
|
|
|
- changeset_timestamp,
|
|
|
+ changeset.date,
|
|
|
);
|
|
|
|
|
|
let cell_data = DateCellData {
|
|
@@ -284,8 +278,7 @@ impl CellDataChangeset for DateTypeOption {
|
|
|
include_time,
|
|
|
};
|
|
|
|
|
|
- let cell_wrapper: DateCellDataWrapper = (self.field_type.clone(), cell_data.clone()).into();
|
|
|
- Ok((Cell::from(cell_wrapper), cell_data))
|
|
|
+ Ok((Cell::from(&cell_data), cell_data))
|
|
|
}
|
|
|
}
|
|
|
|