Waaaay big enchancements

This commit is contained in:
Artem Kokos
2026-04-02 23:51:28 +07:00
parent 6221fbcc71
commit 5e09f41747
14 changed files with 1308 additions and 111 deletions

View File

@@ -5,6 +5,9 @@ import '../widgets/group_card.dart';
import 'homes_screen.dart';
import 'group_edit_screen.dart';
import 'schedules_screen.dart';
import 'stats_screen.dart';
import 'event_log_screen.dart';
import 'api_keys_screen.dart';
/// Основной экран пульта управления.
/// Показывает группы текущего дома с управлением.
@@ -26,6 +29,7 @@ class _RemoteScreenState extends ConsumerState<RemoteScreen> {
Future<void> _bootstrap() async {
await ref.read(groupsProvider.notifier).initAndRefresh();
await ref.read(authInfoProvider.notifier).load();
if (mounted) setState(() => _loading = false);
}
@@ -33,6 +37,8 @@ class _RemoteScreenState extends ConsumerState<RemoteScreen> {
Widget build(BuildContext context) {
final groups = ref.watch(groupsProvider);
final currentHome = ref.watch(currentHomeProvider);
final authInfo = ref.watch(authInfoProvider);
final isAdmin = authInfo?['is_admin'] == true;
return Scaffold(
appBar: AppBar(
@@ -53,13 +59,68 @@ class _RemoteScreenState extends ConsumerState<RemoteScreen> {
MaterialPageRoute(builder: (_) => const GroupEditScreen()),
),
),
// Расписания
IconButton(
icon: const Icon(Icons.schedule),
tooltip: 'Расписания',
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const SchedulesScreen()),
),
// Меню
PopupMenuButton<String>(
icon: const Icon(Icons.more_vert),
onSelected: (value) {
switch (value) {
case 'schedules':
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const SchedulesScreen()),
);
break;
case 'stats':
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const StatsScreen()),
);
break;
case 'log':
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const EventLogScreen()),
);
break;
case 'api_keys':
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ApiKeysScreen()),
);
break;
}
},
itemBuilder: (context) => [
const PopupMenuItem(
value: 'schedules',
child: ListTile(
leading: Icon(Icons.schedule),
title: Text('Расписания'),
contentPadding: EdgeInsets.zero,
),
),
const PopupMenuItem(
value: 'stats',
child: ListTile(
leading: Icon(Icons.bar_chart),
title: Text('Статистика'),
contentPadding: EdgeInsets.zero,
),
),
const PopupMenuItem(
value: 'log',
child: ListTile(
leading: Icon(Icons.list_alt),
title: Text('Лог событий'),
contentPadding: EdgeInsets.zero,
),
),
if (isAdmin)
const PopupMenuItem(
value: 'api_keys',
child: ListTile(
leading: Icon(Icons.vpn_key),
title: Text('API-ключи'),
contentPadding: EdgeInsets.zero,
),
),
],
),
],
),