mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: create the default group for the rows that are not belong to any groups
This commit is contained in:
@ -55,10 +55,19 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
|
|||||||
createRow: () async {
|
createRow: () async {
|
||||||
final result = await _dataController.createRow();
|
final result = await _dataController.createRow();
|
||||||
result.fold(
|
result.fold(
|
||||||
(rowPB) => null,
|
(rowPB) {
|
||||||
|
emit(state.copyWith(editingRow: some(rowPB)));
|
||||||
|
},
|
||||||
(err) => Log.error(err),
|
(err) => Log.error(err),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
endEditRow: (rowId) {
|
||||||
|
assert(state.editingRow.isSome());
|
||||||
|
state.editingRow.fold(() => null, (row) {
|
||||||
|
assert(row.id == rowId);
|
||||||
|
emit(state.copyWith(editingRow: none()));
|
||||||
|
});
|
||||||
|
},
|
||||||
didReceiveGridUpdate: (GridPB grid) {
|
didReceiveGridUpdate: (GridPB grid) {
|
||||||
emit(state.copyWith(grid: Some(grid)));
|
emit(state.copyWith(grid: Some(grid)));
|
||||||
},
|
},
|
||||||
@ -145,6 +154,7 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
|
|||||||
class BoardEvent with _$BoardEvent {
|
class BoardEvent with _$BoardEvent {
|
||||||
const factory BoardEvent.initial() = InitialGrid;
|
const factory BoardEvent.initial() = InitialGrid;
|
||||||
const factory BoardEvent.createRow() = _CreateRow;
|
const factory BoardEvent.createRow() = _CreateRow;
|
||||||
|
const factory BoardEvent.endEditRow(String rowId) = _EndEditRow;
|
||||||
const factory BoardEvent.didReceiveGroups(List<GroupPB> groups) =
|
const factory BoardEvent.didReceiveGroups(List<GroupPB> groups) =
|
||||||
_DidReceiveGroup;
|
_DidReceiveGroup;
|
||||||
const factory BoardEvent.didReceiveRows(List<RowInfo> rowInfos) =
|
const factory BoardEvent.didReceiveRows(List<RowInfo> rowInfos) =
|
||||||
|
@ -123,7 +123,9 @@ class BoardDataController {
|
|||||||
fieldCache: fieldCache,
|
fieldCache: fieldCache,
|
||||||
);
|
);
|
||||||
|
|
||||||
// cache.addListener(onRowsChanged: (rows, reason) {})
|
cache.addListener(onRowsChanged: (reason) {
|
||||||
|
_onRowsChanged?.call(rowInfos, reason);
|
||||||
|
});
|
||||||
_blocks[block.id] = cache;
|
_blocks[block.id] = cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ class BoardContent extends StatelessWidget {
|
|||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
||||||
child: AFBoard(
|
child: AFBoard(
|
||||||
key: UniqueKey(),
|
// key: UniqueKey(),
|
||||||
scrollController: ScrollController(),
|
scrollController: ScrollController(),
|
||||||
dataController: context.read<BoardBloc>().boardDataController,
|
dataController: context.read<BoardBloc>().boardDataController,
|
||||||
headerBuilder: _buildHeader,
|
headerBuilder: _buildHeader,
|
||||||
@ -83,11 +83,13 @@ class BoardContent extends StatelessWidget {
|
|||||||
|
|
||||||
Widget _buildFooter(BuildContext context, AFBoardColumnData columnData) {
|
Widget _buildFooter(BuildContext context, AFBoardColumnData columnData) {
|
||||||
return AppFlowyColumnFooter(
|
return AppFlowyColumnFooter(
|
||||||
icon: const Icon(Icons.add, size: 20),
|
icon: const Icon(Icons.add, size: 20),
|
||||||
title: const Text('New'),
|
title: const Text('New'),
|
||||||
height: 50,
|
height: 50,
|
||||||
margin: config.columnItemPadding,
|
margin: config.columnItemPadding,
|
||||||
);
|
onAddButtonClick: () {
|
||||||
|
context.read<BoardBloc>().add(const BoardEvent.createRow());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildCard(BuildContext context, AFColumnItem item) {
|
Widget _buildCard(BuildContext context, AFColumnItem item) {
|
||||||
@ -106,13 +108,21 @@ class BoardContent extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
|
|
||||||
final cellBuilder = BoardCellBuilder(cardController);
|
final cellBuilder = BoardCellBuilder(cardController);
|
||||||
|
final isEditing = context.read<BoardBloc>().state.editingRow.fold(
|
||||||
|
() => false,
|
||||||
|
(editingRow) => editingRow.id == rowPB.id,
|
||||||
|
);
|
||||||
|
|
||||||
return AppFlowyColumnItemCard(
|
return AppFlowyColumnItemCard(
|
||||||
key: ObjectKey(item),
|
key: ObjectKey(item),
|
||||||
child: BoardCard(
|
child: BoardCard(
|
||||||
|
gridId: gridId,
|
||||||
|
isEditing: isEditing,
|
||||||
cellBuilder: cellBuilder,
|
cellBuilder: cellBuilder,
|
||||||
dataController: cardController,
|
dataController: cardController,
|
||||||
gridId: gridId,
|
onEditEditing: (rowId) {
|
||||||
|
context.read<BoardBloc>().add(BoardEvent.endEditRow(rowId));
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -9,15 +9,21 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||||||
import 'card_cell_builder.dart';
|
import 'card_cell_builder.dart';
|
||||||
import 'card_container.dart';
|
import 'card_container.dart';
|
||||||
|
|
||||||
|
typedef OnEndEditing = void Function(String rowId);
|
||||||
|
|
||||||
class BoardCard extends StatefulWidget {
|
class BoardCard extends StatefulWidget {
|
||||||
final String gridId;
|
final String gridId;
|
||||||
|
final bool isEditing;
|
||||||
final CardDataController dataController;
|
final CardDataController dataController;
|
||||||
final BoardCellBuilder cellBuilder;
|
final BoardCellBuilder cellBuilder;
|
||||||
|
final OnEndEditing onEditEditing;
|
||||||
|
|
||||||
const BoardCard({
|
const BoardCard({
|
||||||
required this.gridId,
|
required this.gridId,
|
||||||
|
required this.isEditing,
|
||||||
required this.dataController,
|
required this.dataController,
|
||||||
required this.cellBuilder,
|
required this.cellBuilder,
|
||||||
|
required this.onEditEditing,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@ -60,7 +66,6 @@ class _BoardCardState extends State<BoardCard> {
|
|||||||
return cellMap.values.map(
|
return cellMap.values.map(
|
||||||
(cellId) {
|
(cellId) {
|
||||||
final child = widget.cellBuilder.buildCell(cellId);
|
final child = widget.cellBuilder.buildCell(cellId);
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
|
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
|
||||||
child: child,
|
child: child,
|
||||||
|
@ -29,9 +29,13 @@ class BoardCardContainer extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.all(8),
|
padding: const EdgeInsets.all(8),
|
||||||
child: container,
|
child: ConstrainedBox(
|
||||||
|
constraints: const BoxConstraints(minHeight: 30),
|
||||||
|
child: container,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -266,11 +266,11 @@ pub(crate) async fn duplicate_row_handler(
|
|||||||
pub(crate) async fn create_row_handler(
|
pub(crate) async fn create_row_handler(
|
||||||
data: Data<CreateRowPayloadPB>,
|
data: Data<CreateRowPayloadPB>,
|
||||||
manager: AppData<Arc<GridManager>>,
|
manager: AppData<Arc<GridManager>>,
|
||||||
) -> Result<(), FlowyError> {
|
) -> DataResult<RowPB, FlowyError> {
|
||||||
let params: CreateRowParams = data.into_inner().try_into()?;
|
let params: CreateRowParams = data.into_inner().try_into()?;
|
||||||
let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
|
let editor = manager.get_grid_editor(params.grid_id.as_ref())?;
|
||||||
let _ = editor.create_row(params.start_row_id).await?;
|
let row = editor.create_row(params.start_row_id).await?;
|
||||||
Ok(())
|
data_result(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[tracing::instrument(level = "debug", skip_all, err)]
|
// #[tracing::instrument(level = "debug", skip_all, err)]
|
||||||
|
@ -34,9 +34,12 @@ pub trait GroupGenerator {
|
|||||||
) -> Vec<Group>;
|
) -> Vec<Group>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DEFAULT_GROUP_ID: &str = "default_group";
|
||||||
|
|
||||||
pub struct GroupController<C, T, G, CP> {
|
pub struct GroupController<C, T, G, CP> {
|
||||||
pub field_rev: Arc<FieldRevision>,
|
pub field_rev: Arc<FieldRevision>,
|
||||||
pub groups: IndexMap<String, Group>,
|
pub groups: IndexMap<String, Group>,
|
||||||
|
pub default_group: Group,
|
||||||
pub type_option: Option<T>,
|
pub type_option: Option<T>,
|
||||||
pub configuration: Option<C>,
|
pub configuration: Option<C>,
|
||||||
group_action_phantom: PhantomData<G>,
|
group_action_phantom: PhantomData<G>,
|
||||||
@ -78,9 +81,18 @@ where
|
|||||||
let field_type_rev = field_rev.field_type_rev;
|
let field_type_rev = field_rev.field_type_rev;
|
||||||
let type_option = field_rev.get_type_option_entry::<T>(field_type_rev);
|
let type_option = field_rev.get_type_option_entry::<T>(field_type_rev);
|
||||||
let groups = G::gen_groups(&configuration, &type_option, cell_content_provider);
|
let groups = G::gen_groups(&configuration, &type_option, cell_content_provider);
|
||||||
|
|
||||||
|
let default_group = Group {
|
||||||
|
id: DEFAULT_GROUP_ID.to_owned(),
|
||||||
|
desc: format!("No {}", field_rev.name),
|
||||||
|
rows: vec![],
|
||||||
|
content: "".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
field_rev,
|
field_rev,
|
||||||
groups: groups.into_iter().map(|group| (group.id.clone(), group)).collect(),
|
groups: groups.into_iter().map(|group| (group.id.clone(), group)).collect(),
|
||||||
|
default_group,
|
||||||
type_option,
|
type_option,
|
||||||
configuration,
|
configuration,
|
||||||
group_action_phantom: PhantomData,
|
group_action_phantom: PhantomData,
|
||||||
@ -89,7 +101,12 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn take_groups(self) -> Vec<Group> {
|
pub fn take_groups(self) -> Vec<Group> {
|
||||||
self.groups.into_values().collect()
|
let default_group = self.default_group;
|
||||||
|
let mut groups: Vec<Group> = self.groups.into_values().collect();
|
||||||
|
if !default_group.rows.is_empty() {
|
||||||
|
groups.push(default_group);
|
||||||
|
}
|
||||||
|
groups
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +119,7 @@ where
|
|||||||
if self.configuration.is_none() {
|
if self.configuration.is_none() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
tracing::debug!("group {} rows", rows.len());
|
||||||
|
|
||||||
for row in rows {
|
for row in rows {
|
||||||
if let Some(cell_rev) = row.cells.get(&self.field_rev.id) {
|
if let Some(cell_rev) = row.cells.get(&self.field_rev.id) {
|
||||||
@ -115,15 +133,20 @@ where
|
|||||||
row: row.into(),
|
row: row.into(),
|
||||||
group_id: group.id.clone(),
|
group_id: group.id.clone(),
|
||||||
});
|
});
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for record in records {
|
if records.is_empty() {
|
||||||
if let Some(group) = self.groups.get_mut(&record.group_id) {
|
self.default_group.rows.push(row.into());
|
||||||
group.rows.push(record.row);
|
} else {
|
||||||
|
for record in records {
|
||||||
|
if let Some(group) = self.groups.get_mut(&record.group_id) {
|
||||||
|
group.rows.push(record.row);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
self.default_group.rows.push(row.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user