From 3bb07a88bc297ae848ea4a1c075d37f5c4029e26 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Tue, 7 Feb 2017 17:42:21 +1100 Subject: copypaste task_list setup and events to own class switch issue and merge request to use it --- app/assets/javascripts/issue.js | 38 ++++------------------------- app/assets/javascripts/merge_request.js | 38 ++++------------------------- app/assets/javascripts/task_list.js.es6 | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 66 deletions(-) create mode 100644 app/assets/javascripts/task_list.js.es6 diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js index 6c08b1b8e61..6c6dde1b3f0 100644 --- a/app/assets/javascripts/issue.js +++ b/app/assets/javascripts/issue.js @@ -3,7 +3,7 @@ require('./flash'); require('vendor/jquery.waitforimages'); -require('vendor/task_list'); +require('./task_list'); (function() { var bind = function(fn, me) { return function() { return fn.apply(me, arguments); }; }; @@ -11,10 +11,11 @@ require('vendor/task_list'); this.Issue = (function() { function Issue() { this.submitNoteForm = bind(this.submitNoteForm, this); - // Prevent duplicate event bindings - this.disableTaskList(); if ($('a.btn-close').length) { - this.initTaskList(); + this.taskList = new gl.TaskList({ + dataType: 'issue', + selector: '.detail-page-description' + }); this.initIssueBtnEventListeners(); } this.initMergeRequests(); @@ -22,11 +23,6 @@ require('vendor/task_list'); this.initCanCreateBranch(); } - Issue.prototype.initTaskList = function() { - $('.detail-page-description .js-task-list-container').taskList('enable'); - return $(document).on('tasklist:changed', '.detail-page-description .js-task-list-container', this.updateTaskList); - }; - Issue.prototype.initIssueBtnEventListeners = function() { var _this, issueFailMessage; _this = this; @@ -82,30 +78,6 @@ require('vendor/task_list'); } }; - Issue.prototype.disableTaskList = function() { - $('.detail-page-description .js-task-list-container').taskList('disable'); - return $(document).off('tasklist:changed', '.detail-page-description .js-task-list-container'); - }; - - Issue.prototype.updateTaskList = function() { - var patchData; - patchData = {}; - patchData['issue'] = { - 'description': $('.js-task-list-field', this).val() - }; - return $.ajax({ - type: 'PATCH', - url: $('form.js-issuable-update').attr('action'), - data: patchData, - success: function(issue) { - document.querySelector('#task_status').innerText = issue.task_status; - document.querySelector('#task_status_short').innerText = issue.task_status_short; - } - }); - // TODO (rspeicher): Make the issue description inline-editable like a note so - // that we can re-use its form here - }; - Issue.prototype.initMergeRequests = function() { var $container; $container = $('#merge-requests'); diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js index 8762ec35b80..9e6f42beaf2 100644 --- a/app/assets/javascripts/merge_request.js +++ b/app/assets/javascripts/merge_request.js @@ -2,7 +2,7 @@ /* global MergeRequestTabs */ require('vendor/jquery.waitforimages'); -require('vendor/task_list'); +require('./task_list'); require('./merge_request_tabs'); (function() { @@ -24,12 +24,13 @@ require('./merge_request_tabs'); }; })(this)); this.initTabs(); - // Prevent duplicate event bindings - this.disableTaskList(); this.initMRBtnListeners(); this.initCommitMessageListeners(); if ($("a.btn-close").length) { - this.initTaskList(); + this.taskList = new gl.TaskList({ + dataType: 'merge_request', + selector: '.detail-page-description' + }); } } @@ -50,11 +51,6 @@ require('./merge_request_tabs'); return this.$('.all-commits').removeClass('hide'); }; - MergeRequest.prototype.initTaskList = function() { - $('.detail-page-description .js-task-list-container').taskList('enable'); - return $(document).on('tasklist:changed', '.detail-page-description .js-task-list-container', this.updateTaskList); - }; - MergeRequest.prototype.initMRBtnListeners = function() { var _this; _this = this; @@ -85,30 +81,6 @@ require('./merge_request_tabs'); } }; - MergeRequest.prototype.disableTaskList = function() { - $('.detail-page-description .js-task-list-container').taskList('disable'); - return $(document).off('tasklist:changed', '.detail-page-description .js-task-list-container'); - }; - - MergeRequest.prototype.updateTaskList = function() { - var patchData; - patchData = {}; - patchData['merge_request'] = { - 'description': $('.js-task-list-field', this).val() - }; - return $.ajax({ - type: 'PATCH', - url: $('form.js-issuable-update').attr('action'), - data: patchData, - success: function(mergeRequest) { - document.querySelector('#task_status').innerText = mergeRequest.task_status; - document.querySelector('#task_status_short').innerText = mergeRequest.task_status_short; - } - }); - // TODO (rspeicher): Make the merge request description inline-editable like a - // note so that we can re-use its form here - }; - MergeRequest.prototype.initCommitMessageListeners = function() { $(document).on('click', 'a.js-with-description-link', function(e) { var textarea = $('textarea.js-commit-message'); diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 new file mode 100644 index 00000000000..e207bb1d97e --- /dev/null +++ b/app/assets/javascripts/task_list.js.es6 @@ -0,0 +1,43 @@ +require('vendor/task_list'); + +class TaskList { + constructor(options = {}) { + this.selector = options.selector; + this.dataType = options.dataType; + // Prevent duplicate event bindings + this.disable(); + this.init(); + } + + init() { + $(this.selector + ' .js-task-list-container').taskList('enable'); + $(document).on('tasklist:changed', this.selector + ' .js-task-list-container', this.update.bind(this)); + } + + disable() { + $(this.selector + ' .js-task-list-container').taskList('disable'); + return $(document).off('tasklist:changed', this.selector + ' .js-task-list-container'); + } + + update(e) { + var patchData; + patchData = {}; + patchData[this.dataType] = { + 'description': $(e.target).val() + }; + return $.ajax({ + type: 'PATCH', + url: $('form.js-issuable-update').attr('action'), + data: patchData, + success: function(result) { + document.querySelector('#task_status').innerText = result.task_status; + document.querySelector('#task_status_short').innerText = result.task_status_short; + } + }); + // TODO (rspeicher): Make the issue description inline-editable like a note so + // that we can re-use its form here + } +} + +window.gl = window.gl || {}; +window.gl.TaskList = TaskList; -- cgit v1.2.1 From 97ecae00a6a64dadadf60ec6706944f6c9e98de7 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Wed, 8 Feb 2017 17:04:00 +1100 Subject: switch notes to use task_list, but keep its update function for now --- app/assets/javascripts/notes.js | 21 +++++++-------------- app/assets/javascripts/task_list.js.es6 | 12 +++++++----- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index d108da29af7..d137e327f0e 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -11,7 +11,7 @@ require('./dropzone_input'); require('./gfm_auto_complete'); require('vendor/jquery.caret'); // required by jquery.atwho require('vendor/jquery.atwho'); -require('vendor/task_list'); +require('./task_list'); (function() { var bind = function(fn, me) { return function() { return fn.apply(me, arguments); }; }; @@ -51,7 +51,11 @@ require('vendor/task_list'); this.addBinding(); this.setPollingInterval(); this.setupMainTargetNoteForm(); - this.initTaskList(); + this.taskList = new gl.TaskList({ + dataType: 'note', + selector: '.notes', + update: this.updateTaskList.bind(this) + }); this.collapseLongCommitList(); // We are in the Merge Requests page so we need another edit form for Changes tab @@ -125,8 +129,6 @@ require('vendor/task_list'); $(document).off("keydown", ".js-note-text"); $(document).off('click', '.js-comment-resolve-button'); $(document).off("click", '.system-note-commit-list-toggler'); - $('.note .js-task-list-container').taskList('disable'); - return $(document).off('tasklist:changed', '.note .js-task-list-container'); }; Notes.prototype.keydownNoteText = function(e) { @@ -286,7 +288,7 @@ require('vendor/task_list'); // Update datetime format on the recent note gl.utils.localTimeAgo($notesList.find("#note_" + note.id + " .js-timeago"), false); this.collapseLongCommitList(); - this.initTaskList(); + this.taskList.init(); this.refresh(); return this.updateNotesCount(1); } @@ -863,15 +865,6 @@ require('vendor/task_list'); } }; - Notes.prototype.initTaskList = function() { - this.enableTaskList(); - return $(document).on('tasklist:changed', '.note .js-task-list-container', this.updateTaskList.bind(this)); - }; - - Notes.prototype.enableTaskList = function() { - return $('.note .js-task-list-container').taskList('enable'); - }; - Notes.prototype.putEditFormInPlace = function($el) { var $editForm = $(this.getEditFormSelector($el)); var $note = $el.closest('.note'); diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 index e207bb1d97e..daed051c4a5 100644 --- a/app/assets/javascripts/task_list.js.es6 +++ b/app/assets/javascripts/task_list.js.es6 @@ -1,17 +1,21 @@ +/* eslint-disable class-methods-use-this, no-new, func-names, prefer-template, no-unneeded-ternary, object-shorthand, space-before-function-paren, comma-dangle, quote-props, consistent-return, no-else-return, no-param-reassign, max-len */ +/* global UsersSelect */ + require('vendor/task_list'); class TaskList { constructor(options = {}) { this.selector = options.selector; this.dataType = options.dataType; - // Prevent duplicate event bindings - this.disable(); + this.update = options.update || this.update.bind(this); this.init(); } init() { + // Prevent duplicate event bindings + this.disable(); $(this.selector + ' .js-task-list-container').taskList('enable'); - $(document).on('tasklist:changed', this.selector + ' .js-task-list-container', this.update.bind(this)); + $(document).on('tasklist:changed', this.selector + ' .js-task-list-container', this.update); } disable() { @@ -34,8 +38,6 @@ class TaskList { document.querySelector('#task_status_short').innerText = result.task_status_short; } }); - // TODO (rspeicher): Make the issue description inline-editable like a note so - // that we can re-use its form here } } -- cgit v1.2.1 From d3e34cd165fa5a8f534d7acec7df4c8bd6392eae Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Wed, 8 Feb 2017 19:10:04 +1100 Subject: appease lint --- app/assets/javascripts/task_list.js.es6 | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 index daed051c4a5..2001803fe13 100644 --- a/app/assets/javascripts/task_list.js.es6 +++ b/app/assets/javascripts/task_list.js.es6 @@ -14,29 +14,28 @@ class TaskList { init() { // Prevent duplicate event bindings this.disable(); - $(this.selector + ' .js-task-list-container').taskList('enable'); - $(document).on('tasklist:changed', this.selector + ' .js-task-list-container', this.update); + $(`${this.selector} .js-task-list-container`).taskList('enable'); + $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update); } disable() { - $(this.selector + ' .js-task-list-container').taskList('disable'); - return $(document).off('tasklist:changed', this.selector + ' .js-task-list-container'); + $(`${this.selector} .js-task-list-container`).taskList('disable'); + return $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`); } update(e) { - var patchData; - patchData = {}; + const patchData = {}; patchData[this.dataType] = { - 'description': $(e.target).val() + description: $(e.target).val(), }; return $.ajax({ type: 'PATCH', url: $('form.js-issuable-update').attr('action'), data: patchData, - success: function(result) { + success: (result) => { document.querySelector('#task_status').innerText = result.task_status; document.querySelector('#task_status_short').innerText = result.task_status_short; - } + }, }); } } -- cgit v1.2.1 From 766d011b461d11dd0a6fb23b691f6c779a2b0b2f Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Wed, 8 Feb 2017 20:23:45 +1100 Subject: notes use new task_list, and PATCH instead of POST use data attribute for submit url optional onSuccess --- app/assets/javascripts/issue.js | 6 +++++- app/assets/javascripts/merge_request.js | 6 +++++- app/assets/javascripts/notes.js | 14 +------------- app/assets/javascripts/task_list.js.es6 | 14 ++++++-------- app/views/projects/notes/_note.html.haml | 2 +- 5 files changed, 18 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js index 6c6dde1b3f0..fd9b3cb833d 100644 --- a/app/assets/javascripts/issue.js +++ b/app/assets/javascripts/issue.js @@ -14,7 +14,11 @@ require('./task_list'); if ($('a.btn-close').length) { this.taskList = new gl.TaskList({ dataType: 'issue', - selector: '.detail-page-description' + selector: '.detail-page-description', + onSuccess: (result) => { + document.querySelector('#task_status').innerText = result.task_status; + document.querySelector('#task_status_short').innerText = result.task_status_short; + } }); this.initIssueBtnEventListeners(); } diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js index 9e6f42beaf2..14f424b181c 100644 --- a/app/assets/javascripts/merge_request.js +++ b/app/assets/javascripts/merge_request.js @@ -29,7 +29,11 @@ require('./merge_request_tabs'); if ($("a.btn-close").length) { this.taskList = new gl.TaskList({ dataType: 'merge_request', - selector: '.detail-page-description' + selector: '.detail-page-description', + onSuccess: (result) => { + document.querySelector('#task_status').innerText = result.task_status; + document.querySelector('#task_status_short').innerText = result.task_status_short; + } }); } } diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index d137e327f0e..599af9312b4 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -53,8 +53,7 @@ require('./task_list'); this.setupMainTargetNoteForm(); this.taskList = new gl.TaskList({ dataType: 'note', - selector: '.notes', - update: this.updateTaskList.bind(this) + selector: '.notes' }); this.collapseLongCommitList(); @@ -889,17 +888,6 @@ require('./task_list'); $editForm.find('.referenced-users').hide(); }; - Notes.prototype.updateTaskList = function(e) { - var $target = $(e.target); - var $list = $target.closest('.js-task-list-container'); - var $editForm = $(this.getEditFormSelector($target)); - var $note = $list.closest('.note'); - - this.putEditFormInPlace($list); - $editForm.find('#note_note').val($note.find('.original-task-list').val()); - $('form', $list).submit(); - }; - Notes.prototype.updateNotesCount = function(updateCount) { return this.notesCountBadge.text(parseInt(this.notesCountBadge.text(), 10) + updateCount); }; diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 index 2001803fe13..3fa6a36e455 100644 --- a/app/assets/javascripts/task_list.js.es6 +++ b/app/assets/javascripts/task_list.js.es6 @@ -7,7 +7,7 @@ class TaskList { constructor(options = {}) { this.selector = options.selector; this.dataType = options.dataType; - this.update = options.update || this.update.bind(this); + this.onSuccess = options.onSuccess || () => null; this.init(); } @@ -15,7 +15,7 @@ class TaskList { // Prevent duplicate event bindings this.disable(); $(`${this.selector} .js-task-list-container`).taskList('enable'); - $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update); + $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update.bind(this)); } disable() { @@ -24,18 +24,16 @@ class TaskList { } update(e) { + const $target = $(e.target); const patchData = {}; patchData[this.dataType] = { - description: $(e.target).val(), + description: $target.val(), }; return $.ajax({ type: 'PATCH', - url: $('form.js-issuable-update').attr('action'), + url: $target.data('update-url') || $('form.js-issuable-update').attr('action'), data: patchData, - success: (result) => { - document.querySelector('#task_status').innerText = result.task_status; - document.querySelector('#task_status_short').innerText = result.task_status_short; - }, + success: this.onSuccess, }); } } diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 09339e520dd..89c6a65f159 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -69,7 +69,7 @@ - if note_editable .original-note-content.hidden{ data: { post_url: namespace_project_note_path(@project.namespace, @project, note), target_id: note.noteable.id, target_type: note.noteable.class.name.underscore } } #{note.note} - %textarea.hidden.js-task-list-field.original-task-list= note.note + %textarea.hidden.js-task-list-field.original-task-list{ data: {update_url: namespace_project_note_path(@project.namespace, @project, note) } }= note.note .note-awards = render 'award_emoji/awards_block', awardable: note, inline: false - if note.system -- cgit v1.2.1 From 4e4639b56eda367a8d5612042fcf1359a8303082 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Wed, 8 Feb 2017 21:54:33 +1100 Subject: forgot to iife --- app/assets/javascripts/task_list.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 index 3fa6a36e455..1186a1ecfb9 100644 --- a/app/assets/javascripts/task_list.js.es6 +++ b/app/assets/javascripts/task_list.js.es6 @@ -7,7 +7,7 @@ class TaskList { constructor(options = {}) { this.selector = options.selector; this.dataType = options.dataType; - this.onSuccess = options.onSuccess || () => null; + this.onSuccess = options.onSuccess || (() => {}); this.init(); } -- cgit v1.2.1 From 2084555a08e28b77a333fb5316e0af306e620106 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Thu, 9 Feb 2017 01:12:12 +1100 Subject: update karma test to expect ajax instead of POST --- spec/javascripts/notes_spec.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spec/javascripts/notes_spec.js b/spec/javascripts/notes_spec.js index af495787c54..ac3d285572a 100644 --- a/spec/javascripts/notes_spec.js +++ b/spec/javascripts/notes_spec.js @@ -35,15 +35,13 @@ require('~/lib/utils/text_utility'); expect($('.js-task-list-field').val()).toBe('- [x] Task List Item'); }); - it('submits the form on tasklist:changed', function() { - var submitted = false; - $('form').on('submit', function(e) { - submitted = true; - e.preventDefault(); + it('submits an ajax request on tasklist:changed', function() { + spyOn(jQuery, 'ajax').and.callFake(function(req) { + expect(req.type).toBe('PATCH'); + expect(req.url).toBe('http://test.host/frontend-fixtures/issues-project/notes/1'); + return expect(req.data.note).not.toBe(null); }); - - $('.js-task-list-field').trigger('tasklist:changed'); - expect(submitted).toBe(true); + return $('.js-task-list-field').trigger('tasklist:changed'); }); }); -- cgit v1.2.1 From f2d82304bcd0aa5cf0074eda6c43247b89549d23 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Thu, 9 Feb 2017 01:15:50 +1100 Subject: add changelog item --- changelogs/unreleased/task_list_refactor.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/task_list_refactor.yml diff --git a/changelogs/unreleased/task_list_refactor.yml b/changelogs/unreleased/task_list_refactor.yml new file mode 100644 index 00000000000..68942dadaa8 --- /dev/null +++ b/changelogs/unreleased/task_list_refactor.yml @@ -0,0 +1,4 @@ +--- +title: Deduplicate markdown task lists +merge_request: +author: -- cgit v1.2.1 From 3ee13984ce1157b6362a2c0bcb1c1b3e6c48649d Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Fri, 10 Feb 2017 09:14:21 +1100 Subject: enable lint --- app/assets/javascripts/task_list.js.es6 | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 index 1186a1ecfb9..3bbae06cee9 100644 --- a/app/assets/javascripts/task_list.js.es6 +++ b/app/assets/javascripts/task_list.js.es6 @@ -1,6 +1,3 @@ -/* eslint-disable class-methods-use-this, no-new, func-names, prefer-template, no-unneeded-ternary, object-shorthand, space-before-function-paren, comma-dangle, quote-props, consistent-return, no-else-return, no-param-reassign, max-len */ -/* global UsersSelect */ - require('vendor/task_list'); class TaskList { @@ -20,7 +17,7 @@ class TaskList { disable() { $(`${this.selector} .js-task-list-container`).taskList('disable'); - return $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`); + $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`); } update(e) { -- cgit v1.2.1 From ced971b12a1f6e01bb443b81c90e8691d8cc69b4 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Tue, 14 Feb 2017 13:52:20 +1100 Subject: code style and test fixes fix test following https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9172 --- app/assets/javascripts/task_list.js | 39 +++++++++++++++++++++++++++++++++ app/assets/javascripts/task_list.js.es6 | 39 --------------------------------- spec/javascripts/merge_request_spec.js | 6 ++--- spec/javascripts/notes_spec.js | 2 +- 4 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 app/assets/javascripts/task_list.js delete mode 100644 app/assets/javascripts/task_list.js.es6 diff --git a/app/assets/javascripts/task_list.js b/app/assets/javascripts/task_list.js new file mode 100644 index 00000000000..3bbae06cee9 --- /dev/null +++ b/app/assets/javascripts/task_list.js @@ -0,0 +1,39 @@ +require('vendor/task_list'); + +class TaskList { + constructor(options = {}) { + this.selector = options.selector; + this.dataType = options.dataType; + this.onSuccess = options.onSuccess || (() => {}); + this.init(); + } + + init() { + // Prevent duplicate event bindings + this.disable(); + $(`${this.selector} .js-task-list-container`).taskList('enable'); + $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update.bind(this)); + } + + disable() { + $(`${this.selector} .js-task-list-container`).taskList('disable'); + $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`); + } + + update(e) { + const $target = $(e.target); + const patchData = {}; + patchData[this.dataType] = { + description: $target.val(), + }; + return $.ajax({ + type: 'PATCH', + url: $target.data('update-url') || $('form.js-issuable-update').attr('action'), + data: patchData, + success: this.onSuccess, + }); + } +} + +window.gl = window.gl || {}; +window.gl.TaskList = TaskList; diff --git a/app/assets/javascripts/task_list.js.es6 b/app/assets/javascripts/task_list.js.es6 deleted file mode 100644 index 3bbae06cee9..00000000000 --- a/app/assets/javascripts/task_list.js.es6 +++ /dev/null @@ -1,39 +0,0 @@ -require('vendor/task_list'); - -class TaskList { - constructor(options = {}) { - this.selector = options.selector; - this.dataType = options.dataType; - this.onSuccess = options.onSuccess || (() => {}); - this.init(); - } - - init() { - // Prevent duplicate event bindings - this.disable(); - $(`${this.selector} .js-task-list-container`).taskList('enable'); - $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update.bind(this)); - } - - disable() { - $(`${this.selector} .js-task-list-container`).taskList('disable'); - $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`); - } - - update(e) { - const $target = $(e.target); - const patchData = {}; - patchData[this.dataType] = { - description: $target.val(), - }; - return $.ajax({ - type: 'PATCH', - url: $target.data('update-url') || $('form.js-issuable-update').attr('action'), - data: patchData, - success: this.onSuccess, - }); - } -} - -window.gl = window.gl || {}; -window.gl.TaskList = TaskList; diff --git a/spec/javascripts/merge_request_spec.js b/spec/javascripts/merge_request_spec.js index 25cfa9e9479..34c98f5176a 100644 --- a/spec/javascripts/merge_request_spec.js +++ b/spec/javascripts/merge_request_spec.js @@ -6,9 +6,9 @@ require('~/merge_request'); (function() { describe('MergeRequest', function() { return describe('task lists', function() { - preloadFixtures('static/merge_requests_show.html.raw'); + preloadFixtures('merge_requests/merge_request_with_task_list.html.raw'); beforeEach(function() { - loadFixtures('static/merge_requests_show.html.raw'); + loadFixtures('merge_requests/merge_request_with_task_list.html.raw'); return this.merge = new MergeRequest(); }); it('modifies the Markdown field', function() { @@ -19,7 +19,7 @@ require('~/merge_request'); return it('submits an ajax request on tasklist:changed', function() { spyOn(jQuery, 'ajax').and.callFake(function(req) { expect(req.type).toBe('PATCH'); - expect(req.url).toBe('/foo'); + expect(req.url).toBe(`${gl.TEST_HOST}/frontend-fixtures/merge-requests-project/merge_requests/1.json`); return expect(req.data.merge_request.description).not.toBe(null); }); return $('.js-task-list-field').trigger('tasklist:changed'); diff --git a/spec/javascripts/notes_spec.js b/spec/javascripts/notes_spec.js index ac3d285572a..b5b4f61e5d5 100644 --- a/spec/javascripts/notes_spec.js +++ b/spec/javascripts/notes_spec.js @@ -41,7 +41,7 @@ require('~/lib/utils/text_utility'); expect(req.url).toBe('http://test.host/frontend-fixtures/issues-project/notes/1'); return expect(req.data.note).not.toBe(null); }); - return $('.js-task-list-field').trigger('tasklist:changed'); + $('.js-task-list-field').trigger('tasklist:changed'); }); }); -- cgit v1.2.1 From 3f713db0da2602152aa482b57f84b7418fd20a93 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Wed, 15 Feb 2017 16:53:17 +1100 Subject: update correct field for Notes - it's called note not description --- app/assets/javascripts/issue.js | 1 + app/assets/javascripts/merge_request.js | 1 + app/assets/javascripts/notes.js | 1 + app/assets/javascripts/task_list.js | 3 ++- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js index fd9b3cb833d..00d253a964c 100644 --- a/app/assets/javascripts/issue.js +++ b/app/assets/javascripts/issue.js @@ -14,6 +14,7 @@ require('./task_list'); if ($('a.btn-close').length) { this.taskList = new gl.TaskList({ dataType: 'issue', + fieldName: 'description', selector: '.detail-page-description', onSuccess: (result) => { document.querySelector('#task_status').innerText = result.task_status; diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js index a72d75379f2..be12d925040 100644 --- a/app/assets/javascripts/merge_request.js +++ b/app/assets/javascripts/merge_request.js @@ -29,6 +29,7 @@ require('./merge_request_tabs'); if ($("a.btn-close").length) { this.taskList = new gl.TaskList({ dataType: 'merge_request', + fieldName: 'description', selector: '.detail-page-description', onSuccess: (result) => { document.querySelector('#task_status').innerText = result.task_status; diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index e5892f199cd..e12a45adc9f 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -53,6 +53,7 @@ require('./task_list'); this.setupMainTargetNoteForm(); this.taskList = new gl.TaskList({ dataType: 'note', + fieldName: 'note', selector: '.notes' }); this.collapseLongCommitList(); diff --git a/app/assets/javascripts/task_list.js b/app/assets/javascripts/task_list.js index 3bbae06cee9..dfe24d1fb33 100644 --- a/app/assets/javascripts/task_list.js +++ b/app/assets/javascripts/task_list.js @@ -4,6 +4,7 @@ class TaskList { constructor(options = {}) { this.selector = options.selector; this.dataType = options.dataType; + this.fieldName = options.fieldName; this.onSuccess = options.onSuccess || (() => {}); this.init(); } @@ -24,7 +25,7 @@ class TaskList { const $target = $(e.target); const patchData = {}; patchData[this.dataType] = { - description: $target.val(), + [this.fieldName]: $target.val(), }; return $.ajax({ type: 'PATCH', -- cgit v1.2.1