Merges 20 commits from Ashley's smolblocks.com instance (main branch), bringing in the full Backlog Board screen (BacklogBoardController, board columns/cards, task detail drawer, summary panel, search/filter/sort/group, Break Up and Someday actions) plus the unified FocusFlowSection navigation model. Reconciled with our own in-flight work: - Replaced our placeholder BacklogPane/createBacklogController wiring with Ashley's real BacklogBoardScreen/BacklogBoardController (same problem, more complete implementation - avoids two competing Backlog UIs). - Adopted the FocusFlowSection-based Sidebar API in place of our bespoke SidebarScreen enum; the Settings nav item now intercepts FocusFlowSection.settings in _selectSection to open our Settings dialog instead of falling through to a placeholder screen. - Gave every sidebar nav item a stable key (not just the active one) so the Settings dialog tests can still target it reliably. - Kept our additive owner-settings read controller, Settings dialog, and timeline Break-up wiring; renamed the Today controller field to todayController throughout to match upstream's now-multi-controller naming. - Fixed a test-only regression: backlog_board_screen_test.dart's standalone SchedulerCommandController construction needed the new `management` param. - Added .gitleaks.toml allowlisting the local, gitignored .claude/settings.local.json path (recorded bash command patterns, not repo secrets) that was blocking commits. Verified via focusflow-flutter-ci:3.44.4 (Flutter 3.44.4/Dart 3.12.2): flutter analyze clean, dart format clean, 106/106 Flutter tests passing, 348/348 scheduler_core + scheduler_persistence_sqlite tests passing. Closes: Circuit-Forge/focus-flow#9
56 lines
2 KiB
Dart
56 lines
2 KiB
Dart
// SPDX-FileCopyrightText: 2026 FocusFlow contributors
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
/// Composes the FocusFlow Flutter application around Focus Flow App.
|
|
library;
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:scheduler_core/scheduler_core.dart';
|
|
|
|
import '../controllers/backlog_board_controller.dart';
|
|
import '../controllers/scheduler_command_controller.dart';
|
|
import '../controllers/scheduler_read_controller.dart';
|
|
import '../controllers/selected_date_controller.dart';
|
|
import '../controllers/today_screen_controller.dart';
|
|
import '../models/navigation/focus_flow_section.dart';
|
|
import '../models/today_screen_models.dart';
|
|
import '../theme/focus_flow_theme.dart';
|
|
import '../theme/focus_flow_tokens.dart';
|
|
import '../widgets/app_shell.dart';
|
|
import '../widgets/backlog/backlog_board_screen.dart';
|
|
import '../widgets/dialogs/settings_dialog.dart';
|
|
import '../widgets/required_banner.dart';
|
|
import '../widgets/sidebar.dart';
|
|
import '../widgets/task_selection_modal.dart';
|
|
import '../widgets/timeline/timeline_view.dart';
|
|
import '../widgets/top_bar.dart';
|
|
import 'scheduler_app_composition.dart';
|
|
|
|
part 'home/focus_flow_home.dart';
|
|
part 'home/focus_flow_home_state.dart';
|
|
part 'home/plan_issue.dart';
|
|
part 'home/today_screen_scaffold.dart';
|
|
part 'home/today_screen_scaffold_state.dart';
|
|
|
|
/// Root Material app for the FocusFlow desktop UI.
|
|
class FocusFlowApp extends StatelessWidget {
|
|
/// Creates a FocusFlow app from an application composition.
|
|
const FocusFlowApp({required this.composition, super.key});
|
|
|
|
/// Factory and controller bundle used by the app tree.
|
|
final SchedulerAppComposition composition;
|
|
|
|
/// Builds the widget subtree for this component.
|
|
/// The method translates the current widget configuration and state into Flutter UI without mutating scheduler domain data.
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
title: 'FocusFlow',
|
|
debugShowCheckedModeBanner: false,
|
|
theme: FocusFlowTheme.dark(),
|
|
home: FocusFlowHome(composition: composition),
|
|
);
|
|
}
|
|
}
|