Add delete user dialog

This commit is contained in:
2024-05-28 09:11:52 +00:00
committed by GitHub
parent b4992a08db
commit 0c6efcbb98
5 changed files with 87 additions and 3 deletions

View File

@@ -1,10 +1,24 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart';
import '../api/user.dart';
import '../dialog/edit_user_page.dart';
import '../globals.dart';
final _log = Logger("UserCard");
Future<void> _deleteUser(int id, String errmsg) async {
try {
(await api.deleteUser(id: id)).unwrap();
listener.tryEmit("delete_user", id);
} catch (e) {
_log.severe("Failed to delete user $id: $e");
final snack = SnackBar(content: Text("$errmsg$e"));
rootScaffoldMessengerKey.currentState?.showSnackBar(snack);
}
}
class UserCard extends StatelessWidget {
const UserCard(this.user, {super.key});
final BUser user;
@@ -49,7 +63,45 @@ class UserCard extends StatelessWidget {
!user.isAdmin ||
(user.isAdmin && auth.isRoot == true && user.id != 0)
? IconButton(
onPressed: () {},
onPressed: () => showDialog(
context: context,
builder: (context) {
final maxWidth = MediaQuery.of(context).size.width;
return Dialog(
child: Container(
padding: maxWidth < 400
? const EdgeInsets.symmetric(
vertical: 20, horizontal: 10)
: const EdgeInsets.all(20),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(10)),
width: maxWidth < 500 ? null : 500,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(i18n
.deleteUserConfirm(user.username)),
Row(
mainAxisAlignment:
MainAxisAlignment.end,
children: [
TextButton(
onPressed: () {
context.pop();
_deleteUser(user.id,
i18n.failedDeleteUser);
},
child: Text(i18n.yes)),
TextButton(
onPressed: () {
context.pop();
},
child: Text(i18n.no)),
]),
],
)));
}),
tooltip: i18n.delete,
icon: const Icon(Icons.delete))
: Container(),

View File

@@ -142,6 +142,7 @@ class _EditUserPage extends State<EditUserPage> {
? const EdgeInsets.symmetric(vertical: 20, horizontal: 10)
: const EdgeInsets.all(20),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10)),
width: maxWidth < 810 ? null : 800,
child: isLoading
? const Center(child: CircularProgressIndicator())
: _error != null

View File

@@ -215,5 +215,14 @@
"userPermissions": "User permissions",
"revokeToken": "Revoke all login sessions",
"editUser": "Edit user",
"rootUser": "Root user"
"rootUser": "Root user",
"deleteUserConfirm": "Do you want to delete user {user}?",
"@deleteUserConfirm": {
"placeholders": {
"user": {
"type": "String"
}
}
},
"failedDeleteUser": "Failed to delete user: "
}

View File

@@ -215,5 +215,14 @@
"userPermissions": "用户权限",
"revokeToken": "撤销所有登录的会话",
"editUser": "编辑用户",
"rootUser": "根用户"
"rootUser": "根用户",
"deleteUserConfirm": "是否删除用户 {user} ?",
"@deleteUserConfirm": {
"placeholders": {
"user": {
"type": "String"
}
}
},
"failedDeleteUser": "删除用户失败:"
}

View File

@@ -162,6 +162,7 @@ class _UsersPage extends State<UsersPage> with ThemeModeWidget, IsTopWidget2 {
_cancel2?.cancel();
listener.removeEventListener("new_user", _onNewUser);
listener.removeEventListener("update_user", _onUpdateUser);
listener.removeEventListener("delete_user", _onDeleteUser);
super.dispose();
}
@@ -169,6 +170,7 @@ class _UsersPage extends State<UsersPage> with ThemeModeWidget, IsTopWidget2 {
void initState() {
listener.on("new_user", _onNewUser);
listener.on("update_user", _onUpdateUser);
listener.on("delete_user", _onDeleteUser);
super.initState();
}
@@ -204,4 +206,15 @@ class _UsersPage extends State<UsersPage> with ThemeModeWidget, IsTopWidget2 {
}
});
}
void _onDeleteUser(dynamic arg) {
final uid = arg as int;
if (_users == null) return;
final index = _users!.indexWhere((v) => v.id == uid);
if (index > -1) {
setState(() {
_users!.removeAt(index);
});
}
}
}