Initial and done prolly
This commit is contained in:
commit
6f88b9966f
175 changed files with 15445 additions and 0 deletions
187
lib/pages/main/dialogs/user_manager_dialog.dart
Normal file
187
lib/pages/main/dialogs/user_manager_dialog.dart
Normal 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>();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue