diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index 555198cf3da048f136cdd419e313bf716667d0d2..6b8ceb6385a32787da808f1fac8202fa2ee85161 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -486,7 +486,7 @@ class GitLabDropdown # Toggle the dropdown label if @options.toggleLabel - @updateLabel(selectedObject, el, @, false) + @updateLabel(selectedObject, el, @) else selectedObject else if el.hasClass(INDETERMINATE_CLASS) @@ -513,9 +513,6 @@ class GitLabDropdown # Toggle active class for the tick mark el.addClass ACTIVE_CLASS - # Toggle the dropdown label - if @options.toggleLabel - @updateLabel(selectedObject, el, @, true) if value? if !field.length and fieldName @addInput(fieldName, value) @@ -524,6 +521,10 @@ class GitLabDropdown .val value .trigger 'change' + # Toggle the dropdown label + if @options.toggleLabel + @updateLabel(selectedObject, el, @) + return selectedObject addInput: (fieldName, value)-> @@ -616,15 +617,12 @@ class GitLabDropdown # Scroll the dropdown content up $dropdownContent.scrollTop(listItemTop - dropdownContentTop) - updateLabel: (selected = null, el = null, instance = null, added = false) => - $toggleText = $(@el).find(".dropdown-toggle-text") - $toggleText.text @options.toggleLabel(selected, el, instance, added) + updateLabel: (selected = null, el = null, instance = null) => + $toggleText = @getElement '.dropdown-toggle-text' + $toggleText.text @options.toggleLabel(selected, el, instance) if @options.defaultLabel - if $toggleText.text().trim() is @options.defaultLabel - $toggleText.addClass('is-default') - else - $toggleText.removeClass('is-default') + $toggleText.toggleClass('is-default', $toggleText.text().trim() is @options.defaultLabel) $.fn.glDropdown = (opts) -> return @.each -> diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index ce630dcacb31e894f08a74e0f298a501ba8e5549..d37d17e086daca20f86121e95553dcb9a4e00d08 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -278,23 +278,61 @@ class @LabelsSelect fields: ['title'] selectable: true filterable: true - toggleLabel: (selected, el, e, added) -> - if added - selectedLabels.push selected.title + toggleLabel: (selected, $el, glDropdownInstance) -> + # When comes from a triggered event handle it VERY differently + if selected instanceof jQuery.Event + $dropdownParent = $dropdown.closest '.labels-filter' + $labelInputs = $dropdownParent.find "input[name='#{@fieldName}']" + numberSelectedLabels = $labelInputs.length + firstLabel = _.pluck($labelInputs, 'value')[0] + + if numberSelectedLabels is 1 + firstLabel + else if numberSelectedLabels > 1 + "#{firstLabel} +#{numberSelectedLabels - 1} more" + else + defaultLabel + # when clicking on a dropdown option else - index = selectedLabels.indexOf selected.title - selectedLabels.splice index, 1 + # Return when clicking "No Label" + return if selected.id is 0 + return 'Any Label' if selected.isAny is true - if selected.id? and selected.id is 0 - selectedLabels = [] + if glDropdownInstance? + $dropdownParent = glDropdownInstance.dropdown.closest '.issuable-form-select-holder, .labels-filter' + else + $dropdownParent = $() - if selectedLabels.length > 1 - "#{selectedLabels[0]} +#{selectedLabels.length - 1} more" - else if selectedLabels.length is 1 - selectedLabels[0] - else - console.log selectedLabels.length, defaultLabel - defaultLabel + $labelInputs = $dropdownParent.find "input[name='#{@fieldName}']" + + # Find the label by its attribute according the dropdown settings + if $dropdown.hasClass 'js-issuable-form-dropdown' + # When settings labels to a issuable we find the label for its ID + whereQuery = { id: parseInt $labelInputs.first().val() } + else + # When filtering issuables we find the label for its title + whereQuery = { title: $labelInputs.first().val() } + + firstLabel = _.findWhere glDropdownInstance.fullData, whereQuery + + # Better rely on inputs since filtering may returns invalid number of active labels + numberSelectedLabels = $labelInputs.length + + # If we are adding a label + if $el.is '.is-active' + if numberSelectedLabels is 1 + selected.title + else + "#{selected.title} +#{numberSelectedLabels - 1} more" + + # otherwise we are removing a label + else + if numberSelectedLabels is 1 + firstLabel.title + else if numberSelectedLabels > 1 + "#{firstLabel.title} +#{numberSelectedLabels - 1} more" + else + defaultLabel defaultLabel: defaultLabel fieldName: $dropdown.data('field-name') id: (label) ->