diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-13 15:12:20 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-13 15:12:20 +0300 |
commit | 429a0c87c1f36ff9ebfe131ebb6c71a83d9f917c (patch) | |
tree | ffe9ecb8fc29c6fd9aaeef295bd92d3da3d0a312 /app/assets/javascripts/members | |
parent | bc2f7ab125361e4180018b1b933f42a8709df356 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/members')
-rw-r--r-- | app/assets/javascripts/members/components/table/members_table.vue | 81 | ||||
-rw-r--r-- | app/assets/javascripts/members/constants.js | 16 |
2 files changed, 95 insertions, 2 deletions
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue index 3caecdd1d4b..202f3aa89e1 100644 --- a/app/assets/javascripts/members/components/table/members_table.vue +++ b/app/assets/javascripts/members/components/table/members_table.vue @@ -5,7 +5,13 @@ 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'; @@ -129,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> @@ -172,8 +246,11 @@ 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 } }"> diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js index 54d4442d5ce..f5ca881ab0d 100644 --- a/app/assets/javascripts/members/constants.js +++ b/app/assets/javascripts/members/constants.js @@ -89,6 +89,22 @@ export const TAB_QUERY_PARAM_VALUES = { accessRequest: 'access_requests', }; +/** + * This user state value comes from the User model + * see the state machine in app/models/user.rb + */ +export const USER_STATE_BLOCKED_PENDING_APPROVAL = 'blocked_pending_approval'; + +/** + * This and following member state constants' values + * come from ee/app/models/ee/member.rb + */ +export const MEMBER_STATE_CREATED = 0; +export const MEMBER_STATE_AWAITING = 1; +export const MEMBER_STATE_ACTIVE = 2; + +export const BADGE_LABELS_PENDING_OWNER_APPROVAL = __('Pending owner approval'); + export const DAYS_TO_EXPIRE_SOON = 7; export const LEAVE_MODAL_ID = 'member-leave-modal'; |