defined & added repeat-patterns.
This commit is contained in:
97
lib/types/repeat.dart
Normal file
97
lib/types/repeat.dart
Normal file
@ -0,0 +1,97 @@
|
||||
class RepeatInterval {
|
||||
int every;
|
||||
DateInterval interval;
|
||||
|
||||
RepeatInterval({required this.interval, this.every=1});
|
||||
|
||||
static RepeatInterval? fromString(String input) {
|
||||
RegExpMatch? m = RegExp(r'(\d*)(\D+)').firstMatch(input);
|
||||
if (m != null) {
|
||||
DateInterval? di = _stringToInterval(m!.group(2)!);
|
||||
if (di != null) {
|
||||
return RepeatInterval(interval: di, every: m?.group(1) == "" ? 1 : int.parse(m!.group(1)!));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Does the RepeatInterval referencing from a hit b?
|
||||
bool repeatHit(DateTime a, DateTime b) {
|
||||
var daydiff = a.difference(b).inDays;
|
||||
var weeks = (daydiff / 7).floor();
|
||||
switch (interval) {
|
||||
case DateInterval.daily: return daydiff % every == 0;
|
||||
case DateInterval.weekly: return daydiff % (every*7) == 0;
|
||||
case DateInterval.monthly: return a.day == b.day;
|
||||
case DateInterval.monday: return weeks % every == 0 && b.weekday == DateTime.monday;
|
||||
case DateInterval.tuesday: return weeks % every == 0 && b.weekday == DateTime.tuesday;
|
||||
case DateInterval.wednesday: return weeks % every == 0 && b.weekday == DateTime.wednesday;
|
||||
case DateInterval.thursday: return weeks % every == 0 && b.weekday == DateTime.thursday;
|
||||
case DateInterval.friday: return weeks % every == 0 && b.weekday == DateTime.friday;
|
||||
case DateInterval.saturday: return weeks % every == 0 && b.weekday == DateTime.saturday;
|
||||
case DateInterval.sunday: return weeks % every == 0 && b.weekday == DateTime.sunday;
|
||||
case DateInterval.dayOfMonth: return b.day == every;
|
||||
case DateInterval.dayOfYear: return DateTime.now().difference(b).inDays == every;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
toString() {
|
||||
return "$every${_intervalToString(interval)}";
|
||||
}
|
||||
|
||||
static DateInterval? _stringToInterval(String input) {
|
||||
switch (input) {
|
||||
case "daily":
|
||||
case "day": return DateInterval.daily;
|
||||
case "weekly":
|
||||
case "week": return DateInterval.weekly;
|
||||
case "monthly":
|
||||
case "month": return DateInterval.monthly;
|
||||
case "mon": return DateInterval.monday;
|
||||
case "tue": return DateInterval.tuesday;
|
||||
case "wed": return DateInterval.wednesday;
|
||||
case "thu": return DateInterval.thursday;
|
||||
case "fri": return DateInterval.friday;
|
||||
case "sat": return DateInterval.saturday;
|
||||
case "sun": return DateInterval.sunday;
|
||||
case "ofMonth": return DateInterval.dayOfMonth;
|
||||
case "ofYear": return DateInterval.dayOfYear;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static String _intervalToString(DateInterval di) {
|
||||
switch (di) {
|
||||
case DateInterval.daily: return "day";
|
||||
case DateInterval.weekly: return "week";
|
||||
case DateInterval.monthly: return "month";
|
||||
case DateInterval.monday: return "mon";
|
||||
case DateInterval.tuesday: return "tue";
|
||||
case DateInterval.wednesday: return "wed";
|
||||
case DateInterval.thursday: return "thu";
|
||||
case DateInterval.friday: return "fri";
|
||||
case DateInterval.saturday: return "sat";
|
||||
case DateInterval.sunday: return "sun";
|
||||
case DateInterval.dayOfMonth: return "ofMonth";
|
||||
case DateInterval.dayOfYear: return "ofYear";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
enum DateInterval {
|
||||
daily,
|
||||
weekly,
|
||||
monthly,
|
||||
monday,
|
||||
tuesday,
|
||||
wednesday,
|
||||
thursday,
|
||||
friday,
|
||||
saturday,
|
||||
sunday,
|
||||
dayOfMonth,
|
||||
dayOfYear,
|
||||
}
|
||||
|
@ -1,3 +1,45 @@
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:nextcloud_reminder/types/repeat.dart';
|
||||
|
||||
class TaskExtra extends Task {
|
||||
TaskExtra({required super.title,
|
||||
super.done = false,
|
||||
super.contexts = const [],
|
||||
super.projects = const [],
|
||||
super.meta = const {},
|
||||
super.priority,
|
||||
super.begin,
|
||||
super.end,
|
||||
this.lineNumber,
|
||||
this.repeat = const [],
|
||||
});
|
||||
|
||||
TaskExtra.fromTask(Task t, {this.lineNumber})
|
||||
: repeat = t.meta["repeat"]?.split("/").map(RepeatInterval.fromString).whereNotNull().toList() ?? []
|
||||
, super(title: t.title,
|
||||
done: t.done,
|
||||
contexts: t.contexts,
|
||||
projects: t.projects,
|
||||
meta: t.meta,
|
||||
priority: t.priority,
|
||||
begin: t.begin,
|
||||
end: t.end,
|
||||
);
|
||||
|
||||
final int? lineNumber;
|
||||
final List<RepeatInterval> repeat;
|
||||
|
||||
formatAsTask() {
|
||||
return super.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return "$lineNumber: ${super.toString()}";
|
||||
}
|
||||
}
|
||||
|
||||
class Task {
|
||||
final bool done;
|
||||
final DateTime? begin;
|
||||
|
Reference in New Issue
Block a user