milestones_helper.rb 7.0 KB
Newer Older
1
module MilestonesHelper
2 3
  include EntityDateHelper

4 5
  def milestones_filter_path(opts = {})
    if @project
6
      project_milestones_path(@project, opts)
7 8
    elsif @group
      group_milestones_path(@group, opts)
D
Douwe Maan 已提交
9 10
    else
      dashboard_milestones_path(opts)
11 12
    end
  end
13

R
Rubén Dávila 已提交
14 15
  def milestones_label_path(opts = {})
    if @project
16
      project_issues_path(@project, opts)
R
Rubén Dávila 已提交
17 18 19 20 21 22 23
    elsif @group
      issues_group_path(@group, opts)
    else
      issues_dashboard_path(opts)
    end
  end

24 25
  def milestones_browse_issuables_path(milestone, state: nil, type:)
    opts = { milestone_title: milestone.title, state: state }
R
Rubén Dávila 已提交
26 27 28 29 30 31 32 33 34 35 36

    if @project
      polymorphic_path([@project.namespace.becomes(Namespace), @project, type], opts)
    elsif @group
      polymorphic_url([type, @group], opts)
    else
      polymorphic_url([type, :dashboard], opts)
    end
  end

  def milestone_issues_by_label_count(milestone, label, state:)
37 38 39 40 41 42 43 44 45 46 47 48
    issues = milestone.issues.with_label(label.title)
    issues =
      case state
      when :opened
        issues.opened
      when :closed
        issues.closed
      else
        raise ArgumentError, "invalid milestone state `#{state}`"
      end

    issues.size
R
Rubén Dávila 已提交
49 50
  end

51
  # Returns count of milestones for different states
52
  # Uses explicit hash keys as the 'opened' state URL params differs from the db value
53
  # and we need to add the total
54 55
  def milestone_counts(milestones)
    counts = milestones.reorder(nil).group(:state).count
56

57
    {
58 59 60
      opened: counts['active'] || 0,
      closed: counts['closed'] || 0,
      all: counts.values.sum || 0
61
    }
62 63
  end

64 65 66
  # Show 'active' class if provided GET param matches check
  # `or_blank` allows the function to return 'active' when given an empty param
  # Could be refactored to be simpler but that may make it harder to read
67
  def milestone_class_for_state(param, check, match_blank_param = false)
68 69
    if match_blank_param
      'active' if param.blank? || param == check
F
Felipe Artur 已提交
70 71
    elsif param == check
      'active'
72
    else
F
Felipe Artur 已提交
73
      check
74 75 76
    end
  end

77 78 79 80 81 82 83 84 85 86 87 88 89
  def milestone_progress_tooltip_text(milestone)
    has_issues = milestone.total_issues_count(current_user) > 0

    if has_issues
      [
        _('Progress'),
        _("%{percent}%% complete") % { percent: milestone.percent_complete(current_user) }
      ].join('<br />')
    else
      _('Progress')
    end
  end

90 91
  def milestone_progress_bar(milestone)
    options = {
92
      class: 'progress-bar bg-success',
93
      style: "width: #{milestone.percent_complete(current_user)}%;"
94 95 96 97 98 99
    }

    content_tag :div, class: 'progress' do
      content_tag :div, nil, options
    end
  end
100

P
Phil Hughes 已提交
101
  def milestones_filter_dropdown_path
102
    project = @target_project || @project
103
    if project
104
      project_milestones_path(project, :json)
105 106
    elsif @group
      group_milestones_path(@group, :json)
P
Phil Hughes 已提交
107
    else
108
      dashboard_milestones_path(:json)
P
Phil Hughes 已提交
109
    end
110
  end
111

112
  def milestone_tooltip_title(milestone)
113 114
    if milestone
      "#{milestone.title}<br />#{milestone_tooltip_due_date(milestone)}"
115 116 117
    end
  end

118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
  def milestone_time_for(date, date_type)
    title = date_type == :start ? "Start date" : "End date"

    if date
      time_ago = time_ago_in_words(date)
      time_ago.slice!("about ")

      time_ago << if date.past?
                    " ago"
                  else
                    " remaining"
                  end

      content = [
        title,
        "<br />",
        date.to_s(:medium),
        "(#{time_ago})"
      ].join(" ")

138
      content.html_safe
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
    else
      title
    end
  end

  def milestone_issues_tooltip_text(milestone)
    issues = milestone.count_issues_by_state(current_user)

    return _("Issues") if issues.empty?

    content = []

    content << n_("1 open issue", "%d open issues", issues["opened"]) % issues["opened"] if issues["opened"]
    content << n_("1 closed issue", "%d closed issues", issues["closed"]) % issues["closed"] if issues["closed"]

    content.join('<br />').html_safe
  end

  def milestone_merge_requests_tooltip_text(milestone)
    merge_requests = milestone.merge_requests

    return _("Merge requests") if merge_requests.empty?

    content = []

    content << n_("1 open merge request", "%d open merge requests", merge_requests.opened.count) % merge_requests.opened.count if merge_requests.opened.any?
    content << n_("1 closed merge request", "%d closed merge requests", merge_requests.closed.count) % merge_requests.closed.count if merge_requests.closed.any?
    content << n_("1 merged merge request", "%d merged merge requests", merge_requests.merged.count) % merge_requests.merged.count if merge_requests.merged.any?

    content.join('<br />').html_safe
  end

  def milestone_tooltip_due_date(milestone)
    if milestone.due_date
      "#{milestone.due_date.to_s(:medium)} (#{remaining_days_in_words(milestone)})"
174 175
    else
      _('Milestone')
V
Valery Sizov 已提交
176 177 178 179 180
    end
  end

  def milestone_date_range(milestone)
    if milestone.start_date && milestone.due_date
181
      "#{milestone.start_date.to_s(:medium)}#{milestone.due_date.to_s(:medium)}"
V
Valery Sizov 已提交
182 183 184 185 186 187 188 189 190 191 192 193
    elsif milestone.due_date
      if milestone.due_date.past?
        "expired on #{milestone.due_date.to_s(:medium)}"
      else
        "expires on #{milestone.due_date.to_s(:medium)}"
      end
    elsif milestone.start_date
      if milestone.start_date.past?
        "started on #{milestone.start_date.to_s(:medium)}"
      else
        "starts on #{milestone.start_date.to_s(:medium)}"
      end
194 195
    end
  end
P
Phil Hughes 已提交
196

P
Phil Hughes 已提交
197
  def milestone_merge_request_tab_path(milestone)
P
Phil Hughes 已提交
198
    if @project
199
      merge_requests_project_milestone_path(@project, milestone, format: :json)
P
Phil Hughes 已提交
200 201
    elsif @group
      merge_requests_group_milestone_path(@group, milestone.safe_title, title: milestone.title, format: :json)
202 203
    else
      merge_requests_dashboard_milestone_path(milestone, title: milestone.title, format: :json)
P
Phil Hughes 已提交
204 205 206
    end
  end

P
Phil Hughes 已提交
207
  def milestone_participants_tab_path(milestone)
P
Phil Hughes 已提交
208
    if @project
209
      participants_project_milestone_path(@project, milestone, format: :json)
P
Phil Hughes 已提交
210 211
    elsif @group
      participants_group_milestone_path(@group, milestone.safe_title, title: milestone.title, format: :json)
212 213
    else
      participants_dashboard_milestone_path(milestone, title: milestone.title, format: :json)
P
Phil Hughes 已提交
214 215 216
    end
  end

P
Phil Hughes 已提交
217
  def milestone_labels_tab_path(milestone)
P
Phil Hughes 已提交
218
    if @project
219
      labels_project_milestone_path(@project, milestone, format: :json)
P
Phil Hughes 已提交
220 221
    elsif @group
      labels_group_milestone_path(@group, milestone.safe_title, title: milestone.title, format: :json)
222 223
    else
      labels_dashboard_milestone_path(milestone, title: milestone.title, format: :json)
P
Phil Hughes 已提交
224 225
    end
  end
F
Felipe Artur 已提交
226 227 228 229

  def group_milestone_route(milestone, params = {})
    params = nil if params.empty?

230
    if milestone.legacy_group_milestone?
F
Felipe Artur 已提交
231 232 233 234 235
      group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: params)
    else
      group_milestone_path(@group, milestone.iid, milestone: params)
    end
  end
236 237 238 239 240 241 242 243

  def group_or_dashboard_milestone_path(milestone)
    if milestone.group_milestone?
      group_milestone_path(milestone.group, milestone.iid, milestone: { title: milestone.title })
    else
      dashboard_milestone_path(milestone.safe_title, title: milestone.title)
    end
  end
244
end