feat(02-03): create task providers, form screen with frequency and effort selectors

- TaskActions AsyncNotifier for create, update, delete, complete task mutations
- tasksInRoomProvider manual StreamProvider.family wrapping TasksDao.watchTasksInRoom
- TaskFormScreen with name, frequency (10 presets + custom), effort (3-way segmented),
  description, and initial due date picker (German DD.MM.YYYY format)
- Custom frequency: number + unit picker (Tage/Wochen/Monate)
- Calendar-anchored intervals auto-set anchorDay from due date
- Edit mode loads existing task and pre-fills all fields
- 19 new German localization keys for task form, delete, and empty state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 22:07:53 +01:00
parent 519a56bef7
commit 652ff0123f
7 changed files with 756 additions and 8 deletions

View File

@@ -39,5 +39,25 @@
"count": { "type": "int" }
}
},
"cancel": "Abbrechen"
"cancel": "Abbrechen",
"taskFormCreateTitle": "Aufgabe erstellen",
"taskFormEditTitle": "Aufgabe bearbeiten",
"taskFormNameLabel": "Aufgabenname",
"taskFormNameHint": "z.B. Staubsaugen, Fenster putzen...",
"taskFormNameRequired": "Bitte einen Namen eingeben",
"taskFormFrequencyLabel": "Wiederholung",
"taskFormFrequencyCustom": "Benutzerdefiniert",
"taskFormFrequencyEvery": "Alle",
"taskFormFrequencyUnitDays": "Tage",
"taskFormFrequencyUnitWeeks": "Wochen",
"taskFormFrequencyUnitMonths": "Monate",
"taskFormEffortLabel": "Aufwand",
"taskFormDescriptionLabel": "Beschreibung (optional)",
"taskFormDueDateLabel": "Erstes F\u00e4lligkeitsdatum",
"taskDeleteConfirmTitle": "Aufgabe l\u00f6schen?",
"taskDeleteConfirmMessage": "Die Aufgabe wird unwiderruflich gel\u00f6scht.",
"taskDeleteConfirmAction": "L\u00f6schen",
"taskEmptyTitle": "Noch keine Aufgaben",
"taskEmptyMessage": "Erstelle die erste Aufgabe f\u00fcr diesen Raum.",
"taskEmptyAction": "Aufgabe erstellen"
}

View File

@@ -273,6 +273,126 @@ abstract class AppLocalizations {
/// In de, this message translates to:
/// **'Abbrechen'**
String get cancel;
/// No description provided for @taskFormCreateTitle.
///
/// In de, this message translates to:
/// **'Aufgabe erstellen'**
String get taskFormCreateTitle;
/// No description provided for @taskFormEditTitle.
///
/// In de, this message translates to:
/// **'Aufgabe bearbeiten'**
String get taskFormEditTitle;
/// No description provided for @taskFormNameLabel.
///
/// In de, this message translates to:
/// **'Aufgabenname'**
String get taskFormNameLabel;
/// No description provided for @taskFormNameHint.
///
/// In de, this message translates to:
/// **'z.B. Staubsaugen, Fenster putzen...'**
String get taskFormNameHint;
/// No description provided for @taskFormNameRequired.
///
/// In de, this message translates to:
/// **'Bitte einen Namen eingeben'**
String get taskFormNameRequired;
/// No description provided for @taskFormFrequencyLabel.
///
/// In de, this message translates to:
/// **'Wiederholung'**
String get taskFormFrequencyLabel;
/// No description provided for @taskFormFrequencyCustom.
///
/// In de, this message translates to:
/// **'Benutzerdefiniert'**
String get taskFormFrequencyCustom;
/// No description provided for @taskFormFrequencyEvery.
///
/// In de, this message translates to:
/// **'Alle'**
String get taskFormFrequencyEvery;
/// No description provided for @taskFormFrequencyUnitDays.
///
/// In de, this message translates to:
/// **'Tage'**
String get taskFormFrequencyUnitDays;
/// No description provided for @taskFormFrequencyUnitWeeks.
///
/// In de, this message translates to:
/// **'Wochen'**
String get taskFormFrequencyUnitWeeks;
/// No description provided for @taskFormFrequencyUnitMonths.
///
/// In de, this message translates to:
/// **'Monate'**
String get taskFormFrequencyUnitMonths;
/// No description provided for @taskFormEffortLabel.
///
/// In de, this message translates to:
/// **'Aufwand'**
String get taskFormEffortLabel;
/// No description provided for @taskFormDescriptionLabel.
///
/// In de, this message translates to:
/// **'Beschreibung (optional)'**
String get taskFormDescriptionLabel;
/// No description provided for @taskFormDueDateLabel.
///
/// In de, this message translates to:
/// **'Erstes Fälligkeitsdatum'**
String get taskFormDueDateLabel;
/// No description provided for @taskDeleteConfirmTitle.
///
/// In de, this message translates to:
/// **'Aufgabe löschen?'**
String get taskDeleteConfirmTitle;
/// No description provided for @taskDeleteConfirmMessage.
///
/// In de, this message translates to:
/// **'Die Aufgabe wird unwiderruflich gelöscht.'**
String get taskDeleteConfirmMessage;
/// No description provided for @taskDeleteConfirmAction.
///
/// In de, this message translates to:
/// **'Löschen'**
String get taskDeleteConfirmAction;
/// No description provided for @taskEmptyTitle.
///
/// In de, this message translates to:
/// **'Noch keine Aufgaben'**
String get taskEmptyTitle;
/// No description provided for @taskEmptyMessage.
///
/// In de, this message translates to:
/// **'Erstelle die erste Aufgabe für diesen Raum.'**
String get taskEmptyMessage;
/// No description provided for @taskEmptyAction.
///
/// In de, this message translates to:
/// **'Aufgabe erstellen'**
String get taskEmptyAction;
}
class _AppLocalizationsDelegate

View File

@@ -103,4 +103,65 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get cancel => 'Abbrechen';
@override
String get taskFormCreateTitle => 'Aufgabe erstellen';
@override
String get taskFormEditTitle => 'Aufgabe bearbeiten';
@override
String get taskFormNameLabel => 'Aufgabenname';
@override
String get taskFormNameHint => 'z.B. Staubsaugen, Fenster putzen...';
@override
String get taskFormNameRequired => 'Bitte einen Namen eingeben';
@override
String get taskFormFrequencyLabel => 'Wiederholung';
@override
String get taskFormFrequencyCustom => 'Benutzerdefiniert';
@override
String get taskFormFrequencyEvery => 'Alle';
@override
String get taskFormFrequencyUnitDays => 'Tage';
@override
String get taskFormFrequencyUnitWeeks => 'Wochen';
@override
String get taskFormFrequencyUnitMonths => 'Monate';
@override
String get taskFormEffortLabel => 'Aufwand';
@override
String get taskFormDescriptionLabel => 'Beschreibung (optional)';
@override
String get taskFormDueDateLabel => 'Erstes Fälligkeitsdatum';
@override
String get taskDeleteConfirmTitle => 'Aufgabe löschen?';
@override
String get taskDeleteConfirmMessage =>
'Die Aufgabe wird unwiderruflich gelöscht.';
@override
String get taskDeleteConfirmAction => 'Löschen';
@override
String get taskEmptyTitle => 'Noch keine Aufgaben';
@override
String get taskEmptyMessage => 'Erstelle die erste Aufgabe für diesen Raum.';
@override
String get taskEmptyAction => 'Aufgabe erstellen';
}