From eedf682974ffb62747c86890448569268d4f0ba1 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Tue, 20 Sep 2022 17:56:15 +0800 Subject: [PATCH] feat: support for deleting user Signed-off-by: Ryan Wang --- src/modules/system/users/UserList.vue | 107 ++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 8 deletions(-) diff --git a/src/modules/system/users/UserList.vue b/src/modules/system/users/UserList.vue index 5069700d7..44c10e6e8 100644 --- a/src/modules/system/users/UserList.vue +++ b/src/modules/system/users/UserList.vue @@ -13,17 +13,21 @@ import { VAvatar, VEntity, VEntityField, + useDialog, + VStatusDot, } from "@halo-dev/components"; import UserEditingModal from "./components/UserEditingModal.vue"; import UserPasswordChangeModal from "./components/UserPasswordChangeModal.vue"; -import { onMounted, ref } from "vue"; +import { inject, onMounted, ref, watch } from "vue"; import { apiClient } from "@halo-dev/admin-shared"; import type { User, UserList } from "@halo-dev/api-client"; import { rbacAnnotations } from "@/constants/annotations"; import { formatDatetime } from "@/utils/date"; import { useRouteQuery } from "@vueuse/router"; -const checkAll = ref(false); +const dialog = useDialog(); + +const checkedAll = ref(false); const editingModal = ref(false); const passwordChangeModal = ref(false); const users = ref({ @@ -36,7 +40,9 @@ const users = ref({ hasNext: false, hasPrevious: false, }); +const selectedUserNames = ref([]); const selectedUser = ref(null); +const currentUser = inject("currentUser"); const handleFetchUsers = async () => { try { @@ -64,6 +70,70 @@ const handlePaginationChange = async ({ await handleFetchUsers(); }; +const handleDelete = async (user: User) => { + dialog.warning({ + title: "确定要删除该用户吗?", + description: "该操作不可恢复。", + confirmType: "danger", + onConfirm: async () => { + try { + await apiClient.extension.user.deletev1alpha1User({ + name: user.metadata.name, + }); + } catch (e) { + console.error("Failed to delete user", e); + } finally { + await handleFetchUsers(); + } + }, + }); +}; + +const handleDeleteInBatch = async () => { + dialog.warning({ + title: "是否确认删除选中的用户?", + confirmType: "danger", + onConfirm: async () => { + const userNamesToDelete = selectedUserNames.value.filter( + (name) => name != currentUser?.metadata.name + ); + await Promise.all( + userNamesToDelete.map((name) => { + return apiClient.extension.user.deletev1alpha1User({ + name, + }); + }) + ); + await handleFetchUsers(); + selectedUserNames.value.length = 0; + }, + }); +}; + +watch(selectedUserNames, (newValue) => { + checkedAll.value = newValue.length === users.value.items?.length; +}); + +const checkSelection = (user: User) => { + return ( + user.metadata.name === selectedUser.value?.metadata.name || + selectedUserNames.value.includes(user.metadata.name) + ); +}; + +const handleCheckAllChange = (e: Event) => { + const { checked } = e.target as HTMLInputElement; + + if (checked) { + selectedUserNames.value = + users.value.items.map((user) => { + return user.metadata.name; + }) || []; + } else { + selectedUserNames.value.length = 0; + } +}; + const handleOpenCreateModal = (user: User) => { selectedUser.value = user; editingModal.value = true; @@ -154,21 +224,23 @@ onMounted(() => { >
- 设置 - 删除 + + 删除 +
@@ -276,12 +348,14 @@ onMounted(() => {
  • - + @@ -318,6 +392,11 @@ onMounted(() => {
+ + + @@ -325,6 +404,7 @@ onMounted(() => {