From 0c6efcbb988c2c9b27396126964c7293f748a9c6 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Tue, 28 May 2024 09:11:52 +0000 Subject: [PATCH] Add delete user dialog --- lib/components/user_card.dart | 54 +++++++++++++++++++++++++++++++++- lib/dialog/edit_user_page.dart | 1 + lib/l10n/app_en.arb | 11 ++++++- lib/l10n/app_zh.arb | 11 ++++++- lib/pages/users.dart | 13 ++++++++ 5 files changed, 87 insertions(+), 3 deletions(-) diff --git a/lib/components/user_card.dart b/lib/components/user_card.dart index e98c21b..46a459b 100644 --- a/lib/components/user_card.dart +++ b/lib/components/user_card.dart @@ -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 _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(), diff --git a/lib/dialog/edit_user_page.dart b/lib/dialog/edit_user_page.dart index 2dff885..28af051 100644 --- a/lib/dialog/edit_user_page.dart +++ b/lib/dialog/edit_user_page.dart @@ -142,6 +142,7 @@ class _EditUserPage extends State { ? 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 diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 303339f..1d3103a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -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: " } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 6d36c20..3bcab32 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -215,5 +215,14 @@ "userPermissions": "用户权限", "revokeToken": "撤销所有登录的会话", "editUser": "编辑用户", - "rootUser": "根用户" + "rootUser": "根用户", + "deleteUserConfirm": "是否删除用户 {user} ?", + "@deleteUserConfirm": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "failedDeleteUser": "删除用户失败:" } diff --git a/lib/pages/users.dart b/lib/pages/users.dart index 5611d88..33ac379 100644 --- a/lib/pages/users.dart +++ b/lib/pages/users.dart @@ -162,6 +162,7 @@ class _UsersPage extends State 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 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 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); + }); + } + } }