Merge pull request #4902 from consul/permission_list_accessibility
Add account permissions hint for screen reader users
This commit is contained in:
31
app/assets/stylesheets/account/permissions_list.scss
Normal file
31
app/assets/stylesheets/account/permissions_list.scss
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
.permissions-list {
|
||||||
|
list-style-type: none;
|
||||||
|
margin-bottom: 0;
|
||||||
|
margin-left: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
font-size: $small-font-size;
|
||||||
|
margin-bottom: $line-height / 2;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin-#{$global-right}: 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.permission-allowed {
|
||||||
|
@include has-fa-icon(check, solid);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
color: $check;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.permission-denied {
|
||||||
|
@include has-fa-icon(times, solid);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
color: $delete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -525,32 +525,6 @@ code {
|
|||||||
// 05. Management
|
// 05. Management
|
||||||
// --------------
|
// --------------
|
||||||
|
|
||||||
.user-permissions {
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style-type: none;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
li {
|
|
||||||
font-size: rem-calc(14);
|
|
||||||
margin-bottom: rem-calc(12);
|
|
||||||
|
|
||||||
span {
|
|
||||||
color: $text-medium;
|
|
||||||
font-size: rem-calc(12);
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-check {
|
|
||||||
color: $check;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-x {
|
|
||||||
color: $delete;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-info,
|
.account-info,
|
||||||
.login-as {
|
.login-as {
|
||||||
background-color: $highlight;
|
background-color: $highlight;
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
@import "stats";
|
@import "stats";
|
||||||
@import "sticky_overrides";
|
@import "sticky_overrides";
|
||||||
@import "tags";
|
@import "tags";
|
||||||
|
@import "account/**/*";
|
||||||
@import "admin/**/*";
|
@import "admin/**/*";
|
||||||
@import "budgets/**/*";
|
@import "budgets/**/*";
|
||||||
@import "debates/**/*";
|
@import "debates/**/*";
|
||||||
|
|||||||
@@ -1278,30 +1278,6 @@ form {
|
|||||||
font-size: rem-calc(12);
|
font-size: rem-calc(12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style-type: none;
|
|
||||||
margin-bottom: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
li {
|
|
||||||
font-size: $small-font-size;
|
|
||||||
margin-bottom: $line-height / 2;
|
|
||||||
|
|
||||||
span {
|
|
||||||
color: $text-medium;
|
|
||||||
font-size: rem-calc(12);
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-check {
|
|
||||||
color: $check;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-x {
|
|
||||||
color: $delete;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.notifications-list {
|
.notifications-list {
|
||||||
|
|||||||
11
app/components/account/permissions_list_component.html.erb
Normal file
11
app/components/account/permissions_list_component.html.erb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<ul class="permissions-list">
|
||||||
|
<% permissions.each do |text, allowed| %>
|
||||||
|
<li class="<%= allowed_class(allowed) %>">
|
||||||
|
<% unless allowed %>
|
||||||
|
<span class="show-for-sr"><%= t("verification.verification_needed") %></span>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= text %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
26
app/components/account/permissions_list_component.rb
Normal file
26
app/components/account/permissions_list_component.rb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
class Account::PermissionsListComponent < ApplicationComponent
|
||||||
|
attr_reader :user
|
||||||
|
|
||||||
|
def initialize(user)
|
||||||
|
@user = user
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def permissions
|
||||||
|
{
|
||||||
|
t("verification.user_permission_debates") => true,
|
||||||
|
t("verification.user_permission_proposal") => true,
|
||||||
|
t("verification.user_permission_support_proposal") => user.level_two_or_three_verified?,
|
||||||
|
t("verification.user_permission_votes") => user.level_three_verified?
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def allowed_class(allowed)
|
||||||
|
if allowed
|
||||||
|
"permission-allowed"
|
||||||
|
else
|
||||||
|
"permission-denied"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
class Management::UsersController < Management::BaseController
|
class Management::UsersController < Management::BaseController
|
||||||
def new
|
def new
|
||||||
@user = User.new(user_params)
|
@user = User.new(user_params.merge(verified_at: Time.current))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
|||||||
@@ -93,26 +93,7 @@
|
|||||||
|
|
||||||
<p><%= t("account.show.user_permission_info") %></p>
|
<p><%= t("account.show.user_permission_info") %></p>
|
||||||
|
|
||||||
<ul>
|
<%= render Account::PermissionsListComponent.new(current_user) %>
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_debates") %></li>
|
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_proposal") %></li>
|
|
||||||
<li>
|
|
||||||
<% if current_user.level_two_or_three_verified? %>
|
|
||||||
<span class="icon-check"></span>
|
|
||||||
<% else %>
|
|
||||||
<span class="icon-x"></span>
|
|
||||||
<% end %>
|
|
||||||
<%= t("verification.user_permission_support_proposal") %>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<% if current_user.level_three_verified? %>
|
|
||||||
<span class="icon-check"></span>
|
|
||||||
<% else %>
|
|
||||||
<span class="icon-x"></span>
|
|
||||||
<% end %>
|
|
||||||
<%= t("verification.user_permission_votes") %>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= t("account.show.user_permission_verify") %>
|
<%= t("account.show.user_permission_verify") %>
|
||||||
|
|||||||
@@ -1,18 +1,5 @@
|
|||||||
<%# # Parameters:
|
|
||||||
# message: A string explaining the permissions
|
|
||||||
# permissions: An array of symbols containing the permissions
|
|
||||||
# (can be :debates, :proposal, :support_proposal, :votes) %>
|
|
||||||
<div class="user-permissions">
|
<div class="user-permissions">
|
||||||
|
|
||||||
<p><%= message %></p>
|
<p><%= message %></p>
|
||||||
|
|
||||||
<ul>
|
<%= render Account::PermissionsListComponent.new(user) %>
|
||||||
<% [:debates, :proposal, :support_proposal, :votes].each do |permission| %>
|
|
||||||
<li>
|
|
||||||
<span class="<%= permissions.include?(permission) ? "icon-check" : "icon-x" %>"></span>
|
|
||||||
<%= t("verification.user_permission_#{permission}") %>
|
|
||||||
</li>
|
|
||||||
<% end %>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<%= render "management/user_permissions",
|
<%= render "management/user_permissions",
|
||||||
message: t("management.document_verifications.not_in_census_info"),
|
message: t("management.document_verifications.not_in_census_info"),
|
||||||
permissions: [:debates, :proposal] %>
|
user: User.new %>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%= sanitize(t("management.document_verifications.has_no_account",
|
<%= sanitize(t("management.document_verifications.has_no_account",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<%= render "management/user_permissions",
|
<%= render "management/user_permissions",
|
||||||
message: t("management.document_verifications.in_census_has_following_permissions"),
|
message: t("management.document_verifications.in_census_has_following_permissions"),
|
||||||
permissions: [:debates, :proposal, :support_proposal] %>
|
user: @document_verification.user %>
|
||||||
|
|
||||||
<%= form_for @document_verification,
|
<%= form_for @document_verification,
|
||||||
as: :document_verification,
|
as: :document_verification,
|
||||||
|
|||||||
@@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
<%= render "management/user_permissions",
|
<%= render "management/user_permissions",
|
||||||
message: t("management.document_verifications.in_census_has_following_permissions"),
|
message: t("management.document_verifications.in_census_has_following_permissions"),
|
||||||
permissions: [:debates, :proposal, :support_proposal, :votes] %>
|
user: @document_verification.user %>
|
||||||
|
|
||||||
<a href="javascript:window.print();" class="button warning"><%= t("management.print_info") %></a>
|
<a href="javascript:window.print();" class="button warning"><%= t("management.print_info") %></a>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<%= render "management/user_permissions",
|
<%= render "management/user_permissions",
|
||||||
message: t("management.email_verifications.document_found_in_census"),
|
message: t("management.email_verifications.document_found_in_census"),
|
||||||
permissions: [:debates, :proposal, :support_proposal, :votes] %>
|
user: @email_verification.user %>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="javascript:window.print();" class="button warning"><%= t("management.print_info") %></a>
|
<a href="javascript:window.print();" class="button warning"><%= t("management.print_info") %></a>
|
||||||
|
|||||||
@@ -25,6 +25,6 @@
|
|||||||
<div class="callout">
|
<div class="callout">
|
||||||
<%= render "management/user_permissions",
|
<%= render "management/user_permissions",
|
||||||
message: t("management.document_verifications.in_census_has_following_permissions"),
|
message: t("management.document_verifications.in_census_has_following_permissions"),
|
||||||
permissions: [:debates, :proposal, :support_proposal, :votes] %>
|
user: @user %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,6 +6,6 @@
|
|||||||
|
|
||||||
<%= render "management/user_permissions",
|
<%= render "management/user_permissions",
|
||||||
message: t("management.document_verifications.in_census_has_following_permissions"),
|
message: t("management.document_verifications.in_census_has_following_permissions"),
|
||||||
permissions: [:debates, :proposal, :support_proposal, :votes] %>
|
user: @user %>
|
||||||
|
|
||||||
<a href="javascript:window.print();" class="button warning radius"><%= t("management.print_info") %></a>
|
<a href="javascript:window.print();" class="button warning radius"><%= t("management.print_info") %></a>
|
||||||
|
|||||||
@@ -24,15 +24,9 @@
|
|||||||
<h1><%= t("verification.letter.new.title") %></h1>
|
<h1><%= t("verification.letter.new.title") %></h1>
|
||||||
|
|
||||||
<div class="user-permissions">
|
<div class="user-permissions">
|
||||||
|
|
||||||
<p><%= t("verification.letter.new.user_permission_info") %></p>
|
<p><%= t("verification.letter.new.user_permission_info") %></p>
|
||||||
|
|
||||||
<ul>
|
<%= render Account::PermissionsListComponent.new(current_user) %>
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_debates") %></li>
|
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_proposal") %></li>
|
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_support_proposal") %></li>
|
|
||||||
<li><span class="icon-x"></span> <%= t("verification.user_permission_votes") %></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= link_to t("verification.letter.new.go_to_index"), root_path, class: "button warning" %>
|
<%= link_to t("verification.letter.new.go_to_index"), root_path, class: "button warning" %>
|
||||||
|
|||||||
@@ -24,12 +24,7 @@
|
|||||||
<div class="user-permissions small-12">
|
<div class="user-permissions small-12">
|
||||||
<p><%= t("verification.user_permission_info") %></p>
|
<p><%= t("verification.user_permission_info") %></p>
|
||||||
|
|
||||||
<ul>
|
<%= render Account::PermissionsListComponent.new(User.new(level_two_verified_at: Time.current)) %>
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_debates") %></li>
|
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_proposal") %></li>
|
|
||||||
<li><span class="icon-check"></span> <%= t("verification.user_permission_support_proposal") %></li>
|
|
||||||
<li><span class="icon-x"></span> <%= t("verification.user_permission_votes") %></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= form_for @residence, as: "residence", url: residence_path do |f| %>
|
<%= form_for @residence, as: "residence", url: residence_path do |f| %>
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ en:
|
|||||||
user_permission_proposal: Create new proposals
|
user_permission_proposal: Create new proposals
|
||||||
user_permission_support_proposal: Support proposals
|
user_permission_support_proposal: Support proposals
|
||||||
user_permission_votes: Vote for budget projects
|
user_permission_votes: Vote for budget projects
|
||||||
|
verification_needed: Additional verification needed
|
||||||
verified_user:
|
verified_user:
|
||||||
form:
|
form:
|
||||||
submit_button: Send code
|
submit_button: Send code
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ es:
|
|||||||
user_permission_proposal: Crear nuevas propuestas
|
user_permission_proposal: Crear nuevas propuestas
|
||||||
user_permission_support_proposal: Apoyar propuestas
|
user_permission_support_proposal: Apoyar propuestas
|
||||||
user_permission_votes: Votar proyectos en los presupuestos participativos
|
user_permission_votes: Votar proyectos en los presupuestos participativos
|
||||||
|
verification_needed: Verificación adicional necesaria
|
||||||
verified_user:
|
verified_user:
|
||||||
form:
|
form:
|
||||||
submit_button: Enviar código
|
submit_button: Enviar código
|
||||||
|
|||||||
17
spec/components/account/permissions_list_component_spec.rb
Normal file
17
spec/components/account/permissions_list_component_spec.rb
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
describe Account::PermissionsListComponent do
|
||||||
|
it "adds different classes for actions that can and cannot be performed" do
|
||||||
|
render_inline Account::PermissionsListComponent.new(User.new)
|
||||||
|
|
||||||
|
expect(page).to have_css "li.permission-allowed", text: "Participate in debates"
|
||||||
|
expect(page).to have_css "li.permission-denied", text: "Support proposals"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "adds a hint when an action cannot be performed" do
|
||||||
|
render_inline Account::PermissionsListComponent.new(User.new)
|
||||||
|
|
||||||
|
expect(page).to have_css "li", exact_text: "Additional verification needed Support proposals", normalize_ws: true
|
||||||
|
expect(page).to have_css "li", exact_text: "Participate in debates", normalize_ws: true
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user