diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index fa87b981f5d7bad08f6536905eea93f329a722d7..21a376c4885e8be438804d0e18f14e3387c45259 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -10,17 +10,24 @@ *.md @gl-docsteam # Frontend maintainers should see everything in `app/assets/` -app/assets/ @gitlab-org/maintainers/frontend *.scss @annabeldunstone @gitlab-org/maintainers/frontend -/scripts/frontend/ @gitlab-org/maintainers/frontend +*.js @gitlab-org/maintainers/frontend +/app/assets/ @gitlab-org/maintainers/frontend +/ee/app/assets/ @gitlab-org/maintainers/frontend +/spec/javascripts/ @gitlab-org/maintainers/frontend +/ee/spec/javascripts/ @gitlab-org/maintainers/frontend +/spec/frontend/ @gitlab-org/maintainers/frontend +/ee/spec/frontend/ @gitlab-org/maintainers/frontend # Database maintainers should review changes in `db/` -db/ @gitlab-org/maintainers/database -lib/gitlab/background_migration/ @gitlab-org/maintainers/database -lib/gitlab/database/ @gitlab-org/maintainers/database -lib/gitlab/sql/ @gitlab-org/maintainers/database -lib/gitlab/github_import/ @gitlab-org/maintainers/database +/db/ @gitlab-org/maintainers/database /ee/db/ @gitlab-org/maintainers/database +/lib/gitlab/background_migration/ @gitlab-org/maintainers/database +/ee/lib/ee/gitlab/background_migration/ @gitlab-org/maintainers/database +/lib/gitlab/database/ @gitlab-org/maintainers/database +/ee/lib/gitlab/database/ @gitlab-org/maintainers/database +/lib/gitlab/sql/ @gitlab-org/maintainers/database +/lib/gitlab/github_import/ @gitlab-org/maintainers/database /app/finders/ @gitlab-org/maintainers/database /ee/app/finders/ @gitlab-org/maintainers/database @@ -40,14 +47,14 @@ lib/gitlab/github_import/ @gitlab-org/maintainers/database # Engineering Productivity owned files /.gitlab-ci.yml @gl-quality/eng-prod /.gitlab/ci/ @gl-quality/eng-prod +/.gitlab/ci/docs.gitlab-ci.yml @gl-quality/eng-prod @gl-docsteam +/.gitlab/ci/releases.gitlab-ci.yml @gl-quality/eng-prod @gitlab-org/delivery /.gitlab/CODEOWNERS @gl-quality/eng-prod Dangerfile @gl-quality/eng-prod /danger/ @gl-quality/eng-prod /lib/gitlab/danger/ @gl-quality/eng-prod /scripts/ @gl-quality/eng-prod - -# Delivery owner files -/.gitlab/ci/releases.gitlab-ci.yml @gitlab-org/delivery +/scripts/frontend/ @gl-quality/eng-prod @gitlab-org/maintainers/frontend # Telemetry owner files /ee/lib/gitlab/usage_data_counters/ @gitlab-org/growth/telemetry diff --git a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue index d304ae7dbf64df3d4d2bba631974c866f81501b8..7f0c232eea8dcc914a129c92c4e12d85fedfc933 100644 --- a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue +++ b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/components/popover.vue @@ -4,6 +4,9 @@ import Cookies from 'js-cookie'; import { parseBoolean, scrollToElement } from '~/lib/utils/common_utils'; import { s__ } from '~/locale'; import { glEmojiTag } from '~/emoji'; +import Tracking from '~/tracking'; + +const trackingMixin = Tracking.mixin(); const popoverStates = { suggest_gitlab_ci_yml: { @@ -27,6 +30,7 @@ export default { GlIcon, GlButton, }, + mixins: [trackingMixin], props: { target: { type: String, @@ -40,10 +44,18 @@ export default { type: String, required: true, }, + humanAccess: { + type: String, + required: true, + }, }, data() { return { popoverDismissed: parseBoolean(Cookies.get(this.dismissKey)), + tracking: { + label: this.trackLabel, + property: this.humanAccess, + }, }; }, computed: { @@ -60,12 +72,17 @@ export default { mounted() { if (this.trackLabel === 'suggest_commit_first_project_gitlab_ci_yml' && !this.popoverDismissed) scrollToElement(document.querySelector(this.target)); + + this.trackOnShow(); }, methods: { onDismiss() { this.popoverDismissed = true; Cookies.set(this.dismissKey, this.popoverDismissed, { expires: 365 }); }, + trackOnShow() { + if (!this.popoverDismissed) this.track(); + }, }, }; diff --git a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js index 2cc342fb38187f9b3b91a4cf64094f0f7f36cef3..3b67b3dd259e5e4f41cbccf3fc6d2d44a94ead4a 100644 --- a/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js +++ b/app/assets/javascripts/blob/suggest_gitlab_ci_yml/index.js @@ -10,6 +10,7 @@ export default el => target: el.dataset.target, trackLabel: el.dataset.trackLabel, dismissKey: el.dataset.dismissKey, + humanAccess: el.dataset.humanAccess, }, }); }, diff --git a/app/assets/javascripts/ide/components/preview/clientside.vue b/app/assets/javascripts/ide/components/preview/clientside.vue index beb179d041130ada53c76a005d53862bbc8feb2f..aa8d932da6eedd815171530dfdec8710ba65963f 100644 --- a/app/assets/javascripts/ide/components/preview/clientside.vue +++ b/app/assets/javascripts/ide/components/preview/clientside.vue @@ -21,7 +21,7 @@ export default { }; }, computed: { - ...mapState(['entries', 'promotionSvgPath', 'links']), + ...mapState(['entries', 'promotionSvgPath', 'links', 'codesandboxBundlerUrl']), ...mapGetters(['packageJson', 'currentProject']), normalizedEntries() { return Object.keys(this.entries).reduce((acc, path) => { @@ -106,12 +106,7 @@ export default { return this.loadFileContent(this.mainEntry) .then(() => this.$nextTick()) .then(() => { - this.initManager('#ide-preview', this.sandboxOpts, { - fileResolver: { - isFile: p => Promise.resolve(Boolean(this.entries[createPathWithExt(p)])), - readFile: p => this.loadFileContent(createPathWithExt(p)).then(content => content), - }, - }); + this.initManager(); this.listener = listen(e => { switch (e.type) { @@ -139,8 +134,18 @@ export default { this.manager.updatePreview(this.sandboxOpts); }, 250); }, - initManager(el, opts, resolver) { - this.manager = new Manager(el, opts, resolver); + initManager() { + const { codesandboxBundlerUrl: bundlerURL } = this; + + const settings = { + fileResolver: { + isFile: p => Promise.resolve(Boolean(this.entries[createPathWithExt(p)])), + readFile: p => this.loadFileContent(createPathWithExt(p)).then(content => content), + }, + ...(bundlerURL ? { bundlerURL } : {}), + }; + + this.manager = new Manager('#ide-preview', this.sandboxOpts, settings); }, }, }; diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js index a3450522697d01625de8741926d3194bc6c6694b..9e9d9df8f828d5f7b0fe0d63f59a7f95290c5d4c 100644 --- a/app/assets/javascripts/ide/index.js +++ b/app/assets/javascripts/ide/index.js @@ -53,6 +53,7 @@ export function initIde(el, options = {}) { clientsidePreviewEnabled: parseBoolean(el.dataset.clientsidePreviewEnabled), renderWhitespaceInCode: parseBoolean(el.dataset.renderWhitespaceInCode), editorTheme: window.gon?.user_color_scheme || DEFAULT_THEME, + codesandboxBundlerUrl: el.dataset.codesandboxBundlerUrl, }); }, methods: { diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js index a714562c5b2f4651337389ab460fb8d104a510ce..0fd6a4482838edc105cb2156a5aac7441a839790 100644 --- a/app/assets/javascripts/ide/stores/state.js +++ b/app/assets/javascripts/ide/stores/state.js @@ -34,4 +34,5 @@ export default () => ({ clientsidePreviewEnabled: false, renderWhitespaceInCode: false, editorTheme: DEFAULT_THEME, + codesandboxBundlerUrl: null, }); diff --git a/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue b/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue index 018b30d2a6767a503ffc590f7460ba922dc503a3..05ad7b4ea3e605d217fae077c76494708ac13435 100644 --- a/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue +++ b/app/assets/javascripts/sidebar/components/time_tracking/sidebar_time_tracking.vue @@ -1,6 +1,6 @@