diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index bc9d05e48..4f6d1f7a4 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -168,7 +168,7 @@ body.admin { clear: both; .checkbox { - font-size: rem-calc(12); + font-size: $small-font-size; } } diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index 26931ef86..55f8e5456 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -378,39 +378,59 @@ header { padding-bottom: 0; } - a { - color: white; - display: inline-block; - line-height: rem-calc(46); - position: relative; - text-align: left; - width: 100%; - - @media (min-width: $small-breakpoint) { - color: $text; - font-weight: bold; - margin-right: $line-height*1.5; - margin-right: 12px\9; - width: auto; - - &:hover { - color: $link; - } - } - - &.active { - color: white; + ul { + list-style-type: none; + margin: 0; + li { @media (min-width: $small-breakpoint) { - border-bottom: 2px solid $brand; - color: $brand; + display: inline-block; + margin-right: rem-calc(36); + } + + a { + color: white; + display: inline-block; + line-height: $line-height*2; + position: relative; + text-align: left; + width: 100%; + + @media (min-width: $small-breakpoint) { + color: $text; + display: block; + font-weight: bold; + margin-left: 18px\9; + margin-right: 18px\9; + width: auto; + + &:hover { + color: $link; + } + } + + &.active { + color: white; + + @media (min-width: $small-breakpoint) { + border-bottom: 2px solid $brand; + color: $brand; + } + } } } } + span { + color: $border; + } + .input-group { - margin-bottom: 0; padding-top: $line-height/4; + + @media (min-width: $small-breakpoint) { + margin-bottom: 0; + } } .input-group-field { @@ -606,6 +626,12 @@ form.locale-form { display: inline-block; position: relative; + label { + color: white; + font-size: $small-font-size; + font-weight: normal; + } + select { background-image: image-url("language_select.png"); background-origin: border-box; @@ -628,6 +654,7 @@ form.locale-form { outline: none; padding-left: rem-calc(3); padding-right: $line-height; + width: auto; } } } @@ -641,6 +668,10 @@ form { line-height: $line-height; } + fieldset legend { + font-weight: bold; + } + input, textarea { height: 48px\9; line-height: 48px\9; @@ -648,13 +679,28 @@ form { width: 100%\9; } - input[type="checkbox"] { + input[type="checkbox"], + input[type="radio"] { height: auto\9; line-height: inherit\9; width: auto\9; } - input[type]:not([type=submit]):not([type=file]):not([type=checkbox]) { + input[type="radio"] { + height: $line-height !important; + vertical-align: top; + width: 18px\9; + + + label { + font-weight: normal; + } + + &:checked + label { + font-weight: bold; + } + } + + input[type]:not([type=submit]):not([type=file]):not([type=checkbox]):not([type=radio]) { background: $input-bg; height: $line-height*2; margin-bottom: rem-calc(16); @@ -1035,10 +1081,15 @@ img.avatar, img.admin-avatar, img.moderator-avatar, img.initialjs-avatar { // - - - - - - - - - - - - - - - - - - - - - - - - - table { + border: $border; border-collapse: collapse; border-spacing: 0; width: 100%; + th { + background: #f8f9fb; + } + tr { td { @@ -1047,7 +1098,11 @@ table { } &:nth-child(odd) { - background: #F0F2F6; + background: white; + } + + &:nth-child(even) { + background: #fafcfb; } } diff --git a/app/controllers/valuation/base_controller.rb b/app/controllers/valuation/base_controller.rb new file mode 100644 index 000000000..fb42fb694 --- /dev/null +++ b/app/controllers/valuation/base_controller.rb @@ -0,0 +1,15 @@ +class Valuation::BaseController < ApplicationController + layout 'admin' + + before_action :authenticate_user! + before_action :verify_valuator + + skip_authorization_check + + private + + def verify_valuator + raise CanCan::AccessDenied unless current_user.try(:valuator?) || current_user.try(:administrator?) + end + +end diff --git a/app/controllers/valuation/spending_proposals_controller.rb b/app/controllers/valuation/spending_proposals_controller.rb new file mode 100644 index 000000000..f5074ab1e --- /dev/null +++ b/app/controllers/valuation/spending_proposals_controller.rb @@ -0,0 +1,38 @@ +class Valuation::SpendingProposalsController < Valuation::BaseController + include FeatureFlags + feature_flag :spending_proposals + + before_action :restrict_access_to_assigned_items, only: [:show, :edit, :valuate] + + has_filters %w{valuating valuation_finished}, only: :index + + load_and_authorize_resource + + def index + if current_user.valuator? + @spending_proposals = SpendingProposal.search(params_for_current_valuator, @current_filter).order(created_at: :desc).page(params[:page]) + else + @spending_proposals = SpendingProposal.none.page(params[:page]) + end + end + + def valuate + @spending_proposal.update_attributes(valuation_params) + redirect_to valuation_spending_proposal_path(@spending_proposal), notice: t('valuation.spending_proposals.notice.valuate') + end + + private + + def valuation_params + params.require(:spending_proposal).permit(:price, :price_first_year, :price_explanation, :feasible, :feasible_explanation, :time_scope, :valuation_finished, :internal_comments) + end + + def params_for_current_valuator + params.merge({valuator_id: current_user.valuator.id}) + end + + def restrict_access_to_assigned_items + raise ActionController::RoutingError.new('Not Found') unless current_user.administrator? || ValuationAssignment.exists?(spending_proposal_id: params[:id], valuator_id: current_user.valuator.id) + end + +end diff --git a/app/helpers/text_with_links_helper.rb b/app/helpers/text_with_links_helper.rb index fe726c51e..ac965dafa 100644 --- a/app/helpers/text_with_links_helper.rb +++ b/app/helpers/text_with_links_helper.rb @@ -11,4 +11,8 @@ module TextWithLinksHelper Rinku.auto_link(html, :all, 'target="_blank" rel="nofollow"').html_safe end + def simple_format_no_tags_no_sanitize(html) + simple_format(html, {}, sanitize: false) + end + end diff --git a/app/helpers/valuation_helper.rb b/app/helpers/valuation_helper.rb new file mode 100644 index 000000000..9e3a054c1 --- /dev/null +++ b/app/helpers/valuation_helper.rb @@ -0,0 +1,30 @@ +module ValuationHelper + + def valuator_select_options(valuator=nil) + if valuator.present? + Valuator.where.not(id: valuator.id).order('users.username asc').includes(:user).collect { |v| [ v.name, v.id ] }.prepend([valuator.name, valuator.id]) + else + Valuator.all.order('users.username asc').includes(:user).collect { |v| [ v.name, v.id ] } + end + end + + def assigned_valuators_info(valuators) + case valuators.size + when 0 + t("valuation.spending_proposals.index.no_valuators_assigned") + when 1 + "".html_safe + + valuators.first.name + + "".html_safe + else + "".html_safe + + t('valuation.spending_proposals.index.valuators_assigned', count: valuators.size) + + "".html_safe + end + end + + def explanation_field(field) + simple_format_no_tags_no_sanitize(safe_html_with_links(field.html_safe)) if field.present? + end + +end \ No newline at end of file diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index 6bf2b0b53..49184c447 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -4,6 +4,7 @@ module Abilities def initialize(user) self.merge Abilities::Moderation.new(user) + self.merge Abilities::Valuator.new(user) can :restore, Comment cannot :restore, Comment, hidden_at: nil diff --git a/app/models/spending_proposal.rb b/app/models/spending_proposal.rb index 3716c4086..6c8c3c8a1 100644 --- a/app/models/spending_proposal.rb +++ b/app/models/spending_proposal.rb @@ -36,6 +36,7 @@ class SpendingProposal < ActiveRecord::Base results = results.by_geozone(params[:geozone_id]) if params[:geozone_id].present? results = results.by_administrator(params[:administrator_id]) if params[:administrator_id].present? results = results.by_tag(params[:tag_name]) if params[:tag_name].present? + results = results.by_valuator(params[:valuator_id]) if params[:valuator_id].present? results = results.send(current_filter) if current_filter.present? results.for_render end @@ -52,10 +53,15 @@ class SpendingProposal < ActiveRecord::Base where(administrator_id: administrator.presence) end + def self.by_tag(tag_name) tagged_with(tag_name) end + def self.by_valuator(valuator) + joins(:valuation_assignments).includes(:valuators).where("valuation_assignments.valuator_id = ?", valuator.presence) + end + def feasibility case feasible when true diff --git a/app/views/admin/spending_proposals/show.html.erb b/app/views/admin/spending_proposals/show.html.erb index 29ba0b958..18e3eec5e 100644 --- a/app/views/admin/spending_proposals/show.html.erb +++ b/app/views/admin/spending_proposals/show.html.erb @@ -76,6 +76,10 @@
<%= t("admin.spending_proposals.show.price") %> (<%= t("admin.spending_proposals.show.currency") %>): <%= @spending_proposal.price.present? ? @spending_proposal.price : t("admin.spending_proposals.show.undefined") %>
+<%= t("admin.spending_proposals.show.price_first_year") %> (<%= t("admin.spending_proposals.show.currency") %>): + <%= @spending_proposal.price_first_year.present? ? @spending_proposal.price_first_year : t("admin.spending_proposals.show.undefined") %> +
+ <%= simple_format(safe_html_with_links(@spending_proposal.price_explanation.html_safe), {}, sanitize: false) if @spending_proposal.price_explanation.present? %><%= t("admin.spending_proposals.show.feasibility") %>: diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index 2dc9cbbaa..2ed045df1 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -43,7 +43,7 @@