diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a7ec97..e884fc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.12] - 2026-01-04 + +### Changed +- Control Room navigation reorganized: + - New "Stack" section with Containers and Proxy Hosts + - New "Data Management" section with PostgreSQL, Redis, Qdrant, Neo4j placeholders + - Removed: Networks, Volumes, Images (Portainer) and Redirections, Streams, Certificates (NPM) + ## [1.1.11] - 2026-01-04 ### Fixed diff --git a/lib/features/control_room/presentation/pages/control_room_page.dart b/lib/features/control_room/presentation/pages/control_room_page.dart index 9c3fa39..17b6c4b 100644 --- a/lib/features/control_room/presentation/pages/control_room_page.dart +++ b/lib/features/control_room/presentation/pages/control_room_page.dart @@ -69,44 +69,11 @@ class _SectionContent extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - switch (nav) { - case ControlRoomNav.containers: - return const _ContainersSection(); - case ControlRoomNav.proxyHosts: - return const ProxyHostsPage(); - default: - return _PlaceholderSection(nav: nav); - } - } -} - -/// Containers section with optional stack filter. -class _ContainersSection extends ConsumerWidget { - const _ContainersSection(); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final selectedStack = ref.watch(selectedStackProvider); - final colorScheme = Theme.of(context).colorScheme; - - return Row( - children: [ - // Stacks filter panel - const _StacksFilterPanel(), - // Divider - VerticalDivider( - width: 1, - thickness: 1, - color: colorScheme.outlineVariant, - ), - // Main content - containers list or stack detail - Expanded( - child: selectedStack == null - ? const ContainersListPage() - : StackDetailPage(stackId: selectedStack), - ), - ], - ); + return switch (nav) { + ControlRoomNav.containers => const _ContainersSection(), + ControlRoomNav.proxyHosts => const ProxyHostsPage(), + _ => _PlaceholderSection(nav: nav), + }; } } @@ -150,6 +117,36 @@ class _PlaceholderSection extends StatelessWidget { } } +/// Containers section with optional stack filter. +class _ContainersSection extends ConsumerWidget { + const _ContainersSection(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final selectedStack = ref.watch(selectedStackProvider); + final colorScheme = Theme.of(context).colorScheme; + + return Row( + children: [ + // Stacks filter panel + const _StacksFilterPanel(), + // Divider + VerticalDivider( + width: 1, + thickness: 1, + color: colorScheme.outlineVariant, + ), + // Main content - containers list or stack detail + Expanded( + child: selectedStack == null + ? const ContainersListPage() + : StackDetailPage(stackId: selectedStack), + ), + ], + ); + } +} + /// Stacks filter panel for Containers section (includes "All Containers" option). class _StacksFilterPanel extends ConsumerWidget { const _StacksFilterPanel(); diff --git a/lib/features/control_room/router.dart b/lib/features/control_room/router.dart index 6629af0..2f1a891 100644 --- a/lib/features/control_room/router.dart +++ b/lib/features/control_room/router.dart @@ -7,30 +7,26 @@ import 'package:tatlock_ui/shared/layouts/widgets/nav_panel.dart'; /// Route paths for Control Room. abstract class ControlRoomRoutes { static const base = '/control-room'; - // Portainer + // Stack static const containers = '/control-room/containers'; - static const networks = '/control-room/networks'; - static const volumes = '/control-room/volumes'; - static const images = '/control-room/images'; - // NPM static const proxyHosts = '/control-room/proxy-hosts'; - static const redirections = '/control-room/redirections'; - static const streams = '/control-room/streams'; - static const certificates = '/control-room/certificates'; + // Data Management + static const postgres = '/control-room/postgres'; + static const redis = '/control-room/redis'; + static const qdrant = '/control-room/qdrant'; + static const neo4j = '/control-room/neo4j'; } /// Control Room navigation items with section grouping. enum ControlRoomNav { - // Portainer section - containers('containers', 'Containers', Icons.dns, 'Portainer'), - networks('networks', 'Networks', Icons.hub, 'Portainer'), - volumes('volumes', 'Volumes', Icons.storage, 'Portainer'), - images('images', 'Images', Icons.photo_library, 'Portainer'), - // NPM section - proxyHosts('proxy-hosts', 'Proxy Hosts', Icons.public, 'NPM'), - redirections('redirections', 'Redirections', Icons.alt_route, 'NPM'), - streams('streams', 'Streams', Icons.stream, 'NPM'), - certificates('certificates', 'SSL Certificates', Icons.verified_user, 'NPM'); + // Stack section - Docker containers and reverse proxy + containers('containers', 'Containers', Icons.dns, 'Stack'), + proxyHosts('proxy-hosts', 'Proxy Hosts', Icons.public, 'Stack'), + // Data Management section - Database browsers + postgres('postgres', 'PostgreSQL', Icons.table_chart, 'Data Management'), + redis('redis', 'Redis', Icons.memory, 'Data Management'), + qdrant('qdrant', 'Qdrant', Icons.scatter_plot, 'Data Management'), + neo4j('neo4j', 'Neo4j', Icons.hub, 'Data Management'); const ControlRoomNav(this.id, this.label, this.icon, this.section); diff --git a/pubspec.yaml b/pubspec.yaml index 13b19a7..809385b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.11+1 +version: 1.1.12+1 environment: sdk: ^3.10.4