focus-flow/apps/focus_flow_flutter/lib/app/scheduler_app_composition.dart
pyr0ball 383130ebdb chore: merge upstream Backlog Board feature from Ashley's instance
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
2026-07-10 22:46:09 -07:00

53 lines
1.8 KiB
Dart

// SPDX-FileCopyrightText: 2026 FocusFlow contributors
// SPDX-License-Identifier: AGPL-3.0-only
/// Defines the app composition protocol used by FocusFlow widgets.
library;
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';
/// Runtime-independent composition surface consumed by the app shell.
abstract interface class SchedulerAppComposition {
/// Human-readable label for the selected local date.
String get dateLabel;
/// Initial selected owner-local planning date.
CivilDate get initialDate;
/// Default project id used by quick-capture commands.
String get defaultProjectId;
/// Formats [date] for compact UI date labels.
String dateLabelFor(CivilDate date);
/// Creates the controller that owns the visible planning date.
SelectedDateController createSelectedDateController();
/// Creates the controller used by the compact Today screen.
TodayScreenController createTodayScreenController({
required SelectedDateController selectedDates,
});
/// Creates the controller used by the Backlog board screen.
BacklogBoardController createBacklogBoardController({
required SelectedDateController selectedDates,
});
/// Creates a read controller for the settings screen.
UiReadController<OwnerSettings> createOwnerSettingsController();
/// Creates the command controller used by interactive scheduler controls.
SchedulerCommandController createCommandController({
required ReadRefresh refreshReads,
required SelectedDateReader selectedDate,
});
/// Releases resources owned by the composition.
Future<void> dispose();
}