Skip to content

Commit b3e5bb0

Browse files
committed
chore: config switch group field UI
1 parent e73f143 commit b3e5bb0

File tree

4 files changed

+130
-9
lines changed

4 files changed

+130
-9
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import 'package:app_flowy/plugins/grid/application/field/field_service.dart';
2+
import 'package:flowy_sdk/log.dart';
3+
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
4+
import 'package:flutter_bloc/flutter_bloc.dart';
5+
import 'package:freezed_annotation/freezed_annotation.dart';
6+
import 'dart:async';
7+
8+
import '../field/field_cache.dart';
9+
10+
part 'group_bloc.freezed.dart';
11+
12+
class GridGroupBloc extends Bloc<GridGroupEvent, GridGroupState> {
13+
final GridFieldCache _fieldCache;
14+
Function(List<FieldPB>)? _onFieldsFn;
15+
16+
GridGroupBloc({required String gridId, required GridFieldCache fieldCache})
17+
: _fieldCache = fieldCache,
18+
super(GridGroupState.initial(gridId, fieldCache.fields)) {
19+
on<GridGroupEvent>(
20+
(event, emit) async {
21+
await event.map(
22+
initial: (_Initial value) {
23+
_startListening();
24+
},
25+
setFieldVisibility: (_SetFieldVisibility value) async {
26+
final fieldService =
27+
FieldService(gridId: gridId, fieldId: value.fieldId);
28+
final result =
29+
await fieldService.updateField(visibility: value.visibility);
30+
result.fold(
31+
(l) => null,
32+
(err) => Log.error(err),
33+
);
34+
},
35+
didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
36+
emit(state.copyWith(fields: value.fields));
37+
},
38+
moveField: (_MoveField value) {
39+
//
40+
},
41+
);
42+
},
43+
);
44+
}
45+
46+
@override
47+
Future<void> close() async {
48+
if (_onFieldsFn != null) {
49+
_fieldCache.removeListener(onFieldsListener: _onFieldsFn!);
50+
_onFieldsFn = null;
51+
}
52+
return super.close();
53+
}
54+
55+
void _startListening() {
56+
_onFieldsFn = (fields) => add(GridGroupEvent.didReceiveFieldUpdate(fields));
57+
_fieldCache.addListener(
58+
onFields: _onFieldsFn,
59+
listenWhen: () => !isClosed,
60+
);
61+
}
62+
}
63+
64+
@freezed
65+
class GridGroupEvent with _$GridGroupEvent {
66+
const factory GridGroupEvent.initial() = _Initial;
67+
const factory GridGroupEvent.setFieldVisibility(
68+
String fieldId, bool visibility) = _SetFieldVisibility;
69+
const factory GridGroupEvent.didReceiveFieldUpdate(List<FieldPB> fields) =
70+
_DidReceiveFieldUpdate;
71+
const factory GridGroupEvent.moveField(int fromIndex, int toIndex) =
72+
_MoveField;
73+
}
74+
75+
@freezed
76+
class GridGroupState with _$GridGroupState {
77+
const factory GridGroupState({
78+
required String gridId,
79+
required List<FieldPB> fields,
80+
}) = _GridGroupState;
81+
82+
factory GridGroupState.initial(String gridId, List<FieldPB> fields) =>
83+
GridGroupState(
84+
gridId: gridId,
85+
fields: fields,
86+
);
87+
}

frontend/app_flowy/lib/plugins/grid/presentation/widgets/toolbar/grid_group.dart

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
import 'package:app_flowy/plugins/grid/application/field/field_cache.dart';
2+
<<<<<<< HEAD
3+
=======
4+
import 'package:app_flowy/plugins/grid/presentation/layout/sizes.dart';
5+
>>>>>>> 0e1004785 (chore: config switch group field UI)
26
import 'package:app_flowy/plugins/grid/presentation/widgets/header/field_type_extension.dart';
37
import 'package:flowy_infra/image.dart';
48
import 'package:flowy_infra/theme.dart';
59
import 'package:flowy_infra_ui/style_widget/button.dart';
610
import 'package:flowy_infra_ui/style_widget/text.dart';
11+
<<<<<<< HEAD
12+
=======
13+
import 'package:flowy_infra_ui/widget/spacing.dart';
14+
>>>>>>> 0e1004785 (chore: config switch group field UI)
715
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
816
import 'package:flutter/material.dart';
9-
import 'package:provider/provider.dart';
17+
import 'package:app_flowy/plugins/grid/application/setting/group_bloc.dart';
18+
19+
import 'package:flutter_bloc/flutter_bloc.dart';
1020

1121
class GridGroupList extends StatelessWidget {
1222
final String viewId;
@@ -19,7 +29,31 @@ class GridGroupList extends StatelessWidget {
1929

2030
@override
2131
Widget build(BuildContext context) {
22-
return Container();
32+
return BlocProvider(
33+
create: (context) => GridGroupBloc(gridId: viewId, fieldCache: fieldCache)
34+
..add(const GridGroupEvent.initial()),
35+
child: BlocBuilder<GridGroupBloc, GridGroupState>(
36+
builder: (context, state) {
37+
final cells = state.fields.map((field) {
38+
return _GridGroupCell(
39+
field: field,
40+
key: ValueKey(field.id),
41+
);
42+
}).toList();
43+
44+
return ListView.separated(
45+
shrinkWrap: true,
46+
itemCount: cells.length,
47+
itemBuilder: (BuildContext context, int index) {
48+
return cells[index];
49+
},
50+
separatorBuilder: (BuildContext context, int index) {
51+
return VSpace(GridSize.typeOptionSeparatorHeight);
52+
},
53+
);
54+
},
55+
),
56+
);
2357
}
2458

2559
void show(BuildContext context) {}

frontend/rust-lib/flowy-grid/src/entities/setting_entities.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub struct GridSettingPB {
2525
pub filter_configuration_by_field_id: HashMap<String, RepeatedGridConfigurationFilterPB>,
2626

2727
#[pb(index = 4)]
28-
pub group_configuration_by_field_id: HashMap<String, RepeatedGridGroupConfigurationPB>,
28+
pub group_configurations: RepeatedGridGroupConfigurationPB,
2929
}
3030

3131
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ impl GroupConfigurationWriter for GroupConfigurationWriterImpl {
464464

465465
pub fn make_grid_setting(view_pad: &GridViewRevisionPad, field_revs: &[Arc<FieldRevision>]) -> GridSettingPB {
466466
let current_layout_type: GridLayout = view_pad.layout.clone().into();
467-
let filters_by_field_id = view_pad
467+
let filter_configuration_by_field_id = view_pad
468468
.get_all_filters(field_revs)
469469
.map(|filters_by_field_id| {
470470
filters_by_field_id
@@ -473,21 +473,21 @@ pub fn make_grid_setting(view_pad: &GridViewRevisionPad, field_revs: &[Arc<Field
473473
.collect::<HashMap<String, RepeatedGridConfigurationFilterPB>>()
474474
})
475475
.unwrap_or_default();
476-
let groups_by_field_id = view_pad
476+
let group_configurations = view_pad
477477
.get_groups_by_field_revs(field_revs)
478478
.map(|groups_by_field_id| {
479479
groups_by_field_id
480480
.into_iter()
481-
.map(|(k, v)| (k, v.into()))
482-
.collect::<HashMap<String, RepeatedGridGroupConfigurationPB>>()
481+
.map(|(_, v)| v.into())
482+
.collect::<RepeatedGridGroupConfigurationPB>()
483483
})
484484
.unwrap_or_default();
485485

486486
GridSettingPB {
487487
layouts: GridLayoutPB::all(),
488488
current_layout_type,
489-
filter_configuration_by_field_id: filters_by_field_id,
490-
group_configuration_by_field_id: groups_by_field_id,
489+
filter_configuration_by_field_id,
490+
group_configurations,
491491
}
492492
}
493493

0 commit comments

Comments
 (0)