Skip to content

Commit ee1f9d4

Browse files
authored
Merge pull request #934 from AppFlowy-IO/feat/board_default_column
feat: support board no status column
2 parents 03a5756 + 6e71d6d commit ee1f9d4

File tree

12 files changed

+234
-78
lines changed

12 files changed

+234
-78
lines changed

frontend/app_flowy/assets/translations/en.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,5 +221,10 @@
221221
"timeHintTextInTwelveHour": "12:00 AM",
222222
"timeHintTextInTwentyFourHour": "12:00"
223223
}
224+
},
225+
"board": {
226+
"column": {
227+
"create_new_card": "New"
228+
}
224229
}
225-
}
230+
}

frontend/app_flowy/lib/plugins/board/presentation/board_page.dart

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@
22

33
import 'dart:collection';
44

5+
import 'package:app_flowy/generated/locale_keys.g.dart';
56
import 'package:app_flowy/plugins/board/application/card/card_data_controller.dart';
67
import 'package:app_flowy/plugins/grid/application/row/row_cache.dart';
78
import 'package:app_flowy/plugins/grid/application/field/field_cache.dart';
89
import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart';
910
import 'package:app_flowy/plugins/grid/presentation/widgets/cell/cell_builder.dart';
1011
import 'package:app_flowy/plugins/grid/presentation/widgets/row/row_detail.dart';
1112
import 'package:appflowy_board/appflowy_board.dart';
13+
import 'package:easy_localization/easy_localization.dart';
1214
import 'package:flowy_infra/image.dart';
1315
import 'package:flowy_infra/theme.dart';
1416
import 'package:flowy_infra_ui/style_widget/text.dart';
1517
import 'package:flowy_infra_ui/widget/error_page.dart';
1618
import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
1719
import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
20+
import 'package:flowy_sdk/protobuf/flowy-grid/group.pbserver.dart';
1821
import 'package:flutter/material.dart';
1922
import 'package:flutter_bloc/flutter_bloc.dart';
2023
import '../../grid/application/row/row_cache.dart';
@@ -109,7 +112,7 @@ class _BoardContentState extends State<BoardContent> {
109112
column,
110113
columnItem,
111114
),
112-
columnConstraints: const BoxConstraints.tightFor(width: 240),
115+
columnConstraints: const BoxConstraints.tightFor(width: 300),
113116
config: AFBoardConfig(
114117
columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
115118
),
@@ -154,7 +157,11 @@ class _BoardContentState extends State<BoardContent> {
154157
}
155158

156159
Widget _buildFooter(BuildContext context, AFBoardColumnData columnData) {
157-
return AppFlowyColumnFooter(
160+
final group = columnData.customData as GroupPB;
161+
if (group.isDefault) {
162+
return const SizedBox();
163+
} else {
164+
return AppFlowyColumnFooter(
158165
icon: SizedBox(
159166
height: 20,
160167
width: 20,
@@ -164,15 +171,17 @@ class _BoardContentState extends State<BoardContent> {
164171
),
165172
),
166173
title: FlowyText.medium(
167-
"New",
174+
LocaleKeys.board_column_create_new_card.tr(),
168175
fontSize: 14,
169176
color: context.read<AppTheme>().textColor,
170177
),
171178
height: 50,
172179
margin: config.footerPadding,
173180
onAddButtonClick: () {
174181
context.read<BoardBloc>().add(BoardEvent.createRow(columnData.id));
175-
});
182+
},
183+
);
184+
}
176185
}
177186

178187
Widget _buildCard(

frontend/app_flowy/lib/plugins/board/presentation/card/card_container.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,15 @@ BoxDecoration _makeBoxDecoration(BuildContext context) {
9393
final theme = context.read<AppTheme>();
9494
final borderSide = BorderSide(color: theme.shader6, width: 1.0);
9595
return BoxDecoration(
96-
color: theme.surface,
96+
color: Colors.transparent,
9797
border: Border.fromBorderSide(borderSide),
98-
boxShadow: [
98+
boxShadow: const [
9999
BoxShadow(
100-
color: theme.shader6,
101-
spreadRadius: 0,
102-
blurRadius: 2,
103-
offset: Offset.zero)
100+
color: Colors.transparent,
101+
spreadRadius: 0,
102+
blurRadius: 2,
103+
offset: Offset.zero,
104+
)
104105
],
105106
borderRadius: const BorderRadius.all(Radius.circular(6)),
106107
);
@@ -120,8 +121,9 @@ class _CardEnterRegion extends StatelessWidget {
120121
builder: (context, onEnter, _) {
121122
List<Widget> children = [child];
122123
if (onEnter) {
123-
children.add(CardAccessoryContainer(accessories: accessories)
124-
.positioned(right: 0));
124+
children.add(CardAccessoryContainer(
125+
accessories: accessories,
126+
).positioned(right: 0));
125127
}
126128

127129
return MouseRegion(

frontend/rust-lib/flowy-grid/src/entities/group_entities/group.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ pub struct GroupPB {
8181

8282
#[pb(index = 4)]
8383
pub rows: Vec<RowPB>,
84+
85+
#[pb(index = 5)]
86+
pub is_default: bool,
8487
}
8588

8689
impl std::convert::From<Group> for GroupPB {
@@ -90,6 +93,7 @@ impl std::convert::From<Group> for GroupPB {
9093
group_id: group.id,
9194
desc: group.name,
9295
rows: group.rows,
96+
is_default: group.is_default,
9397
}
9498
}
9599
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,12 @@ pub fn insert_select_option_cell(option_id: String, field_rev: &FieldRevision) -
176176
CellRevision::new(data)
177177
}
178178

179+
pub fn delete_select_option_cell(option_id: String, field_rev: &FieldRevision) -> CellRevision {
180+
let cell_data = SelectOptionCellChangeset::from_delete(&option_id).to_str();
181+
let data = apply_cell_data_changeset(cell_data, None, field_rev).unwrap();
182+
CellRevision::new(data)
183+
}
184+
179185
/// If the cell data is not String type, it should impl this trait.
180186
/// Deserialize the String into cell specific data type.
181187
pub trait FromCellString {

frontend/rust-lib/flowy-grid/src/services/grid_view_manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl GridViewManager {
142142
.move_group_row(&row_rev, &mut row_changeset, &to_group_id, to_row_id.clone())
143143
.await;
144144

145-
if row_changeset.is_empty() == false {
145+
if !row_changeset.is_empty() {
146146
with_row_changeset(row_changeset).await;
147147
}
148148

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ impl<T> std::fmt::Display for GenericGroupConfiguration<T> {
3131
self.groups_map.iter().for_each(|(_, group)| {
3232
let _ = f.write_fmt(format_args!("Group:{} has {} rows \n", group.id, group.rows.len()));
3333
});
34+
let _ = f.write_fmt(format_args!(
35+
"Default group has {} rows \n",
36+
self.default_group.rows.len()
37+
));
3438
Ok(())
3539
}
3640
}
@@ -41,6 +45,8 @@ pub struct GenericGroupConfiguration<C> {
4145
configuration_content: PhantomData<C>,
4246
field_rev: Arc<FieldRevision>,
4347
groups_map: IndexMap<String, Group>,
48+
/// default_group is used to store the rows that don't belong to any groups.
49+
default_group: Group,
4450
writer: Arc<dyn GroupConfigurationWriter>,
4551
}
4652

@@ -55,6 +61,15 @@ where
5561
reader: Arc<dyn GroupConfigurationReader>,
5662
writer: Arc<dyn GroupConfigurationWriter>,
5763
) -> FlowyResult<Self> {
64+
let default_group_id = format!("{}_default_group", view_id);
65+
let default_group = Group {
66+
id: default_group_id,
67+
field_id: field_rev.id.clone(),
68+
name: format!("No {}", field_rev.name),
69+
is_default: true,
70+
rows: vec![],
71+
content: "".to_string(),
72+
};
5873
let configuration = match reader.get_group_configuration(field_rev.clone()).await {
5974
None => {
6075
let default_group_configuration = default_group_configuration(&field_rev);
@@ -71,6 +86,7 @@ where
7186
view_id,
7287
field_rev,
7388
groups_map: IndexMap::new(),
89+
default_group,
7490
writer,
7591
configuration,
7692
configuration_content: PhantomData,
@@ -82,7 +98,9 @@ where
8298
}
8399

84100
pub(crate) fn clone_groups(&self) -> Vec<Group> {
85-
self.groups_map.values().cloned().collect()
101+
let mut groups: Vec<Group> = self.groups_map.values().cloned().collect();
102+
groups.push(self.default_group.clone());
103+
groups
86104
}
87105

88106
pub(crate) fn merge_groups(&mut self, groups: Vec<Group>) -> FlowyResult<Option<GroupViewChangesetPB>> {
@@ -160,6 +178,10 @@ where
160178
self.groups_map.get_mut(group_id)
161179
}
162180

181+
pub(crate) fn get_mut_default_group(&mut self) -> &mut Group {
182+
&mut self.default_group
183+
}
184+
163185
pub(crate) fn move_group(&mut self, from_id: &str, to_id: &str) -> FlowyResult<()> {
164186
let from_index = self.groups_map.get_index_of(from_id);
165187
let to_index = self.groups_map.get_index_of(to_id);
@@ -263,7 +285,7 @@ fn merge_groups(old_groups: &[GroupRevision], groups: Vec<Group>) -> MergeGroupR
263285
}
264286

265287
// Find out the new groups
266-
let new_groups = group_map.into_values().collect::<Vec<Group>>();
288+
let new_groups = group_map.into_values();
267289
for (index, group) in new_groups.into_iter().enumerate() {
268290
merge_result.add_insert_group(index, group);
269291
}
@@ -291,7 +313,7 @@ impl MergeGroupResult {
291313
}
292314

293315
fn add_group(&mut self, group: Group) {
294-
self.groups.push(group.clone());
316+
self.groups.push(group);
295317
}
296318

297319
fn add_insert_group(&mut self, index: usize, group: Group) {
@@ -309,11 +331,10 @@ fn make_group_view_changeset(
309331
inserted_groups: Vec<InsertedGroupPB>,
310332
updated_group: Vec<Group>,
311333
) -> GroupViewChangesetPB {
312-
let changeset = GroupViewChangesetPB {
334+
GroupViewChangesetPB {
313335
view_id,
314336
inserted_groups,
315337
deleted_groups: vec![],
316338
update_groups: updated_group.into_iter().map(GroupPB::from).collect(),
317-
};
318-
changeset
339+
}
319340
}

0 commit comments

Comments
 (0)