import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:groceries_manager/pages/main/home_controller.dart'; import 'package:groceries_manager/services/db_service.dart'; import 'package:groceries_manager/services/toaster_service.dart'; import 'package:groceries_manager/utils/get_interface_extension.dart'; import '../../../db/database.dart'; class UserManagerController extends GetxController { final users = [].obs; @override void onInit() { super.onInit(); refreshData(); } Future refreshData() async { final users = await DBService.to.db.getUsers(); this.users.clear(); this.users.addAll(users); } void cancel() { Get.backLegacy(); } Future changeUserPassword(UserData item) async { final newPassword = await Get.prompt( title: "Изменение пароля для '${item.login}'", label: "Новый пароль", stringValidator: (value) { if (RegExp(r'[^а-яА-Яa-zA-Z0-9]').hasMatch(value ?? "")) { return "Пароль не соответствует требованиям: а-яА-Яa-zA-Z0-9"; } return null; }, ); if (newPassword == null) { return; } await DBService.to.db.updateUserPassword( item, password: newPassword, ); refreshData(); } Future deleteUser(UserData item) async { final currentUser = Get().user.value; if (currentUser.id == item.id) { ToasterService.to.error( title: "Ошибка", message: "Нельзя удалить самого себя!", ); return; } final confirmed = await Get.confirm( title: "Внимание!", content: "Удаление пользователя необратимо!\n" "Точно хотите удалить '${item.login}'?", ); if (!confirmed) return; final deleted = await DBService.to.db.deleteUser(item); if (!deleted) { ToasterService.to.error( title: "Ошибка", message: "Нельзя единственного пользователя!", ); } refreshData(); } } class UserManagerDialog extends GetView { const UserManagerDialog({super.key}); @override Widget build(BuildContext context) { final size = Get.size; return AlertDialog( title: const Text("Управление категориями"), content: SizedBox( width: size.width * 0.9, height: size.height * 0.9, child: SingleChildScrollView( child: Obx( () => Table( border: TableBorder.all(color: Colors.blueGrey.withAlpha(50)), children: [ const TableRow( children: [ TableCell( child: Padding( padding: EdgeInsets.all(8.0), child: Text("Логин"), ), ), TableCell( child: Padding( padding: EdgeInsets.all(8.0), child: Text("Частичный хэш пароля"), ), ), TableCell( child: SizedBox(), ), ], ), for (final item in controller.users) TableRow( key: ValueKey(item), children: [ TableCell( child: Padding( padding: const EdgeInsets.all(8.0), child: Text(item.login), ), ), TableCell( child: Padding( padding: const EdgeInsets.all(8.0), child: Text("${item.password.substring(0, 20)}..."), ), ), TableCell( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ ElevatedButton.icon( onPressed: () => controller.changeUserPassword(item), icon: const Icon(Icons.edit_rounded), label: const Text("Изменить пароль"), ), const SizedBox(height: 4), ElevatedButton.icon( onPressed: () => controller.deleteUser(item), icon: const Icon(Icons.delete_forever), label: const Text("Удалить"), ), ], ), ), ), ], ), ], ), ), ), ), actions: [ TextButton( onPressed: () => controller.cancel(), child: const Text("Закрыть"), ), ], ); } static Future show({ UserData? ecd, }) async { Get.put(UserManagerController()); await Get.dialog( const UserManagerDialog(), id: "UserManagerDialog", name: "UserManagerDialog", ); Get.delete(); } }