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 64274640c8bd45a8c79337dfcbd81a25daee3400..6788140c19839b841cdc789b76dc9df7ac3cd00d 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,4 +1,7 @@ import { initRolesAndPermissions } from 'ee/roles_and_permissions'; -import { I18N_EMPTY_TEXT_ADMIN } from 'ee/roles_and_permissions/constants'; +import { s__ } from '~/locale'; -initRolesAndPermissions({ emptyText: I18N_EMPTY_TEXT_ADMIN, showGroupSelector: true }); +initRolesAndPermissions({ + emptyText: s__(`MemberRole|To add a new role select a group and then 'Add new role'.`), + showGroupSelector: true, +}); 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 15c3564518de64d730bf30e92bbe9bd53b8601b5..b7f090b22965297daf94aac7b8e5d3e2a545a36e 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,4 +1,7 @@ import { initRolesAndPermissions } from 'ee/roles_and_permissions'; -import { I18N_EMPTY_TEXT_GROUP } from 'ee/roles_and_permissions/constants'; +import { s__ } from '~/locale'; -initRolesAndPermissions({ emptyText: I18N_EMPTY_TEXT_GROUP, showGroupSelector: false }); +initRolesAndPermissions({ + emptyText: s__(`MemberRole|To add a new role select 'Add new role'.`), + showGroupSelector: false, +}); 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 be47e721b7d342c2ce5bbe2db14fa1004a28733f..5c700402f21c4c883dec13e49f32965cf5dfaa9d 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 @@ -3,28 +3,20 @@ import { GlBadge, GlButton, GlCard, GlEmptyState, GlModal, GlTable } from '@gitl import { keyBy } from 'lodash'; import { deleteMemberRole, getMemberRoles } from 'ee/rest_api'; import { ACCESS_LEVEL_LABELS } from '~/access_level/constants'; -import { createAlert, VARIANT_DANGER } from '~/alert'; +import { createAlert } from '~/alert'; import { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status'; -import { sprintf } from '~/locale'; -import { - FIELDS, - I18N_ADD_NEW_ROLE, - I18N_CANCEL, - I18N_CARD_TITLE, - I18N_CREATION_SUCCESS, - I18N_DELETE_ROLE, - I18N_DELETION_ERROR, - I18N_DELETION_SUCCESS, - I18N_EMPTY_TITLE, - I18N_FETCH_ERROR, - I18N_LICENSE_ERROR, - I18N_MODAL_TITLE, - I18N_MODAL_WARNING, - I18N_MEMBER_ROLE_PERMISSIONS_QUERY_ERROR, -} from '../constants'; +import { sprintf, s__, __ } from '~/locale'; import memberRolePermissionsQuery from '../graphql/member_role_permissions.query.graphql'; import CreateMemberRole from './create_member_role.vue'; +export const FIELDS = [ + { key: 'name', label: s__('MemberRole|Name'), sortable: true }, + { key: 'id', label: s__('MemberRole|ID'), sortable: true }, + { key: 'base_access_level', label: s__('MemberRole|Base role'), sortable: true }, + { key: 'permissions', label: s__('MemberRole|Permissions') }, + { key: 'actions', label: s__('MemberRole|Actions') }, +]; + export default { components: { CreateMemberRole, @@ -58,14 +50,14 @@ export default { }; }, apollo: { - memberRolePermissions: { + availablePermissions: { query: memberRolePermissionsQuery, update({ memberRolePermissions }) { - this.availablePermissions = memberRolePermissions.nodes; + return memberRolePermissions.nodes; }, error({ message }) { this.alert = createAlert({ - message: sprintf(I18N_MEMBER_ROLE_PERMISSIONS_QUERY_ERROR, { message }), + message: sprintf(this.$options.i18n.fetchPermissionsError, { message }), }); }, }, @@ -92,12 +84,11 @@ export default { try { await deleteMemberRole(this.groupId, this.memberRoleToDelete); - this.$toast.show(I18N_DELETION_SUCCESS); + this.$toast.show(this.$options.i18n.deleteSuccess); this.fetchMemberRoles(this.groupId); } catch (error) { this.alert = createAlert({ - message: error.response?.data?.message || I18N_DELETION_ERROR, - variant: VARIANT_DANGER, + message: error.response?.data?.message || this.$options.i18n.deleteError, }); } finally { this.memberRoleToDelete = null; @@ -118,14 +109,10 @@ export default { } catch (error) { this.memberRoles = []; if (error?.response?.status === HTTP_STATUS_NOT_FOUND) { - this.alert = createAlert({ - message: I18N_LICENSE_ERROR, - variant: VARIANT_DANGER, - }); + this.alert = createAlert({ message: this.$options.i18n.licenseError }); } else { this.alert = createAlert({ - message: error?.response?.data?.message || I18N_FETCH_ERROR, - variant: VARIANT_DANGER, + message: error?.response?.data?.message || this.$options.i18n.fetchRolesError, }); } } finally { @@ -148,7 +135,7 @@ export default { return ACCESS_LEVEL_LABELS[value]; }, onCreatedMemberRole() { - this.$toast.show(I18N_CREATION_SUCCESS); + this.$toast.show(this.$options.i18n.createSuccess); this.showCreateMemberForm = false; this.fetchMemberRoles(this.groupId); }, @@ -161,27 +148,35 @@ export default { }, FIELDS, i18n: { - addNewRole: I18N_ADD_NEW_ROLE, - cardTitle: I18N_CARD_TITLE, - deleteRole: I18N_DELETE_ROLE, - emptyTitle: I18N_EMPTY_TITLE, + 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'), + fetchRolesError: s__('MemberRole|Failed to fetch roles.'), + fetchPermissionsError: s__('MemberRole|Could not fetch available permissions: %{message}'), + deleteSuccess: s__('MemberRole|Role successfully deleted.'), + deleteError: s__('MemberRole|Failed to delete the role.'), + createSuccess: s__('MemberRole|Role successfully created.'), + licenseError: s__('MemberRole|Make sure the group is in the Ultimate tier.'), }, modal: { actionPrimary: { - text: I18N_DELETE_ROLE, + text: s__('MemberRole|Delete role'), attributes: { variant: 'danger', }, }, actionSecondary: { - text: I18N_CANCEL, + text: __('Cancel'), attributes: { variant: 'default', }, }, id: 'confirm-delete-role', - title: I18N_MODAL_TITLE, - warning: I18N_MODAL_WARNING, + title: s__('MemberRole|Are you sure you want to delete this role?'), + warning: s__( + 'MemberRole|To delete the custom role make sure no group member has this custom role', + ), }, }; </script> @@ -198,7 +193,7 @@ export default { <div class="gl-new-card-actions"> <gl-button :disabled="!groupId" - :loading="$apollo.queries.memberRolePermissions.loading" + :loading="$apollo.queries.availablePermissions.loading" size="small" data-testid="add-role" @click="showCreateMemberForm = true" @@ -227,7 +222,7 @@ export default { v-else :fields="$options.FIELDS" :items="memberRoles" - :busy="isLoadingMemberRoles || $apollo.queries.memberRolePermissions.loading" + :busy="isLoadingMemberRoles || $apollo.queries.availablePermissions.loading" stacked="sm" > <template #cell(base_access_level)="{ item: { base_access_level } }"> diff --git a/ee/app/assets/javascripts/roles_and_permissions/constants.js b/ee/app/assets/javascripts/roles_and_permissions/constants.js deleted file mode 100644 index 087d26ddcbef99662dd473553a510c461ae1bd78..0000000000000000000000000000000000000000 --- a/ee/app/assets/javascripts/roles_and_permissions/constants.js +++ /dev/null @@ -1,50 +0,0 @@ -import { __, s__ } from '~/locale'; - -export const FIELDS = [ - { - key: 'name', - label: s__('MemberRole|Name'), - sortable: true, - }, - { - key: 'id', - label: s__('MemberRole|ID'), - sortable: true, - }, - { - key: 'base_access_level', - label: s__('MemberRole|Base role'), - sortable: true, - }, - { - key: 'permissions', - label: s__('MemberRole|Permissions'), - }, - { - key: 'actions', - label: s__('MemberRole|Actions'), - }, -]; - -// Translations -export const I18N_ADD_NEW_ROLE = s__('MemberRole|Add new role'); -export const I18N_CANCEL = __('Cancel'); -export const I18N_CARD_TITLE = s__('MemberRole|Custom roles'); -export const I18N_CREATION_SUCCESS = s__('MemberRole|Role successfully created.'); -export const I18N_DELETE_ROLE = s__('MemberRole|Delete role'); -export const I18N_DELETION_ERROR = s__('MemberRole|Failed to delete the role.'); -export const I18N_DELETION_SUCCESS = s__('MemberRole|Role successfully deleted.'); -export const I18N_EMPTY_TITLE = s__('MemberRole|No custom roles for this group'); -export const I18N_EMPTY_TEXT_GROUP = s__("MemberRole|To add a new role select 'Add new role'."); -export const I18N_EMPTY_TEXT_ADMIN = s__( - "MemberRole|To add a new role select a group and then 'Add new role'.", -); -export const I18N_FETCH_ERROR = s__('MemberRole|Failed to fetch roles.'); -export const I18N_MEMBER_ROLE_PERMISSIONS_QUERY_ERROR = s__( - 'MemberRole|Could not fetch available permissions: %{message}', -); -export const I18N_LICENSE_ERROR = s__('MemberRole|Make sure the group is in the Ultimate tier.'); -export const I18N_MODAL_TITLE = s__('MemberRole|Are you sure you want to delete this role?'); -export const I18N_MODAL_WARNING = s__( - `MemberRole|To delete the custom role make sure no group member has this custom 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 d3ca72490802bbb580a1a5c22778899f91261d2a..b7bdc5b92a42db595607660efd8937f98deba4bf 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 @@ -1,17 +1,10 @@ import { GlCard, GlEmptyState, GlModal, GlTable } from '@gitlab/ui'; import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; -import { createAlert, VARIANT_DANGER } from '~/alert'; +import { createAlert } from '~/alert'; import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status'; import { getMemberRoles, deleteMemberRole } from 'ee/api/member_roles_api'; import CreateMemberRole from 'ee/roles_and_permissions/components/create_member_role.vue'; -import { - I18N_CREATION_SUCCESS, - I18N_DELETION_ERROR, - I18N_DELETION_SUCCESS, - I18N_FETCH_ERROR, - I18N_LICENSE_ERROR, -} from 'ee/roles_and_permissions/constants'; 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'; @@ -147,8 +140,7 @@ describe('ListMemberRoles', () => { await waitForPromises(); expect(createAlert).toHaveBeenCalledWith({ - message: I18N_LICENSE_ERROR, - variant: VARIANT_DANGER, + message: 'Make sure the group is in the Ultimate tier.', }); }); @@ -157,10 +149,7 @@ describe('ListMemberRoles', () => { createComponent({ groupId: '100' }); await waitForPromises(); - expect(createAlert).toHaveBeenCalledWith({ - message: I18N_FETCH_ERROR, - variant: VARIANT_DANGER, - }); + expect(createAlert).toHaveBeenCalledWith({ message: 'Failed to fetch roles.' }); }); it('dismisses previous alerts', async () => { @@ -196,7 +185,7 @@ describe('ListMemberRoles', () => { it('shows toast', () => { findCreateMemberRole().vm.$emit('success'); - expect(mockToastShow).toHaveBeenCalledWith(I18N_CREATION_SUCCESS); + expect(mockToastShow).toHaveBeenCalledWith('Role successfully created.'); }); it('fetches roles', async () => { @@ -294,7 +283,7 @@ describe('ListMemberRoles', () => { findModal().vm.$emit('primary'); await waitForPromises(); - expect(mockToastShow).toHaveBeenCalledWith(I18N_DELETION_SUCCESS); + expect(mockToastShow).toHaveBeenCalledWith('Role successfully deleted.'); }); it('fetches roles', async () => { @@ -317,10 +306,7 @@ describe('ListMemberRoles', () => { findModal().vm.$emit('primary'); await waitForPromises(); - expect(createAlert).toHaveBeenCalledWith({ - message: I18N_DELETION_ERROR, - variant: VARIANT_DANGER, - }); + expect(createAlert).toHaveBeenCalledWith({ message: 'Failed to delete the role.' }); }); }); });