diff --git a/config/feature_flags/development/enable_add_on_users_filtering.yml b/config/feature_flags/development/enable_add_on_users_filtering.yml deleted file mode 100644 index c6d196f28695fd1e765ab1113e3d1f1d61e1392e..0000000000000000000000000000000000000000 --- a/config/feature_flags/development/enable_add_on_users_filtering.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: enable_add_on_users_filtering -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136858 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/431365 -milestone: '16.7' -type: development -group: group::provision -default_enabled: true diff --git a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/add_on_eligible_user_list.vue b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/add_on_eligible_user_list.vue index 339565a47f570a103d04cfe11fa870f7773cc6ad..5886a527d24fa9d08c2ff3e3501176cb355a3a12 100644 --- a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/add_on_eligible_user_list.vue +++ b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/add_on_eligible_user_list.vue @@ -24,7 +24,6 @@ import { NOT_ENOUGH_SEATS_ERROR_CODE, } from 'ee/usage_quotas/error_constants'; import PageSizeSelector from '~/vue_shared/components/page_size_selector.vue'; -import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; import { DUO_IDENTIFIERS } from 'ee/constants/duo'; import { @@ -70,7 +69,7 @@ export default { GlTable, PageSizeSelector, }, - mixins: [glFeatureFlagMixin(), trackingMixin], + mixins: [trackingMixin], inject: { addDuoProHref: { default: null }, groupId: { default: null }, @@ -140,7 +139,7 @@ export default { return this.tableItems?.some(({ maxRole }) => maxRole); }, isFilteringEnabled() { - return this.glFeatures.enableAddOnUsersFiltering; + return true; }, isPagesizeSelectionEnabled() { return this.glFeatures.enableAddOnUsersPagesizeSelection; @@ -164,19 +163,19 @@ export default { tableFieldsConfiguration() { let fieldConfig = [ 'user', - // eslint-disable-next-line @gitlab/require-i18n-strings - `${this.duoAddOn}Wide`, - 'emailWide', + this.duoAddOn, + 'email', + 'maxRole', 'lastActivityTime', 'lastDuoActivityTime', ]; - if (this.isFilteringEnabled && this.hasMaxRoleField) { + if (!this.hasMaxRoleField) { fieldConfig = [ 'user', - this.duoAddOn, - 'email', - 'maxRole', + // eslint-disable-next-line @gitlab/require-i18n-strings + `${this.duoAddOn}Wide`, + 'emailWide', 'lastActivityTime', 'lastDuoActivityTime', ]; diff --git a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list.vue b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list.vue index bcda4eac3ff3a37a9d610e2f395322da28096b0f..218a25361d83f9388e98eb4ca2e0fc76b2de4f33 100644 --- a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list.vue +++ b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list.vue @@ -4,7 +4,6 @@ import { s__, __ } from '~/locale'; import { fetchPolicies } from '~/lib/graphql'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; import { DEFAULT_PER_PAGE } from '~/api'; -import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import getAddOnEligibleUsers from 'ee/usage_quotas/add_on/graphql/saas_add_on_eligible_users.query.graphql'; import { getSubscriptionPermissionsData } from 'ee/fulfillment/shared_queries/subscription_actions_reason.customer.query.graphql'; import { @@ -35,7 +34,6 @@ export default { ErrorAlert, SearchAndSortBar, }, - mixins: [glFeatureFlagMixin()], inject: { fullPath: { default: null }, groupId: { default: null }, @@ -109,7 +107,6 @@ export default { }, computed: { filterTokens() { - if (!this.isFilteringEnabled) return []; return [ { options: [ @@ -125,11 +122,7 @@ export default { }, ]; }, - isFilteringEnabled() { - return this.glFeatures.enableAddOnUsersFiltering; - }, sortOptions() { - if (!this.isFilteringEnabled) return []; return SORT_OPTIONS; }, addOnEligibleUsersQueryVariables() { diff --git a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/self_managed_add_on_eligible_user_list.vue b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/self_managed_add_on_eligible_user_list.vue index 65b748e15bda434c71abbd870be7299bc79b6981..4b5a7b321ebba4dc8c353899caaa416bdf690876 100644 --- a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/self_managed_add_on_eligible_user_list.vue +++ b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/self_managed_add_on_eligible_user_list.vue @@ -3,7 +3,6 @@ import * as Sentry from '~/sentry/sentry_browser_wrapper'; import { __ } from '~/locale'; import { DEFAULT_PER_PAGE } from '~/api'; import { fetchPolicies } from '~/lib/graphql'; -import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import getAddOnEligibleUsers from 'ee/usage_quotas/add_on/graphql/self_managed_add_on_eligible_users.query.graphql'; import { ADD_ON_ELIGIBLE_USERS_FETCH_ERROR_CODE, @@ -28,7 +27,6 @@ export default { ErrorAlert, AddOnEligibleUserList, }, - mixins: [glFeatureFlagMixin()], props: { addOnPurchaseId: { type: String, @@ -75,11 +73,8 @@ export default { }, }, computed: { - isFilteringEnabled() { - return this.glFeatures.enableAddOnUsersFiltering; - }, sortOptions() { - return this.isFilteringEnabled ? SORT_OPTIONS : []; + return SORT_OPTIONS; }, queryVariables() { return { @@ -91,7 +86,6 @@ export default { }; }, filterTokens() { - if (!this.isFilteringEnabled) return []; return [ { options: [ diff --git a/ee/app/controllers/admin/gitlab_duo/seat_utilization_controller.rb b/ee/app/controllers/admin/gitlab_duo/seat_utilization_controller.rb index 371a3e815b42a7198a5d5a790834acb8418bb843..d6b57e9df35be9c17c2a4cd6dea03d1b38e6f8ba 100644 --- a/ee/app/controllers/admin/gitlab_duo/seat_utilization_controller.rb +++ b/ee/app/controllers/admin/gitlab_duo/seat_utilization_controller.rb @@ -15,7 +15,6 @@ class SeatUtilizationController < Admin::ApplicationController before_action :ensure_seat_assignable_duo_add_on! before_action do - push_frontend_feature_flag(:enable_add_on_users_filtering) push_frontend_feature_flag(:enable_add_on_users_pagesize_selection) end diff --git a/ee/app/controllers/admin/gitlab_duo_controller.rb b/ee/app/controllers/admin/gitlab_duo_controller.rb index 0d011a3c4c15c1b3b4314bec7fa0ae20bef5f4b2..2604c878c9719172bc7a7fec29acaa28cca28fa0 100644 --- a/ee/app/controllers/admin/gitlab_duo_controller.rb +++ b/ee/app/controllers/admin/gitlab_duo_controller.rb @@ -12,10 +12,6 @@ class GitlabDuoController < Admin::ApplicationController before_action :ensure_feature_available! - before_action do - push_frontend_feature_flag(:enable_add_on_users_filtering) - end - def show; end private diff --git a/ee/app/controllers/ee/groups/usage_quotas_controller.rb b/ee/app/controllers/ee/groups/usage_quotas_controller.rb index 2d6d20b6fbd230fdcf9256d18dcfbeb609115c52..4c8ec2c1ac74c826dc4ab8fa8a93b2769caeba00 100644 --- a/ee/app/controllers/ee/groups/usage_quotas_controller.rb +++ b/ee/app/controllers/ee/groups/usage_quotas_controller.rb @@ -14,7 +14,6 @@ module UsageQuotasController before_action only: [:root] do push_frontend_feature_flag(:data_transfer_monitoring, group) - push_frontend_feature_flag(:enable_add_on_users_filtering, group) push_frontend_feature_flag(:enable_add_on_users_pagesize_selection, group) push_frontend_feature_flag(:product_analytics_usage_quota_annual_data, group) push_frontend_feature_flag(:product_analytics_billing, group, type: :development) diff --git a/ee/app/controllers/groups/settings/gitlab_duo/seat_utilization_controller.rb b/ee/app/controllers/groups/settings/gitlab_duo/seat_utilization_controller.rb index 9f56eda65ba6d2031a7675c6d6e244a003dc0be4..3a9623910cf7bd23669e12799a34e767aee1aabd 100644 --- a/ee/app/controllers/groups/settings/gitlab_duo/seat_utilization_controller.rb +++ b/ee/app/controllers/groups/settings/gitlab_duo/seat_utilization_controller.rb @@ -13,7 +13,6 @@ class SeatUtilizationController < Groups::ApplicationController include ::Nav::GitlabDuoSettingsPage before_action do - push_frontend_feature_flag(:enable_add_on_users_filtering, group) push_frontend_feature_flag(:enable_add_on_users_pagesize_selection, group) end diff --git a/ee/spec/frontend/usage_quotas/code_suggestions/components/add_on_eligible_user_list_spec.js b/ee/spec/frontend/usage_quotas/code_suggestions/components/add_on_eligible_user_list_spec.js index 28459aa5e5748018421e423e4064a4042ecb2c29..c808ac8640602c063792ea35d8652edd9658209b 100644 --- a/ee/spec/frontend/usage_quotas/code_suggestions/components/add_on_eligible_user_list_spec.js +++ b/ee/spec/frontend/usage_quotas/code_suggestions/components/add_on_eligible_user_list_spec.js @@ -175,7 +175,6 @@ describe('Add On Eligible User List', () => { let mockApolloClient; const createComponent = ({ - enableAddOnUsersFiltering = false, enableAddOnUsersPagesizeSelection = false, isBulkAddOnAssignmentEnabled = false, addOnAssignmentBulkCreateHandler = bulkAssignAddOnHandler, @@ -204,7 +203,6 @@ describe('Add On Eligible User List', () => { provide: { addDuoProHref, glFeatures: { - enableAddOnUsersFiltering, enableAddOnUsersPagesizeSelection, }, isBulkAddOnAssignmentEnabled, @@ -429,58 +427,42 @@ describe('Add On Eligible User List', () => { }); }); - describe('with enableAddOnUsersFiltering enabled', () => { + describe('when eligible users have maxRole field', () => { beforeEach(() => { - return createComponent({ enableAddOnUsersFiltering: true }); + return createComponent({ + mountFn: mount, + props: { users: eligibleUsersWithMaxRole }, + }); }); - it('passes the correct fields configuration', () => { + it('passes the correct fields configuration', () => { expect(findTableKeys()).toEqual([ 'user', 'codeSuggestionsAddon', 'email', + 'maxRole', 'lastActivityTime', 'lastDuoActivityTime', ]); }); - describe('when eligible users have maxRole field', () => { - beforeEach(() => { - return createComponent({ - mountFn: mount, - enableAddOnUsersFiltering: true, - props: { users: eligibleUsersWithMaxRole }, - }); - }); - - it('passes the correct fields configuration', () => { - expect(findTableKeys()).toEqual([ - 'user', - 'codeSuggestionsAddon', - 'email', - 'maxRole', - 'lastActivityTime', - 'lastDuoActivityTime', - ]); - }); - - it('renders the correct table data', () => { - const expectedUserListData = [ - { - email: 'Private', - lastActivityOn: '2023-08-25', - lastDuoActivityOn: '2023-08-25', - maxRole: 'developer', - tooltip: 'An email address is only visible for users with public emails.', - user: { - avatarLabeled: { - size: '32', - src: 'path/to/img_userone', - text: 'User One @userone', - }, - avatarLink: { alt: 'User One', href: 'path/to/userone' }, + it('renders the correct table data', () => { + const expectedUserListData = [ + { + email: 'Private', + lastActivityOn: '2023-08-25', + lastDuoActivityOn: '2023-08-25', + maxRole: 'developer', + tooltip: 'An email address is only visible for users with public emails.', + user: { + avatarLabeled: { + size: '32', + src: 'path/to/img_userone', + text: 'User One @userone', }, + avatarLink: { alt: 'User One', href: 'path/to/userone' }, }, + }, { email: 'Private', lastActivityOn: '2023-08-22', @@ -511,11 +493,10 @@ describe('Add On Eligible User List', () => { avatarLink: { alt: 'User Three', href: 'path/to/userthree' }, }, }, - ]; - const actualUserListData = findSerializedTable(findTable()); + ]; + const actualUserListData = findSerializedTable(findTable()); - expect(actualUserListData).toStrictEqual(expectedUserListData); - }); + expect(actualUserListData).toStrictEqual(expectedUserListData); }); }); @@ -536,47 +517,26 @@ describe('Add On Eligible User List', () => { }); }); - describe('with enableAddOnUsersFiltering and isBulkAddOnAssignmentEnabled enabled', () => { + describe('with isBulkAddOnAssignmentEnabled enabled and users have maxRole field', () => { beforeEach(() => { return createComponent({ - enableAddOnUsersFiltering: true, + mountFn: mount, isBulkAddOnAssignmentEnabled: true, + props: { users: eligibleUsersWithMaxRole }, }); }); - it('passes the correct fields configuration', () => { + it('passes the correct fields configuration', () => { expect(findTableKeys()).toEqual([ 'checkbox', 'user', 'codeSuggestionsAddon', 'email', + 'maxRole', 'lastActivityTime', 'lastDuoActivityTime', ]); }); - - describe('when eligible users have maxRole field', () => { - beforeEach(() => { - return createComponent({ - mountFn: mount, - enableAddOnUsersFiltering: true, - isBulkAddOnAssignmentEnabled: true, - props: { users: eligibleUsersWithMaxRole }, - }); - }); - - it('passes the correct fields configuration', () => { - expect(findTableKeys()).toEqual([ - 'checkbox', - 'user', - 'codeSuggestionsAddon', - 'email', - 'maxRole', - 'lastActivityTime', - 'lastDuoActivityTime', - ]); - }); - }); }); describe('code suggestions add-on', () => { diff --git a/ee/spec/frontend/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list_spec.js b/ee/spec/frontend/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list_spec.js index 5307912dc61933c2f8a50d4b0bfb61a07676321d..76a855eff924b9372fa8269b94a5d5a35c84d1e1 100644 --- a/ee/spec/frontend/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list_spec.js +++ b/ee/spec/frontend/usage_quotas/code_suggestions/components/saas_add_on_eligible_user_list_spec.js @@ -33,7 +33,6 @@ Vue.use(VueApollo); jest.mock('~/sentry/sentry_browser_wrapper'); describe('Add On Eligible User List', () => { - let enableAddOnUsersFiltering = false; let enableAddOnUsersPagesizeSelection = false; let wrapper; @@ -115,7 +114,6 @@ describe('Add On Eligible User List', () => { provide: { fullPath, glFeatures: { - enableAddOnUsersFiltering, enableAddOnUsersPagesizeSelection, }, addDuoProHref: 'http://customers.gitlab.com/namespaces/0/duo_pro_seats', @@ -172,7 +170,7 @@ describe('Add On Eligible User List', () => { }); it('passes the correct sort options to ', () => { - expect(findSearchAndSortBar().props('sortOptions')).toStrictEqual([]); + expect(findSearchAndSortBar().props('sortOptions')).toStrictEqual(SORT_OPTIONS); }); it('does not the membership type badge', () => { @@ -190,32 +188,21 @@ describe('Add On Eligible User List', () => { }); }); - describe('when enableAddOnUsersFiltering is enabled', () => { - beforeEach(() => { - enableAddOnUsersFiltering = true; - return createComponent(); - }); - - it('passes the correct sort options to ', () => { - expect(findSearchAndSortBar().props('sortOptions')).toStrictEqual(SORT_OPTIONS); - }); - - it('passes the correct tokens to ', () => { - expect(findSearchAndSortBar().props('tokens')).toStrictEqual([ - { - options: [ - { value: 'true', title: 'Yes' }, - { value: 'false', title: 'No' }, - ], - icon: 'user', - operators: OPERATORS_IS, - title: TOKEN_TITLE_ASSIGNED_SEAT, - token: BaseToken, - type: TOKEN_TYPE_ASSIGNED_SEAT, - unique: true, - }, - ]); - }); + it('passes the correct tokens to ', () => { + expect(findSearchAndSortBar().props('tokens')).toStrictEqual([ + { + options: [ + { value: 'true', title: 'Yes' }, + { value: 'false', title: 'No' }, + ], + icon: 'user', + operators: OPERATORS_IS, + title: TOKEN_TITLE_ASSIGNED_SEAT, + token: BaseToken, + type: TOKEN_TYPE_ASSIGNED_SEAT, + unique: true, + }, + ]); }); describe('when there is an error fetching add on eligible users', () => { diff --git a/ee/spec/frontend/usage_quotas/code_suggestions/components/self_mananged_add_on_eligible_user_list_spec.js b/ee/spec/frontend/usage_quotas/code_suggestions/components/self_mananged_add_on_eligible_user_list_spec.js index 52d3b91329b9e42460a3376795001d2f634151d5..110e405b10f9b01e33915cbf659dc53dd58b01ec 100644 --- a/ee/spec/frontend/usage_quotas/code_suggestions/components/self_mananged_add_on_eligible_user_list_spec.js +++ b/ee/spec/frontend/usage_quotas/code_suggestions/components/self_mananged_add_on_eligible_user_list_spec.js @@ -32,7 +32,6 @@ jest.mock('~/sentry/sentry_browser_wrapper'); describe('Add On Eligible User List', () => { let wrapper; - let enableAddOnUsersFiltering = false; let enableAddOnUsersPagesizeSelection = false; const duoProAddOnPurchaseId = 'gid://gitlab/GitlabSubscriptions::AddOnPurchase/1'; @@ -91,7 +90,6 @@ describe('Add On Eligible User List', () => { }, provide: { glFeatures: { - enableAddOnUsersFiltering, enableAddOnUsersPagesizeSelection, }, }, @@ -129,9 +127,8 @@ describe('Add On Eligible User List', () => { expect(addOnEligibleUsersDataHandler).toHaveBeenCalledWith(duoProDefaultQueryVariables); }); - describe('when enableAddOnUsersFiltering is enabled', () => { + describe('search and sort bar', () => { beforeEach(() => { - enableAddOnUsersFiltering = true; return createComponent(); }); diff --git a/ee/spec/requests/groups/usage_quotas_spec.rb b/ee/spec/requests/groups/usage_quotas_spec.rb index 3abd7cd7f0974bc5dbef99d539016156e3825c82..e00875ce9214cce04d4a5529098207ba03184400 100644 --- a/ee/spec/requests/groups/usage_quotas_spec.rb +++ b/ee/spec/requests/groups/usage_quotas_spec.rb @@ -33,24 +33,10 @@ it_behaves_like 'namespace storage limit alert' end - context 'with enable_add_on_users_filtering enabled' do - it 'exposes the feature flags' do - request - - expect(response.body).to have_pushed_frontend_feature_flags(enableAddOnUsersFiltering: true) - end - end - - context 'with enable_add_on_users_filtering disabled' do - before do - stub_feature_flags(enable_add_on_users_filtering: false) - end - - it 'does not expose feature flags' do - request + it 'exposes the feature flags' do + request - expect(response.body).not_to have_pushed_frontend_feature_flags(enableAddOnUsersFiltering: true) - end + expect(response.body).to have_pushed_frontend_feature_flags(enableAddOnUsersFiltering: true) end context 'with enable_add_on_users_pagesize_selection enabled' do