diff --git a/frontend/rust-lib/flowy-database2/src/services/share/csv/export.rs b/frontend/rust-lib/flowy-database2/src/services/share/csv/export.rs index eb3a11a205..8cb59a1872 100644 --- a/frontend/rust-lib/flowy-database2/src/services/share/csv/export.rs +++ b/frontend/rust-lib/flowy-database2/src/services/share/csv/export.rs @@ -1,9 +1,13 @@ use collab_database::database::Database; +use collab_database::fields::Field; +use collab_database::rows::Cell; use indexmap::IndexMap; use flowy_error::{FlowyError, FlowyResult}; +use crate::entities::FieldType; use crate::services::cell::stringify_cell; +use crate::services::field::{TimestampCellData, TimestampCellDataWrapper}; #[derive(Debug, Clone, Copy)] pub enum CSVFormat { @@ -40,15 +44,32 @@ impl CSVExport { field_by_field_id.insert(field.id.clone(), field); }); let rows = database.get_rows_for_view(&inline_view_id); + + let stringify = |cell: &Cell, field: &Field, style: CSVFormat| match style { + CSVFormat::Original => stringify_cell(cell, field), + CSVFormat::META => serde_json::to_string(cell).unwrap_or_else(|_| "".to_string()), + }; + for row in rows { let cells = field_by_field_id .iter() - .map(|(field_id, field)| match row.cells.get(field_id) { - None => "".to_string(), - Some(cell) => match style { - CSVFormat::Original => stringify_cell(cell, field), - CSVFormat::META => serde_json::to_string(cell).unwrap_or_else(|_| "".to_string()), - }, + .map(|(field_id, field)| { + let field_type = FieldType::from(field.field_type); + match field_type { + FieldType::LastEditedTime | FieldType::CreatedTime => { + let cell_data = if field_type.is_created_time() { + TimestampCellData::new(row.created_at) + } else { + TimestampCellData::new(row.modified_at) + }; + let cell = Cell::from(TimestampCellDataWrapper::from((field_type, cell_data))); + stringify(&cell, field, style) + }, + _ => match row.cells.get(field_id) { + None => "".to_string(), + Some(cell) => stringify(cell, field, style), + }, + } }) .collect::>(); diff --git a/frontend/rust-lib/flowy-database2/tests/database/share_test/export_test.rs b/frontend/rust-lib/flowy-database2/tests/database/share_test/export_test.rs index a33f37cc3f..6351ba0ceb 100644 --- a/frontend/rust-lib/flowy-database2/tests/database/share_test/export_test.rs +++ b/frontend/rust-lib/flowy-database2/tests/database/share_test/export_test.rs @@ -1,3 +1,5 @@ +use chrono::{DateTime, Local, Offset}; +use collab_database::database::timestamp; use flowy_database2::entities::FieldType; use flowy_database2::services::cell::stringify_cell; use flowy_database2::services::field::CHECK; @@ -27,15 +29,36 @@ async fn export_csv_test() { let test = DatabaseEditorTest::new_grid().await; let database = test.editor.clone(); let s = database.export_csv(CSVFormat::Original).await.unwrap(); - let expected = r#"Name,Price,Time,Status,Platform,is urgent,link,TODO,Last Modified,Created At,Related -A,$1,2022/03/14,,"Google,Facebook",Yes,AppFlowy website - https://www.appflowy.io,First thing,,, -,$2,2022/03/14,,"Google,Twitter",Yes,,"Have breakfast,Have lunch,Take a nap,Have dinner,Shower and head to bed",,, -C,$3,2022/03/14,Completed,"Facebook,Google,Twitter",No,,,,, -DA,$14,2022/11/17,Completed,,No,,Task 1,,, -AE,,2022/11/13,Planned,"Facebook,Twitter",No,,,,, -AE,$5,2022/12/25,Planned,Facebook,Yes,,"Sprint,Sprint some more,Rest",,, -CB,,,,,,,,,, -"#; + let format = "%Y/%m/%d %R"; + let naive = chrono::NaiveDateTime::from_timestamp_opt(timestamp(), 0).unwrap(); + let offset = Local::now().offset().fix(); + let date_time = DateTime::::from_naive_utc_and_offset(naive, offset); + let date_string = format!("{}", date_time.format(format)); + let expected = format!( + r#"Name,Price,Time,Status,Platform,is urgent,link,TODO,Last Modified,Created At,Related +A,$1,2022/03/14,,"Google,Facebook",Yes,AppFlowy website - https://www.appflowy.io,First thing,{},{}, +,$2,2022/03/14,,"Google,Twitter",Yes,,"Have breakfast,Have lunch,Take a nap,Have dinner,Shower and head to bed",{},{}, +C,$3,2022/03/14,Completed,"Facebook,Google,Twitter",No,,,{},{}, +DA,$14,2022/11/17,Completed,,No,,Task 1,{},{}, +AE,,2022/11/13,Planned,"Facebook,Twitter",No,,,{},{}, +AE,$5,2022/12/25,Planned,Facebook,Yes,,"Sprint,Sprint some more,Rest",{},{}, +CB,,,,,,,,{},{}, +"#, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + date_string, + ); println!("{}", s); assert_eq!(s, expected); }