diff --git a/app/assets/stylesheets/milestones.scss b/app/assets/stylesheets/milestones.scss
index bc4515665..e4b50487d 100644
--- a/app/assets/stylesheets/milestones.scss
+++ b/app/assets/stylesheets/milestones.scss
@@ -1,4 +1,4 @@
-.tab-milestones ul {
+.tab-milestones .timeline ul {
margin-top: rem-calc(40);
position: relative;
}
diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb
new file mode 100644
index 000000000..62df63624
--- /dev/null
+++ b/app/helpers/milestones_helper.rb
@@ -0,0 +1,9 @@
+module MilestonesHelper
+ def progress_tag_for(progress_bar)
+ content_tag :progress,
+ number_to_percentage(progress_bar.percentage, precision: 0),
+ class: progress_bar.primary? ? "primary" : "",
+ max: ProgressBar::RANGE.max,
+ value: progress_bar.percentage
+ end
+end
diff --git a/app/models/concerns/milestoneable.rb b/app/models/concerns/milestoneable.rb
index 7f58a77bb..66de28d6c 100644
--- a/app/models/concerns/milestoneable.rb
+++ b/app/models/concerns/milestoneable.rb
@@ -7,5 +7,13 @@ module Milestoneable
scope :with_milestones, -> { joins(:milestones).distinct }
has_many :progress_bars, as: :progressable
+
+ def primary_progress_bar
+ progress_bars.primary.first
+ end
+
+ def secondary_progress_bars
+ progress_bars.secondary
+ end
end
end
diff --git a/app/views/milestones/_milestones_content.html.erb b/app/views/milestones/_milestones_content.html.erb
index 3e23f8a35..338eae449 100644
--- a/app/views/milestones/_milestones_content.html.erb
+++ b/app/views/milestones/_milestones_content.html.erb
@@ -5,6 +5,22 @@
<%= t("milestones.index.no_milestones") %>
<% end %>
+
+ <% if milestoneable.primary_progress_bar %>
+ <%= progress_tag_for(milestoneable.primary_progress_bar) %>
+
+ <% if milestoneable.secondary_progress_bars.any? %>
+
+ <% milestoneable.secondary_progress_bars.each do |progress_bar| %>
+ -
+ <%= progress_bar.title %>
+ <%= progress_tag_for(progress_bar) %>
+
+ <% end %>
+
+ <% end %>
+ <% end %>
+
<% milestoneable.milestones.order_by_publication_date.each do |milestone| %>
diff --git a/spec/features/legislation/processes_spec.rb b/spec/features/legislation/processes_spec.rb
index 7d8157f37..d0b65efe9 100644
--- a/spec/features/legislation/processes_spec.rb
+++ b/spec/features/legislation/processes_spec.rb
@@ -376,9 +376,9 @@ feature 'Legislation' do
end
context "Milestones" do
- scenario "Without milestones" do
- process = create(:legislation_process, :upcoming_proposals_phase)
+ let(:process) { create(:legislation_process, :upcoming_proposals_phase) }
+ scenario "Without milestones" do
visit legislation_process_path(process)
within(".legislation-process-list") do
@@ -387,7 +387,6 @@ feature 'Legislation' do
end
scenario "With milestones" do
- process = create(:legislation_process, :upcoming_proposals_phase)
create(:milestone,
milestoneable: process,
description: "Something important happened",
@@ -408,6 +407,39 @@ feature 'Legislation' do
expect(page).to have_content "Something important happened"
end
end
+
+ scenario "With main progress bar" do
+ create(:progress_bar, progressable: process)
+
+ visit milestones_legislation_process_path(process)
+
+ within(".tab-milestones") do
+ expect(page).to have_css "progress"
+ end
+ end
+
+ scenario "With main and secondary progress bar" do
+ create(:progress_bar, progressable: process)
+ create(:progress_bar, :secondary, progressable: process, title: "Build laboratory")
+
+ visit milestones_legislation_process_path(process)
+
+ within(".tab-milestones") do
+ expect(page).to have_css "progress"
+ expect(page).to have_content "Build laboratory"
+ end
+ end
+
+ scenario "No main progress bar" do
+ create(:progress_bar, :secondary, progressable: process, title: "Defeat Evil Lords")
+
+ visit milestones_legislation_process_path(process)
+
+ within(".tab-milestones") do
+ expect(page).not_to have_css "progress"
+ expect(page).not_to have_content "Defeat Evil Lords"
+ end
+ end
end
end
end
diff --git a/spec/shared/features/milestoneable.rb b/spec/shared/features/milestoneable.rb
index a9ad05916..10b2cb578 100644
--- a/spec/shared/features/milestoneable.rb
+++ b/spec/shared/features/milestoneable.rb
@@ -1,4 +1,6 @@
shared_examples "milestoneable" do |factory_name, path_name|
+ it_behaves_like "progressable", factory_name, path_name
+
let!(:milestoneable) { create(factory_name) }
feature "Show milestones" do
diff --git a/spec/shared/features/progressable.rb b/spec/shared/features/progressable.rb
index b28c383c6..5cdc0c750 100644
--- a/spec/shared/features/progressable.rb
+++ b/spec/shared/features/progressable.rb
@@ -1,114 +1,44 @@
shared_examples "progressable" do |factory_name, path_name|
- let!(:progressable) { create(factory_name) }
+ feature "Progress bars", :js do
+ let!(:progressable) { create(factory_name) }
+ let(:path) { send(path_name, *resource_hierarchy_for(progressable)) }
- feature "Manage progress bars" do
- let(:progressable_path) { send(path_name, *resource_hierarchy_for(progressable)) }
+ scenario "With main progress bar" do
+ create(:progress_bar, progressable: progressable)
- let(:path) do
- polymorphic_path([:admin, *resource_hierarchy_for(progressable.progress_bars.new)])
- end
+ visit path
- context "Index" do
- scenario "Link to index path" do
- create(:progress_bar, :secondary, progressable: progressable,
- title: "Reading documents",
- percentage: 20)
+ find("#tab-milestones-label").click
- visit progressable_path
- click_link "Manage progress bars"
-
- expect(page).to have_content "Reading documents"
- end
-
- scenario "No progress bars" do
- visit path
-
- expect(page).to have_content("There are no progress bars")
+ within("#tab-milestones") do
+ expect(page).to have_content "Progress"
end
end
- context "New" do
- scenario "Primary progress bar", :js do
- visit path
- click_link "Create new progress bar"
+ scenario "With main and secondary progress bar" do
+ create(:progress_bar, progressable: progressable)
+ create(:progress_bar, :secondary, progressable: progressable, title: "Build laboratory")
- select "Primary", from: "Type"
+ visit path
- expect(page).not_to have_field "Title"
+ find("#tab-milestones-label").click
- fill_in "Current progress", with: 43
- click_button "Create Progress bar"
-
- expect(page).to have_content "Progress bar created successfully"
- expect(page).to have_content "43%"
- expect(page).to have_content "Primary"
- expect(page).to have_content "Primary progress bar"
- end
-
- scenario "Secondary progress bar", :js do
- visit path
- click_link "Create new progress bar"
-
- select "Secondary", from: "Type"
- fill_in "Current progress", with: 36
- fill_in "Title", with: "Plant trees"
- click_button "Create Progress bar"
-
- expect(page).to have_content "Progress bar created successfully"
- expect(page).to have_content "36%"
- expect(page).to have_content "Secondary"
- expect(page).to have_content "Plant trees"
+ within("#tab-milestones") do
+ expect(page).to have_content "Progress"
+ expect(page).to have_content "Build laboratory"
end
end
- context "Edit" do
- scenario "Primary progress bar", :js do
- bar = create(:progress_bar, progressable: progressable)
+ scenario "No main progress bar" do
+ create(:progress_bar, :secondary, progressable: progressable, title: "Defeat Evil Lords")
- visit path
- within("#progress_bar_#{bar.id}") { click_link "Edit" }
+ visit path
- expect(page).to have_field "Current progress"
- expect(page).not_to have_field "Title"
+ find("#tab-milestones-label").click
- fill_in "Current progress", with: 44
- click_button "Update Progress bar"
-
- expect(page).to have_content "Progress bar updated successfully"
-
- within("#progress_bar_#{bar.id}") do
- expect(page).to have_content "44%"
- end
- end
-
- scenario "Secondary progress bar", :js do
- bar = create(:progress_bar, :secondary, progressable: progressable)
-
- visit path
- within("#progress_bar_#{bar.id}") { click_link "Edit" }
-
- fill_in "Current progress", with: 76
- fill_in "Title", with: "Updated title"
- click_button "Update Progress bar"
-
- expect(page).to have_content "Progress bar updated successfully"
-
- within("#progress_bar_#{bar.id}") do
- expect(page).to have_content "76%"
- expect(page).to have_content "Updated title"
- end
- end
- end
-
- context "Delete" do
- scenario "Remove progress bar" do
- bar = create(:progress_bar, progressable: progressable, percentage: 34)
-
- visit path
- within("#progress_bar_#{bar.id}") { click_link "Delete" }
-
- expect(page).to have_content "Progress bar deleted successfully"
- expect(page).not_to have_content "34%"
+ within("#tab-milestones") do
+ expect(page).not_to have_content "Progress"
+ expect(page).not_to have_content "Defeat Evil Lords"
end
end
end