Improve project-task integration and sub-task support

- TasksApi: add getSubTasks(parentId) + parentId param to create()
- TasksRepository: expose new API methods
- app.dart: invalidate projectsProvider + projectMilestonesProvider
  after quick capture creates a task; taskNew route reads ?projectId=
  query param and passes as initialProjectId to TaskEditScreen
- project_list_screen.dart: _AddTaskRow passes projectId query param
  so the task editor pre-fills the project on navigation
- task_edit_screen.dart: fully rewritten with initialProjectId support,
  sub-task fetching/creation, and _SubTasksSection widget

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-02 21:59:58 -05:00
parent 868cb0e49e
commit 3c3055d536
5 changed files with 261 additions and 74 deletions
+11 -1
View File
@@ -7,7 +7,9 @@ import 'core/exceptions.dart';
import 'providers/api_client_provider.dart';
import 'providers/auth_provider.dart';
import 'providers/capture_queue_provider.dart';
import 'providers/milestones_provider.dart';
import 'providers/notes_provider.dart';
import 'providers/projects_provider.dart';
import 'providers/settings_provider.dart';
import 'providers/update_provider.dart';
import 'providers/tasks_provider.dart';
@@ -94,7 +96,11 @@ final routerProvider = Provider<GoRouter>((ref) {
),
GoRoute(
path: Routes.taskNew,
builder: (_, _) => const TaskEditScreen(),
builder: (_, state) => TaskEditScreen(
initialProjectId: state.uri.queryParameters['projectId'] != null
? int.tryParse(state.uri.queryParameters['projectId']!)
: null,
),
),
GoRoute(
path: Routes.taskEdit,
@@ -347,6 +353,8 @@ class _QuickCaptureBarState extends ConsumerState<_QuickCaptureBar> {
case 'task':
case 'todo':
ref.invalidate(tasksProvider);
ref.invalidate(projectsProvider);
ref.invalidate(projectMilestonesProvider);
}
final msg = result.message.isNotEmpty
@@ -398,6 +406,8 @@ class _QuickCaptureBarState extends ConsumerState<_QuickCaptureBar> {
case 'task':
case 'todo':
ref.invalidate(tasksProvider);
ref.invalidate(projectsProvider);
ref.invalidate(projectMilestonesProvider);
}
} on NetworkException {
break; // Still offline — stop draining.