Commit 190e483fb4b5edb6d8dfa71b67dc52da402ddab9

Authored by Dmitriy Zaporozhets
1 parent b01f8b63

Rework of milestones

app/assets/stylesheets/common.scss
... ... @@ -531,9 +531,14 @@ pre {
531 531 }
532 532 }
533 533  
534   -.milestone .progress {
535   - margin-bottom: 0;
536   - margin-top: 4px;
  534 +.milestone {
  535 + &.milestone-closed {
  536 + background: #eee;
  537 + }
  538 + .progress {
  539 + margin-bottom: 0;
  540 + margin-top: 4px;
  541 + }
537 542 }
538 543  
539 544 .float-link {
... ...
app/controllers/milestones_controller.rb
... ... @@ -12,11 +12,12 @@ class MilestonesController < ProjectResourceController
12 12  
13 13 def index
14 14 @milestones = case params[:f]
15   - when 'all'; @project.milestones
16   - else @project.milestones.active
  15 + when 'all'; @project.milestones.order("closed, due_date DESC")
  16 + when 'closed'; @project.milestones.closed.order("due_date DESC")
  17 + else @project.milestones.active.order("due_date ASC")
17 18 end
18 19  
19   - @milestones = @milestones.includes(:project).order("due_date")
  20 + @milestones = @milestones.includes(:project)
20 21 @milestones = @milestones.page(params[:page]).per(20)
21 22 end
22 23  
... ...
app/models/milestone.rb
... ... @@ -19,12 +19,19 @@ class Milestone < ActiveRecord::Base
19 19 has_many :issues
20 20 has_many :merge_requests
21 21  
  22 + scope :active, where(closed: false)
  23 + scope :closed, where(closed: true)
  24 +
22 25 validates :title, presence: true
23 26 validates :project, presence: true
24 27 validates :closed, inclusion: { in: [true, false] }
25 28  
26   - def self.active
27   - where("due_date > ? OR due_date IS NULL", Date.today)
  29 + def expired?
  30 + if due_date
  31 + due_date < Date.today
  32 + else
  33 + false
  34 + end
28 35 end
29 36  
30 37 def participants
... ... @@ -52,4 +59,12 @@ class Milestone &lt; ActiveRecord::Base
52 59 def expires_at
53 60 "expires at #{due_date.stamp("Aug 21, 2011")}" if due_date
54 61 end
  62 +
  63 + def can_be_closed?
  64 + issues.count > 0 && open? && issues.opened.count.zero?
  65 + end
  66 +
  67 + def open?
  68 + !closed
  69 + end
55 70 end
... ...
app/models/snippet.rb
... ... @@ -22,7 +22,7 @@ class Snippet &lt; ActiveRecord::Base
22 22 belongs_to :author, class_name: "User"
23 23 has_many :notes, as: :noteable, dependent: :destroy
24 24  
25   - delegate :name, :email, to: :author, prefix: true
  25 + delegate :name, :email, to: :author, prefix: true, allow_nil: true
26 26  
27 27 validates :author, presence: true
28 28 validates :project, presence: true
... ...
app/views/issues/_show.html.haml
... ... @@ -28,7 +28,7 @@
28 28 %p= link_to_gfm truncate(issue.title, length: 100), project_issue_path(issue.project, issue), class: "row_title"
29 29  
30 30 %span.update-author
31   - %small.cdark= "##{issue.id}"
  31 + %span.cdark= "##{issue.id}"
32 32 - if issue.assignee
33 33 assigned to #{issue.assignee_name}
34 34 - else
... ...
app/views/milestones/_milestone.html.haml
1   -%li{class: "milestone", id: dom_id(milestone) }
  1 +%li{class: "milestone milestone-#{milestone.closed ? 'closed' : 'open'}", id: dom_id(milestone) }
2 2 .right
3   - - if can? current_user, :admin_milestone, milestone.project
  3 + - if can?(current_user, :admin_milestone, milestone.project) and milestone.open?
4 4 = link_to edit_project_milestone_path(milestone.project, milestone), class: "btn small edit-milestone-link grouped" do
5 5 %i.icon-edit
6 6 Edit
7 7 %h4
8 8 = link_to_gfm truncate(milestone.title, length: 100), project_milestone_path(milestone.project, milestone)
  9 + - if milestone.expired? and not milestone.closed
  10 + %span.cred (Expired)
9 11 %small
10 12 = milestone.expires_at
11 13 .row
... ...
app/views/milestones/index.html.haml
... ... @@ -11,6 +11,9 @@
11 11 %li{class: ("active" if (params[:f] == "active" || !params[:f]))}
12 12 = link_to project_milestones_path(@project, f: "active") do
13 13 Active
  14 + %li{class: ("active" if params[:f] == "closed")}
  15 + = link_to project_milestones_path(@project, f: "closed") do
  16 + Closed
14 17 %li{class: ("active" if params[:f] == "all")}
15 18 = link_to project_milestones_path(@project, f: "all") do
16 19 All
... ... @@ -19,7 +22,7 @@
19 22 = render @milestones
20 23  
21 24 - if @milestones.present?
22   - %li.bottom= paginate @milestones, remote: true, theme: "gitlab"
  25 + %li.bottom= paginate @milestones, theme: "gitlab"
23 26 - else
24 27 %li
25 28 %h3.nothing_here_message Nothing to show here
... ...
app/views/milestones/show.html.haml
1   -%h3.page_title
2   - Milestone ##{@milestone.id}
3   - %small
4   - = @milestone.expires_at
  1 +.row
  2 + .span6
  3 + %h3.page_title
  4 + Milestone ##{@milestone.id}
  5 + %small
  6 + = @milestone.expires_at
  7 + .back_link
  8 + = link_to project_milestones_path(@project) do
  9 + &larr; To milestones list
  10 + .span6
  11 + .right
  12 + - unless @milestone.closed
  13 + = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn small grouped", title: "New Issue" do
  14 + %i.icon-plus
  15 + New Issue
  16 + = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link small grouped"
  17 + - if can?(current_user, :admin_milestone, @project)
  18 + = link_to edit_project_milestone_path(@project, @milestone), class: "btn small grouped" do
  19 + %i.icon-edit
  20 + Edit
5 21  
6   - %span.right
7   - = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn small grouped", title: "New Issue" do
8   - %i.icon-plus
9   - New Issue
10   - = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link small grouped"
11   - - if can?(current_user, :admin_milestone, @project)
12   - = link_to edit_project_milestone_path(@project, @milestone), class: "btn small grouped" do
13   - %i.icon-edit
14   - Edit
15 22  
16   -.back_link
17   - = link_to project_milestones_path(@project) do
18   - &larr; To milestones list
  23 +
  24 +- if @milestone.can_be_closed?
  25 + %hr
  26 + %p
  27 + %span All issues for this milestone are closed. You may close milestone now.
  28 + = link_to 'Close Milestone', project_milestone_path(@project, @milestone, milestone: {closed: true }), method: :put, class: "btn small danger"
19 29  
20 30 .main_box
21 31 .top_box_content
22   - %h5
  32 + %h4.box-title
23 33 - if @milestone.closed
24   - .alert-message.error.status_info Closed
25   - - else
26   - .alert-message.success.status_info Open
  34 + .error.status_info Closed
  35 + - elsif @milestone.expired?
  36 + .error.status_info Expired
  37 +
27 38 = gfm escape_once(@milestone.title)
28   - %small.right= @milestone.expires_at
29 39  
30 40 .middle_box_content
31 41 %h5
... ... @@ -34,6 +44,7 @@
34 44 #{@milestone.closed_items_count} closed
35 45 &ndash;
36 46 #{@milestone.open_items_count} open
  47 + %span.right= @milestone.expires_at
37 48 .progress.progress-info
38 49 .bar{style: "width: #{@milestone.percent_complete}%;"}
39 50  
... ... @@ -43,6 +54,7 @@
43 54 = preserve do
44 55 = markdown @milestone.description
45 56  
  57 +
46 58 .row
47 59 .span6
48 60 %table.milestone-issue-filter
... ...