diff options
author | Fatih Acet <acetfatih@gmail.com> | 2018-08-18 01:05:22 +0200 |
---|---|---|
committer | Fatih Acet <acetfatih@gmail.com> | 2018-09-03 09:49:32 +0200 |
commit | e0ab3ed5545df468411f1b8675de6873ed57e595 (patch) | |
tree | c55e37943db53916ce05c65aa91eb814ef27a89a | |
parent | ba99dfcde262c91e33b5bf7f86ba7c0e3b6f7e52 (diff) | |
download | gitlab-ce-e0ab3ed5545df468411f1b8675de6873ed57e595.tar.gz |
Disable Web IDE button if user is not allowed to push the source branch.
4 files changed, 69 insertions, 26 deletions
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue index 72bd28ae03f..4c3f8dff3c4 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue @@ -4,6 +4,7 @@ import { n__, s__, sprintf } from '~/locale'; import { mergeUrlParams, webIDEUrl } from '~/lib/utils/url_utility'; import Icon from '~/vue_shared/components/icon.vue'; import clipboardButton from '~/vue_shared/components/clipboard_button.vue'; +import tooltip from '~/vue_shared/directives/tooltip'; import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue'; export default { @@ -13,6 +14,9 @@ export default { clipboardButton, TooltipOnTruncate, }, + directives: { + tooltip, + }, props: { mr: { type: Object, @@ -40,10 +44,19 @@ export default { }); }, webIdePath() { - return mergeUrlParams({ - target_project: this.mr.sourceProjectFullPath !== this.mr.targetProjectFullPath ? - this.mr.targetProjectFullPath : '', - }, webIDEUrl(`/${this.mr.sourceProjectFullPath}/merge_requests/${this.mr.iid}`)); + if (this.mr.canPushToSourceBranch) { + return mergeUrlParams({ + target_project: this.mr.sourceProjectFullPath !== this.mr.targetProjectFullPath ? + this.mr.targetProjectFullPath : '', + }, webIDEUrl(`/${this.mr.sourceProjectFullPath}/merge_requests/${this.mr.iid}`)); + } + + return null; + }, + ideButtonTitle() { + return !this.mr.canPushToSourceBranch + ? s__('mrWidget|You are not allowed to edit this project directly. Please fork to make changes.') + : ''; }, }, }; @@ -93,13 +106,22 @@ export default { v-if="mr.isOpen" class="branch-actions" > - <a - v-if="!mr.sourceBranchRemoved" - :href="webIdePath" - class="btn btn-default inline js-web-ide d-none d-md-inline-block" + <span + v-tooltip + :title="ideButtonTitle" + data-placement="bottom" + tabindex="0" > - {{ s__("mrWidget|Open in Web IDE") }} - </a> + <a + v-if="!mr.sourceBranchRemoved" + :href="webIdePath" + :class="{ disabled: !mr.canPushToSourceBranch }" + class="btn btn-default inline js-web-ide d-none d-md-inline-block" + role="button" + > + {{ s__("mrWidget|Open in Web IDE") }} + </a> + </span> <button :disabled="mr.sourceBranchRemoved" data-target="#modal_merge_info" diff --git a/changelogs/unreleased/_acet-disable-ide-button.yml b/changelogs/unreleased/_acet-disable-ide-button.yml new file mode 100644 index 00000000000..2fff3847052 --- /dev/null +++ b/changelogs/unreleased/_acet-disable-ide-button.yml @@ -0,0 +1,5 @@ +--- +title: Disable Web IDE button if user is not allowed to push the source branch. +merge_request: 21288 +author: +type: added diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 936b85146d4..4f79cbd12bb 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -6796,6 +6796,9 @@ msgstr "" msgid "mrWidget|This project is archived, write access has been disabled" msgstr "" +msgid "mrWidget|You are not allowed to edit this project directly. Please fork to make changes." +msgstr "" + msgid "mrWidget|You can merge this merge request manually using the" msgstr "" diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js index 0e42537faed..237e2fa79f2 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js @@ -114,28 +114,31 @@ describe('MRWidgetHeader', () => { }); describe('with an open merge request', () => { + const mrDefaultOptions = { + iid: 1, + divergedCommitsCount: 12, + sourceBranch: 'mr-widget-refactor', + sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>', + sourceBranchRemoved: false, + targetBranchPath: 'foo/bar/commits-path', + targetBranchTreePath: 'foo/bar/tree/path', + targetBranch: 'master', + isOpen: true, + canPushToSourceBranch: true, + emailPatchesPath: '/mr/email-patches', + plainDiffPath: '/mr/plainDiffPath', + statusPath: 'abc', + sourceProjectFullPath: 'root/gitlab-ce', + targetProjectFullPath: 'gitlab-org/gitlab-ce', + }; + afterEach(() => { vm.$destroy(); }); beforeEach(() => { vm = mountComponent(Component, { - mr: { - iid: 1, - divergedCommitsCount: 12, - sourceBranch: 'mr-widget-refactor', - sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>', - sourceBranchRemoved: false, - targetBranchPath: 'foo/bar/commits-path', - targetBranchTreePath: 'foo/bar/tree/path', - targetBranch: 'master', - isOpen: true, - emailPatchesPath: '/mr/email-patches', - plainDiffPath: '/mr/plainDiffPath', - statusPath: 'abc', - sourceProjectFullPath: 'root/gitlab-ce', - targetProjectFullPath: 'gitlab-org/gitlab-ce', - }, + mr: Object.assign({}, mrDefaultOptions), }); }); @@ -151,11 +154,21 @@ describe('MRWidgetHeader', () => { const button = vm.$el.querySelector('.js-web-ide'); expect(button.textContent.trim()).toEqual('Open in Web IDE'); + expect(button.classList.contains('disabled')).toBe(false); expect(button.getAttribute('href')).toEqual( '/-/ide/project/root/gitlab-ce/merge_requests/1?target_project=gitlab-org%2Fgitlab-ce', ); }); + it('renders web ide button in disabled state with no href', () => { + const mr = Object.assign({}, mrDefaultOptions, { canPushToSourceBranch: false }); + vm = mountComponent(Component, { mr }); + + const link = vm.$el.querySelector('.js-web-ide'); + expect(link.classList.contains('disabled')).toBe(true); + expect(link.getAttribute('href')).toBeNull(); + }); + it('renders web ide button with blank query string if target & source project branch', done => { vm.mr.targetProjectFullPath = 'root/gitlab-ce'; |