Files
tatlock-ui/lib/features/control_room/router.dart
T
Jeroen SchweitzerandClaude Opus 4.5 c3f6d27a52
Build and Push / release (push) Successful in 3s
Build and Push / build (push) Successful in 3m7s
chore: release v1.4.0
- Decentralized Room Registry pattern
- Each room registers itself with central registry
- Dynamic navigation tabs and settings dropdown
- New Media Room and Parlor feature folders
- Permission-based room filtering support

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 15:46:44 +01:00

99 lines
3.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:tatlock_ui/features/control_room/presentation/pages/control_room_page.dart';
import 'package:tatlock_ui/routing/app_router.dart';
import 'package:tatlock_ui/routing/room_registry.dart';
import 'package:tatlock_ui/shared/layouts/widgets/nav_panel.dart';
/// Route paths for Control Room.
abstract class ControlRoomRoutes {
static const base = '/control-room';
// Stack
static const containers = '/control-room/containers';
static const proxyHosts = '/control-room/proxy-hosts';
// 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 {
// Stack Management section - Docker containers and reverse proxy
containers('containers', 'Containers', Icons.dns, 'Stack Management'),
proxyHosts('proxy-hosts', 'Proxy Hosts', Icons.public, 'Stack Management'),
// 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);
final String id;
final String label;
final IconData icon;
final String section;
NavItem toNavItem() => NavItem(
id: id,
label: label,
icon: icon,
section: section,
);
/// Get route path for this nav item.
String get path => '/control-room/$id';
}
/// Get route path for a nav item.
String pathForNav(ControlRoomNav nav) => nav.path;
/// Control Room room definition.
final controlRoomRoom = RoomDefinition(
id: 'control-room',
label: 'Control Room',
icon: Icons.dns_outlined,
selectedIcon: Icons.dns,
defaultRoute: ControlRoomRoutes.containers,
routes: controlRoomRoutes,
// No permissions required - accessible to all authenticated users
);
/// Register Control Room with the room registry.
void registerControlRoom() {
roomRegistry.register(controlRoomRoom);
}
/// Control Room routes for go_router.
List<RouteBase> controlRoomRoutes() {
return [
// Redirect /control-room to /control-room/containers
GoRoute(
path: ControlRoomRoutes.base,
name: 'controlRoom',
redirect: (context, state) => ControlRoomRoutes.containers,
),
// Generate routes for all nav items
for (final nav in ControlRoomNav.values)
GoRoute(
path: nav.path,
name: 'controlRoom${_capitalize(nav.id.replaceAll('-', '_'))}',
pageBuilder: (context, state) => noTransitionPage(
context,
state,
ControlRoomPage(nav: nav, routerState: state),
),
),
];
}
String _capitalize(String s) {
if (s.isEmpty) return s;
return s
.split('_')
.map((part) => part[0].toUpperCase() + part.substring(1))
.join('');
}