groceries_manager/lib/pages/main/dialogs/user_manager_dialog.dart
2025-01-05 16:01:21 +07:00

187 lines
5.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 = <UserData>[].obs;
@override
void onInit() {
super.onInit();
refreshData();
}
Future<void> refreshData() async {
final users = await DBService.to.db.getUsers();
this.users.clear();
this.users.addAll(users);
}
void cancel() {
Get.backLegacy();
}
Future<void> 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<void> deleteUser(UserData item) async {
final currentUser = Get<HomeController>().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<UserManagerController> {
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<void> show({
UserData? ecd,
}) async {
Get.put(UserManagerController());
await Get.dialog(
const UserManagerDialog(),
id: "UserManagerDialog",
name: "UserManagerDialog",
);
Get.delete<UserManagerController>();
}
}