Skip to content

Commit 4643851

Browse files
authored
refactor: apply cell change set (#1589)
* refactor: update cell changeset trait * refactor: update cell changeset documentation Co-authored-by: nathan <[email protected]>
1 parent 5d7008e commit 4643851

File tree

12 files changed

+158
-155
lines changed

12 files changed

+158
-155
lines changed

frontend/rust-lib/flowy-grid/src/services/cell/cell_operation.rs

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ pub trait CellDataChangeset: TypeOption {
5555
///
5656
fn apply_changeset(
5757
&self,
58-
changeset: AnyCellChangeset<<Self as TypeOption>::CellChangeset>,
59-
cell_rev: Option<CellRevision>,
58+
changeset: <Self as TypeOption>::CellChangeset,
59+
type_cell_data: Option<TypeCellData>,
6060
) -> FlowyResult<String>;
6161
}
6262

@@ -73,21 +73,18 @@ pub fn apply_cell_data_changeset<C: ToString, T: AsRef<FieldRevision>>(
7373
) -> Result<String, FlowyError> {
7474
let field_rev = field_rev.as_ref();
7575
let changeset = changeset.to_string();
76-
let field_type = field_rev.ty.into();
77-
let s = match field_type {
78-
FieldType::RichText => RichTextTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
79-
FieldType::Number => NumberTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
80-
FieldType::DateTime => DateTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
81-
FieldType::SingleSelect => {
82-
SingleSelectTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev)
83-
}
84-
FieldType::MultiSelect => MultiSelectTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
85-
FieldType::Checklist => ChecklistTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
86-
FieldType::Checkbox => CheckboxTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
87-
FieldType::URL => URLTypeOptionPB::from(field_rev).apply_changeset(changeset.into(), cell_rev),
88-
}?;
76+
let field_type: FieldType = field_rev.ty.into();
77+
78+
let type_cell_data = cell_rev.and_then(|cell_rev| match TypeCellData::try_from(cell_rev) {
79+
Ok(type_cell_data) => Some(type_cell_data),
80+
Err(_) => None,
81+
});
8982

90-
Ok(TypeCellData::new(s, field_type).to_json())
83+
let cell_data = match FieldRevisionExt::new(field_rev).get_type_option_cell_data_handler(&field_type) {
84+
None => "".to_string(),
85+
Some(handler) => handler.handle_cell_changeset(changeset, type_cell_data)?,
86+
};
87+
Ok(TypeCellData::new(cell_data, field_type).to_json())
9188
}
9289

9390
pub fn decode_type_cell_data<T: TryInto<TypeCellData, Error = FlowyError> + Debug>(
@@ -138,7 +135,7 @@ pub fn try_decode_cell_data(
138135
to_field_type: &FieldType,
139136
field_rev: &FieldRevision,
140137
) -> FlowyResult<CellProtobufBlob> {
141-
match FieldRevisionExt::new(field_rev).get_type_option_handler(to_field_type) {
138+
match FieldRevisionExt::new(field_rev).get_type_option_cell_data_handler(to_field_type) {
142139
None => Ok(CellProtobufBlob::default()),
143140
Some(handler) => handler.handle_cell_data(cell_data, from_field_type, field_rev),
144141
}
@@ -154,7 +151,7 @@ pub fn stringify_cell_data(
154151
to_field_type: &FieldType,
155152
field_rev: &FieldRevision,
156153
) -> String {
157-
match FieldRevisionExt::new(field_rev).get_type_option_handler(to_field_type) {
154+
match FieldRevisionExt::new(field_rev).get_type_option_cell_data_handler(to_field_type) {
158155
None => "".to_string(),
159156
Some(handler) => handler.stringify_cell_data(cell_data, from_field_type, field_rev),
160157
}
@@ -269,6 +266,15 @@ pub trait FromCellChangeset {
269266
Self: Sized;
270267
}
271268

269+
impl FromCellChangeset for String {
270+
fn from_changeset(changeset: String) -> FlowyResult<Self>
271+
where
272+
Self: Sized,
273+
{
274+
Ok(changeset)
275+
}
276+
}
277+
272278
pub struct AnyCellChangeset<T>(pub Option<T>);
273279

274280
impl<T> AnyCellChangeset<T> {
@@ -294,8 +300,8 @@ where
294300
}
295301
}
296302
}
297-
impl std::convert::From<String> for AnyCellChangeset<String> {
298-
fn from(s: String) -> Self {
299-
AnyCellChangeset(Some(s))
300-
}
301-
}
303+
// impl std::convert::From<String> for AnyCellChangeset<String> {
304+
// fn from(s: String) -> Self {
305+
// AnyCellChangeset(Some(s))
306+
// }
307+
// }

frontend/rust-lib/flowy-grid/src/services/field/type_options/checkbox_type_option/checkbox_type_option.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use crate::entities::{CheckboxFilterPB, FieldType};
22
use crate::impl_type_option;
3-
use crate::services::cell::{AnyCellChangeset, CellDataChangeset, CellDataDecoder, FromCellString};
3+
use crate::services::cell::{CellDataChangeset, CellDataDecoder, FromCellString, TypeCellData};
44
use crate::services::field::{
55
BoxTypeOptionBuilder, CheckboxCellData, TypeOption, TypeOptionBuilder, TypeOptionCellData, TypeOptionConfiguration,
66
TypeOptionTransform,
77
};
88
use bytes::Bytes;
99
use flowy_derive::ProtoBuf;
10-
use flowy_error::{FlowyError, FlowyResult};
11-
use grid_rev_model::{CellRevision, FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
10+
use flowy_error::FlowyResult;
11+
use grid_rev_model::{FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
1212
use serde::{Deserialize, Serialize};
1313
use std::str::FromStr;
1414

@@ -87,10 +87,9 @@ pub type CheckboxCellChangeset = String;
8787
impl CellDataChangeset for CheckboxTypeOptionPB {
8888
fn apply_changeset(
8989
&self,
90-
changeset: AnyCellChangeset<CheckboxCellChangeset>,
91-
_cell_rev: Option<CellRevision>,
92-
) -> Result<String, FlowyError> {
93-
let changeset = changeset.try_into_inner()?;
90+
changeset: <Self as TypeOption>::CellChangeset,
91+
_type_cell_data: Option<TypeCellData>,
92+
) -> FlowyResult<String> {
9493
let cell_data = CheckboxCellData::from_str(&changeset)?;
9594
Ok(cell_data.to_string())
9695
}

frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option/date_tests.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,12 @@ mod tests {
147147
expected_str: &str,
148148
field_rev: &FieldRevision,
149149
) {
150-
let s = serde_json::to_string(&DateCellChangeset {
150+
let changeset = DateCellChangeset {
151151
date: Some(timestamp.to_string()),
152152
time: include_time_str,
153153
is_utc: false,
154-
})
155-
.unwrap();
156-
let encoded_data = type_option.apply_changeset(s.into(), None).unwrap();
154+
};
155+
let encoded_data = type_option.apply_changeset(changeset, None).unwrap();
157156

158157
assert_eq!(
159158
decode_cell_data(encoded_data, type_option, field_rev),

frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option/date_type_option.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::entities::{DateFilterPB, FieldType};
22
use crate::impl_type_option;
3-
use crate::services::cell::{AnyCellChangeset, CellDataChangeset, CellDataDecoder, FromCellString};
3+
use crate::services::cell::{CellDataChangeset, CellDataDecoder, FromCellString, TypeCellData};
44
use crate::services::field::{
55
BoxTypeOptionBuilder, DateCellChangeset, DateCellData, DateCellDataPB, DateFormat, TimeFormat, TypeOption,
66
TypeOptionBuilder, TypeOptionCellData, TypeOptionConfiguration, TypeOptionTransform,
@@ -10,7 +10,7 @@ use chrono::format::strftime::StrftimeItems;
1010
use chrono::{NaiveDateTime, Timelike};
1111
use flowy_derive::ProtoBuf;
1212
use flowy_error::{ErrorCode, FlowyError, FlowyResult};
13-
use grid_rev_model::{CellRevision, FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
13+
use grid_rev_model::{FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
1414
use serde::{Deserialize, Serialize};
1515

1616
// Date
@@ -156,10 +156,9 @@ impl CellDataDecoder for DateTypeOptionPB {
156156
impl CellDataChangeset for DateTypeOptionPB {
157157
fn apply_changeset(
158158
&self,
159-
changeset: AnyCellChangeset<DateCellChangeset>,
160-
_cell_rev: Option<CellRevision>,
161-
) -> Result<String, FlowyError> {
162-
let changeset = changeset.try_into_inner()?;
159+
changeset: <Self as TypeOption>::CellChangeset,
160+
_type_cell_data: Option<TypeCellData>,
161+
) -> FlowyResult<String> {
163162
let cell_data = match changeset.date_timestamp() {
164163
None => 0,
165164
Some(date_timestamp) => match (self.include_time, changeset.time) {

frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option/number_type_option.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use crate::entities::{FieldType, NumberFilterPB};
22
use crate::impl_type_option;
3-
use crate::services::cell::{AnyCellChangeset, CellComparable, CellDataChangeset, CellDataDecoder};
3+
use crate::services::cell::{CellComparable, CellDataChangeset, CellDataDecoder, TypeCellData};
44
use crate::services::field::type_options::number_type_option::format::*;
55
use crate::services::field::{
66
BoxTypeOptionBuilder, NumberCellData, StrCellData, TypeOption, TypeOptionBuilder, TypeOptionCellData,
77
TypeOptionConfiguration, TypeOptionTransform,
88
};
99
use bytes::Bytes;
1010
use flowy_derive::ProtoBuf;
11-
use flowy_error::{FlowyError, FlowyResult};
12-
use grid_rev_model::{CellRevision, FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
11+
use flowy_error::FlowyResult;
12+
use grid_rev_model::{FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
1313
use rust_decimal::Decimal;
1414
use serde::{Deserialize, Serialize};
1515
use std::cmp::Ordering;
@@ -156,10 +156,9 @@ pub type NumberCellChangeset = String;
156156
impl CellDataChangeset for NumberTypeOptionPB {
157157
fn apply_changeset(
158158
&self,
159-
changeset: AnyCellChangeset<NumberCellChangeset>,
160-
_cell_rev: Option<CellRevision>,
161-
) -> Result<String, FlowyError> {
162-
let changeset = changeset.try_into_inner()?;
159+
changeset: <Self as TypeOption>::CellChangeset,
160+
_type_cell_data: Option<TypeCellData>,
161+
) -> FlowyResult<String> {
163162
let data = changeset.trim().to_string();
164163
let _ = self.format_cell_data(&data)?;
165164
Ok(data)

frontend/rust-lib/flowy-grid/src/services/field/type_options/selection_type_option/checklist_type_option.rs

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use crate::entities::{ChecklistFilterPB, FieldType};
22
use crate::impl_type_option;
3-
use crate::services::cell::{AnyCellChangeset, CellDataChangeset, FromCellString, TypeCellData};
3+
use crate::services::cell::{CellDataChangeset, FromCellString, TypeCellData};
44

55
use crate::services::field::{
66
BoxTypeOptionBuilder, SelectOptionCellChangeset, SelectOptionCellDataPB, SelectOptionIds, SelectOptionPB,
77
SelectTypeOptionSharedAction, TypeOption, TypeOptionBuilder, TypeOptionCellData, TypeOptionConfiguration,
88
};
99
use bytes::Bytes;
1010
use flowy_derive::ProtoBuf;
11-
use flowy_error::{FlowyError, FlowyResult};
12-
use grid_rev_model::{CellRevision, FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
11+
use flowy_error::FlowyResult;
12+
use grid_rev_model::{FieldRevision, TypeOptionDataDeserializer, TypeOptionDataSerializer};
1313
use serde::{Deserialize, Serialize};
1414

1515
// Multiple select
@@ -60,31 +60,26 @@ impl SelectTypeOptionSharedAction for ChecklistTypeOptionPB {
6060
impl CellDataChangeset for ChecklistTypeOptionPB {
6161
fn apply_changeset(
6262
&self,
63-
changeset: AnyCellChangeset<SelectOptionCellChangeset>,
64-
cell_rev: Option<CellRevision>,
65-
) -> Result<String, FlowyError> {
66-
let content_changeset = changeset.try_into_inner()?;
67-
68-
let insert_option_ids = content_changeset
63+
changeset: <Self as TypeOption>::CellChangeset,
64+
type_cell_data: Option<TypeCellData>,
65+
) -> FlowyResult<String> {
66+
let insert_option_ids = changeset
6967
.insert_option_ids
7068
.into_iter()
7169
.filter(|insert_option_id| self.options.iter().any(|option| &option.id == insert_option_id))
7270
.collect::<Vec<String>>();
7371

74-
match cell_rev {
72+
match type_cell_data {
7573
None => Ok(SelectOptionIds::from(insert_option_ids).to_string()),
76-
Some(cell_rev) => {
77-
let cell_data = TypeCellData::try_from(cell_rev)
78-
.map(|data| data.into_inner())
79-
.unwrap_or_default();
80-
let mut select_ids: SelectOptionIds = cell_data.into();
74+
Some(type_cell_data) => {
75+
let mut select_ids: SelectOptionIds = type_cell_data.data.into();
8176
for insert_option_id in insert_option_ids {
8277
if !select_ids.contains(&insert_option_id) {
8378
select_ids.push(insert_option_id);
8479
}
8580
}
8681

87-
for delete_option_id in content_changeset.delete_option_ids {
82+
for delete_option_id in changeset.delete_option_ids {
8883
select_ids.retain(|id| id != &delete_option_id);
8984
}
9085

0 commit comments

Comments
 (0)