milestone_select.js.coffee 4.8 KB
Newer Older
P
Phil Hughes 已提交
1
class @MilestoneSelect
J
Jacob Schatz 已提交
2 3 4 5
  constructor: (currentProject) ->
    if currentProject?
      _this = @
      @currentProject = JSON.parse(currentProject)
P
Phil Hughes 已提交
6
    $('.js-milestone-select').each (i, dropdown) ->
P
Phil Hughes 已提交
7 8 9
      $dropdown = $(dropdown)
      projectId = $dropdown.data('project-id')
      milestonesUrl = $dropdown.data('milestones')
10
      issueUpdateURL = $dropdown.data('issueUpdate')
P
Phil Hughes 已提交
11 12 13
      selectedMilestone = $dropdown.data('selected')
      showNo = $dropdown.data('show-no')
      showAny = $dropdown.data('show-any')
14
      showUpcoming = $dropdown.data('show-upcoming')
P
Phil Hughes 已提交
15
      useId = $dropdown.data('use-id')
16
      defaultLabel = $dropdown.data('default-label')
17
      issuableId = $dropdown.data('issuable-id')
18
      abilityName = $dropdown.data('ability-name')
19 20
      $selectbox = $dropdown.closest('.selectbox')
      $block = $selectbox.closest('.block')
J
Jacob Schatz 已提交
21
      $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon')
22
      $value = $block.find('.value')
23
      $loading = $block.find('.block-loading').fadeOut()
P
Phil Hughes 已提交
24

J
Jacob Schatz 已提交
25 26
      if issueUpdateURL
        milestoneLinkTemplate = _.template(
27
          '<a href="/<%- namespace %>/<%- path %>/milestones/<%- iid %>" class="bold has-tooltip" data-container="body" title="<%- remaining %>"><%- title %></a>'
J
Jacob Schatz 已提交
28 29
        )

30
        milestoneLinkNoneTemplate = '<span class="no-value">None</span>'
J
Jacob Schatz 已提交
31

32
        collapsedSidebarLabelTemplate = _.template(
33 34
          '<span class="has-tooltip" data-container="body" title="<%- remaining %>" data-placement="left">
            <%- title %>
35 36 37
          </span>'
        )

P
Phil Hughes 已提交
38
      $dropdown.glDropdown(
P
Phil Hughes 已提交
39
        data: (term, callback) ->
40 41 42
          $.ajax(
            url: milestonesUrl
          ).done (data) ->
43 44 45
            extraOptions = []
            if showAny
              extraOptions.push(
46 47
                id: 0
                name: ''
48 49 50 51 52
                title: 'Any Milestone'
              )

            if showNo
              extraOptions.push(
53 54
                id: -1
                name: 'No Milestone'
55 56 57 58 59
                title: 'No Milestone'
              )

            if showUpcoming
              extraOptions.push(
60 61
                id: -2
                name: '#upcoming'
62 63
                title: 'Upcoming'
              )
64

65
            if extraOptions.length > 2
P
Phil Hughes 已提交
66 67 68
              extraOptions.push 'divider'

            callback(extraOptions.concat(data))
P
Phil Hughes 已提交
69 70
        filterable: true
        search:
P
Phil Hughes 已提交
71
          fields: ['title']
P
Phil Hughes 已提交
72
        selectable: true
73
        toggleLabel: (selected) ->
P
Phil Hughes 已提交
74
          if selected && 'id' of selected
75 76 77
            selected.title
          else
            defaultLabel
P
Phil Hughes 已提交
78
        fieldName: $dropdown.data('field-name')
P
Phil Hughes 已提交
79
        text: (milestone) ->
80
          _.escape(milestone.title)
P
Phil Hughes 已提交
81
        id: (milestone) ->
82
          if !useId
83
            milestone.name
84
          else
85
            milestone.id
P
Phil Hughes 已提交
86
        isSelected: (milestone) ->
87
          milestone.name is selectedMilestone
88 89
        hidden: ->
          $selectbox.hide()
90 91

          # display:block overrides the hide-collapse rule
P
Phil Hughes 已提交
92
          $value.css('display', '')
93
        clicked: (selected) ->
94 95 96 97
          page = $('body').data 'page'
          isIssueIndex = page is 'projects:issues:index'
          isMRIndex = page is page is 'projects:merge_requests:index'

98 99
          if $dropdown.hasClass 'js-filter-bulk-update'
            return
P
Phil Hughes 已提交
100

101
          if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex)
102 103 104 105
            if selected.name?
              selectedMilestone = selected.name
            else
              selectedMilestone = ''
P
Phil Hughes 已提交
106
            Issuable.filterResults $dropdown.closest('form')
107 108
          else if $dropdown.hasClass('js-filter-submit')
            $dropdown.closest('form').submit()
109
          else
110
            selected = $selectbox
111 112
              .find('input[type="hidden"]')
              .val()
113 114
            data = {}
            data[abilityName] = {}
115
            data[abilityName].milestone_id = if selected? then selected else null
116 117
            $loading
              .fadeIn()
J
Jacob Schatz 已提交
118
            $dropdown.trigger('loading.gl.dropdown')
119 120 121
            $.ajax(
              type: 'PUT'
              url: issueUpdateURL
122
              data: data
123
            ).done (data) ->
J
Jacob Schatz 已提交
124
              $dropdown.trigger('loaded.gl.dropdown')
125
              $loading.fadeOut()
126
              $selectbox.hide()
P
Phil Hughes 已提交
127
              $value.css('display', '')
J
Jacob Schatz 已提交
128 129 130
              if data.milestone?
                data.milestone.namespace = _this.currentProject.namespace
                data.milestone.path = _this.currentProject.path
131
                data.milestone.remaining = $.timefor data.milestone.due_date
J
Jacob Schatz 已提交
132
                $value.html(milestoneLinkTemplate(data.milestone))
133
                $sidebarCollapsedValue.find('span').html(collapsedSidebarLabelTemplate(data.milestone))
J
Jacob Schatz 已提交
134 135
              else
                $value.html(milestoneLinkNoneTemplate)
J
Jacob Schatz 已提交
136
                $sidebarCollapsedValue.find('span').text('No')
137
      )