add useSettingsMembersActions composable

This commit is contained in:
andrewwallacespeckle
2025-03-27 11:41:31 +00:00
parent 6798ca79fc
commit 83c8d3afbe
2 changed files with 74 additions and 65 deletions
@@ -66,13 +66,14 @@
</template>
<script setup lang="ts">
import { Roles, SeatTypes, type MaybeNullOrUndefined } from '@speckle/shared'
import { Roles, type MaybeNullOrUndefined } from '@speckle/shared'
import { EllipsisHorizontalIcon, XMarkIcon } from '@heroicons/vue/24/outline'
import type { LayoutMenuItem } from '~~/lib/layout/helpers/components'
import { HorizontalDirection } from '~~/lib/common/composables/window'
import { WorkspaceUserActionTypes } from '~/lib/settings/helpers/types'
import type { UserItem } from '~/components/settings/workspaces/members/new/MembersTable.vue'
import { useActiveUser } from '~/lib/auth/composables/activeUser'
import { useSettingsMembersActions } from '~/lib/settings/composables/menu'
import type {
SettingsWorkspacesMembersNewGuestsTable_WorkspaceFragment,
SettingsWorkspacesNewMembersTable_WorkspaceFragment
@@ -99,69 +100,20 @@ const isActiveUserTargetUser = computed(
() => activeUser.value?.id === props.targetUser.id
)
// Computed properties for each action's visibility
const canMakeAdmin = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.role === Roles.Workspace.Member
)
})
const canRemoveAdmin = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.role === Roles.Workspace.Admin
)
})
const canMakeGuest = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.role !== Roles.Workspace.Guest
)
})
const canMakeMember = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.role === Roles.Workspace.Guest
)
})
const canUpgradeEditor = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.seatType === SeatTypes.Viewer
)
})
const canDowngradeEditor = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.seatType === SeatTypes.Editor
)
})
const canRemoveFromWorkspace = computed(() => {
return (
isActiveUserWorkspaceAdmin.value &&
!isActiveUserTargetUser.value &&
props.targetUser.role !== Roles.Workspace.Admin
)
})
const canLeaveWorkspace = computed(() => {
return isActiveUserTargetUser.value
})
const canResignAdmin = computed(() => {
return isActiveUserTargetUser.value && isActiveUserWorkspaceAdmin.value
const {
canMakeAdmin,
canRemoveAdmin,
canMakeGuest,
canMakeMember,
canUpgradeEditor,
canDowngradeEditor,
canRemoveFromWorkspace,
canLeaveWorkspace,
canResignAdmin
} = useSettingsMembersActions({
isActiveUserWorkspaceAdmin: isActiveUserWorkspaceAdmin.value,
isActiveUserTargetUser: isActiveUserTargetUser.value,
targetUser: props.targetUser
})
const isOnlyAdmin = computed(() => {
@@ -3,7 +3,8 @@ import type {
WorkspaceSettingsMenuItem
} from '~/lib/settings/helpers/types'
import { useIsMultipleEmailsEnabled } from '~/composables/globals'
import { Roles } from '@speckle/shared'
import { Roles, SeatTypes } from '@speckle/shared'
import type { UserItem } from '~/components/settings/workspaces/members/new/MembersTable.vue'
import { useIsMultiregionEnabled } from '~/lib/multiregion/composables/main'
import { graphql } from '~/lib/common/generated/gql'
import {
@@ -136,3 +137,59 @@ export const useSettingsMenuState = () =>
}>('settings-menu-state', () => ({
previousRoute: undefined
}))
export const useSettingsMembersActions = (props: {
isActiveUserWorkspaceAdmin: boolean
isActiveUserTargetUser: boolean
targetUser: UserItem
}) => {
const canModifyUser = computed(
() => props.isActiveUserWorkspaceAdmin && !props.isActiveUserTargetUser
)
const canMakeAdmin = computed(
() => canModifyUser.value && props.targetUser.role === Roles.Workspace.Member
)
const canRemoveAdmin = computed(
() => canModifyUser.value && props.targetUser.role === Roles.Workspace.Admin
)
const canMakeGuest = computed(
() => canModifyUser.value && props.targetUser.role !== Roles.Workspace.Guest
)
const canMakeMember = computed(
() => canModifyUser.value && props.targetUser.role === Roles.Workspace.Guest
)
const canUpgradeEditor = computed(
() => canModifyUser.value && props.targetUser.seatType === SeatTypes.Viewer
)
const canDowngradeEditor = computed(
() => canModifyUser.value && props.targetUser.seatType === SeatTypes.Editor
)
const canRemoveFromWorkspace = computed(
() => canModifyUser.value && props.targetUser.role !== Roles.Workspace.Admin
)
const canLeaveWorkspace = computed(() => props.isActiveUserTargetUser)
const canResignAdmin = computed(
() => props.isActiveUserTargetUser && props.isActiveUserWorkspaceAdmin
)
return {
canMakeAdmin,
canRemoveAdmin,
canMakeGuest,
canMakeMember,
canUpgradeEditor,
canDowngradeEditor,
canRemoveFromWorkspace,
canLeaveWorkspace,
canResignAdmin
}
}