1- use crate :: entities:: GroupChangesetPB ;
1+ use crate :: entities:: { GroupChangesetPB , InsertedRowPB , RowPB } ;
22use crate :: services:: field:: { CheckboxCellData , CheckboxCellDataParser , CheckboxTypeOptionPB , CHECK , UNCHECK } ;
33use crate :: services:: group:: action:: GroupAction ;
44use crate :: services:: group:: configuration:: GroupContext ;
55use 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
1215pub type CheckboxGroupController = GenericGroupController <
1316 CheckboxGroupConfigurationRevision ,
@@ -20,30 +23,79 @@ pub type CheckboxGroupContext = GroupContext<CheckboxGroupConfigurationRevision>
2023
2124impl 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
4489impl 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 }
0 commit comments