Merge pull request #4397 from consul/unify_budgets

Unify budget landing pages
This commit is contained in:
Javi Martín
2021-03-19 18:17:51 +01:00
committed by GitHub
28 changed files with 325 additions and 491 deletions

View File

@@ -0,0 +1,67 @@
.groups-and-headings {
$spacing: $line-height / 2;
.headings-list {
display: flex;
flex-wrap: wrap;
list-style: none;
margin-left: -$spacing;
}
.heading {
border: 2px solid $border;
border-radius: rem-calc(6);
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
margin-bottom: $line-height / 2;
margin-left: $spacing;
margin-top: $line-height / 4;
padding: $line-height / 2;
position: relative;
width: 100%;
@include breakpoint(medium) {
width: calc(100% / 3 - #{$spacing});
}
@include breakpoint(large) {
width: calc(100% / 6 - #{$spacing});
}
&:focus-within {
outline: $outline-focus;
a:focus {
outline: none;
}
}
a {
font-weight: bold;
&::after,
&::before {
bottom: 0;
content: "";
left: 0;
position: absolute;
right: 0;
top: 0;
}
&:hover {
text-decoration: none;
}
&:hover::before {
background: $highlight;
z-index: -1;
}
}
span {
display: block;
font-size: $small-font-size;
padding-top: $line-height / 2;
}
}
}

View File

@@ -1222,36 +1222,6 @@
color: $brand;
}
.groups-and-headings {
.heading {
border: 1px solid $border;
border-radius: rem-calc(3);
display: inline-block;
margin-bottom: $line-height / 2;
a {
display: block;
padding: $line-height / 2;
&:hover {
background: $highlight;
text-decoration: none;
}
}
.heading-name {
padding: $line-height / 2;
}
span {
color: $text;
display: block;
font-size: $small-font-size;
}
}
}
.progress-votes {
position: relative;

View File

@@ -0,0 +1,32 @@
<div class="budget-header">
<div class="row">
<div class="small-12 column">
<h1><%= budget.name %></h1>
<div class="description">
<%= auto_link_already_sanitized_html wysiwyg(budget.description) %>
</div>
<p>
<%= link_to t("budgets.index.section_header.help"), "#section_help" %>
</p>
</div>
</div>
</div>
<%= render Budgets::SubheaderComponent.new(budget) %>
<%= render Budgets::PhasesComponent.new(budget) %>
<div id="budget_info" class="budget-info">
<div class="row margin-top">
<div class="small-12 column">
<%= render Budgets::GroupsAndHeadingsComponent.new(budget) %>
<% unless budget.informing? %>
<div class="map inline">
<h2><%= t("budgets.index.map") %></h2>
<%= render_map(nil, "budgets", false, nil, coordinates) %>
</div>
<% end %>
</div>
</div>
</div>

View File

@@ -0,0 +1,22 @@
class Budgets::BudgetComponent < ApplicationComponent
delegate :wysiwyg, :auto_link_already_sanitized_html, :render_map, to: :helpers
attr_reader :budget
def initialize(budget)
@budget = budget
end
private
def coordinates
return unless budget.present?
if budget.publishing_prices_or_later? && budget.investments.selected.any?
investments = budget.investments.selected
else
investments = budget.investments
end
MapLocation.where(investment_id: investments).map(&:json_data)
end
end

View File

@@ -0,0 +1,10 @@
<div class="row">
<div class="small-12 column">
<div id="section_help" class="margin" data-magellan-target="section_help">
<p class="lead">
<strong><%= t("budgets.index.section_footer.title") %></strong>
</p>
<p><%= t("budgets.index.section_footer.description") %></p>
</div>
</div>
</div>

View File

@@ -0,0 +1,2 @@
class Budgets::FooterComponent < ApplicationComponent
end

View File

@@ -0,0 +1,18 @@
<div id="groups_and_headings" class="groups-and-headings">
<% budget.groups.each do |group| %>
<h2 id="<%= group.name.parameterize %>"><%= group.name %></h2>
<ul class="headings-list">
<% group.headings.sort_by_name.each do |heading| %>
<li class="heading">
<%= link_to_unless(
(budget.informing? || budget.finished?),
heading.name,
budget_investments_path(budget.id, heading_id: heading.id)
) %>
<%= price(heading) %>
</li>
<% end %>
</ul>
<% end %>
</div>

View File

@@ -0,0 +1,13 @@
class Budgets::GroupsAndHeadingsComponent < ApplicationComponent
attr_reader :budget
def initialize(budget)
@budget = budget
end
private
def price(heading)
tag.span(budget.formatted_heading_price(heading))
end
end

View File

@@ -0,0 +1,24 @@
<p class="investment-project-info">
<%= l investment.created_at.to_date %>
<% if investment.author.hidden? || investment.author.erased? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="author">
<%= t("budgets.investments.show.author_deleted") %>
</span>
<% else %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="author">
<%= investment.author.name %>
</span>
<% if investment.author.official? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="label round level-<%= investment.author.official_level %>">
<%= investment.author.official_position %>
</span>
<% end %>
<% end %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<%= investment.heading.name %>
</p>

View File

@@ -0,0 +1,7 @@
class Budgets::Investments::InfoComponent < ApplicationComponent
attr_reader :investment
def initialize(investment)
@investment = investment
end
end

View File

@@ -7,7 +7,6 @@ module Budgets
before_action :load_tag_cloud
before_action :load_categories
before_action :load_investments
before_action :load_ballot_referer
authorize_resource :budget
authorize_resource :ballot
@@ -67,10 +66,6 @@ module Budgets
@categories = Tag.category.order(:name)
end
def load_ballot_referer
@ballot_referer = session[:ballot_referer]
end
def load_map
@investments ||= []
@investments_map_coordinates = MapLocation.where(investment: @investments).map(&:json_data)

View File

@@ -4,7 +4,6 @@ module Budgets
before_action :load_budget
authorize_resource :budget
before_action :load_ballot
after_action :store_referer, only: [:show]
def show
authorize! :show, @ballot
@@ -22,9 +21,5 @@ module Budgets
query = Budget::Ballot.where(user: current_user, budget: @budget)
@ballot = @budget.balloting? ? query.first_or_create! : query.first_or_initialize
end
def store_referer
session[:ballot_referer] = request.referer
end
end
end

View File

@@ -1,13 +1,11 @@
class BudgetsController < ApplicationController
include FeatureFlags
include BudgetsHelper
include InvestmentFilters
feature_flag :budgets
before_action :load_budget, only: :show
before_action :load_current_budget, only: :index
load_and_authorize_resource
before_action :set_default_investment_filter, only: :show
has_filters investment_filters, only: :show
respond_to :html, :js
@@ -17,7 +15,6 @@ class BudgetsController < ApplicationController
def index
@finished_budgets = @budgets.finished.order(created_at: :desc)
@budgets_coordinates = current_budget_map_locations
end
private
@@ -25,4 +22,8 @@ class BudgetsController < ApplicationController
def load_budget
@budget = Budget.find_by_slug_or_id! params[:id]
end
def load_current_budget
@budget = current_budget
end
end

View File

@@ -5,13 +5,6 @@ module BudgetsHelper
end
end
def heading_name_and_price_html(heading, budget)
tag.div do
concat(heading.name + " ")
concat(tag.span(budget.formatted_heading_price(heading)))
end
end
def csv_params
csv_params = params.clone.merge(format: :csv)
csv_params = csv_params.to_unsafe_h.map { |k, v| [k.to_sym, v] }.to_h
@@ -63,18 +56,6 @@ module BudgetsHelper
budget.published? || current_user&.administrator?
end
def current_budget_map_locations
return unless current_budget.present?
if current_budget.publishing_prices_or_later? && current_budget.investments.selected.any?
investments = current_budget.investments.selected
else
investments = current_budget.investments
end
MapLocation.where(investment_id: investments).map(&:json_data)
end
def display_calculate_winners_button?(budget)
budget.balloting_or_later?
end

View File

@@ -1,6 +1,6 @@
<div class="budget-header">
<div class="row">
<%= back_link_to @ballot_referer %>
<%= back_link_to session[:ballot_referer] %>
<h1 class="text-center"><%= t("budgets.ballots.show.title") %></h1>

View File

@@ -5,7 +5,7 @@
<div class="budget-header">
<div class="row">
<div class="small-12 medium-9 column">
<%= back_link_to budgets_path %>
<%= back_link_to budget_path(@budget) %>
<h2><%= t("budgets.groups.show.title") %></h2>
</div>
</div>
@@ -35,8 +35,7 @@
class="<%= css_for_ballot_heading(heading) %>">
<%= link_to heading.name,
budget_investments_path(heading_id: heading.id,
filter: @current_filter),
data: { turbolinks: false } %><br>
filter: @current_filter) %><br>
</span>
<% end %>
</div>

View File

@@ -6,63 +6,12 @@
<%= render "shared/canonical", href: budgets_url %>
<% end %>
<% if current_budget.present? %>
<div class="budget-header">
<div class="row">
<div class="small-12 column">
<h1><%= current_budget.name %></h1>
<div class="description">
<%= auto_link_already_sanitized_html wysiwyg(current_budget.description) %>
</div>
<p>
<%= link_to t("budgets.index.section_header.help"), "#section_help" %>
</p>
</div>
</div>
</div>
<% if @budget.present? %>
<%= render Budgets::BudgetComponent.new(@budget) %>
<%= render Budgets::SubheaderComponent.new(current_budget) %>
<%= render Budgets::PhasesComponent.new(current_budget) %>
<div id="budget_info" class="budget-info">
<div class="row margin-top">
<div class="small-12 column">
<div id="groups_and_headings" class="groups-and-headings">
<% current_budget.groups.each do |group| %>
<h2 id="<%= group.name.parameterize %>"><%= group.name %></h2>
<ul class="no-bullet" data-equalizer data-equalizer-on="medium">
<% group.headings.sort_by_name.each do |heading| %>
<li class="heading small-12 medium-4 large-2" data-equalizer-watch>
<% unless current_budget.informing? || current_budget.finished? %>
<%= link_to budget_investments_path(current_budget.id,
heading_id: heading.id) do %>
<%= heading_name_and_price_html(heading, current_budget) %>
<% end %>
<% else %>
<div class="heading-name">
<%= heading_name_and_price_html(heading, current_budget) %>
</div>
<% end %>
</li>
<% end %>
</ul>
<% end %>
</div>
<% unless current_budget.informing? %>
<div class="map inline">
<h3><%= t("budgets.index.map") %></h3>
<%= render_map(nil, "budgets", false, nil, @budgets_coordinates) %>
</div>
<% end %>
</div>
</div>
<% if @finished_budgets.present? %>
<%= render "finished", budgets: @finished_budgets %>
<% end %>
</div>
<% if @finished_budgets.present? %>
<%= render "finished", budgets: @finished_budgets %>
<% end %>
<% else %>
<div class="budget-header margin-bottom">
<div class="row">
@@ -81,13 +30,4 @@
</div>
<% end %>
<div class="row">
<div class="small-12 column">
<div id="section_help" class="margin" data-magellan-target="section_help">
<p class="lead">
<strong><%= t("budgets.index.section_footer.title") %></strong>
</p>
<p><%= t("budgets.index.section_footer.description") %></p>
</div>
</div>
</div>
<%= render Budgets::FooterComponent.new %>

View File

@@ -4,7 +4,7 @@
<div class="row">
<div class="small-12 column">
<%= back_link_to budgets_path %>
<%= back_link_to budget_path(@budget) %>
<% if can? :show, @ballot %>
<%= link_to t("budgets.investments.header.check_ballot"),

View File

@@ -21,30 +21,8 @@
<% cache [locale_and_user_status(investment), "index", investment, investment.author] do %>
<h3><%= link_to investment.title, namespaced_budget_investment_path(investment) %></h3>
<p class="investment-project-info">
<%= l investment.created_at.to_date %>
<%= render Budgets::Investments::InfoComponent.new(investment) %>
<% if investment.author.hidden? || investment.author.erased? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="author">
<%= t("budgets.investments.show.author_deleted") %>
</span>
<% else %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="author">
<%= investment.author.name %>
</span>
<% if investment.author.official? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="label round level-<%= investment.author.official_level %>">
<%= investment.author.official_position %>
</span>
<% end %>
<% end %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<%= investment.heading.name %>
</p>
<div class="investment-project-description">
<%= wysiwyg(investment.description) %>
<div class="truncate"></div>

View File

@@ -61,13 +61,13 @@
<% end %>
<p>
<%= link_to budget_path(@budget) do %>
<%= link_to budget_investments_path(@budget, heading_id: @heading) do %>
<small><%= t("budgets.results.investment_proyects") %></small>
<% end %><br>
<%= link_to budget_path(@budget, filter: "unfeasible") do %>
<%= link_to budget_investments_path(@budget, heading_id: @heading, filter: "unfeasible") do %>
<small><%= t("budgets.results.unfeasible_investment_proyects") %></small>
<% end %><br>
<%= link_to budget_path(@budget, filter: "unselected") do %>
<%= link_to budget_investments_path(@budget, heading_id: @heading, filter: "unselected") do %>
<small><%= t("budgets.results.not_selected_investment_proyects") %></small>
<% end %>
</p>

View File

@@ -1,76 +1,9 @@
<%= render Shared::BannerComponent.new("budgets") %>
<% provide :title do %><%= @budget.name %><% end %>
<% content_for :canonical do %>
<%= render "shared/canonical", href: budget_url(@budget, filter: @current_filter) %>
<% end %>
<div class="budget-header">
<div class="row">
<div class="small-12 column">
<%= back_link_to budgets_path %>
<h1><%= @budget.name %></h1>
<%= auto_link_already_sanitized_html wysiwyg(@budget.description) %>
</div>
</div>
</div>
<%= render Budgets::SubheaderComponent.new(@budget) %>
<div class="row margin">
<div class="small-12 medium-9 column">
<% if @current_filter == "unfeasible" %>
<h3 class="margin-bottom"><%= t("budgets.show.unfeasible_title") %></h3>
<% elsif @current_filter == "unselected" %>
<h3 class="margin-bottom"><%= t("budgets.show.unselected_title") %></h3>
<% end %>
<table class="table-fixed">
<thead>
<th><%= t("budgets.show.group") %></th>
</thead>
<tbody>
<% @budget.groups.each do |group| %>
<tr>
<td>
<% if group.single_heading_group? %>
<%= link_to group.name,
budget_investments_path(@budget,
heading_id: group.headings.first.id,
filter: @current_filter),
data: { turbolinks: false } %>
<% else %>
<%= link_to group.name,
budget_group_path(@budget, group,
filter: @current_filter) %>
<% end %>
<br>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<% if @budget.balloting_or_later? %>
<% unless @current_filter == "unfeasible" %>
<div class="row">
<div class="small-12 column">
<small>
<%= link_to t("budgets.show.unfeasible"),
budget_path(@budget, filter: "unfeasible") %>
</small>
</div>
</div>
<% end %>
<% unless @current_filter == "unselected" %>
<div class="row">
<div class="small-12 column">
<small>
<%= link_to t("budgets.show.unselected"),
budget_path(@budget, filter: "unselected") %>
</small>
</div>
</div>
<% end %>
<% end %>
<%= render Budgets::BudgetComponent.new(@budget) %>
<%= render Budgets::FooterComponent.new %>

View File

@@ -178,11 +178,6 @@ en:
one: "You have selected <strong>1</strong> project out of <strong>%{limit}</strong>"
other: "You have selected <strong>%{count}</strong> projects out of <strong>%{limit}</strong>"
show:
group: Group
unfeasible_title: Unfeasible investments
unfeasible: See unfeasible investments
unselected_title: Investments not selected for balloting phase
unselected: See investments not selected for balloting phase
see_results: See results
results:
link: Results

View File

@@ -178,11 +178,6 @@ es:
one: "Has seleccionado <strong>1</strong> proyecto de <strong>%{limit}</strong>"
other: "Has seleccionado <strong>%{count}</strong> proyectos de <strong>%{limit}</strong>"
show:
group: Grupo
unfeasible_title: Proyectos de gasto inviables
unfeasible: Ver los proyectos inviables
unselected_title: Proyectos no seleccionados para la votación final
unselected: Ver los proyectos no seleccionados para la votación final
see_results: Ver resultados
results:
link: Resultados

View File

@@ -1,4 +1,5 @@
require "rails_helper"
require "sessions_helper"
describe "Ballots" do
let(:user) { create(:user, :level_two) }
@@ -61,13 +62,6 @@ describe "Ballots" do
let!(:districts) { create(:budget_group, budget: budget, name: "Districts") }
context "Group and Heading Navigation" do
scenario "Groups" do
visit budget_path(budget)
expect(page).to have_link "City"
expect(page).to have_link "Districts"
end
scenario "Headings" do
create(:budget_heading, group: city, name: "Investments Type1")
create(:budget_heading, group: city, name: "Investments Type2")
@@ -75,16 +69,13 @@ describe "Ballots" do
create(:budget_heading, group: districts, name: "District 2")
visit budget_path(budget)
click_link "City"
expect(page).to have_link "Investments Type1"
expect(page).to have_link "Investments Type2"
visit budget_path(budget)
click_link "Districts"
expect(page).to have_link "District 1"
expect(page).to have_link "District 2"
within("#groups_and_headings") do
expect(page).to have_link "Investments Type1"
expect(page).to have_link "Investments Type2"
expect(page).to have_link "District 1"
expect(page).to have_link "District 2"
end
end
scenario "Investments" do
@@ -105,7 +96,6 @@ describe "Ballots" do
end
visit budget_path(budget)
click_link "City"
click_link "Above the city"
expect(page).to have_css(".budget-investment", count: 2)
@@ -113,8 +103,6 @@ describe "Ballots" do
expect(page).to have_content "Observatory"
visit budget_path(budget)
click_link "Districts"
click_link "District 1"
expect(page).to have_css(".budget-investment", count: 2)
@@ -122,22 +110,11 @@ describe "Ballots" do
expect(page).to have_content "Zero-emission zone"
visit budget_path(budget)
click_link "Districts"
click_link "District 2"
expect(page).to have_css(".budget-investment", count: 1)
expect(page).to have_content "Climbing wall"
end
scenario "Redirect to first heading if there is only one" do
city_heading = create(:budget_heading, group: city, name: "City")
city_investment = create(:budget_investment, :selected, heading: city_heading)
visit budget_path(budget)
click_link "City"
expect(page).to have_content city_investment.title
end
end
context "Adding and Removing Investments" do
@@ -145,10 +122,7 @@ describe "Ballots" do
create(:budget_investment, :selected, heading: new_york, price: 10000, title: "Bring back King Kong")
create(:budget_investment, :selected, heading: new_york, price: 20000, title: "Paint cabs black")
visit budget_path(budget)
click_link "States"
click_link "New York"
visit budget_investments_path(budget, heading_id: new_york)
add_to_ballot("Bring back King Kong")
expect(page).to have_css("#amount-spent", text: "€10,000")
@@ -175,9 +149,7 @@ describe "Ballots" do
scenario "Removing a investment", :js do
investment = create(:budget_investment, :selected, heading: new_york, price: 10000, balloters: [user])
visit budget_path(budget)
click_link "States"
click_link "New York"
visit budget_investments_path(budget, heading_id: new_york)
expect(page).to have_content investment.title
expect(page).to have_css("#amount-spent", text: "€10,000")
@@ -206,9 +178,7 @@ describe "Ballots" do
scenario "the Map shoud be visible before and after", :js do
create(:budget_investment, :selected, heading: new_york, price: 10000, title: "More bridges")
visit budget_path(budget)
click_link "States"
click_link "New York"
visit budget_investments_path(budget, heading_id: new_york)
within("#sidebar") do
expect(page).to have_content "OpenStreetMap"
@@ -243,8 +213,7 @@ describe "Ballots" do
create(:budget_investment, :selected, heading: district_heading1, price: 20000, title: "Average")
create(:budget_investment, :selected, heading: district_heading2, price: 30000, title: "Expensive")
visit budget_path(budget)
click_link "City"
visit budget_investments_path(budget, heading_id: city_heading)
add_to_ballot("Cheap")
@@ -256,9 +225,7 @@ describe "Ballots" do
expect(page).to have_content "€10,000"
end
visit budget_path(budget)
click_link "Districts"
click_link "District 1"
visit budget_investments_path(budget, heading_id: district_heading1)
expect(page).to have_css("#amount-spent", text: "€0")
expect(page).to have_css("#amount-spent", text: "€1,000,000")
@@ -276,8 +243,7 @@ describe "Ballots" do
expect(page).not_to have_content "€10,000"
end
visit budget_path(budget)
click_link "City"
visit budget_investments_path(budget, heading_id: city_heading)
expect(page).to have_css("#amount-spent", text: "€10,000")
expect(page).to have_css("#amount-available", text: "€9,990,000")
@@ -290,9 +256,7 @@ describe "Ballots" do
expect(page).not_to have_content "€20,000"
end
visit budget_path(budget)
click_link "Districts"
click_link "District 2"
visit budget_investments_path(budget, heading_id: district_heading2)
expect(page).to have_content("You have active votes in another heading: District 1")
end
@@ -317,14 +281,11 @@ describe "Ballots" do
scenario "Select my heading", :js do
create(:budget_investment, :selected, heading: california, title: "Green beach")
visit budget_path(budget)
click_link "States"
click_link "California"
visit budget_investments_path(budget, heading_id: california)
add_to_ballot("Green beach")
visit budget_path(budget)
click_link "States"
visit budget_group_path(budget, states)
expect(page).to have_content "California"
expect(page).to have_css("#budget_heading_#{california.id}.is-active")
@@ -345,8 +306,8 @@ describe "Ballots" do
add_to_ballot("Avengers Tower")
visit budget_path(budget)
click_link "States"
visit budget_group_path(budget, states)
expect(page).to have_css("#budget_heading_#{new_york.id}.is-active")
expect(page).not_to have_css("#budget_heading_#{california.id}.is-active")
end
@@ -363,16 +324,6 @@ describe "Ballots" do
end
context "Showing the ballot" do
scenario "Do not display heading name if there is only one heading in the group (example: group city)" do
group = create(:budget_group, budget: budget)
heading = create(:budget_heading, group: group)
visit budget_path(budget)
click_link group.name
# No need to click on the heading name
expect(page).to have_content("Investment projects with scope: #{heading.name}")
expect(page).to have_current_path(budget_investments_path(budget), ignore_query: true)
end
scenario "Displaying the correct group, heading, count & amount" do
group1 = create(:budget_group, budget: budget)
group2 = create(:budget_group, budget: budget)
@@ -471,28 +422,45 @@ describe "Ballots" do
end
end
scenario "Back link after removing an investment from Ballot", :js do
create(:budget_investment, :selected, heading: new_york, price: 10, title: "Sully monument")
describe "Back link", :js do
scenario "after adding and removing an investment from the ballot" do
create(:budget_investment, :selected, heading: new_york, price: 10, title: "Sully monument")
login_as(user)
visit budget_investments_path(budget, heading_id: new_york.id)
add_to_ballot("Sully monument")
login_as(user)
visit budget_investments_path(budget, heading_id: new_york.id)
add_to_ballot("Sully monument")
within(".budget-heading") do
click_link "Check and confirm my ballot"
within(".budget-heading") do
click_link "Check and confirm my ballot"
end
expect(page).to have_content("You have voted one investment")
within(".ballot-list li", text: "Sully monument") do
find(".icon-x").click
end
expect(page).to have_content("You have voted 0 investments")
click_link "Go back"
expect(page).to have_current_path(budget_investments_path(budget, heading_id: new_york.id))
end
expect(page).to have_content("You have voted one investment")
scenario "before adding any investments" do
login_as(user)
visit budget_investments_path(budget, heading_id: new_york.id)
within(".ballot-list li", text: "Sully monument") do
find(".icon-x").click
within(".budget-heading") do
click_link "Check and confirm my ballot"
end
expect(page).to have_content("You have voted 0 investments")
click_link "Go back"
expect(page).to have_current_path(budget_investments_path(budget, heading_id: new_york.id))
end
expect(page).to have_content("You have voted 0 investments")
click_link "Go back"
expect(page).to have_current_path(budget_investments_path(budget, heading_id: new_york.id))
end
context "Permissions" do
@@ -542,9 +510,7 @@ describe "Ballots" do
investment = create(:budget_investment, heading: new_york, title: "WTF asdfasfd")
login_as(user)
visit budget_path(budget)
click_link states.name
click_link new_york.name
visit budget_investments_path(budget, heading_id: new_york)
expect(page).not_to have_css("#budget_investment_#{investment.id}")
end
@@ -553,9 +519,7 @@ describe "Ballots" do
investment = create(:budget_investment, :undecided, heading: new_york)
login_as(user)
visit budget_path(budget)
click_link states.name
click_link new_york.name
visit budget_investments_path(budget, heading_id: new_york)
within("#budget-investments") do
expect(page).not_to have_css("div.ballot")
@@ -679,23 +643,34 @@ describe "Ballots" do
scenario "Edge case voting a non-elegible investment", :js do
investment1 = create(:budget_investment, :selected, heading: new_york, price: 10000)
login_as(user)
visit budget_path(budget)
click_link "States"
click_link "New York"
in_browser(:user) do
login_as user
visit budget_investments_path(budget, heading_id: new_york)
new_york.update!(price: 10)
expect(page).to have_css(".in-favor a")
end
within("#budget_investment_#{investment1.id}") do
find(".in-favor a").click
in_browser(:admin) do
login_as create(:administrator).user
visit edit_admin_budget_group_heading_path(budget, states, new_york)
fill_in "Amount", with: 10
click_button "Save heading"
expect(page).not_to have_content "Remove"
expect(page).not_to have_selector(".participation-not-allowed")
expect(page).to have_content "Heading updated successfully"
end
hover_over_ballot
in_browser(:user) do
within("#budget_investment_#{investment1.id}") do
find(".in-favor a").click
expect(page).to have_selector(".participation-not-allowed")
expect(page).to have_selector(".in-favor a", obscured: true)
expect(page).not_to have_content "Remove"
expect(page).not_to have_selector(".participation-not-allowed")
hover_over_ballot
expect(page).to have_selector(".participation-not-allowed")
expect(page).to have_selector(".in-favor a", obscured: true)
end
end
end

View File

@@ -118,7 +118,7 @@ describe "Budgets" do
visit budgets_path
within("#budget_info") do
expect(page).not_to have_link "#{heading.name} €1,000,000"
expect(page).not_to have_link heading.name
expect(page).to have_content "#{heading.name} €1,000,000"
expect(page).not_to have_link("List of all investment projects")
@@ -136,7 +136,7 @@ describe "Budgets" do
visit budgets_path
within("#budget_info") do
expect(page).not_to have_link "#{heading.name} €1,000,000"
expect(page).not_to have_link heading.name
expect(page).to have_content "#{heading.name} €1,000,000"
expect(page).to have_css("div.map")
@@ -307,7 +307,7 @@ describe "Budgets" do
map_locations << { longitude: 40.123456789, latitude: "********" }
map_locations << { longitude: "**********", latitude: 3.12345678 }
budget_map_locations = map_locations.map do |map_location|
coordinates = map_locations.map do |map_location|
{
lat: map_location[:latitude],
long: map_location[:longitude],
@@ -317,8 +317,7 @@ describe "Budgets" do
}
end
allow_any_instance_of(BudgetsHelper).
to receive(:current_budget_map_locations).and_return(budget_map_locations)
allow_any_instance_of(Budgets::BudgetComponent).to receive(:coordinates).and_return(coordinates)
visit budgets_path
@@ -329,61 +328,32 @@ describe "Budgets" do
end
context "Show" do
scenario "List all groups" do
create(:budget_group, budget: budget)
create(:budget_group, budget: budget)
visit budget_path(budget)
budget.groups.each { |group| expect(page).to have_link(group.name) }
end
scenario "Links to unfeasible and selected if balloting or later" do
budget = create(:budget, :selecting)
group = create(:budget_group, budget: budget)
visit budget_path(budget)
expect(page).not_to have_link "See unfeasible investments"
expect(page).not_to have_link "See investments not selected for balloting phase"
click_link group.name
visit budget_group_path(budget, group)
expect(page).not_to have_link "See unfeasible investments"
expect(page).not_to have_link "See investments not selected for balloting phase"
budget.update!(phase: :publishing_prices)
visit budget_path(budget)
expect(page).not_to have_link "See unfeasible investments"
expect(page).not_to have_link "See investments not selected for balloting phase"
click_link group.name
visit budget_group_path(budget, group)
expect(page).not_to have_link "See unfeasible investments"
expect(page).not_to have_link "See investments not selected for balloting phase"
budget.update!(phase: :balloting)
visit budget_path(budget)
expect(page).to have_link "See unfeasible investments"
expect(page).to have_link "See investments not selected for balloting phase"
click_link group.name
visit budget_group_path(budget, group)
expect(page).to have_link "See unfeasible investments"
expect(page).to have_link "See investments not selected for balloting phase"
budget.update!(phase: :finished)
visit budget_path(budget)
expect(page).to have_link "See unfeasible investments"
expect(page).to have_link "See investments not selected for balloting phase"
click_link group.name
visit budget_group_path(budget, group)
expect(page).to have_link "See unfeasible investments"
expect(page).to have_link "See investments not selected for balloting phase"
@@ -399,8 +369,7 @@ describe "Budgets" do
heading3 = create(:budget_heading, group: group2, name: "Brooklyn")
heading4 = create(:budget_heading, group: group2, name: "Queens")
visit budget_path(budget)
click_link "New York"
visit budget_group_path(budget, group1)
expect(page).to have_css("#budget_heading_#{heading1.id}")
expect(page).to have_css("#budget_heading_#{heading2.id}")

View File

@@ -68,5 +68,13 @@ describe "Budget Groups" do
expect(page).to have_link "Southwest"
expect(page).not_to have_link "See investments not selected for balloting phase unfeasible investments"
end
scenario "Back link", :js do
visit budget_group_path(budget, group)
click_link "Go back"
expect(page).to have_current_path budget_path(budget)
end
end
end

View File

@@ -78,7 +78,7 @@ describe "Budget Investments" do
unfeasible_investment = create(:budget_investment, :unfeasible, heading: heading)
visit budget_path(budget)
click_link "Health"
click_link "More hospitals"
expect(page).to have_selector("#budget-investments .budget-investment", count: 3)
investments.each do |investment|
@@ -88,6 +88,10 @@ describe "Budget Investments" do
expect(page).not_to have_content(unfeasible_investment.title)
end
end
click_link "Go back"
expect(page).to have_current_path budget_path(budget)
end
scenario "Index view mode" do
@@ -95,11 +99,9 @@ describe "Budget Investments" do
create(:budget_investment, heading: heading),
create(:budget_investment, heading: heading)]
visit budget_path(budget)
click_link "Health"
visit budget_investments_path(budget, heading_id: heading)
click_button "View mode"
click_link "List"
investments.each do |investment|
@@ -110,7 +112,6 @@ describe "Budget Investments" do
end
click_button "View mode"
click_link "Cards"
investments.each do |investment|
@@ -238,47 +239,6 @@ describe "Budget Investments" do
end
end
scenario "by unfeasibilty link for group with one heading" do
budget.update!(phase: :balloting)
group = create(:budget_group, name: "All City", budget: budget)
heading = create(:budget_heading, name: "Madrid", group: group)
visit budget_path(budget)
click_link "See unfeasible investments"
click_link "All City"
expected_path = budget_investments_path(budget, heading_id: heading.id, filter: "unfeasible")
expect(page).to have_current_path(expected_path)
end
scenario "by unfeasibilty link for group with many headings" do
budget.update!(phase: :balloting)
group = create(:budget_group, name: "Districts", budget: budget)
barajas = create(:budget_heading, name: "Barajas", group: group)
carabanchel = create(:budget_heading, name: "Carabanchel", group: group)
create(:budget_investment, :feasible, heading: barajas, title: "Terminal 5")
create(:budget_investment, :unfeasible, heading: barajas, title: "Seaport")
create(:budget_investment, :unfeasible, heading: carabanchel, title: "Airport")
visit budget_path(budget)
click_link "See unfeasible investments"
click_link "Districts"
click_link "Barajas"
within("#budget-investments") do
expect(page).to have_css(".budget-investment", count: 1)
expect(page).to have_content "Seaport"
expect(page).not_to have_content "Terminal 5"
expect(page).not_to have_content "Airport"
end
end
context "Results Phase" do
before { budget.update(phase: "finished", results_enabled: true) }
@@ -286,8 +246,7 @@ describe "Budget Investments" do
investment1 = create(:budget_investment, :winner, heading: heading)
investment2 = create(:budget_investment, :selected, heading: heading)
visit budget_path(budget)
click_link "Health"
visit budget_investments_path(budget, heading_id: heading)
within("#budget-investments") do
expect(page).to have_css(".budget-investment", count: 1)
@@ -297,7 +256,6 @@ describe "Budget Investments" do
visit budget_results_path(budget)
click_link "List of all investment projects"
click_link "Health"
within("#budget-investments") do
expect(page).to have_css(".budget-investment", count: 1)
@@ -312,7 +270,6 @@ describe "Budget Investments" do
visit budget_results_path(budget)
click_link "List of all unfeasible investment projects"
click_link "Health"
within("#budget-investments") do
expect(page).to have_css(".budget-investment", count: 1)
@@ -327,7 +284,6 @@ describe "Budget Investments" do
visit budget_results_path(budget)
click_link "List of all investment projects not selected for balloting"
click_link "Health"
within("#budget-investments") do
expect(page).to have_css(".budget-investment", count: 1)
@@ -1230,7 +1186,7 @@ describe "Budget Investments" do
first(:link, "Participatory budgeting").click
click_link "More hospitals €666,666"
click_link "More hospitals"
within("#budget_investment_#{investment1.id}") do
expect(page).to have_content investment1.title
@@ -1305,19 +1261,12 @@ describe "Budget Investments" do
create(:budget_investment, :selected, price: 100000, heading: new_york_heading, title: "NASA base")
login_as(user)
visit budget_path(budget)
click_link "Global Group"
# No need to click_link "Global Heading" because the link of a group with a single heading
# points to the list of investments directly
visit budget_investments_path(budget, heading: global_heading)
add_to_ballot("World T-Shirt")
add_to_ballot("Eco pens")
visit budget_path(budget)
click_link "Health"
click_link "Carabanchel"
visit budget_investments_path(budget, heading: carabanchel_heading)
add_to_ballot("Fireworks")
add_to_ballot("Bus pass")
@@ -1360,10 +1309,7 @@ describe "Budget Investments" do
create(:budget_investment, :selected, heading: heading_1, title: "Zero-emission zone")
login_as(user)
visit budget_path(budget)
click_link "Health"
click_link "Heading 1"
visit budget_investments_path(budget, heading_id: heading_1)
add_to_ballot("Zero-emission zone")
@@ -1413,45 +1359,6 @@ describe "Budget Investments" do
end
end
scenario "Shows unselected link for group with one heading" do
group = create(:budget_group, name: "All City", budget: budget)
heading = create(:budget_heading, name: "Madrid", group: group)
visit budget_path(budget)
click_link "See investments not selected for balloting phase"
click_link "All City"
expected_path = budget_investments_path(budget, heading_id: heading.id, filter: "unselected")
expect(page).to have_current_path(expected_path)
end
scenario "Shows unselected link for group with many headings" do
group = create(:budget_group, name: "Districts", budget: budget)
barajas = create(:budget_heading, name: "Barajas", group: group)
carabanchel = create(:budget_heading, name: "Carabanchel", group: group)
create(:budget_investment, :selected, heading: barajas, title: "Terminal 5")
create(:budget_investment, :unselected, heading: barajas, title: "Seaport")
create(:budget_investment, :unselected, heading: carabanchel, title: "Airport")
visit budget_path(budget)
click_link "See investments not selected for balloting phase"
click_link "Districts"
click_link "Barajas"
within("#budget-investments") do
expect(page).to have_css(".budget-investment", count: 1)
expect(page).to have_content "Seaport"
expect(page).not_to have_content "Terminal 5"
expect(page).not_to have_content "Airport"
end
end
scenario "Do not display vote button for unselected investments in index" do
investment = create(:budget_investment, :unselected, heading: heading)

View File

@@ -256,8 +256,7 @@ describe "Tags" do
end
login_as(admin) if budget.drafting?
visit budget_path(budget)
click_link group.name
visit budget_investments_path(budget, heading: heading.id)
within "#tag-cloud" do
click_link new_tag
@@ -305,8 +304,7 @@ describe "Tags" do
end
login_as(admin) if budget.drafting?
visit budget_path(budget)
click_link group.name
visit budget_investments_path(budget, heading: heading.id)
within "#categories" do
click_link tag_medio_ambiente.name