diff options
Diffstat (limited to 'app/assets/javascripts/members/components/table/members_table.vue')
-rw-r--r-- | app/assets/javascripts/members/components/table/members_table.vue | 87 |
1 files changed, 79 insertions, 8 deletions
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue index debc3fc31f6..202f3aa89e1 100644 --- a/app/assets/javascripts/members/components/table/members_table.vue +++ b/app/assets/javascripts/members/components/table/members_table.vue @@ -5,12 +5,17 @@ import MembersTableCell from 'ee_else_ce/members/components/table/members_table_ import { canOverride, canRemove, canResend, canUpdate } from 'ee_else_ce/members/utils'; import { mergeUrlParams } from '~/lib/utils/url_utility'; import initUserPopovers from '~/user_popovers'; -import { FIELDS, ACTIVE_TAB_QUERY_PARAM_NAME } from '../../constants'; +import { + FIELDS, + ACTIVE_TAB_QUERY_PARAM_NAME, + MEMBER_STATE_AWAITING, + USER_STATE_BLOCKED_PENDING_APPROVAL, + BADGE_LABELS_PENDING_OWNER_APPROVAL, +} from '../../constants'; import RemoveGroupLinkModal from '../modals/remove_group_link_modal.vue'; import RemoveMemberModal from '../modals/remove_member_modal.vue'; import CreatedAt from './created_at.vue'; import ExpirationDatepicker from './expiration_datepicker.vue'; -import ExpiresAt from './expires_at.vue'; import MemberActionButtons from './member_action_buttons.vue'; import MemberAvatar from './member_avatar.vue'; import MemberSource from './member_source.vue'; @@ -24,7 +29,6 @@ export default { GlPagination, MemberAvatar, CreatedAt, - ExpiresAt, MembersTableCell, MemberSource, MemberActionButtons, @@ -131,6 +135,74 @@ export default { window.location.href, ); }, + /** + * Returns whether it's a new or existing user + * + * If memberInviteMetadata doesn't exist, it means we're adding an existing user + * to the Group/Project, so `isNewUser` should be false. + * If memberInviteMetadata exists but `userState` has content, + * the user has registered but is awaiting root approval + * + * @param {object} memberInviteMetadata - MemberEntity.invite + * @see {@link ~/app/serializers/member_entity.rb} + * @returns {boolean} + */ + isNewUser(memberInviteMetadata) { + return memberInviteMetadata && !memberInviteMetadata.userState; + }, + /** + * Returns whether the user is awaiting root approval + * + * This checks User.state exposed via MemberEntity + * + * @param {object} memberInviteMetadata - MemberEntity.invite + * @see {@link ~/app/serializers/member_entity.rb} + * @returns {boolean} + */ + isUserPendingRootApproval(memberInviteMetadata) { + return memberInviteMetadata?.userState === USER_STATE_BLOCKED_PENDING_APPROVAL; + }, + /** + * Returns whether the member is awaiting owner approval + * + * This checks Member.state exposed via MemberEntity + * + * @param {Number} memberState - Member.state exposed via MemberEntity.state + * @see {@link ~/ee/app/models/ee/member.rb} + * @see {@link ~/app/serializers/member_entity.rb} + * @returns {boolean} + */ + isMemberPendingOwnerApproval(memberState) { + return memberState === MEMBER_STATE_AWAITING; + }, + isUserAwaiting(memberInviteMetadata, memberState) { + return ( + this.isUserPendingRootApproval(memberInviteMetadata) || + this.isMemberPendingOwnerApproval(memberState) + ); + }, + shouldAddPendingOwnerApprovalBadge(memberInviteMetadata, memberState) { + return ( + this.isUserAwaiting(memberInviteMetadata, memberState) && + !this.isNewUser(memberInviteMetadata) + ); + }, + /** + * Returns the string to be used in the invite badge + * + * @param {object} memberInviteMetadata - MemberEntity.invite + * @see {@link ~/app/serializers/member_entity.rb} + * @param {Number} memberState - Member.state exposed via MemberEntity.state + * @see {@link ~/ee/app/models/ee/member.rb} + * @returns {string} + */ + inviteBadge(memberInviteMetadata, memberState) { + if (this.shouldAddPendingOwnerApprovalBadge(memberInviteMetadata, memberState)) { + return BADGE_LABELS_PENDING_OWNER_APPROVAL; + } + + return ''; + }, }, }; </script> @@ -174,18 +246,17 @@ export default { <created-at :date="createdAt" :created-by="createdBy" /> </template> - <template #cell(invited)="{ item: { createdAt, createdBy } }"> + <template #cell(invited)="{ item: { createdAt, createdBy, invite, state } }"> <created-at :date="createdAt" :created-by="createdBy" /> + <gl-badge v-if="inviteBadge(invite, state)" data-testid="invited-badge">{{ + inviteBadge(invite, state) + }}</gl-badge> </template> <template #cell(requested)="{ item: { createdAt } }"> <created-at :date="createdAt" /> </template> - <template #cell(expires)="{ item: { expiresAt } }"> - <expires-at :date="expiresAt" /> - </template> - <template #cell(maxRole)="{ item: member }"> <members-table-cell #default="{ permissions }" :member="member"> <role-dropdown v-if="permissions.canUpdate" :permissions="permissions" :member="member" /> |