From fa7ba83ec4163c052908819baff54af145bf26ec Mon Sep 17 00:00:00 2001 From: Hinam Mehra Date: Thu, 11 Jan 2024 13:24:16 +1100 Subject: [PATCH 1/3] Update front-end to create instance-level custom roles - Remove group-selector from roles-and-permissions Vue component - Add an instance-level GraphQL query to fetch instance-level custom roles when group-path isn't present Changelog: added EE: true --- .../roles_and_permissions/index.js | 6 +- .../settings/roles_and_permissions/index.js | 6 +- .../components/create_member_role.vue | 11 ++- .../components/list_member_roles.vue | 37 +++---- .../components/roles_and_permissions.vue | 34 +------ .../instance_member_roles.query.graphql | 7 ++ .../roles_and_permissions/index.js | 4 +- .../components/create_member_role_spec.js | 61 +++++++++++- .../components/list_member_roles_spec.js | 99 ++++++++++++++----- .../components/roles_and_permissions_spec.js | 28 +----- .../roles_and_permissions/mock_data.js | 28 ++++++ locale/gitlab.pot | 8 +- 12 files changed, 195 insertions(+), 134 deletions(-) create mode 100644 ee/app/assets/javascripts/roles_and_permissions/graphql/instance_member_roles.query.graphql diff --git a/ee/app/assets/javascripts/pages/admin/application_settings/roles_and_permissions/index.js b/ee/app/assets/javascripts/pages/admin/application_settings/roles_and_permissions/index.js index 6788140c19839b..a36c2808700e45 100644 --- a/ee/app/assets/javascripts/pages/admin/application_settings/roles_and_permissions/index.js +++ b/ee/app/assets/javascripts/pages/admin/application_settings/roles_and_permissions/index.js @@ -1,7 +1,3 @@ import { initRolesAndPermissions } from 'ee/roles_and_permissions'; -import { s__ } from '~/locale'; -initRolesAndPermissions({ - emptyText: s__(`MemberRole|To add a new role select a group and then 'Add new role'.`), - showGroupSelector: true, -}); +initRolesAndPermissions(); diff --git a/ee/app/assets/javascripts/pages/groups/settings/roles_and_permissions/index.js b/ee/app/assets/javascripts/pages/groups/settings/roles_and_permissions/index.js index b7f090b2296529..a36c2808700e45 100644 --- a/ee/app/assets/javascripts/pages/groups/settings/roles_and_permissions/index.js +++ b/ee/app/assets/javascripts/pages/groups/settings/roles_and_permissions/index.js @@ -1,7 +1,3 @@ import { initRolesAndPermissions } from 'ee/roles_and_permissions'; -import { s__ } from '~/locale'; -initRolesAndPermissions({ - emptyText: s__(`MemberRole|To add a new role select 'Add new role'.`), - showGroupSelector: false, -}); +initRolesAndPermissions(); diff --git a/ee/app/assets/javascripts/roles_and_permissions/components/create_member_role.vue b/ee/app/assets/javascripts/roles_and_permissions/components/create_member_role.vue index 54f6c8a107fb59..59b7f448b1e43a 100644 --- a/ee/app/assets/javascripts/roles_and_permissions/components/create_member_role.vue +++ b/ee/app/assets/javascripts/roles_and_permissions/components/create_member_role.vue @@ -13,7 +13,8 @@ import { import { createAlert } from '~/alert'; import { sprintf, s__ } from '~/locale'; import { ACCESS_LEVEL_GUEST_INTEGER, ACCESS_LEVEL_LABELS } from '~/access_level/constants'; -import memberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import groupMemberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import instanceMemberRolesQuery from '../graphql/instance_member_roles.query.graphql'; import createMemberRoleMutation from '../graphql/create_member_role.mutation.graphql'; // Base roles with Guest access or higher. @@ -39,7 +40,8 @@ export default { props: { groupFullPath: { type: String, - required: true, + required: false, + default: null, }, availablePermissions: { type: Array, @@ -63,6 +65,9 @@ export default { baseRoleUppercase() { return ACCESS_LEVEL_LABELS[this.baseRole].toUpperCase(); }, + refetchMemberRolesQuery() { + return this.groupFullPath ? groupMemberRolesQuery : instanceMemberRolesQuery; + }, }, methods: { validateFields() { @@ -88,7 +93,7 @@ export default { mutation: createMemberRoleMutation, refetchQueries: [ { - query: memberRolesQuery, + query: this.refetchMemberRolesQuery, variables: { fullPath: this.groupFullPath }, }, ], diff --git a/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue b/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue index e044836c92cf37..03acda380466be 100644 --- a/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue +++ b/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue @@ -5,7 +5,8 @@ import { createAlert } from '~/alert'; import { sprintf, s__, __ } from '~/locale'; import { TYPENAME_MEMBER_ROLE } from '~/graphql_shared/constants'; import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; -import memberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import groupMemberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import instanceMemberRolesQuery from '../graphql/instance_member_roles.query.graphql'; import memberRolePermissionsQuery from '../graphql/member_role_permissions.query.graphql'; import deleteMemberRoleMutation from '../graphql/delete_member_role.mutation.graphql'; import CreateMemberRole from './create_member_role.vue'; @@ -23,14 +24,14 @@ export default { addNewRole: s__('MemberRole|Add new role'), cardTitle: s__('MemberRole|Custom roles'), deleteRole: s__('MemberRole|Delete role'), - emptyTitle: s__('MemberRole|No custom roles for this group'), + emptyTitle: s__('MemberRole|No custom roles found'), + emptyDescription: s__(`MemberRole|To add a new role select 'Add new role'.`), fetchRolesError: s__('MemberRole|Failed to fetch roles: %{message}'), fetchPermissionsError: s__('MemberRole|Could not fetch available permissions: %{message}'), deleteSuccess: s__('MemberRole|Role successfully deleted.'), deleteError: s__('MemberRole|Failed to delete the role.'), deleteErrorWithReason: s__('MemberRole|Failed to delete the role: %{message}'), createSuccess: s__('MemberRole|Role successfully created.'), - licenseError: s__('MemberRole|Make sure the group is in the Ultimate tier.'), }, components: { CreateMemberRole, @@ -42,11 +43,6 @@ export default { GlTable, }, props: { - emptyText: { - type: String, - required: false, - default: null, - }, groupFullPath: { type: String, required: false, @@ -64,16 +60,19 @@ export default { }, apollo: { memberRoles: { - query: memberRolesQuery, + query() { + return this.fetchMemberRolesQuery; + }, variables() { return { fullPath: this.groupFullPath, }; }, update(data) { - const memberRoles = data?.namespace?.memberRoles?.nodes || []; + const memberRoles = this.groupFullPath ? data?.namespace?.memberRoles : data?.memberRoles; + const nodes = memberRoles?.nodes || []; - return memberRoles.map(({ id, name, baseAccessLevel, enabledPermissions }) => ({ + return nodes.map(({ id, name, baseAccessLevel, enabledPermissions }) => ({ name, id: getIdFromGraphQLId(id), baseAccessLevel: capitalize(baseAccessLevel.stringValue), @@ -85,9 +84,6 @@ export default { message: sprintf(this.$options.i18n.fetchRolesError, { message }), }); }, - skip() { - return !this.groupFullPath; - }, }, availablePermissions: { query: memberRolePermissionsQuery, @@ -102,6 +98,9 @@ export default { }, }, computed: { + fetchMemberRolesQuery() { + return this.groupFullPath ? groupMemberRolesQuery : instanceMemberRolesQuery; + }, isLoading() { return ( this.$apollo.queries.memberRoles.loading || @@ -112,11 +111,6 @@ export default { return this.memberRoleToDelete !== null; }, }, - watch: { - groupFullPath() { - this.$apollo.queries.memberRoles.refetch(); - }, - }, methods: { async deleteMemberRole() { this.alert?.dismiss(); @@ -124,7 +118,7 @@ export default { this.$apollo .mutate({ mutation: deleteMemberRoleMutation, - refetchQueries: [memberRolesQuery], + refetchQueries: [this.fetchMemberRolesQuery], variables: { input: { id: convertToGraphQLId(TYPENAME_MEMBER_ROLE, this.memberRoleToDelete), @@ -197,7 +191,6 @@ export default {
diff --git a/ee/app/assets/javascripts/roles_and_permissions/components/roles_and_permissions.vue b/ee/app/assets/javascripts/roles_and_permissions/components/roles_and_permissions.vue index 569e01e18ccf0d..13c2374fa3495c 100644 --- a/ee/app/assets/javascripts/roles_and_permissions/components/roles_and_permissions.vue +++ b/ee/app/assets/javascripts/roles_and_permissions/components/roles_and_permissions.vue @@ -1,54 +1,22 @@ diff --git a/ee/app/assets/javascripts/roles_and_permissions/graphql/instance_member_roles.query.graphql b/ee/app/assets/javascripts/roles_and_permissions/graphql/instance_member_roles.query.graphql new file mode 100644 index 00000000000000..1e0ad7f352e3b0 --- /dev/null +++ b/ee/app/assets/javascripts/roles_and_permissions/graphql/instance_member_roles.query.graphql @@ -0,0 +1,7 @@ +#import "ee/invite_members/graphql/fragments/member_roles.fragment.graphql" + +query getInstanceMemberRoles { + memberRoles { + ...MemberRoles + } +} diff --git a/ee/app/assets/javascripts/roles_and_permissions/index.js b/ee/app/assets/javascripts/roles_and_permissions/index.js index fa48bdae26adb9..c1f4076d38f650 100644 --- a/ee/app/assets/javascripts/roles_and_permissions/index.js +++ b/ee/app/assets/javascripts/roles_and_permissions/index.js @@ -7,7 +7,7 @@ import RolesAndPermissions from './components/roles_and_permissions.vue'; Vue.use(GlToast); Vue.use(VueApollo); -export const initRolesAndPermissions = ({ emptyText, showGroupSelector }) => { +export const initRolesAndPermissions = () => { const apolloProvider = new VueApollo({ defaultClient: createDefaultClient(), }); @@ -24,7 +24,7 @@ export const initRolesAndPermissions = ({ emptyText, showGroupSelector }) => { name: 'RolesAndPermissionsRoot', render(h) { return h(RolesAndPermissions, { - props: { groupFullPath: el.dataset.groupFullPath, emptyText, showGroupSelector }, + props: { groupFullPath: el.dataset.groupFullPath }, }); }, }); diff --git a/ee/spec/frontend/roles_and_permissions/components/create_member_role_spec.js b/ee/spec/frontend/roles_and_permissions/components/create_member_role_spec.js index 560f6e30bde831..2171e38653ae11 100644 --- a/ee/spec/frontend/roles_and_permissions/components/create_member_role_spec.js +++ b/ee/spec/frontend/roles_and_permissions/components/create_member_role_spec.js @@ -3,13 +3,14 @@ import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; import { createAlert, VARIANT_DANGER } from '~/alert'; import createMockApollo from 'helpers/mock_apollo_helper'; -import memberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import groupMemberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import instanceMemberRolesQuery from 'ee/roles_and_permissions/graphql/instance_member_roles.query.graphql'; import createMemberRoleMutation from 'ee/roles_and_permissions/graphql/create_member_role.mutation.graphql'; import CreateMemberRole from 'ee/roles_and_permissions/components/create_member_role.vue'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; import { stubComponent } from 'helpers/stub_component'; -import { mockDefaultPermissions, mockMemberRoles } from '../mock_data'; +import { mockDefaultPermissions, mockMemberRoles, mockInstanceMemberRoles } from '../mock_data'; Vue.use(VueApollo); @@ -26,11 +27,14 @@ describe('CreateMemberRole', () => { const mutationSuccessHandler = jest .fn() .mockResolvedValue({ data: { memberRoleCreate: { errors: null, memberRole: { id: '1' } } } }); - const rolesSuccessQueryHandler = jest.fn().mockResolvedValue(mockMemberRoles); + + const groupRolesQueryHandler = jest.fn().mockResolvedValue(mockMemberRoles); + const instanceRolesQueryHandler = jest.fn().mockResolvedValue(mockInstanceMemberRoles); const createMockApolloProvider = (resolverMock) => { return createMockApollo([ - [memberRolesQuery, rolesSuccessQueryHandler], + [groupMemberRolesQuery, groupRolesQueryHandler], + [instanceMemberRolesQuery, instanceRolesQueryHandler], [createMemberRoleMutation, resolverMock], ]); }; @@ -39,11 +43,13 @@ describe('CreateMemberRole', () => { availablePermissions = mockDefaultPermissions, stubs = {}, mutationMock = mutationSuccessHandler, + props = {}, } = {}) => { wrapper = mountExtended(CreateMemberRole, { propsData: { groupFullPath: 'test-group', availablePermissions, + ...props, }, stubs, apolloProvider: createMockApolloProvider(mutationMock), @@ -144,7 +150,7 @@ describe('CreateMemberRole', () => { }); }); - describe('when successful submission', () => { + describe('when a group-level member-role is created successfully', () => { beforeEach(() => { createComponent(); fillForm(); @@ -173,6 +179,51 @@ describe('CreateMemberRole', () => { expect(wrapper.emitted('success')).toHaveLength(1); }); + + it('refetches roles', async () => { + findButtonSubmit().trigger('submit'); + await waitForPromises(); + + expect(groupRolesQueryHandler).toHaveBeenCalled(); + }); + }); + + describe('when an instance-level member-role is created successfully', () => { + beforeEach(() => { + createComponent({ props: { groupFullPath: null } }); + fillForm(); + }); + + it('sends the correct data', async () => { + findButtonSubmit().trigger('submit'); + await waitForPromises(); + + expect(mutationSuccessHandler).toHaveBeenCalledWith({ + input: { + baseAccessLevel: 'GUEST', + name: 'My role name', + description: 'My description', + permissions: ['READ_CODE'], + groupPath: null, + }, + }); + }); + + it('emits success event', async () => { + expect(wrapper.emitted('success')).toBeUndefined(); + + findButtonSubmit().trigger('submit'); + await waitForPromises(); + + expect(wrapper.emitted('success')).toHaveLength(1); + }); + + it('refetches roles', async () => { + findButtonSubmit().trigger('submit'); + await waitForPromises(); + + expect(instanceRolesQueryHandler).toHaveBeenCalled(); + }); }); describe('when there is an error creating the role', () => { diff --git a/ee/spec/frontend/roles_and_permissions/components/list_member_roles_spec.js b/ee/spec/frontend/roles_and_permissions/components/list_member_roles_spec.js index 7d4a0417ace7d9..a8153030addbfd 100644 --- a/ee/spec/frontend/roles_and_permissions/components/list_member_roles_spec.js +++ b/ee/spec/frontend/roles_and_permissions/components/list_member_roles_spec.js @@ -3,14 +3,20 @@ import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; import { createAlert } from '~/alert'; import createMockApollo from 'helpers/mock_apollo_helper'; -import memberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import groupMemberRolesQuery from 'ee/invite_members/graphql/queries/group_member_roles.query.graphql'; +import instanceMemberRolesQuery from 'ee/roles_and_permissions/graphql/instance_member_roles.query.graphql'; import memberRolePermissionsQuery from 'ee/roles_and_permissions/graphql/member_role_permissions.query.graphql'; import deleteMemberRoleMutation from 'ee/roles_and_permissions/graphql/delete_member_role.mutation.graphql'; import CreateMemberRole from 'ee/roles_and_permissions/components/create_member_role.vue'; import ListMemberRoles from 'ee/roles_and_permissions/components/list_member_roles.vue'; import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { mockDefaultPermissions, mockPermissions, mockMemberRoles } from '../mock_data'; +import { + mockDefaultPermissions, + mockPermissions, + mockMemberRoles, + mockInstanceMemberRoles, +} from '../mock_data'; Vue.use(VueApollo); @@ -26,7 +32,8 @@ describe('ListMemberRoles', () => { let wrapper; const mockToastShow = jest.fn(); - const rolesSuccessQueryHandler = jest.fn().mockResolvedValue(mockMemberRoles); + const groupRolesSuccessQueryHandler = jest.fn().mockResolvedValue(mockMemberRoles); + const instanceRolesSuccessQueryHandler = jest.fn().mockResolvedValue(mockInstanceMemberRoles); const permissionsSuccessQueryHandler = jest.fn().mockResolvedValue(mockPermissions); const deleteMutationSuccessHandler = jest .fn() @@ -36,19 +43,22 @@ describe('ListMemberRoles', () => { const createComponent = ({ mountFn = shallowMountExtended, - rolesQueryHandler = rolesSuccessQueryHandler, + groupRolesQueryHandler = groupRolesSuccessQueryHandler, + instanceRolesQueryHandler = instanceRolesSuccessQueryHandler, permissionsQueryHandler = permissionsSuccessQueryHandler, deleteMutationHandler = deleteMutationSuccessHandler, + props = {}, } = {}) => { wrapper = mountFn(ListMemberRoles, { apolloProvider: createMockApollo([ - [memberRolesQuery, rolesQueryHandler], + [groupMemberRolesQuery, groupRolesQueryHandler], + [instanceMemberRolesQuery, instanceRolesQueryHandler], [memberRolePermissionsQuery, permissionsQueryHandler], [deleteMemberRoleMutation, deleteMutationHandler], ]), propsData: { - emptyText: 'mock text', groupFullPath: 'test-group', + ...props, }, stubs: { GlCard, GlTable }, mocks: { @@ -86,11 +96,6 @@ describe('ListMemberRoles', () => { expect(findAddRoleButton().props('disabled')).toBe(false); - expect(findEmptyState().props()).toMatchObject({ - description: 'mock text', - title: 'No custom roles for this group', - }); - expect(findCreateMemberRole().exists()).toBe(false); }); @@ -102,7 +107,7 @@ describe('ListMemberRoles', () => { }); }); - describe('member roles', () => { + describe('group-level member roles', () => { beforeEach(() => { createComponent(); }); @@ -110,34 +115,43 @@ describe('ListMemberRoles', () => { it('fetches member roles', async () => { await waitForPromises(); - expect(rolesSuccessQueryHandler).toHaveBeenCalledWith({ + expect(groupRolesSuccessQueryHandler).toHaveBeenCalledWith({ fullPath: 'test-group', }); }); - describe('when groupFullPath is updated', () => { + describe('when there is an error fetching roles', () => { beforeEach(() => { - wrapper.setProps({ groupFullPath: 'another-test-group' }); - }); - - it('sets the `busy` attribute on the table to true', () => { - expect(findTable().attributes('busy')).toBe('true'); + createComponent({ groupRolesQueryHandler: failedQueryHandler }); }); - it('refetches member roles', async () => { + it('shows alert when there is an error', async () => { await waitForPromises(); - expect(rolesSuccessQueryHandler).toHaveBeenCalledWith({ - fullPath: 'another-test-group', + expect(createAlert).toHaveBeenCalledWith({ + message: 'Failed to fetch roles: GraphQL error', }); - - expect(findTable().attributes('busy')).toBeUndefined(); }); }); + }); + + describe('instance-level member roles', () => { + beforeEach(() => { + createComponent({ props: { groupFullPath: null } }); + }); + + it('fetches member roles', async () => { + await waitForPromises(); + + expect(instanceRolesSuccessQueryHandler).toHaveBeenCalled(); + }); describe('when there is an error fetching roles', () => { beforeEach(() => { - createComponent({ rolesQueryHandler: failedQueryHandler }); + createComponent({ + props: { groupFullPath: null }, + instanceRolesQueryHandler: failedQueryHandler, + }); }); it('shows alert when there is an error', async () => { @@ -246,7 +260,40 @@ describe('ListMemberRoles', () => { }); it('refetches roles', () => { - expect(rolesSuccessQueryHandler).toHaveBeenCalled(); + expect(groupRolesSuccessQueryHandler).toHaveBeenCalledTimes(2); + }); + }); + + describe('deleting instance-level member role', () => { + beforeEach(() => { + createComponent({ mountFn: mountExtended, props: { groupFullPath: null } }); + return waitForPromises(); + }); + + describe('when the role is deleted successfully', () => { + beforeEach(async () => { + findButtonByText('Delete role').trigger('click'); + await nextTick(); + + findModal().vm.$emit('primary'); + await waitForPromises(); + }); + + it('delete the role', () => { + expect(deleteMutationSuccessHandler).toHaveBeenCalledWith({ + input: { + id: 'gid://gitlab/MemberRole/2', + }, + }); + }); + + it('shows toast', () => { + expect(mockToastShow).toHaveBeenCalledWith('Role successfully deleted.'); + }); + + it('refetches roles', () => { + expect(instanceRolesSuccessQueryHandler).toHaveBeenCalledTimes(2); + }); }); }); diff --git a/ee/spec/frontend/roles_and_permissions/components/roles_and_permissions_spec.js b/ee/spec/frontend/roles_and_permissions/components/roles_and_permissions_spec.js index 23fceeeafe5656..42f80e71526947 100644 --- a/ee/spec/frontend/roles_and_permissions/components/roles_and_permissions_spec.js +++ b/ee/spec/frontend/roles_and_permissions/components/roles_and_permissions_spec.js @@ -1,46 +1,22 @@ import { shallowMount } from '@vue/test-utils'; -import { nextTick } from 'vue'; -import GroupSelect from '~/vue_shared/components/entity_select/group_select.vue'; import ListMemberRoles from 'ee/roles_and_permissions/components/list_member_roles.vue'; import RolesAndPermissions from 'ee/roles_and_permissions/components/roles_and_permissions.vue'; describe('RolesAndPermissionsSaas', () => { let wrapper; - const createComponent = ({ showGroupSelector = true } = {}) => { + const createComponent = () => { wrapper = shallowMount(RolesAndPermissions, { - propsData: { groupFullPath: 'test-group', emptyText: 'empty', showGroupSelector }, + propsData: { groupFullPath: 'test-group' }, }); }; - const findGroupSelect = () => wrapper.findComponent(GroupSelect); const findListMemberRoles = () => wrapper.findComponent(ListMemberRoles); - it.each([true, false])( - 'shows/hides the group selector when showGroupSelector is %s', - (showGroupSelector) => { - createComponent({ showGroupSelector }); - - expect(findGroupSelect().exists()).toBe(showGroupSelector); - }, - ); - - it('updates the group ID when group selector is changed', async () => { - createComponent(); - - expect(findListMemberRoles().props('groupFullPath')).toBe('test-group'); - - findGroupSelect().vm.$emit('input', { full_path: 'another-test-group' }); - await nextTick(); - - expect(findListMemberRoles().props('groupFullPath')).toBe('another-test-group'); - }); - it('shows the ListMemberRoles component with the expected props', () => { createComponent(); expect(findListMemberRoles().props()).toMatchObject({ groupFullPath: 'test-group', - emptyText: 'empty', }); }); }); diff --git a/ee/spec/frontend/roles_and_permissions/mock_data.js b/ee/spec/frontend/roles_and_permissions/mock_data.js index 6496847e18f6d3..8dd553a0dddff3 100644 --- a/ee/spec/frontend/roles_and_permissions/mock_data.js +++ b/ee/spec/frontend/roles_and_permissions/mock_data.js @@ -47,3 +47,31 @@ export const mockMemberRoles = { }, }, }; + +export const mockInstanceMemberRoles = { + data: { + memberRoles: { + nodes: [ + { + baseAccessLevel: { + integerValue: 10, + stringValue: 'GUEST', + __typename: 'AccessLevel', + }, + id: 'gid://gitlab/MemberRole/2', + name: 'Instance Test', + enabledPermissions: { + nodes: [ + { + name: 'Admin group', + value: 'ADMIN_GROUP', + }, + ], + }, + __typename: 'MemberRole', + }, + ], + __typename: 'MemberRoleConnection', + }, + }, +}; diff --git a/locale/gitlab.pot b/locale/gitlab.pot index e262305d5be860..b28e994cc70350 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -30035,13 +30035,10 @@ msgstr "" msgid "MemberRole|Incident manager" msgstr "" -msgid "MemberRole|Make sure the group is in the Ultimate tier." -msgstr "" - msgid "MemberRole|Name" msgstr "" -msgid "MemberRole|No custom roles for this group" +msgid "MemberRole|No custom roles found" msgstr "" msgid "MemberRole|Permissions" @@ -30065,9 +30062,6 @@ msgstr "" msgid "MemberRole|To add a new role select 'Add new role'." msgstr "" -msgid "MemberRole|To add a new role select a group and then 'Add new role'." -msgstr "" - msgid "MemberRole|To delete the custom role make sure no group member has this custom role" msgstr "" -- GitLab From 4e79e0be2c80dc0ae2b16f7bf9d6663e7fce2515 Mon Sep 17 00:00:00 2001 From: Hinam Mehra Date: Thu, 18 Jan 2024 17:32:14 +1100 Subject: [PATCH 2/3] Delete RolesAndPermissions Vue component since it's redunant --- .../components/list_member_roles.vue | 6 ++++- .../components/roles_and_permissions.vue | 22 ------------------- .../roles_and_permissions/index.js | 4 ++-- .../components/roles_and_permissions_spec.js | 22 ------------------- 4 files changed, 7 insertions(+), 47 deletions(-) delete mode 100644 ee/app/assets/javascripts/roles_and_permissions/components/roles_and_permissions.vue delete mode 100644 ee/spec/frontend/roles_and_permissions/components/roles_and_permissions_spec.js diff --git a/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue b/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue index 03acda380466be..e1544edc37838b 100644 --- a/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue +++ b/ee/app/assets/javascripts/roles_and_permissions/components/list_member_roles.vue @@ -181,7 +181,11 @@ export default {