Module: TimeboxesHelper

Includes:
EntityDateHelper, Gitlab::Utils::StrongMemoize
Defined in:
app/helpers/timeboxes_helper.rb

Instance Method Summary collapse

Methods included from Gitlab::Utils::StrongMemoize

#clear_memoization, #strong_memoize, #strong_memoized?

Methods included from EntityDateHelper

#distance_of_time_as_hash, #interval_in_words, #remaining_days_in_words

Instance Method Details

#can_admin_group_milestones?Boolean

Returns:

  • (Boolean)

274
275
276
277
278
# File 'app/helpers/timeboxes_helper.rb', line 274

def can_admin_group_milestones?
  strong_memoize(:can_admin_group_milestones) do
    can?(current_user, :admin_milestone, @project.group)
  end
end

#can_admin_project_milestones?Boolean

Returns:

  • (Boolean)

268
269
270
271
272
# File 'app/helpers/timeboxes_helper.rb', line 268

def can_admin_project_milestones?
  strong_memoize(:can_admin_project_milestones) do
    can?(current_user, :admin_milestone, @project)
  end
end

#display_issues_count_warning?(milestone) ⇒ Boolean

Returns:

  • (Boolean)

280
281
282
# File 'app/helpers/timeboxes_helper.rb', line 280

def display_issues_count_warning?(milestone)
  milestone_visible_issues_count(milestone) > Milestone::DISPLAY_ISSUES_LIMIT
end

#edit_milestone_path(milestone) ⇒ Object


260
261
262
263
264
265
266
# File 'app/helpers/timeboxes_helper.rb', line 260

def edit_milestone_path(milestone)
  if milestone.group_milestone?
    edit_group_milestone_path(milestone.group, milestone)
  elsif milestone.project_milestone?
    edit_project_milestone_path(milestone.project, milestone)
  end
end

#group_milestone_route(milestone, params = {}) ⇒ Object


243
244
245
246
247
# File 'app/helpers/timeboxes_helper.rb', line 243

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

  group_milestone_path(milestone.group, milestone.iid, milestone: params)
end

#group_or_project_milestone_path(milestone) ⇒ Object


249
250
251
252
253
254
255
256
257
258
# File 'app/helpers/timeboxes_helper.rb', line 249

def group_or_project_milestone_path(milestone)
  params =
    if milestone.group_milestone?
      { milestone: { title: milestone.title } }
    else
      { title: milestone.title }
    end

  milestone_path(milestone.milestone, params)
end

#milestone_class_for_state(param, check, match_blank_param = false) ⇒ Object

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


84
85
86
87
88
89
90
91
92
# File 'app/helpers/timeboxes_helper.rb', line 84

def milestone_class_for_state(param, check, match_blank_param = false)
  if match_blank_param
    'active' if param.blank? || param == check
  elsif param == check
    'active'
  else
    check
  end
end

#milestone_counts(milestones) ⇒ Object

Returns count of milestones for different states Uses explicit hash keys as the 'opened' state URL params differs from the db value and we need to add the total rubocop: disable CodeReuse/ActiveRecord


70
71
72
73
74
75
76
77
78
# File 'app/helpers/timeboxes_helper.rb', line 70

def milestone_counts(milestones)
  counts = milestones.reorder(nil).group(:state).count

  {
    opened: counts['active'] || 0,
    closed: counts['closed'] || 0,
    all: counts.values.sum || 0
  }
end

#milestone_issues_by_label_count(milestone, label, state:) ⇒ Object


51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'app/helpers/timeboxes_helper.rb', line 51

def milestone_issues_by_label_count(milestone, label, state:)
  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}`") % { state: state }
    end

  issues.size
end

#milestone_issues_count_message(milestone) ⇒ Object


284
285
286
287
288
289
290
291
292
293
# File 'app/helpers/timeboxes_helper.rb', line 284

def milestone_issues_count_message(milestone)
  total_count = milestone_visible_issues_count(milestone)
  limit = Milestone::DISPLAY_ISSUES_LIMIT
  link_options = { milestone_title: @milestone.title }

  message = _('Showing %{limit} of %{total_count} issues. ') % { limit: limit, total_count: total_count }
  message += link_to(_('View all issues'), milestones_issues_path(link_options))

  message.html_safe
end

#milestone_issues_tooltip_text(milestone) ⇒ Object


153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'app/helpers/timeboxes_helper.rb', line 153

def milestone_issues_tooltip_text(milestone)
  total = milestone.total_issues_count
  opened = milestone.opened_issues_count
  closed = milestone.closed_issues_count

  return _("Issues") if total == 0

  content = []

  if opened > 0
    content << n_("1 open issue", "%{issues} open issues", opened) % { issues: opened }
  end

  if closed > 0
    content << n_("1 closed issue", "%{issues} closed issues", closed) % { issues: closed }
  end

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

#milestone_merge_requests_tooltip_text(milestone) ⇒ Object


173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'app/helpers/timeboxes_helper.rb', line 173

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", "%{merge_requests} open merge requests", merge_requests.opened.count) % { merge_requests: merge_requests.opened.count } if merge_requests.opened.any?
  content << n_("1 closed merge request", "%{merge_requests} closed merge requests", merge_requests.closed.count) % { merge_requests: merge_requests.closed.count } if merge_requests.closed.any?
  content << n_("1 merged merge request", "%{merge_requests} merged merge requests", merge_requests.merged.count) % { merge_requests: merge_requests.merged.count } if merge_requests.merged.any?

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

#milestone_progress_bar(milestone) ⇒ Object


107
108
109
110
111
112
113
114
115
116
# File 'app/helpers/timeboxes_helper.rb', line 107

def milestone_progress_bar(milestone)
  options = {
    class: 'progress-bar bg-success',
    style: "width: #{milestone.percent_complete}%;"
  }

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

#milestone_progress_tooltip_text(milestone) ⇒ Object


94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/helpers/timeboxes_helper.rb', line 94

def milestone_progress_tooltip_text(milestone)
  has_issues = milestone.total_issues_count > 0

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

#milestone_releases_tooltip_text(milestone) ⇒ Object


187
188
189
190
191
192
193
# File 'app/helpers/timeboxes_helper.rb', line 187

def milestone_releases_tooltip_text(milestone)
  count = milestone.releases.count

  return _("Releases") if count == 0

  n_("%{releases} release", "%{releases} releases", count) % { releases: count }
end

#milestone_status_string(milestone) ⇒ Object


7
8
9
10
11
12
13
14
15
16
17
# File 'app/helpers/timeboxes_helper.rb', line 7

def milestone_status_string(milestone)
  if milestone.closed?
    _('Closed')
  elsif milestone.expired?
    _('Past due')
  elsif milestone.upcoming?
    _('Upcoming')
  else
    _('Open')
  end
end

#milestone_tab_path(milestone, tab) ⇒ Object


231
232
233
# File 'app/helpers/timeboxes_helper.rb', line 231

def milestone_tab_path(milestone, tab)
  url_for(action: tab, format: :json)
end

#milestone_time_for(date, date_type) ⇒ Object


129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'app/helpers/timeboxes_helper.rb', line 129

def milestone_time_for(date, date_type)
  title = date_type == :start ? "Start date" : "End date"

  if date
    time_ago = time_ago_in_words(date).sub("about ", "")
    state = if date.past?
              "ago"
            else
              "remaining"
            end

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

    content.html_safe
  else
    title
  end
end

#milestone_tooltip_due_date(milestone) ⇒ Object


204
205
206
207
208
209
210
# File 'app/helpers/timeboxes_helper.rb', line 204

def milestone_tooltip_due_date(milestone)
  if milestone.due_date
    "#{milestone.due_date.to_s(:medium)} (#{remaining_days_in_words(milestone.due_date, milestone.start_date)})"
  else
    _('Milestone')
  end
end

#milestones_browse_issuables_path(milestone, state: nil, type:) ⇒ Object


39
40
41
42
43
44
45
46
47
48
49
# File 'app/helpers/timeboxes_helper.rb', line 39

def milestones_browse_issuables_path(milestone, state: nil, type:)
  opts = { milestone_title: milestone.title, state: state }

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

#milestones_filter_dropdown_pathObject


118
119
120
121
122
123
124
125
126
127
# File 'app/helpers/timeboxes_helper.rb', line 118

def milestones_filter_dropdown_path
  project = @target_project || @project
  if project
    project_milestones_path(project, :json)
  elsif @group
    group_milestones_path(@group, :json)
  else
    dashboard_milestones_path(:json)
  end
end

#milestones_filter_path(opts = {}) ⇒ Object


19
20
21
22
23
24
25
26
27
# File 'app/helpers/timeboxes_helper.rb', line 19

def milestones_filter_path(opts = {})
  if @project
    project_milestones_path(@project, opts)
  elsif @group
    group_milestones_path(@group, opts)
  else
    dashboard_milestones_path(opts)
  end
end

#milestones_issues_path(opts = {}) ⇒ Object


29
30
31
32
33
34
35
36
37
# File 'app/helpers/timeboxes_helper.rb', line 29

def milestones_issues_path(opts = {})
  if @project
    project_issues_path(@project, opts)
  elsif @group
    issues_group_path(@group, opts)
  else
    issues_dashboard_path(opts)
  end
end

#recent_releases_with_counts(milestone) ⇒ Object


195
196
197
198
199
200
201
202
# File 'app/helpers/timeboxes_helper.rb', line 195

def recent_releases_with_counts(milestone)
  total_count = milestone.releases.size
  return [[], 0, 0] if total_count == 0

  recent_releases = milestone.releases.recent.to_a
  more_count = total_count - recent_releases.size
  [recent_releases, total_count, more_count]
end

#timebox_date_range(timebox) ⇒ Object Also known as: milestone_date_range


212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'app/helpers/timeboxes_helper.rb', line 212

def timebox_date_range(timebox)
  if timebox.start_date && timebox.due_date
    "#{timebox.start_date.to_s(:medium)}#{timebox.due_date.to_s(:medium)}"
  elsif timebox.due_date
    if timebox.due_date.past?
      _("expired on %{timebox_due_date}") % { timebox_due_date: timebox.due_date.to_s(:medium) }
    else
      _("expires on %{timebox_due_date}") % { timebox_due_date: timebox.due_date.to_s(:medium) }
    end
  elsif timebox.start_date
    if timebox.start_date.past?
      _("started on %{timebox_start_date}") % { timebox_start_date: timebox.start_date.to_s(:medium) }
    else
      _("starts on %{timebox_start_date}") % { timebox_start_date: timebox.start_date.to_s(:medium) }
    end
  end
end

#update_milestone_path(milestone, params = {}) ⇒ Object


235
236
237
238
239
240
241
# File 'app/helpers/timeboxes_helper.rb', line 235

def update_milestone_path(milestone, params = {})
  if milestone.project_milestone?
    project_milestone_path(milestone.project, milestone, milestone: params)
  else
    group_milestone_route(milestone, params)
  end
end