Перевёл панель пользователей

This commit is contained in:
Andrew 2023-05-17 20:58:26 +07:00
parent 93b599137b
commit 89bd7cbfcb

View file

@ -1,5 +1,3 @@
import 'package:built_collection/built_collection.dart';
import 'package:built_value/json_object.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -68,7 +66,7 @@ class UserListPanelController extends GetxController {
final respData = resp.data; final respData = resp.data;
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
_users.clear(); _users.clear();
@ -82,18 +80,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to get users", "Ошибка получения пользователей",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to get users", "Ошибка получения пользователей",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to get users", "Ошибка получения пользователей",
"$e", "$e",
); );
} }
@ -110,7 +108,7 @@ class UserListPanelController extends GetxController {
final respData = resp.data; final respData = resp.data;
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
_groups.clear(); _groups.clear();
@ -123,18 +121,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to get groups", "Ошибка получения групп пользователей",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to get groups", "Ошибка получения групп пользователей",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to get groups", "Ошибка получения групп пользователей",
"$e", "$e",
); );
} }
@ -149,8 +147,8 @@ class UserListPanelController extends GetxController {
final accept = await Get.dialog<bool>( final accept = await Get.dialog<bool>(
AlertDialog( AlertDialog(
title: user == null title: user == null
? const Text("Create new user") ? const Text("Создание нового пользователя")
: const Text("Edit user"), : const Text("Редактирование пользователя"),
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@ -159,14 +157,14 @@ class UserListPanelController extends GetxController {
? TextEditingController(text: user.username) ? TextEditingController(text: user.username)
: null, : null,
decoration: const InputDecoration( decoration: const InputDecoration(
labelText: "Username", labelText: "Логин",
), ),
readOnly: user != null, readOnly: user != null,
onChanged: (value) => username.value = value, onChanged: (value) => username.value = value,
), ),
TextField( TextField(
decoration: const InputDecoration( decoration: const InputDecoration(
labelText: "Password", labelText: "Пароль",
), ),
obscureText: true, obscureText: true,
onChanged: (value) => password.value = value, onChanged: (value) => password.value = value,
@ -176,11 +174,12 @@ class UserListPanelController extends GetxController {
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Get.back(result: false), onPressed: () => Get.back(result: false),
child: const Text("Cancel"), child: const Text("Отменить"),
), ),
TextButton( TextButton(
onPressed: () => Get.back(result: true), onPressed: () => Get.back(result: true),
child: user == null ? const Text("Create") : const Text("Save"), child:
user == null ? const Text("Создать") : const Text("Сохранить"),
), ),
], ],
), ),
@ -210,7 +209,7 @@ class UserListPanelController extends GetxController {
} }
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
refreshData(); refreshData();
@ -218,18 +217,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to create user", "Ошибка создания пользователя",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to create user", "Ошибка создания пользователя",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to create user", "Ошибка создания пользователя",
"$e", "$e",
); );
} }
@ -240,19 +239,19 @@ class UserListPanelController extends GetxController {
final groupDescription = "".obs; final groupDescription = "".obs;
final accept = await Get.dialog<bool>( final accept = await Get.dialog<bool>(
AlertDialog( AlertDialog(
title: const Text("Create new group"), title: const Text("Создание группы пользователей"),
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
TextField( TextField(
decoration: const InputDecoration( decoration: const InputDecoration(
labelText: "Group name", labelText: "Название",
), ),
onChanged: (value) => groupName.value = value, onChanged: (value) => groupName.value = value,
), ),
TextField( TextField(
decoration: const InputDecoration( decoration: const InputDecoration(
labelText: "Group description (optional)", labelText: "Описание (опционально)",
), ),
onChanged: (value) => groupDescription.value = value, onChanged: (value) => groupDescription.value = value,
), ),
@ -261,11 +260,11 @@ class UserListPanelController extends GetxController {
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Get.back(result: false), onPressed: () => Get.back(result: false),
child: const Text("Cancel"), child: const Text("Отменить"),
), ),
TextButton( TextButton(
onPressed: () => Get.back(result: true), onPressed: () => Get.back(result: true),
child: const Text("Create"), child: const Text("Создать"),
), ),
], ],
), ),
@ -284,12 +283,12 @@ class UserListPanelController extends GetxController {
final respData = resp.data; final respData = resp.data;
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
Get.snackbar( Get.snackbar(
"Group created", "Группа создана",
"Group $groupName created", "Группа $groupName создана",
); );
refreshData(); refreshData();
@ -297,18 +296,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to create group", "Ошибка создания группы пользователей",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to create group", "Ошибка создания группы пользователей",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to create group", "Ошибка создания группы пользователей",
"$e", "$e",
); );
} }
@ -331,7 +330,7 @@ class UserListPanelController extends GetxController {
final respData = resp.data; final respData = resp.data;
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
final data = respData final data = respData
@ -356,7 +355,7 @@ class UserListPanelController extends GetxController {
final selectedUser = await Get.dialog<UserDefinition>( final selectedUser = await Get.dialog<UserDefinition>(
AlertDialog( AlertDialog(
title: const Text("Select user to add to group"), title: const Text("Какого пользователя добавить в группу"),
content: SizedBox( content: SizedBox(
width: 400, width: 400,
height: 400, height: 400,
@ -374,7 +373,7 @@ class UserListPanelController extends GetxController {
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Get.back(result: null), onPressed: () => Get.back(result: null),
child: const Text("Cancel"), child: const Text("Отменить"),
), ),
], ],
), ),
@ -393,12 +392,12 @@ class UserListPanelController extends GetxController {
final respData = resp.data; final respData = resp.data;
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
Get.snackbar( Get.snackbar(
"User added to group", "Пользователь добавлен в группу",
"User ${selectedUser.username} added to group ${group.name}", "Пользователь ${selectedUser.username} добавлен в группу ${group.name}",
); );
refreshData(); refreshData();
@ -406,18 +405,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to add user to group", "Ошибка добавления пользователя в группу",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to add user to group", "Ошибка добавления пользователя в группу",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to add user to group", "Ошибка добавления пользователя в группу",
"$e", "$e",
); );
} }
@ -429,17 +428,17 @@ class UserListPanelController extends GetxController {
) async { ) async {
final accept = await Get.dialog<bool>( final accept = await Get.dialog<bool>(
AlertDialog( AlertDialog(
title: const Text("Remove user from group"), title: const Text("Удаление пользователя из группы"),
content: const Text( content: const Text(
"Are you sure you want to remove this user from the group?"), "Вы действительно хотите удалить этого пользователя из группы?"),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Get.back(result: false), onPressed: () => Get.back(result: false),
child: const Text("Cancel"), child: const Text("Отменить"),
), ),
TextButton( TextButton(
onPressed: () => Get.back(result: true), onPressed: () => Get.back(result: true),
child: const Text("Remove"), child: const Text("Удалить"),
), ),
], ],
), ),
@ -466,12 +465,12 @@ class UserListPanelController extends GetxController {
final respData = resp.data; final respData = resp.data;
if (respData == null) { if (respData == null) {
throw Exception("No data in response"); throw Exception("В ответе нет данных");
} }
Get.snackbar( Get.snackbar(
"User removed from group", "Пользователь удалён из группы",
"User ${user.username} removed from group ${group.name}", "Пользователь ${user.username} удалён из группы ${group.name}",
); );
refreshData(); refreshData();
@ -479,18 +478,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to remove user from group", "Ошибка удаления пользователя из группы",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to remove user from group", "Ошибка удаления пользователя из группы",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to remove user from group", "Ошибка удаления пользователя из группы",
"$e", "$e",
); );
} }
@ -499,17 +498,16 @@ class UserListPanelController extends GetxController {
Future<void> deleteGroup(GroupDefinition group) async { Future<void> deleteGroup(GroupDefinition group) async {
final accept = await Get.dialog<bool>( final accept = await Get.dialog<bool>(
AlertDialog( AlertDialog(
title: const Text("Delete group"), title: const Text("Удаление группы"),
content: const Text( content: const Text("Вы действительно хотите удалить эту группу?"),
"Are you sure you want to delete this group? This action cannot be undone."),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Get.back(result: false), onPressed: () => Get.back(result: false),
child: const Text("Cancel"), child: const Text("Отменить"),
), ),
TextButton( TextButton(
onPressed: () => Get.back(result: true), onPressed: () => Get.back(result: true),
child: const Text("Delete"), child: const Text("Удалить"),
), ),
], ],
), ),
@ -530,7 +528,7 @@ class UserListPanelController extends GetxController {
); );
if (resp1.data == null) { if (resp1.data == null) {
throw Exception("Could not delete users from group"); throw Exception("Не удалось удалить пользователей из группы");
} }
final resp2 = await ApiController.to.apiClient.deleteItemFromTable( final resp2 = await ApiController.to.apiClient.deleteItemFromTable(
@ -545,12 +543,12 @@ class UserListPanelController extends GetxController {
); );
if (resp2.data == null) { if (resp2.data == null) {
throw Exception("Could not delete group"); throw Exception("Не удалось удалить группу пользователей");
} }
Get.snackbar( Get.snackbar(
"Group deleted", "Группа пользователей удалена",
"Group ${group.name} deleted", "Группа ${group.name} удалена",
); );
refreshData(); refreshData();
@ -558,18 +556,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to delete group", "Ошибка удаления группы пользователей",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to delete group", "Ошибка удаления группы пользователей",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to delete group", "Ошибка удаления группы пользователей",
"$e", "$e",
); );
} }
@ -584,17 +582,16 @@ class UserListPanelController extends GetxController {
AlertDialog( AlertDialog(
title: const Text("Delete user"), title: const Text("Delete user"),
content: const Text( content: const Text(
"Are you sure you want to delete this user? This action cannot be undone.\n" "Вы уверены, что хотите удалить этого пользователя?",
"Note: This will not remove references to this user in other tables.",
), ),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => Get.back(result: false), onPressed: () => Get.back(result: false),
child: const Text("Cancel"), child: const Text("Отменить"),
), ),
TextButton( TextButton(
onPressed: () => Get.back(result: true), onPressed: () => Get.back(result: true),
child: const Text("Delete"), child: const Text("Удалить"),
), ),
], ],
), ),
@ -615,7 +612,7 @@ class UserListPanelController extends GetxController {
); );
if (resp1.data == null) { if (resp1.data == null) {
throw Exception("Could not delete users from group"); throw Exception("Не удалось удалить пользователя из групп");
} }
final resp2 = await ApiController.to.apiClient.removeUser( final resp2 = await ApiController.to.apiClient.removeUser(
@ -623,12 +620,12 @@ class UserListPanelController extends GetxController {
); );
if (resp2.data == null) { if (resp2.data == null) {
throw Exception("Could not delete group"); throw Exception("Не удалось удалить пользователя");
} }
Get.snackbar( Get.snackbar(
"User deleted", "Пользователь удалён",
"User ${user.username} deleted", "Пользователь ${user.username} удалён",
); );
refreshData(); refreshData();
@ -636,18 +633,18 @@ class UserListPanelController extends GetxController {
final respData = e.response?.data; final respData = e.response?.data;
if (respData != null) { if (respData != null) {
Get.snackbar( Get.snackbar(
"Error trying to delete user", "Ошибка удаления пользователя",
"${respData['error']}", "${respData['error']}",
); );
} else { } else {
Get.snackbar( Get.snackbar(
"Error trying to delete user", "Ошибка удаления пользователя",
"$e", "$e",
); );
} }
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
"Error trying to delete user", "Ошибка удаления пользователя",
"$e", "$e",
); );
} }
@ -674,11 +671,11 @@ class UsersListPanel extends GetView<UserListPanelController> {
items: const [ items: const [
DropdownMenuItem( DropdownMenuItem(
value: UserListPanelTab.users, value: UserListPanelTab.users,
child: Text("Users"), child: Text("Пользователи"),
), ),
DropdownMenuItem( DropdownMenuItem(
value: UserListPanelTab.groups, value: UserListPanelTab.groups,
child: Text("Groups"), child: Text("Группы"),
), ),
], ],
value: controller.currentTab, value: controller.currentTab,
@ -721,11 +718,12 @@ class UsersListPanel extends GetView<UserListPanelController> {
); );
} }
Widget get usersPanel => Obx(() => Widget get usersPanel => Obx(() => controller.users.isEmpty
controller.users.isEmpty ? whenNoSomething("No users found") : cardList); ? whenNoSomething("Пользователи не найдены")
: cardList);
Widget get groupsPanel => Obx(() => controller.groups.isEmpty Widget get groupsPanel => Obx(() => controller.groups.isEmpty
? whenNoSomething("No groups found") ? whenNoSomething("Группы не найдены")
: groupsList); : groupsList);
Widget whenNoSomething(message) => Center( Widget whenNoSomething(message) => Center(
@ -785,7 +783,7 @@ class UsersListPanel extends GetView<UserListPanelController> {
ElevatedButton.icon( ElevatedButton.icon(
onPressed: () => controller.editUser(user), onPressed: () => controller.editUser(user),
icon: const Icon(Icons.edit_attributes), icon: const Icon(Icons.edit_attributes),
label: const Text("Edit user"), label: const Text("Редактировать"),
).paddingAll(8).expanded(), ).paddingAll(8).expanded(),
Obx( Obx(
() { () {
@ -807,7 +805,7 @@ class UsersListPanel extends GetView<UserListPanelController> {
final btn = ElevatedButton.icon( final btn = ElevatedButton.icon(
onPressed: () => controller.deleteUser(user), onPressed: () => controller.deleteUser(user),
icon: const Icon(Icons.delete_forever), icon: const Icon(Icons.delete_forever),
label: const Text("Delete user"), label: const Text("Удалить"),
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Colors.redAccent, backgroundColor: Colors.redAccent,
), ),
@ -815,7 +813,7 @@ class UsersListPanel extends GetView<UserListPanelController> {
if (isAdmin) { if (isAdmin) {
return Tooltip( return Tooltip(
message: "Please note that this user is an admin", message: "Данный пользователь является администратором",
child: btn, child: btn,
).paddingAll(8).expanded(); ).paddingAll(8).expanded();
} }
@ -876,7 +874,7 @@ class UsersListPanel extends GetView<UserListPanelController> {
final groupData = controller.usersInGroups[group]; final groupData = controller.usersInGroups[group];
if (group.id == 1) { if (group.id == 1) {
return const ListTile( return const ListTile(
title: Text("No users can be added to this group"), title: Text("В эту группу нельзя добавить пользователей"),
); );
} }
if (groupData == null) { if (groupData == null) {
@ -886,7 +884,7 @@ class UsersListPanel extends GetView<UserListPanelController> {
} }
if (groupData.isEmpty) { if (groupData.isEmpty) {
return const ListTile( return const ListTile(
title: Text("No users in group"), title: Text("В группе нет пользователей"),
); );
} }
return ListView.builder( return ListView.builder(
@ -897,7 +895,7 @@ class UsersListPanel extends GetView<UserListPanelController> {
final isYou = user.accessToken == ApiController.to.token; final isYou = user.accessToken == ApiController.to.token;
return ListTile( return ListTile(
title: Text(user.username), title: Text(user.username),
subtitle: isYou ? const Text("You") : null, subtitle: isYou ? const Text("Вы") : null,
trailing: isYou && trailing: isYou &&
(group.id == 2 || (group.id == 2 ||
group.name.toLowerCase() == "admin") group.name.toLowerCase() == "admin")