Commit b6d5a7c1 authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab-ce master

parents efcd5785 ae853dba
...@@ -69,6 +69,16 @@ export default { ...@@ -69,6 +69,16 @@ export default {
required: false, required: false,
default: false, default: false,
}, },
dismissEndpoint: {
type: String,
required: false,
default: '',
},
showSuggestPopover: {
type: Boolean,
required: false,
default: false,
},
}, },
data() { data() {
const treeWidth = const treeWidth =
...@@ -141,7 +151,12 @@ export default { ...@@ -141,7 +151,12 @@ export default {
showTreeList: 'adjustView', showTreeList: 'adjustView',
}, },
mounted() { mounted() {
this.setBaseConfig({ endpoint: this.endpoint, projectPath: this.projectPath }); this.setBaseConfig({
endpoint: this.endpoint,
projectPath: this.projectPath,
dismissEndpoint: this.dismissEndpoint,
showSuggestPopover: this.showSuggestPopover,
});
if (this.shouldShow) { if (this.shouldShow) {
this.fetchData(); this.fetchData();
......
...@@ -42,6 +42,7 @@ export default { ...@@ -42,6 +42,7 @@ export default {
noteableData: state => state.notes.noteableData, noteableData: state => state.notes.noteableData,
diffViewType: state => state.diffs.diffViewType, diffViewType: state => state.diffs.diffViewType,
}), }),
...mapState('diffs', ['showSuggestPopover']),
...mapGetters('diffs', ['getDiffFileByHash']), ...mapGetters('diffs', ['getDiffFileByHash']),
...mapGetters([ ...mapGetters([
'isLoggedIn', 'isLoggedIn',
...@@ -80,7 +81,12 @@ export default { ...@@ -80,7 +81,12 @@ export default {
} }
}, },
methods: { methods: {
...mapActions('diffs', ['cancelCommentForm', 'assignDiscussionsToDiff', 'saveDiffDiscussion']), ...mapActions('diffs', [
'cancelCommentForm',
'assignDiscussionsToDiff',
'saveDiffDiscussion',
'setSuggestPopoverDismissed',
]),
handleCancelCommentForm(shouldConfirm, isDirty) { handleCancelCommentForm(shouldConfirm, isDirty) {
if (shouldConfirm && isDirty) { if (shouldConfirm && isDirty) {
const msg = s__('Notes|Are you sure you want to cancel creating this comment?'); const msg = s__('Notes|Are you sure you want to cancel creating this comment?');
...@@ -125,11 +131,13 @@ export default { ...@@ -125,11 +131,13 @@ export default {
:line="line" :line="line"
:help-page-path="helpPagePath" :help-page-path="helpPagePath"
:diff-file="diffFile" :diff-file="diffFile"
:show-suggest-popover="showSuggestPopover"
save-button-title="Comment" save-button-title="Comment"
class="diff-comment-form" class="diff-comment-form"
@handleFormUpdateAddToReview="addToReview" @handleFormUpdateAddToReview="addToReview"
@cancelForm="handleCancelCommentForm" @cancelForm="handleCancelCommentForm"
@handleFormUpdate="handleSaveNote" @handleFormUpdate="handleSaveNote"
@handleSuggestDismissed="setSuggestPopoverDismissed"
/> />
</div> </div>
</template> </template>
...@@ -72,6 +72,8 @@ export default function initDiffsApp(store) { ...@@ -72,6 +72,8 @@ export default function initDiffsApp(store) {
currentUser: JSON.parse(dataset.currentUserData) || {}, currentUser: JSON.parse(dataset.currentUserData) || {},
changesEmptyStateIllustration: dataset.changesEmptyStateIllustration, changesEmptyStateIllustration: dataset.changesEmptyStateIllustration,
isFluidLayout: parseBoolean(dataset.isFluidLayout), isFluidLayout: parseBoolean(dataset.isFluidLayout),
dismissEndpoint: dataset.dismissEndpoint,
showSuggestPopover: parseBoolean(dataset.showSuggestPopover),
}; };
}, },
computed: { computed: {
...@@ -99,6 +101,8 @@ export default function initDiffsApp(store) { ...@@ -99,6 +101,8 @@ export default function initDiffsApp(store) {
shouldShow: this.activeTab === 'diffs', shouldShow: this.activeTab === 'diffs',
changesEmptyStateIllustration: this.changesEmptyStateIllustration, changesEmptyStateIllustration: this.changesEmptyStateIllustration,
isFluidLayout: this.isFluidLayout, isFluidLayout: this.isFluidLayout,
dismissEndpoint: this.dismissEndpoint,
showSuggestPopover: this.showSuggestPopover,
}, },
}); });
}, },
......
...@@ -36,8 +36,8 @@ import { ...@@ -36,8 +36,8 @@ import {
import { diffViewerModes } from '~/ide/constants'; import { diffViewerModes } from '~/ide/constants';
export const setBaseConfig = ({ commit }, options) => { export const setBaseConfig = ({ commit }, options) => {
const { endpoint, projectPath } = options; const { endpoint, projectPath, dismissEndpoint, showSuggestPopover } = options;
commit(types.SET_BASE_CONFIG, { endpoint, projectPath }); commit(types.SET_BASE_CONFIG, { endpoint, projectPath, dismissEndpoint, showSuggestPopover });
}; };
export const fetchDiffFiles = ({ state, commit }) => { export const fetchDiffFiles = ({ state, commit }) => {
...@@ -455,5 +455,17 @@ export const toggleFullDiff = ({ dispatch, getters, state }, filePath) => { ...@@ -455,5 +455,17 @@ export const toggleFullDiff = ({ dispatch, getters, state }, filePath) => {
export const setFileCollapsed = ({ commit }, { filePath, collapsed }) => export const setFileCollapsed = ({ commit }, { filePath, collapsed }) =>
commit(types.SET_FILE_COLLAPSED, { filePath, collapsed }); commit(types.SET_FILE_COLLAPSED, { filePath, collapsed });
export const setSuggestPopoverDismissed = ({ commit, state }) =>
axios
.post(state.dismissEndpoint, {
feature_name: 'suggest_popover_dismissed',
})
.then(() => {
commit(types.SET_SHOW_SUGGEST_POPOVER);
})
.catch(() => {
createFlash(s__('MergeRequest|Error dismissing suggestion popover. Please try again.'));
});
// prevent babel-plugin-rewire from generating an invalid default during karma tests // prevent babel-plugin-rewire from generating an invalid default during karma tests
export default () => {}; export default () => {};
...@@ -28,4 +28,6 @@ export default () => ({ ...@@ -28,4 +28,6 @@ export default () => ({
renderTreeList: true, renderTreeList: true,
showWhitespace: true, showWhitespace: true,
fileFinderVisible: false, fileFinderVisible: false,
dismissEndpoint: '',
showSuggestPopover: true,
}); });
...@@ -33,3 +33,5 @@ export const SET_HIDDEN_VIEW_DIFF_FILE_LINES = 'SET_HIDDEN_VIEW_DIFF_FILE_LINES' ...@@ -33,3 +33,5 @@ export const SET_HIDDEN_VIEW_DIFF_FILE_LINES = 'SET_HIDDEN_VIEW_DIFF_FILE_LINES'
export const SET_CURRENT_VIEW_DIFF_FILE_LINES = 'SET_CURRENT_VIEW_DIFF_FILE_LINES'; export const SET_CURRENT_VIEW_DIFF_FILE_LINES = 'SET_CURRENT_VIEW_DIFF_FILE_LINES';
export const ADD_CURRENT_VIEW_DIFF_FILE_LINES = 'ADD_CURRENT_VIEW_DIFF_FILE_LINES'; export const ADD_CURRENT_VIEW_DIFF_FILE_LINES = 'ADD_CURRENT_VIEW_DIFF_FILE_LINES';
export const TOGGLE_DIFF_FILE_RENDERING_MORE = 'TOGGLE_DIFF_FILE_RENDERING_MORE'; export const TOGGLE_DIFF_FILE_RENDERING_MORE = 'TOGGLE_DIFF_FILE_RENDERING_MORE';
export const SET_SHOW_SUGGEST_POPOVER = 'SET_SHOW_SUGGEST_POPOVER';
...@@ -11,8 +11,8 @@ import * as types from './mutation_types'; ...@@ -11,8 +11,8 @@ import * as types from './mutation_types';
export default { export default {
[types.SET_BASE_CONFIG](state, options) { [types.SET_BASE_CONFIG](state, options) {
const { endpoint, projectPath } = options; const { endpoint, projectPath, dismissEndpoint, showSuggestPopover } = options;
Object.assign(state, { endpoint, projectPath }); Object.assign(state, { endpoint, projectPath, dismissEndpoint, showSuggestPopover });
}, },
[types.SET_LOADING](state, isLoading) { [types.SET_LOADING](state, isLoading) {
...@@ -302,4 +302,7 @@ export default { ...@@ -302,4 +302,7 @@ export default {
file.renderingLines = !file.renderingLines; file.renderingLines = !file.renderingLines;
}, },
[types.SET_SHOW_SUGGEST_POPOVER](state) {
state.showSuggestPopover = false;
},
}; };
...@@ -77,6 +77,11 @@ export default { ...@@ -77,6 +77,11 @@ export default {
required: false, required: false,
default: '', default: '',
}, },
showSuggestPopover: {
type: Boolean,
required: false,
default: false,
},
}, },
data() { data() {
let updatedNoteBody = this.noteBody; let updatedNoteBody = this.noteBody;
...@@ -247,6 +252,8 @@ export default { ...@@ -247,6 +252,8 @@ export default {
:can-suggest="canSuggest" :can-suggest="canSuggest"
:add-spacing-classes="false" :add-spacing-classes="false"
:help-page-path="helpPagePath" :help-page-path="helpPagePath"
:show-suggest-popover="showSuggestPopover"
@handleSuggestDismissed="() => $emit('handleSuggestDismissed')"
> >
<textarea <textarea
id="note_note" id="note_note"
...@@ -303,7 +310,7 @@ export default { ...@@ -303,7 +310,7 @@ export default {
{{ __('Add comment now') }} {{ __('Add comment now') }}
</button> </button>
<button <button
class="btn btn-cancel note-edit-cancel js-close-discussion-note-form" class="btn note-edit-cancel js-close-discussion-note-form"
type="button" type="button"
@click="cancelHandler()" @click="cancelHandler()"
> >
......
...@@ -67,6 +67,11 @@ export default { ...@@ -67,6 +67,11 @@ export default {
required: false, required: false,
default: '', default: '',
}, },
showSuggestPopover: {
type: Boolean,
required: false,
default: false,
},
}, },
data() { data() {
return { return {
...@@ -194,8 +199,10 @@ export default { ...@@ -194,8 +199,10 @@ export default {
:preview-markdown="previewMarkdown" :preview-markdown="previewMarkdown"
:line-content="lineContent" :line-content="lineContent"
:can-suggest="canSuggest" :can-suggest="canSuggest"
:show-suggest-popover="showSuggestPopover"
@preview-markdown="showPreviewTab" @preview-markdown="showPreviewTab"
@write-markdown="showWriteTab" @write-markdown="showWriteTab"
@handleSuggestDismissed="() => $emit('handleSuggestDismissed')"
/> />
<div v-show="!previewMarkdown" class="md-write-holder"> <div v-show="!previewMarkdown" class="md-write-holder">
<div class="zen-backdrop"> <div class="zen-backdrop">
......
<script> <script>
import $ from 'jquery'; import $ from 'jquery';
import { GlTooltipDirective } from '@gitlab/ui'; import { GlPopover, GlButton, GlTooltipDirective } from '@gitlab/ui';
import ToolbarButton from './toolbar_button.vue'; import ToolbarButton from './toolbar_button.vue';
import Icon from '../icon.vue'; import Icon from '../icon.vue';
...@@ -8,6 +8,8 @@ export default { ...@@ -8,6 +8,8 @@ export default {
components: { components: {
ToolbarButton, ToolbarButton,
Icon, Icon,
GlPopover,
GlButton,
}, },
directives: { directives: {
GlTooltip: GlTooltipDirective, GlTooltip: GlTooltipDirective,
...@@ -27,6 +29,11 @@ export default { ...@@ -27,6 +29,11 @@ export default {
required: false, required: false,
default: true, default: true,
}, },
showSuggestPopover: {
type: Boolean,
required: false,
default: false,
},
}, },
computed: { computed: {
mdTable() { mdTable() {
...@@ -70,6 +77,9 @@ export default { ...@@ -70,6 +77,9 @@ export default {
this.$emit('write-markdown'); this.$emit('write-markdown');
}, },
handleSuggestDismissed() {
this.$emit('handleSuggestDismissed');
},
}, },
}; };
</script> </script>
...@@ -93,66 +103,92 @@ export default { ...@@ -93,66 +103,92 @@ export default {
</button> </button>
</li> </li>
<li :class="{ active: !previewMarkdown }" class="md-header-toolbar"> <li :class="{ active: !previewMarkdown }" class="md-header-toolbar">
<toolbar-button tag="**" :button-title="__('Add bold text')" icon="bold" /> <div class="d-inline-block">
<toolbar-button tag="*" :button-title="__('Add italic text')" icon="italic" /> <toolbar-button tag="**" :button-title="__('Add bold text')" icon="bold" />
<toolbar-button <toolbar-button tag="*" :button-title="__('Add italic text')" icon="italic" />
:prepend="true" <toolbar-button
tag="> " :prepend="true"
:button-title="__('Insert a quote')" tag="> "
icon="quote" :button-title="__('Insert a quote')"
/> icon="quote"
<toolbar-button tag="`" tag-block="```" :button-title="__('Insert code')" icon="code" /> />
<toolbar-button </div>
tag="[{text}](url)" <div class="d-inline-block ml-md-2 ml-0">
tag-select="url" <template v-if="canSuggest">
:button-title="__('Add a link')" <toolbar-button
icon="link" ref="suggestButton"
/> :tag="mdSuggestion"
<toolbar-button :prepend="true"
:prepend="true" :button-title="__('Insert suggestion')"
tag="* " :cursor-offset="4"
:button-title="__('Add a bullet list')" :tag-content="lineContent"
icon="list-bulleted" icon="doc-code"
/> class="qa-suggestion-btn"
<toolbar-button @click="handleSuggestDismissed"
:prepend="true" />
tag="1. " <gl-popover
:button-title="__('Add a numbered list')" v-if="showSuggestPopover"
icon="list-numbered" :target="() => $refs.suggestButton"
/> :css-classes="['diff-suggest-popover']"
<toolbar-button placement="bottom"
:prepend="true" :show="showSuggestPopover"
tag="* [ ] " >
:button-title="__('Add a task list')" <strong>{{ __('New! Suggest changes directly') }}</strong>
icon="task-done" <p class="mb-2">
/> {{ __('Suggest code changes which are immediately applied. Try it out!') }}
<toolbar-button </p>
:tag="mdTable" <gl-button variant="primary" size="sm" @click="handleSuggestDismissed">
:prepend="true" {{ __('Got it') }}
:button-title="__('Add a table')" </gl-button>
icon="table" </gl-popover>
/> </template>
<toolbar-button <toolbar-button tag="`" tag-block="```" :button-title="__('Insert code')" icon="code" />
v-if="canSuggest" <toolbar-button
:tag="mdSuggestion" tag="[{text}](url)"
:prepend="true" tag-select="url"
:button-title="__('Insert suggestion')" :button-title="__('Add a link')"
:cursor-offset="4" icon="link"
:tag-content="lineContent" />
icon="doc-code" </div>
class="qa-suggestion-btn" <div class="d-inline-block ml-md-2 ml-0">
/> <toolbar-button
<button :prepend="true"
v-gl-tooltip tag="* "
:aria-label="__('Go full screen')" :button-title="__('Add a bullet list')"
class="toolbar-btn toolbar-fullscreen-btn js-zen-enter" icon="list-bulleted"
data-container="body" />
tabindex="-1" <toolbar-button
:title="__('Go full screen')" :prepend="true"
type="button" tag="1. "
> :button-title="__('Add a numbered list')"
<icon name="screen-full" /> icon="list-numbered"
</button> />
<toolbar-button
:prepend="true"
tag="* [ ] "
:button-title="__('Add a task list')"
icon="task-done"
/>
<toolbar-button
:tag="mdTable"
:prepend="true"
:button-title="__('Add a table')"
icon="table"
/>
</div>
<div class="d-inline-block ml-md-2 ml-0">
<button
v-gl-tooltip
:aria-label="__('Go full screen')"
class="toolbar-btn toolbar-fullscreen-btn js-zen-enter"
data-container="body"
tabindex="-1"
:title="__('Go full screen')"
type="button"
>
<icon name="screen-full" />
</button>
</div>
</li> </li>
</ul> </ul>
</div> </div>
......
...@@ -66,6 +66,7 @@ export default { ...@@ -66,6 +66,7 @@ export default {
class="toolbar-btn js-md" class="toolbar-btn js-md"
tabindex="-1" tabindex="-1"
data-container="body" data-container="body"
@click="() => $emit('click')"
> >
<icon :name="icon" /> <icon :name="icon" />
</button> </button>
......
...@@ -154,11 +154,9 @@ ...@@ -154,11 +154,9 @@
} }
.toolbar-fullscreen-btn { .toolbar-fullscreen-btn {
margin-left: $gl-padding;
margin-right: -5px; margin-right: -5px;
@include media-breakpoint-down(xs) { @include media-breakpoint-down(xs) {
margin-left: 0;
margin-right: 0; margin-right: 0;
} }
} }
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
position: -webkit-sticky; position: -webkit-sticky;
position: sticky; position: sticky;
top: $mr-file-header-top; top: $mr-file-header-top;
z-index: 102; z-index: 220;
&::before { &::before {
content: ''; content: '';
...@@ -1122,3 +1122,15 @@ table.code { ...@@ -1122,3 +1122,15 @@ table.code {
outline: 0; outline: 0;
} }
} }
.diff-suggest-popover {
&.popover {
width: 250px;
min-width: 250px;
z-index: 210;
}
.popover-header {
display: none;
}
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
module UserCalloutsHelper module UserCalloutsHelper
GKE_CLUSTER_INTEGRATION = 'gke_cluster_integration'.freeze GKE_CLUSTER_INTEGRATION = 'gke_cluster_integration'.freeze
GCP_SIGNUP_OFFER = 'gcp_signup_offer'.freeze GCP_SIGNUP_OFFER = 'gcp_signup_offer'.freeze
SUGGEST_POPOVER_DISMISSED = 'suggest_popover_dismissed'.freeze
def show_gke_cluster_integration_callout?(project) def show_gke_cluster_integration_callout?(project)
can?(current_user, :create_cluster, project) && can?(current_user, :create_cluster, project) &&
...@@ -20,6 +21,10 @@ module UserCalloutsHelper ...@@ -20,6 +21,10 @@ module UserCalloutsHelper
def render_dashboard_gold_trial(user) def render_dashboard_gold_trial(user)
end end
def show_suggest_popover?
!user_dismissed?(SUGGEST_POPOVER_DISMISSED)
end
private private
def user_dismissed?(feature_name) def user_dismissed?(feature_name)
......
...@@ -10,7 +10,8 @@ module UserCalloutEnums ...@@ -10,7 +10,8 @@ module UserCalloutEnums
{ {
gke_cluster_integration: 1, gke_cluster_integration: 1,
gcp_signup_offer: 2, gcp_signup_offer: 2,
cluster_security_warning: 3 cluster_security_warning: 3,
suggest_popover_dismissed: 4
} }
end end
end end
......
...@@ -80,7 +80,9 @@ ...@@ -80,7 +80,9 @@
current_user_data: UserSerializer.new(project: @project).represent(current_user, {}, MergeRequestUserEntity).to_json, current_user_data: UserSerializer.new(project: @project).represent(current_user, {}, MergeRequestUserEntity).to_json,
project_path: project_path(@merge_request.project), project_path: project_path(@merge_request.project),
changes_empty_state_illustration: image_path('illustrations/merge_request_changes_empty.svg'), changes_empty_state_illustration: image_path('illustrations/merge_request_changes_empty.svg'),
is_fluid_layout: fluid_layout.to_s } } is_fluid_layout: fluid_layout.to_s,
dismiss_endpoint: user_callouts_path,
show_suggest_popover: show_suggest_popover?.to_s } }
.mr-loading-status .mr-loading-status
= spinner = spinner
......
---
title: Added diff suggestion feature discovery popover
merge_request:
author:
type: added
...@@ -69,6 +69,9 @@ This can be done in two ways: ...@@ -69,6 +69,9 @@ This can be done in two ways:
- Manually specifying the job definition. Not recommended unless using GitLab - Manually specifying the job definition. Not recommended unless using GitLab
11.8 and earlier. 11.8 and earlier.
The License Management settings can be changed through environment variables by using the
[`variables`](../../../ci/yaml/README.md#variables) parameter in `.gitlab-ci.yml`. These variables are documented in the [License Management documentation](https://gitlab.com/gitlab-org/security-products/license-management#settings).
### Including the provided template ### Including the provided template
NOTE: **Note:** NOTE: **Note:**
......
...@@ -32,7 +32,7 @@ describe 'Issue markdown toolbar', :js do ...@@ -32,7 +32,7 @@ describe 'Issue markdown toolbar', :js do
find('.js-main-target-form #note-body') find('.js-main-target-form #note-body')
page.evaluate_script('document.querySelectorAll(".js-main-target-form #note-body")[0].setSelectionRange(4, 50)') page.evaluate_script('document.querySelectorAll(".js-main-target-form #note-body")[0].setSelectionRange(4, 50)')
find('.toolbar-btn:nth-child(2)').click all('.toolbar-btn')[1].click
expect(find('#note-body')[:value]).to eq("test\n*underline*\n") expect(find('#note-body')[:value]).to eq("test\n*underline*\n")
end end
......
...@@ -141,7 +141,7 @@ describe 'Merge request > User posts notes', :js do ...@@ -141,7 +141,7 @@ describe 'Merge request > User posts notes', :js do
page.within('.current-note-edit-form') do page.within('.current-note-edit-form') do
expect(find('#note_note').value).to eq('This is the new content') expect(find('#note_note').value).to eq('This is the new content')
find('.js-md:first-child').click first('.js-md').click
expect(find('#note_note').value).to eq('This is the new content****') expect(find('#note_note').value).to eq('This is the new content****')
end end
end end
......
...@@ -28,6 +28,18 @@ describe 'User comments on a diff', :js do ...@@ -28,6 +28,18 @@ describe 'User comments on a diff', :js do
end end
context 'single suggestion note' do context 'single suggestion note' do
it 'hides suggestion popover' do
click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']"))
expect(page).to have_selector('.diff-suggest-popover')
page.within('.diff-suggest-popover') do
click_button 'Got it'
end
expect(page).not_to have_selector('.diff-suggest-popover')
end
it 'suggestion is presented' do it 'suggestion is presented' do
click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']")) click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']"))
......
...@@ -37,6 +37,8 @@ describe('diffs/components/app', () => { ...@@ -37,6 +37,8 @@ describe('diffs/components/app', () => {
projectPath: 'namespace/project', projectPath: 'namespace/project',
currentUser: {}, currentUser: {},
changesEmptyStateIllustration: '', changesEmptyStateIllustration: '',
dismissEndpoint: '',
showSuggestPopover: true,
...props, ...props,
}, },
store, store,
......
...@@ -37,6 +37,7 @@ import actions, { ...@@ -37,6 +37,7 @@ import actions, {
toggleFullDiff, toggleFullDiff,
setFileCollapsed, setFileCollapsed,
setExpandedDiffLines, setExpandedDiffLines,
setSuggestPopoverDismissed,
} from '~/diffs/store/actions'; } from '~/diffs/store/actions';
import eventHub from '~/notes/event_hub'; import eventHub from '~/notes/event_hub';
import * as types from '~/diffs/store/mutation_types'; import * as types from '~/diffs/store/mutation_types';
...@@ -68,12 +69,19 @@ describe('DiffsStoreActions', () => { ...@@ -68,12 +69,19 @@ describe('DiffsStoreActions', () => {
it('should set given endpoint and project path', done => { it('should set given endpoint and project path', done => {
const endpoint = '/diffs/set/endpoint'; const endpoint = '/diffs/set/endpoint';
const projectPath = '/root/project'; const projectPath = '/root/project';
const dismissEndpoint = '/-/user_callouts';
const showSuggestPopover = false;
testAction( testAction(
setBaseConfig, setBaseConfig,
{ endpoint, projectPath }, { endpoint, projectPath, dismissEndpoint, showSuggestPopover },
{ endpoint: '', projectPath: '' }, { endpoint: '', projectPath: '', dismissEndpoint: '', showSuggestPopover: true },
[{ type: types.SET_BASE_CONFIG, payload: { endpoint, projectPath } }], [
{
type: types.SET_BASE_CONFIG,
payload: { endpoint, projectPath, dismissEndpoint, showSuggestPopover },
},
],
[], [],
done, done,
); );
...@@ -1080,4 +1088,30 @@ describe('DiffsStoreActions', () => { ...@@ -1080,4 +1088,30 @@ describe('DiffsStoreActions', () => {
); );
}); });
}); });
describe('setSuggestPopoverDismissed', () => {
it('commits SET_SHOW_SUGGEST_POPOVER', done => {
const state = { dismissEndpoint: `${gl.TEST_HOST}/-/user_callouts` };
const mock = new MockAdapter(axios);
mock.onPost(state.dismissEndpoint).reply(200, {});
spyOn(axios, 'post').and.callThrough();
testAction(
setSuggestPopoverDismissed,
null,
state,
[{ type: types.SET_SHOW_SUGGEST_POPOVER }],
[],
() => {
expect(axios.post).toHaveBeenCalledWith(state.dismissEndpoint, {
feature_name: 'suggest_popover_dismissed',
});
mock.restore();
done();
},
);
});
});
}); });
...@@ -850,4 +850,14 @@ describe('DiffsStoreMutations', () => { ...@@ -850,4 +850,14 @@ describe('DiffsStoreMutations', () => {
expect(file.renderingLines).toBe(false); expect(file.renderingLines).toBe(false);
}); });
}); });
describe('SET_SHOW_SUGGEST_POPOVER', () => {
it('sets showSuggestPopover to false', () => {
const state = { showSuggestPopover: true };
mutations[types.SET_SHOW_SUGGEST_POPOVER](state);
expect(state.showSuggestPopover).toBe(false);
});
});
}); });
...@@ -22,13 +22,13 @@ describe('Markdown field header component', () => { ...@@ -22,13 +22,13 @@ describe('Markdown field header component', () => {
'Add bold text', 'Add bold text',
'Add italic text', 'Add italic text',
'Insert a quote', 'Insert a quote',
'Insert suggestion',
'Insert code', 'Insert code',
'Add a link', 'Add a link',
'Add a bullet list', 'Add a bullet list',
'Add a numbered list', 'Add a numbered list',
'Add a task list', 'Add a task list',
'Add a table', 'Add a table',
'Insert suggestion',
'Go full screen', 'Go full screen',
]; ];
const elements = vm.$el.querySelectorAll('.toolbar-btn'); const elements = vm.$el.querySelectorAll('.toolbar-btn');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment