diff --git a/ee/app/assets/javascripts/fulfillment/shared_queries/subscription_actions_reason.customer.query.graphql b/ee/app/assets/javascripts/fulfillment/shared_queries/subscription_actions_reason.customer.query.graphql index 053fe34c4048b4540c62b02725ae4cd3d88aedaa..f01cebda2255726ec528a91dbb48d21b0e16f3aa 100644 --- a/ee/app/assets/javascripts/fulfillment/shared_queries/subscription_actions_reason.customer.query.graphql +++ b/ee/app/assets/javascripts/fulfillment/shared_queries/subscription_actions_reason.customer.query.graphql @@ -1,11 +1,11 @@ -query getSubscriptionPermissionsData($namespaceId: ID!) { - subscription(namespaceId: $namespaceId) { +query getSubscriptionPermissionsData($namespaceId: ID, $subscriptionName: String) { + subscription(namespaceId: $namespaceId, subscriptionName: $subscriptionName) { canAddSeats canAddDuoProSeats canRenew communityPlan } - userActionAccess(namespaceId: $namespaceId) { + userActionAccess(namespaceId: $namespaceId, subscriptionName: $subscriptionName) { limitedAccessReason } } diff --git a/ee/app/assets/javascripts/pages/admin/code_suggestions/index.js b/ee/app/assets/javascripts/pages/admin/code_suggestions/index.js index 2e1ee0f1b4ceea874d53069ade902999916869e4..37613b167a59670bec5d893688bd633e5ccd9afc 100644 --- a/ee/app/assets/javascripts/pages/admin/code_suggestions/index.js +++ b/ee/app/assets/javascripts/pages/admin/code_suggestions/index.js @@ -1,14 +1,7 @@ import Vue from 'vue'; -import VueApollo from 'vue-apollo'; -import createDefaultClient from '~/lib/graphql'; +import apolloProvider from 'ee/usage_quotas/shared/provider'; import CodeSuggestionsUsage from 'ee/usage_quotas/code_suggestions/components/code_suggestions_usage.vue'; -Vue.use(VueApollo); - -const apolloProvider = new VueApollo({ - defaultClient: createDefaultClient(), -}); - function mountCodeSuggestionsUsageApp() { const el = document.getElementById('js-code-suggestions-page'); @@ -23,6 +16,7 @@ function mountCodeSuggestionsUsageApp() { provide: { isSaaS: false, addDuoProHref: el.dataset.addDuoProSeatsUrl, + subscriptionName: el.dataset.subscriptionName, }, render: (h) => h(CodeSuggestionsUsage), }); diff --git a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/code_suggestions_info_card.vue b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/code_suggestions_info_card.vue index 47e417e406b995ed60d2e39e1aff463ff3a19c4d..f6c478a0a72173a0fdb8ed53e83494d6b004a7db 100644 --- a/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/code_suggestions_info_card.vue +++ b/ee/app/assets/javascripts/usage_quotas/code_suggestions/components/code_suggestions_info_card.vue @@ -42,7 +42,7 @@ export default { GlModalDirective, }, mixins: [Tracking.mixin()], - inject: ['addDuoProHref', 'isSaaS'], + inject: ['addDuoProHref', 'isSaaS', 'subscriptionName'], props: { groupId: { type: String, @@ -60,7 +60,7 @@ export default { return parseInt(this.groupId, 10); }, shouldShowAddSeatsButton() { - if (this.isLoading || !this.addDuoProHref) { + if (this.isLoading) { return false; } return true; @@ -86,12 +86,12 @@ export default { query: getSubscriptionPermissionsData, client: 'customersDotClient', variables() { - return { - namespaceId: this.parsedGroupId, - }; + return this.groupId + ? { namespaceId: this.parsedGroupId } + : { subscriptionName: this.subscriptionName }; }, skip() { - return !this.addDuoProHref || !this.groupId; + return !(this.groupId || this.subscriptionName); }, update: (data) => ({ canAddDuoProSeats: data.subscription.canAddDuoProSeats, diff --git a/ee/app/views/admin/code_suggestions/index.html.haml b/ee/app/views/admin/code_suggestions/index.html.haml index d56ca4d66b775d0a2d63d88a668c3a060ff5f3d3..c3dfb19b71a9f166b38552ee62018a9bfab375fa 100644 --- a/ee/app/views/admin/code_suggestions/index.html.haml +++ b/ee/app/views/admin/code_suggestions/index.html.haml @@ -2,4 +2,4 @@ - page_title s_('CodeSuggestions|GitLab Duo Pro') - duo_pro_url = add_duo_pro_seats_url(@subscription_name) -#js-code-suggestions-page{ data: { add_duo_pro_seats_url: duo_pro_url } } +#js-code-suggestions-page{ data: { add_duo_pro_seats_url: duo_pro_url, subscription_name: @subscription_name } } diff --git a/ee/spec/frontend/usage_quotas/code_suggestions/components/code_suggestions_info_card_spec.js b/ee/spec/frontend/usage_quotas/code_suggestions/components/code_suggestions_info_card_spec.js index 3e0229b22945047b299ce9d773accfbb24500323..168060e95fa1a14726e195ec20c47b7d99a3b8cf 100644 --- a/ee/spec/frontend/usage_quotas/code_suggestions/components/code_suggestions_info_card_spec.js +++ b/ee/spec/frontend/usage_quotas/code_suggestions/components/code_suggestions_info_card_spec.js @@ -20,6 +20,7 @@ jest.mock('~/lib/utils/url_utility', () => ({ const defaultProvide = { addDuoProHref: 'http://customers.gitlab.com/namespaces/10/duo_pro_seats', isSaaS: true, + subscriptionName: null, }; describe('CodeSuggestionsInfoCard', () => { @@ -123,13 +124,6 @@ describe('CodeSuggestionsInfoCard', () => { await waitForPromises(); expect(findAddSeatsButton().exists()).toBe(true); }); - - it('does not render add seats button if link is empty', async () => { - createComponent({ provide: { isSaas: false, addDuoProHref: '' } }); - // wait for apollo to load - await waitForPromises(); - expect(findAddSeatsButton().exists()).toBe(false); - }); }); describe('with saas', () => { @@ -145,13 +139,6 @@ describe('CodeSuggestionsInfoCard', () => { expect(findAddSeatsButton().exists()).toBe(true); }); }); - - it('does not render add seats button if link is empty', async () => { - createComponent({ provide: { addDuoProHref: '' } }); - // wait for apollo to load - await waitForPromises(); - expect(findAddSeatsButton().exists()).toBe(false); - }); }); describe('tracking', () => { diff --git a/ee/spec/support/helpers/subscription_portal_helpers.rb b/ee/spec/support/helpers/subscription_portal_helpers.rb index 236803bf564ab825e16f1ff80d3070fcbc1d8733..0385950cd86737dbb3db974c7925a6eaa0ee78db 100644 --- a/ee/spec/support/helpers/subscription_portal_helpers.rb +++ b/ee/spec/support/helpers/subscription_portal_helpers.rb @@ -93,7 +93,7 @@ def stub_subscription_management_data(namespace_id, can_add_seats: true, can_ren def stub_subscription_permissions_data(namespace_id, can_add_seats: true, can_add_duo_pro_seats: true, can_renew: true, community_plan: false, reason: 'MANAGED_BY_RESELLER') stub_full_request(graphql_url, method: :post) .with( - body: "{\"operationName\":\"getSubscriptionPermissionsData\",\"variables\":{\"namespaceId\":#{namespace_id}},\"query\":\"query getSubscriptionPermissionsData($namespaceId: ID!) {\\n subscription(namespaceId: $namespaceId) {\\n canAddSeats\\n canAddDuoProSeats\\n canRenew\\n communityPlan\\n __typename\\n }\\n userActionAccess(namespaceId: $namespaceId) {\\n limitedAccessReason\\n __typename\\n }\\n}\\n\"}" + body: "{\"operationName\":\"getSubscriptionPermissionsData\",\"variables\":{\"namespaceId\":#{namespace_id}},\"query\":\"query getSubscriptionPermissionsData($namespaceId: ID, $subscriptionName: String) {\\n subscription(namespaceId: $namespaceId, subscriptionName: $subscriptionName) {\\n canAddSeats\\n canAddDuoProSeats\\n canRenew\\n communityPlan\\n __typename\\n }\\n userActionAccess(namespaceId: $namespaceId, subscriptionName: $subscriptionName) {\\n limitedAccessReason\\n __typename\\n }\\n}\\n\"}" ) .to_return(status: 200, body: { "data": {