- Updated task status to reflect Phase 2 completion (Server Management) - Added completed features: * US-2.5: Create G-Core Server * US-2.6: Create GeViScope Server * US-2.7: Update Server * US-2.8: Delete Server * Offline-first architecture with Hive * Server sync and download functionality * Shared BLoC state across routes - Documented recent bug fix: "No data" display issue resolved - Updated last modified date to 2025-12-23 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
21 KiB
Geutebruck API Flutter App - Implementation Tasks
Implementation Status (Last Updated: 2025-12-23)
✅ Completed Features (Phase 1 & 2)
- US-1.1: User Login - Login screen with authentication ✅
- US-1.2: Token Management - Secure storage with flutter_secure_storage ✅
- US-2.1: View All Servers - Server list with filtering (All/G-Core/GeViScope) ✅
- US-2.5: Create G-Core Server - Full form implementation ✅
- US-2.6: Create GeViScope Server - Full form implementation ✅
- US-2.7: Update Server - Edit functionality with proper state handling ✅
- US-2.8: Delete Server - Delete with confirmation dialog ✅
- Navigation: App drawer with left menu navigation ✅
- Offline-First: Hive local storage with sync capabilities ✅
- Server Sync: Upload dirty changes to remote server ✅
- Server Download: Download latest configuration from server ✅
- State Management: BLoC pattern with shared state across routes ✅
🐛 Recent Bug Fixes
- Fixed "No data" display issue after server update (2025-12-23)
- Issue: BlocBuilder fallback showing "No data" during state transitions
- Solution: Changed fallback to show loading indicator instead
- File:
lib/presentation/screens/servers/servers_management_screen.dart:268
🚧 In Progress
- Testing and validation of server management features
📋 Pending (Phase 3-9)
- US-3.x: Action Mapping Management
- US-4.x: Camera Management
- US-5.x: Monitor & Cross-Switching
- US-6.x: Cross-Switch Management
- US-7.x: Configuration Export/Tree View
- US-8.x: Additional UI/UX improvements
Task Organization
Tasks are organized by user story and marked with:
[P]- Can be done in parallel[✅]- Completed[🚧]- In Progress- File paths indicate where code should be created/modified
- TDD tasks (tests) listed before implementation tasks
Phase 1: Foundation & Setup
Task Group: Project Setup
TASK-001 [P] [✅]: Create Flutter Project
File: N/A (command line)
flutter create geutebruck_app
cd geutebruck_app
TASK-002 [P] [✅]: Configure Dependencies
File: pubspec.yaml
- Add all required dependencies from plan.md
- Set Flutter SDK constraints
- Configure assets folder
TASK-003 [✅]: Setup Folder Structure
Files: Create folder structure as defined in plan.md
lib/core/
lib/data/
lib/domain/
lib/presentation/
TASK-004 [P] [✅]: Configure Analysis Options
File: analysis_options.yaml
- Add very_good_analysis
- Configure lint rules
- Enable strict mode
TASK-005 [P] [✅]: Setup Build Configuration
File: build.yaml
- Configure freezed
- Configure json_serializable
- Configure injectable
Task Group: US-1.1 - User Login
TASK-010: Create Auth Entities (Test)
File: test/domain/entities/user_test.dart
- Test User entity creation
- Test equality
- Test copyWith
TASK-011: Create Auth Entities
File: lib/domain/entities/user.dart
@freezed
class User with _$User {
const factory User({
required String id,
required String username,
required String role,
}) = _User;
}
TASK-012: Create Auth Models (Test)
File: test/data/models/auth_model_test.dart
- Test JSON deserialization
- Test toEntity conversion
TASK-013: Create Auth Models
File: lib/data/models/auth_model.dart
@freezed
class AuthResponse with _$AuthResponse {
factory AuthResponse({
required String accessToken,
required String refreshToken,
required UserModel user,
}) = _AuthResponse;
factory AuthResponse.fromJson(Map<String, dynamic> json) =>
_$AuthResponseFromJson(json);
}
TASK-014: Create Secure Storage Manager (Test)
File: test/data/data_sources/local/secure_storage_manager_test.dart
- Test token storage
- Test token retrieval
- Test token deletion
TASK-015: Create Secure Storage Manager
File: lib/data/data_sources/local/secure_storage_manager.dart
@injectable
class SecureStorageManager {
final FlutterSecureStorage _storage;
Future<void> saveToken(String key, String token);
Future<String?> getToken(String key);
Future<void> deleteToken(String key);
Future<void> clearAll();
}
TASK-016: Create Auth Remote Data Source (Test)
File: test/data/data_sources/remote/auth_remote_data_source_test.dart
- Mock Dio client
- Test login API call
- Test error handling
TASK-017: Create Auth Remote Data Source
File: lib/data/data_sources/remote/auth_remote_data_source.dart
@injectable
class AuthRemoteDataSource {
final Dio _dio;
Future<AuthResponse> login(String username, String password);
Future<AuthResponse> refreshToken(String refreshToken);
}
TASK-018: Create Auth Repository (Test)
File: test/data/repositories/auth_repository_impl_test.dart
- Mock data sources
- Test login flow
- Test token storage
TASK-019: Create Auth Repository
File: lib/data/repositories/auth_repository_impl.dart
- Implement repository interface
- Coordinate data sources
- Handle errors with Either<Failure, T>
TASK-020: Create Login Use Case (Test)
File: test/domain/use_cases/auth/login_test.dart
- Mock repository
- Test successful login
- Test failed login
TASK-021: Create Login Use Case
File: lib/domain/use_cases/auth/login.dart
@injectable
class Login {
final AuthRepository repository;
Future<Either<Failure, User>> call(String username, String password);
}
TASK-022: Create Auth BLoC (Test)
File: test/presentation/blocs/auth/auth_bloc_test.dart
- Use bloc_test package
- Test all events and state transitions
- Mock use cases
TASK-023: Create Auth BLoC
File: lib/presentation/blocs/auth/auth_bloc.dart
@injectable
class AuthBloc extends Bloc<AuthEvent, AuthState> {
final Login login;
final RefreshToken refreshToken;
final Logout logout;
}
TASK-024: Create Login Screen (Widget Test)
File: test/presentation/screens/auth/login_screen_test.dart
- Test UI rendering
- Test form validation
- Test login button tap
TASK-025: Create Login Screen
File: lib/presentation/screens/auth/login_screen.dart
- Username and password fields
- Login button
- Loading state
- Error display
- BLoC integration
Task Group: US-1.2 - Automatic Token Refresh
TASK-030: Create Auth Interceptor (Test)
File: test/core/network/interceptors/auth_interceptor_test.dart
- Test token injection
- Test 401 handling
- Test token refresh flow
TASK-031: Create Auth Interceptor
File: lib/core/network/interceptors/auth_interceptor.dart
class AuthInterceptor extends Interceptor {
@override
void onRequest(RequestOptions, RequestInterceptorHandler);
@override
void onError(DioException, ErrorInterceptorHandler);
}
Phase 2: Server Management
Task Group: US-2.1 - View All Servers
TASK-040: Create Server Entities
Files:
lib/domain/entities/server.dartlib/domain/entities/gcore_server.dartlib/domain/entities/geviscope_server.dart
TASK-041: Create Server Models
Files:
lib/data/models/server_model.dart- Include JSON serialization
TASK-042: Create Server Remote Data Source
File: lib/data/data_sources/remote/server_remote_data_source.dart
@RestApi(baseUrl: '/api/v1/configuration')
abstract class ServerRemoteDataSource {
factory ServerRemoteDataSource(Dio dio) = _ServerRemoteDataSource;
@GET('/servers')
Future<ServerListResponse> getServers();
@GET('/servers/gcore')
Future<GCoreServerListResponse> getGCoreServers();
@GET('/servers/geviscope')
Future<GeViScopeServerListResponse> getGeViScopeServers();
}
TASK-043: Create Cache Manager
File: lib/data/data_sources/local/cache_manager.dart
- Implement Hive boxes
- Cache servers with expiration
- Cache action mappings
TASK-044: Create Server Repository
File: lib/data/repositories/server_repository_impl.dart
- Implement all server operations
- Cache-first strategy
- Error handling
TASK-045: Create Get Servers Use Case
File: lib/domain/use_cases/servers/get_servers.dart
TASK-046: Create Server BLoC
File: lib/presentation/blocs/server/server_bloc.dart
- Events: LoadServers, CreateServer, UpdateServer, DeleteServer
- States: Initial, Loading, Loaded, Error
TASK-047: Create Server List Screen
File: lib/presentation/screens/servers/server_list_screen.dart
- AppBar with title and actions
- ListView with ServerCard widgets
- Pull-to-refresh
- Search functionality
- Filter chips (All, G-Core, GeViScope)
- FAB for adding new server
TASK-048: Create Server Card Widget
File: lib/presentation/widgets/server/server_card.dart
- Display server alias, host, type
- Status indicator (enabled/disabled)
- Tap to view details
- Swipe actions (edit, delete)
Task Group: US-2.4 - View Server Details
TASK-050: Create Server Detail Screen
File: lib/presentation/screens/servers/server_detail_screen.dart
- Display all server properties
- Edit and Delete buttons
- Connection status indicator
Task Group: US-2.5/2.6 - Create Server
TASK-055: Create Server Form Screen
File: lib/presentation/screens/servers/server_form_screen.dart
- Use flutter_form_builder
- Dynamic form based on server type
- Validation
- Submit button with loading state
Task Group: US-2.7 - Update Server
TASK-060: Create Update Server Use Case
File: lib/domain/use_cases/servers/update_server.dart
TASK-061: Update Server Form Screen
File: Same as TASK-055
- Pre-populate form with existing values
- Update mode vs create mode
Task Group: US-2.8 - Delete Server
TASK-065: Create Delete Server Use Case
File: lib/domain/use_cases/servers/delete_server.dart
TASK-066: Add Delete Confirmation Dialog
File: lib/presentation/widgets/common/confirmation_dialog.dart
- Reusable confirmation dialog
- Customizable title and message
Phase 3: Action Mapping Management
Task Group: US-3.1/3.2 - View Action Mappings
TASK-070: Create Action Mapping Entities
File: lib/domain/entities/action_mapping.dart
@freezed
class ActionMapping with _$ActionMapping {
const factory ActionMapping({
required int id,
required String caption,
required Map<String, String> inputActions,
required List<OutputAction> outputActions,
}) = _ActionMapping;
}
@freezed
class OutputAction with _$OutputAction {
const factory OutputAction({
required String action,
required String caption,
String? server,
required Map<String, String> parameters,
}) = _OutputAction;
}
TASK-071: Create Action Mapping Models
File: lib/data/models/action_mapping_model.dart
TASK-072: Create Action Mapping Remote Data Source
File: lib/data/data_sources/remote/action_mapping_remote_data_source.dart
@RestApi(baseUrl: '/api/v1/configuration')
abstract class ActionMappingRemoteDataSource {
@GET('/action-mappings')
Future<List<ActionMappingModel>> getActionMappings();
@GET('/action-mappings/{id}')
Future<ActionMappingModel> getActionMapping(@Path() int id);
@POST('/action-mappings')
Future<void> createActionMapping(@Body() ActionMappingCreateRequest request);
@PUT('/action-mappings/{id}')
Future<void> updateActionMapping(
@Path() int id,
@Body() ActionMappingUpdateRequest request,
);
@DELETE('/action-mappings/{id}')
Future<void> deleteActionMapping(@Path() int id);
}
TASK-073: Create Action Mapping Repository
File: lib/data/repositories/action_mapping_repository_impl.dart
TASK-074: Create Action Mapping Use Cases
Files:
lib/domain/use_cases/action_mappings/get_action_mappings.dartlib/domain/use_cases/action_mappings/create_action_mapping.dartlib/domain/use_cases/action_mappings/update_action_mapping.dartlib/domain/use_cases/action_mappings/delete_action_mapping.dart
TASK-075: Create Action Mapping BLoC
File: lib/presentation/blocs/action_mapping/action_mapping_bloc.dart
TASK-076: Create Action Mapping List Screen
File: lib/presentation/screens/action_mappings/action_mapping_list_screen.dart
TASK-077: Create Action Mapping Detail Screen
File: lib/presentation/screens/action_mappings/action_mapping_detail_screen.dart
Task Group: US-3.3/3.4 - Create/Update Action Mapping
TASK-080: Create Action Mapping Form Screen
File: lib/presentation/screens/action_mappings/action_mapping_form_screen.dart
- Caption field
- Input parameter builder
- Add/remove parameters
- Key-value pairs
- Output action builder
- Action type selector
- Server selector
- Parameter configuration
- Add/remove actions
- Submit button
Phase 4: Camera Management
Task Group: US-4.1/4.2 - Camera List and Details
TASK-090: Create Camera Entities
File: lib/domain/entities/camera.dart
TASK-091: Create Camera Models
File: lib/data/models/camera_model.dart
TASK-092: Create Camera Remote Data Source
File: lib/data/data_sources/remote/camera_remote_data_source.dart
@RestApi(baseUrl: '/api/v1/cameras')
abstract class CameraRemoteDataSource {
@GET('')
Future<List<CameraModel>> getCameras();
@GET('/{id}')
Future<CameraModel> getCamera(@Path() String id);
}
TASK-093: Create Camera Repository
File: lib/data/repositories/camera_repository_impl.dart
TASK-094: Create Camera Use Cases
Files:
lib/domain/use_cases/cameras/get_cameras.dartlib/domain/use_cases/cameras/get_camera.dart
TASK-095: Create Camera BLoC
File: lib/presentation/blocs/camera/camera_bloc.dart
TASK-096: Create Camera List Screen
File: lib/presentation/screens/cameras/camera_list_screen.dart
TASK-097: Create Camera Detail Screen
File: lib/presentation/screens/cameras/camera_detail_screen.dart
Task Group: US-4.3 - PTZ Camera Control
TASK-100: Create PTZ Control Use Cases
Files:
lib/domain/use_cases/cameras/control_ptz.dart- Support all PTZ actions (pan, tilt, zoom, focus)
TASK-101: Create PTZ BLoC
File: lib/presentation/blocs/ptz/ptz_bloc.dart
TASK-102: Create Camera Control Screen
File: lib/presentation/screens/cameras/camera_control_screen.dart
- PTZ control pad widget
- Directional buttons (up, down, left, right)
- Zoom controls (+/-)
- Focus controls (near/far)
- Stop button
- Speed slider
- Preset selector
- Save preset button
TASK-103: Create PTZ Control Pad Widget
File: lib/presentation/widgets/camera/ptz_control_pad.dart
Phase 5: Monitor & Cross-Switching
Task Group: US-5.1/5.2 - Monitor Management
TASK-110: Create Monitor Entities
File: lib/domain/entities/monitor.dart
TASK-111: Create Monitor Models
File: lib/data/models/monitor_model.dart
TASK-112: Create Monitor Remote Data Source
File: lib/data/data_sources/remote/monitor_remote_data_source.dart
TASK-113: Create Monitor Repository
File: lib/data/repositories/monitor_repository_impl.dart
TASK-114: Create Monitor Use Cases
Files:
lib/domain/use_cases/monitors/get_monitors.dartlib/domain/use_cases/monitors/get_monitor.dart
TASK-115: Create Monitor BLoC
File: lib/presentation/blocs/monitor/monitor_bloc.dart
TASK-116: Create Monitor List Screen
File: lib/presentation/screens/monitors/monitor_list_screen.dart
TASK-117: Create Monitor Detail Screen
File: lib/presentation/screens/monitors/monitor_detail_screen.dart
Task Group: US-6.1/6.2 - Cross-Switching
TASK-120: Create Cross-Switch Use Cases
Files:
lib/domain/use_cases/crossswitch/connect_camera_to_monitor.dartlib/domain/use_cases/crossswitch/clear_monitor.dart
TASK-121: Create Cross-Switch BLoC
File: lib/presentation/blocs/crossswitch/crossswitch_bloc.dart
TASK-122: Create Cross-Switch Screen
File: lib/presentation/screens/crossswitch/crossswitch_screen.dart
- Camera selector
- Monitor selector
- Preview of current assignments
- Connect button
- Clear button
Phase 6: Configuration Management
Task Group: US-7.1 - Export Configuration
TASK-130: Create Export Configuration Use Case
File: lib/domain/use_cases/configuration/export_configuration.dart
TASK-131: Add Export to Settings Screen
File: lib/presentation/screens/settings/settings_screen.dart
- Export button
- Save to file dialog
- Share option
Task Group: US-7.2 - View Configuration Tree
TASK-135: Create Configuration Tree Screen
File: lib/presentation/screens/configuration/configuration_tree_screen.dart
- Expandable tree view
- Search functionality
- Node type indicators
Phase 7: UI & Navigation
Task Group: US-8.1 - App Navigation
TASK-140: Setup GoRouter
File: lib/core/router/app_router.dart
final router = GoRouter(
routes: [
GoRoute(
path: '/login',
builder: (context, state) => LoginScreen(),
),
GoRoute(
path: '/servers',
builder: (context, state) => ServerListScreen(),
),
// ... other routes
],
);
TASK-141: Create App Shell with Bottom Navigation
File: lib/presentation/screens/app_shell.dart
- Bottom navigation bar
- Side drawer
- Route management
Task Group: US-8.2 - Settings Screen
TASK-145: Create Settings Screen
File: lib/presentation/screens/settings/settings_screen.dart
- API base URL configuration
- Theme selector
- Language selector
- Cache management
- About section
Task Group: US-8.3/8.4 - Error Handling & Loading States
TASK-150: Create Common Widgets
Files:
lib/presentation/widgets/common/loading_widget.dart- Shimmer loading for lists
- Circular progress for buttons
lib/presentation/widgets/common/error_widget.dart- Error icon and message
- Retry button
lib/presentation/widgets/common/empty_state_widget.dart- Empty list message
- Illustration
Phase 8: Testing & Polish
Task Group: Comprehensive Testing
TASK-160 [P]: Write Unit Tests for All Use Cases
Files: test/domain/use_cases/**/*_test.dart
- Achieve 80%+ coverage
TASK-161 [P]: Write Widget Tests for All Screens
Files: test/presentation/screens/**/*_test.dart
TASK-162 [P]: Write Integration Tests
Files: integration_test/app_test.dart
- Login flow
- Server CRUD
- Action mapping CRUD
Task Group: Performance Optimization
TASK-170: Implement List Pagination
Files: Update all list screens
- Infinite scroll
- Page size: 20 items
TASK-171: Optimize Image Loading
Files: Update image widgets
- Use cached_network_image
- Progressive loading
TASK-172: Implement Request Debouncing
Files: Update search fields
- Debounce duration: 300ms
Task Group: Accessibility
TASK-175: Add Semantic Labels
Files: All widgets
- Proper semantic labels for screen readers
TASK-176: Test with Screen Reader
Files: N/A (manual testing)
TASK-177: Verify Contrast Ratios
Files: lib/core/theme/colors.dart
Phase 9: Deployment Preparation
Task Group: App Configuration
TASK-180: Configure App Icons
File: Run flutter_launcher_icons
TASK-181: Configure Splash Screen
File: Run flutter_native_splash
TASK-182: Update App Metadata
Files:
android/app/src/main/AndroidManifest.xmlios/Runner/Info.plist
Task Group: Build & Release
TASK-185: Create Release Build (Android)
flutter build apk --release
flutter build appbundle --release
TASK-186: Create Release Build (iOS)
flutter build ipa --release
Dependencies Between Tasks
Foundation Tasks (001-005) → All other tasks
Authentication:
010-011 → 012-013 → 014-015 → 016-017 → 018-019 → 020-021 → 022-023 → 024-025
030-031 (depends on 022-023)
Servers:
040-041 → 042-043 → 044 → 045 → 046 → 047-048
050 (depends on 046)
055 (depends on 046)
060-061 (depends on 046)
065-066 (depends on 046)
Action Mappings:
070-071 → 072 → 073 → 074 → 075 → 076-077
080 (depends on 075)
Cameras:
090-091 → 092 → 093 → 094 → 095 → 096-097
100-103 (depends on 095)
Monitors:
110-111 → 112 → 113 → 114 → 115 → 116-117
Cross-Switching:
120-122 (depends on 095 and 115)
Configuration:
130-131
135
Navigation:
140-141 (depends on all screens being created)
Settings:
145
Common Widgets:
150 (can be done in parallel, used by many screens)
Testing:
160-162 (depends on all implementations)
Performance:
170-172 (depends on screens)
Accessibility:
175-177 (depends on all widgets)
Deployment:
180-186 (depends on everything)
Parallel Execution Opportunities
Tasks marked with [P] can be executed in parallel:
- TASK-001, 002, 004, 005 (setup tasks)
- TASK-160, 161, 162 (testing can be distributed)
Multiple developers can work on different epics simultaneously once foundation is complete.