Initial and done prolly

This commit is contained in:
Andrew 2025-01-05 16:01:21 +07:00
commit 6f88b9966f
175 changed files with 15445 additions and 0 deletions

View file

@ -0,0 +1,187 @@
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>();
}
}