Merge pull request #2170 from consul/design

Design improvements
This commit is contained in:
Alberto García
2017-12-14 11:31:31 +01:00
committed by GitHub
29 changed files with 228 additions and 266 deletions

View File

@@ -2043,36 +2043,6 @@ table {
.activity { .activity {
.accordion li {
margin-bottom: $line-height / 2;
.accordion-title {
border-bottom: 1px solid $border;
background: #f8f9fb;
font-size: $small-font-size;
padding: $line-height / 2;
}
.accordion-content {
padding: 0;
}
}
.accordion .title {
display: block;
line-height: $line-height;
}
.accordion .icon {
font-size: rem-calc(20);
float: left;
margin-right: $line-height / 3;
&.icon-debates {
margin-top: rem-calc(3);
}
}
.retired { .retired {
text-decoration: line-through; text-decoration: line-through;
} }
@@ -2082,6 +2052,45 @@ table {
li { li {
margin-right: $line-height / 4; margin-right: $line-height / 4;
span {
background: none;
border: 1px solid #ececec;
}
}
}
.following {
.follow-list {
list-style-type: circle;
padding: $line-height / 2;
li {
margin-bottom: $line-height / 2;
margin-left: $line-height;
}
}
h3 {
font-size: rem-calc(24);
margin-top: $line-height;
padding-left: rem-calc(30);
position: relative;
span {
left: 0;
position: absolute;
top: 2px;
}
}
.interests {
@include breakpoint(medium) {
border-left: 1px solid #ececec;
padding-left: $line-height;
}
} }
} }

View File

@@ -657,29 +657,6 @@
.budget-investments-list .budget-investment, .budget-investments-list .budget-investment,
.proposals-list .proposal { .proposals-list .proposal {
.no-image {
background: $brand;
}
}
.budget-investments-list .budget-investment,
.proposals-list .proposal {
@include breakpoint(small) {
.no-image {
width: 100%;
max-width: rem-calc(300);
margin: 0 auto;
&::before {
content: '';
display: block;
padding-top: 100%;
}
}
}
@include breakpoint(medium) { @include breakpoint(medium) {
.panel { .panel {
@@ -687,12 +664,6 @@
&.with-image { &.with-image {
padding: 0 $line-height / 2 0 0; padding: 0 $line-height / 2 0 0;
} }
.no-image {
height: 100%;
min-height: rem-calc(245);
width: rem-calc(140);
}
} }
.column:first-child { .column:first-child {

View File

@@ -13,7 +13,7 @@ module FollowablesHelper
def render_follow(follow) def render_follow(follow)
followable = follow.followable followable = follow.followable
partial = followable_class_name(followable) partial = followable_class_name(followable) + "_follow"
locals = {followable_class_name(followable).to_sym => followable} locals = {followable_class_name(followable).to_sym => followable}
render partial, locals render partial, locals

View File

@@ -64,12 +64,4 @@ module UsersHelper
end end
end end
def empty_interests_message_text(user)
if current_user == user
t('account.show.public_interests_my_empty_list')
else
t('account.show.public_interests_user_empty_list')
end
end
end end

View File

@@ -21,9 +21,11 @@
<%= f.text_field :external_url %> <%= f.text_field :external_url %>
</div> </div>
<div class="images small-12 column"> <% if feature?(:allow_images) %>
<%= render 'images/nested_image', imageable: @investment, f: f %> <div class="images small-12 column">
</div> <%= render 'images/nested_image', imageable: @investment, f: f %>
</div>
<% end %>
<div class="documents small-12 column"> <div class="documents small-12 column">
<%= render 'documents/nested_documents', documentable: @investment, f: f %> <%= render 'documents/nested_documents', documentable: @investment, f: f %>

View File

@@ -1,18 +1,20 @@
<div id="<%= dom_id(investment) %>" class="budget-investment clear"> <div id="<%= dom_id(investment) %>" class="budget-investment clear">
<div class="panel with-image"> <div class="panel <%= ('with-image' if feature?(:allow_images) && investment.image.present?) %>">
<% if feature?(:allow_images) && investment.image.present? %>
<div class="row" data-equalizer> <div class="row" data-equalizer>
<div class="small-12 medium-3 large-2 column text-center"> <div class="small-12 medium-3 large-2 column text-center">
<div data-equalizer-watch> <div data-equalizer-watch>
<% if investment.image.present? %> <%= image_tag investment.image_url(:thumb), alt: investment.image.title %>
<%= image_tag investment.image_url(:thumb), alt: investment.image.title %>
<% else %>
<div class="no-image"></div>
<% end %>
</div> </div>
</div> </div>
<div class="small-12 medium-6 large-7 column"> <div class="small-12 medium-6 large-7 column">
<% else %>
<div class="row">
<div class="small-12 medium-9 column">
<% end %>
<div class="budget-investment-content"> <div class="budget-investment-content">
<% cache [locale_and_user_status(investment), 'index', investment, investment.author] do %> <% cache [locale_and_user_status(investment), 'index', investment, investment.author] do %>
@@ -55,7 +57,8 @@
<% if investment.should_show_votes? %> <% if investment.should_show_votes? %>
<div id="<%= dom_id(investment) %>_votes" <div id="<%= dom_id(investment) %>_votes"
class="small-12 medium-3 column text-center" data-equalizer-watch> class="small-12 medium-3 column text-center"
<%= 'data-equalizer-watch' if feature?(:allow_images) && investment.image.present? %>>
<%= render partial: '/budgets/investments/votes', locals: { <%= render partial: '/budgets/investments/votes', locals: {
investment: investment, investment: investment,
investment_votes: investment_votes, investment_votes: investment_votes,
@@ -64,7 +67,8 @@
</div> </div>
<% elsif investment.should_show_vote_count? %> <% elsif investment.should_show_vote_count? %>
<div id="<%= dom_id(investment) %>_votes" <div id="<%= dom_id(investment) %>_votes"
class="small-12 medium-3 column text-center" data-equalizer-watch> class="small-12 medium-3 column text-center"
<%= 'data-equalizer-watch' if feature?(:allow_images) && investment.image.present? %>>
<div class="supports js-participation"> <div class="supports js-participation">
<span class="total-supports no-button"> <span class="total-supports no-button">
<%= t("budgets.investments.investment.supports", <%= t("budgets.investments.investment.supports",
@@ -74,7 +78,8 @@
</div> </div>
<% elsif investment.should_show_ballots? %> <% elsif investment.should_show_ballots? %>
<div id="<%= dom_id(investment) %>_ballot" <div id="<%= dom_id(investment) %>_ballot"
class="small-12 medium-3 column text-center" data-equalizer-watch> class="small-12 medium-3 column text-center"
<%= 'data-equalizer-watch' if feature?(:allow_images) && investment.image.present? %>>
<%= render partial: '/budgets/investments/ballot', locals: { <%= render partial: '/budgets/investments/ballot', locals: {
investment: investment, investment: investment,
investment_ids: investment_ids, investment_ids: investment_ids,
@@ -83,13 +88,14 @@
</div> </div>
<% elsif investment.should_show_price? %> <% elsif investment.should_show_price? %>
<div id="<%= dom_id(investment) %>_price" <div id="<%= dom_id(investment) %>_price"
class="supports small-12 medium-3 column text-center" data-equalizer-watch> class="supports small-12 medium-3 column text-center"
<%= 'data-equalizer-watch' if feature?(:allow_images) && investment.image.present? %>>
<p class="investment-project-amount margin-top"> <p class="investment-project-amount margin-top">
<%= investment.formatted_price %> <%= investment.formatted_price %>
</p> </p>
</div> </div>
<% else %> <% else %>
<div data-equalizer-watch></div> <div <%= 'data-equalizer-watch' if feature?(:allow_images) && investment.image.present? %>></div>
<% end %> <% end %>
<% end %> <% end %>

View File

@@ -46,7 +46,9 @@
<%= safe_html_with_links investment.description.html_safe %> <%= safe_html_with_links investment.description.html_safe %>
<% if feature?(:map) && map_location_available?(@investment.map_location) %> <% if feature?(:map) && map_location_available?(@investment.map_location) %>
<%= render_map(@investment.map_location, "budget_investment", false, nil) %> <div class="margin">
<%= render_map(@investment.map_location, "budget_investment", false, nil) %>
</div>
<% end %> <% end %>
<% if investment.external_url.present? %> <% if investment.external_url.present? %>
@@ -129,6 +131,9 @@
} %> } %>
<% if current_user %> <% if current_user %>
<div class="sidebar-divider"></div>
<p class="sidebar-title"><%= t("shared.follow") %></p>
<%= render 'follows/follow_button', follow: find_or_build_follow(current_user, investment) %> <%= render 'follows/follow_button', follow: find_or_build_follow(current_user, investment) %>
<% end %> <% end %>

View File

@@ -1,24 +1,19 @@
<span class="js-follow"> <div class="js-follow">
<span class="followable-content"> <span class="followable-content">
<% if follow.followable.followed_by?(current_user) %> <% if follow.followable.followed_by?(current_user) %>
<%= link_to t('shared.following'),
<%= link_to t('shared.unfollow'),
follow_path(follow), follow_path(follow),
method: :delete, remote: true, method: :delete, remote: true,
title: unfollow_text(follow.followable), title: unfollow_text(follow.followable),
class: 'button hollow' %> class: 'button expanded' %>
<% else %> <% else %>
<%= link_to follow_text(follow.followable),
<%= link_to t('shared.follow'),
follows_path(followable_id: follow.followable.id, follows_path(followable_id: follow.followable.id,
followable_type: follow.followable.class.name), followable_type: follow.followable.class.name),
method: :post, remote: true, method: :post, remote: true,
title: follow_text(follow.followable), title: follow_text(follow.followable),
class: 'button hollow' %> class: 'button hollow expanded' %>
<% end %> <% end %>
</span> </span>
</span> </div>

View File

@@ -10,8 +10,6 @@
<div class="image-container" data-equalizer-watch> <div class="image-container" data-equalizer-watch>
<% if poll.image.present? %> <% if poll.image.present? %>
<%= image_tag poll.image_url(:large), alt: poll.image.title %> <%= image_tag poll.image_url(:large), alt: poll.image.title %>
<% else %>
<div class="no-image"></div>
<% end %> <% end %>
</div> </div>
</div> </div>

View File

@@ -46,9 +46,11 @@
<%= f.text_field :external_url, placeholder: t("proposals.form.proposal_external_url"), label: false %> <%= f.text_field :external_url, placeholder: t("proposals.form.proposal_external_url"), label: false %>
</div> </div>
<div class="images small-12 column"> <% if feature?(:allow_images) %>
<%= render 'images/nested_image', imageable: @proposal, f: f %> <div class="images small-12 column">
</div> <%= render 'images/nested_image', imageable: @proposal, f: f %>
</div>
<% end %>
<div class="documents small-12 column"> <div class="documents small-12 column">
<%= render 'documents/nested_documents', documentable: @proposal, f: f %> <%= render 'documents/nested_documents', documentable: @proposal, f: f %>

View File

@@ -1,21 +1,23 @@
<div id="<%= dom_id(proposal) %>" <div id="<%= dom_id(proposal) %>"
class="proposal clear <%= ("successful" if proposal.total_votes > Proposal.votes_needed_for_success) %>" class="proposal clear <%= ("successful" if proposal.total_votes > Proposal.votes_needed_for_success) %>"
data-type="proposal"> data-type="proposal">
<div class="panel with-image"> <div class="panel <%= ('with-image' if feature?(:allow_images) && proposal.image.present?) %>">
<div class="icon-successful"></div> <div class="icon-successful"></div>
<div class="row" data-equalizer>
<div class="small-12 medium-3 large-2 column text-center"> <% if feature?(:allow_images) && proposal.image.present? %>
<div data-equalizer-watch> <div class="row" data-equalizer>
<% if proposal.image.present? %>
<div class="small-12 medium-3 large-2 column text-center">
<div data-equalizer-watch>
<%= image_tag proposal.image_url(:thumb), alt: proposal.image.title %> <%= image_tag proposal.image_url(:thumb), alt: proposal.image.title %>
<% else %> </div>
<div class="no-image"></div>
<% end %>
</div> </div>
</div>
<div class="small-12 medium-6 large-7 column"> <div class="small-12 medium-6 large-7 column">
<% else %>
<div class="row">
<div class="small-12 medium-9 column">
<% end %>
<div class="proposal-content"> <div class="proposal-content">
<% cache [locale_and_user_status(proposal), 'index', proposal, proposal.author] do %> <% cache [locale_and_user_status(proposal), 'index', proposal, proposal.author] do %>
<h3><%= link_to proposal.title, namespaced_proposal_path(proposal) %></h3> <h3><%= link_to proposal.title, namespaced_proposal_path(proposal) %></h3>
@@ -60,7 +62,9 @@
</div> </div>
</div> </div>
<div id="<%= dom_id(proposal) %>_votes" class="small-12 medium-3 column supports-container" data-equalizer-watch> <div id="<%= dom_id(proposal) %>_votes"
class="small-12 medium-3 column supports-container"
<%= 'data-equalizer-watch' if feature?(:allow_images) && proposal.image.present? %>>
<% if proposal.successful? %> <% if proposal.successful? %>
<div class="padding text-center"> <div class="padding text-center">

View File

@@ -69,7 +69,9 @@
<%= safe_html_with_links @proposal.description %> <%= safe_html_with_links @proposal.description %>
<% if feature?(:map) && map_location_available?(@proposal.map_location) %> <% if feature?(:map) && map_location_available?(@proposal.map_location) %>
<%= render_map(@proposal.map_location, "proposal", false, nil) %> <div class="margin">
<%= render_map(@proposal.map_location, "proposal", false, nil) %>
</div>
<% end %> <% end %>
<% if @proposal.external_url.present? %> <% if @proposal.external_url.present? %>
@@ -180,6 +182,9 @@
} %> } %>
<% if current_user %> <% if current_user %>
<div class="sidebar-divider"></div>
<p class="sidebar-title"><%= t("shared.follow") %></p>
<%= render 'follows/follow_button', follow: find_or_build_follow(current_user, @proposal) %> <%= render 'follows/follow_button', follow: find_or_build_follow(current_user, @proposal) %>
<% end %> <% end %>

View File

@@ -0,0 +1,3 @@
<li id="budget_investment_<%= budget_investment.id %>">
<%= link_to budget_investment.title, budget_investment_path(budget_investment.budget, budget_investment) %>
</li>

View File

@@ -1,30 +1,27 @@
<ul class="accordion" data-accordion data-allow-all-closed="true"> <div class="row following margin-top" data-equalizer data-equalize-on="medium" >
<div class="small-12 medium-8 column" data-equalizer-watch>
<ul class="menu simple clear">
<% @follows.each do |followable_type, follows| %>
<li><%= link_to followable_type_title(followable_type), "##{followable_type_title(followable_type).parameterize.underscore}" %></li>
<% end %>
</ul>
<% @follows.each do |followable_type, follows| %> <% @follows.each do |followable_type, follows| %>
<li class="accordion-item" data-accordion-item> <h3 id="<%= followable_type_title(followable_type).parameterize.underscore %>">
<span class="icon-<%= followable_icon(followable_type) %>"></span>
<%= followable_type_title(followable_type) %>
</h3>
<a href="#" class="accordion-title"> <ul class="follow-list">
<span class="icon"> <% follows.each do |follow| %>
<i class="icon icon-<%= followable_icon(followable_type) %>"></i> <%= render_follow(follow) %>
</span> <% end %>
<span class="title"> </ul>
<strong><%= followable_type_title(followable_type) %></strong> <% end %>
</span> </div>
</a>
<div class="accordion-content" data-tab-content> <div class="small-12 medium-4 column interests" data-equalizer-watch>
<table> <%= render 'interests', user: @user if valid_interests_access? %>
<tbody> </div>
<% follows.each do |follow| %> </div>
<%= render_follow(follow) %>
<% end %>
</tbody>
</table>
</div>
</li>
<% end %>
</ul>

View File

@@ -2,18 +2,10 @@
<h4><%= interests_title_text(user) %></h4> <h4><%= interests_title_text(user) %></h4>
<% if user.interests.any? %> <% if user.interests.any? %>
<ul class="no-bullet tags"> <ul class="no-bullet tags">
<% user.interests.each do |interest| %> <% user.interests.each do |interest| %>
<li class="inline-block"><span><%= interest %></span></li> <li class="inline-block"><span><%= interest %></span></li>
<% end %> <% end %>
</ul> </ul>
<% else %>
<div class="callout primary">
<%= empty_interests_message_text(user) %>
</div>
<% end %> <% end %>
</div> </div>

View File

@@ -0,0 +1,6 @@
<li id="proposal_<%= proposal.id %>">
<%= link_to proposal.title, proposal, proposal.retired? ? { class: 'retired' } : {} %>
<% if proposal.retired? %>
<span class="label alert"><%= t('users.proposals.retired') %></span>
<% end %>
</li>

View File

@@ -38,18 +38,20 @@
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
<%= t("users.show.no_activity") if @activity_counts.values.inject(&:+) == 0 %>
</ul> </ul>
<% if @activity_counts.values.inject(&:+) == 0 %>
<div class="callout primary">
<%= t("users.show.no_activity") %>
</div>
<% end %>
<%= render "activity_page" %> <%= render "activity_page" %>
<% else %> <% else %>
<div class="callout warning margin"> <div class="callout warning margin">
<%= t('users.show.private_activity') %> <%= t('users.show.private_activity') %>
</div> </div>
<% end %> <% end %>
<%= render 'interests', user: @user if valid_interests_access? %>
</div> </div>
</div> </div>
</main> </main>

View File

@@ -13,10 +13,8 @@ en:
phone_number_label: Phone number phone_number_label: Phone number
public_activity_label: Keep my list of activities public public_activity_label: Keep my list of activities public
public_interests_label: Keep my interests public public_interests_label: Keep my interests public
public_interests_my_title_list: List of interests (tags of elements you follow) public_interests_my_title_list: Tags of elements you follow
public_interests_user_title_list: List of interests (tags of elements this user follows) public_interests_user_title_list: Tags of elements this user follows
public_interests_my_empty_list: You do not follow any elements yet.
public_interests_user_empty_list: This user does not follow any elements yet.
save_changes_submit: Save changes save_changes_submit: Save changes
subscription_to_website_newsletter_label: Receive by email website relevant information subscription_to_website_newsletter_label: Receive by email website relevant information
email_on_direct_message_label: Receive emails about direct messages email_on_direct_message_label: Receive emails about direct messages
@@ -570,6 +568,7 @@ en:
collective: Collective collective: Collective
flag: Flag as inappropriate flag: Flag as inappropriate
follow: "Follow" follow: "Follow"
following: "Following"
follow_entity: "Follow %{entity}" follow_entity: "Follow %{entity}"
followable: followable:
budget_investment: budget_investment:
@@ -614,7 +613,6 @@ en:
target_blank_html: " (link opens in new window)" target_blank_html: " (link opens in new window)"
you_are_in: "You are in" you_are_in: "You are in"
unflag: Unflag unflag: Unflag
unfollow: "Unfollow"
unfollow_entity: "Unfollow %{entity}" unfollow_entity: "Unfollow %{entity}"
outline: outline:
budget: Participatory budget budget: Participatory budget

View File

@@ -44,6 +44,7 @@ en:
recommendations: Recommendeds recommendations: Recommendeds
community: Community on proposals and investments community: Community on proposals and investments
map: Proposals and budget investments geolocation map: Proposals and budget investments geolocation
allow_images: Allow upload and show images
map_latitude: Latitude map_latitude: Latitude
map_longitude: Longitude map_longitude: Longitude
map_zoom: Zoom map_zoom: Zoom

View File

@@ -13,10 +13,8 @@ es:
phone_number_label: Teléfono phone_number_label: Teléfono
public_activity_label: Mostrar públicamente mi lista de actividades public_activity_label: Mostrar públicamente mi lista de actividades
public_interests_label: Mostrar públicamente mis intereses public_interests_label: Mostrar públicamente mis intereses
public_interests_my_title_list: Lista de intereses (etiquetas de los elementos que sigues) public_interests_my_title_list: Etiquetas de los elementos que sigues
public_interests_user_title_list: Lista de intereses (etiquetas de los elementos seguidos este usuario) public_interests_user_title_list: Etiquetas de los elementos que sigue este usuario
public_interests_my_empty_list: Aún no sigues ningún elemento.
public_interests_user_empty_list: Este usuario no sigue ningún elemento todavía.
save_changes_submit: Guardar cambios save_changes_submit: Guardar cambios
subscription_to_website_newsletter_label: Recibir emails con información interesante sobre la web subscription_to_website_newsletter_label: Recibir emails con información interesante sobre la web
email_on_direct_message_label: Recibir emails con mensajes privados email_on_direct_message_label: Recibir emails con mensajes privados
@@ -567,6 +565,7 @@ es:
collective: Colectivo collective: Colectivo
flag: Denunciar como inapropiado flag: Denunciar como inapropiado
follow: "Seguir" follow: "Seguir"
following: "Siguiendo"
follow_entity: "Seguir %{entity}" follow_entity: "Seguir %{entity}"
followable: followable:
budget_investment: budget_investment:
@@ -611,7 +610,6 @@ es:
target_blank_html: " (se abre en ventana nueva)" target_blank_html: " (se abre en ventana nueva)"
you_are_in: "Estás en" you_are_in: "Estás en"
unflag: Deshacer denuncia unflag: Deshacer denuncia
unfollow: "Dejar de seguir"
unfollow_entity: "Dejar de seguir %{entity}" unfollow_entity: "Dejar de seguir %{entity}"
outline: outline:
budget: Presupuestos participativos budget: Presupuestos participativos

View File

@@ -44,6 +44,7 @@ es:
recommendations: Recomendaciones recommendations: Recomendaciones
community: Comunidad en propuestas y proyectos de inversión community: Comunidad en propuestas y proyectos de inversión
map: Geolocalización de propuestas y proyectos de inversión map: Geolocalización de propuestas y proyectos de inversión
allow_images: Permitir subir y mostrar imágenes
map_latitude: Latitud map_latitude: Latitud
map_longitude: Longitud map_longitude: Longitud
map_zoom: Zoom map_zoom: Zoom

View File

@@ -51,6 +51,7 @@ section "Creating Settings" do
Setting.create(key: 'feature.user.recommendations', value: "true") Setting.create(key: 'feature.user.recommendations', value: "true")
Setting.create(key: 'feature.community', value: "true") Setting.create(key: 'feature.community', value: "true")
Setting.create(key: 'feature.map', value: "true") Setting.create(key: 'feature.map', value: "true")
Setting.create(key: 'feature.allow_images', value: "true")
Setting.create(key: 'feature.public_stats', value: "true") Setting.create(key: 'feature.public_stats', value: "true")
Setting.create(key: 'per_page_code_head', value: "") Setting.create(key: 'per_page_code_head', value: "")
Setting.create(key: 'per_page_code_body', value: "") Setting.create(key: 'per_page_code_body', value: "")

View File

@@ -84,6 +84,7 @@ Setting['feature.legislation'] = true
Setting['feature.user.recommendations'] = true Setting['feature.user.recommendations'] = true
Setting['feature.community'] = true Setting['feature.community'] = true
Setting['feature.map'] = nil Setting['feature.map'] = nil
Setting['feature.allow_images'] = true
# Spending proposals feature flags # Spending proposals feature flags
Setting['feature.spending_proposal_features.voting_allowed'] = nil Setting['feature.spending_proposal_features.voting_allowed'] = nil

View File

@@ -19,7 +19,8 @@ describe InstallationController, type: :request do
'user.recommendations' => nil, 'user.recommendations' => nil,
'community' => nil, 'community' => nil,
'map' => 't', 'map' => 't',
'spending_proposal_features.voting_allowed' => 't' 'spending_proposal_features.voting_allowed' => 't',
'allow_images' => 't'
} }
end end
@@ -42,6 +43,7 @@ describe InstallationController, type: :request do
Setting['feature.community'] = true Setting['feature.community'] = true
Setting['feature.map'] = nil Setting['feature.map'] = nil
Setting['feature.spending_proposal_features.voting_allowed'] = nil Setting['feature.spending_proposal_features.voting_allowed'] = nil
Setting['feature.allow_images'] = true
end end
specify "with query string inside query params" do specify "with query string inside query params" do

View File

@@ -9,6 +9,14 @@ feature 'Budget Investments' do
let(:group) { create(:budget_group, name: "Health", budget: budget) } let(:group) { create(:budget_group, name: "Health", budget: budget) }
let!(:heading) { create(:budget_heading, name: "More hospitals", group: group) } let!(:heading) { create(:budget_heading, name: "More hospitals", group: group) }
before do
Setting['feature.allow_images'] = true
end
after do
Setting['feature.allow_images'] = nil
end
scenario 'Index' do scenario 'Index' do
investments = [create(:budget_investment, heading: heading), investments = [create(:budget_investment, heading: heading),
create(:budget_investment, heading: heading), create(:budget_investment, heading: heading),
@@ -37,7 +45,7 @@ feature 'Budget Investments' do
visit budget_investments_path(budget, heading_id: heading.id) visit budget_investments_path(budget, heading_id: heading.id)
within("#budget_investment_#{investment.id}") do within("#budget_investment_#{investment.id}") do
expect(page).to have_css("div.no-image") expect(page).to_not have_css("div.with-image")
end end
within("#budget_investment_#{investment_with_image.id}") do within("#budget_investment_#{investment_with_image.id}") do
expect(page).to have_css("img[alt='#{investment_with_image.image.title}']") expect(page).to have_css("img[alt='#{investment_with_image.image.title}']")

View File

@@ -10,6 +10,15 @@ feature 'Proposals' do
end end
context 'Index' do context 'Index' do
before do
Setting['feature.allow_images'] = true
end
after do
Setting['feature.allow_images'] = nil
end
scenario 'Lists featured and regular proposals' do scenario 'Lists featured and regular proposals' do
featured_proposals = create_featured_proposals featured_proposals = create_featured_proposals
proposals = [create(:proposal), create(:proposal), create(:proposal)] proposals = [create(:proposal), create(:proposal), create(:proposal)]
@@ -61,7 +70,7 @@ feature 'Proposals' do
visit proposals_path(proposal) visit proposals_path(proposal)
within("#proposal_#{proposal.id}") do within("#proposal_#{proposal.id}") do
expect(page).to have_css("div.no-image") expect(page).to_not have_css("div.with-image")
end end
within("#proposal_#{proposal_with_image.id}") do within("#proposal_#{proposal_with_image.id}") do
expect(page).to have_css("img[alt='#{proposal_with_image.image.title}']") expect(page).to have_css("img[alt='#{proposal_with_image.image.title}']")

View File

@@ -259,6 +259,9 @@ feature 'Users' do
end end
scenario 'User can display public page' do scenario 'User can display public page' do
proposal = create(:proposal, tag_list: "Sport")
create(:follow, :followed_proposal, followable: proposal, user: @user)
login_as(@user) login_as(@user)
visit account_path visit account_path
@@ -267,22 +270,29 @@ feature 'Users' do
logout logout
visit user_path(@user) visit user_path(@user, filter: 'follows', page: '1')
expect(page).to have_css('#public_interests') expect(page).to have_css('#public_interests')
end end
scenario 'Is always visible for the owner' do scenario 'Is always visible for the owner' do
proposal = create(:proposal, tag_list: "Sport")
create(:follow, :followed_proposal, followable: proposal, user: @user)
login_as(@user) login_as(@user)
visit account_path visit account_path
uncheck 'account_public_interests' uncheck 'account_public_interests'
click_button 'Save changes' click_button 'Save changes'
visit user_path(@user) visit user_path(@user, filter: 'follows', page: '1')
expect(page).to have_css('#public_interests') expect(page).to have_css('#public_interests')
end end
scenario 'Is always visible for admins' do scenario 'Is always visible for admins' do
proposal = create(:proposal, tag_list: "Sport")
create(:follow, :followed_proposal, followable: proposal, user: @user)
login_as(@user) login_as(@user)
visit account_path visit account_path
@@ -292,11 +302,14 @@ feature 'Users' do
logout logout
login_as(create(:administrator).user) login_as(create(:administrator).user)
visit user_path(@user) visit user_path(@user, filter: 'follows', page: '1')
expect(page).to have_css('#public_interests') expect(page).to have_css('#public_interests')
end end
scenario 'Is always visible for moderators' do scenario 'Is always visible for moderators' do
proposal = create(:proposal, tag_list: "Sport")
create(:follow, :followed_proposal, followable: proposal, user: @user)
login_as(@user) login_as(@user)
visit account_path visit account_path
@@ -306,38 +319,29 @@ feature 'Users' do
logout logout
login_as(create(:moderator).user) login_as(create(:moderator).user)
visit user_path(@user) visit user_path(@user, filter: 'follows', page: '1')
expect(page).to have_css('#public_interests') expect(page).to have_css('#public_interests')
end end
scenario 'Should display generic interests title' do scenario 'Should display generic interests title' do
@user.update(public_interests: true) proposal = create(:proposal, tag_list: "Sport")
visit user_path(@user) create(:follow, :followed_proposal, followable: proposal, user: @user)
expect(page).to have_content("List of interests (tags of elements this user follows)") @user.update(public_interests: true)
visit user_path(@user, filter: 'follows', page: '1')
expect(page).to have_content("Tags of elements this user follows")
end end
scenario 'Should display custom interests title when user is visiting own user page' do scenario 'Should display custom interests title when user is visiting own user page' do
proposal = create(:proposal, tag_list: "Sport")
create(:follow, :followed_proposal, followable: proposal, user: @user)
@user.update(public_interests: true) @user.update(public_interests: true)
login_as(@user) login_as(@user)
visit user_path(@user) visit user_path(@user, filter: 'follows', page: '1')
expect(page).to have_content("List of interests (tags of elements you follow)") expect(page).to have_content("Tags of elements you follow")
end
scenario 'Should display generic empty interests list message when visited user has not interests defined' do
@user.update(public_interests: true)
visit user_path(@user)
expect(page).to have_content("This user does not follow any elements yet.")
end
scenario 'Should display custom empty interests list message when user has not interests defined and user is visiting own user page' do
@user.update(public_interests: true)
login_as(@user)
visit user_path(@user)
expect(page).to have_content("You do not follow any elements yet.")
end end
end end
@@ -418,22 +422,22 @@ feature 'Users' do
expect(page).to have_content('1 Following') expect(page).to have_content('1 Following')
end end
scenario 'Display accordion proposal tab when user is following one proposal at least' do scenario 'Display proposal tab when user is following one proposal at least' do
proposal = create(:proposal) proposal = create(:proposal)
create(:follow, followable: proposal, user: @user) create(:follow, followable: proposal, user: @user)
visit user_path(@user, filter: "follows") visit user_path(@user, filter: "follows")
expect(page).to have_link('Citizen proposals', href: "#") expect(page).to have_link('Citizen proposals', href: "#citizen_proposals")
end end
scenario 'Not display accordion proposal tab when user is not following any proposal' do scenario 'Not display proposal tab when user is not following any proposal' do
visit user_path(@user, filter: "follows") visit user_path(@user, filter: "follows")
expect(page).not_to have_link('Citizen proposals', href: "#") expect(page).not_to have_link('Citizen proposals', href: "#citizen_proposals")
end end
scenario 'Display proposal with action buttons inside accordion proposal tab when current user is proposal author', :js do scenario 'Display proposals with link to proposal' do
proposal = create(:proposal, author: @user) proposal = create(:proposal, author: @user)
create(:follow, followable: proposal, user: @user) create(:follow, followable: proposal, user: @user)
login_as @user login_as @user
@@ -442,35 +446,7 @@ feature 'Users' do
click_link 'Citizen proposals' click_link 'Citizen proposals'
expect(page).to have_content proposal.title expect(page).to have_content proposal.title
expect(page).to have_link "Send notification"
expect(page).to have_link "Retire"
end end
scenario 'Display proposal with action buttons inside accordion proposal tab when there is no logged user', :js do
proposal = create(:proposal, author: @user)
create(:follow, followable: proposal, user: @user)
visit user_path(@user, filter: "follows")
click_link 'Citizen proposals'
expect(page).to have_content proposal.title
expect(page).not_to have_link "Send notification"
expect(page).not_to have_link "Retire"
end
scenario 'Display proposal without action buttons inside accordion proposal tab when current user is not proposal author', :js do
proposal = create(:proposal)
create(:follow, followable: proposal, user: @user)
login_as @user
visit user_path(@user, filter: "follows")
click_link 'Citizen proposals'
expect(page).to have_content proposal.title
expect(page).not_to have_link "Send notification"
expect(page).not_to have_link "Retire"
end
end end
describe 'Budget Investments' do describe 'Budget Investments' do
@@ -484,35 +460,22 @@ feature 'Users' do
expect(page).to have_content('1 Following') expect(page).to have_content('1 Following')
end end
scenario 'Display accordion budget investment tab when user is following one budget investment at least' do scenario 'Display budget investment tab when user is following one budget investment at least' do
budget_investment = create(:budget_investment) budget_investment = create(:budget_investment)
create(:follow, followable: budget_investment, user: @user) create(:follow, followable: budget_investment, user: @user)
visit user_path(@user, filter: "follow") visit user_path(@user, filter: "follows")
expect(page).to have_link('Investments', href: "#") expect(page).to have_link('Investments', href: "#investments")
end end
scenario 'Not display accordion budget investment tab when user is not following any budget investment' do scenario 'Not display budget investment tab when user is not following any budget investment' do
visit user_path(@user, filter: "follow") visit user_path(@user, filter: "follows")
expect(page).not_to have_link('Investments', href: "#") expect(page).not_to have_link('Investments', href: "#investments")
end end
scenario 'Display budget investment with action buttons inside accordion budget investment tab when current user is a verified user and author', :js do scenario 'Display budget investment with link to budget investment' do
user = create(:user, :level_two)
budget_investment = create(:budget_investment, author: user)
create(:follow, followable: budget_investment, user: user)
login_as user
visit user_path(user, filter: "follows")
click_link 'Investments'
expect(page).to have_link budget_investment.title
expect(page).to have_link "Delete"
end
scenario 'Display budget investment with action buttons inside accordion budget investment tab when there is no logged user', :js do
user = create(:user, :level_two) user = create(:user, :level_two)
budget_investment = create(:budget_investment, author: user) budget_investment = create(:budget_investment, author: user)
create(:follow, followable: budget_investment, user: user) create(:follow, followable: budget_investment, user: user)
@@ -521,22 +484,7 @@ feature 'Users' do
click_link 'Investments' click_link 'Investments'
expect(page).to have_link budget_investment.title expect(page).to have_link budget_investment.title
expect(page).not_to have_link "Delete"
end end
scenario 'Display budget investment without action buttons inside accordion budget investment tab when current user is not budget investment author', :js do
user = create(:user, :level_two)
budget_investment = create(:budget_investment)
create(:follow, followable: budget_investment, user: user)
login_as user
visit user_path(user, filter: "follows")
click_link 'Investments'
expect(page).to have_link budget_investment.title
expect(page).not_to have_link "Delete"
end
end end
end end

View File

@@ -28,7 +28,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
visit send(followable_path, arguments) visit send(followable_path, arguments)
within "##{dom_id(followable)}" do within "##{dom_id(followable)}" do
expect(page).to have_link("Follow") expect(page).to have_link("Follow #{followable.model_name.human.downcase}")
end end
end end
@@ -37,8 +37,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
login_as(user) login_as(user)
visit send(followable_path, arguments) visit send(followable_path, arguments)
expect(page).to have_link("Follow #{followable.model_name.human.downcase}")
expect(page).to have_link("Follow")
end end
scenario "Should display unfollow after user clicks on follow button", :js do scenario "Should display unfollow after user clicks on follow button", :js do
@@ -47,10 +46,10 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
visit send(followable_path, arguments) visit send(followable_path, arguments)
within "##{dom_id(followable)}" do within "##{dom_id(followable)}" do
click_link "Follow" click_link("Follow #{followable.model_name.human.downcase}")
expect(page).not_to have_link "Follow" expect(page).not_to have_link("Follow")
expect(page).to have_link "Unfollow" expect(page).to have_link("Following")
end end
end end
@@ -60,7 +59,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
visit send(followable_path, arguments) visit send(followable_path, arguments)
within "##{dom_id(followable)}" do within "##{dom_id(followable)}" do
click_link "Follow" click_link("Follow #{followable.model_name.human.downcase}")
end end
expect(page).to have_content strip_tags(t("shared.followable.#{followable_class_name}.create.notice_html")) expect(page).to have_content strip_tags(t("shared.followable.#{followable_class_name}.create.notice_html"))
@@ -73,7 +72,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
visit send(followable_path, arguments) visit send(followable_path, arguments)
expect(page).to have_link("Unfollow") expect(page).to have_link("Following")
end end
scenario "Should update follow button and show destroy notice after user clicks on unfollow button", :js do scenario "Should update follow button and show destroy notice after user clicks on unfollow button", :js do
@@ -83,10 +82,10 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
visit send(followable_path, arguments) visit send(followable_path, arguments)
within "##{dom_id(followable)}" do within "##{dom_id(followable)}" do
click_link "Unfollow" click_link("Unfollow #{followable.model_name.human.downcase}")
expect(page).not_to have_link "Unfollow" expect(page).not_to have_link("Unfollow")
expect(page).to have_link "Follow" expect(page).to have_link("Follow #{followable.model_name.human.downcase}")
end end
end end
@@ -97,7 +96,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
visit send(followable_path, arguments) visit send(followable_path, arguments)
within "##{dom_id(followable)}" do within "##{dom_id(followable)}" do
click_link "Unfollow" click_link("Unfollow #{followable.model_name.human.downcase}")
end end
expect(page).to have_content strip_tags(t("shared.followable.#{followable_class_name}.destroy.notice_html")) expect(page).to have_content strip_tags(t("shared.followable.#{followable_class_name}.destroy.notice_html"))

View File

@@ -9,6 +9,9 @@ shared_examples "nested imageable" do |imageable_factory_name, path, imageable_p
let!(:imageable) { create(imageable_factory_name) } let!(:imageable) { create(imageable_factory_name) }
before do before do
Setting['feature.allow_images'] = true
imageable_path_arguments&.each do |argument_name, path_to_value| imageable_path_arguments&.each do |argument_name, path_to_value|
arguments.merge!("#{argument_name}": imageable.send(path_to_value)) arguments.merge!("#{argument_name}": imageable.send(path_to_value))
end end
@@ -16,6 +19,10 @@ shared_examples "nested imageable" do |imageable_factory_name, path, imageable_p
imageable.update(author: user) if imageable.respond_to?(:author) imageable.update(author: user) if imageable.respond_to?(:author)
end end
after do
Setting['feature.allow_images'] = nil
end
describe "at #{path}" do describe "at #{path}" do
scenario "Should show new image link when imageable has not an associated image defined" do scenario "Should show new image link when imageable has not an associated image defined" do