feat(todo): comments in boxes of their own, with reactions (ADR 0033, D36)

As Todoist's, after the developer's test: a task's sheet shows how many
comments it has, the latest on one line and Show all, with Add a comment
docked at its foot; comments open on a sheet of their own, each in its
box, the latest in view and the field staying at the foot. Reactions are
kept in the comment's sealed payload, each emoji once, picked from
emoji_picker_flutter, whose recents stay on the device.

Whats-New: Comments have a sheet of their own, each in its box, and take reactions; a task shows only the latest.
Whats-New-De: Kommentare haben ein eigenes Blatt, jeder in seinem Kasten, und nehmen Reaktionen an; eine Aufgabe zeigt nur den neuesten.

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-06 21:12:36 +01:00
commit 4875b26174
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 533 additions and 111 deletions

View file

@ -55,6 +55,10 @@
"filterMatches": "{count, plural, =1{1 Aufgabe passt} other{{count} Aufgaben passen}}",
"filterNotRead": "Nicht verstanden bei „{near}“",
"filterNotReadEnd": "Die Abfrage endet zu früh",
"commentShowAll": "Alle anzeigen",
"commentReact": "Reaktion hinzufügen",
"commentReactionRemove": "{emoji} entfernen",
"commentNone": "Halte hier Notizen, Links oder anderes fest.",
"commentsTitle": "Kommentare",
"commentAdd": "Kommentar schreiben",
"commentSend": "Kommentar senden",

View file

@ -115,6 +115,17 @@
"@filterNotReadEnd": {
"description": "The filter editor when its query stops before it is complete."
},
"commentShowAll": "Show all",
"commentReact": "Add a reaction",
"commentReactionRemove": "Remove {emoji}",
"commentNone": "Add relevant notes, links or anything else here.",
"@commentReactionRemove": {
"placeholders": {
"emoji": {
"type": "String"
}
}
},
"commentsTitle": "Comments",
"commentAdd": "Add a comment",
"commentSend": "Send comment",

View file

@ -430,6 +430,30 @@ abstract class AppLocalizations {
/// **'This query ends too soon'**
String get filterNotReadEnd;
/// No description provided for @commentShowAll.
///
/// In en, this message translates to:
/// **'Show all'**
String get commentShowAll;
/// No description provided for @commentReact.
///
/// In en, this message translates to:
/// **'Add a reaction'**
String get commentReact;
/// No description provided for @commentReactionRemove.
///
/// In en, this message translates to:
/// **'Remove {emoji}'**
String commentReactionRemove(String emoji);
/// No description provided for @commentNone.
///
/// In en, this message translates to:
/// **'Add relevant notes, links or anything else here.'**
String get commentNone;
/// No description provided for @commentsTitle.
///
/// In en, this message translates to:

View file

@ -203,6 +203,20 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get filterNotReadEnd => 'Die Abfrage endet zu früh';
@override
String get commentShowAll => 'Alle anzeigen';
@override
String get commentReact => 'Reaktion hinzufügen';
@override
String commentReactionRemove(String emoji) {
return '$emoji entfernen';
}
@override
String get commentNone => 'Halte hier Notizen, Links oder anderes fest.';
@override
String get commentsTitle => 'Kommentare';

View file

@ -203,6 +203,20 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get filterNotReadEnd => 'This query ends too soon';
@override
String get commentShowAll => 'Show all';
@override
String get commentReact => 'Add a reaction';
@override
String commentReactionRemove(String emoji) {
return 'Remove $emoji';
}
@override
String get commentNone => 'Add relevant notes, links or anything else here.';
@override
String get commentsTitle => 'Comments';