diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index 978e6731e9d0375b5ac6caf57009000984cc7f71..787dd0e8e66e20ebad15b72e73e34bd3b3dd5668 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -15,6 +15,7 @@ import { MR_COMMITS_PREVIOUS_COMMIT, } from '~/behaviors/shortcuts/keybindings'; import { createAlert } from '~/alert'; +import { InternalEvents } from '~/tracking'; import { isSingleViewStyle } from '~/helpers/diffs_helper'; import { helpPagePath } from '~/helpers/help_page_helper'; import { parseBoolean, handleLocationHash } from '~/lib/utils/common_utils'; @@ -86,7 +87,7 @@ export default { GlSprintf, GlAlert, }, - mixins: [glFeatureFlagsMixin()], + mixins: [glFeatureFlagsMixin(), InternalEvents.mixin()], alerts: { ALERT_OVERFLOW_HIDDEN, ALERT_MERGE_CONFLICT, @@ -456,6 +457,8 @@ export default { notesEventHub.$once('fetchDiffData', this.fetchData); notesEventHub.$on('refetchDiffData', this.refetchDiffData); notesEventHub.$on('fetchedNotesData', this.rereadNoteHash); + notesEventHub.$on('noteFormAddToReview', this.handleReviewTracking); + notesEventHub.$on('noteFormStartReview', this.handleReviewTracking); diffsEventHub.$on('diffFilesModified', this.setDiscussions); diffsEventHub.$on('doneLoadingBatches', this.autoScroll); diffsEventHub.$on(EVT_MR_PREPARED, this.fetchData); @@ -466,6 +469,8 @@ export default { diffsEventHub.$off(EVT_MR_PREPARED, this.fetchData); diffsEventHub.$off('doneLoadingBatches', this.autoScroll); diffsEventHub.$off('diffFilesModified', this.setDiscussions); + notesEventHub.$off('noteFormStartReview', this.handleReviewTracking); + notesEventHub.$off('noteFormAddToReview', this.handleReviewTracking); notesEventHub.$off('fetchedNotesData', this.rereadNoteHash); notesEventHub.$off('refetchDiffData', this.refetchDiffData); notesEventHub.$off('fetchDiffData', this.fetchData); @@ -696,6 +701,16 @@ export default { reloadPage() { window.location.reload(); }, + handleReviewTracking(event) { + const types = { + noteFormStartReview: 'merge_request_click_start_review_on_changes_tab', + noteFormAddToReview: 'merge_request_click_add_to_review_on_changes_tab', + }; + + if (this.shouldShow && types[event.name]) { + this.trackEvent(types[event.name]); + } + }, }, howToMergeDocsPath: helpPagePath('user/project/merge_requests/reviews/index.md', { anchor: 'checkout-merge-requests-locally-through-the-head-ref', diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue index 87b55b19c08afc341f950b94224ea7f53cd4bfcc..17eded3bec0445d1d562953e85b10883f8d0d7ab 100644 --- a/app/assets/javascripts/notes/components/comment_form.vue +++ b/app/assets/javascripts/notes/components/comment_form.vue @@ -12,6 +12,7 @@ import { slugifyWithUnderscore, } from '~/lib/utils/text_utility'; import { sprintf } from '~/locale'; +import { InternalEvents } from '~/tracking'; import { badgeState } from '~/merge_requests/components/merge_request_header.vue'; import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue'; import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue'; @@ -48,7 +49,7 @@ export default { directives: { GlTooltip: GlTooltipDirective, }, - mixins: [issuableStateMixin], + mixins: [issuableStateMixin, InternalEvents.mixin()], props: { noteableType: { type: String, @@ -253,6 +254,10 @@ export default { this.isSubmitting = true; + if (isDraft) { + eventHub.$emit('noteFormAddToReview', { name: 'noteFormAddToReview' }); + } + trackSavedUsingEditor( this.$refs.markdownEditor.isContentEditorActive, `${this.noteableType}_${this.noteType}`, diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue index 77ce5ea5910fe9cbaf426f7e106f256379784ba4..135d595aae59f616664f6241f11c612c083fa145 100644 --- a/app/assets/javascripts/notes/components/note_form.vue +++ b/app/assets/javascripts/notes/components/note_form.vue @@ -320,12 +320,14 @@ export default { ); }, handleAddToReview() { + const clickType = this.hasDrafts ? 'noteFormAddToReview' : 'noteFormStartReview'; // check if draft should resolve thread const shouldResolve = (this.discussionResolved && !this.isUnresolving) || (!this.discussionResolved && this.isResolving); this.isSubmitting = true; + eventHub.$emit(clickType, { name: clickType }); this.$emit( 'handleFormUpdateAddToReview', this.updatedNoteBody, diff --git a/app/assets/javascripts/notes/components/notes_app.vue b/app/assets/javascripts/notes/components/notes_app.vue index 86f93ee425e2fbcbc53c361dda7a06f9acd648cf..eb6764a7937813c9b1f9f62bea78248c37fb5a47 100644 --- a/app/assets/javascripts/notes/components/notes_app.vue +++ b/app/assets/javascripts/notes/components/notes_app.vue @@ -2,6 +2,7 @@ // eslint-disable-next-line no-restricted-imports import { mapGetters, mapActions } from 'vuex'; import { v4 as uuidv4 } from 'uuid'; +import { InternalEvents } from '~/tracking'; import highlightCurrentUser from '~/behaviors/markdown/highlight_current_user'; import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue'; import OrderedLayout from '~/vue_shared/components/ordered_layout.vue'; @@ -39,7 +40,7 @@ export default { TimelineEntryItem, AiSummary: () => import('ee_component/notes/components/ai_summary.vue'), }, - mixins: [glFeatureFlagsMixin()], + mixins: [glFeatureFlagsMixin(), InternalEvents.mixin()], provide() { return { summarizeClientSubscriptionId: uuidv4(), @@ -165,6 +166,9 @@ export default { }); } + eventHub.$on('noteFormAddToReview', this.handleReviewTracking); + eventHub.$on('noteFormStartReview', this.handleReviewTracking); + window.addEventListener('hashchange', this.handleHashChanged); eventHub.$on('notesApp.updateIssuableConfidentiality', this.setConfidentiality); @@ -177,6 +181,8 @@ export default { beforeDestroy() { window.removeEventListener('hashchange', this.handleHashChanged); eventHub.$off('notesApp.updateIssuableConfidentiality', this.setConfidentiality); + eventHub.$off('noteFormStartReview', this.handleReviewTracking); + eventHub.$off('noteFormAddToReview', this.handleReviewTracking); }, methods: { ...mapActions([ @@ -222,6 +228,16 @@ export default { setAiLoading(loading) { this.aiLoading = loading; }, + handleReviewTracking(event) { + const types = { + noteFormStartReview: 'merge_request_click_start_review_on_overview_tab', + noteFormAddToReview: 'merge_request_click_add_to_review_on_overview_tab', + }; + + if (this.shouldShow && window.mrTabs && types[event.name]) { + this.trackEvent(types[event.name]); + } + }, }, systemNote: constants.SYSTEM_NOTE, }; diff --git a/config/events/merge_request_click_add_to_review_on_changes_tab.yml b/config/events/merge_request_click_add_to_review_on_changes_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..5d504b617a0a49495ea1e9d733a2de76f9b01426 --- /dev/null +++ b/config/events/merge_request_click_add_to_review_on_changes_tab.yml @@ -0,0 +1,20 @@ +--- +description: User clicks the "Add to review" button on the Merge Request Changes tab +category: InternalEventTracking +action: merge_request_click_add_to_review_on_changes_tab +identifiers: +- project +- namespace +- user +product_section: dev +product_stage: create +product_group: code_review +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/events/merge_request_click_add_to_review_on_overview_tab.yml b/config/events/merge_request_click_add_to_review_on_overview_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..0001aada7b47c0a6f5b4e146477401271b38ae6b --- /dev/null +++ b/config/events/merge_request_click_add_to_review_on_overview_tab.yml @@ -0,0 +1,20 @@ +--- +description: User clicks the "Add to review" button on the Merge Request Overview tab +category: InternalEventTracking +action: merge_request_click_add_to_review_on_overview_tab +identifiers: +- project +- namespace +- user +product_section: dev +product_stage: create +product_group: code_review +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/events/merge_request_click_start_review_on_changes_tab.yml b/config/events/merge_request_click_start_review_on_changes_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..a1cd6c0bda3bbae6c90a2dce52f5141a0e35a99b --- /dev/null +++ b/config/events/merge_request_click_start_review_on_changes_tab.yml @@ -0,0 +1,20 @@ +--- +description: User clicks the "Start a review" button on the Merge Request Changes tab +category: InternalEventTracking +action: merge_request_click_start_review_on_changes_tab +identifiers: +- project +- namespace +- user +product_section: dev +product_stage: create +product_group: code_review +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/events/merge_request_click_start_review_on_overview_tab.yml b/config/events/merge_request_click_start_review_on_overview_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..ec7be2a6c1ee4497c1cd184877b6a6b2e374df17 --- /dev/null +++ b/config/events/merge_request_click_start_review_on_overview_tab.yml @@ -0,0 +1,20 @@ +--- +description: User clicks the "Start a review" button on the Merge Request Overview tab +category: InternalEventTracking +action: merge_request_click_start_review_on_overview_tab +identifiers: +- project +- namespace +- user +product_section: dev +product_stage: create +product_group: code_review +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/metrics/counts_28d/count_total_merge_request_click_add_to_review_on_changes_tab_monthly.yml b/config/metrics/counts_28d/count_total_merge_request_click_add_to_review_on_changes_tab_monthly.yml new file mode 100644 index 0000000000000000000000000000000000000000..160258d006e7dcfc88eb730e2bc706fc3a4be2e2 --- /dev/null +++ b/config/metrics/counts_28d/count_total_merge_request_click_add_to_review_on_changes_tab_monthly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_add_to_review_on_changes_tab_monthly +description: Monthly count of clicks on the Add to review button on the MR Changes tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 28d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_add_to_review_on_changes_tab +events: +- name: merge_request_click_add_to_review_on_changes_tab diff --git a/config/metrics/counts_28d/count_total_merge_request_click_add_to_review_on_overview_tab_monthly.yml b/config/metrics/counts_28d/count_total_merge_request_click_add_to_review_on_overview_tab_monthly.yml new file mode 100644 index 0000000000000000000000000000000000000000..8f6942d62e7666d18d245dbbd1a6116cf894ef1e --- /dev/null +++ b/config/metrics/counts_28d/count_total_merge_request_click_add_to_review_on_overview_tab_monthly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_add_to_review_on_overview_tab_monthly +description: Monthly count of clicks on the Add to review button on the MR Overview tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 28d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_add_to_review_on_overview_tab +events: +- name: merge_request_click_add_to_review_on_overview_tab diff --git a/config/metrics/counts_28d/count_total_merge_request_click_start_review_on_changes_tab_monthly.yml b/config/metrics/counts_28d/count_total_merge_request_click_start_review_on_changes_tab_monthly.yml new file mode 100644 index 0000000000000000000000000000000000000000..8b76940597963ff18edc99db922c093a6be9e211 --- /dev/null +++ b/config/metrics/counts_28d/count_total_merge_request_click_start_review_on_changes_tab_monthly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_start_review_on_changes_tab_monthly +description: Monthly count of clicks on the Start a Review button on the MR Changes tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 28d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_start_review_on_changes_tab +events: +- name: merge_request_click_start_review_on_changes_tab diff --git a/config/metrics/counts_28d/count_total_merge_request_click_start_review_on_overview_tab_monthly.yml b/config/metrics/counts_28d/count_total_merge_request_click_start_review_on_overview_tab_monthly.yml new file mode 100644 index 0000000000000000000000000000000000000000..203cd468f3da38eb6c972c9a340f29ad24b17f21 --- /dev/null +++ b/config/metrics/counts_28d/count_total_merge_request_click_start_review_on_overview_tab_monthly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_start_review_on_overview_tab_monthly +description: Monthly count of clicks on the Start a Review button on the MR Overview tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 28d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_start_review_on_overview_tab +events: +- name: merge_request_click_start_review_on_overview_tab diff --git a/config/metrics/counts_7d/count_total_merge_request_click_add_to_review_on_changes_tab_weekly.yml b/config/metrics/counts_7d/count_total_merge_request_click_add_to_review_on_changes_tab_weekly.yml new file mode 100644 index 0000000000000000000000000000000000000000..d764a377dc5dc27137159d6e7cd8dc2449889bd6 --- /dev/null +++ b/config/metrics/counts_7d/count_total_merge_request_click_add_to_review_on_changes_tab_weekly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_add_to_review_on_changes_tab_weekly +description: Weekly count of clicks on the Add to review button on the MR Changes tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 7d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_add_to_review_on_changes_tab +events: +- name: merge_request_click_add_to_review_on_changes_tab diff --git a/config/metrics/counts_7d/count_total_merge_request_click_add_to_review_on_overview_tab_weekly.yml b/config/metrics/counts_7d/count_total_merge_request_click_add_to_review_on_overview_tab_weekly.yml new file mode 100644 index 0000000000000000000000000000000000000000..c11ac48986e5eccf263df0ee50e412ca64a8e7d5 --- /dev/null +++ b/config/metrics/counts_7d/count_total_merge_request_click_add_to_review_on_overview_tab_weekly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_add_to_review_on_overview_tab_weekly +description: Weekly count of clicks on the Add to review button on the MR Overview tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 7d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_add_to_review_on_overview_tab +events: +- name: merge_request_click_add_to_review_on_overview_tab diff --git a/config/metrics/counts_7d/count_total_merge_request_click_start_review_on_changes_tab_weekly.yml b/config/metrics/counts_7d/count_total_merge_request_click_start_review_on_changes_tab_weekly.yml new file mode 100644 index 0000000000000000000000000000000000000000..0fdf6762da1a06afe4b153938901ef7f0cbf282e --- /dev/null +++ b/config/metrics/counts_7d/count_total_merge_request_click_start_review_on_changes_tab_weekly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_start_review_on_changes_tab_weekly +description: Weekly count of clicks on the Start a Review button on the MR Changes tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 7d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_start_review_on_changes_tab +events: +- name: merge_request_click_start_review_on_changes_tab diff --git a/config/metrics/counts_7d/count_total_merge_request_click_start_review_on_overview_tab_weekly.yml b/config/metrics/counts_7d/count_total_merge_request_click_start_review_on_overview_tab_weekly.yml new file mode 100644 index 0000000000000000000000000000000000000000..4ff3f9b090c05ecea0349c7d75d879e62f9a8c93 --- /dev/null +++ b/config/metrics/counts_7d/count_total_merge_request_click_start_review_on_overview_tab_weekly.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_start_review_on_overview_tab_weekly +description: Weekly count of clicks on the Start a Review button on the MR Overview tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: 7d +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_start_review_on_overview_tab +events: +- name: merge_request_click_start_review_on_overview_tab diff --git a/config/metrics/counts_all/count_total_merge_request_click_add_to_review_on_changes_tab.yml b/config/metrics/counts_all/count_total_merge_request_click_add_to_review_on_changes_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..0383f854a4ec9a5c1a5b1a7323dbb173e665f8d0 --- /dev/null +++ b/config/metrics/counts_all/count_total_merge_request_click_add_to_review_on_changes_tab.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_add_to_review_on_changes_tab +description: Total count of clicks on the Add to review button on the MR Changes tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: all +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_add_to_review_on_changes_tab +events: +- name: merge_request_click_add_to_review_on_changes_tab diff --git a/config/metrics/counts_all/count_total_merge_request_click_add_to_review_on_overview_tab.yml b/config/metrics/counts_all/count_total_merge_request_click_add_to_review_on_overview_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..e9ed2d5c155c5ad527aa9fd62801596194641fe0 --- /dev/null +++ b/config/metrics/counts_all/count_total_merge_request_click_add_to_review_on_overview_tab.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_add_to_review_on_overview_tab +description: Total count of clicks on the Add to review button on the MR Overview tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: all +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_add_to_review_on_overview_tab +events: +- name: merge_request_click_add_to_review_on_overview_tab diff --git a/config/metrics/counts_all/count_total_merge_request_click_start_review_on_changes_tab.yml b/config/metrics/counts_all/count_total_merge_request_click_start_review_on_changes_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..bac1dbbc1cb9fc5c8156bfcb6cc47635298709a4 --- /dev/null +++ b/config/metrics/counts_all/count_total_merge_request_click_start_review_on_changes_tab.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_start_review_on_changes_tab +description: Total count of clicks on the Start a Review button on the MR Changes tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: all +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_start_review_on_changes_tab +events: +- name: merge_request_click_start_review_on_changes_tab diff --git a/config/metrics/counts_all/count_total_merge_request_click_start_review_on_overview_tab.yml b/config/metrics/counts_all/count_total_merge_request_click_start_review_on_overview_tab.yml new file mode 100644 index 0000000000000000000000000000000000000000..7ee5058c7ca972c8b5e802df40cae88b157a4616 --- /dev/null +++ b/config/metrics/counts_all/count_total_merge_request_click_start_review_on_overview_tab.yml @@ -0,0 +1,26 @@ +--- +key_path: counts.count_total_merge_request_click_start_review_on_overview_tab +description: Total count of clicks on the Start a Review button on the MR Overview tab +product_section: dev +product_stage: create +product_group: code_review +performance_indicator_type: [] +value_type: number +status: active +milestone: '16.9' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/141911 +time_frame: all +data_source: internal_events +data_category: optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - merge_request_click_start_review_on_overview_tab +events: +- name: merge_request_click_start_review_on_overview_tab diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js index 4676f56c47ee9a295299cfffebcd5dfd533d9958..99b3f03ee3200582d39c1dc058b007a16a9b7bb3 100644 --- a/spec/frontend/diffs/components/app_spec.js +++ b/spec/frontend/diffs/components/app_spec.js @@ -8,6 +8,7 @@ import Vuex from 'vuex'; import getMRCodequalityAndSecurityReports from '~/diffs/components/graphql/get_mr_codequality_and_security_reports.query.graphql'; import createMockApollo from 'helpers/mock_apollo_helper'; import setWindowLocation from 'helpers/set_window_location_helper'; +import { mockTracking } from 'helpers/tracking_helper'; import { TEST_HOST } from 'spec/test_constants'; import App from '~/diffs/components/app.vue'; @@ -22,6 +23,7 @@ import CollapsedFilesWarning from '~/diffs/components/collapsed_files_warning.vu import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue'; import eventHub from '~/diffs/event_hub'; +import notesEventHub from '~/notes/event_hub'; import { EVT_DISCUSSIONS_ASSIGNED } from '~/diffs/constants'; import axios from '~/lib/utils/axios_utils'; @@ -892,4 +894,38 @@ describe('diffs/components/app', () => { expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true); }); }); + + describe('draft comments', () => { + let trackingSpy; + + beforeEach(() => { + trackingSpy = mockTracking(undefined, window.document, jest.spyOn); + }); + + describe('when adding a new comment to an existing review', () => { + it('sends the correct tracking event', () => { + createComponent({ shouldShow: true }); + notesEventHub.$emit('noteFormAddToReview', { name: 'noteFormAddToReview' }); + + expect(trackingSpy).toHaveBeenCalledWith( + undefined, + 'merge_request_click_add_to_review_on_changes_tab', + expect.any(Object), + ); + }); + }); + + describe('when adding a comment to a new review', () => { + it('sends the correct tracking event', () => { + createComponent({ shouldShow: true }); + notesEventHub.$emit('noteFormStartReview', { name: 'noteFormStartReview' }); + + expect(trackingSpy).toHaveBeenCalledWith( + undefined, + 'merge_request_click_start_review_on_changes_tab', + expect.any(Object), + ); + }); + }); + }); }); diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js index 8f761476c7c99ed7813526457f507939457be11e..500032eac26cb2b332064d3b7dc7e7b9b7ef826a 100644 --- a/spec/frontend/notes/components/comment_form_spec.js +++ b/spec/frontend/notes/components/comment_form_spec.js @@ -401,11 +401,28 @@ describe('issue_comment_form component', () => { let store; beforeEach(() => { - store = createStore(); + store = createStore({ + actions: { + saveNote: jest.fn().mockResolvedValue(), + }, + }); store.registerModule('batchComments', batchComments()); store.state.batchComments.drafts = [{ note: 'A' }]; }); + it('sends the event to indicate that a new draft comment has been added', () => { + const note = 'some note text which enables actually adding a draft note'; + + jest.spyOn(eventHub, '$emit'); + mountComponent({ mountFunction: mount, initialData: { note }, store }); + + findAddToReviewButton().trigger('click'); + + expect(eventHub.$emit).toHaveBeenCalledWith('noteFormAddToReview', { + name: 'noteFormAddToReview', + }); + }); + it('should save note draft when cmd+enter is pressed', async () => { mountComponent({ mountFunction: mount, store }); jest.spyOn(wrapper.vm, 'handleSaveDraft'); diff --git a/spec/frontend/notes/components/note_form_spec.js b/spec/frontend/notes/components/note_form_spec.js index e2072ebd04d178824dbae01cdff64983da481463..dad36a290b1dc2ec435ee41f1cd25fe773df000c 100644 --- a/spec/frontend/notes/components/note_form_spec.js +++ b/spec/frontend/notes/components/note_form_spec.js @@ -7,6 +7,7 @@ import MarkdownField from '~/vue_shared/components/markdown/field.vue'; import CommentFieldLayout from '~/notes/components/comment_field_layout.vue'; import { AT_WHO_ACTIVE_CLASS } from '~/gfm_auto_complete'; import eventHub from '~/environments/event_hub'; +import notesEventHub from '~/notes/event_hub'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import { mockTracking } from 'helpers/tracking_helper'; import { noteableDataMock, notesDataMock, discussionMock, note } from '../mock_data'; @@ -16,6 +17,7 @@ jest.mock('~/lib/utils/autosave'); describe('issue_note_form component', () => { let store; let wrapper; + let textarea; let props; let trackingSpy; @@ -39,10 +41,13 @@ describe('issue_note_form component', () => { }, }, }); + + textarea = wrapper.find('textarea'); }; const findCancelButton = () => wrapper.findByTestId('cancel'); const findCancelCommentButton = () => wrapper.findByTestId('cancelBatchCommentsEnabled'); + const findAddToStartReviewButton = () => wrapper.findByTestId('start-review-button'); const findMarkdownField = () => wrapper.findComponent(MarkdownField); beforeEach(() => { @@ -112,14 +117,10 @@ describe('issue_note_form component', () => { }); it('should render text area with placeholder', () => { - const textarea = wrapper.find('textarea'); - expect(textarea.attributes('placeholder')).toBe('Write a comment or drag your files here…'); }); it('should set data-supports-quick-actions to enable autocomplete', () => { - const textarea = wrapper.find('textarea'); - expect(textarea.attributes('data-supports-quick-actions')).toBe('true'); }); @@ -147,10 +148,7 @@ describe('issue_note_form component', () => { }); describe('keyboard events', () => { - let textarea; - beforeEach(() => { - textarea = wrapper.find('textarea'); textarea.setValue('Foo'); }); @@ -213,7 +211,6 @@ describe('issue_note_form component', () => { it('should be possible to update the note', () => { createComponentWrapper(); - const textarea = wrapper.find('textarea'); textarea.setValue('Foo'); const saveButton = wrapper.find('.js-vue-issue-save'); saveButton.vm.$emit('click'); @@ -224,7 +221,6 @@ describe('issue_note_form component', () => { it('tracks event when save button is clicked', () => { createComponentWrapper(); - const textarea = wrapper.find('textarea'); textarea.setValue('Foo'); const saveButton = wrapper.find('.js-vue-issue-save'); saveButton.vm.$emit('click'); @@ -313,8 +309,6 @@ describe('issue_note_form component', () => { describe('on enter', () => { it('should start review or add to review when cmd+enter is pressed', async () => { - const textarea = wrapper.find('textarea'); - textarea.setValue('Foo'); textarea.trigger('keydown.enter', { metaKey: true }); @@ -325,5 +319,40 @@ describe('issue_note_form component', () => { ]); }); }); + + describe('when adding a draft comment', () => { + beforeEach(() => { + jest.spyOn(notesEventHub, '$emit'); + }); + + it('sends the event to indicate that a draft has been added to the review', () => { + store.state.batchComments.drafts = [{ note: 'A' }]; + createComponentWrapper({ + isDraft: true, + noteId: '', + discussion: { ...discussionMock, for_commit: false }, + }); + + findAddToStartReviewButton().trigger('click'); + + expect(notesEventHub.$emit).toHaveBeenCalledWith('noteFormAddToReview', { + name: 'noteFormAddToReview', + }); + }); + + it('sends the event to indicate that a review has been started with the new draft', () => { + createComponentWrapper({ + isDraft: true, + noteId: '', + discussion: { ...discussionMock, for_commit: false }, + }); + + findAddToStartReviewButton().trigger('click'); + + expect(notesEventHub.$emit).toHaveBeenCalledWith('noteFormStartReview', { + name: 'noteFormStartReview', + }); + }); + }); }); }); diff --git a/spec/frontend/notes/components/notes_app_spec.js b/spec/frontend/notes/components/notes_app_spec.js index d49ab0d71dbdfa3ca93c3a58934d759774f48f6b..e278d53b55af8312bd451195be15e14f5c3c39b8 100644 --- a/spec/frontend/notes/components/notes_app_spec.js +++ b/spec/frontend/notes/components/notes_app_spec.js @@ -3,6 +3,7 @@ import AxiosMockAdapter from 'axios-mock-adapter'; import $ from 'jquery'; import { nextTick } from 'vue'; import setWindowLocation from 'helpers/set_window_location_helper'; +import { mockTracking } from 'helpers/tracking_helper'; import waitForPromises from 'helpers/wait_for_promises'; import DraftNote from '~/batch_comments/components/draft_note.vue'; import batchComments from '~/batch_comments/stores/modules/batch_comments'; @@ -10,6 +11,7 @@ import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_OK } from '~/lib/utils/http_status'; import { getLocationHash } from '~/lib/utils/url_utility'; import * as urlUtility from '~/lib/utils/url_utility'; +import notesEventHub from '~/notes/event_hub'; import CommentForm from '~/notes/components/comment_form.vue'; import NotesApp from '~/notes/components/notes_app.vue'; import NotesActivityHeader from '~/notes/components/notes_activity_header.vue'; @@ -453,4 +455,39 @@ describe('note_app', () => { }); }); }); + + describe('draft comments', () => { + let trackingSpy; + + beforeEach(() => { + window.mrTabs = { eventHub: notesEventHub }; + axiosMock.onAny().reply(mockData.getIndividualNoteResponse); + trackingSpy = mockTracking(undefined, window.document, jest.spyOn); + wrapper = mountComponent(); + }); + + describe('when adding a new comment to an existing review', () => { + it('sends the correct tracking event', () => { + notesEventHub.$emit('noteFormAddToReview', { name: 'noteFormAddToReview' }); + + expect(trackingSpy).toHaveBeenCalledWith( + undefined, + 'merge_request_click_add_to_review_on_overview_tab', + expect.any(Object), + ); + }); + }); + + describe('when adding a comment to a new review', () => { + it('sends the correct tracking event', () => { + notesEventHub.$emit('noteFormStartReview', { name: 'noteFormStartReview' }); + + expect(trackingSpy).toHaveBeenCalledWith( + undefined, + 'merge_request_click_start_review_on_overview_tab', + expect.any(Object), + ); + }); + }); + }); });