From c0bda31353d70b7c02d5795154a001ae92fb2828 Mon Sep 17 00:00:00 2001 From: xue jiahao Date: Mon, 16 Dec 2024 14:47:03 +0800 Subject: [PATCH] Add share manage dialog --- .../src/components/ShareDomain/RoleLabel.vue | 19 ++++++ .../ShareDomain/ShareDomainDialog.vue | 59 +++++++++++-------- .../ShareDomain/ShareManageDialog.vue | 56 ++++++++++++++++++ .../ShareDomain/ShareUsageDialog.vue | 56 ++++++++++++++++++ .../ShareDomain/SharingUserList.vue | 2 +- frontend/src/pages/TenantDomain.vue | 31 ++++++---- frontend/src/pages/UserDomain.vue | 5 +- 7 files changed, 190 insertions(+), 38 deletions(-) create mode 100644 frontend/src/components/ShareDomain/RoleLabel.vue create mode 100644 frontend/src/components/ShareDomain/ShareManageDialog.vue create mode 100644 frontend/src/components/ShareDomain/ShareUsageDialog.vue diff --git a/frontend/src/components/ShareDomain/RoleLabel.vue b/frontend/src/components/ShareDomain/RoleLabel.vue new file mode 100644 index 0000000..7f694de --- /dev/null +++ b/frontend/src/components/ShareDomain/RoleLabel.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/ShareDomain/ShareDomainDialog.vue b/frontend/src/components/ShareDomain/ShareDomainDialog.vue index 8922055..0cd5f55 100644 --- a/frontend/src/components/ShareDomain/ShareDomainDialog.vue +++ b/frontend/src/components/ShareDomain/ShareDomainDialog.vue @@ -2,7 +2,7 @@ - 「{{domain.name}}」のドメイン利用権限設定 + {{ dialogTitle }} @@ -23,7 +23,7 @@ @@ -38,18 +38,17 @@ {{scope.opt.email}}
- 所有者 +
- + @@ -74,16 +73,22 @@ import { IDomainOwnerDisplay } from '../../types/DomainTypes'; import { IUser, IUserDisplay } from '../../types/UserTypes'; import { api } from 'boot/axios'; import SharingUserList from 'components/ShareDomain/SharingUserList.vue'; +import RoleLabel from 'components/ShareDomain/RoleLabel.vue'; import { Dialog } from 'quasar' interface Props { modelValue: boolean; domain: IDomainOwnerDisplay; + dialogTitle: string; + userListTitle: string; + shareApi: (user: IUserDisplay, domain: IDomainOwnerDisplay) => Promise; + removeSharedApi: (user: IUserDisplay, domain: IDomainOwnerDisplay) => Promise; + getSharedApi: (domain: IDomainOwnerDisplay) => Promise; } interface IUserDisplayWithShareRole extends IUserDisplay { isRemoving: boolean; - role: number; // 2: 所有者,1: 管理者, 0: 利用者 + role: number; } const props = defineProps(); @@ -126,6 +131,9 @@ watch( loading.value = false; addLoading.value = false; if (newValue) { + if (Object.keys(allUsers.value).length == 0) { + await getUsers(); + } await loadShared(); } } @@ -167,10 +175,7 @@ const close = () => { const shareTo = async (user: IUserDisplayWithShareRole) => { addLoading.value = true; loading.value = true; - await api.post(`api/userdomain`, { - 'userid': user.id, - 'domainid': props.domain.id - }) + await props.shareApi(user, props.domain); await loadShared(); canSharedUserFilter.value = undefined; loading.value = false; @@ -180,7 +185,7 @@ const shareTo = async (user: IUserDisplayWithShareRole) => { const removeShareTo = async (user: IUserDisplayWithShareRole) => { loading.value = true; user.isRemoving = true; - await api.delete(`api/domain/${props.domain.id}/${user.id}`) + await props.removeSharedApi(user, props.domain); await loadShared(); loading.value = false; }; @@ -189,10 +194,18 @@ const loadShared = async () => { loading.value = true; sharedUsersIdSet.clear(); - const { data } = await api.get(`/api/domainshareduser/${props.domain.id}`); + const { data } = await props.getSharedApi(props.domain); sharedUsers.value = data.data.map((item: IUser) => { const val = itemToDisplay(item); sharedUsersIdSet.add(val.id); + // for sort + if (isOwner(item.id)) { + val.role = 2; + } else if (isManager(item.id)) { + val.role = 1; + } else { + val.role = 0; + } return val; }).reverse().sort((a: IUserDisplayWithShareRole, b: IUserDisplayWithShareRole) => b.role - a.role); @@ -202,24 +215,21 @@ const loadShared = async () => { loading.value = false; } -onMounted(async () => { - await getUsers(); -}) +function isOwner(userId: number) { + return userId === props.domain?.owner?.id +} + +function isManager(userId: number) { + return false // TODO +} const getUsers = async () => { - if (Object.keys(allUsers.value).length > 0) { - return; - } loading.value = true; const result = await api.get(`api/v1/users`); allUsers.value = result.data.data.map(itemToDisplay); loading.value = false; } -function isOwner(userId: number) { - return userId === props.domain.owner.id -} - const itemToDisplay = (item: IUser) => { return { id: item.id, @@ -230,9 +240,10 @@ const itemToDisplay = (item: IUser) => { email: item.email, isSuperuser: item.is_superuser, isActive: item.is_active, - role: isOwner(item.id) ? 2 : 0, // TODO + role: 0, } as IUserDisplayWithShareRole } +