mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: open card detail
This commit is contained in:
@ -23,7 +23,6 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
|
|||||||
}) : _rowService = RowFFIService(
|
}) : _rowService = RowFFIService(
|
||||||
gridId: gridId,
|
gridId: gridId,
|
||||||
blockId: dataController.rowPB.blockId,
|
blockId: dataController.rowPB.blockId,
|
||||||
rowId: dataController.rowPB.id,
|
|
||||||
),
|
),
|
||||||
_dataController = dataController,
|
_dataController = dataController,
|
||||||
super(BoardCardState.initial(
|
super(BoardCardState.initial(
|
||||||
@ -34,9 +33,6 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
|
|||||||
initial: (_InitialRow value) async {
|
initial: (_InitialRow value) async {
|
||||||
await _startListening();
|
await _startListening();
|
||||||
},
|
},
|
||||||
createRow: (_CreateRow value) {
|
|
||||||
_rowService.createRow();
|
|
||||||
},
|
|
||||||
didReceiveCells: (_DidReceiveCells value) async {
|
didReceiveCells: (_DidReceiveCells value) async {
|
||||||
final cells = value.gridCellMap.values
|
final cells = value.gridCellMap.values
|
||||||
.map((e) => GridCellEquatable(e.field))
|
.map((e) => GridCellEquatable(e.field))
|
||||||
@ -61,7 +57,6 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
|
|||||||
RowInfo rowInfo() {
|
RowInfo rowInfo() {
|
||||||
return RowInfo(
|
return RowInfo(
|
||||||
gridId: _rowService.gridId,
|
gridId: _rowService.gridId,
|
||||||
blockId: _rowService.blockId,
|
|
||||||
fields: UnmodifiableListView(
|
fields: UnmodifiableListView(
|
||||||
state.cells.map((cell) => cell._field).toList(),
|
state.cells.map((cell) => cell._field).toList(),
|
||||||
),
|
),
|
||||||
@ -83,7 +78,6 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
|
|||||||
@freezed
|
@freezed
|
||||||
class BoardCardEvent with _$BoardCardEvent {
|
class BoardCardEvent with _$BoardCardEvent {
|
||||||
const factory BoardCardEvent.initial() = _InitialRow;
|
const factory BoardCardEvent.initial() = _InitialRow;
|
||||||
const factory BoardCardEvent.createRow() = _CreateRow;
|
|
||||||
const factory BoardCardEvent.didReceiveCells(
|
const factory BoardCardEvent.didReceiveCells(
|
||||||
GridCellMap gridCellMap, RowsChangedReason reason) = _DidReceiveCells;
|
GridCellMap gridCellMap, RowsChangedReason reason) = _DidReceiveCells;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,20 @@
|
|||||||
// ignore_for_file: unused_field
|
// ignore_for_file: unused_field
|
||||||
|
|
||||||
|
import 'dart:collection';
|
||||||
|
|
||||||
import 'package:app_flowy/plugins/board/application/card/card_data_controller.dart';
|
import 'package:app_flowy/plugins/board/application/card/card_data_controller.dart';
|
||||||
|
import 'package:app_flowy/plugins/grid/application/row/row_cache.dart';
|
||||||
|
import 'package:app_flowy/plugins/grid/application/field/field_cache.dart';
|
||||||
|
import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart';
|
||||||
|
import 'package:app_flowy/plugins/grid/presentation/widgets/cell/cell_builder.dart';
|
||||||
|
import 'package:app_flowy/plugins/grid/presentation/widgets/row/row_detail.dart';
|
||||||
import 'package:appflowy_board/appflowy_board.dart';
|
import 'package:appflowy_board/appflowy_board.dart';
|
||||||
import 'package:flowy_infra_ui/widget/error_page.dart';
|
import 'package:flowy_infra_ui/widget/error_page.dart';
|
||||||
import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
|
import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
|
||||||
|
import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import '../../grid/application/row/row_cache.dart';
|
||||||
import '../application/board_bloc.dart';
|
import '../application/board_bloc.dart';
|
||||||
import 'card/card.dart';
|
import 'card/card.dart';
|
||||||
import 'card/card_cell_builder.dart';
|
import 'card/card_cell_builder.dart';
|
||||||
@ -123,9 +132,36 @@ class BoardContent extends StatelessWidget {
|
|||||||
onEditEditing: (rowId) {
|
onEditEditing: (rowId) {
|
||||||
context.read<BoardBloc>().add(BoardEvent.endEditRow(rowId));
|
context.read<BoardBloc>().add(BoardEvent.endEditRow(rowId));
|
||||||
},
|
},
|
||||||
|
openCard: (context) => _openCard(
|
||||||
|
gridId,
|
||||||
|
fieldCache,
|
||||||
|
rowPB,
|
||||||
|
rowCache,
|
||||||
|
context,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _openCard(String gridId, GridFieldCache fieldCache, RowPB rowPB,
|
||||||
|
GridRowCache rowCache, BuildContext context) {
|
||||||
|
final rowInfo = RowInfo(
|
||||||
|
gridId: gridId,
|
||||||
|
fields: UnmodifiableListView(fieldCache.fields),
|
||||||
|
rowPB: rowPB,
|
||||||
|
);
|
||||||
|
|
||||||
|
final dataController = GridRowDataController(
|
||||||
|
rowInfo: rowInfo,
|
||||||
|
fieldCache: fieldCache,
|
||||||
|
rowCache: rowCache,
|
||||||
|
);
|
||||||
|
|
||||||
|
RowDetailPage(
|
||||||
|
cellBuilder: GridCellBuilder(delegate: dataController),
|
||||||
|
dataController: dataController,
|
||||||
|
).show(context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension HexColor on Color {
|
extension HexColor on Color {
|
||||||
|
@ -18,6 +18,7 @@ class BoardCard extends StatefulWidget {
|
|||||||
final CardDataController dataController;
|
final CardDataController dataController;
|
||||||
final BoardCellBuilder cellBuilder;
|
final BoardCellBuilder cellBuilder;
|
||||||
final OnEndEditing onEditEditing;
|
final OnEndEditing onEditEditing;
|
||||||
|
final void Function(BuildContext) openCard;
|
||||||
|
|
||||||
const BoardCard({
|
const BoardCard({
|
||||||
required this.gridId,
|
required this.gridId,
|
||||||
@ -25,6 +26,7 @@ class BoardCard extends StatefulWidget {
|
|||||||
required this.dataController,
|
required this.dataController,
|
||||||
required this.cellBuilder,
|
required this.cellBuilder,
|
||||||
required this.onEditEditing,
|
required this.onEditEditing,
|
||||||
|
required this.openCard,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@ -54,6 +56,9 @@ class _BoardCardState extends State<BoardCard> {
|
|||||||
accessoryBuilder: (context) {
|
accessoryBuilder: (context) {
|
||||||
return [const _CardMoreOption()];
|
return [const _CardMoreOption()];
|
||||||
},
|
},
|
||||||
|
onTap: (context) {
|
||||||
|
widget.openCard(context);
|
||||||
|
},
|
||||||
child: Column(
|
child: Column(
|
||||||
children: _makeCells(context, state.gridCellMap),
|
children: _makeCells(context, state.gridCellMap),
|
||||||
),
|
),
|
||||||
|
@ -7,8 +7,10 @@ import 'package:styled_widget/styled_widget.dart';
|
|||||||
class BoardCardContainer extends StatelessWidget {
|
class BoardCardContainer extends StatelessWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
final CardAccessoryBuilder? accessoryBuilder;
|
final CardAccessoryBuilder? accessoryBuilder;
|
||||||
|
final void Function(BuildContext) onTap;
|
||||||
const BoardCardContainer({
|
const BoardCardContainer({
|
||||||
required this.child,
|
required this.child,
|
||||||
|
required this.onTap,
|
||||||
this.accessoryBuilder,
|
this.accessoryBuilder,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
@ -30,11 +32,14 @@ class BoardCardContainer extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Padding(
|
return GestureDetector(
|
||||||
padding: const EdgeInsets.all(8),
|
onTap: () => onTap(context),
|
||||||
child: ConstrainedBox(
|
child: Padding(
|
||||||
constraints: const BoxConstraints(minHeight: 30),
|
padding: const EdgeInsets.all(8),
|
||||||
child: container,
|
child: ConstrainedBox(
|
||||||
|
constraints: const BoxConstraints(minHeight: 30),
|
||||||
|
child: container,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -17,19 +17,19 @@ class RowActionSheetBloc
|
|||||||
RowActionSheetBloc({required RowInfo rowInfo})
|
RowActionSheetBloc({required RowInfo rowInfo})
|
||||||
: _rowService = RowFFIService(
|
: _rowService = RowFFIService(
|
||||||
gridId: rowInfo.gridId,
|
gridId: rowInfo.gridId,
|
||||||
blockId: rowInfo.blockId,
|
blockId: rowInfo.rowPB.blockId,
|
||||||
rowId: rowInfo.rowPB.id,
|
|
||||||
),
|
),
|
||||||
super(RowActionSheetState.initial(rowInfo)) {
|
super(RowActionSheetState.initial(rowInfo)) {
|
||||||
on<RowActionSheetEvent>(
|
on<RowActionSheetEvent>(
|
||||||
(event, emit) async {
|
(event, emit) async {
|
||||||
await event.map(
|
await event.map(
|
||||||
deleteRow: (_DeleteRow value) async {
|
deleteRow: (_DeleteRow value) async {
|
||||||
final result = await _rowService.deleteRow();
|
final result = await _rowService.deleteRow(state.rowData.rowPB.id);
|
||||||
logResult(result);
|
logResult(result);
|
||||||
},
|
},
|
||||||
duplicateRow: (_DuplicateRow value) async {
|
duplicateRow: (_DuplicateRow value) async {
|
||||||
final result = await _rowService.duplicateRow();
|
final result =
|
||||||
|
await _rowService.duplicateRow(state.rowData.rowPB.id);
|
||||||
logResult(result);
|
logResult(result);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -20,8 +20,7 @@ class RowBloc extends Bloc<RowEvent, RowState> {
|
|||||||
required GridRowDataController dataController,
|
required GridRowDataController dataController,
|
||||||
}) : _rowService = RowFFIService(
|
}) : _rowService = RowFFIService(
|
||||||
gridId: rowInfo.gridId,
|
gridId: rowInfo.gridId,
|
||||||
blockId: rowInfo.blockId,
|
blockId: rowInfo.rowPB.blockId,
|
||||||
rowId: rowInfo.rowPB.id,
|
|
||||||
),
|
),
|
||||||
_dataController = dataController,
|
_dataController = dataController,
|
||||||
super(RowState.initial(rowInfo, dataController.loadData())) {
|
super(RowState.initial(rowInfo, dataController.loadData())) {
|
||||||
@ -32,7 +31,7 @@ class RowBloc extends Bloc<RowEvent, RowState> {
|
|||||||
await _startListening();
|
await _startListening();
|
||||||
},
|
},
|
||||||
createRow: (_CreateRow value) {
|
createRow: (_CreateRow value) {
|
||||||
_rowService.createRow();
|
_rowService.createRow(rowInfo.rowPB.id);
|
||||||
},
|
},
|
||||||
didReceiveCells: (_DidReceiveCells value) async {
|
didReceiveCells: (_DidReceiveCells value) async {
|
||||||
final cells = value.gridCellMap.values
|
final cells = value.gridCellMap.values
|
||||||
|
@ -255,7 +255,6 @@ class GridRowCache {
|
|||||||
RowInfo buildGridRow(RowPB rowPB) {
|
RowInfo buildGridRow(RowPB rowPB) {
|
||||||
return RowInfo(
|
return RowInfo(
|
||||||
gridId: gridId,
|
gridId: gridId,
|
||||||
blockId: block.id,
|
|
||||||
fields: _fieldNotifier.fields,
|
fields: _fieldNotifier.fields,
|
||||||
rowPB: rowPB,
|
rowPB: rowPB,
|
||||||
);
|
);
|
||||||
@ -283,7 +282,6 @@ class _RowChangesetNotifier extends ChangeNotifier {
|
|||||||
class RowInfo with _$RowInfo {
|
class RowInfo with _$RowInfo {
|
||||||
const factory RowInfo({
|
const factory RowInfo({
|
||||||
required String gridId,
|
required String gridId,
|
||||||
required String blockId,
|
|
||||||
required UnmodifiableListView<FieldPB> fields,
|
required UnmodifiableListView<FieldPB> fields,
|
||||||
required RowPB rowPB,
|
required RowPB rowPB,
|
||||||
}) = _RowInfo;
|
}) = _RowInfo;
|
||||||
|
@ -9,12 +9,13 @@ import 'package:flowy_sdk/protobuf/flowy-grid/setting_entities.pb.dart';
|
|||||||
class RowFFIService {
|
class RowFFIService {
|
||||||
final String gridId;
|
final String gridId;
|
||||||
final String blockId;
|
final String blockId;
|
||||||
final String rowId;
|
|
||||||
|
|
||||||
RowFFIService(
|
RowFFIService({
|
||||||
{required this.gridId, required this.blockId, required this.rowId});
|
required this.gridId,
|
||||||
|
required this.blockId,
|
||||||
|
});
|
||||||
|
|
||||||
Future<Either<RowPB, FlowyError>> createRow() {
|
Future<Either<RowPB, FlowyError>> createRow(String rowId) {
|
||||||
final payload = CreateTableRowPayloadPB.create()
|
final payload = CreateTableRowPayloadPB.create()
|
||||||
..gridId = gridId
|
..gridId = gridId
|
||||||
..startRowId = rowId;
|
..startRowId = rowId;
|
||||||
@ -43,7 +44,7 @@ class RowFFIService {
|
|||||||
return GridEventMoveRow(payload).send();
|
return GridEventMoveRow(payload).send();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Either<OptionalRowPB, FlowyError>> getRow() {
|
Future<Either<OptionalRowPB, FlowyError>> getRow(String rowId) {
|
||||||
final payload = RowIdPB.create()
|
final payload = RowIdPB.create()
|
||||||
..gridId = gridId
|
..gridId = gridId
|
||||||
..blockId = blockId
|
..blockId = blockId
|
||||||
@ -52,7 +53,7 @@ class RowFFIService {
|
|||||||
return GridEventGetRow(payload).send();
|
return GridEventGetRow(payload).send();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Either<Unit, FlowyError>> deleteRow() {
|
Future<Either<Unit, FlowyError>> deleteRow(String rowId) {
|
||||||
final payload = RowIdPB.create()
|
final payload = RowIdPB.create()
|
||||||
..gridId = gridId
|
..gridId = gridId
|
||||||
..blockId = blockId
|
..blockId = blockId
|
||||||
@ -61,7 +62,7 @@ class RowFFIService {
|
|||||||
return GridEventDeleteRow(payload).send();
|
return GridEventDeleteRow(payload).send();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Either<Unit, FlowyError>> duplicateRow() {
|
Future<Either<Unit, FlowyError>> duplicateRow(String rowId) {
|
||||||
final payload = RowIdPB.create()
|
final payload = RowIdPB.create()
|
||||||
..gridId = gridId
|
..gridId = gridId
|
||||||
..blockId = blockId
|
..blockId = blockId
|
||||||
|
@ -239,8 +239,10 @@ class _GridRowsState extends State<_GridRows> {
|
|||||||
RowInfo rowInfo,
|
RowInfo rowInfo,
|
||||||
Animation<double> animation,
|
Animation<double> animation,
|
||||||
) {
|
) {
|
||||||
final rowCache =
|
final rowCache = context.read<GridBloc>().getRowCache(
|
||||||
context.read<GridBloc>().getRowCache(rowInfo.blockId, rowInfo.rowPB.id);
|
rowInfo.rowPB.blockId,
|
||||||
|
rowInfo.rowPB.id,
|
||||||
|
);
|
||||||
|
|
||||||
/// Return placeholder widget if the rowCache is null.
|
/// Return placeholder widget if the rowCache is null.
|
||||||
if (rowCache == null) return const SizedBox();
|
if (rowCache == null) return const SizedBox();
|
||||||
|
Reference in New Issue
Block a user