1
1
import 'dart:typed_data' ;
2
2
3
+ import 'package:appflowy/generated/locale_keys.g.dart' ;
3
4
import 'package:appflowy/plugins/database/application/field/field_info.dart' ;
4
5
import 'package:appflowy/plugins/database/grid/application/filter/select_option_loader.dart' ;
5
6
import 'package:appflowy/plugins/database/grid/presentation/widgets/filter/choicechip/checkbox.dart' ;
@@ -10,6 +11,7 @@ import 'package:appflowy/plugins/database/grid/presentation/widgets/filter/choic
10
11
import 'package:appflowy/plugins/database/grid/presentation/widgets/filter/choicechip/text.dart' ;
11
12
import 'package:appflowy/util/int64_extension.dart' ;
12
13
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart' ;
14
+ import 'package:easy_localization/easy_localization.dart' ;
13
15
import 'package:fixnum/fixnum.dart' ;
14
16
15
17
abstract class DatabaseFilter {
@@ -319,6 +321,67 @@ final class SelectOptionFilter extends DatabaseFilter {
319
321
}
320
322
}
321
323
324
+ enum DateTimeFilterCondition {
325
+ on ,
326
+ before,
327
+ after,
328
+ onOrBefore,
329
+ onOrAfter,
330
+ between,
331
+ isEmpty,
332
+ isNotEmpty;
333
+
334
+ DateFilterConditionPB toPB (bool isStart) {
335
+ return isStart
336
+ ? switch (this ) {
337
+ on => DateFilterConditionPB .DateStartsOn ,
338
+ before => DateFilterConditionPB .DateStartsBefore ,
339
+ after => DateFilterConditionPB .DateStartsAfter ,
340
+ onOrBefore => DateFilterConditionPB .DateStartsOnOrBefore ,
341
+ onOrAfter => DateFilterConditionPB .DateStartsOnOrAfter ,
342
+ between => DateFilterConditionPB .DateStartsBetween ,
343
+ isEmpty => DateFilterConditionPB .DateStartIsEmpty ,
344
+ isNotEmpty => DateFilterConditionPB .DateStartIsNotEmpty ,
345
+ }
346
+ : switch (this ) {
347
+ on => DateFilterConditionPB .DateEndsOn ,
348
+ before => DateFilterConditionPB .DateEndsBefore ,
349
+ after => DateFilterConditionPB .DateEndsAfter ,
350
+ onOrBefore => DateFilterConditionPB .DateEndsOnOrBefore ,
351
+ onOrAfter => DateFilterConditionPB .DateEndsOnOrAfter ,
352
+ between => DateFilterConditionPB .DateEndsBetween ,
353
+ isEmpty => DateFilterConditionPB .DateEndIsEmpty ,
354
+ isNotEmpty => DateFilterConditionPB .DateEndIsNotEmpty ,
355
+ };
356
+ }
357
+
358
+ String get choiceChipPrefix {
359
+ return switch (this ) {
360
+ on => "" ,
361
+ before => LocaleKeys .grid_dateFilter_choicechipPrefix_before.tr (),
362
+ after => LocaleKeys .grid_dateFilter_choicechipPrefix_after.tr (),
363
+ onOrBefore => LocaleKeys .grid_dateFilter_choicechipPrefix_onOrBefore.tr (),
364
+ onOrAfter => LocaleKeys .grid_dateFilter_choicechipPrefix_onOrAfter.tr (),
365
+ between => LocaleKeys .grid_dateFilter_choicechipPrefix_between.tr (),
366
+ isEmpty => LocaleKeys .grid_dateFilter_choicechipPrefix_isEmpty.tr (),
367
+ isNotEmpty => LocaleKeys .grid_dateFilter_choicechipPrefix_isNotEmpty.tr (),
368
+ };
369
+ }
370
+
371
+ String get filterName {
372
+ return switch (this ) {
373
+ on => LocaleKeys .grid_dateFilter_is.tr (),
374
+ before => LocaleKeys .grid_dateFilter_before.tr (),
375
+ after => LocaleKeys .grid_dateFilter_after.tr (),
376
+ onOrBefore => LocaleKeys .grid_dateFilter_onOrBefore.tr (),
377
+ onOrAfter => LocaleKeys .grid_dateFilter_onOrAfter.tr (),
378
+ between => LocaleKeys .grid_dateFilter_between.tr (),
379
+ isEmpty => LocaleKeys .grid_dateFilter_empty.tr (),
380
+ isNotEmpty => LocaleKeys .grid_dateFilter_notEmpty.tr (),
381
+ };
382
+ }
383
+ }
384
+
322
385
final class DateTimeFilter extends DatabaseFilter {
323
386
const DateTimeFilter ({
324
387
required super .filterId,
@@ -341,12 +404,19 @@ final class DateTimeFilter extends DatabaseFilter {
341
404
@override
342
405
String getDescription (FieldInfo field) {
343
406
return switch (condition) {
344
- DateFilterConditionPB .DateIsEmpty ||
345
- DateFilterConditionPB .DateIsNotEmpty =>
346
- condition.filterName,
347
- DateFilterConditionPB .DateWithIn =>
348
- "${condition .filterName } ${start ?.defaultFormat ?? "" } - ${end ?.defaultFormat ?? "" }" ,
349
- _ => "${condition .filterName } ${timestamp ?.defaultFormat ?? "" }"
407
+ DateFilterConditionPB .DateStartIsEmpty ||
408
+ DateFilterConditionPB .DateStartIsNotEmpty ||
409
+ DateFilterConditionPB .DateEndIsEmpty ||
410
+ DateFilterConditionPB .DateEndIsNotEmpty =>
411
+ condition.toCondition ().choiceChipPrefix,
412
+ DateFilterConditionPB .DateStartsOn ||
413
+ DateFilterConditionPB .DateEndsOn =>
414
+ timestamp? .defaultFormat ?? "" ,
415
+ DateFilterConditionPB .DateStartsBetween ||
416
+ DateFilterConditionPB .DateEndsBetween =>
417
+ "${condition .toCondition ().choiceChipPrefix } ${start ?.defaultFormat ?? "" } - ${end ?.defaultFormat ?? "" }" ,
418
+ _ =>
419
+ "${condition .toCondition ().choiceChipPrefix } ${timestamp ?.defaultFormat ?? "" }"
350
420
};
351
421
}
352
422
@@ -359,41 +429,62 @@ final class DateTimeFilter extends DatabaseFilter {
359
429
}
360
430
361
431
switch (condition) {
362
- case DateFilterConditionPB .DateIs :
363
- case DateFilterConditionPB .DateBefore :
364
- case DateFilterConditionPB .DateOnOrBefore :
365
- case DateFilterConditionPB .DateAfter :
366
- case DateFilterConditionPB .DateOnOrAfter :
432
+ case DateFilterConditionPB .DateStartsOn :
433
+ case DateFilterConditionPB .DateStartsBefore :
434
+ case DateFilterConditionPB .DateStartsOnOrBefore :
435
+ case DateFilterConditionPB .DateStartsAfter :
436
+ case DateFilterConditionPB .DateStartsOnOrAfter :
437
+ case DateFilterConditionPB .DateEndsOn :
438
+ case DateFilterConditionPB .DateEndsBefore :
439
+ case DateFilterConditionPB .DateEndsOnOrBefore :
440
+ case DateFilterConditionPB .DateEndsAfter :
441
+ case DateFilterConditionPB .DateEndsOnOrAfter :
367
442
if (timestamp != null ) {
368
443
filterPB.timestamp = dateTimeToInt (timestamp! );
369
444
}
370
445
break ;
371
- case DateFilterConditionPB .DateWithIn :
446
+ case DateFilterConditionPB .DateStartsBetween :
447
+ case DateFilterConditionPB .DateEndsBetween :
372
448
if (start != null ) {
373
449
filterPB.start = dateTimeToInt (start! );
374
450
}
375
451
if (end != null ) {
376
452
filterPB.end = dateTimeToInt (end! );
377
453
}
454
+ break ;
378
455
default :
379
456
break ;
380
457
}
381
458
382
459
return filterPB.writeToBuffer ();
383
460
}
384
461
385
- DateTimeFilter copyWith ({
386
- DateFilterConditionPB ? condition ,
387
- DateTime ? timestamp ,
462
+ DateTimeFilter copyWithCondition ({
463
+ required bool isStart ,
464
+ required DateTimeFilterCondition condition ,
388
465
}) {
389
466
return DateTimeFilter (
390
467
filterId: filterId,
391
468
fieldId: fieldId,
392
469
fieldType: fieldType,
470
+ condition: condition.toPB (isStart),
393
471
start: start,
394
472
end: end,
395
- condition: condition ?? this .condition,
396
- timestamp: timestamp ?? this .timestamp,
473
+ timestamp: timestamp,
474
+ );
475
+ }
476
+
477
+ DateTimeFilter copyWithTimestamp ({
478
+ required DateTime timestamp,
479
+ }) {
480
+ return DateTimeFilter (
481
+ filterId: filterId,
482
+ fieldId: fieldId,
483
+ fieldType: fieldType,
484
+ condition: condition,
485
+ start: start,
486
+ end: end,
487
+ timestamp: timestamp,
397
488
);
398
489
}
399
490
0 commit comments