labels_select.js.coffee 8.3 KB
Newer Older
1 2 3
class @LabelsSelect
  constructor: ->
    $('.js-label-select').each (i, dropdown) ->
P
Phil Hughes 已提交
4 5 6
      $dropdown = $(dropdown)
      projectId = $dropdown.data('project-id')
      labelUrl = $dropdown.data('labels')
7
      issueUpdateURL = $dropdown.data('issueUpdate')
P
Phil Hughes 已提交
8
      selectedLabel = $dropdown.data('selected')
9 10
      if selectedLabel?
        selectedLabel = selectedLabel.split(',')
P
Phil Hughes 已提交
11 12
      newLabelField = $('#new_label_name')
      newColorField = $('#new_label_color')
P
Phil Hughes 已提交
13 14
      showNo = $dropdown.data('show-no')
      showAny = $dropdown.data('show-any')
15
      defaultLabel = $dropdown.data('default-label')
16
      abilityName = $dropdown.data('ability-name')
17 18
      $selectbox = $dropdown.closest('.selectbox')
      $block = $selectbox.closest('.block')
19
      $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span')
20 21
      $value = $block.find('.value')
      $loading = $block.find('.block-loading').fadeOut()
P
Phil Hughes 已提交
22

23 24
      issueURLSplit = issueUpdateURL.split('/') if issueUpdateURL?
      if issueUpdateURL
25
        labelHTMLTemplate = _.template(
26
            '<% _.each(labels, function(label){ %>
J
Jacob Schatz 已提交
27
            <a href="<%= ["",issueURLSplit[1], issueURLSplit[2],""].join("/") %>issues?label_name=<%= label.title %>">
28
            <span class="label has-tooltip color-label" title="<%= label.description %>" style="background-color: <%= label.color %>;">
29 30 31 32 33
            <%= label.title %>
            </span>
            </a>
            <% }); %>'
        );
J
Jacob Schatz 已提交
34
        labelNoneHTMLTemplate = _.template('<div class="light">None</div>')
35 36

      if newLabelField.length and $dropdown.hasClass 'js-extra-options'
A
Alfredo Sumaran 已提交
37 38 39 40 41 42
        $newLabelCreateButton = $('.js-new-label-btn')
        $colorPreview = $('.js-dropdown-label-color-preview')
        $newLabelError = $dropdown.parent().find('.js-label-error')
        $newLabelError.hide()

        # Suggested colors in the dropdown to chose from pre-chosen colors
43
        $('.suggest-colors-dropdown a').on "click", (e) ->
P
Phil Hughes 已提交
44 45
          e.preventDefault()
          e.stopPropagation()
46 47 48 49
          newColorField
            .val($(this).data('color'))
            .trigger('change')
          $colorPreview
P
Phil Hughes 已提交
50
            .css 'background-color', $(this).data('color')
51
            .parent()
P
Phil Hughes 已提交
52 53
            .addClass 'is-active'

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
        # Cancel button takes back to first page
        resetForm = ->
          newLabelField
            .val ''
            .trigger 'change'
          newColorField
            .val ''
            .trigger 'change'
          $colorPreview
            .css 'background-color', ''
            .parent()
            .removeClass 'is-active'

        $('.dropdown-menu-back').on 'click', ->
          resetForm()

70 71 72
        $('.js-cancel-label-btn').on 'click', (e) ->
          e.preventDefault()
          e.stopPropagation()
73
          resetForm()
74 75
          $('.dropdown-menu-back', $dropdown.parent()).trigger 'click'

76 77 78
        # Listen for change and keyup events on label and color field
        # This allows us to enable the button when ready
        enableLabelCreateButton = ->
P
Phil Hughes 已提交
79
          if newLabelField.val() isnt '' and newColorField.val() isnt ''
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
            $newLabelError.hide()
            $('.js-new-label-btn').disable()

            # Create new label with API
            Api.newLabel projectId, {
              name: newLabelField.val()
              color: newColorField.val()
            }, (label) ->
              $('.js-new-label-btn').enable()

              if label.message?
                $newLabelError
                  .text label.message
                  .show()
              else
                $('.dropdown-menu-back', $dropdown.parent()).trigger 'click'

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
            $newLabelCreateButton.enable()
          else
            $newLabelCreateButton.disable()

        newLabelField.on 'keyup change', enableLabelCreateButton

        newColorField.on 'keyup change', enableLabelCreateButton

        # Send the API call to create the label
        $newLabelCreateButton
          .disable()
          .on 'click', (e) ->
            e.preventDefault()
            e.stopPropagation()

            if newLabelField.val() isnt '' and newColorField.val() isnt ''
              $newLabelError.hide()
              $('.js-new-label-btn').disable()

              # Create new label with API
              Api.newLabel projectId, {
                name: newLabelField.val()
                color: newColorField.val()
              }, (label) ->
                $('.js-new-label-btn').enable()

                if label.message?
                  $newLabelError
                    .text label.message
                    .show()
                else
                  $('.dropdown-menu-back', $dropdown.parent()).trigger 'click'
129

130 131 132 133 134 135 136 137 138 139 140 141 142
      saveLabelData = ->
        selected = $dropdown
          .closest('.selectbox')
          .find("input[name='#{$dropdown.data('field-name')}']")
          .map(->
            @value
          ).get()
        data = {}
        data[abilityName] = {}
        data[abilityName].label_ids = selected
        if not selected.length
          data[abilityName].label_ids = ['']
        $loading.fadeIn()
J
Jacob Schatz 已提交
143
        $dropdown.trigger('loading.gl.dropdown')
144 145
        $.ajax(
          type: 'PUT'
146
          url: issueUpdateURL
A
Alfredo Sumaran 已提交
147
          dataType: 'JSON'
148 149 150
          data: data
        ).done (data) ->
          $loading.fadeOut()
J
Jacob Schatz 已提交
151
          $dropdown.trigger('loaded.gl.dropdown')
152
          $selectbox.hide()
J
Jacob Schatz 已提交
153
          data.issueURLSplit = issueURLSplit
154 155
          labelCount = 0
          if data.labels.length
156
            template = labelHTMLTemplate(data)
157 158 159 160 161 162 163 164
            labelCount = data.labels.length
          else
            template = labelNoneHTMLTemplate()
          $value
            .removeAttr('style')
            .html(template)
          $sidebarCollapsedValue.text(labelCount)

165 166
          $('.has-tooltip', $value).tooltip(container: 'body')

167 168 169 170 171 172 173 174 175
          $value
            .find('a')
            .each((i) ->
              setTimeout(=>
                glAnimate($(@), 'pulse')
              ,200 * i
              )
            )

176

P
Phil Hughes 已提交
177
      $dropdown.glDropdown(
P
Phil Hughes 已提交
178
        data: (term, callback) ->
179 180 181
          $.ajax(
            url: labelUrl
          ).done (data) ->
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
            if $dropdown.hasClass 'js-extra-options'
              if showNo
                data.unshift(
                  id: 0
                  title: 'No Label'
                )

              if showAny
                data.unshift(
                  isAny: true
                  title: 'Any Label'
                )

              if data.length > 2
                data.splice 2, 0, 'divider'
197
            callback data
198

199
        renderRow: (label) ->
200 201 202 203 204
          selectedClass = ''
          if $selectbox.find("input[type='hidden']\
            [name='#{$dropdown.data('field-name')}']\
            [value='#{label.id}']").length
            selectedClass = 'is-active'
P
Phil Hughes 已提交
205

P
Phil Hughes 已提交
206 207
          color = if label.color? then "<span class='dropdown-label-box' style='background-color: #{label.color}'></span>" else ""

208
          "<li>
209
            <a href='#' class='#{selectedClass}'>
P
Phil Hughes 已提交
210
              #{color}
211
              #{label.title}
212 213 214 215
            </a>
          </li>"
        filterable: true
        search:
216
          fields: ['title']
217
        selectable: true
218

219
        toggleLabel: (selected) ->
220
          if selected and selected.title?
221 222 223
            selected.title
          else
            defaultLabel
P
Phil Hughes 已提交
224
        fieldName: $dropdown.data('field-name')
225
        id: (label) ->
P
Phil Hughes 已提交
226 227
          if label.isAny?
            ''
228
          else if $dropdown.hasClass "js-filter-submit"
229
            label.title
230 231 232 233 234
          else
            label.id

        hidden: ->
          $selectbox.hide()
235 236
          # display:block overrides the hide-collapse rule
          $value.removeAttr('style')
237 238
          if $dropdown.hasClass 'js-multiselect'
            saveLabelData()
239

J
Jacob Schatz 已提交
240
        multiSelect: $dropdown.hasClass 'js-multiselect'
P
Phil Hughes 已提交
241
        clicked: (label) ->
P
Phil Hughes 已提交
242 243 244 245 246
          page = $('body').data 'page'
          isIssueIndex = page is 'projects:issues:index'
          isMRIndex = page is page is 'projects:merge_requests:index'

          if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex)
P
Phil Hughes 已提交
247 248
            selectedLabel = label.title

P
Phil Hughes 已提交
249 250 251
            Issues.filterResults $dropdown.closest('form')
          else if $dropdown.hasClass 'js-filter-submit'
            $dropdown.closest('form').submit()
252
          else
253 254 255 256
            if $dropdown.hasClass 'js-multiselect'
              return
            else
              saveLabelData()
257
      )