feat(todo): reminders at a time of their own planned and set in a task's sheet, durations in its date sheet

planReminders plans each reminder at a time of its own of an open task,
whatever its date, under an ID of its own; the notification says
"Reminder" for a task without a time. The task's sheet always has its
reminders' row: those before its time where it has one, those at a time
of their own each with its remove button and "Remind at a time" (a day,
then a time), the permission asked as a first one is chosen. The date
sheet sets a duration once there is a time (none, 15 minutes to 4
hours, as Todoist's), a time cleared taking it with it. Recorded as
ADR 0033, D18 (the developer's, 3 Nov 2026).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-03 13:56:19 +01:00
commit f5b657dfad
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 603 additions and 70 deletions

View file

@ -124,6 +124,15 @@
"remindersChannel": "Erinnerungen an Aufgaben",
"remindersNotAllowed": "Benachrichtigungen sind für Halkyon Todo aus: Erinnerungen erscheinen, sobald du sie in den Systemeinstellungen erlaubst.",
"remindersOnThisDevice": "Erinnerungen kommen auf jedem deiner Geräte, das deine Aufgaben öffnet.",
"reminderBody": "Erinnerung",
"remindersAtTimes": "Zu einer eigenen Uhrzeit",
"reminderAddTime": "Zu einer Uhrzeit erinnern",
"reminderRemove": "Erinnerung entfernen",
"durationTitle": "Dauer",
"durationNone": "Keine Dauer",
"durationHours": "{hours} Std.",
"durationMinutes": "{minutes} Min.",
"durationHoursMinutes": "{hours} Std. {minutes} Min.",
"weekPrevious": "Vorige Woche",
"weekNext": "Folgende Woche",
"searchTitle": "Suchen",

View file

@ -343,6 +343,39 @@
"remindersChannel": "Task reminders",
"remindersNotAllowed": "Notifications are off for Halkyon Todo: reminders show once you allow them in the system's settings.",
"remindersOnThisDevice": "Reminders come on each of your devices that opens your tasks.",
"reminderBody": "Reminder",
"remindersAtTimes": "At a time of their own",
"reminderAddTime": "Remind at a time",
"reminderRemove": "Remove the reminder",
"durationTitle": "Duration",
"durationNone": "No duration",
"durationHours": "{hours} h",
"@durationHours": {
"placeholders": {
"hours": {
"type": "int"
}
}
},
"durationMinutes": "{minutes} min",
"@durationMinutes": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"durationHoursMinutes": "{hours} h {minutes} min",
"@durationHoursMinutes": {
"placeholders": {
"hours": {
"type": "int"
},
"minutes": {
"type": "int"
}
}
},
"weekPrevious": "Previous week",
"weekNext": "Following week",
"searchTitle": "Search",

View file

@ -844,6 +844,60 @@ abstract class AppLocalizations {
/// **'Reminders come on each of your devices that opens your tasks.'**
String get remindersOnThisDevice;
/// No description provided for @reminderBody.
///
/// In en, this message translates to:
/// **'Reminder'**
String get reminderBody;
/// No description provided for @remindersAtTimes.
///
/// In en, this message translates to:
/// **'At a time of their own'**
String get remindersAtTimes;
/// No description provided for @reminderAddTime.
///
/// In en, this message translates to:
/// **'Remind at a time'**
String get reminderAddTime;
/// No description provided for @reminderRemove.
///
/// In en, this message translates to:
/// **'Remove the reminder'**
String get reminderRemove;
/// No description provided for @durationTitle.
///
/// In en, this message translates to:
/// **'Duration'**
String get durationTitle;
/// No description provided for @durationNone.
///
/// In en, this message translates to:
/// **'No duration'**
String get durationNone;
/// No description provided for @durationHours.
///
/// In en, this message translates to:
/// **'{hours} h'**
String durationHours(int hours);
/// No description provided for @durationMinutes.
///
/// In en, this message translates to:
/// **'{minutes} min'**
String durationMinutes(int minutes);
/// No description provided for @durationHoursMinutes.
///
/// In en, this message translates to:
/// **'{hours} h {minutes} min'**
String durationHoursMinutes(int hours, int minutes);
/// No description provided for @weekPrevious.
///
/// In en, this message translates to:

View file

@ -527,6 +527,39 @@ class AppLocalizationsDe extends AppLocalizations {
String get remindersOnThisDevice =>
'Erinnerungen kommen auf jedem deiner Geräte, das deine Aufgaben öffnet.';
@override
String get reminderBody => 'Erinnerung';
@override
String get remindersAtTimes => 'Zu einer eigenen Uhrzeit';
@override
String get reminderAddTime => 'Zu einer Uhrzeit erinnern';
@override
String get reminderRemove => 'Erinnerung entfernen';
@override
String get durationTitle => 'Dauer';
@override
String get durationNone => 'Keine Dauer';
@override
String durationHours(int hours) {
return '$hours Std.';
}
@override
String durationMinutes(int minutes) {
return '$minutes Min.';
}
@override
String durationHoursMinutes(int hours, int minutes) {
return '$hours Std. $minutes Min.';
}
@override
String get weekPrevious => 'Vorige Woche';

View file

@ -527,6 +527,39 @@ class AppLocalizationsEn extends AppLocalizations {
String get remindersOnThisDevice =>
'Reminders come on each of your devices that opens your tasks.';
@override
String get reminderBody => 'Reminder';
@override
String get remindersAtTimes => 'At a time of their own';
@override
String get reminderAddTime => 'Remind at a time';
@override
String get reminderRemove => 'Remove the reminder';
@override
String get durationTitle => 'Duration';
@override
String get durationNone => 'No duration';
@override
String durationHours(int hours) {
return '$hours h';
}
@override
String durationMinutes(int minutes) {
return '$minutes min';
}
@override
String durationHoursMinutes(int hours, int minutes) {
return '$hours h $minutes min';
}
@override
String get weekPrevious => 'Previous week';