Skip to content

Commit 6384edf

Browse files
committed
chore: support group by checkbox field
1 parent 60c8ec1 commit 6384edf

File tree

7 files changed

+90
-36
lines changed

7 files changed

+90
-36
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ pub fn delete_select_option_cell(option_id: String, field_rev: &FieldRevision) -
182182
CellRevision::new(data)
183183
}
184184

185-
/// If the cell data is not String type, it should impl this trait.
186185
/// Deserialize the String into cell specific data type.
187186
pub trait FromCellString {
188187
fn from_cell_str(s: &str) -> FlowyResult<Self>
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
use crate::entities::GroupChangesetPB;
22

33
use crate::services::group::controller::MoveGroupRowContext;
4-
use flowy_grid_data_model::revision::RowRevision;
4+
use flowy_grid_data_model::revision::{CellRevision, RowRevision};
55

66
pub trait GroupAction: Send + Sync {
77
type CellDataType;
8+
fn default_cell_rev(&self) -> Option<CellRevision> {
9+
None
10+
}
11+
812
fn can_group(&self, content: &str, cell_data: &Self::CellDataType) -> bool;
913
fn add_row_if_match(&mut self, row_rev: &RowRevision, cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB>;
1014
fn remove_row_if_match(&mut self, row_rev: &RowRevision, cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB>;
11-
1215
fn move_row(&mut self, cell_data: &Self::CellDataType, context: MoveGroupRowContext) -> Vec<GroupChangesetPB>;
1316
}

frontend/rust-lib/flowy-grid/src/services/group/controller.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use flowy_error::FlowyResult;
77
use flowy_grid_data_model::revision::{
88
FieldRevision, GroupConfigurationContentSerde, GroupRevision, RowChangeset, RowRevision, TypeOptionDataDeserializer,
99
};
10-
1110
use std::marker::PhantomData;
1211
use std::sync::Arc;
1312

@@ -193,9 +192,14 @@ where
193192
#[tracing::instrument(level = "trace", skip_all, fields(row_count=%row_revs.len(), group_result))]
194193
fn fill_groups(&mut self, row_revs: &[Arc<RowRevision>], field_rev: &FieldRevision) -> FlowyResult<()> {
195194
for row_rev in row_revs {
196-
if let Some(cell_rev) = row_rev.cells.get(&self.field_id) {
195+
let cell_rev = match row_rev.cells.get(&self.field_id) {
196+
None => self.default_cell_rev(),
197+
Some(cell_rev) => Some(cell_rev.clone()),
198+
};
199+
200+
if let Some(cell_rev) = cell_rev {
197201
let mut grouped_rows: Vec<GroupedRow> = vec![];
198-
let cell_bytes = decode_any_cell_data(cell_rev.data.clone(), field_rev);
202+
let cell_bytes = decode_any_cell_data(cell_rev.data, field_rev);
199203
let cell_data = cell_bytes.parser::<P>()?;
200204
for group in self.group_ctx.concrete_groups() {
201205
if self.can_group(&group.filter_content, &cell_data) {

frontend/rust-lib/flowy-grid/src/services/group/controller_impls/checkbox_controller.rs

Lines changed: 73 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
use crate::entities::GroupChangesetPB;
1+
use crate::entities::{GroupChangesetPB, InsertedRowPB, RowPB};
22
use crate::services::field::{CheckboxCellData, CheckboxCellDataParser, CheckboxTypeOptionPB, CHECK, UNCHECK};
33
use crate::services::group::action::GroupAction;
44
use crate::services::group::configuration::GroupContext;
55
use crate::services::group::controller::{
66
GenericGroupController, GroupController, GroupGenerator, MoveGroupRowContext,
77
};
88

9-
use crate::services::group::GeneratedGroup;
10-
use flowy_grid_data_model::revision::{CheckboxGroupConfigurationRevision, FieldRevision, GroupRevision, RowRevision};
9+
use crate::services::cell::insert_checkbox_cell;
10+
use crate::services::group::{move_group_row, GeneratedGroup};
11+
use flowy_grid_data_model::revision::{
12+
CellRevision, CheckboxGroupConfigurationRevision, FieldRevision, GroupRevision, RowRevision,
13+
};
1114

1215
pub type CheckboxGroupController = GenericGroupController<
1316
CheckboxGroupConfigurationRevision,
@@ -20,30 +23,79 @@ pub type CheckboxGroupContext = GroupContext<CheckboxGroupConfigurationRevision>
2023

2124
impl GroupAction for CheckboxGroupController {
2225
type CellDataType = CheckboxCellData;
23-
fn can_group(&self, _content: &str, _cell_data: &Self::CellDataType) -> bool {
24-
false
26+
fn default_cell_rev(&self) -> Option<CellRevision> {
27+
Some(CellRevision::new(UNCHECK.to_string()))
2528
}
2629

27-
fn add_row_if_match(&mut self, _row_rev: &RowRevision, _cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB> {
28-
todo!()
30+
fn can_group(&self, content: &str, cell_data: &Self::CellDataType) -> bool {
31+
return if cell_data.is_check() {
32+
content == CHECK
33+
} else {
34+
content == UNCHECK
35+
};
2936
}
3037

31-
fn remove_row_if_match(
32-
&mut self,
33-
_row_rev: &RowRevision,
34-
_cell_data: &Self::CellDataType,
35-
) -> Vec<GroupChangesetPB> {
36-
todo!()
38+
fn add_row_if_match(&mut self, row_rev: &RowRevision, cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB> {
39+
let mut changesets = vec![];
40+
self.group_ctx.iter_mut_groups(|group| {
41+
let mut changeset = GroupChangesetPB::new(group.id.clone());
42+
let is_contained = group.contains_row(&row_rev.id);
43+
if group.id == CHECK && cell_data.is_check() {
44+
if !is_contained {
45+
let row_pb = RowPB::from(row_rev);
46+
changeset.inserted_rows.push(InsertedRowPB::new(row_pb.clone()));
47+
group.add_row(row_pb);
48+
}
49+
} else {
50+
if is_contained {
51+
changeset.deleted_rows.push(row_rev.id.clone());
52+
group.remove_row(&row_rev.id);
53+
}
54+
}
55+
if !changeset.is_empty() {
56+
changesets.push(changeset);
57+
}
58+
});
59+
changesets
60+
}
61+
62+
fn remove_row_if_match(&mut self, row_rev: &RowRevision, _cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB> {
63+
let mut changesets = vec![];
64+
self.group_ctx.iter_mut_groups(|group| {
65+
let mut changeset = GroupChangesetPB::new(group.id.clone());
66+
if group.contains_row(&row_rev.id) {
67+
changeset.deleted_rows.push(row_rev.id.clone());
68+
group.remove_row(&row_rev.id);
69+
}
70+
71+
if !changeset.is_empty() {
72+
changesets.push(changeset);
73+
}
74+
});
75+
changesets
3776
}
3877

39-
fn move_row(&mut self, _cell_data: &Self::CellDataType, _context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
40-
todo!()
78+
fn move_row(&mut self, _cell_data: &Self::CellDataType, mut context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
79+
let mut group_changeset = vec![];
80+
self.group_ctx.iter_mut_groups(|group| {
81+
if let Some(changeset) = move_group_row(group, &mut context) {
82+
group_changeset.push(changeset);
83+
}
84+
});
85+
group_changeset
4186
}
4287
}
4388

4489
impl GroupController for CheckboxGroupController {
45-
fn will_create_row(&mut self, _row_rev: &mut RowRevision, _field_rev: &FieldRevision, _group_id: &str) {
46-
todo!()
90+
fn will_create_row(&mut self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) {
91+
match self.group_ctx.get_group(group_id) {
92+
None => tracing::warn!("Can not find the group: {}", group_id),
93+
Some((_, group)) => {
94+
let is_check = group.id == CHECK;
95+
let cell_rev = insert_checkbox_cell(is_check, field_rev);
96+
row_rev.cells.insert(field_rev.id.clone(), cell_rev);
97+
}
98+
}
4799
}
48100
}
49101

@@ -58,13 +110,13 @@ impl GroupGenerator for CheckboxGroupGenerator {
58110
_type_option: &Option<Self::TypeOptionType>,
59111
) -> Vec<GeneratedGroup> {
60112
let check_group = GeneratedGroup {
61-
group_rev: GroupRevision::new("true".to_string(), CHECK.to_string()),
62-
filter_content: "".to_string(),
113+
group_rev: GroupRevision::new(CHECK.to_string(), "".to_string()),
114+
filter_content: CHECK.to_string(),
63115
};
64116

65117
let uncheck_group = GeneratedGroup {
66-
group_rev: GroupRevision::new("false".to_string(), UNCHECK.to_string()),
67-
filter_content: "".to_string(),
118+
group_rev: GroupRevision::new(UNCHECK.to_string(), "".to_string()),
119+
filter_content: UNCHECK.to_string(),
68120
};
69121
vec![check_group, uncheck_group]
70122
}

frontend/rust-lib/flowy-grid/src/services/group/controller_impls/select_option_controller/multi_select_controller.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ impl GroupAction for MultiSelectGroupController {
4646
changesets
4747
}
4848

49-
fn move_row(&mut self, cell_data: &Self::CellDataType, mut context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
49+
fn move_row(&mut self, _cell_data: &Self::CellDataType, mut context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
5050
let mut group_changeset = vec![];
5151
self.group_ctx.iter_mut_groups(|group| {
52-
if let Some(changeset) = move_select_option_row(group, cell_data, &mut context) {
52+
if let Some(changeset) = move_group_row(group, &mut context) {
5353
group_changeset.push(changeset);
5454
}
5555
});

frontend/rust-lib/flowy-grid/src/services/group/controller_impls/select_option_controller/single_select_controller.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ impl GroupAction for SingleSelectGroupController {
4646
changesets
4747
}
4848

49-
fn move_row(&mut self, cell_data: &Self::CellDataType, mut context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
49+
fn move_row(&mut self, _cell_data: &Self::CellDataType, mut context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
5050
let mut group_changeset = vec![];
5151
self.group_ctx.iter_mut_groups(|group| {
52-
if let Some(changeset) = move_select_option_row(group, cell_data, &mut context) {
52+
if let Some(changeset) = move_group_row(group, &mut context) {
5353
group_changeset.push(changeset);
5454
}
5555
});

frontend/rust-lib/flowy-grid/src/services/group/controller_impls/select_option_controller/util.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ pub fn remove_select_option_row(
6262
}
6363
}
6464

65-
pub fn move_select_option_row(
66-
group: &mut Group,
67-
_cell_data: &SelectOptionCellDataPB,
68-
context: &mut MoveGroupRowContext,
69-
) -> Option<GroupChangesetPB> {
65+
pub fn move_group_row(group: &mut Group, context: &mut MoveGroupRowContext) -> Option<GroupChangesetPB> {
7066
let mut changeset = GroupChangesetPB::new(group.id.clone());
7167
let MoveGroupRowContext {
7268
row_rev,

0 commit comments

Comments
 (0)