diff options
author | Luke "Jared" Bennett <lbennett@gitlab.com> | 2017-01-09 08:45:08 +0000 |
---|---|---|
committer | Luke "Jared" Bennett <lbennett@gitlab.com> | 2017-01-12 10:26:31 +0000 |
commit | d3b2ae8680dac36fd74ddd1525d61537c4e1a76b (patch) | |
tree | 99b767304e018c8736c411d2713ccfb47b64ab68 | |
parent | 826adaaff876d2b6b5886e6d8133b0d0c2cd4a2d (diff) | |
download | gitlab-ce-26455-use-jquery-for-all-event-listener-registration.tar.gz |
Added turbolinks linters26455-use-jquery-for-all-event-listener-registration
Added eslint-plugin-turbolinks-event-handling
98 files changed, 722 insertions, 554 deletions
diff --git a/.eslintrc b/.eslintrc index e13f76b213c..cf54157e7a5 100644 --- a/.eslintrc +++ b/.eslintrc @@ -12,9 +12,13 @@ "localStorage": false }, "plugins": [ - "filenames" + "filenames", + "turbolinks-event-handling" ], "rules": { - "filenames/match-regex": [2, "^[a-z0-9_]+(.js)?$"] + "filenames/match-regex": [2, "^[a-z0-9_]+(.js)?$"], + "turbolinks-event-handling/jquery-off-before-on": 2, + "turbolinks-event-handling/jquery-use-event-namespaces": 2 + # "turbolinks-event-handling/vanilla-addeventlistener-needs-function-reference": 2 } } diff --git a/app/assets/javascripts/abuse_reports.js.es6 b/app/assets/javascripts/abuse_reports.js.es6 index 8a260aae1b1..9e897890d98 100644 --- a/app/assets/javascripts/abuse_reports.js.es6 +++ b/app/assets/javascripts/abuse_reports.js.es6 @@ -8,8 +8,8 @@ constructor() { $(MESSAGE_CELL_SELECTOR).each(this.truncateLongMessage); $(document) - .off('click', MESSAGE_CELL_SELECTOR) - .on('click', MESSAGE_CELL_SELECTOR, this.toggleMessageTruncation); + .off('click.toggleMessageTruncation', MESSAGE_CELL_SELECTOR) + .on('click.toggleMessageTruncation', MESSAGE_CELL_SELECTOR, this.toggleMessageTruncation); } truncateLongMessage() { diff --git a/app/assets/javascripts/activities.js.es6 b/app/assets/javascripts/activities.js.es6 index 648cb4d5d85..2f3f68c0c88 100644 --- a/app/assets/javascripts/activities.js.es6 +++ b/app/assets/javascripts/activities.js.es6 @@ -6,11 +6,12 @@ class Activities { constructor() { Pager.init(20, true, false, this.updateTooltips); - $('.event-filter-link').on('click', (e) => { - e.preventDefault(); - this.toggleFilter(e.currentTarget); - this.reloadActivities(); - }); + $('.event-filter-link').off('click.reloadActivities') + .on('click.reloadActivities', (e) => { + e.preventDefault(); + this.toggleFilter(e.currentTarget); + this.reloadActivities(); + }); } updateTooltips() { diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js index 5a7d823e84c..b4a2ec088f0 100644 --- a/app/assets/javascripts/admin.js +++ b/app/assets/javascripts/admin.js @@ -5,7 +5,7 @@ this.Admin = (function() { function Admin() { var modal, showBlacklistType; - $('input#user_force_random_password').on('change', function(elem) { + $('input#user_force_random_password').off('change.forceRandomPassword').on('change.forceRandomPassword', function(elem) { var elems; elems = $('#user_password, #user_password_confirmation'); if ($(this).attr('checked')) { @@ -14,7 +14,7 @@ return elems.removeAttr('disabled'); } }); - $('body').on('click', '.js-toggle-colors-link', function(e) { + $('body').off('click.toggleColorsContainer').on('click.toggleColorsContainer', '.js-toggle-colors-link', function(e) { e.preventDefault(); return $('.js-toggle-colors-container').toggle(); }); diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e43afbb4cc9..2fcc21ffaf7 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -65,7 +65,9 @@ (function () { document.addEventListener('page:fetch', function () { // Unbind scroll events + /* eslint-disable turbolinks-event-handling/jquery-use-event-namespaces */ $(document).off('scroll'); + /* eslint-enable turbolinks-event-handling/jquery-use-event-namespaces */ // Close any open tooltips $('.has-tooltip, [data-toggle="tooltip"]').tooltip('destroy'); }); @@ -90,12 +92,13 @@ Cookies.defaults.path = gon.relative_url_root || '/'; // `hashchange` is not triggered when link target is already in window.location - $body.on('click', 'a[href^="#"]', function() { - var href = this.getAttribute('href'); - if (href.substr(1) === gl.utils.getLocationHash()) { - setTimeout(gl.utils.handleLocationHash, 1); - } - }); + $body.off('click.handleLocationHash') + .on('click.handleLocationHash', 'a[href^="#"]', function() { + var href = this.getAttribute('href'); + if (href.substr(1) === gl.utils.getLocationHash()) { + setTimeout(gl.utils.handleLocationHash, 1); + } + }); // prevent default action for disabled buttons $('.btn').click(function(e) { @@ -111,13 +114,14 @@ cursorcolor: '#FFF', cursorborder: '1px solid #FFF' }); - $('.js-select-on-focus').on('focusin', function () { - return $(this).select().one('mouseup', function (e) { - return e.preventDefault(); + $('.js-select-on-focus').off('focusin.selectOnFocus') + .on('focusin.selectOnFocus', function () { + return $(this).select().one('mouseup', function (e) { + return e.preventDefault(); + }); + // Click a .js-select-on-focus field, select the contents + // Prevent a mouseup event from deselecting the input }); - // Click a .js-select-on-focus field, select the contents - // Prevent a mouseup event from deselecting the input - }); $('.remove-row').bind('ajax:success', function () { $(this).tooltip('destroy') .closest('li') @@ -149,7 +153,7 @@ return $(el).data('placement') || 'bottom'; } }); - $('.trigger-submit').on('change', function () { + $('.trigger-submit').off('change.triggerSubmit').on('change.triggerSubmit', function () { return $(this).parents('form').submit(); // Form submitter }); @@ -162,17 +166,18 @@ $flash.show(); } // Disable form buttons while a form is submitting - $body.on('ajax:complete, ajax:beforeSend, submit', 'form', function (e) { - var buttons; - buttons = $('[type="submit"]', this); - switch (e.type) { - case 'ajax:beforeSend': - case 'submit': - return buttons.disable(); - default: - return buttons.enable(); - } - }); + $body.off('ajax:complete.submitting, ajax:beforeSend.submitting, submit.submitting') + .on('ajax:complete.submitting, ajax:beforeSend.submitting, submit.submitting', 'form', function (e) { + var buttons; + buttons = $('[type="submit"]', this); + switch (e.type) { + case 'ajax:beforeSend': + case 'submit': + return buttons.disable(); + default: + return buttons.enable(); + } + }); $(document).ajaxError(function (e, xhrObj) { var ref = xhrObj.status; if (xhrObj.status === 401) { @@ -185,21 +190,22 @@ // Show/Hide the profile menu when hovering the account box return $(this).toggleClass('hover'); }); - $document.on('click', '.diff-content .js-show-suppressed-diff', function () { - var $container; - $container = $(this).parent(); - $container.next('table').show(); - return $container.remove(); - // Commit show suppressed diff - }); - $('.navbar-toggle').on('click', function () { + $document.off('click.showSuppressedDiff') + .on('click.showSuppressedDiff', '.diff-content .js-show-suppressed-diff', function () { + var $container; + $container = $(this).parent(); + $container.next('table').show(); + return $container.remove(); + // Commit show suppressed diff + }); + $('.navbar-toggle').off('click.toggleNavbar').on('click.toggleNavbar', function () { $('.header-content .title').toggle(); $('.header-content .header-logo').toggle(); $('.header-content .navbar-collapse').toggle(); return $('.navbar-toggle').toggleClass('active'); }); // Show/hide comments on diff - $body.on('click', '.js-toggle-diff-comments', function (e) { + $body.off('click.toggleComments').on('click.toggleComments', '.js-toggle-diff-comments', function (e) { var $this = $(this); var notesHolders = $this.closest('.diff-file').find('.notes_holder'); $this.toggleClass('active'); @@ -211,32 +217,34 @@ $this.trigger('blur'); return e.preventDefault(); }); - $document.off('click', '.js-confirm-danger'); - $document.on('click', '.js-confirm-danger', function (e) { - var btn = $(e.target); - var form = btn.closest('form'); - var text = btn.data('confirm-danger-message'); - e.preventDefault(); - return new ConfirmDangerModal(form, text); - }); + $document.off('click.confirmDanger', '.js-confirm-danger') + .on('click.confirmDanger', '.js-confirm-danger', function (e) { + var btn = $(e.target); + var form = btn.closest('form'); + var text = btn.data('confirm-danger-message'); + e.preventDefault(); + return new ConfirmDangerModal(form, text); + }); $('input[type="search"]').each(function () { var $this = $(this); $this.attr('value', $this.val()); }); - $document.off('keyup', 'input[type="search"]').on('keyup', 'input[type="search"]', function () { - var $this; - $this = $(this); - return $this.attr('value', $this.val()); - }); - $document.off('breakpoint:change').on('breakpoint:change', function (e, breakpoint) { - var $gutterIcon; - if (breakpoint === 'sm' || breakpoint === 'xs') { - $gutterIcon = $sidebarGutterToggle.find('i'); - if ($gutterIcon.hasClass('fa-angle-double-right')) { - return $sidebarGutterToggle.trigger('click'); + $document.off('keyup.searchInput', 'input[type="search"]') + .on('keyup.searchInput', 'input[type="search"]', function () { + var $this; + $this = $(this); + return $this.attr('value', $this.val()); + }); + $document.off('breakpoint:change.sidebarGutterToggle') + .on('breakpoint:change.sidebarGutterToggle', function (e, breakpoint) { + var $gutterIcon; + if (breakpoint === 'sm' || breakpoint === 'xs') { + $gutterIcon = $sidebarGutterToggle.find('i'); + if ($gutterIcon.hasClass('fa-angle-double-right')) { + return $sidebarGutterToggle.trigger('click'); + } } - } - }); + }); fitSidebarForSize = function () { var oldBootstrapBreakpoint; oldBootstrapBreakpoint = bootstrapBreakpoint; diff --git a/app/assets/javascripts/aside.js b/app/assets/javascripts/aside.js index 9417afc2ea7..9a9e37dc1a4 100644 --- a/app/assets/javascripts/aside.js +++ b/app/assets/javascripts/aside.js @@ -2,8 +2,7 @@ (function() { this.Aside = (function() { function Aside() { - $(document).off("click", "a.show-aside"); - $(document).on("click", 'a.show-aside', function(e) { + $(document).off("click.showAside", "a.show-aside").on("click.showAside", 'a.show-aside', function(e) { var btn, icon; e.preventDefault(); btn = $(e.currentTarget); diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js index f45dbe4cbf2..7805302e3d8 100644 --- a/app/assets/javascripts/autosave.js +++ b/app/assets/javascripts/autosave.js @@ -9,7 +9,7 @@ this.key = "autosave/" + key; this.field.data("autosave", this); this.restore(); - this.field.on("input", (function(_this) { + this.field.off('input.save').on("input.save", (function(_this) { return function() { return _this.save(); }; diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index 107a7978a87..e54d32f4b86 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -6,14 +6,14 @@ var FROM_SENTENCE_REGEX = /(?:, and | and |, )/; //For separating lists produced by ruby's Array#toSentence function AwardsHandler() { this.aliases = gl.emojiAliases(); - $(document).off('click', '.js-add-award').on('click', '.js-add-award', (function(_this) { + $(document).off('click.showMenu', '.js-add-award').on('click.showMenu', '.js-add-award', (function(_this) { return function(e) { e.stopPropagation(); e.preventDefault(); return _this.showEmojiMenu($(e.currentTarget)); }; })(this)); - $('html').on('click', function(e) { + $('html').off('click.removeFocus').on('click.removeFocus', function(e) { var $target; $target = $(e.target); if (!$target.closest('.emoji-menu-content').length) { @@ -26,7 +26,7 @@ } } }); - $(document).off('click', '.js-emoji-btn').on('click', '.js-emoji-btn', (function(_this) { + $(document).off('click.addAward', '.js-emoji-btn').on('click.addAward', '.js-emoji-btn', (function(_this) { return function(e) { var $target, emoji; e.preventDefault(); @@ -263,9 +263,10 @@ var className = 'pulse animated once short'; $emoji.addClass(className); - $emoji.on('webkitAnimationEnd animationEnd', function() { - $(this).removeClass(className); - }); + $emoji.off('webkitAnimationEnd.removeClass animationEnd.removeClass') + .on('webkitAnimationEnd.removeClass animationEnd.removeClass', function() { + $(this).removeClass(className); + }); }; AwardsHandler.prototype.createEmoji = function(votesBlock, emoji) { @@ -349,7 +350,7 @@ }; AwardsHandler.prototype.setupSearch = function() { - return $('input.emoji-search').on('keyup', (function(_this) { + return $('input.emoji-search').off('keyup.search').on('keyup.search', (function(_this) { return function(ev) { var found_emojis, h5, term, ul; term = $(ev.target).val(); diff --git a/app/assets/javascripts/behaviors/autosize.js b/app/assets/javascripts/behaviors/autosize.js index c62a4c5a456..56b2831b1c4 100644 --- a/app/assets/javascripts/behaviors/autosize.js +++ b/app/assets/javascripts/behaviors/autosize.js @@ -8,12 +8,12 @@ $(function() { var $fields; $fields = $('.js-autosize'); - $fields.on('autosize:resized', function() { + $fields.off('autosize:resized.setHeight').on('autosize:resized.setHeight', function() { var $field; $field = $(this); return $field.data('height', $field.outerHeight()); }); - $fields.on('resize.autosize', function() { + $fields.off('resize.autosize.updateFields').on('resize.autosize.updateFields', function() { var $field; $field = $(this); if ($field.data('height') !== $field.outerHeight()) { diff --git a/app/assets/javascripts/behaviors/details_behavior.js b/app/assets/javascripts/behaviors/details_behavior.js index 3998ee9a0a0..85bdac5b783 100644 --- a/app/assets/javascripts/behaviors/details_behavior.js +++ b/app/assets/javascripts/behaviors/details_behavior.js @@ -1,7 +1,7 @@ /* eslint-disable func-names, space-before-function-paren, prefer-arrow-callback, quotes, no-var, vars-on-top, padded-blocks, max-len */ (function() { $(function() { - $("body").on("click", ".js-details-target", function() { + $("body").off('click.detailsTarget').on("click.detailsTarget", ".js-details-target", function() { var container; container = $(this).closest(".js-details-container"); return container.toggleClass("open"); @@ -12,7 +12,7 @@ // %a.js-details-expand // %div.js-details-content // - return $("body").on("click", ".js-details-expand", function(e) { + return $("body").off('click.detailsExpand').on("click.detailsExpand", ".js-details-expand", function(e) { $(this).next('.js-details-content').removeClass("hide"); $(this).hide(); diff --git a/app/assets/javascripts/behaviors/requires_input.js b/app/assets/javascripts/behaviors/requires_input.js index 72362988b2e..0e6e4c6801a 100644 --- a/app/assets/javascripts/behaviors/requires_input.js +++ b/app/assets/javascripts/behaviors/requires_input.js @@ -36,7 +36,8 @@ }; // Set initial button state requireInput(); - return $form.on('change input', fieldSelector, requireInput); + return $form.off('change.requireInput input.requireInput') + .on('change.requireInput input.requireInput', fieldSelector, requireInput); }; $(function() { diff --git a/app/assets/javascripts/behaviors/toggler_behavior.js b/app/assets/javascripts/behaviors/toggler_behavior.js index 6a49715590c..924f9540604 100644 --- a/app/assets/javascripts/behaviors/toggler_behavior.js +++ b/app/assets/javascripts/behaviors/toggler_behavior.js @@ -8,7 +8,7 @@ // %a.js-toggle-button // %div.js-toggle-content // - $('body').on('click', '.js-toggle-button', function(e) { + $('body').off('click.toggler').on('click.toggler', '.js-toggle-button', function(e) { e.preventDefault(); $(this) .find('.fa') diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js b/app/assets/javascripts/blob/blob_file_dropzone.js index eab686c45c3..fcf3b487a40 100644 --- a/app/assets/javascripts/blob/blob_file_dropzone.js +++ b/app/assets/javascripts/blob/blob_file_dropzone.js @@ -26,16 +26,16 @@ "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") }, init: function() { - this.on('addedfile', function(file) { + this.off('addedfile.alertsHide').on('addedfile.alertsHide', function(file) { $('.dropzone-alerts').html('').hide(); }); - this.on('success', function(header, response) { + this.off('success.visitFile').on('success.visitFile', function(header, response) { window.location.href = response.filePath; }); - this.on('maxfilesexceeded', function(file) { + this.off('maxfilesexceeded.removeFile').on('maxfilesexceeded.removeFile', function(file) { this.removeFile(file); }); - return this.on('sending', function(file, xhr, formData) { + return this.off('sending.appendData').on('sending.appendData', function(file, xhr, formData) { formData.append('target_branch', form.find('.js-target-branch').val()); formData.append('create_merge_request', form.find('.js-create-merge-request').val()); formData.append('commit_message', form.find('.js-commit-message').val()); diff --git a/app/assets/javascripts/blob/template_selector.js.es6 b/app/assets/javascripts/blob/template_selector.js.es6 index 7a1ee9998c8..75ab278a2be 100644 --- a/app/assets/javascripts/blob/template_selector.js.es6 +++ b/app/assets/javascripts/blob/template_selector.js.es6 @@ -37,7 +37,8 @@ } bindEvents() { - return this.$input.on('keyup blur', (e) => this.onFilenameUpdate()); + return this.$input.off('keyup.onFilenameUpdate blur.onFilenameUpdate') + .on('keyup.onFilenameUpdate blur.onFilenameUpdate', (e) => this.onFilenameUpdate()); } toggleLabel(item) { diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js index fa43ff611cc..3a33dd476c0 100644 --- a/app/assets/javascripts/blob_edit/edit_blob.js +++ b/app/assets/javascripts/blob_edit/edit_blob.js @@ -74,7 +74,8 @@ EditBlob.prototype.initSoftWrap = function() { this.isSoftWrapped = false; this.$toggleButton = $('.soft-wrap-toggle'); - this.$toggleButton.on('click', this.toggleSoftWrap.bind(this)); + this.$toggleButton.off('click.toggleSoftWrap') + .on('click.toggleSoftWrap', this.toggleSoftWrap.bind(this)); }; EditBlob.prototype.toggleSoftWrap = function(e) { diff --git a/app/assets/javascripts/broadcast_message.js b/app/assets/javascripts/broadcast_message.js index 30432dae278..5233ac03d8b 100644 --- a/app/assets/javascripts/broadcast_message.js +++ b/app/assets/javascripts/broadcast_message.js @@ -2,18 +2,18 @@ (function() { $(function() { var previewPath; - $('input#broadcast_message_color').on('input', function() { + $('input#broadcast_message_color').off('input.messageColor').on('input.messageColor', function() { var previewColor; previewColor = $(this).val(); return $('div.broadcast-message-preview').css('background-color', previewColor); }); - $('input#broadcast_message_font').on('input', function() { + $('input#broadcast_message_font').off('input.messageFont').on('input.messageFont', function() { var previewColor; previewColor = $(this).val(); return $('div.broadcast-message-preview').css('color', previewColor); }); previewPath = $('textarea#broadcast_message_message').data('preview-path'); - return $('textarea#broadcast_message_message').on('input', function() { + return $('textarea#broadcast_message_message').off('input.messageText').on('input.messageText', function() { var message; message = $(this).val(); if (message === '') { diff --git a/app/assets/javascripts/build.js b/app/assets/javascripts/build.js index bc13c46443a..37addb866c1 100644 --- a/app/assets/javascripts/build.js +++ b/app/assets/javascripts/build.js @@ -42,9 +42,12 @@ this.updateStageDropdownText(this.buildStage); this.sidebarOnResize(); - this.$document.off('click', '.js-sidebar-build-toggle').on('click', '.js-sidebar-build-toggle', this.sidebarOnClick.bind(this)); - this.$document.off('click', '.stage-item').on('click', '.stage-item', this.updateDropdown); - this.$document.on('scroll', this.initScrollMonitor.bind(this)); + this.$document.off('click.sidebarOnClick', '.js-sidebar-build-toggle') + .on('click.sidebarOnClick', '.js-sidebar-build-toggle', this.sidebarOnClick.bind(this)); + this.$document.off('click.updateDropdown', '.stage-item') + .on('click.updateDropdown', '.stage-item', this.updateDropdown); + this.$document.off('scroll.initScrollMonitor') + .on('scroll.initScrollMonitor', this.initScrollMonitor.bind(this)); $(window).off('resize.build').on('resize.build', this.sidebarOnResize.bind(this)); $('a', this.$buildScroll).off('click.stepTrace').on('click.stepTrace', this.stepTrace); this.updateArtifactRemoveDate(); @@ -75,7 +78,8 @@ top: this.sidebarTranslationLimits.max }); this.$sidebar.niceScroll(); - this.$document.off('click', '.js-sidebar-build-toggle').on('click', '.js-sidebar-build-toggle', this.toggleSidebar); + this.$document.off('click.toggleSidebar', '.js-sidebar-build-toggle') + .on('click.toggleSidebar', '.js-sidebar-build-toggle', this.toggleSidebar); this.$document.off('scroll.translateSidebar').on('scroll.translateSidebar', this.translateSidebar.bind(this)); }; diff --git a/app/assets/javascripts/build_artifacts.js b/app/assets/javascripts/build_artifacts.js index c423a548a30..e2110e05915 100644 --- a/app/assets/javascripts/build_artifacts.js +++ b/app/assets/javascripts/build_artifacts.js @@ -7,18 +7,21 @@ } BuildArtifacts.prototype.disablePropagation = function() { - $('.top-block').on('click', '.download', function(e) { - return e.stopPropagation(); - }); - return $('.tree-holder').on('click', 'tr[data-link] a', function(e) { - return e.stopImmediatePropagation(); - }); + $('.top-block').off('click.download') + .on('click.download', '.download', function(e) { + return e.stopPropagation(); + }); + return $('.tree-holder').off('click.treeHolder') + .on('click.treeHolder', 'tr[data-link] a', function(e) { + return e.stopImmediatePropagation(); + }); }; BuildArtifacts.prototype.setupEntryClick = function() { - return $('.tree-holder').on('click', 'tr[data-link]', function(e) { - return window.location = this.dataset.link; - }); + return $('.tree-holder').off('click.visitLink') + .on('click.visitLink', 'tr[data-link]', function(e) { + return window.location = this.dataset.link; + }); }; return BuildArtifacts; diff --git a/app/assets/javascripts/build_variables.js.es6 b/app/assets/javascripts/build_variables.js.es6 index 993424d422f..9871aad5e04 100644 --- a/app/assets/javascripts/build_variables.js.es6 +++ b/app/assets/javascripts/build_variables.js.es6 @@ -1,7 +1,7 @@ /* eslint-disable func-names, prefer-arrow-callback, space-before-blocks, space-before-function-paren, comma-spacing, max-len */ $(function(){ - $('.reveal-variables').off('click').on('click',function(){ + $('.reveal-variables').off('click.revealVariables').on('click.revealVariables',function(){ $('.js-build').toggle().niceScroll(); $(this).hide(); }); diff --git a/app/assets/javascripts/ci_lint_editor.js.es6 b/app/assets/javascripts/ci_lint_editor.js.es6 index 56ffaa765a8..d141c2086dc 100644 --- a/app/assets/javascripts/ci_lint_editor.js.es6 +++ b/app/assets/javascripts/ci_lint_editor.js.es6 @@ -7,7 +7,7 @@ this.textarea = document.querySelector('#content'); this.editor.getSession().setMode('ace/mode/yaml'); - this.editor.on('input', () => { + this.editor.off('input.updateContent').on('input.updateContent', () => { const content = this.editor.getSession().getValue(); this.textarea.value = content; }); diff --git a/app/assets/javascripts/commit/image_file.js b/app/assets/javascripts/commit/image_file.js index fd8910e916f..2d8cf91c011 100644 --- a/app/assets/javascripts/commit/image_file.js +++ b/app/assets/javascripts/commit/image_file.js @@ -28,13 +28,14 @@ var viewMode; viewMode = ImageFile.viewModes[0]; $('.view-modes', this.file).removeClass('hide'); - $('.view-modes-menu', this.file).on('click', 'li', (function(_this) { - return function(event) { - if (!$(event.currentTarget).hasClass('active')) { - return _this.activateViewMode(event.currentTarget.className); - } - }; - })(this)); + $('.view-modes-menu', this.file).off('click.activateViewMode') + .on('click.activateViewMode', 'li', (function(_this) { + return function(event) { + if (!$(event.currentTarget).hasClass('active')) { + return _this.activateViewMode(event.currentTarget.className); + } + }; + })(this)); return this.activateViewMode(viewMode); }; @@ -162,7 +163,7 @@ if (domImg.complete) { return callback.call(this, domImg.naturalWidth, domImg.naturalHeight); } else { - return img.on('load', (function(_this) { + return img.off('load.requestImageInfo').on('load.requestImageInfo', (function(_this) { return function() { return callback.call(_this, domImg.naturalWidth, domImg.naturalHeight); }; diff --git a/app/assets/javascripts/commits.js b/app/assets/javascripts/commits.js index 24a6e4ff0e9..348fc1f5459 100644 --- a/app/assets/javascripts/commits.js +++ b/app/assets/javascripts/commits.js @@ -8,7 +8,7 @@ CommitsList.timer = null; CommitsList.init = function(limit) { - $("body").on("click", ".day-commits-table li.commit", function(e) { + $("body").off('click.visitCommit').on("click.visitCommit", ".day-commits-table li.commit", function(e) { if (e.target.nodeName !== "A") { location.href = $(this).attr("url"); e.stopPropagation(); diff --git a/app/assets/javascripts/compare_autocomplete.js.es6 b/app/assets/javascripts/compare_autocomplete.js.es6 index 251f2ded347..b09df29b9c7 100644 --- a/app/assets/javascripts/compare_autocomplete.js.es6 +++ b/app/assets/javascripts/compare_autocomplete.js.es6 @@ -47,7 +47,7 @@ return $el.text().trim(); } }); - $filterInput.on('keyup', (e) => { + $filterInput.off('keyup.filterInput').on('keyup.filterInput', (e) => { const keyCode = e.keyCode || e.which; if (keyCode !== 13) return; const text = $filterInput.val(); @@ -56,7 +56,7 @@ $dropdownContainer.removeClass('open'); }); - $dropdownContainer.on('click', '.dropdown-content a', (e) => { + $dropdownContainer.off('click.dropdownTooltip').on('click.dropdownTooltip', '.dropdown-content a', (e) => { $dropdown.prop('title', e.target.text.replace(/_+?/g, '-')); if ($dropdown.hasClass('has-tooltip')) { $dropdown.tooltip('fixTitle'); diff --git a/app/assets/javascripts/confirm_danger_modal.js b/app/assets/javascripts/confirm_danger_modal.js index 686a48486f3..857ace97071 100644 --- a/app/assets/javascripts/confirm_danger_modal.js +++ b/app/assets/javascripts/confirm_danger_modal.js @@ -10,20 +10,20 @@ project_path = $('.js-confirm-danger-match').text(); submit = $('.js-confirm-danger-submit'); submit.disable(); - $('.js-confirm-danger-input').off('input'); - $('.js-confirm-danger-input').on('input', function() { - if (gl.utils.rstrip($(this).val()) === project_path) { - return submit.enable(); - } else { - return submit.disable(); - } - }); - $('.js-confirm-danger-submit').off('click'); - $('.js-confirm-danger-submit').on('click', (function(_this) { - return function() { - return _this.form.submit(); - }; - })(this)); + $('.js-confirm-danger-input').off('input.confirmInput') + .on('input.confirmInput', function() { + if (gl.utils.rstrip($(this).val()) === project_path) { + return submit.enable(); + } else { + return submit.disable(); + } + }); + $('.js-confirm-danger-submit').off('click.confirmSubmit') + .on('click.confirmSubmit', (function(_this) { + return function() { + return _this.form.submit(); + }; + })(this)); } return ConfirmDangerModal; diff --git a/app/assets/javascripts/copy_to_clipboard.js b/app/assets/javascripts/copy_to_clipboard.js index 6a13f38588d..f71aa5f63da 100644 --- a/app/assets/javascripts/copy_to_clipboard.js +++ b/app/assets/javascripts/copy_to_clipboard.js @@ -43,8 +43,8 @@ var clipboard; clipboard = new Clipboard('[data-clipboard-target], [data-clipboard-text]'); - clipboard.on('success', genericSuccess); - return clipboard.on('error', genericError); + clipboard.off('success.genericSuccess').on('success.genericSuccess', genericSuccess); + return clipboard.off('error.genericError').on('error.genericError', genericError); }); }).call(this); diff --git a/app/assets/javascripts/create_label.js.es6 b/app/assets/javascripts/create_label.js.es6 index 947c129d5b5..fe1aa440918 100644 --- a/app/assets/javascripts/create_label.js.es6 +++ b/app/assets/javascripts/create_label.js.es6 @@ -24,28 +24,32 @@ } cleanBinding () { - this.$colorSuggestions.off('click'); - this.$newLabelField.off('keyup change'); - this.$newColorField.off('keyup change'); - this.$dropdownBack.off('click'); - this.$cancelButton.off('click'); - this.$newLabelCreateButton.off('click'); + this.$colorSuggestions.off('click.addColorValue'); + this.$newLabelField.off('keyup.enableLabelCreateButton change.enableLabelCreateButton'); + this.$newColorField.off('keyup.enableLabelCreateButton change.enableLabelCreateButton'); + this.$dropdownBack.off('click.resetForm'); + this.$cancelButton.off('click.cancelForm'); + this.$newLabelCreateButton.off('click.saveLabel'); } addBinding () { const self = this; - this.$colorSuggestions.on('click', function (e) { + this.$colorSuggestions.off('click.addColorValue').on('click.addColorValue', function (e) { const $this = $(this); self.addColorValue(e, $this); }); - this.$newLabelField.on('keyup change', this.enableLabelCreateButton.bind(this)); - this.$newColorField.on('keyup change', this.enableLabelCreateButton.bind(this)); + this.$newLabelField + .off('keyup.enableLabelCreateButton change.enableLabelCreateButton') + .on('keyup.enableLabelCreateButton change.enableLabelCreateButton', this.enableLabelCreateButton.bind(this)); + this.$newColorField + .off('keyup.enableLabelCreateButton change.enableLabelCreateButton') + .on('keyup.enableLabelCreateButton change.enableLabelCreateButton', this.enableLabelCreateButton.bind(this)); - this.$dropdownBack.on('click', this.resetForm.bind(this)); + this.$dropdownBack.off('click.resetForm').on('click.resetForm', this.resetForm.bind(this)); - this.$cancelButton.on('click', function(e) { + this.$cancelButton.off('click.cancelForm').on('click.cancelForm', function(e) { e.preventDefault(); e.stopPropagation(); @@ -53,7 +57,7 @@ self.$dropdownBack.trigger('click'); }); - this.$newLabelCreateButton.on('click', this.saveLabel.bind(this)); + this.$newLabelCreateButton.off('click.saveLabel').on('click.saveLabel', this.saveLabel.bind(this)); } addColorValue (e, $this) { diff --git a/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js.es6 b/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js.es6 index 2f810a69758..480267ac613 100644 --- a/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js.es6 +++ b/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js.es6 @@ -52,14 +52,15 @@ $(() => { const $dropdown = $('.js-ca-dropdown'); const $label = $dropdown.find('.dropdown-label'); - $dropdown.find('li a').off('click').on('click', (e) => { - e.preventDefault(); - const $target = $(e.currentTarget); - this.startDate = $target.data('value'); + $dropdown.find('li a').off('click.fetchCycleAnalyticsData') + .on('click.fetchCycleAnalyticsData', (e) => { + e.preventDefault(); + const $target = $(e.currentTarget); + this.startDate = $target.data('value'); - $label.text($target.text().trim()); - this.fetchCycleAnalyticsData({ startDate: this.startDate }); - }); + $label.text($target.text().trim()); + this.fetchCycleAnalyticsData({ startDate: this.startDate }); + }); }, fetchCycleAnalyticsData(options) { const fetchOptions = options || { startDate: this.startDate }; diff --git a/app/assets/javascripts/diff.js.es6 b/app/assets/javascripts/diff.js.es6 index 9cf33e62958..d125d425348 100644 --- a/app/assets/javascripts/diff.js.es6 +++ b/app/assets/javascripts/diff.js.es6 @@ -16,9 +16,10 @@ } $(document) - .off('click', '.js-unfold, .diff-line-num a') - .on('click', '.js-unfold', this.handleClickUnfold.bind(this)) - .on('click', '.diff-line-num a', this.handleClickLineNum.bind(this)); + .off('click.handleClickUnfold', '.js-unfold') + .on('click.handleClickUnfold', '.js-unfold', this.handleClickUnfold.bind(this)) + .off('click.handleClickLineNum', '.diff-line-num a') + .on('click.handleClickLineNum', '.diff-line-num a', this.handleClickLineNum.bind(this)); this.highlighSelectedLine(); } diff --git a/app/assets/javascripts/dropzone_input.js b/app/assets/javascripts/dropzone_input.js index 56cb39be642..257a0a65023 100644 --- a/app/assets/javascripts/dropzone_input.js +++ b/app/assets/javascripts/dropzone_input.js @@ -21,7 +21,7 @@ max_file_size = gon.max_file_size || 10; form_textarea = $(form).find(".js-gfm-input"); form_textarea.wrap("<div class=\"div-dropzone\"></div>"); - form_textarea.on('paste', (function(_this) { + form_textarea.off('paste.handlePaste').on('paste.handlePaste', (function(_this) { return function(event) { return handlePaste(event); }; diff --git a/app/assets/javascripts/due_date_select.js.es6 b/app/assets/javascripts/due_date_select.js.es6 index 201f9fdc3fe..c03008e88ac 100644 --- a/app/assets/javascripts/due_date_select.js.es6 +++ b/app/assets/javascripts/due_date_select.js.es6 @@ -54,7 +54,7 @@ } initRemoveDueDate() { - this.$block.on('click', '.js-remove-due-date', (e) => { + this.$block.off('click.removeDueDate').on('click.removeDueDate', '.js-remove-due-date', (e) => { e.preventDefault(); if (this.$dropdown.hasClass('js-issue-boards-due-date')) { @@ -68,9 +68,10 @@ } initStopPropagation() { - $(document).off('click', '.ui-datepicker-header a').on('click', '.ui-datepicker-header a', (e) => { - return e.stopImmediatePropagation(); - }); + $(document).off('click.stopImmediatePropagation', '.ui-datepicker-header a') + .on('click.stopImmediatePropagation', '.ui-datepicker-header a', (e) => { + return e.stopImmediatePropagation(); + }); } saveDueDate(isDropdown) { @@ -158,11 +159,12 @@ dateFormat: 'yy-mm-dd' }); - $('.js-clear-due-date,.js-clear-start-date').on('click', (e) => { - e.preventDefault(); - const datepicker = $(e.target).siblings('.datepicker'); - $.datepicker._clearDate(datepicker); - }); + $('.js-clear-due-date,.js-clear-start-date').off('click.clearDate') + .on('click.clearDate', (e) => { + e.preventDefault(); + const datepicker = $(e.target).siblings('.datepicker'); + $.datepicker._clearDate(datepicker); + }); } initIssuableSelect() { diff --git a/app/assets/javascripts/files_comment_button.js b/app/assets/javascripts/files_comment_button.js index 785f2869970..bf385d268e4 100644 --- a/app/assets/javascripts/files_comment_button.js +++ b/app/assets/javascripts/files_comment_button.js @@ -36,7 +36,11 @@ this.render = bind(this.render, this); this.VIEW_TYPE = $('input#view[type=hidden]').val(); debounce = _.debounce(this.render, DEBOUNCE_TIMEOUT_DURATION); - $(this.filesContainerElement).off('mouseover', LINE_COLUMN_CLASSES).off('mouseleave', LINE_COLUMN_CLASSES).on('mouseover', LINE_COLUMN_CLASSES, debounce).on('mouseleave', LINE_COLUMN_CLASSES, this.destroy); + $(this.filesContainerElement) + .off('mouseover.debounce', LINE_COLUMN_CLASSES) + .on('mouseover.debounce', LINE_COLUMN_CLASSES, debounce) + .off('mouseleave.destroy', LINE_COLUMN_CLASSES) + .on('mouseleave.destroy', LINE_COLUMN_CLASSES, this.destroy); } FilesCommentButton.prototype.render = function(e) { diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js index 804d7d9c4ab..1e055269a1b 100644 --- a/app/assets/javascripts/flash.js +++ b/app/assets/javascripts/flash.js @@ -24,7 +24,7 @@ flash = $('<div/>', { "class": "flash-" + type }); - flash.on('click', hideFlash); + flash.off('click.hideFlash').on('click.hideFlash', hideFlash); textDiv = $('<div/>', { "class": 'flash-text', text: message diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js index bb516b3d2df..0b2782a2429 100644 --- a/app/assets/javascripts/gl_dropdown.js +++ b/app/assets/javascripts/gl_dropdown.js @@ -23,7 +23,7 @@ this.filterInputBlur = (ref = this.options.filterInputBlur) != null ? ref : true; $inputContainer = this.input.parent(); $clearButton = $inputContainer.find('.js-dropdown-input-clear'); - $clearButton.on('click', (function(_this) { + $clearButton.off('click.clear').on('click.clear', (function(_this) { // Clear click return function(e) { e.preventDefault(); @@ -34,13 +34,15 @@ // Key events timeout = ""; this.input - .on('keydown', function (e) { + .off('keydown.preventDefault') + .on('keydown.preventDefault', function (e) { var keyCode = e.which; if (keyCode === 13 && !options.elIsInput) { e.preventDefault() } }) - .on('input', function() { + .off('input.filter') + .on('input.filter', function() { if (this.input.val() !== "" && !$inputContainer.hasClass(HAS_VALUE_CLASS)) { $inputContainer.addClass(HAS_VALUE_CLASS); } else if (this.input.val() === "" && $inputContainer.hasClass(HAS_VALUE_CLASS)) { @@ -304,11 +306,15 @@ }); } // Event listeners - this.dropdown.on("shown.bs.dropdown", this.opened); - this.dropdown.on("hidden.bs.dropdown", this.hidden); - $(this.el).on("update.label", this.updateLabel); - this.dropdown.on("click", ".dropdown-menu, .dropdown-menu-close", this.shouldPropagate); - this.dropdown.on('keyup', (function(_this) { + this.dropdown.off('shown.bs.dropdown.opened') + .on("shown.bs.dropdown.opened", this.opened); + this.dropdown.off('hidden.bs.dropdown.hidden') + .on("hidden.bs.dropdown.hidden", this.hidden); + $(this.el).off('update.label.updateLabel') + .on("update.label.updateLabel", this.updateLabel); + this.dropdown.off('click.shouldPropagate') + .on("click.shouldPropagate", ".dropdown-menu, .dropdown-menu-close", this.shouldPropagate); + this.dropdown.off('keyup.escape').on('keyup.escape', (function(_this) { return function(e) { // Escape key if (e.which === 27) { @@ -316,7 +322,7 @@ } }; })(this)); - this.dropdown.on('blur', 'a', (function(_this) { + this.dropdown.off('blur.removeOpen').on('blur.removeOpen', 'a', (function(_this) { return function(e) { var $dropdownMenu, $relatedTarget; if (e.relatedTarget != null) { @@ -329,20 +335,21 @@ }; })(this)); if (this.dropdown.find(".dropdown-toggle-page").length) { - this.dropdown.find(".dropdown-toggle-page, .dropdown-menu-back").on("click", (function(_this) { - return function(e) { - e.preventDefault(); - e.stopPropagation(); - return _this.togglePage(); - }; - })(this)); + this.dropdown.find(".dropdown-toggle-page, .dropdown-menu-back").off('click.togglePage') + .on("click.togglePage", (function(_this) { + return function(e) { + e.preventDefault(); + e.stopPropagation(); + return _this.togglePage(); + }; + })(this)); } if (this.options.selectable) { selector = ".dropdown-content a"; if (this.dropdown.find(".dropdown-toggle-page").length) { selector = ".dropdown-page-one .dropdown-content a"; } - this.dropdown.on("click", selector, function(e) { + this.dropdown.off('click.updateLabel').on("click.updateLabel", selector, function(e) { var $el, selected, selectedObj, isMarking; $el = $(this); selected = self.rowClicked($el); @@ -739,7 +746,7 @@ if (this.dropdown.find(".dropdown-toggle-page").length) { selector = ".dropdown-page-one " + selector; } - return $('body').on('keydown', (function(_this) { + return $('body').off('keydown.arrowEvents').on('keydown.arrowEvents', (function(_this) { return function(e) { var $listItems, PREV_INDEX, currentKeyCode; currentKeyCode = e.which; @@ -775,7 +782,7 @@ }; GitLabDropdown.prototype.removeArrayKeyEvent = function() { - return $('body').off('keydown'); + return $('body').off('keydown.arrowEvents'); }; GitLabDropdown.prototype.resetRows = function resetRows() { diff --git a/app/assets/javascripts/gl_field_error.js.es6 b/app/assets/javascripts/gl_field_error.js.es6 index f7cbecc0385..f9260a1527a 100644 --- a/app/assets/javascripts/gl_field_error.js.es6 +++ b/app/assets/javascripts/gl_field_error.js.es6 @@ -78,7 +78,8 @@ // hidden when injected into DOM errorAnchor.after(this.fieldErrorElement); - this.inputElement.off('invalid').on('invalid', this.handleInvalidSubmit.bind(this)); + this.inputElement.off('invalid.handleInvalidSubmit') + .on('invalid.handleInvalidSubmit', this.handleInvalidSubmit.bind(this)); this.scopedSiblings = this.safelySelectSiblings(); } diff --git a/app/assets/javascripts/gl_field_errors.js.es6 b/app/assets/javascripts/gl_field_errors.js.es6 index 63f9cafa8d0..c3eabcbe6fd 100644 --- a/app/assets/javascripts/gl_field_errors.js.es6 +++ b/app/assets/javascripts/gl_field_errors.js.es6 @@ -24,7 +24,8 @@ .filter((input) => !input.classList.contains(customValidationFlag)) .map((input) => new global.GlFieldError({ input, formErrors: this })); - this.form.on('submit', this.catchInvalidFormSubmit); + this.form.off('submit.catchInvalidFormSubmit') + .on('submit.catchInvalidFormSubmit', this.catchInvalidFormSubmit); } /* Neccessary to prevent intercept and override invalid form submit diff --git a/app/assets/javascripts/gl_form.js b/app/assets/javascripts/gl_form.js index 04814fa0843..2a05674cb2b 100644 --- a/app/assets/javascripts/gl_form.js +++ b/app/assets/javascripts/gl_form.js @@ -43,16 +43,16 @@ }; GLForm.prototype.clearEventListeners = function() { - this.textarea.off('focus'); - this.textarea.off('blur'); + this.textarea.off('focus.addFocus'); + this.textarea.off('blur.removeFocus'); return gl.text.removeListeners(this.form); }; GLForm.prototype.addEventListeners = function() { - this.textarea.on('focus', function() { + this.textarea.off('focus.addFocus').on('focus.addFocus', function() { return $(this).closest('.md-area').addClass('is-focused'); }); - return this.textarea.on('blur', function() { + return this.textarea.off('blur.removeFocus').on('blur.removeFocus', function() { return $(this).closest('.md-area').removeClass('is-focused'); }); }; diff --git a/app/assets/javascripts/graphs/stat_graph_contributors_graph.js b/app/assets/javascripts/graphs/stat_graph_contributors_graph.js index 9c5e9381e52..056c51c9a28 100644 --- a/app/assets/javascripts/graphs/stat_graph_contributors_graph.js +++ b/app/assets/javascripts/graphs/stat_graph_contributors_graph.js @@ -154,7 +154,8 @@ }; ContributorsMasterGraph.prototype.create_brush = function() { - return this.brush = d3.svg.brush().x(this.x).on("brushend", this.update_content); + return this.brush = d3.svg.brush().x(this.x).off('brushend.updateContent') + .on("brushend.updateContent", this.update_content); }; ContributorsMasterGraph.prototype.draw_path = function(data) { diff --git a/app/assets/javascripts/group_label_subscription.js.es6 b/app/assets/javascripts/group_label_subscription.js.es6 index 8e10e424412..3e0b786f0f5 100644 --- a/app/assets/javascripts/group_label_subscription.js.es6 +++ b/app/assets/javascripts/group_label_subscription.js.es6 @@ -8,8 +8,10 @@ this.$subscribeButtons = $container.find('.js-subscribe-button'); this.$unsubscribeButtons = $container.find('.js-unsubscribe-button'); - this.$subscribeButtons.on('click', this.subscribe.bind(this)); - this.$unsubscribeButtons.on('click', this.unsubscribe.bind(this)); + this.$subscribeButtons.off('click.subscribe') + .on('click.subscribe', this.subscribe.bind(this)); + this.$unsubscribeButtons.off('click.unsubscribe') + .on('click.unsubscribe', this.unsubscribe.bind(this)); } unsubscribe(event) { diff --git a/app/assets/javascripts/header.js b/app/assets/javascripts/header.js index c7cbf9ca44b..34e9b37c76b 100644 --- a/app/assets/javascripts/header.js +++ b/app/assets/javascripts/header.js @@ -1,7 +1,7 @@ /* eslint-disable wrap-iife, func-names, space-before-function-paren, padded-blocks, prefer-arrow-callback, no-var, max-len */ (function() { - $(document).on('todo:toggle', function(e, count) { + $(document).off('todo:toggle.pendingCount').on('todo:toggle.pendingCount', function(e, count) { var $todoPendingCount = $('.todos-pending-count'); $todoPendingCount.text(gl.text.addDelimiter(count)); $todoPendingCount.toggleClass('hidden', count === 0); diff --git a/app/assets/javascripts/importer_status.js b/app/assets/javascripts/importer_status.js index fa795be07ed..22b96001f98 100644 --- a/app/assets/javascripts/importer_status.js +++ b/app/assets/javascripts/importer_status.js @@ -10,7 +10,7 @@ } ImporterStatus.prototype.initStatusPage = function() { - $('.js-add-to-import').off('click').on('click', (function(_this) { + $('.js-add-to-import').off('click.addToImport').on('click.addToImport', (function(_this) { return function(e) { var $btn, $namespace_input, $target_field, $tr, id, target_namespace, newName; $btn = $(e.currentTarget); @@ -35,7 +35,7 @@ }); }; })(this)); - return $('.js-import-all').off('click').on('click', function(e) { + return $('.js-import-all').off('click.importAll').on('click.importAll', function(e) { var $btn; $btn = $(this); $btn.disable().addClass('is-loading'); diff --git a/app/assets/javascripts/issuable.js.es6 b/app/assets/javascripts/issuable.js.es6 index 9c3c96c20ed..5fccb0586fb 100644 --- a/app/assets/javascripts/issuable.js.es6 +++ b/app/assets/javascripts/issuable.js.es6 @@ -27,10 +27,10 @@ // `immediate` param set to false debounces on the `trailing` edge, lets user finish typing const debouncedExecSearch = _.debounce(Issuable.executeSearch, 1000, false); - $searchInput.off('keyup').on('keyup', debouncedExecSearch); + $searchInput.off('keyup.debouncedExecSearch').on('keyup.debouncedExecSearch', debouncedExecSearch); // ensures existing filters are preserved when manually submitted - $('#issuable_search_form').on('submit', (e) => { + $('#issuable_search_form').off('submit.debouncedExecSearch').on('submit.debouncedExecSearch', (e) => { e.preventDefault(); debouncedExecSearch(e); }); @@ -97,16 +97,17 @@ Issuable.filterResults($filtersForm); }, initLabelFilterRemove: function() { - return $(document).off('click', '.js-label-filter-remove').on('click', '.js-label-filter-remove', function(e) { - var $button; - $button = $(this); - // Remove the label input box - $('input[name="label_name[]"]').filter(function() { - return this.value === $button.data('label'); - }).remove(); - // Submit the form to get new data - Issuable.filterResults($('.filter-form')); - }); + return $(document).off('click.filterResults', '.js-label-filter-remove') + .on('click.filterResults', '.js-label-filter-remove', function(e) { + var $button; + $button = $(this); + // Remove the label input box + $('input[name="label_name[]"]').filter(function() { + return this.value === $button.data('label'); + }).remove(); + // Submit the form to get new data + Issuable.filterResults($('.filter-form')); + }); }, filterResults: (function(_this) { return function(form) { @@ -124,7 +125,7 @@ }; })(this), initResetFilters: function() { - $('.reset-filters').on('click', function(e) { + $('.reset-filters').off('click.resetFilters').on('click.resetFilters', function(e) { e.preventDefault(); const target = e.target; const $form = $(target).parents('.js-filter-form'); @@ -136,11 +137,12 @@ }, initChecks: function() { this.issuableBulkActions = $('.bulk-update').data('bulkActions'); - $('.check_all_issues').off('click').on('click', function() { + $('.check_all_issues').off('click.checkChanged').on('click.checkChanged', function() { $('.selected_issue').prop('checked', this.checked); return Issuable.checkChanged(); }); - return $('.selected_issue').off('change').on('change', Issuable.checkChanged.bind(this)); + return $('.selected_issue').off('change.checkChanged') + .on('change.checkChanged', Issuable.checkChanged.bind(this)); }, checkChanged: function() { const $checkedIssues = $('.selected_issue:checked'); @@ -167,7 +169,7 @@ }, resetIncomingEmailToken: function() { - $('.incoming-email-token-reset').on('click', function(e) { + $('.incoming-email-token-reset').off('click.resetToken').on('click.resetToken', function(e) { e.preventDefault(); $.ajax({ diff --git a/app/assets/javascripts/issuable_context.js b/app/assets/javascripts/issuable_context.js index 4aaad111082..023701d2ca6 100644 --- a/app/assets/javascripts/issuable_context.js +++ b/app/assets/javascripts/issuable_context.js @@ -4,22 +4,28 @@ (function() { this.IssuableContext = (function() { function IssuableContext(currentUser) { + var $document = $(document); + this.initParticipants(); new UsersSelect(currentUser); $('select.select2').select2({ width: 'resolve', dropdownAutoWidth: true }); - $(".issuable-sidebar .inline-update").on("change", "select", function() { - return $(this).submit(); - }); - $(".issuable-sidebar .inline-update").on("change", ".js-assignee", function() { - return $(this).submit(); - }); - $(document).off('click', '.issuable-sidebar .dropdown-content a').on('click', '.issuable-sidebar .dropdown-content a', function(e) { - return e.preventDefault(); - }); - $(document).off('click', '.edit-link').on('click', '.edit-link', function(e) { + $(".issuable-sidebar .inline-update").off('change.submitSelect') + .on("change.submitSelect", "select", function() { + return $(this).submit(); + }); + $(".issuable-sidebar .inline-update").off('change.submitAssignee') + .on("change.submitAssignee", ".js-assignee", function() { + return $(this).submit(); + }); + + $document.off('click.preventDefault', '.issuable-sidebar .dropdown-content a') + .on('click.preventDefault', '.issuable-sidebar .dropdown-content a', function(e) { + return e.preventDefault(); + }); + $document.off('click.editLink', '.edit-link').on('click.editLink', '.edit-link', function(e) { var $block, $selectbox; e.preventDefault(); $block = $(this).parents('.block'); @@ -43,7 +49,8 @@ IssuableContext.prototype.initParticipants = function() { var _this; _this = this; - $(document).on("click", ".js-participants-more", this.toggleHiddenParticipants); + $(document).off('click.toggleHiddenParticipants') + .on("click.toggleHiddenParticipants", ".js-participants-more", this.toggleHiddenParticipants); return $(".js-participants-author").each(function(i) { if (i >= _this.PARTICIPANTS_ROW_COUNT) { return $(this).addClass("js-participants-hidden").hide(); diff --git a/app/assets/javascripts/issuable_form.js b/app/assets/javascripts/issuable_form.js index 1c4086517fe..2e696127aea 100644 --- a/app/assets/javascripts/issuable_form.js +++ b/app/assets/javascripts/issuable_form.js @@ -29,8 +29,8 @@ return; } this.initAutosave(); - this.form.on("submit", this.handleSubmit); - this.form.on("click", ".btn-cancel", this.resetAutosave); + this.form.off('submit.handleSubmit').on("submit.handleSubmit", this.handleSubmit); + this.form.off('click.resetAutosave').on("click.resetAutosave", ".btn-cancel", this.resetAutosave); this.initWip(); this.initMoveDropdown(); $issuableDueDate = $('#issuable-due-date'); @@ -70,8 +70,9 @@ if (!(this.$wipExplanation.length && this.$noWipExplanation.length)) { return; } - this.form.on("click", ".js-toggle-wip", this.toggleWip); - this.titleField.on("keyup blur", this.renderWipExplanation); + this.form.off('click.toggleWip').on("click.toggleWip", ".js-toggle-wip", this.toggleWip); + this.titleField.off('keyup.renderWipExplanation blur.renderWipExplanation') + .on("keyup.renderWipExplanation blur.renderWipExplanation", this.renderWipExplanation); return this.renderWipExplanation(); }; diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js index 61e8531153b..2e8ebc9c3c6 100644 --- a/app/assets/javascripts/issue.js +++ b/app/assets/javascripts/issue.js @@ -24,14 +24,15 @@ 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); + return $(document).off('tasklist:changed.updateTaskList') + .on('tasklist:changed.updateTaskList', '.detail-page-description .js-task-list-container', this.updateTaskList); }; Issue.prototype.initIssueBtnEventListeners = function() { var _this, issueFailMessage; _this = this; issueFailMessage = 'Unable to update this issue at this time.'; - return $('a.btn-close, a.btn-reopen').on('click', function(e) { + return $('a.btn-close, a.btn-reopen').off('click.submitIssue').on('click.submitIssue', function(e) { var $this, isClose, shouldSubmit, url; e.preventDefault(); e.stopImmediatePropagation(); @@ -84,7 +85,7 @@ 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'); + return $(document).off('tasklist:changed.updateTaskList', '.detail-page-description .js-task-list-container'); }; Issue.prototype.updateTaskList = function() { diff --git a/app/assets/javascripts/issues_bulk_assignment.js.es6 b/app/assets/javascripts/issues_bulk_assignment.js.es6 index 52fd5d71b18..47fa248285f 100644 --- a/app/assets/javascripts/issues_bulk_assignment.js.es6 +++ b/app/assets/javascripts/issues_bulk_assignment.js.es6 @@ -18,7 +18,8 @@ } bindEvents() { - return this.form.off('submit').on('submit', this.onFormSubmit.bind(this)); + return this.form.off('submit.onFormSubmit') + .on('submit.onFormSubmit', this.onFormSubmit.bind(this)); } onFormSubmit(e) { diff --git a/app/assets/javascripts/label_manager.js.es6 b/app/assets/javascripts/label_manager.js.es6 index 33c5e35324d..ef3dbbc6903 100644 --- a/app/assets/javascripts/label_manager.js.es6 +++ b/app/assets/javascripts/label_manager.js.es6 @@ -19,7 +19,8 @@ } bindEvents() { - return this.togglePriorityButton.on('click', this, this.onTogglePriorityClick); + return this.off('click.onTogglePriorityClick') + .on('click.onTogglePriorityClick', this, this.onTogglePriorityClick); } onTogglePriorityClick(e) { diff --git a/app/assets/javascripts/labels.js b/app/assets/javascripts/labels.js index 10de13c9a8a..78801ef86b1 100644 --- a/app/assets/javascripts/labels.js +++ b/app/assets/javascripts/labels.js @@ -14,13 +14,17 @@ } Labels.prototype.addBinding = function() { - $(document).on('click', '.suggest-colors a', this.setSuggestedColor); - return $(document).on('input', 'input#label_color', this.updateColorPreview); + var $document = $(document); + $document.off('click.setSuggestedColor') + .on('click.setSuggestedColor', '.suggest-colors a', this.setSuggestedColor); + return $document.off('input.updateColorPreview') + .on('input.updateColorPreview', 'input#label_color', this.updateColorPreview); }; Labels.prototype.cleanBinding = function() { - $(document).off('click', '.suggest-colors a'); - return $(document).off('input', 'input#label_color'); + var $document = $(document); + $document.off('click.setSuggestedColor', '.suggest-colors a'); + return $document.off('input.updateColorPreview', 'input#label_color'); }; Labels.prototype.updateColorPreview = function() { diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index ec2fc87bece..9e0dc367f13 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -412,7 +412,8 @@ } LabelsSelect.prototype.bindEvents = function() { - return $('body').on('change', '.selected_issue', this.onSelectCheckboxIssue); + return $('body').off('change.onSelectCheckboxIssue') + .on('change.onSelectCheckboxIssue', '.selected_issue', this.onSelectCheckboxIssue); }; LabelsSelect.prototype.onSelectCheckboxIssue = function() { diff --git a/app/assets/javascripts/layout_nav.js b/app/assets/javascripts/layout_nav.js index 2b700539c2b..815b1684491 100644 --- a/app/assets/javascripts/layout_nav.js +++ b/app/assets/javascripts/layout_nav.js @@ -17,7 +17,7 @@ $(window).off('resize.nav').on('resize.nav', function() { return hideEndFade($scrollingTabs); }); - $scrollingTabs.off('scroll').on('scroll', function(event) { + $scrollingTabs.off('scroll.initScrolling').on('scroll.initScrolling', function(event) { var $this, currentPosition, maxPosition; $this = $(this); currentPosition = $this.scrollLeft(); diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js index 5066e3282d7..4e5b3cc5450 100644 --- a/app/assets/javascripts/lib/utils/text_utility.js +++ b/app/assets/javascripts/lib/utils/text_utility.js @@ -133,7 +133,7 @@ gl.text.init = function(form) { var self; self = this; - return $('.js-md', form).off('click').on('click', function() { + return $('.js-md', form).off('click.updateText').on('click.updateText', function() { var $this; $this = $(this); return self.updateText($this.closest('.md-area').find('textarea'), $this.data('md-tag'), $this.data('md-block'), !$this.data('md-prepend')); diff --git a/app/assets/javascripts/line_highlighter.js b/app/assets/javascripts/line_highlighter.js index 9af89b79f84..d0d1e5d4cf9 100644 --- a/app/assets/javascripts/line_highlighter.js +++ b/app/assets/javascripts/line_highlighter.js @@ -67,16 +67,18 @@ } LineHighlighter.prototype.bindEvents = function() { - $('#blob-content-holder').on('mousedown', 'a[data-line-number]', this.clickHandler); + $('#blob-content-holder').off('mousedown.clickHandler') + .on('mousedown.clickHandler', 'a[data-line-number]', this.clickHandler); // While it may seem odd to bind to the mousedown event and then throw away // the click event, there is a method to our madness. // // If not done this way, the line number anchor will sometimes keep its // active state even when the event is cancelled, resulting in an ugly border // around the link and/or a persisted underline text decoration. - return $('#blob-content-holder').on('click', 'a[data-line-number]', function(event) { - return event.preventDefault(); - }); + return $('#blob-content-holder').off('click.preventDefault') + .on('click.preventDefault', 'a[data-line-number]', function(event) { + return event.preventDefault(); + }); }; LineHighlighter.prototype.clickHandler = function(event) { diff --git a/app/assets/javascripts/logo.js b/app/assets/javascripts/logo.js index 0ae6df311bb..b87980b1882 100644 --- a/app/assets/javascripts/logo.js +++ b/app/assets/javascripts/logo.js @@ -1,15 +1,19 @@ -/* eslint-disable func-names, space-before-function-paren, prefer-arrow-callback, padded-blocks */ +/* eslint-disable func-names, space-before-function-paren, prefer-arrow-callback, padded-blocks, no-var, max-len */ /* global Turbolinks */ (function() { + var $document = $(document); + Turbolinks.enableProgressBar(); - $(document).on('page:fetch', function() { - $('.tanuki-logo').addClass('animate'); - }); + $document.off('page:fetch.startAnimation') + .on('page:fetch.startAnimation', function() { + $('.tanuki-logo').addClass('animate'); + }); - $(document).on('page:change', function() { - $('.tanuki-logo').removeClass('animate'); - }); + $document.off('page:change.stopAnimation') + .on('page:change.stopAnimation', function() { + $('.tanuki-logo').removeClass('animate'); + }); }).call(this); diff --git a/app/assets/javascripts/member_expiration_date.js.es6 b/app/assets/javascripts/member_expiration_date.js.es6 index bf6c0ec2798..ca72cbc86bd 100644 --- a/app/assets/javascripts/member_expiration_date.js.es6 +++ b/app/assets/javascripts/member_expiration_date.js.es6 @@ -20,16 +20,17 @@ }, }); - inputs.next('.js-clear-input').on('click', function clicked(event) { - event.preventDefault(); + inputs.next('.js-clear-input').off('click.clearInput') + .on('click.clearInput', function clicked(event) { + event.preventDefault(); - const input = $(this).closest('.clearable-input').find(selector); - input.datepicker('setDate', null) - .trigger('change'); - toggleClearInput.call(input); - }); + const input = $(this).closest('.clearable-input').find(selector); + input.datepicker('setDate', null) + .trigger('change'); + toggleClearInput.call(input); + }); - inputs.on('blur', toggleClearInput); + inputs.off('blur.toggleClearInput').on('blur.toggleClearInput', toggleClearInput); inputs.each(toggleClearInput); }; diff --git a/app/assets/javascripts/members.js.es6 b/app/assets/javascripts/members.js.es6 index e3f367a11eb..bedaab8447b 100644 --- a/app/assets/javascripts/members.js.es6 +++ b/app/assets/javascripts/members.js.es6 @@ -9,9 +9,12 @@ } addListeners() { - $('.project_member, .group_member').off('ajax:success').on('ajax:success', this.removeRow); - $('.js-member-update-control').off('change').on('change', this.formSubmit.bind(this)); - $('.js-edit-member-form').off('ajax:success').on('ajax:success', this.formSuccess.bind(this)); + $('.project_member, .group_member').off('ajax:success.removeRow') + .on('ajax:success.removeRow', this.removeRow); + $('.js-member-update-control').off('change.formSubmit') + .on('change.formSubmit', this.formSubmit.bind(this)); + $('.js-edit-member-form').off('ajax:success.formSuccess') + .on('ajax:success.formSuccess', this.formSuccess.bind(this)); gl.utils.disableButtonIfEmptyField('#user_ids', 'input[name=commit]', 'change'); } diff --git a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 index f95b079c972..1efa6cd0002 100644 --- a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 +++ b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 @@ -61,9 +61,10 @@ this.editor = ace.edit(content); this.editor.$blockScrolling = Infinity; // Turn off annoying warning this.editor.getSession().setMode(`ace/mode/${file.blob_ace_mode}`); - this.editor.on('change', () => { - this.saveDiffResolution(); - }); + this.editor.off('change.saveDiffResolution') + .on('change.saveDiffResolution', () => { + this.saveDiffResolution(); + }); this.saveDiffResolution(); }) .fail(() => { diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js index 244c2f6746c..6cb4bc33c17 100644 --- a/app/assets/javascripts/merge_request.js +++ b/app/assets/javascripts/merge_request.js @@ -18,11 +18,12 @@ this.opts = opts != null ? opts : {}; this.submitNoteForm = bind(this.submitNoteForm, this); this.$el = $('.merge-request'); - this.$('.show-all-commits').on('click', (function(_this) { - return function() { - return _this.showAllCommits(); - }; - })(this)); + this.$('.show-all-commits').off('click.showAllCommits') + .on('click.showAllCommits', (function(_this) { + return function() { + return _this.showAllCommits(); + }; + })(this)); this.initTabs(); // Prevent duplicate event bindings this.disableTaskList(); @@ -52,13 +53,13 @@ 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); + return $(document).on('tasklist:changed.updateTaskList', '.detail-page-description .js-task-list-container', this.updateTaskList); }; MergeRequest.prototype.initMRBtnListeners = function() { var _this; _this = this; - return $('a.btn-close, a.btn-reopen').on('click', function(e) { + return $('a.btn-close, a.btn-reopen').off('click.submitNoteForm').on('click.submitNoteForm', function(e) { var $this, shouldSubmit; $this = $(this); shouldSubmit = $this.hasClass('btn-comment'); @@ -87,7 +88,7 @@ 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'); + return $(document).off('tasklist:changed.updateTaskList', '.detail-page-description .js-task-list-container'); }; MergeRequest.prototype.updateTaskList = function() { @@ -112,21 +113,23 @@ MergeRequest.prototype.initCommitMessageListeners = function() { var textarea = $('textarea.js-commit-message'); - $('a.js-with-description-link').on('click', function(e) { - e.preventDefault(); + $('a.js-with-description-link').off('click.hideDescriptionHint') + .on('click.hideDescriptionHint', function(e) { + e.preventDefault(); - textarea.val(textarea.data('messageWithDescription')); - $('p.js-with-description-hint').hide(); - $('p.js-without-description-hint').show(); - }); + textarea.val(textarea.data('messageWithDescription')); + $('p.js-with-description-hint').hide(); + $('p.js-without-description-hint').show(); + }); - $('a.js-without-description-link').on('click', function(e) { - e.preventDefault(); + $('a.js-without-description-link').off('click.showDescriptionHint') + .on('click.showDescriptionHint', function(e) { + e.preventDefault(); - textarea.val(textarea.data('messageWithoutDescription')); - $('p.js-with-description-hint').show(); - $('p.js-without-description-hint').hide(); - }); + textarea.val(textarea.data('messageWithoutDescription')); + $('p.js-with-description-hint').show(); + $('p.js-without-description-hint').hide(); + }); }; return MergeRequest; diff --git a/app/assets/javascripts/merge_request_tabs.js.es6 b/app/assets/javascripts/merge_request_tabs.js.es6 index 860e7e066a0..2fae550302f 100644 --- a/app/assets/javascripts/merge_request_tabs.js.es6 +++ b/app/assets/javascripts/merge_request_tabs.js.es6 @@ -81,14 +81,16 @@ bindEvents() { $(document) - .on('shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', this.tabShown) - .on('click', '.js-show-tab', this.showTab); + .off('shown.bs.tab.tabShown') + .on('shown.bs.tab.tabShown', '.merge-request-tabs a[data-toggle="tab"]', this.tabShown) + .off('click.showTab') + .on('click.showTab', '.js-show-tab', this.showTab); } unbindEvents() { $(document) - .off('shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', this.tabShown) - .off('click', '.js-show-tab', this.showTab); + .off('shown.bs.tab.tabShown', '.merge-request-tabs a[data-toggle="tab"]', this.tabShown) + .off('click.showTab', '.js-show-tab', this.showTab); } showTab(e) { @@ -347,16 +349,16 @@ const $fixedNav = $('.navbar-fixed-top'); const $layoutNav = $('.layout-nav'); - $tabs.off('affix.bs.affix affix-top.bs.affix') - .affix({ - offset: { - top: () => ( - $diffTabs.offset().top - $tabs.height() - $fixedNav.height() - $layoutNav.height() - ), - }, - }) - .on('affix.bs.affix', () => $diffTabs.css({ marginTop: $tabs.height() })) - .on('affix-top.bs.affix', () => $diffTabs.css({ marginTop: '' })); + $tabs.affix({ + offset: { + top: () => ( + $diffTabs.offset().top - $tabs.height() - $fixedNav.height() - $layoutNav.height() + ), + }, + }).off('affix.bs.affix.diffTabsHeight') + .on('affix.bs.affix.diffTabsHeight', () => $diffTabs.css({ marginTop: $tabs.height() })) + .off('affix-top.bs.affix.diffTabsMargin') + .on('affix-top.bs.affix.diffTabsMargin', () => $diffTabs.css({ marginTop: '' })); // Fix bug when reloading the page already scrolling if ($tabs.hasClass('affix')) { diff --git a/app/assets/javascripts/merge_request_widget/ci_bundle.js.es6 b/app/assets/javascripts/merge_request_widget/ci_bundle.js.es6 index 2b074994b4a..db5d8061c25 100644 --- a/app/assets/javascripts/merge_request_widget/ci_bundle.js.es6 +++ b/app/assets/javascripts/merge_request_widget/ci_bundle.js.es6 @@ -9,32 +9,38 @@ * */ if ($('.accept-mr-form').length) { - $('.accept-mr-form').on('ajax:send', () => { - $('.accept-mr-form :input').disable(); - }); + $('.accept-mr-form').off('ajax:send.acceptMRSend') + .on('ajax:send.acceptMRSend', () => { + $('.accept-mr-form :input').disable(); + }); - $('.accept_merge_request').on('click', () => { - $('.js-merge-button').html('<i class="fa fa-spinner fa-spin"></i> Merge in progress'); - }); + $('.accept_merge_request').off('click.mergeInProgress') + .on('click.mergeInProgress', () => { + $('.js-merge-button').html('<i class="fa fa-spinner fa-spin"></i> Merge in progress'); + }); - $('.merge_when_build_succeeds').on('click', () => { - $('#merge_when_build_succeeds').val('1'); - }); + $('.merge_when_build_succeeds').off('click.whenBuildSucceeds') + .on('click.whenBuildSucceeds', () => { + $('#merge_when_build_succeeds').val('1'); + }); - $('.js-merge-dropdown a').on('click', (e) => { - e.preventDefault(); - $(this).closest('form').submit(); - }); + $('.js-merge-dropdown a').off('click.mergeMRSubmit') + .on('click.mergeMRSubmit', (e) => { + e.preventDefault(); + $(this).closest('form').submit(); + }); } else if ($('.rebase-in-progress').length) { merge_request_widget.rebaseInProgress(); } else if ($('.rebase-mr-form').length) { - $('.rebase-mr-form').on('ajax:send', () => { - $('.rebase-mr-form :input').disable(); - }); + $('.rebase-mr-form').off('ajax:send.rebaseMRSend') + .on('ajax:send.rebaseMRSend', () => { + $('.rebase-mr-form :input').disable(); + }); - $('.js-rebase-button').on('click', () => { - $('.js-rebase-button').html("<i class='fa fa-spinner fa-spin'></i> Rebase in progress"); - }); + $('.js-rebase-button').off('click.rebaseInProgress') + .on('click.rebaseInProgress', () => { + $('.js-rebase-button').html("<i class='fa fa-spinner fa-spin'></i> Rebase in progress"); + }); } else { merge_request_widget.getMergeStatus(); } diff --git a/app/assets/javascripts/merged_buttons.js b/app/assets/javascripts/merged_buttons.js index 9f8af46c715..1648a9b6470 100644 --- a/app/assets/javascripts/merged_buttons.js +++ b/app/assets/javascripts/merged_buttons.js @@ -14,15 +14,20 @@ } MergedButtons.prototype.cleanEventListeners = function() { - $(document).off('click', '.remove_source_branch'); - $(document).off('ajax:success', '.remove_source_branch'); - return $(document).off('ajax:error', '.remove_source_branch'); + var $document = $(document); + $document.off('click.removeSourceBranch', '.remove_source_branch'); + $document.off('ajax:success.removeBranchSuccess', '.remove_source_branch'); + return $document.off('ajax:error.removeBranchError', '.remove_source_branch'); }; MergedButtons.prototype.initEventListeners = function() { - $(document).on('click', '.remove_source_branch', this.removeSourceBranch); - $(document).on('ajax:success', '.remove_source_branch', this.removeBranchSuccess); - return $(document).on('ajax:error', '.remove_source_branch', this.removeBranchError); + var $document = $(document); + $document.off('click.removeSourceBranch') + .on('click.removeSourceBranch', '.remove_source_branch', this.removeSourceBranch); + $document.off('ajax:success.removeBranchSuccess') + .on('ajax:success.removeBranchSuccess', '.remove_source_branch', this.removeBranchSuccess); + return $document.off('ajax:error.removeBranchError') + .on('ajax:error.removeBranchError', '.remove_source_branch', this.removeBranchError); }; MergedButtons.prototype.removeSourceBranch = function() { diff --git a/app/assets/javascripts/mini_pipeline_graph_dropdown.js.es6 b/app/assets/javascripts/mini_pipeline_graph_dropdown.js.es6 index 90b3366f14b..4fd11bc57e7 100644 --- a/app/assets/javascripts/mini_pipeline_graph_dropdown.js.es6 +++ b/app/assets/javascripts/mini_pipeline_graph_dropdown.js.es6 @@ -31,8 +31,8 @@ bindEvents() { const dropdownButtonSelector = 'button.js-builds-dropdown-button'; - $(this.container).off('click', dropdownButtonSelector, this.getBuildsList) - .on('click', dropdownButtonSelector, this.getBuildsList); + $(this.container).off('click.getBuildsList', dropdownButtonSelector, this.getBuildsList) + .on('click.getBuildsList', dropdownButtonSelector, this.getBuildsList); } /** diff --git a/app/assets/javascripts/new_branch_form.js b/app/assets/javascripts/new_branch_form.js index 29a323dd4c6..963f948d0ba 100644 --- a/app/assets/javascripts/new_branch_form.js +++ b/app/assets/javascripts/new_branch_form.js @@ -16,7 +16,7 @@ } NewBranchForm.prototype.addBinding = function() { - return this.name.on('blur', this.validate); + return this.name.off('blur.validate').on('blur.validate', this.validate); }; NewBranchForm.prototype.init = function() { diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index 603db88567d..d7446dad290 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -61,71 +61,94 @@ } Notes.prototype.addBinding = function() { + var $document = $(document); // add note to UI after creation - $(document).on("ajax:success", ".js-main-target-form", this.addNote); - $(document).on("ajax:success", ".js-discussion-note-form", this.addDiscussionNote); + $document.off('ajax:success.addNote') + .on("ajax:success.addNote", ".js-main-target-form", this.addNote); + $document.off('ajax:success.addDiscussionNote') + .on("ajax:success.addDiscussionNote", ".js-discussion-note-form", this.addDiscussionNote); // catch note ajax errors - $(document).on("ajax:error", ".js-main-target-form", this.addNoteError); + $document.off('ajax:error.addNoteError') + .on("ajax:error.addNoteError", ".js-main-target-form", this.addNoteError); // change note in UI after update - $(document).on("ajax:success", "form.edit-note", this.updateNote); + $document.off('ajax:success.updateNote') + .on("ajax:success.updateNote", "form.edit-note", this.updateNote); // Edit note link - $(document).on("click", ".js-note-edit", this.showEditForm.bind(this)); - $(document).on("click", ".note-edit-cancel", this.cancelEdit); + $document.off('click.showEditForm') + .on("click.showEditForm", ".js-note-edit", this.showEditForm.bind(this)); + $document.off('click.cancelEdit') + .on("click.cancelEdit", ".note-edit-cancel", this.cancelEdit); // Reopen and close actions for Issue/MR combined with note form submit - $(document).on("click", ".js-comment-button", this.updateCloseButton); - $(document).on("keyup input", ".js-note-text", this.updateTargetButtons); + $document.off('click.updateCloseButton') + .on("click.updateCloseButton", ".js-comment-button", this.updateCloseButton); + $document.off('keyup.updateTargetButtons input.updateTargetButtons') + .on("keyup.updateTargetButtons input.updateTargetButtons", ".js-note-text", this.updateTargetButtons); // resolve a discussion - $(document).on('click', '.js-comment-resolve-button', this.resolveDiscussion); + $document.off('click.resolveDiscussion') + .on('click.resolveDiscussion', '.js-comment-resolve-button', this.resolveDiscussion); // remove a note (in general) - $(document).on("click", ".js-note-delete", this.removeNote); + $document.off('click.removeNote') + .on("click.removeNote", ".js-note-delete", this.removeNote); // delete note attachment - $(document).on("click", ".js-note-attachment-delete", this.removeAttachment); + $document.off('click.removeAttachment') + .on("click.removeAttachment", ".js-note-attachment-delete", this.removeAttachment); // reset main target form after submit - $(document).on("ajax:complete", ".js-main-target-form", this.reenableTargetFormSubmitButton); - $(document).on("ajax:success", ".js-main-target-form", this.resetMainTargetForm); + $document.off('ajax:complete.reenableTargetFormSubmitButton') + .on("ajax:complete.reenableTargetFormSubmitButton", ".js-main-target-form", this.reenableTargetFormSubmitButton); + $document.off('ajax:success.resetMainTargetForm') + .on("ajax:success.resetMainTargetForm", ".js-main-target-form", this.resetMainTargetForm); // reset main target form when clicking discard - $(document).on("click", ".js-note-discard", this.resetMainTargetForm); + $document.off('click.resetMainTargetForm') + .on("click.resetMainTargetForm", ".js-note-discard", this.resetMainTargetForm); // update the file name when an attachment is selected - $(document).on("change", ".js-note-attachment-input", this.updateFormAttachment); + $document.off('change.updateFormAttachment') + .on("change.updateFormAttachment", ".js-note-attachment-input", this.updateFormAttachment); // reply to diff/discussion notes - $(document).on("click", ".js-discussion-reply-button", this.replyToDiscussionNote); + $document.off('click.replyToDiscussionNote') + .on("click.replyToDiscussionNote", ".js-discussion-reply-button", this.replyToDiscussionNote); // add diff note - $(document).on("click", ".js-add-diff-note-button", this.addDiffNote); + $document.off('click.addDiffNote') + .on("click.addDiffNote", ".js-add-diff-note-button", this.addDiffNote); // hide diff note form - $(document).on("click", ".js-close-discussion-note-form", this.cancelDiscussionForm); + $document.off('click.cancelDiscussionForm') + .on("click.cancelDiscussionForm", ".js-close-discussion-note-form", this.cancelDiscussionForm); // toggle commit list - $(document).on("click", '.system-note-commit-list-toggler', this.toggleCommitList); + $document.off('click.toggleCommitList') + .on("click.toggleCommitList", '.system-note-commit-list-toggler', this.toggleCommitList); // fetch notes when tab becomes visible - $(document).on("visibilitychange", this.visibilityChange); + $document.off('visibilitychange.visibilityChange') + .on("visibilitychange.visibilityChange", this.visibilityChange); // when issue status changes, we need to refresh data - $(document).on("issuable:change", this.refresh); + $document.off('issuable:change.refresh') + .on("issuable:change.refresh", this.refresh); // when a key is clicked on the notes - return $(document).on("keydown", ".js-note-text", this.keydownNoteText); + return $document.off('keydown.keydownNoteText') + .on("keydown.keydownNoteText", ".js-note-text", this.keydownNoteText); }; Notes.prototype.cleanBinding = function() { - $(document).off("ajax:success", ".js-main-target-form"); - $(document).off("ajax:success", ".js-discussion-note-form"); - $(document).off("ajax:success", "form.edit-note"); - $(document).off("click", ".js-note-edit"); - $(document).off("click", ".note-edit-cancel"); - $(document).off("click", ".js-note-delete"); - $(document).off("click", ".js-note-attachment-delete"); - $(document).off("ajax:complete", ".js-main-target-form"); - $(document).off("ajax:success", ".js-main-target-form"); - $(document).off("click", ".js-discussion-reply-button"); - $(document).off("click", ".js-add-diff-note-button"); - $(document).off("visibilitychange"); - $(document).off("keyup", ".js-note-text"); - $(document).off("click", ".js-note-target-reopen"); - $(document).off("click", ".js-note-target-close"); - $(document).off("click", ".js-note-discard"); - $(document).off("keydown", ".js-note-text"); - $(document).off('click', '.js-comment-resolve-button'); - $(document).off("click", '.system-note-commit-list-toggler'); + var $document = $(document); + + $document.off("ajax:success.addNote", ".js-main-target-form"); + $document.off("ajax:success.addDiscussionNote", ".js-discussion-note-form"); + $document.off("ajax:success.updateNote", "form.edit-note"); + $document.off("click.showEditForm", ".js-note-edit"); + $document.off("click.cancelEdit", ".note-edit-cancel"); + $document.off("click.removeNote", ".js-note-delete"); + $document.off("click.removeAttachment", ".js-note-attachment-delete"); + $document.off("ajax:complete.reenableTargetFormSubmitButton", ".js-main-target-form"); + $document.off("ajax:success.resetMainTargetForm", ".js-main-target-form"); + $document.off("click.replyToDiscussionNote", ".js-discussion-reply-button"); + $document.off("click.addDiffNote", ".js-add-diff-note-button"); + $document.off("visibilitychange.visibilityChange"); + $document.off("keyup.updateTargetButtons", ".js-note-text"); + $document.off("click.resetMainTargetForm", ".js-note-discard"); + $document.off("keydown.keydownNoteText", ".js-note-text"); + $document.off('click.resolveDiscussion', '.js-comment-resolve-button'); + $document.off("click.toggleCommitList", '.system-note-commit-list-toggler'); $('.note .js-task-list-container').taskList('disable'); - return $(document).off('tasklist:changed', '.note .js-task-list-container'); + return $document.off('tasklist:changed.updateTaskList', '.note .js-task-list-container'); }; Notes.prototype.keydownNoteText = function(e) { @@ -874,7 +897,8 @@ Notes.prototype.initTaskList = function() { this.enableTaskList(); - return $(document).on('tasklist:changed', '.note .js-task-list-container', this.updateTaskList.bind(this)); + return $(document).off('tasklist:changed.updateTaskList') + .on('tasklist:changed.updateTaskList', '.note .js-task-list-container', this.updateTaskList.bind(this)); }; Notes.prototype.enableTaskList = function() { diff --git a/app/assets/javascripts/notifications_dropdown.js b/app/assets/javascripts/notifications_dropdown.js index 5d0d594073d..ff187b045a7 100644 --- a/app/assets/javascripts/notifications_dropdown.js +++ b/app/assets/javascripts/notifications_dropdown.js @@ -4,26 +4,30 @@ (function() { this.NotificationsDropdown = (function() { function NotificationsDropdown() { - $(document).off('click', '.update-notification').on('click', '.update-notification', function(e) { - var form, label, notificationLevel; - e.preventDefault(); - if ($(this).is('.is-active') && $(this).data('notification-level') === 'custom') { - return; - } - notificationLevel = $(this).data('notification-level'); - label = $(this).data('notification-title'); - form = $(this).parents('.notification-form:first'); - form.find('.js-notification-loading').toggleClass('fa-bell fa-spin fa-spinner'); - form.find('#notification_setting_level').val(notificationLevel); - return form.submit(); - }); - $(document).off('ajax:success', '.notification-form').on('ajax:success', '.notification-form', function(e, data) { - if (data.saved) { - return $(e.currentTarget).closest('.js-notification-dropdown').replaceWith(data.html); - } else { - return new Flash('Failed to save new settings', 'alert'); - } - }); + var $document = $(document); + + $document.off('click.updateNotificationSettings', '.update-notification') + .on('click.updateNotificationSettings', '.update-notification', function(e) { + var form, label, notificationLevel; + e.preventDefault(); + if ($(this).is('.is-active') && $(this).data('notification-level') === 'custom') { + return; + } + notificationLevel = $(this).data('notification-level'); + label = $(this).data('notification-title'); + form = $(this).parents('.notification-form:first'); + form.find('.js-notification-loading').toggleClass('fa-bell fa-spin fa-spinner'); + form.find('#notification_setting_level').val(notificationLevel); + return form.submit(); + }); + $document.off('ajax:success.saveNotificationSettings', '.notification-form') + .on('ajax:success.saveNotificationSettings', '.notification-form', function(e, data) { + if (data.saved) { + return $(e.currentTarget).closest('.js-notification-dropdown').replaceWith(data.html); + } else { + return new Flash('Failed to save new settings', 'alert'); + } + }); } return NotificationsDropdown; diff --git a/app/assets/javascripts/notifications_form.js b/app/assets/javascripts/notifications_form.js index 2034f9a748a..b649b682f22 100644 --- a/app/assets/javascripts/notifications_form.js +++ b/app/assets/javascripts/notifications_form.js @@ -10,11 +10,12 @@ } NotificationsForm.prototype.removeEventListeners = function() { - return $(document).off('change', '.js-custom-notification-event'); + return $(document).off('change.toggleCheckbox', '.js-custom-notification-event'); }; NotificationsForm.prototype.initEventListeners = function() { - return $(document).on('change', '.js-custom-notification-event', this.toggleCheckbox); + return $(document).off('change.toggleCheckbox') + .on('change.toggleCheckbox', '.js-custom-notification-event', this.toggleCheckbox); }; NotificationsForm.prototype.toggleCheckbox = function(e) { diff --git a/app/assets/javascripts/preview_markdown.js b/app/assets/javascripts/preview_markdown.js index 89f7e976934..1c6bf97d57e 100644 --- a/app/assets/javascripts/preview_markdown.js +++ b/app/assets/javascripts/preview_markdown.js @@ -10,6 +10,7 @@ var markdownPreview; var previewButtonSelector; var writeButtonSelector; + var $document; window.MarkdownPreview = (function () { function MarkdownPreview() {} @@ -95,63 +96,71 @@ $.fn.setupMarkdownPreview = function () { var $form = $(this); - $form.find('textarea.markdown-area').on('input', function () { - markdownPreview.hideReferencedUsers($form); - }); + $form.find('textarea.markdown-area').off('input.hideReferencedUsers') + .on('input.hideReferencedUsers', function () { + markdownPreview.hideReferencedUsers($form); + }); }; - $(document).on('markdown-preview:show', function (e, $form) { - if (!$form) { - return; - } - lastTextareaPreviewed = $form.find('textarea.markdown-area'); - // toggle tabs - $form.find(writeButtonSelector).parent().removeClass('active'); - $form.find(previewButtonSelector).parent().addClass('active'); - // toggle content - $form.find('.md-write-holder').hide(); - $form.find('.md-preview-holder').show(); - markdownPreview.showPreview($form); - }); - - $(document).on('markdown-preview:hide', function (e, $form) { - if (!$form) { - return; - } - lastTextareaPreviewed = null; - // toggle tabs - $form.find(writeButtonSelector).parent().addClass('active'); - $form.find(previewButtonSelector).parent().removeClass('active'); - // toggle content - $form.find('.md-write-holder').show(); - $form.find('textarea.markdown-area').focus(); - $form.find('.md-preview-holder').hide(); - }); - - $(document).on('markdown-preview:toggle', function (e, keyboardEvent) { - var $target; - $target = $(keyboardEvent.target); - if ($target.is('textarea.markdown-area')) { - $(document).triggerHandler('markdown-preview:show', [$target.closest('form')]); - keyboardEvent.preventDefault(); - } else if (lastTextareaPreviewed) { - $target = lastTextareaPreviewed; - $(document).triggerHandler('markdown-preview:hide', [$target.closest('form')]); - keyboardEvent.preventDefault(); - } - }); - - $(document).on('click', previewButtonSelector, function (e) { - var $form; - e.preventDefault(); - $form = $(this).closest('form'); - $(document).triggerHandler('markdown-preview:show', [$form]); - }); - - $(document).on('click', writeButtonSelector, function (e) { - var $form; - e.preventDefault(); - $form = $(this).closest('form'); - $(document).triggerHandler('markdown-preview:hide', [$form]); - }); + $document = $(document); + + $document.off('markdown-preview:show.showPreview') + .on('markdown-preview:show.showPreview', function (e, $form) { + if (!$form) { + return; + } + lastTextareaPreviewed = $form.find('textarea.markdown-area'); + // toggle tabs + $form.find(writeButtonSelector).parent().removeClass('active'); + $form.find(previewButtonSelector).parent().addClass('active'); + // toggle content + $form.find('.md-write-holder').hide(); + $form.find('.md-preview-holder').show(); + markdownPreview.showPreview($form); + }); + + $document.off('markdown-preview:hide.hidePreview') + .on('markdown-preview:hide.hidePreview', function (e, $form) { + if (!$form) { + return; + } + lastTextareaPreviewed = null; + // toggle tabs + $form.find(writeButtonSelector).parent().addClass('active'); + $form.find(previewButtonSelector).parent().removeClass('active'); + // toggle content + $form.find('.md-write-holder').show(); + $form.find('textarea.markdown-area').focus(); + $form.find('.md-preview-holder').hide(); + }); + + $document.off('markdown-preview:toggle.togglePreview') + .on('markdown-preview:toggle.togglePreview', function (e, keyboardEvent) { + var $target; + $target = $(keyboardEvent.target); + if ($target.is('textarea.markdown-area')) { + $(document).triggerHandler('markdown-preview:show', [$target.closest('form')]); + keyboardEvent.preventDefault(); + } else if (lastTextareaPreviewed) { + $target = lastTextareaPreviewed; + $(document).triggerHandler('markdown-preview:hide', [$target.closest('form')]); + keyboardEvent.preventDefault(); + } + }); + + $document.off('click.triggerPreviewShow') + .on('click.triggerPreviewShow', previewButtonSelector, function (e) { + var $form; + e.preventDefault(); + $form = $(this).closest('form'); + $(document).triggerHandler('markdown-preview:show', [$form]); + }); + + $document.off('click.triggerPreviewHide') + .on('click.triggerPreviewHide', writeButtonSelector, function (e) { + var $form; + e.preventDefault(); + $form = $(this).closest('form'); + $(document).triggerHandler('markdown-preview:hide', [$form]); + }); }()); diff --git a/app/assets/javascripts/profile/gl_crop.js.es6 b/app/assets/javascripts/profile/gl_crop.js.es6 index b4b6da41f63..0cb6d461be5 100644 --- a/app/assets/javascripts/profile/gl_crop.js.es6 +++ b/app/assets/javascripts/profile/gl_crop.js.es6 @@ -44,18 +44,24 @@ bindEvents() { var _this; _this = this; - this.fileInput.on('change', function(e) { - return _this.onFileInputChange(e, this); - }); - this.pickImageEl.on('click', this.onPickImageClick); - this.modalCrop.on('shown.bs.modal', this.onModalShow); - this.modalCrop.on('hidden.bs.modal', this.onModalHide); - this.uploadImageBtn.on('click', this.onUploadImageBtnClick); - this.cropActionsBtn.on('click', function(e) { - var btn; - btn = this; - return _this.onActionBtnClick(btn); - }); + this.fileInput.off('change.onFileInputChange') + .on('change.onFileInputChange', function(e) { + return _this.onFileInputChange(e, this); + }); + this.pickImageEl.off('click.onPickImageClick') + .on('click.onPickImageClick', this.onPickImageClick); + this.modalCrop.off('shown.bs.modal.onModalShowCrop') + .on('shown.bs.modal.onModalShowCrop', this.onModalShow); + this.modalCrop.off('hidden.bs.modal.onModalHideCrop') + .on('hidden.bs.modal.onModalHideCrop', this.onModalHide); + this.uploadImageBtn.off('click.onUploadImageBtnClick') + .on('click.onUploadImageBtnClick', this.onUploadImageBtnClick); + this.cropActionsBtn.off('click.onActionBtnClick') + .on('click.onActionBtnClick', function(e) { + var btn; + btn = this; + return _this.onActionBtnClick(btn); + }); return this.croppedImageBlob = null; } diff --git a/app/assets/javascripts/profile/profile.js.es6 b/app/assets/javascripts/profile/profile.js.es6 index aef2e3a3fa8..9dc9dfc61ad 100644 --- a/app/assets/javascripts/profile/profile.js.es6 +++ b/app/assets/javascripts/profile/profile.js.es6 @@ -24,12 +24,18 @@ } bindEvents() { - $('.js-preferences-form').on('change.preference', 'input[type=radio]', this.submitForm); - $('#user_notification_email').on('change', this.submitForm); - $('.update-username').on('ajax:before', this.beforeUpdateUsername); - $('.update-username').on('ajax:complete', this.afterUpdateUsername); - $('.update-notifications').on('ajax:success', this.onUpdateNotifs); - this.form.on('submit', this.onSubmitForm); + $('.js-preferences-form').off('change.preference') + .on('change.preference', 'input[type=radio]', this.submitForm); + $('#user_notification_email').off('change.submitForm') + .on('change.submitForm', this.submitForm); + $('.update-username').off('ajax:before.beforeUpdateUsername') + .on('ajax:before.beforeUpdateUsername', this.beforeUpdateUsername); + $('.update-username').off('ajax:complete.afterUpdateUsername') + .on('ajax:complete.afterUpdateUsername', this.afterUpdateUsername); + $('.update-notifications').off('ajax:success.onUpdateNotifs') + .on('ajax:success.onUpdateNotifs', this.onUpdateNotifs); + this.form.off('submit.onSubmitFormProfile') + .on('submit.onSubmitFormProfile', this.onSubmitForm); } submitForm() { diff --git a/app/assets/javascripts/project.js b/app/assets/javascripts/project.js index fcf3a4af956..da3f115403e 100644 --- a/app/assets/javascripts/project.js +++ b/app/assets/javascripts/project.js @@ -24,15 +24,15 @@ }); // Ref switcher this.initRefSwitcher(); - $('.project-refs-select').on('change', function() { + $('.project-refs-select').off('change.submitRefs').on('change.submitRefs', function() { return $(this).parents('form').submit(); }); - $('.hide-no-ssh-message').on('click', function(e) { + $('.hide-no-ssh-message').off('click.hideNoSSH').on('click.hideNoSSH', function(e) { Cookies.set('hide_no_ssh_message', 'false'); $(this).parents('.no-ssh-key-message').remove(); return e.preventDefault(); }); - $('.hide-no-password-message').on('click', function(e) { + $('.hide-no-password-message').off('click.hideNoPassword').on('click.hideNoPassword', function(e) { Cookies.set('hide_no_password_message', 'false'); $(this).parents('.no-password-message').remove(); return e.preventDefault(); @@ -42,12 +42,12 @@ Project.prototype.projectSelectDropdown = function() { new ProjectSelect(); - $('.project-item-select').on('click', (function(_this) { + $('.project-item-select').off('click.changeProject').on('click.changeProject', (function(_this) { return function(e) { return _this.changeProject($(e.currentTarget).val()); }; })(this)); - return $('.js-projects-dropdown-toggle').on('click', function(e) { + return $('.js-projects-dropdown-toggle').off('click.toggleProjectDropdown').on('click.toggleProjectDropdown', function(e) { e.preventDefault(); return $('.js-projects-dropdown').select2('open'); }); diff --git a/app/assets/javascripts/project_find_file.js b/app/assets/javascripts/project_find_file.js index 1bd232314d0..91ac4bec6f6 100644 --- a/app/assets/javascripts/project_find_file.js +++ b/app/assets/javascripts/project_find_file.js @@ -25,8 +25,7 @@ } ProjectFindFile.prototype.initEvent = function() { - this.inputElement.off("keyup"); - this.inputElement.on("keyup", (function(_this) { + this.inputElement.off("keyup.findFile").on("keyup.findFile", (function(_this) { return function(event) { var oldValue, ref, target, value; target = $(event.target); diff --git a/app/assets/javascripts/project_fork.js b/app/assets/javascripts/project_fork.js index 4aedc9a2330..ada6b8bbfe9 100644 --- a/app/assets/javascripts/project_fork.js +++ b/app/assets/javascripts/project_fork.js @@ -2,7 +2,7 @@ (function() { this.ProjectFork = (function() { function ProjectFork() { - $('.fork-thumbnail a').on('click', function() { + $('.fork-thumbnail a').off('click.saveFork').on('click.saveFork', function() { $('.fork-namespaces').hide(); return $('.save-project-loader').show(); }); diff --git a/app/assets/javascripts/project_label_subscription.js.es6 b/app/assets/javascripts/project_label_subscription.js.es6 index b8d6a198996..cfebe327ed9 100644 --- a/app/assets/javascripts/project_label_subscription.js.es6 +++ b/app/assets/javascripts/project_label_subscription.js.es6 @@ -6,7 +6,7 @@ this.$container = $(container); this.$buttons = this.$container.find('.js-subscribe-button'); - this.$buttons.on('click', this.toggleSubscription.bind(this)); + this.$buttons.off('click.toggleSubscription').on('click.toggleSubscription', this.toggleSubscription.bind(this)); } toggleSubscription(event) { diff --git a/app/assets/javascripts/project_new.js b/app/assets/javascripts/project_new.js index 7fc611d0dad..1efc7a27af3 100644 --- a/app/assets/javascripts/project_new.js +++ b/app/assets/javascripts/project_new.js @@ -8,7 +8,7 @@ this.$selects = $('.features select'); this.$repoSelects = this.$selects.filter('.js-repo-select'); - $('.project-edit-container').on('ajax:before', (function(_this) { + $('.project-edit-container').off('ajax:before.saveProject').on('ajax:before.saveProject', (function(_this) { return function() { $('.project-edit-container').hide(); return $('.save-project-loader').show(); @@ -31,7 +31,7 @@ }; ProjectNew.prototype.toggleSettingsOnclick = function() { - this.$selects.on('change', this.toggleSettings); + this.$selects.off('change.toggleSettings').on('change.toggleSettings', this.toggleSettings); }; ProjectNew.prototype._showOrHide = function(checkElement, container) { @@ -53,8 +53,8 @@ .nextAll() .hide(); - $repoAccessLevel.off('change') - .on('change', function () { + $repoAccessLevel.off('change.updateAccessLevel') + .on('change.updateAccessLevel', function () { var selectedVal = parseInt($repoAccessLevel.val()); this.$repoSelects.each(function () { diff --git a/app/assets/javascripts/project_variables.js.es6 b/app/assets/javascripts/project_variables.js.es6 index 4ee2e49306d..836f069e473 100644 --- a/app/assets/javascripts/project_variables.js.es6 +++ b/app/assets/javascripts/project_variables.js.es6 @@ -4,7 +4,7 @@ class ProjectVariables { constructor() { this.$revealBtn = $('.js-btn-toggle-reveal-values'); - this.$revealBtn.on('click', this.toggleRevealState.bind(this)); + this.$revealBtn.off('click.toggleRevealState').on('click.toggleRevealState', this.toggleRevealState.bind(this)); } toggleRevealState(e) { diff --git a/app/assets/javascripts/projects_list.js b/app/assets/javascripts/projects_list.js index 4548dc68fe1..296040f0ef3 100644 --- a/app/assets/javascripts/projects_list.js +++ b/app/assets/javascripts/projects_list.js @@ -3,7 +3,7 @@ (function() { window.ProjectsList = { init: function() { - $(".projects-list-filter").off('keyup'); + $(".projects-list-filter").off('keyup.debounceProjectFilter'); this.initSearch(); return this.initPagination(); }, @@ -11,7 +11,7 @@ var debounceFilter, projectsListFilter; projectsListFilter = $('.projects-list-filter'); debounceFilter = _.debounce(window.ProjectsList.filterResults, 500); - return projectsListFilter.on('keyup', function(e) { + return projectsListFilter.off('keyup.debounceProjectFilter').on('keyup.debounceProjectFilter', function(e) { if (projectsListFilter.val() !== '') { return debounceFilter(); } @@ -42,9 +42,10 @@ }); }, initPagination: function() { - return $('.projects-list-holder .pagination').on('ajax:success', function(e, data) { - return $('.projects-list-holder').replaceWith(data.html); - }); + return $('.projects-list-holder .pagination').off('ajax:success.replaceProjectList') + .on('ajax:success.replaceProjectList', function(e, data) { + return $('.projects-list-holder').replaceWith(data.html); + }); } }; diff --git a/app/assets/javascripts/protected_branches/protected_branch_dropdown.js.es6 b/app/assets/javascripts/protected_branches/protected_branch_dropdown.js.es6 index 03f4531abf5..60078550255 100644 --- a/app/assets/javascripts/protected_branches/protected_branch_dropdown.js.es6 +++ b/app/assets/javascripts/protected_branches/protected_branch_dropdown.js.es6 @@ -43,7 +43,8 @@ class ProtectedBranchDropdown { } bindEvents() { - this.$protectedBranch.on('click', this.onClickCreateWildcard.bind(this)); + this.$protectedBranch.off('click.onClickCreateWildcard') + .on('click.onClickCreateWildcard', this.onClickCreateWildcard.bind(this)); } onClickCreateWildcard() { diff --git a/app/assets/javascripts/render_gfm.js b/app/assets/javascripts/render_gfm.js index bbb2f186655..4f7001cbd24 100644 --- a/app/assets/javascripts/render_gfm.js +++ b/app/assets/javascripts/render_gfm.js @@ -9,8 +9,9 @@ this.find('.js-render-math').renderMath(); }; - $(document).on('ready page:load', function() { - return $('body').renderGFM(); - }); + $(document).off('ready.renderGFM page:load.renderGFM') + .on('ready.renderGFM page:load.renderGFM', function() { + return $('body').renderGFM(); + }); }).call(this); diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js index b1e844b7302..29ca51834d8 100644 --- a/app/assets/javascripts/right_sidebar.js +++ b/app/assets/javascripts/right_sidebar.js @@ -13,19 +13,26 @@ } Sidebar.prototype.removeListeners = function () { - this.sidebar.off('click', '.sidebar-collapsed-icon'); - $('.dropdown').off('hidden.gl.dropdown'); - $('.dropdown').off('loading.gl.dropdown'); - $('.dropdown').off('loaded.gl.dropdown'); - $(document).off('click', '.js-sidebar-toggle'); + var $dropdown = $('.dropdown'); + this.sidebar.off('click.sidebarCollapseClicked', '.sidebar-collapsed-icon'); + $dropdown.off('hidden.gl.dropdown.onSidebarDropdownHidden'); + $dropdown.off('loading.gl.dropdown.sidebarDropdownLoading'); + $dropdown.off('loaded.gl.dropdown.sidebarDropdownLoaded'); + $(document).off('click.toggleRightSidebar', '.js-sidebar-toggle'); } Sidebar.prototype.addEventListeners = function() { - this.sidebar.on('click', '.sidebar-collapsed-icon', this, this.sidebarCollapseClicked); - $('.dropdown').on('hidden.gl.dropdown', this, this.onSidebarDropdownHidden); - $('.dropdown').on('loading.gl.dropdown', this.sidebarDropdownLoading); - $('.dropdown').on('loaded.gl.dropdown', this.sidebarDropdownLoaded); - $(document).on('click', '.js-sidebar-toggle', function(e, triggered) { + var $dropdown = $('.dropdown'); + var $document = $(document); + this.sidebar.off('click.sidebarCollapseClicked') + .on('click.sidebarCollapseClicked', '.sidebar-collapsed-icon', this, this.sidebarCollapseClicked); + $dropdown.off('hidden.gl.dropdown.onSidebarDropdownHidden') + .on('hidden.gl.dropdown.onSidebarDropdownHidden', this, this.onSidebarDropdownHidden); + $dropdown.off('loading.gl.dropdown.sidebarDropdownLoading') + .on('loading.gl.dropdown.sidebarDropdownLoading', this.sidebarDropdownLoading); + $dropdown.off('loaded.gl.dropdown.sidebarDropdownLoaded') + .on('loaded.gl.dropdown.sidebarDropdownLoaded', this.sidebarDropdownLoaded); + $document.off('click.toggleRightSidebar').on('click.toggleRightSidebar', '.js-sidebar-toggle', function(e, triggered) { var $allGutterToggleIcons, $this, $thisIcon; e.preventDefault(); $this = $(this); @@ -44,7 +51,8 @@ return Cookies.set("collapsed_gutter", $('.right-sidebar').hasClass('right-sidebar-collapsed')); } }); - return $(document).off('click', '.js-issuable-todo').on('click', '.js-issuable-todo', this.toggleTodo); + return $document.off('click.rightSidebarToggleTodo', '.js-issuable-todo') + .on('click.rightSidebarToggleTodo', '.js-issuable-todo', this.toggleTodo); }; Sidebar.prototype.toggleTodo = function(e) { diff --git a/app/assets/javascripts/search.js b/app/assets/javascripts/search.js index 4b6ebadeac7..3114dba0f2b 100644 --- a/app/assets/javascripts/search.js +++ b/app/assets/javascripts/search.js @@ -67,8 +67,9 @@ } Search.prototype.eventListeners = function() { - $(document).off('keyup', '.js-search-input').on('keyup', '.js-search-input', this.searchKeyUp); - return $(document).off('click', '.js-search-clear').on('click', '.js-search-clear', this.clearSearchField); + var $document = $(document); + $document.off('keyup.searchKeyUp', '.js-search-input').on('keyup.searchKeyUp', '.js-search-input', this.searchKeyUp); + return $document.off('click.clearSearchField', '.js-search-clear').on('click.clearSearchField', '.js-search-clear', this.clearSearchField); }; Search.prototype.submitSearch = function() { diff --git a/app/assets/javascripts/search_autocomplete.js.es6 b/app/assets/javascripts/search_autocomplete.js.es6 index 437f5dbbf7d..449f7dc671a 100644 --- a/app/assets/javascripts/search_autocomplete.js.es6 +++ b/app/assets/javascripts/search_autocomplete.js.es6 @@ -190,13 +190,13 @@ } bindEvents() { - this.searchInput.on('keydown', this.onSearchInputKeyDown); - this.searchInput.on('keyup', this.onSearchInputKeyUp); - this.searchInput.on('click', this.onSearchInputClick); - this.searchInput.on('focus', this.onSearchInputFocus); - this.searchInput.on('blur', this.onSearchInputBlur); - this.clearInput.on('click', this.onClearInputClick); - return this.locationBadgeEl.on('click', (function(_this) { + this.searchInput.off('keydown.onSearchInputKeyDown').on('keydown.onSearchInputKeyDown', this.onSearchInputKeyDown); + this.searchInput.off('keyup.onSearchInputKeyUp').on('keyup.onSearchInputKeyUp', this.onSearchInputKeyUp); + this.searchInput.off('click.onSearchInputClick').on('click.onSearchInputClick', this.onSearchInputClick); + this.searchInput.off('focus.onSearchInputFocus').on('focus.onSearchInputFocus', this.onSearchInputFocus); + this.searchInput.off('blur.onSearchInputBlur').on('blur.onSearchInputBlur', this.onSearchInputBlur); + this.clearInput.off('click.onClearInputClick').on('click.onClearInputClick', this.onClearInputClick); + return this.locationBadgeEl.off('click.focusInputBadge').on('click.focusInputBadge', (function(_this) { return function() { return _this.searchInput.focus(); }; diff --git a/app/assets/javascripts/sidebar.js.es6 b/app/assets/javascripts/sidebar.js.es6 index 9790a44972d..f785d83e059 100644 --- a/app/assets/javascripts/sidebar.js.es6 +++ b/app/assets/javascripts/sidebar.js.es6 @@ -37,11 +37,16 @@ $(pageSelector).hasClass(expandedPageClass) ); $(document) - .on('click', sidebarToggleSelector, () => this.toggleSidebar()) - .on('click', pinnedToggleSelector, () => this.togglePinnedState()) - .on('click', 'html, body', (e) => this.handleClickEvent(e)) - .on('page:change', () => this.renderState()) - .on('todo:toggle', (e, count) => this.updateTodoCount(count)); + .off('click.toggleSidebar') + .on('click.toggleSidebar', sidebarToggleSelector, () => this.toggleSidebar()) + .off('click.togglePinnedState') + .on('click.togglePinnedState', pinnedToggleSelector, () => this.togglePinnedState()) + .off('click.sidebarHandleClickEvent') + .on('click.sidebarHandleClickEvent', 'html, body', (e) => this.handleClickEvent(e)) + .off('page:change.sidebarRenderState') + .on('page:change.sidebarRenderState', () => this.renderState()) + .off('todo:toggle.updateTodoCount') + .on('todo:toggle.updateTodoCount', (e, count) => this.updateTodoCount(count)); this.renderState(); } diff --git a/app/assets/javascripts/single_file_diff.js b/app/assets/javascripts/single_file_diff.js index ac8603ccd10..42b3d593205 100644 --- a/app/assets/javascripts/single_file_diff.js +++ b/app/assets/javascripts/single_file_diff.js @@ -33,7 +33,7 @@ this.content.after(this.collapsedContent); this.$toggleIcon.addClass('fa-caret-down'); } - clickTarget = $('.file-title, .click-to-expand', this.file).on('click', this.toggleDiff); + clickTarget = $('.file-title, .click-to-expand', this.file).off('click.toggleDiff').on('click.toggleDiff', this.toggleDiff); if (forceLoad) { this.toggleDiff({ target: clickTarget }, cb); } diff --git a/app/assets/javascripts/smart_interval.js.es6 b/app/assets/javascripts/smart_interval.js.es6 index 40f67637c7c..bc5f45ff5c8 100644 --- a/app/assets/javascripts/smart_interval.js.es6 +++ b/app/assets/javascripts/smart_interval.js.es6 @@ -88,8 +88,10 @@ destroy() { this.cancel(); - document.removeEventListener('visibilitychange', this.handleVisibilityChange); - $(document).off('visibilitychange').off('page:before-unload'); + const $document = $(document); + $document.off('visibilitychange.handleVisibilityChange') + .on('visibilitychange.handleVisibilityChange', this.handleVisibilityChange); + $document.off('page:before-unload.cancelSmartInterval'); } /* private */ @@ -112,7 +114,7 @@ initPageUnloadHandling() { // prevent interval continuing after page change, when kept in cache by Turbolinks - $(document).on('page:before-unload', () => this.cancel()); + $(document).off('page:before-unload.cancelSmartInterval').on('page:before-unload.cancelSmartInterval', () => this.cancel()); } handleVisibilityChange(e) { diff --git a/app/assets/javascripts/snippet/snippet_bundle.js b/app/assets/javascripts/snippet/snippet_bundle.js index 18512d179b3..f7cc3b69c36 100644 --- a/app/assets/javascripts/snippet/snippet_bundle.js +++ b/app/assets/javascripts/snippet/snippet_bundle.js @@ -7,7 +7,7 @@ $(function() { var editor = ace.edit("editor") - $(".snippet-form-holder form").on('submit', function() { + $(".snippet-form-holder form").off('submit.setSnippetValue').on('submit.setSnippetValue', function() { $(".snippet-file-content").val(editor.getValue()); }); }); diff --git a/app/assets/javascripts/snippets_list.js.es6 b/app/assets/javascripts/snippets_list.js.es6 index 6f913326a3a..b93564971fd 100644 --- a/app/assets/javascripts/snippets_list.js.es6 +++ b/app/assets/javascripts/snippets_list.js.es6 @@ -6,7 +6,7 @@ gl.SnippetsList = function() { var $holder = $('.snippets-list-holder'); - $holder.find('.pagination').on('ajax:success', (e, data) => { + $holder.find('.pagination').off('ajax:success.snippetPagination').on('ajax:success.snippetPagination', (e, data) => { $holder.replaceWith(data.html); }); } diff --git a/app/assets/javascripts/star.js b/app/assets/javascripts/star.js index f1fc526bf2e..c5cbbbe31b7 100644 --- a/app/assets/javascripts/star.js +++ b/app/assets/javascripts/star.js @@ -4,7 +4,7 @@ (function() { this.Star = (function() { function Star() { - $('.project-home-panel .toggle-star').on('ajax:success', function(e, data, status, xhr) { + $('.project-home-panel .toggle-star').off('ajax:success.toggleStar').on('ajax:success.toggleStar', function(e, data, status, xhr) { var $starIcon, $starSpan, $this, toggleStar; $this = $(this); $starSpan = $this.find('span'); @@ -20,9 +20,10 @@ } }; toggleStar($starSpan.hasClass('starred')); - }).on('ajax:error', function(e, xhr, status, error) { - new Flash('Star toggle failed. Try again later.', 'alert'); - }); + }).off('ajax:error.toggleStar') + .on('ajax:error.toggleStar', function(e, xhr, status, error) { + new Flash('Star toggle failed. Try again later.', 'alert'); + }); } return Star; diff --git a/app/assets/javascripts/templates/issuable_template_selector.js.es6 b/app/assets/javascripts/templates/issuable_template_selector.js.es6 index bdec948fb63..f6e000cc0d1 100644 --- a/app/assets/javascripts/templates/issuable_template_selector.js.es6 +++ b/app/assets/javascripts/templates/issuable_template_selector.js.es6 @@ -18,11 +18,11 @@ if (initialQuery.name) this.requestFile(initialQuery); - $('.reset-template', this.dropdown.parent()).on('click', () => { + $('.reset-template', this.dropdown.parent()).off('click.resetTemplate').on('click.resetTemplate', () => { this.setInputValueToTemplateContent(); }); - $('.no-template', this.dropdown.parent()).on('click', () => { + $('.no-template', this.dropdown.parent()).off('click.removeTemplate').on('click.removeTemplate', () => { this.currentTemplate.content = ''; this.setInputValueToTemplateContent(); $('.dropdown-toggle-text', this.dropdown).text('Choose a template'); diff --git a/app/assets/javascripts/terminal/terminal.js.es6 b/app/assets/javascripts/terminal/terminal.js.es6 index 6b9422b1816..01fbfe4c1c3 100644 --- a/app/assets/javascripts/terminal/terminal.js.es6 +++ b/app/assets/javascripts/terminal/terminal.js.es6 @@ -39,7 +39,7 @@ const decoder = new TextDecoder('utf-8'); const encoder = new TextEncoder('utf-8'); - this.terminal.on('data', (data) => { + this.terminal.off('data.sendEncodedData').on('data.sendEncodedData', (data) => { this.socket.send(encoder.encode(data)); }); diff --git a/app/assets/javascripts/todos.js.es6 b/app/assets/javascripts/todos.js.es6 index d8713600030..4908aed804f 100644 --- a/app/assets/javascripts/todos.js.es6 +++ b/app/assets/javascripts/todos.js.es6 @@ -10,21 +10,20 @@ this.doneClicked = this.doneClicked.bind(this); this.el = el || $('.js-todos-options'); this.perPage = this.el.data('perPage'); - this.clearListeners(); this.initBtnListeners(); this.initFilters(); } clearListeners() { - $('.done-todo').off('click'); - $('.js-todos-mark-all').off('click'); - return $('.todo').off('click'); + $('.done-todo').off('click.doneClicked'); + $('.js-todos-mark-all').off('click.allDoneClicked'); + return $('.todo').off('click.goToTodoUrl'); } initBtnListeners() { - $('.done-todo').on('click', this.doneClicked); - $('.js-todos-mark-all').on('click', this.allDoneClicked); - return $('.todo').on('click', this.goToTodoUrl); + $('.done-todo').off('click.doneClicked').on('click.doneClicked', this.doneClicked); + $('.js-todos-mark-all').off('click.allDoneClicked').on('click.allDoneClicked', this.allDoneClicked); + return $('.todo').off('click.goToTodoUrl').on('click.goToTodoUrl', this.goToTodoUrl); } initFilters() { @@ -33,7 +32,7 @@ this.initFilterDropdown($('.js-type-search'), 'type'); this.initFilterDropdown($('.js-action-search'), 'action_id'); - $('form.filter-form').on('submit', function (event) { + $('form.filter-form').off('submit.submitFilters').on('submit.submitFilters', function (event) { event.preventDefault(); Turbolinks.visit(this.action + '&' + $(this).serialize()); }); diff --git a/app/assets/javascripts/tree.js b/app/assets/javascripts/tree.js index f48a7ee0f55..20a997d3d33 100644 --- a/app/assets/javascripts/tree.js +++ b/app/assets/javascripts/tree.js @@ -6,7 +6,7 @@ this.initKeyNav(); // Code browser tree slider // Make the entire tree-item row clickable, but not if clicking another link (like a commit message) - $(".tree-content-holder .tree-item").on('click', function(e) { + $(".tree-content-holder .tree-item").off('click.openItem').on('click.openItem', function(e) { var $clickedEl, path; $clickedEl = $(e.target); path = $('.tree-item-file-name a', this).attr('href'); diff --git a/app/assets/javascripts/u2f/authenticate.js.es6 b/app/assets/javascripts/u2f/authenticate.js.es6 index 2b992109a8c..cc6e69a0535 100644 --- a/app/assets/javascripts/u2f/authenticate.js.es6 +++ b/app/assets/javascripts/u2f/authenticate.js.es6 @@ -92,7 +92,7 @@ error_message: error.message(), error_code: error.errorCode }); - return this.container.find('#js-u2f-try-again').on('click', this.renderInProgress); + return this.container.find('#js-u2f-try-again').off('click.renderInProgress').on('click.renderInProgress', this.renderInProgress); }; U2FAuthenticate.prototype.renderAuthenticated = function(deviceResponse) { diff --git a/app/assets/javascripts/u2f/register.js b/app/assets/javascripts/u2f/register.js index 050c9bfc02e..9839e5ff3d7 100644 --- a/app/assets/javascripts/u2f/register.js +++ b/app/assets/javascripts/u2f/register.js @@ -66,7 +66,7 @@ U2FRegister.prototype.renderSetup = function() { this.renderTemplate('setup'); - return this.container.find('#js-setup-u2f-device').on('click', this.renderInProgress); + return this.container.find('#js-setup-u2f-device').off('click.renderInProgress').on('click.renderInProgress', this.renderInProgress); }; U2FRegister.prototype.renderInProgress = function() { @@ -79,7 +79,7 @@ error_message: error.message(), error_code: error.errorCode }); - return this.container.find('#js-u2f-try-again').on('click', this.renderSetup); + return this.container.find('#js-u2f-try-again').off('click.renderSetup').on('click.renderSetup', this.renderSetup); }; U2FRegister.prototype.renderRegistered = function(deviceResponse) { diff --git a/app/assets/javascripts/user.js.es6 b/app/assets/javascripts/user.js.es6 index 0a2db7c05fe..e071f3a5b8a 100644 --- a/app/assets/javascripts/user.js.es6 +++ b/app/assets/javascripts/user.js.es6 @@ -24,7 +24,7 @@ } hideProjectLimitMessage() { - $('.hide-project-limit-message').on('click', e => { + $('.hide-project-limit-message').off('click.hideProjectLimitMessage').on('click.hideProjectLimitMessage', e => { e.preventDefault(); Cookies.set('hide_project_limit_message', 'false'); $(this).parents('.project-limit-message').remove(); diff --git a/app/assets/javascripts/username_validator.js.es6 b/app/assets/javascripts/username_validator.js.es6 index 137cefa3b8e..7d5b5d8425b 100644 --- a/app/assets/javascripts/username_validator.js.es6 +++ b/app/assets/javascripts/username_validator.js.es6 @@ -24,7 +24,7 @@ this.validateUsername(username); }, debounceTimeoutDuration); - this.inputElement.on('keyup.username_check', () => { + this.inputElement.off('keyup.username_check').on('keyup.username_check', () => { const username = this.inputElement.val(); this.state.valid = this.inputDomElement.validity.valid; @@ -38,7 +38,7 @@ }); // Override generic field validation - this.inputElement.on('invalid', this.interceptInvalid.bind(this)); + this.inputElement.off('invalid.interceptInvalid').on('invalid.interceptInvalid', this.interceptInvalid.bind(this)); } renderState() { diff --git a/app/assets/javascripts/users/calendar.js b/app/assets/javascripts/users/calendar.js index 578be7c3590..9990fc55f9a 100644 --- a/app/assets/javascripts/users/calendar.js +++ b/app/assets/javascripts/users/calendar.js @@ -133,7 +133,7 @@ return '#ededed'; } }; - })(this)).attr('data-container', 'body').on('click', this.clickDay); + })(this)).attr('data-container', 'body').off('click.renderDays').on('click.renderDays', this.clickDay); }; Calendar.prototype.renderDayTitles = function() { diff --git a/app/assets/javascripts/users_select.js b/app/assets/javascripts/users_select.js index d4b5e03aa35..852d2027a52 100644 --- a/app/assets/javascripts/users_select.js +++ b/app/assets/javascripts/users_select.js @@ -52,7 +52,7 @@ }); }; - $block.on('click', '.js-assign-yourself', function(e) { + $block.off('click.assignYourself').on('click.assignYourself', '.js-assign-yourself', function(e) { e.preventDefault(); if ($dropdown.hasClass('js-issue-board-sidebar')) { diff --git a/app/assets/javascripts/zen_mode.js b/app/assets/javascripts/zen_mode.js index e09b59dd5aa..5d6ad81fc4d 100644 --- a/app/assets/javascripts/zen_mode.js +++ b/app/assets/javascripts/zen_mode.js @@ -1,4 +1,4 @@ -/* eslint-disable func-names, space-before-function-paren, wrap-iife, prefer-arrow-callback, no-unused-vars, consistent-return, camelcase, comma-dangle, padded-blocks, max-len */ +/* eslint-disable func-names, space-before-function-paren, wrap-iife, prefer-arrow-callback, no-unused-vars, consistent-return, camelcase, comma-dangle, padded-blocks, max-len, no-var */ /* global Dropzone */ /* global Mousetrap */ @@ -36,31 +36,34 @@ (function() { this.ZenMode = (function() { function ZenMode() { + var $document = $(document); + this.active_backdrop = null; this.active_textarea = null; - $(document).on('click', '.js-zen-enter', function(e) { + + $document.off('click.zenEnter').on('click.zenEnter', '.js-zen-enter', function(e) { e.preventDefault(); return $(e.currentTarget).trigger('zen_mode:enter'); }); - $(document).on('click', '.js-zen-leave', function(e) { + $document.off('click.zenLeave').on('click.zenLeave', '.js-zen-leave', function(e) { e.preventDefault(); return $(e.currentTarget).trigger('zen_mode:leave'); }); - $(document).on('zen_mode:enter', (function(_this) { + $document.off('zen_mode:enter.zenBackdrop').on('zen_mode:enter.zenBackdrop', (function(_this) { return function(e) { return _this.enter($(e.target).closest('.md-area').find('.zen-backdrop')); }; })(this)); - $(document).on('zen_mode:leave', (function(_this) { + $document.off('zen_mode:leave.exit').on('zen_mode:leave.exit', (function(_this) { return function(e) { return _this.exit(); }; })(this)); - $(document).on('keydown', function(e) { + $document.off('keydown.zenEscape').on('keydown.zenEscape', function(e) { // Esc if (e.keyCode === 27) { e.preventDefault(); - return $(document).trigger('zen_mode:leave'); + return $document.trigger('zen_mode:leave'); } }); } diff --git a/package.json b/package.json index 49b8210e427..2b9ec1ae138 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,12 @@ "eslint-report": "npm run eslint -- --format html --output-file ./eslint-report.html" }, "devDependencies": { - "eslint": "^3.10.1", + "eslint": "^3.12.2", "eslint-config-airbnb-base": "^10.0.1", "eslint-plugin-filenames": "^1.1.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-jasmine": "^2.1.0", + "eslint-plugin-turbolinks-event-handling": "0.0.1", "istanbul": "^0.4.5" } } diff --git a/spec/javascripts/.eslintrc b/spec/javascripts/.eslintrc index dcbcd014dc3..c0147d737ed 100644 --- a/spec/javascripts/.eslintrc +++ b/spec/javascripts/.eslintrc @@ -23,6 +23,9 @@ "plugins": ["jasmine"], "rules": { "prefer-arrow-callback": 0, - "func-names": 0 + "func-names": 0, + "turbolinks-event-handling/jquery-off-before-on": 0, + "turbolinks-event-handling/jquery-use-event-namespaces": 0 + # "turbolinks-event-handling/vanilla-addeventlistener-needs-function-reference": 0 } } |