feat(todo): a project's editor as Todoist's Add project, with sub-projects and favourites

Adding or editing a project was a dialog of a name and a colour. It is
now a screen of its own on a phone (a dialog where sheets are dialogs),
as Todoist's Add project: the name counted to 120, a description, the
colour, the parent project, a Favourite switch and the layout, Display's
pictures. All of it lives in the project's sealed payload, the schema
still 1, no server model or migration; the payload now keeps fields it
doesn't know, as a task's does.

A new project starts with the layout picked, and Display's Reset all
returns to that default rather than to List. Browse lists sub-projects
indented and folding under their parents, and the favourites in a group
above; a project is never offered as its own ancestor, and a parent's
deletion takes its sub-projects, naming them first, as Todoist's. ADR
0033, D28.

Whats-New: Add project and Edit project are a screen of their own, with a description, a parent project, Favourite and the layout.
Whats-New: Browse lists sub-projects under their parents and your favourite projects at the top.
Whats-New: Reset all in Display returns to the layout the project was made with.
Whats-New-De: „Projekt hinzufügen“ und „Projekt bearbeiten“ sind eine eigene Seite, mit Beschreibung, übergeordnetem Projekt, Favorit und Layout.
Whats-New-De: „Übersicht“ zeigt Unterprojekte unter ihren Projekten und deine Favoriten oben.
Whats-New-De: „Alles zurücksetzen“ in der Anzeige kehrt zum Layout zurück, mit dem das Projekt angelegt wurde.

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-04 20:56:34 +01:00
commit d0e72cf095
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
6 changed files with 1094 additions and 93 deletions

View file

@ -51,11 +51,18 @@
"priority4": "Keine Priorität",
"projectsTitle": "Projekte",
"projectsNone": "Noch keine eigenen Projekte.",
"projectAdd": "Neues Projekt",
"projectAdd": "Projekt hinzufügen",
"projectEdit": "Projekt bearbeiten",
"projectDelete": "Projekt löschen",
"projectDeleteTitle": "Projekt löschen?",
"projectDeleteMessage": "„{name}“ wird mit seinen Abschnitten und Aufgaben auf all deinen Geräten gelöscht.",
"projectParent": "Übergeordnetes Projekt",
"projectNoParent": "Kein übergeordnetes Projekt",
"projectFavorite": "Favorit",
"favoritesTitle": "Favoriten",
"projectSubProjectsHide": "Unterprojekte ausblenden",
"projectSubProjectsShow": "Unterprojekte einblenden",
"projectDeleteWithSubProjects": "„{name}“ wird mit seinen Unterprojekten {subProjects} und ihren Abschnitten und Aufgaben auf all deinen Geräten gelöscht.",
"projectEmptyTitle": "Hier ist nichts zu tun",
"projectEmptyHint": "Füge mit dem Plus eine Aufgabe hinzu.",
"projectGone": "Dieses Projekt wurde gelöscht.",

View file

@ -106,7 +106,7 @@
"priority4": "No priority",
"projectsTitle": "Projects",
"projectsNone": "No projects of your own yet.",
"projectAdd": "New project",
"projectAdd": "Add project",
"projectEdit": "Edit project",
"projectDelete": "Delete project",
"projectDeleteTitle": "Delete the project?",
@ -118,6 +118,27 @@
}
}
},
"projectParent": "Parent project",
"@projectParent": {
"description": "A project's editor (ADR 0033, D28), as Todoist's Add project."
},
"projectNoParent": "No parent",
"projectFavorite": "Favourite",
"favoritesTitle": "Favourites",
"projectSubProjectsHide": "Hide sub-projects",
"projectSubProjectsShow": "Show sub-projects",
"projectDeleteWithSubProjects": "\"{name}\" is deleted with its sub-projects {subProjects}, and their sections and tasks, on all your devices.",
"@projectDeleteWithSubProjects": {
"description": "Deleting a project with sub-projects (ADR 0033, D28): subProjects their names, separated by commas.",
"placeholders": {
"name": {
"type": "String"
},
"subProjects": {
"type": "String"
}
}
},
"projectEmptyTitle": "Nothing to do here",
"projectEmptyHint": "Add a task with the + button.",
"projectGone": "This project was deleted.",

View file

@ -1,3 +1,5 @@
{
"@@locale": "en_US"
"@@locale": "en_US",
"projectFavorite": "Favorite",
"favoritesTitle": "Favorites"
}

View file

@ -409,7 +409,7 @@ abstract class AppLocalizations {
/// No description provided for @projectAdd.
///
/// In en, this message translates to:
/// **'New project'**
/// **'Add project'**
String get projectAdd;
/// No description provided for @projectEdit.
@ -436,6 +436,48 @@ abstract class AppLocalizations {
/// **'\"{name}\" is deleted with its sections and tasks, on all your devices.'**
String projectDeleteMessage(String name);
/// A project's editor (ADR 0033, D28), as Todoist's Add project.
///
/// In en, this message translates to:
/// **'Parent project'**
String get projectParent;
/// No description provided for @projectNoParent.
///
/// In en, this message translates to:
/// **'No parent'**
String get projectNoParent;
/// No description provided for @projectFavorite.
///
/// In en, this message translates to:
/// **'Favourite'**
String get projectFavorite;
/// No description provided for @favoritesTitle.
///
/// In en, this message translates to:
/// **'Favourites'**
String get favoritesTitle;
/// No description provided for @projectSubProjectsHide.
///
/// In en, this message translates to:
/// **'Hide sub-projects'**
String get projectSubProjectsHide;
/// No description provided for @projectSubProjectsShow.
///
/// In en, this message translates to:
/// **'Show sub-projects'**
String get projectSubProjectsShow;
/// Deleting a project with sub-projects (ADR 0033, D28): subProjects their names, separated by commas.
///
/// In en, this message translates to:
/// **'\"{name}\" is deleted with its sub-projects {subProjects}, and their sections and tasks, on all your devices.'**
String projectDeleteWithSubProjects(String name, String subProjects);
/// No description provided for @projectEmptyTitle.
///
/// In en, this message translates to:

View file

@ -191,7 +191,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get projectsNone => 'Noch keine eigenen Projekte.';
@override
String get projectAdd => 'Neues Projekt';
String get projectAdd => 'Projekt hinzufügen';
@override
String get projectEdit => 'Projekt bearbeiten';
@ -207,6 +207,29 @@ class AppLocalizationsDe extends AppLocalizations {
return '„$name“ wird mit seinen Abschnitten und Aufgaben auf all deinen Geräten gelöscht.';
}
@override
String get projectParent => 'Übergeordnetes Projekt';
@override
String get projectNoParent => 'Kein übergeordnetes Projekt';
@override
String get projectFavorite => 'Favorit';
@override
String get favoritesTitle => 'Favoriten';
@override
String get projectSubProjectsHide => 'Unterprojekte ausblenden';
@override
String get projectSubProjectsShow => 'Unterprojekte einblenden';
@override
String projectDeleteWithSubProjects(String name, String subProjects) {
return '„$name“ wird mit seinen Unterprojekten $subProjects und ihren Abschnitten und Aufgaben auf all deinen Geräten gelöscht.';
}
@override
String get projectEmptyTitle => 'Hier ist nichts zu tun';

View file

@ -191,7 +191,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get projectsNone => 'No projects of your own yet.';
@override
String get projectAdd => 'New project';
String get projectAdd => 'Add project';
@override
String get projectEdit => 'Edit project';
@ -207,6 +207,29 @@ class AppLocalizationsEn extends AppLocalizations {
return '\"$name\" is deleted with its sections and tasks, on all your devices.';
}
@override
String get projectParent => 'Parent project';
@override
String get projectNoParent => 'No parent';
@override
String get projectFavorite => 'Favourite';
@override
String get favoritesTitle => 'Favourites';
@override
String get projectSubProjectsHide => 'Hide sub-projects';
@override
String get projectSubProjectsShow => 'Show sub-projects';
@override
String projectDeleteWithSubProjects(String name, String subProjects) {
return '\"$name\" is deleted with its sub-projects $subProjects, and their sections and tasks, on all your devices.';
}
@override
String get projectEmptyTitle => 'Nothing to do here';
@ -995,4 +1018,10 @@ class AppLocalizationsEnGb extends AppLocalizationsEn {
/// The translations for English, as used in the United States (`en_US`).
class AppLocalizationsEnUs extends AppLocalizationsEn {
AppLocalizationsEnUs() : super('en_US');
@override
String get projectFavorite => 'Favorite';
@override
String get favoritesTitle => 'Favorites';
}