Files
nairobi/app/views/proposals/index.html.erb
Javi Martín 2b962f2789 Use a <main> tag on every page
Many pages had this tag, but many other didn't, which made navigation
inconsistent for people using screen readers.

Note that there are slight changes in two pages:

* The homepage now includes the banner and the content of the
  `shared/header` element inside the <main> tag
* The budgets index now includes the banner inside the <main> tag

I see both potential advantages and disadvantages of this approach,
since banners aren't necessarily related to the main content of a page
but on the other hand they aren't the same across pages and people using
screen readers might accidentally skip them if they jump to the <main>
tag.

So I'm choosing the option that is easier to implement.

Note we're adding a `public-content` class to the <main> element in the
application layout. This might be redundat because the element could
already be accessed through the `.public main` selector, but this is
consistent with the `admin-content` class used in the admin section, and
without it the <main> element would sometimes have an empty class
attribute and we'd have to use `if content_for?(:main_class)` or
`tag.main` which IMHO makes the code less consistent.

The Capybara::DSL monkey-patch is only done on the `visit` method
because it's the only reliable one. Other methods like `click_link`
generate AJAX requests, so `expect(page).to have_css "main", count: 1`
might be executed before the AJAX request is finished, meaning it
wouldn't properly test anything.
2024-03-23 00:35:43 +01:00

128 lines
4.2 KiB
Plaintext

<% provide :title do %><%= t("proposals.index.title") %><% end %>
<% content_for :header_addon do %>
<%= render "shared/search_form",
search_path: proposals_path(page: 1),
i18n_namespace: "proposals.index.search_form" %>
<% end %>
<% content_for :canonical do %>
<%= render "shared/canonical", href: proposals_url %>
<% end %>
<% if [
@search_terms,
@advanced_search_terms,
params[:retired].present?,
params[:selected].present?
].any? %>
<%= render Shared::SearchResultsSummaryComponent.new(
results: @proposals,
search_terms: @search_terms,
advanced_search_terms: @advanced_search_terms
) do %>
<% if params[:retired].present? %>
<h2><%= t("proposals.index.retired_proposals") %></h2>
<% elsif params[:selected].present? %>
<h2><%= t("proposals.index.selected_proposals") %></h2>
<% end %>
<% end %>
<% else %>
<%= render "shared/section_header", i18n_namespace: "proposals.index.section_header", image: "proposals" %>
<% end %>
<% if show_recommended_proposals? %>
<%= render "shared/recommended_index", recommended: @recommended_proposals,
disable_recommendations_path: recommendations_disable_proposals_path,
namespace: "proposals" %>
<% end %>
<div class="row">
<div id="proposals" class="proposals-list small-12 medium-9 column">
<%= render Shared::BannerComponent.new("proposals") %>
<% if show_featured_proposals? %>
<div id="featured-proposals" class="row featured-proposals">
<div class="small-12 column">
<h2>
<%= t("proposals.index.featured_proposals") %>
</h2>
</div>
<% @featured_proposals.each do |featured_proposal| %>
<%= render "featured_proposal", proposal: featured_proposal %>
<% end %>
</div>
<% end %>
<% unless params[:selected].present? %>
<div class="row">
<div class="small-12 column">
<%= render "view_mode" %>
</div>
</div>
<% end %>
<% unless params[:retired].present? || params[:selected].present? %>
<%= render Shared::AdvancedSearchComponent.new %>
<% end %>
<% unless params[:selected].present? %>
<%= render "shared/order_links", i18n_namespace: "proposals.index" %>
<% end %>
<% if @proposals.any? %>
<div class="show-for-small-only">
<%= link_to t("proposals.index.start_proposal"),
new_proposal_path,
class: "button expanded" %>
</div>
<% end %>
<div id="proposals-list">
<% if @proposals.any? || current_user.blank? %>
<% if proposals_default_view? %>
<%= render partial: "proposals/proposal", collection: @proposals %>
<% else %>
<% @proposals.each do |proposal| %>
<%= render "/proposals/proposal_minimal", proposal: proposal %>
<% end %>
<% end %>
<% else %>
<%= empty_recommended_proposals_message_text(current_user) %>
<% end %>
<%= paginate @proposals %>
<% unless @search_terms || @advanced_search_terms %>
<div id="section_help" class="margin" data-magellan-target="section_help">
<p class="lead">
<strong><%= t("proposals.index.section_footer.title") %></strong>
</p>
<p><%= t("proposals.index.section_footer.description") %></p>
</div>
<% end %>
</div>
</div>
<div class="small-12 medium-3 column">
<aside class="margin-bottom">
<%= link_to t("proposals.index.start_proposal"),
new_proposal_path,
class: "button expanded" %>
<div class="sidebar-divider"></div>
<h2 class="sidebar-title"><%= t("proposals.index.selected_proposals") %></h2>
<br>
<p class="small">
<%= link_to t("proposals.index.selected_proposals_link"), proposals_path(selected: "all") %>
</p>
<% if params[:retired].blank? %>
<%= render "categories" %>
<%= render "shared/tag_cloud", taggable: "Proposal" %>
<%= render Proposals::GeozonesComponent.new %>
<% end %>
<%= render "retired" %>
<%= render "proposals_lists" %>
</aside>
</div>
</div>