From 3d2917bf2e4799a7ba9bcb518c39605eca0a4b1d Mon Sep 17 00:00:00 2001 From: Jarka Kadlecova Date: Thu, 31 Aug 2017 12:38:43 +0200 Subject: Add the possibility to lock issuables from the frontend --- app/assets/javascripts/discussion_lock.js | 46 +++++++++++++++++++++++++ app/assets/javascripts/init_issuable_sidebar.js | 1 + app/assets/javascripts/main.js | 1 + 3 files changed, 48 insertions(+) create mode 100644 app/assets/javascripts/discussion_lock.js (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/discussion_lock.js b/app/assets/javascripts/discussion_lock.js new file mode 100644 index 00000000000..7bf83e9b8a0 --- /dev/null +++ b/app/assets/javascripts/discussion_lock.js @@ -0,0 +1,46 @@ +class DiscussionLock { + constructor(containerElm) { + this.containerElm = containerElm; + + const lockButton = containerElm.querySelector('.js-discussion-lock-button'); + console.log(lockButton); + if (lockButton) { + // remove class so we don't bind twice + lockButton.classList.remove('js-discussion-lock-button'); + console.log(lockButton); + lockButton.addEventListener('click', this.toggleDiscussionLock.bind(this)); + } + } + + toggleDiscussionLock(event) { + const button = event.currentTarget; + const buttonSpan = button.querySelector('span'); + if (!buttonSpan || button.classList.contains('disabled')) { + return; + } + button.classList.add('disabled'); + + const url = this.containerElm.dataset.url; + const lock = this.containerElm.dataset.lock; + const issuableType = this.containerElm.dataset.issuableType; + + const data = {} + data[issuableType] = {} + data[issuableType].discussion_locked = lock + + $.ajax({ + url, + data: data, + type: 'PUT' + }).done((data) => { + button.classList.remove('disabled'); + }); + } + + static bindAll(selector) { + [].forEach.call(document.querySelectorAll(selector), elm => new DiscussionLock(elm)); + } +} + +window.gl = window.gl || {}; +window.gl.DiscussionLock = DiscussionLock; diff --git a/app/assets/javascripts/init_issuable_sidebar.js b/app/assets/javascripts/init_issuable_sidebar.js index 29e3d2ea94e..8857601f530 100644 --- a/app/assets/javascripts/init_issuable_sidebar.js +++ b/app/assets/javascripts/init_issuable_sidebar.js @@ -13,6 +13,7 @@ export default () => { new LabelsSelect(); new IssuableContext(sidebarOptions.currentUser); gl.Subscription.bindAll('.subscription'); + gl.DiscussionLock.bindAll('.discussion-lock'); new gl.DueDateSelectors(); window.sidebar = new Sidebar(); }; diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index 0bc31a56684..ea1d50de965 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -80,6 +80,7 @@ import './copy_as_gfm'; import './copy_to_clipboard'; import './create_label'; import './diff'; +import './discussion_lock'; import './dropzone_input'; import './due_date_select'; import './files_comment_button'; -- cgit v1.2.3 From a319418d9c050097a797fbf4f890cebd5256ed43 Mon Sep 17 00:00:00 2001 From: "Luke \"Jared\" Bennett" Date: Thu, 14 Sep 2017 12:01:07 +0100 Subject: Merge FE --- .../notes/components/issue_comment_form.vue | 27 ++++-- .../notes/components/issue_note_form.vue | 20 ++-- .../javascripts/notes/mixins/issuable_state.js | 15 +++ .../confidential/confidential_issue_sidebar.vue | 14 +-- .../sidebar/components/confidential/edit_form.vue | 9 +- .../components/confidential/edit_form_buttons.vue | 6 +- .../sidebar/components/lock/edit_form.vue | 62 ++++++++++++ .../sidebar/components/lock/edit_form_buttons.vue | 50 ++++++++++ .../sidebar/components/lock/lock_issue_sidebar.vue | 108 +++++++++++++++++++++ app/assets/javascripts/sidebar/sidebar_bundle.js | 70 +++++++++---- .../javascripts/sidebar/stores/sidebar_store.js | 1 + .../issue/confidential_issue_warning.vue | 16 --- .../vue_shared/components/issue/issue_warning.vue | 53 ++++++++++ .../javascripts/vue_shared/mixins/issuable.js | 7 ++ 14 files changed, 394 insertions(+), 64 deletions(-) create mode 100644 app/assets/javascripts/notes/mixins/issuable_state.js create mode 100644 app/assets/javascripts/sidebar/components/lock/edit_form.vue create mode 100644 app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue create mode 100644 app/assets/javascripts/sidebar/components/lock/lock_issue_sidebar.vue delete mode 100644 app/assets/javascripts/vue_shared/components/issue/confidential_issue_warning.vue create mode 100644 app/assets/javascripts/vue_shared/components/issue/issue_warning.vue create mode 100644 app/assets/javascripts/vue_shared/mixins/issuable.js (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/notes/components/issue_comment_form.vue b/app/assets/javascripts/notes/components/issue_comment_form.vue index 16f4e22aa9b..391a1960eae 100644 --- a/app/assets/javascripts/notes/components/issue_comment_form.vue +++ b/app/assets/javascripts/notes/components/issue_comment_form.vue @@ -6,10 +6,11 @@ import TaskList from '../../task_list'; import * as constants from '../constants'; import eventHub from '../event_hub'; - import confidentialIssue from '../../vue_shared/components/issue/confidential_issue_warning.vue'; + import issueWarning from '../../vue_shared/components/issue/issue_warning.vue'; import issueNoteSignedOutWidget from './issue_note_signed_out_widget.vue'; import markdownField from '../../vue_shared/components/markdown/field.vue'; import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue'; + import issuableStateMixin from '../mixins/issuable_state'; export default { name: 'issueCommentForm', @@ -25,7 +26,7 @@ }; }, components: { - confidentialIssue, + issueWarning, issueNoteSignedOutWidget, markdownField, userAvatarLink, @@ -54,6 +55,9 @@ isIssueOpen() { return this.issueState === constants.OPENED || this.issueState === constants.REOPENED; }, + canCreate() { + return this.getIssueData.current_user.can_create_note; + }, issueActionButtonTitle() { if (this.note.length) { const actionText = this.isIssueOpen ? 'close' : 'reopen'; @@ -89,9 +93,6 @@ endpoint() { return this.getIssueData.create_note_path; }, - isConfidentialIssue() { - return this.getIssueData.confidential; - }, }, methods: { ...mapActions([ @@ -206,6 +207,9 @@ }); }, }, + mixins: [ + issuableStateMixin, + ], mounted() { // jQuery is needed here because it is a custom event being dispatched with jQuery. $(document).on('issuable:change', (e, isClosed) => { @@ -239,15 +243,22 @@
- + class="new-note js-quick-submit common-note-form gfm-form js-main-target-form" + > + + +
+ :is-confidential-issue="isIssueConfidential(getIssueData)">