187 lines
5.6 KiB
Dart
187 lines
5.6 KiB
Dart
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>();
|
||
}
|
||
}
|