Skip to content

Commit 0b8083c

Browse files
committed
fix: create option with different color
1 parent bd0907b commit 0b8083c

File tree

12 files changed

+147
-124
lines changed

12 files changed

+147
-124
lines changed

frontend/app_flowy/lib/startup/deps_resolver.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:app_flowy/workspace/presentation/home/home_stack.dart';
1717
import 'package:app_flowy/workspace/presentation/home/menu/menu.dart';
1818
import 'package:flowy_sdk/protobuf/flowy-folder-data-model/app.pb.dart';
1919
import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
20+
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show EditFieldContext;
2021
import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart';
2122
import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart';
2223
import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart';
@@ -201,8 +202,8 @@ void _resolveGridDeps(GetIt getIt) {
201202
),
202203
);
203204

204-
getIt.registerFactoryParam<FieldSwitcherBloc, SwitchFieldContext, void>(
205-
(context, _) => FieldSwitcherBloc(context),
205+
getIt.registerFactoryParam<FieldEditorPannelBloc, EditFieldContext, void>(
206+
(context, _) => FieldEditorPannelBloc(context),
206207
);
207208

208209
getIt.registerFactoryParam<DateTypeOptionBloc, DateTypeOption, void>(

frontend/app_flowy/lib/workspace/application/grid/field/field_editor_bloc.dart

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
66
import 'dart:async';
77
import 'field_service.dart';
88
import 'package:dartz/dartz.dart';
9+
import 'package:protobuf/protobuf.dart';
910

1011
part 'field_editor_bloc.freezed.dart';
1112

@@ -25,10 +26,13 @@ class FieldEditorBloc extends Bloc<FieldEditorEvent, FieldEditorState> {
2526
await _getEditFieldContext(emit);
2627
},
2728
updateName: (_UpdateName value) {
28-
emit(state.copyWith(fieldName: value.name));
29+
final newContext = _updateEditContext(name: value.name);
30+
emit(state.copyWith(editFieldContext: newContext));
2931
},
30-
switchField: (_SwitchField value) {
31-
emit(state.copyWith(field: Some(value.field), typeOptionData: value.typeOptionData));
32+
updateField: (_UpdateField value) {
33+
final newContext = _updateEditContext(field: value.field, typeOptionData: value.typeOptionData);
34+
35+
emit(state.copyWith(editFieldContext: newContext));
3236
},
3337
done: (_Done value) async {
3438
await _saveField(emit);
@@ -43,14 +47,49 @@ class FieldEditorBloc extends Bloc<FieldEditorEvent, FieldEditorState> {
4347
return super.close();
4448
}
4549

50+
Option<EditFieldContext> _updateEditContext({
51+
String? name,
52+
Field? field,
53+
List<int>? typeOptionData,
54+
}) {
55+
return state.editFieldContext.fold(
56+
() => none(),
57+
(context) {
58+
context.freeze();
59+
final newContext = context.rebuild((newContext) {
60+
newContext.gridField.rebuild((newField) {
61+
if (name != null) {
62+
newField.name = name;
63+
}
64+
65+
newContext.gridField = newField;
66+
});
67+
68+
if (field != null) {
69+
newContext.gridField = field;
70+
}
71+
72+
if (typeOptionData != null) {
73+
newContext.typeOptionData = typeOptionData;
74+
}
75+
});
76+
service.insertField(
77+
field: newContext.gridField,
78+
typeOptionData: newContext.typeOptionData,
79+
);
80+
81+
return Some(newContext);
82+
},
83+
);
84+
}
85+
4686
Future<void> _saveField(Emitter<FieldEditorState> emit) async {
47-
await state.field.fold(
87+
await state.editFieldContext.fold(
4888
() async => null,
49-
(field) async {
50-
field.name = state.fieldName;
89+
(context) async {
5190
final result = await service.insertField(
52-
field: field,
53-
typeOptionData: state.typeOptionData,
91+
field: context.gridField,
92+
typeOptionData: context.typeOptionData,
5493
);
5594
result.fold((l) => null, (r) => null);
5695
},
@@ -60,11 +99,9 @@ class FieldEditorBloc extends Bloc<FieldEditorEvent, FieldEditorState> {
6099
Future<void> _getEditFieldContext(Emitter<FieldEditorState> emit) async {
61100
final result = await _loader.load();
62101
result.fold(
63-
(editContext) {
102+
(context) {
64103
emit(state.copyWith(
65-
field: Some(editContext.gridField),
66-
typeOptionData: editContext.typeOptionData,
67-
fieldName: editContext.gridField.name,
104+
editFieldContext: Some(context),
68105
));
69106
},
70107
(err) => Log.error(err),
@@ -76,25 +113,21 @@ class FieldEditorBloc extends Bloc<FieldEditorEvent, FieldEditorState> {
76113
class FieldEditorEvent with _$FieldEditorEvent {
77114
const factory FieldEditorEvent.initial() = _InitialField;
78115
const factory FieldEditorEvent.updateName(String name) = _UpdateName;
79-
const factory FieldEditorEvent.switchField(Field field, Uint8List typeOptionData) = _SwitchField;
116+
const factory FieldEditorEvent.updateField(Field field, Uint8List typeOptionData) = _UpdateField;
80117
const factory FieldEditorEvent.done() = _Done;
81118
}
82119

83120
@freezed
84121
class FieldEditorState with _$FieldEditorState {
85122
const factory FieldEditorState({
86-
required String fieldName,
87123
required String gridId,
88124
required String errorText,
89-
required Option<Field> field,
90-
required List<int> typeOptionData,
125+
required Option<EditFieldContext> editFieldContext,
91126
}) = _FieldEditorState;
92127

93128
factory FieldEditorState.initial(String gridId) => FieldEditorState(
94129
gridId: gridId,
95-
fieldName: '',
96-
field: none(),
130+
editFieldContext: none(),
97131
errorText: '',
98-
typeOptionData: List<int>.empty(),
99132
);
100133
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import 'dart:typed_data';
2+
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
3+
import 'package:flutter_bloc/flutter_bloc.dart';
4+
import 'package:freezed_annotation/freezed_annotation.dart';
5+
import 'dart:async';
6+
7+
part 'field_editor_pannel_bloc.freezed.dart';
8+
9+
class FieldEditorPannelBloc extends Bloc<FieldEditorPannelEvent, FieldEditorPannelState> {
10+
FieldEditorPannelBloc(EditFieldContext editContext) : super(FieldEditorPannelState.initial(editContext)) {
11+
on<FieldEditorPannelEvent>(
12+
(event, emit) async {
13+
await event.map(
14+
toFieldType: (_ToFieldType value) async {
15+
emit(state.copyWith(
16+
field: value.field,
17+
typeOptionData: Uint8List.fromList(value.typeOptionData),
18+
));
19+
},
20+
didUpdateTypeOptionData: (_DidUpdateTypeOptionData value) {
21+
emit(state.copyWith(typeOptionData: value.typeOptionData));
22+
},
23+
);
24+
},
25+
);
26+
}
27+
28+
@override
29+
Future<void> close() async {
30+
return super.close();
31+
}
32+
}
33+
34+
@freezed
35+
class FieldEditorPannelEvent with _$FieldEditorPannelEvent {
36+
const factory FieldEditorPannelEvent.toFieldType(Field field, List<int> typeOptionData) = _ToFieldType;
37+
const factory FieldEditorPannelEvent.didUpdateTypeOptionData(Uint8List typeOptionData) = _DidUpdateTypeOptionData;
38+
}
39+
40+
@freezed
41+
class FieldEditorPannelState with _$FieldEditorPannelState {
42+
const factory FieldEditorPannelState({
43+
required String gridId,
44+
required Field field,
45+
required Uint8List typeOptionData,
46+
}) = _FieldEditorPannelState;
47+
48+
factory FieldEditorPannelState.initial(EditFieldContext context) => FieldEditorPannelState(
49+
gridId: context.gridId,
50+
field: context.gridField,
51+
typeOptionData: Uint8List.fromList(context.typeOptionData),
52+
);
53+
}

frontend/app_flowy/lib/workspace/application/grid/field/field_switch_bloc.dart

Lines changed: 0 additions & 61 deletions
This file was deleted.

frontend/app_flowy/lib/workspace/application/grid/prelude.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export 'grid_header_bloc.dart';
88
export 'field/field_service.dart';
99
export 'field/field_action_sheet_bloc.dart';
1010
export 'field/field_editor_bloc.dart';
11-
export 'field/field_switch_bloc.dart';
11+
export 'field/field_editor_pannel_bloc.dart';
1212

1313
// Field Type Option
1414
export 'field/type_option/date_bloc.dart';

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_editor.dart

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
import 'package:app_flowy/startup/startup.dart';
22
import 'package:app_flowy/workspace/application/grid/field/field_editor_bloc.dart';
33
import 'package:app_flowy/workspace/application/grid/field/field_service.dart';
4-
import 'package:app_flowy/workspace/application/grid/field/field_switch_bloc.dart';
54
import 'package:easy_localization/easy_localization.dart';
65
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
76
import 'package:flowy_infra_ui/style_widget/text.dart';
87
import 'package:flowy_infra_ui/widget/spacing.dart';
9-
import 'package:flowy_sdk/log.dart';
10-
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Field;
118
import 'package:flutter/material.dart';
129
import 'package:flutter_bloc/flutter_bloc.dart';
1310
import 'package:app_flowy/generated/locale_keys.g.dart';
1411
import 'field_name_input.dart';
15-
import 'field_switcher.dart';
12+
import 'field_editor_pannel.dart';
1613

1714
class FieldEditor extends FlowyOverlayDelegate {
1815
final String gridId;
@@ -30,7 +27,6 @@ class FieldEditor extends FlowyOverlayDelegate {
3027
BuildContext context, {
3128
AnchorDirection anchorDirection = AnchorDirection.bottomWithLeftAligned,
3229
}) {
33-
Log.trace("Show $identifier()");
3430
FlowyOverlay.of(context).remove(identifier());
3531
FlowyOverlay.of(context).insertWithAnchor(
3632
widget: OverlayContainer(
@@ -69,47 +65,48 @@ class _FieldEditorWidget extends StatelessWidget {
6965
value: editorBloc,
7066
child: BlocBuilder<FieldEditorBloc, FieldEditorState>(
7167
builder: (context, state) {
72-
return state.field.fold(
68+
return state.editFieldContext.fold(
7369
() => const SizedBox(),
74-
(field) => ListView(
70+
(editFieldContext) => ListView(
7571
shrinkWrap: true,
7672
children: [
7773
FlowyText.medium(LocaleKeys.grid_field_editProperty.tr(), fontSize: 12),
7874
const VSpace(10),
7975
const _FieldNameTextField(),
8076
const VSpace(10),
81-
_renderSwitchButton(context, field, state),
77+
FieldEditorPannel(
78+
editFieldContext: editFieldContext,
79+
onSwitchToField: (fieldId, fieldType) {
80+
return fieldContextLoader.switchToField(fieldId, fieldType);
81+
},
82+
onUpdated: (field, typeOptionData) {
83+
context.read<FieldEditorBloc>().add(FieldEditorEvent.updateField(field, typeOptionData));
84+
},
85+
),
8286
],
8387
),
8488
);
8589
},
8690
),
8791
);
8892
}
89-
90-
Widget _renderSwitchButton(BuildContext context, Field field, FieldEditorState state) {
91-
return FieldSwitcher(
92-
switchContext: SwitchFieldContext(state.gridId, field, state.typeOptionData),
93-
onSwitchToField: (fieldId, fieldType) {
94-
return fieldContextLoader.switchToField(fieldId, fieldType);
95-
},
96-
onUpdated: (field, typeOptionData) {
97-
context.read<FieldEditorBloc>().add(FieldEditorEvent.switchField(field, typeOptionData));
98-
},
99-
);
100-
}
10193
}
10294

10395
class _FieldNameTextField extends StatelessWidget {
10496
const _FieldNameTextField({Key? key}) : super(key: key);
10597

10698
@override
10799
Widget build(BuildContext context) {
108-
return BlocBuilder<FieldEditorBloc, FieldEditorState>(
109-
buildWhen: (previous, current) => previous.fieldName != current.fieldName,
110-
builder: (context, state) {
100+
return BlocSelector<FieldEditorBloc, FieldEditorState, String>(
101+
selector: (state) {
102+
return state.editFieldContext.fold(
103+
() => "",
104+
(editFieldContext) => editFieldContext.gridField.name,
105+
);
106+
},
107+
builder: (context, name) {
111108
return FieldNameTextField(
112-
name: state.fieldName,
109+
name: name,
113110
errorText: context.read<FieldEditorBloc>().state.errorText,
114111
onNameChanged: (newName) {
115112
context.read<FieldEditorBloc>().add(FieldEditorEvent.updateName(newName));

0 commit comments

Comments
 (0)