Skip to content

Commit e8b2195

Browse files
chore: add calendar view plugin along with backend data (#1611)
* chore: create build-in calendar data * feat: add new calendar view to plugins * chore: add create calendar page test * chore: disable for creation for now * fix: rebase regression Co-authored-by: nathan <[email protected]>
1 parent e479425 commit e8b2195

File tree

16 files changed

+199
-14
lines changed

16 files changed

+199
-14
lines changed

frontend/app_flowy/assets/translations/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,5 +313,8 @@
313313
"column": {
314314
"create_new_card": "New"
315315
}
316+
},
317+
"calendar": {
318+
"menuName": "Calendar"
316319
}
317320
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import 'package:app_flowy/generated/locale_keys.g.dart';
2+
import 'package:app_flowy/startup/plugin/plugin.dart';
3+
import 'package:app_flowy/workspace/presentation/home/home_stack.dart';
4+
import 'package:app_flowy/workspace/presentation/widgets/left_bar_item.dart';
5+
import 'package:easy_localization/easy_localization.dart';
6+
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
7+
import 'package:flutter/material.dart';
8+
9+
import '../util.dart';
10+
11+
class CalendarPluginBuilder extends PluginBuilder {
12+
@override
13+
Plugin build(dynamic data) {
14+
if (data is ViewPB) {
15+
return CalendarPlugin(pluginType: pluginType, view: data);
16+
} else {
17+
throw FlowyPluginException.invalidData;
18+
}
19+
}
20+
21+
@override
22+
String get menuName => LocaleKeys.calendar_menuName.tr();
23+
24+
@override
25+
String get menuIcon => "editor/date";
26+
27+
@override
28+
PluginType get pluginType => PluginType.calendar;
29+
30+
@override
31+
ViewDataFormatPB get dataFormatType => ViewDataFormatPB.DatabaseFormat;
32+
33+
@override
34+
ViewLayoutTypePB? get layoutType => ViewLayoutTypePB.Calendar;
35+
}
36+
37+
class CalendarPluginConfig implements PluginConfig {
38+
@override
39+
bool get creatable => false;
40+
}
41+
42+
class CalendarPlugin extends Plugin {
43+
@override
44+
final ViewPluginNotifier notifier;
45+
final PluginType _pluginType;
46+
47+
CalendarPlugin({
48+
required ViewPB view,
49+
required PluginType pluginType,
50+
}) : _pluginType = pluginType,
51+
notifier = ViewPluginNotifier(view: view);
52+
53+
@override
54+
PluginDisplay get display => CalendarPluginDisplay(notifier: notifier);
55+
56+
@override
57+
PluginId get id => notifier.view.id;
58+
59+
@override
60+
PluginType get ty => _pluginType;
61+
}
62+
63+
class CalendarPluginDisplay extends PluginDisplay {
64+
final ViewPluginNotifier notifier;
65+
CalendarPluginDisplay({required this.notifier, Key? key});
66+
67+
ViewPB get view => notifier.view;
68+
69+
@override
70+
Widget get leftBarItem => ViewLeftBarItem(view: view);
71+
72+
@override
73+
Widget buildWidget(PluginContext context) {
74+
notifier.isDeleted.addListener(() {
75+
notifier.isDeleted.value.fold(() => null, (deletedView) {
76+
if (deletedView.hasIndex()) {
77+
context.onDeleted(view, deletedView.index);
78+
}
79+
});
80+
});
81+
82+
return BlankPage(key: ValueKey(view.id));
83+
// return BoardPage(key: ValueKey(view.id), view: view);
84+
}
85+
86+
@override
87+
List<NavigationItem> get navigationItems => [this];
88+
}
89+
90+
// mark for removal
91+
class BlankPage extends StatefulWidget {
92+
const BlankPage({Key? key}) : super(key: key);
93+
94+
@override
95+
State<BlankPage> createState() => _BlankPageState();
96+
}
97+
98+
class _BlankPageState extends State<BlankPage> {
99+
@override
100+
Widget build(BuildContext context) {
101+
return SizedBox.expand(
102+
child: Container(
103+
color: Theme.of(context).colorScheme.surface,
104+
child: Padding(
105+
padding: const EdgeInsets.all(10),
106+
child: Container(),
107+
),
108+
),
109+
);
110+
}
111+
}

frontend/app_flowy/lib/startup/plugin/plugin.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ enum PluginType {
1414
trash,
1515
grid,
1616
board,
17+
calendar,
1718
}
1819

1920
typedef PluginId = String;

frontend/app_flowy/lib/startup/tasks/load_plugin.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:app_flowy/plugins/calendar/calendar.dart';
12
import 'package:app_flowy/startup/plugin/plugin.dart';
23
import 'package:app_flowy/startup/startup.dart';
34
import 'package:app_flowy/plugins/blank/blank.dart';
@@ -17,5 +18,7 @@ class PluginLoadTask extends LaunchTask {
1718
registerPlugin(builder: DocumentPluginBuilder());
1819
registerPlugin(builder: GridPluginBuilder(), config: GridPluginConfig());
1920
registerPlugin(builder: BoardPluginBuilder(), config: BoardPluginConfig());
21+
registerPlugin(
22+
builder: CalendarPluginBuilder(), config: CalendarPluginConfig());
2023
}
2124
}

frontend/app_flowy/lib/workspace/application/view/view_ext.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ extension ViewExtension on ViewPB {
4444
switch (layout) {
4545
case ViewLayoutTypePB.Board:
4646
return PluginType.board;
47+
case ViewLayoutTypePB.Calendar:
48+
return PluginType.calendar;
4749
case ViewLayoutTypePB.Document:
4850
return PluginType.editor;
4951
case ViewLayoutTypePB.Grid:

frontend/app_flowy/test/bloc_test/home_test/create_page_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:app_flowy/plugins/board/board.dart';
2+
import 'package:app_flowy/plugins/calendar/calendar.dart';
23
import 'package:app_flowy/plugins/document/document.dart';
34
import 'package:app_flowy/plugins/grid/grid.dart';
45
import 'package:app_flowy/workspace/application/app/app_bloc.dart';
@@ -37,6 +38,7 @@ void main() {
3738
assert(bloc.state.views.last.name == "Test grid");
3839
assert(bloc.state.views.last.layout == ViewLayoutTypePB.Grid);
3940
});
41+
4042
test('create a kanban', () async {
4143
final app = await testContext.createTestApp();
4244
final bloc = AppBloc(app: app)..add(const AppEvent.initial());
@@ -49,4 +51,17 @@ void main() {
4951
assert(bloc.state.views.last.name == "Test board");
5052
assert(bloc.state.views.last.layout == ViewLayoutTypePB.Board);
5153
});
54+
55+
test('create a calendar', () async {
56+
final app = await testContext.createTestApp();
57+
final bloc = AppBloc(app: app)..add(const AppEvent.initial());
58+
await blocResponseFuture();
59+
60+
bloc.add(AppEvent.createView("Test calendar", CalendarPluginBuilder()));
61+
await blocResponseFuture();
62+
63+
assert(bloc.state.views.length == 1);
64+
assert(bloc.state.views.last.name == "Test calendar");
65+
assert(bloc.state.views.last.layout == ViewLayoutTypePB.Calendar);
66+
});
5267
}

frontend/rust-lib/flowy-core/src/deps_resolve/folder_deps.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use flowy_folder::{
1111
};
1212
use flowy_grid::entities::GridLayout;
1313
use flowy_grid::manager::{make_grid_view_data, GridManager};
14-
use flowy_grid::util::{make_default_board, make_default_grid};
14+
use flowy_grid::util::{make_default_board, make_default_calendar, make_default_grid};
1515
use flowy_http_model::revision::Revision;
1616
use flowy_http_model::ws_data::ClientRevisionWSData;
1717
use flowy_net::ClientServerConfiguration;
@@ -264,6 +264,7 @@ impl ViewDataProcessor for GridViewDataProcessor {
264264
let (build_context, layout) = match layout {
265265
ViewLayoutTypePB::Grid => (make_default_grid(), GridLayout::Table),
266266
ViewLayoutTypePB::Board => (make_default_board(), GridLayout::Board),
267+
ViewLayoutTypePB::Calendar => (make_default_calendar(), GridLayout::Calendar),
267268
ViewLayoutTypePB::Document => {
268269
return FutureResult::new(async move {
269270
Err(FlowyError::internal().context(format!("Can't handle {:?} layout type", layout)))
@@ -293,6 +294,7 @@ impl ViewDataProcessor for GridViewDataProcessor {
293294
let layout = match layout {
294295
ViewLayoutTypePB::Grid => GridLayout::Table,
295296
ViewLayoutTypePB::Board => GridLayout::Board,
297+
ViewLayoutTypePB::Calendar => GridLayout::Calendar,
296298
ViewLayoutTypePB::Document => {
297299
return FutureResult::new(async move {
298300
Err(FlowyError::internal().context(format!("Can't handle {:?} layout type", layout)))

frontend/rust-lib/flowy-folder/src/entities/view.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ pub enum ViewLayoutTypePB {
8686
Document = 0,
8787
Grid = 3,
8888
Board = 4,
89+
Calendar = 5,
8990
}
9091

9192
impl std::default::Default for ViewLayoutTypePB {
@@ -100,6 +101,7 @@ impl std::convert::From<ViewLayoutTypeRevision> for ViewLayoutTypePB {
100101
ViewLayoutTypeRevision::Grid => ViewLayoutTypePB::Grid,
101102
ViewLayoutTypeRevision::Board => ViewLayoutTypePB::Board,
102103
ViewLayoutTypeRevision::Document => ViewLayoutTypePB::Document,
104+
ViewLayoutTypeRevision::Calendar => ViewLayoutTypePB::Calendar,
103105
}
104106
}
105107
}
@@ -110,6 +112,7 @@ impl std::convert::From<ViewLayoutTypePB> for ViewLayoutTypeRevision {
110112
ViewLayoutTypePB::Grid => ViewLayoutTypeRevision::Grid,
111113
ViewLayoutTypePB::Board => ViewLayoutTypeRevision::Board,
112114
ViewLayoutTypePB::Document => ViewLayoutTypeRevision::Document,
115+
ViewLayoutTypePB::Calendar => ViewLayoutTypeRevision::Calendar,
113116
}
114117
}
115118
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ impl FieldType {
570570
}
571571

572572
pub fn can_be_group(&self) -> bool {
573-
self.is_select_option()
573+
self.is_select_option() || self.is_checkbox()
574574
}
575575
}
576576

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ impl GridLayoutPB {
4949
pub enum GridLayout {
5050
Table = 0,
5151
Board = 1,
52+
Calendar = 2,
5253
}
5354

5455
impl std::default::Default for GridLayout {
@@ -62,6 +63,7 @@ impl std::convert::From<LayoutRevision> for GridLayout {
6263
match rev {
6364
LayoutRevision::Table => GridLayout::Table,
6465
LayoutRevision::Board => GridLayout::Board,
66+
LayoutRevision::Calendar => GridLayout::Calendar,
6567
}
6668
}
6769
}
@@ -71,6 +73,7 @@ impl std::convert::From<GridLayout> for LayoutRevision {
7173
match layout {
7274
GridLayout::Table => LayoutRevision::Table,
7375
GridLayout::Board => LayoutRevision::Board,
76+
GridLayout::Calendar => LayoutRevision::Calendar,
7477
}
7578
}
7679
}

0 commit comments

Comments
 (0)