From 043a27e63d3e29b9e696ed3ca414aceffdeae975 Mon Sep 17 00:00:00 2001 From: Sheldon Led <sheldonled@gitlab.com> Date: Tue, 20 Feb 2024 20:08:29 +0000 Subject: [PATCH] Add Code Suggestions tab to conditionally render in CE --- .../usage_quotas/code_suggestions/index.js | 58 ++-------------- .../code_suggestions/tab_metadata.js | 69 +++++++++++++++++++ .../javascripts/usage_quotas/constants.js | 1 + .../usage_quotas/group_view_metadata.js | 2 + .../views/groups/usage_quotas/index.html.haml | 4 +- 5 files changed, 80 insertions(+), 54 deletions(-) create mode 100644 ee/app/assets/javascripts/usage_quotas/code_suggestions/tab_metadata.js diff --git a/ee/app/assets/javascripts/usage_quotas/code_suggestions/index.js b/ee/app/assets/javascripts/usage_quotas/code_suggestions/index.js index 6fb77fcdc1dc..f1771c6a7d5c 100644 --- a/ee/app/assets/javascripts/usage_quotas/code_suggestions/index.js +++ b/ee/app/assets/javascripts/usage_quotas/code_suggestions/index.js @@ -1,61 +1,13 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; -import CodeSuggestionsUsage from 'ee/usage_quotas/code_suggestions/components/code_suggestions_usage.vue'; -import apolloProvider from 'ee/usage_quotas/shared/provider'; +import { getCodeSuggestionsTabMetadata } from './tab_metadata'; Vue.use(VueApollo); -export default (containerId = 'js-code-suggestions-usage-app') => { - const el = document.getElementById(containerId); +export default () => { + const codeSuggestionsTabMetadata = getCodeSuggestionsTabMetadata(true); - if (!el) { - return false; - } + if (!codeSuggestionsTabMetadata) return false; - const { - fullPath, - groupId, - firstName, - lastName, - companyName, - namespaceId, - buttonAttributes, - createHandRaiseLeadPath, - glmContent, - productInteraction, - trackAction, - trackLabel, - userName, - addDuoProHref, - } = el.dataset; - - return new Vue({ - el, - apolloProvider, - name: 'CodeSuggestionsUsageApp', - provide: { - fullPath, - groupId, - createHandRaiseLeadPath, - addDuoProHref, - isSaaS: true, - buttonAttributes: buttonAttributes && { ...JSON.parse(buttonAttributes), variant: 'confirm' }, - user: { - namespaceId, - userName, - firstName, - lastName, - companyName, - glmContent, - productInteraction, - }, - ctaTracking: { - action: trackAction, - label: trackLabel, - }, - }, - render(createElement) { - return createElement(CodeSuggestionsUsage); - }, - }); + return new Vue(codeSuggestionsTabMetadata.component); }; diff --git a/ee/app/assets/javascripts/usage_quotas/code_suggestions/tab_metadata.js b/ee/app/assets/javascripts/usage_quotas/code_suggestions/tab_metadata.js new file mode 100644 index 000000000000..556ec9af9b4e --- /dev/null +++ b/ee/app/assets/javascripts/usage_quotas/code_suggestions/tab_metadata.js @@ -0,0 +1,69 @@ +import { s__ } from '~/locale'; +import apolloProvider from '../shared/provider'; +import { CODE_SUGGESTIONS_TAB_METADATA_EL_SELECTOR } from '../constants'; +import CodeSuggestionsUsage from './components/code_suggestions_usage.vue'; + +export const parseProvideData = (el) => { + const { + fullPath, + groupId, + firstName, + lastName, + companyName, + namespaceId, + buttonAttributes, + createHandRaiseLeadPath, + glmContent, + productInteraction, + trackAction, + trackLabel, + userName, + addDuoProHref, + } = el.dataset; + + return { + fullPath, + groupId, + createHandRaiseLeadPath, + addDuoProHref, + isSaaS: true, + buttonAttributes: buttonAttributes && { ...JSON.parse(buttonAttributes), variant: 'confirm' }, + user: { + namespaceId, + userName, + firstName, + lastName, + companyName, + glmContent, + productInteraction, + }, + ctaTracking: { + action: trackAction, + label: trackLabel, + }, + }; +}; + +export const getCodeSuggestionsTabMetadata = (withMountElement = false) => { + const el = document.querySelector(CODE_SUGGESTIONS_TAB_METADATA_EL_SELECTOR); + + if (!el) return false; + + const codeSuggestionsTabMetadata = { + title: s__('UsageQuota|GitLab Duo Pro'), + component: { + name: 'CodeSuggestionsUsageTab', + apolloProvider, + provide: parseProvideData(el), + render(createElement) { + return createElement(CodeSuggestionsUsage); + }, + }, + }; + + if (withMountElement) { + codeSuggestionsTabMetadata.component.el = el; + } + + return codeSuggestionsTabMetadata; +}; diff --git a/ee/app/assets/javascripts/usage_quotas/constants.js b/ee/app/assets/javascripts/usage_quotas/constants.js index 783461e1f57c..039721ff505d 100644 --- a/ee/app/assets/javascripts/usage_quotas/constants.js +++ b/ee/app/assets/javascripts/usage_quotas/constants.js @@ -5,3 +5,4 @@ export const USAGE_BY_PROJECT_HEADER = s__('UsageQuota|Usage by project'); export const PIPELINES_TAB_METADATA_EL_SELECTOR = '#js-pipeline-usage-app'; export const SEATS_TAB_METADATA_EL_SELECTOR = '#js-seat-usage-app'; +export const CODE_SUGGESTIONS_TAB_METADATA_EL_SELECTOR = '#js-code-suggestions-usage-app'; diff --git a/ee/app/assets/javascripts/usage_quotas/group_view_metadata.js b/ee/app/assets/javascripts/usage_quotas/group_view_metadata.js index 0d89c3d06838..32d7c6f4340a 100644 --- a/ee/app/assets/javascripts/usage_quotas/group_view_metadata.js +++ b/ee/app/assets/javascripts/usage_quotas/group_view_metadata.js @@ -5,6 +5,7 @@ import PipelineUsageApp from './pipelines/components/app.vue'; import { parseProvideData as parseStorageTabProvideData } from './storage/utils'; import { parseProvideData as parsePipelinesTabProvideData } from './pipelines/utils'; import { PIPELINES_TAB_METADATA_EL_SELECTOR } from './constants'; +import { getCodeSuggestionsTabMetadata } from './code_suggestions/tab_metadata'; import { getSeatTabMetadata } from './seats/tab_metadata'; export const usageQuotasViewProvideData = { @@ -25,6 +26,7 @@ const getPipelineTabMetadata = () => { export const usageQuotasTabsMetadata = [ getSeatTabMetadata(), + getCodeSuggestionsTabMetadata(), getPipelineTabMetadata(), storageTabMetadata, ]; diff --git a/ee/app/views/groups/usage_quotas/index.html.haml b/ee/app/views/groups/usage_quotas/index.html.haml index 921ea1fc0eec..9a8df050dd14 100644 --- a/ee/app/views/groups/usage_quotas/index.html.haml +++ b/ee/app/views/groups/usage_quotas/index.html.haml @@ -17,9 +17,11 @@ #js-usage-quotas-view{ data: { namespace_name: @group.name } } #js-seat-usage-app{ data: group_seats_usage_quota_app_data(@group) } - #js-namespace-storage-app{ data: storage_usage_app_data(@group) } + - if show_code_suggestions_tab?(@group) + #js-code-suggestions-usage-app{ data: code_suggestions_usage_app_data(@group) } - if can? current_user, :admin_ci_minutes, @group #js-pipeline-usage-app{ data: pipeline_usage_app_data(@group) } + #js-namespace-storage-app{ data: storage_usage_app_data(@group) } - else - if show_product_purchase_success_alert? = render 'product_purchase_success_alert', product_name: params[:purchased_product] -- GitLab