Skip to content

Commit a298f7c

Browse files
authored
Merge pull request #474 from AppFlowy-IO/feat_number_format
Feature: support more number format
2 parents 5c4a681 + 1488caa commit a298f7c

File tree

16 files changed

+951
-136
lines changed

16 files changed

+951
-136
lines changed

frontend/app_flowy/lib/workspace/application/grid/cell/selection_editor_bloc.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ class SelectOptionEditorBloc extends Bloc<SelectOptionEditorEvent, SelectOptionE
9696

9797
List<SelectOption> _makeOptions(String filter, List<SelectOption> allOptions) {
9898
final List<SelectOption> options = List.from(allOptions);
99-
options.retainWhere((option) => option.name.contains(filter));
99+
if (filter.isNotEmpty) {
100+
options.retainWhere((option) => option.name.toLowerCase().contains(filter.toLowerCase()));
101+
}
102+
100103
return options;
101104
}
102105

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:freezed_annotation/freezed_annotation.dart';
4+
import 'dart:async';
5+
part 'number_format_bloc.freezed.dart';
6+
7+
class NumberFormatBloc extends Bloc<NumberFormatEvent, NumberFormatState> {
8+
NumberFormatBloc() : super(NumberFormatState.initial()) {
9+
on<NumberFormatEvent>(
10+
(event, emit) async {
11+
event.map(setFilter: (_SetFilter value) {
12+
final List<NumberFormat> formats = List.from(NumberFormat.values);
13+
if (value.filter.isNotEmpty) {
14+
formats.retainWhere((element) => element.title().toLowerCase().contains(value.filter.toLowerCase()));
15+
}
16+
emit(state.copyWith(formats: formats, filter: value.filter));
17+
});
18+
},
19+
);
20+
}
21+
22+
@override
23+
Future<void> close() async {
24+
return super.close();
25+
}
26+
}
27+
28+
@freezed
29+
class NumberFormatEvent with _$NumberFormatEvent {
30+
const factory NumberFormatEvent.setFilter(String filter) = _SetFilter;
31+
}
32+
33+
@freezed
34+
class NumberFormatState with _$NumberFormatState {
35+
const factory NumberFormatState({
36+
required List<NumberFormat> formats,
37+
required String filter,
38+
}) = _NumberFormatState;
39+
40+
factory NumberFormatState.initial() {
41+
return const NumberFormatState(
42+
formats: NumberFormat.values,
43+
filter: "",
44+
);
45+
}
46+
}
47+
48+
extension NumberFormatExtension on NumberFormat {
49+
String title() {
50+
switch (this) {
51+
case NumberFormat.ArgentinePeso:
52+
return "Argentine peso";
53+
case NumberFormat.Baht:
54+
return "Baht";
55+
case NumberFormat.CanadianDollar:
56+
return "Canadian dollar";
57+
case NumberFormat.ChileanPeso:
58+
return "Chilean peso";
59+
case NumberFormat.ColombianPeso:
60+
return "Colombian peso";
61+
case NumberFormat.DanishKrone:
62+
return "Danish krone";
63+
case NumberFormat.Dirham:
64+
return "Dirham";
65+
case NumberFormat.EUR:
66+
return "Euro";
67+
case NumberFormat.Forint:
68+
return "Forint";
69+
case NumberFormat.Franc:
70+
return "Franc";
71+
case NumberFormat.HongKongDollar:
72+
return "Hone Kong dollar";
73+
case NumberFormat.Koruna:
74+
return "Koruna";
75+
case NumberFormat.Krona:
76+
return "Krona";
77+
case NumberFormat.Leu:
78+
return "Leu";
79+
case NumberFormat.Lira:
80+
return "Lira";
81+
case NumberFormat.MexicanPeso:
82+
return "Mexican Peso";
83+
case NumberFormat.NewTaiwanDollar:
84+
return "New Taiwan dollar";
85+
case NumberFormat.NewZealandDollar:
86+
return "New Zealand dollar";
87+
case NumberFormat.NorwegianKrone:
88+
return "Norwegian krone";
89+
case NumberFormat.Number:
90+
return "Number";
91+
case NumberFormat.Percent:
92+
return "Percent";
93+
case NumberFormat.PhilippinePeso:
94+
return "Percent";
95+
case NumberFormat.Pound:
96+
return "Pound";
97+
case NumberFormat.Rand:
98+
return "Rand";
99+
case NumberFormat.Real:
100+
return "Real";
101+
case NumberFormat.Ringgit:
102+
return "Ringgit";
103+
case NumberFormat.Riyal:
104+
return "Riyal";
105+
case NumberFormat.Ruble:
106+
return "Ruble";
107+
case NumberFormat.Rupee:
108+
return "Rupee";
109+
case NumberFormat.Rupiah:
110+
return "Rupiah";
111+
case NumberFormat.Shekel:
112+
return "Skekel";
113+
case NumberFormat.USD:
114+
return "US Dollar";
115+
case NumberFormat.UruguayanPeso:
116+
return "Uruguayan peso";
117+
case NumberFormat.Won:
118+
return "Uruguayan peso";
119+
case NumberFormat.Yen:
120+
return "Yen";
121+
case NumberFormat.Yuan:
122+
return "Yuan";
123+
default:
124+
throw UnimplementedError;
125+
}
126+
}
127+
128+
// String iconName() {
129+
// switch (this) {
130+
// case NumberFormat.CNY:
131+
// return "grid/field/yen";
132+
// case NumberFormat.EUR:
133+
// return "grid/field/euro";
134+
// case NumberFormat.Number:
135+
// return "grid/field/numbers";
136+
// case NumberFormat.USD:
137+
// return "grid/field/us_dollar";
138+
// default:
139+
// throw UnimplementedError;
140+
// }
141+
// }
142+
}

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class GridSize {
1212
static double get cellHPadding => 10 * scale;
1313
static double get cellVPadding => 10 * scale;
1414
static double get typeOptionItemHeight => 32 * scale;
15-
static double get typeOptionSeparatorHeight => 6 * scale;
15+
static double get typeOptionSeparatorHeight => 4 * scale;
1616

1717
//
1818
static EdgeInsets get headerContentInsets => EdgeInsets.symmetric(

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_editor.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:app_flowy/workspace/application/grid/cell/cell_service.dart';
33
import 'package:app_flowy/workspace/application/grid/cell/selection_editor_bloc.dart';
44
import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart';
55
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/edit_option_pannel.dart';
6-
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/widget.dart';
6+
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/common/text_field.dart';
77
import 'package:flowy_infra/image.dart';
88
import 'package:flowy_infra/theme.dart';
99
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,33 @@ import 'package:flowy_infra_ui/widget/rounded_input_field.dart';
33
import 'package:flutter/material.dart';
44
import 'package:flutter_bloc/flutter_bloc.dart';
55

6-
class NameTextField extends StatefulWidget {
7-
final void Function(String) onDone;
6+
class InputTextField extends StatefulWidget {
7+
final void Function(String)? onDone;
8+
final void Function(String)? onChanged;
89
final void Function() onCanceled;
9-
final String name;
10+
final String text;
1011

11-
const NameTextField({
12-
required this.name,
13-
required this.onDone,
12+
const InputTextField({
13+
required this.text,
14+
this.onDone,
1415
required this.onCanceled,
16+
this.onChanged,
1517
Key? key,
1618
}) : super(key: key);
1719

1820
@override
19-
State<NameTextField> createState() => _NameTextFieldState();
21+
State<InputTextField> createState() => _InputTextFieldState();
2022
}
2123

22-
class _NameTextFieldState extends State<NameTextField> {
24+
class _InputTextFieldState extends State<InputTextField> {
2325
late FocusNode _focusNode;
2426
var isEdited = false;
2527
late TextEditingController _controller;
2628

2729
@override
2830
void initState() {
2931
_focusNode = FocusNode();
30-
_controller = TextEditingController(text: widget.name);
32+
_controller = TextEditingController(text: widget.text);
3133

3234
_focusNode.addListener(notifyDidEndEditing);
3335
super.initState();
@@ -46,8 +48,15 @@ class _NameTextFieldState extends State<NameTextField> {
4648
normalBorderColor: theme.shader4,
4749
focusBorderColor: theme.main1,
4850
cursorColor: theme.main1,
51+
onChanged: (text) {
52+
if (widget.onChanged != null) {
53+
widget.onChanged!(text);
54+
}
55+
},
4956
onEditingComplete: () {
50-
widget.onDone(_controller.text);
57+
if (widget.onDone != null) {
58+
widget.onDone!(_controller.text);
59+
}
5160
},
5261
);
5362
}
@@ -64,7 +73,9 @@ class _NameTextFieldState extends State<NameTextField> {
6473
if (_controller.text.isEmpty) {
6574
widget.onCanceled();
6675
} else {
67-
widget.onDone(_controller.text);
76+
if (widget.onDone != null) {
77+
widget.onDone!(_controller.text);
78+
}
6879
}
6980
}
7081
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:easy_localization/easy_localization.dart';
66
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
77
import 'package:flowy_infra_ui/style_widget/text.dart';
88
import 'package:flowy_infra_ui/widget/spacing.dart';
9+
import 'package:flowy_sdk/log.dart';
910
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Field;
1011
import 'package:flutter/material.dart';
1112
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -29,11 +30,12 @@ class FieldEditor extends FlowyOverlayDelegate {
2930
BuildContext context, {
3031
AnchorDirection anchorDirection = AnchorDirection.bottomWithLeftAligned,
3132
}) {
33+
Log.trace("Show $identifier()");
3234
FlowyOverlay.of(context).remove(identifier());
3335
FlowyOverlay.of(context).insertWithAnchor(
3436
widget: OverlayContainer(
3537
child: _FieldEditorWidget(_fieldEditorBloc, fieldContextLoader),
36-
constraints: BoxConstraints.loose(const Size(220, 400)),
38+
constraints: BoxConstraints.loose(const Size(280, 400)),
3739
),
3840
identifier: identifier(),
3941
anchorContext: context,
@@ -68,7 +70,7 @@ class _FieldEditorWidget extends StatelessWidget {
6870
child: BlocBuilder<FieldEditorBloc, FieldEditorState>(
6971
builder: (context, state) {
7072
return state.field.fold(
71-
() => const SizedBox(width: 200),
73+
() => const SizedBox(),
7274
(field) => ListView(
7375
shrinkWrap: true,
7476
children: [

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pbserver.dart
1414
import 'package:flowy_sdk/protobuf/flowy-grid/text_type_option.pb.dart';
1515
import 'package:flutter/material.dart';
1616
import 'package:flutter_bloc/flutter_bloc.dart';
17-
1817
import 'package:app_flowy/startup/startup.dart';
1918
import 'package:app_flowy/workspace/application/grid/prelude.dart';
2019
import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart';
2120
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart';
2221
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/date.dart';
23-
2422
import 'field_type_extension.dart';
2523
import 'type_option/multi_select.dart';
2624
import 'type_option/number.dart';
@@ -146,7 +144,7 @@ class _FieldSwitcherState extends State<FieldSwitcher> {
146144
FlowyOverlay.of(context).insertWithAnchor(
147145
widget: OverlayContainer(
148146
child: child,
149-
constraints: BoxConstraints.loose(const Size(340, 400)),
147+
constraints: BoxConstraints.loose(const Size(460, 440)),
150148
),
151149
identifier: identifier,
152150
anchorContext: context,

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:app_flowy/workspace/application/grid/field/type_option/edit_select_option_bloc.dart';
22
import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart';
33
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/extension.dart';
4-
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/widget.dart';
4+
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/common/text_field.dart';
55
import 'package:flowy_infra/image.dart';
66
import 'package:flowy_infra/theme.dart';
77
import 'package:flowy_infra_ui/style_widget/button.dart';
@@ -95,8 +95,8 @@ class _OptionNameTextField extends StatelessWidget {
9595

9696
@override
9797
Widget build(BuildContext context) {
98-
return NameTextField(
99-
name: name,
98+
return InputTextField(
99+
text: name,
100100
onCanceled: () {},
101101
onDone: (optionName) {
102102
if (name != optionName) {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:app_flowy/workspace/application/grid/field/type_option/field_option_pannel_bloc.dart';
22
import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart';
3+
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/common/text_field.dart';
34
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart';
45
import 'package:flowy_infra/image.dart';
56
import 'package:flowy_infra/theme.dart';
@@ -13,7 +14,6 @@ import 'package:easy_localization/easy_localization.dart';
1314
import 'package:app_flowy/generated/locale_keys.g.dart';
1415

1516
import 'edit_option_pannel.dart';
16-
import 'widget.dart';
1717

1818
class FieldSelectOptionPannel extends StatelessWidget {
1919
final List<SelectOption> options;
@@ -222,8 +222,8 @@ class _OptionNameTextField extends StatelessWidget {
222222

223223
@override
224224
Widget build(BuildContext context) {
225-
return NameTextField(
226-
name: "",
225+
return InputTextField(
226+
text: "",
227227
onCanceled: () {
228228
context.read<FieldOptionPannelBloc>().add(const FieldOptionPannelEvent.endAddingOption());
229229
},

0 commit comments

Comments
 (0)