Skip to content

Commit a216121

Browse files
authored
feat: can transform options from single & multi select (#1493)
* feat: can transform options from single & multi select * test: add single-multi switch test
1 parent 6361368 commit a216121

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,27 @@ mod tests {
134134
debug_assert_eq!(multi_select.0.options.len(), 2);
135135
}
136136

137+
#[test]
138+
fn multi_select_transform_with_multiselect_option_test() {
139+
let mut singleselect_type_option_builder = SingleSelectTypeOptionBuilder::default();
140+
141+
let google = SelectOptionPB::new("Google");
142+
singleselect_type_option_builder = singleselect_type_option_builder.add_option(google);
143+
144+
let facebook = SelectOptionPB::new("Facebook");
145+
singleselect_type_option_builder = singleselect_type_option_builder.add_option(facebook);
146+
147+
let singleselect_type_option_data = singleselect_type_option_builder.serializer().json_str();
148+
149+
let mut multi_select = MultiSelectTypeOptionBuilder::default();
150+
multi_select.transform(&FieldType::MultiSelect, singleselect_type_option_data.clone());
151+
debug_assert_eq!(multi_select.0.options.len(), 2);
152+
153+
// Already contain the yes/no option. It doesn't need to insert new options
154+
multi_select.transform(&FieldType::MultiSelect, singleselect_type_option_data);
155+
debug_assert_eq!(multi_select.0.options.len(), 2);
156+
}
157+
137158
// #[test]
138159

139160
#[test]

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,27 @@ mod tests {
120120
debug_assert_eq!(single_select.0.options.len(), 2);
121121
}
122122

123+
#[test]
124+
fn single_select_transform_with_multiselect_option_test() {
125+
let mut multiselect_type_option_builder = MultiSelectTypeOptionBuilder::default();
126+
127+
let google = SelectOptionPB::new("Google");
128+
multiselect_type_option_builder = multiselect_type_option_builder.add_option(google);
129+
130+
let facebook = SelectOptionPB::new("Facebook");
131+
multiselect_type_option_builder = multiselect_type_option_builder.add_option(facebook);
132+
133+
let multiselect_type_option_data = multiselect_type_option_builder.serializer().json_str();
134+
135+
let mut single_select = SingleSelectTypeOptionBuilder::default();
136+
single_select.transform(&FieldType::MultiSelect, multiselect_type_option_data.clone());
137+
debug_assert_eq!(single_select.0.options.len(), 2);
138+
139+
// Already contain the yes/no option. It doesn't need to insert new options
140+
single_select.transform(&FieldType::MultiSelect, multiselect_type_option_data);
141+
debug_assert_eq!(single_select.0.options.len(), 2);
142+
}
143+
123144
#[test]
124145
fn single_select_insert_multi_option_test() {
125146
let google = SelectOptionPB::new("Google");

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use crate::entities::FieldType;
22
use crate::services::cell::{CellBytes, CellData};
33
use crate::services::field::{
4-
SelectOptionColorPB, SelectOptionIds, SelectOptionPB, SelectTypeOptionSharedAction, CHECK, UNCHECK,
4+
MultiSelectTypeOptionPB, SelectOptionColorPB, SelectOptionIds, SelectOptionPB, SelectTypeOptionSharedAction,
5+
SingleSelectTypeOptionPB, CHECK, UNCHECK,
56
};
67
use flowy_error::FlowyResult;
78
use grid_rev_model::FieldRevision;
9+
use serde_json;
810

911
/// Handles how to transform the cell data when switching between different field types
1012
pub struct SelectOptionTypeOptionTransformer();
@@ -33,7 +35,22 @@ impl SelectOptionTypeOptionTransformer {
3335
shared.mut_options().push(uncheck_option);
3436
}
3537
}
36-
FieldType::MultiSelect => {}
38+
FieldType::MultiSelect => {
39+
let option_pb: MultiSelectTypeOptionPB = serde_json::from_str(_type_option_data.as_str()).unwrap();
40+
option_pb.options.iter().for_each(|new_option| {
41+
if !shared.options().iter().any(|option| option.name == new_option.name) {
42+
shared.mut_options().push(new_option.clone());
43+
}
44+
})
45+
}
46+
FieldType::SingleSelect => {
47+
let option_pb: SingleSelectTypeOptionPB = serde_json::from_str(_type_option_data.as_str()).unwrap();
48+
option_pb.options.iter().for_each(|new_option| {
49+
if !shared.options().iter().any(|option| option.name == new_option.name) {
50+
shared.mut_options().push(new_option.clone());
51+
}
52+
})
53+
}
3754
_ => {}
3855
}
3956
}

0 commit comments

Comments
 (0)