Skip to content

Commit 4f9470b

Browse files
committed
chore: add date type option test
1 parent a178546 commit 4f9470b

File tree

6 files changed

+272
-134
lines changed

6 files changed

+272
-134
lines changed

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

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,50 +23,61 @@ class DateCalBloc extends Bloc<DateCalEvent, DateCalState> {
2323
}) : super(DateCalState.initial(dateTypeOption, selectedDay)) {
2424
on<DateCalEvent>(
2525
(event, emit) async {
26-
await event.map(
27-
initial: (_Initial value) async {
28-
_startListening();
29-
// await _loadDateTypeOption(emit);
26+
await event.when(
27+
initial: () async => _startListening(),
28+
selectDay: (date) {
29+
_updateDateData(emit, date: date);
3030
},
31-
selectDay: (_SelectDay value) {
32-
if (state.dateData != null) {
33-
if (!isSameDay(state.dateData!.date, value.day)) {
34-
final newDateData = state.dateData!.copyWith(date: value.day);
35-
emit(state.copyWith(dateData: newDateData));
36-
}
37-
} else {
38-
emit(state.copyWith(dateData: DateCellPersistenceData(date: value.day)));
39-
}
31+
setCalFormat: (format) {
32+
emit(state.copyWith(format: format));
4033
},
41-
setCalFormat: (_CalendarFormat value) {
42-
emit(state.copyWith(format: value.format));
34+
setFocusedDay: (focusedDay) {
35+
emit(state.copyWith(focusedDay: focusedDay));
4336
},
44-
setFocusedDay: (_FocusedDay value) {
45-
emit(state.copyWith(focusedDay: value.day));
37+
didReceiveCellUpdate: (value) {},
38+
setIncludeTime: (includeTime) async {
39+
await _updateTypeOption(emit, includeTime: includeTime);
4640
},
47-
didReceiveCellUpdate: (_DidReceiveCellUpdate value) {},
48-
setIncludeTime: (_IncludeTime value) async {
49-
await _updateTypeOption(emit, includeTime: value.includeTime);
41+
setDateFormat: (dateFormat) async {
42+
await _updateTypeOption(emit, dateFormat: dateFormat);
5043
},
51-
setDateFormat: (_DateFormat value) async {
52-
await _updateTypeOption(emit, dateFormat: value.dateFormat);
44+
setTimeFormat: (timeFormat) async {
45+
await _updateTypeOption(emit, timeFormat: timeFormat);
5346
},
54-
setTimeFormat: (_TimeFormat value) async {
55-
await _updateTypeOption(emit, timeFormat: value.timeFormat);
56-
},
57-
setTime: (_Time value) {
58-
if (state.dateData != null) {
59-
final newDateData = state.dateData!.copyWith(time: value.time);
60-
emit(state.copyWith(dateData: newDateData));
61-
} else {
62-
emit(state.copyWith(dateData: DateCellPersistenceData(date: DateTime.now(), time: value.time)));
63-
}
47+
setTime: (time) {
48+
_updateDateData(emit, time: time);
6449
},
6550
);
6651
},
6752
);
6853
}
6954

55+
void _updateDateData(Emitter<DateCalState> emit, {DateTime? date, String? time}) {
56+
state.dateData.fold(
57+
() {
58+
var newDateData = DateCellPersistenceData(date: date ?? DateTime.now());
59+
if (time != null) {
60+
newDateData = newDateData.copyWith(time: time);
61+
}
62+
emit(state.copyWith(dateData: Some(newDateData)));
63+
},
64+
(dateData) {
65+
var newDateData = dateData;
66+
if (date != null && !isSameDay(newDateData.date, date)) {
67+
newDateData = newDateData.copyWith(date: date);
68+
}
69+
70+
if (newDateData.time != time) {
71+
newDateData = newDateData.copyWith(time: time);
72+
}
73+
74+
if (newDateData != dateData) {
75+
emit(state.copyWith(dateData: Some(newDateData)));
76+
}
77+
},
78+
);
79+
}
80+
7081
@override
7182
Future<void> close() async {
7283
if (_onCellChangedFn != null) {
@@ -142,16 +153,16 @@ class DateCalState with _$DateCalState {
142153
required DateTime focusedDay,
143154
required String time,
144155
required Option<FlowyError> inputTimeError,
145-
DateCellPersistenceData? dateData,
156+
required Option<DateCellPersistenceData> dateData,
146157
}) = _DateCalState;
147158

148159
factory DateCalState.initial(
149160
DateTypeOption dateTypeOption,
150161
DateTime? selectedDay,
151162
) {
152-
DateCellPersistenceData? dateData;
163+
Option<DateCellPersistenceData> dateData = none();
153164
if (selectedDay != null) {
154-
dateData = DateCellPersistenceData(date: selectedDay);
165+
dateData = Some(DateCellPersistenceData(date: selectedDay));
155166
}
156167

157168
return DateCalState(

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

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,11 @@ class DateCellBloc extends Bloc<DateCellEvent, DateCellState> {
1212
DateCellBloc({required this.cellContext}) : super(DateCellState.initial(cellContext)) {
1313
on<DateCellEvent>(
1414
(event, emit) async {
15-
event.map(
16-
initial: (_InitialCell value) {
17-
_startListening();
18-
},
19-
selectDay: (_SelectDay value) {
20-
cellContext.saveCellData(value.data);
21-
},
22-
didReceiveCellUpdate: (_DidReceiveCellUpdate value) {
23-
emit(state.copyWith(
24-
content: value.cell.content,
25-
));
26-
},
27-
didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) {
28-
emit(state.copyWith(field: value.field));
29-
},
15+
event.when(
16+
initial: () => _startListening(),
17+
selectDate: (DateCellPersistenceData value) => cellContext.saveCellData(value),
18+
didReceiveCellUpdate: (Cell value) => emit(state.copyWith(content: value.content)),
19+
didReceiveFieldUpdate: (Field value) => emit(state.copyWith(field: value)),
3020
);
3121
},
3222
);
@@ -56,7 +46,7 @@ class DateCellBloc extends Bloc<DateCellEvent, DateCellState> {
5646
@freezed
5747
class DateCellEvent with _$DateCellEvent {
5848
const factory DateCellEvent.initial() = _InitialCell;
59-
const factory DateCellEvent.selectDay(DateCellPersistenceData data) = _SelectDay;
49+
const factory DateCellEvent.selectDate(DateCellPersistenceData data) = _SelectDay;
6050
const factory DateCellEvent.didReceiveCellUpdate(Cell cell) = _DidReceiveCellUpdate;
6151
const factory DateCellEvent.didReceiveFieldUpdate(Field field) = _DidReceiveFieldUpdate;
6252
}

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/date_cell/calendar.dart

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,10 @@ class _CellCalendarWidget extends StatelessWidget {
112112
)..add(const DateCalEvent.initial()),
113113
child: BlocConsumer<DateCalBloc, DateCalState>(
114114
listener: (context, state) {
115-
if (state.dateData != null) {
116-
onSelected(state.dateData!);
117-
}
115+
state.dateData.fold(
116+
() => null,
117+
(dateData) => onSelected(dateData),
118+
);
118119
},
119120
listenWhen: (p, c) => p.dateData != c.dateData,
120121
builder: (context, state) {
@@ -127,7 +128,13 @@ class _CellCalendarWidget extends StatelessWidget {
127128

128129
if (state.dateTypeOption.includeTime) {
129130
children.addAll([
130-
const _TimeTextField(),
131+
_TimeTextField(
132+
time: "",
133+
errorText: state.inputTimeError.fold(() => "", (error) => error.toString()),
134+
onEditingComplete: (text) {
135+
context.read<DateCalBloc>().add(DateCalEvent.setTime(text));
136+
},
137+
),
131138
]);
132139
}
133140

@@ -190,11 +197,10 @@ class _CellCalendarWidget extends StatelessWidget {
190197
),
191198
),
192199
selectedDayPredicate: (day) {
193-
if (state.dateData != null) {
194-
return isSameDay(state.dateData!.date, day);
195-
} else {
196-
return false;
197-
}
200+
return state.dateData.fold(
201+
() => false,
202+
(dateData) => isSameDay(dateData.date, day),
203+
);
198204
},
199205
onDaySelected: (selectedDay, focusedDay) {
200206
context.read<DateCalBloc>().add(DateCalEvent.selectDay(selectedDay));
@@ -241,8 +247,36 @@ class _IncludeTimeButton extends StatelessWidget {
241247
}
242248
}
243249

244-
class _TimeTextField extends StatelessWidget {
245-
const _TimeTextField({Key? key}) : super(key: key);
250+
class _TimeTextField extends StatefulWidget {
251+
final String errorText;
252+
final String time;
253+
final void Function(String) onEditingComplete;
254+
const _TimeTextField({
255+
Key? key,
256+
required this.time,
257+
required this.errorText,
258+
required this.onEditingComplete,
259+
}) : super(key: key);
260+
261+
@override
262+
State<_TimeTextField> createState() => _TimeTextFieldState();
263+
}
264+
265+
class _TimeTextFieldState extends State<_TimeTextField> {
266+
late final FocusNode _focusNode;
267+
late final TextEditingController _controller;
268+
269+
@override
270+
void initState() {
271+
_focusNode = FocusNode();
272+
_controller = TextEditingController(text: widget.time);
273+
_focusNode.addListener(() {
274+
if (mounted) {
275+
widget.onEditingComplete(_controller.text);
276+
}
277+
});
278+
super.initState();
279+
}
246280

247281
@override
248282
Widget build(BuildContext context) {
@@ -251,15 +285,25 @@ class _TimeTextField extends StatelessWidget {
251285
padding: kMargin,
252286
child: RoundedInputField(
253287
height: 40,
288+
focusNode: _focusNode,
289+
controller: _controller,
254290
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
255291
normalBorderColor: theme.shader4,
256292
errorBorderColor: theme.red,
257293
cursorColor: theme.main1,
258-
errorText: context.read<DateCalBloc>().state.inputTimeError.fold(() => "", (error) => error.toString()),
259-
onEditingComplete: (value) => context.read<DateCalBloc>().add(DateCalEvent.setTime(value)),
294+
errorText: widget.errorText,
295+
onEditingComplete: (value) {
296+
widget.onEditingComplete(value);
297+
},
260298
),
261299
);
262300
}
301+
302+
@override
303+
void dispose() {
304+
_focusNode.dispose();
305+
super.dispose();
306+
}
263307
}
264308

265309
class _DateTypeOptionButton extends StatelessWidget {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class _DateCellState extends State<DateCell> {
7878
calendar.show(
7979
context,
8080
cellContext: bloc.cellContext.clone(),
81-
onSelected: (day) => bloc.add(DateCellEvent.selectDay(day)),
81+
onSelected: (data) => bloc.add(DateCellEvent.selectDate(data)),
8282
);
8383
}
8484

0 commit comments

Comments
 (0)