Add historic fields to participatory budget
This commit is contained in:
@@ -86,6 +86,7 @@
|
||||
//= require settings
|
||||
//= require cookies
|
||||
//= require columns_selector
|
||||
//= require budget_edit_associations.js.coffee
|
||||
|
||||
var initialize_modules = function() {
|
||||
App.Answers.initialize();
|
||||
@@ -138,6 +139,7 @@ var initialize_modules = function() {
|
||||
App.Cookies.initialize();
|
||||
if ( $('#js-columns-selector').length )
|
||||
App.ColumnsSelector.initialize();
|
||||
App.BudgetEditAssociations.initialize();
|
||||
};
|
||||
|
||||
$(function(){
|
||||
|
||||
25
app/assets/javascripts/budget_edit_associations.js.coffee
Normal file
25
app/assets/javascripts/budget_edit_associations.js.coffee
Normal file
@@ -0,0 +1,25 @@
|
||||
App.BudgetEditAssociations =
|
||||
|
||||
set_text: (response)->
|
||||
$(".js-budget-show-administrators-list").text(response["administrators"])
|
||||
$(".js-budget-show-valuators-list").text(response["valuators"])
|
||||
$(".js-budget-show-trackers-list").text(response["trackers"])
|
||||
|
||||
initialize: ->
|
||||
$(".js-budget-list-checkbox-user").on
|
||||
click: ->
|
||||
admin_count = $(".js-budget-list-checkbox-administrators:checkbox:checked").length
|
||||
valuator_count = $(".js-budget-list-checkbox-valuators:checkbox:checked").length
|
||||
tracker_count = $(".js-budget-list-checkbox-trackers:checkbox:checked").length
|
||||
budget = $(".js-budget-id").attr("id")
|
||||
url = "/admin/budgets/" + budget + "/assigned_users_translation.json"
|
||||
params = {administrators: admin_count, valuators: valuator_count, trackers: tracker_count}
|
||||
$.get(url, params, (response) -> App.BudgetEditAssociations.set_text response, "json")
|
||||
|
||||
$(".js-budget-show-users-list").on
|
||||
click: ->
|
||||
div_id = $(this).data().toggle
|
||||
for list in $(".js-budget-users-list")
|
||||
do ->
|
||||
if (list.id != div_id)
|
||||
$(list).addClass("is-hidden") if !$(list).hasClass("is-hidden")
|
||||
@@ -102,15 +102,17 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
|
||||
end
|
||||
|
||||
def load_admins
|
||||
@admins = Administrator.includes(:user).all
|
||||
@admins = @budget.administrators.includes(:user).all
|
||||
end
|
||||
|
||||
def load_trackers
|
||||
@trackers = Tracker.includes(:user).all.order(description: :asc).order("users.email ASC")
|
||||
@trackers = @budget.trackers.includes(:user).all.order(description: :asc)
|
||||
.order("users.email ASC")
|
||||
end
|
||||
|
||||
def load_valuators
|
||||
@valuators = Valuator.includes(:user).all.order(description: :asc).order("users.email ASC")
|
||||
@valuators = @budget.valuators.includes(:user).all.order(description: :asc)
|
||||
.order("users.email ASC")
|
||||
end
|
||||
|
||||
def load_valuator_groups
|
||||
|
||||
@@ -17,9 +17,15 @@ class Admin::BudgetsController < Admin::BaseController
|
||||
end
|
||||
|
||||
def new
|
||||
load_admins
|
||||
load_valuators
|
||||
load_trackers
|
||||
end
|
||||
|
||||
def edit
|
||||
load_admins
|
||||
load_valuators
|
||||
load_trackers
|
||||
end
|
||||
|
||||
def calculate_winners
|
||||
@@ -35,6 +41,9 @@ class Admin::BudgetsController < Admin::BaseController
|
||||
if @budget.update(budget_params)
|
||||
redirect_to admin_budgets_path, notice: t("admin.budgets.update.notice")
|
||||
else
|
||||
load_admins
|
||||
load_valuators
|
||||
load_trackers
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
@@ -44,6 +53,9 @@ class Admin::BudgetsController < Admin::BaseController
|
||||
if @budget.save
|
||||
redirect_to admin_budget_path(@budget), notice: t("admin.budgets.create.notice")
|
||||
else
|
||||
load_admins
|
||||
load_valuators
|
||||
load_trackers
|
||||
render :new
|
||||
end
|
||||
end
|
||||
@@ -59,11 +71,26 @@ class Admin::BudgetsController < Admin::BaseController
|
||||
end
|
||||
end
|
||||
|
||||
def assigned_users_translation
|
||||
render json: { administrators: t("admin.budgets.edit.administrators", count: params[:administrators].to_i),
|
||||
valuators: t("admin.budgets.edit.valuators", count: params[:valuators].to_i),
|
||||
trackers: t("admin.budgets.edit.trackers", count: params[:trackers].to_i)
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def budget_params
|
||||
descriptions = Budget::Phase::PHASE_KINDS.map{|p| "description_#{p}"}.map(&:to_sym)
|
||||
valid_attributes = [:phase, :currency_symbol] + descriptions
|
||||
valid_attributes = [:phase,
|
||||
:currency_symbol,
|
||||
:help_link,
|
||||
:budget_milestone_tags,
|
||||
:budget_valuation_tags,
|
||||
administrator_ids: [],
|
||||
valuator_ids: [],
|
||||
tracker_ids: []
|
||||
] + descriptions
|
||||
params.require(:budget).permit(*valid_attributes, *report_attributes, translation_params(Budget))
|
||||
end
|
||||
|
||||
@@ -71,4 +98,16 @@ class Admin::BudgetsController < Admin::BaseController
|
||||
@budget = Budget.find_by_slug_or_id! params[:id]
|
||||
end
|
||||
|
||||
def load_admins
|
||||
@admins = Administrator.includes(:user).all
|
||||
end
|
||||
|
||||
def load_trackers
|
||||
@trackers = Tracker.includes(:user).all.order(description: :asc).order("users.email ASC")
|
||||
end
|
||||
|
||||
def load_valuators
|
||||
@valuators = Valuator.includes(:user).all.order(description: :asc).order("users.email ASC")
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -54,7 +54,15 @@ module BudgetsHelper
|
||||
end
|
||||
|
||||
def investment_tags_select_options(budget)
|
||||
Budget::Investment.by_budget(budget).tags_on(:valuation).order(:name).select(:name).distinct
|
||||
tags = Budget::Investment.by_budget(budget).tags_on(:valuation).order(:name).pluck(:name)
|
||||
tags = tags.concat budget.budget_valuation_tags.split(",") if budget.budget_valuation_tags.present?
|
||||
tags.uniq
|
||||
end
|
||||
|
||||
def investment_milestone_tags_select_options(budget)
|
||||
tags = Budget::Investment.by_budget(budget).tags_on(:milestone).order(:name).pluck(:name)
|
||||
tags = tags.concat budget.budget_milestone_tags.split(",") if budget.budget_milestone_tags.present?
|
||||
tags.uniq
|
||||
end
|
||||
|
||||
def unfeasible_or_unselected_filter
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
module TranslatableFormHelper
|
||||
def translatable_form_for(record, options = {})
|
||||
form_for(record, options.merge(builder: TranslatableFormBuilder)) do |f|
|
||||
options_full = options.merge(builder: TranslatableFormBuilder)
|
||||
form_for(record, options_full) do |f|
|
||||
yield(f)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -59,7 +59,7 @@ module Abilities
|
||||
|
||||
can :manage, Dashboard::Action
|
||||
|
||||
can [:index, :read, :new, :create, :update, :destroy, :calculate_winners], Budget
|
||||
can [:index, :read, :new, :create, :update, :destroy, :calculate_winners, :assigned_users_translation], Budget
|
||||
can [:read, :create, :update, :destroy], Budget::Group
|
||||
can [:read, :create, :update, :destroy], Budget::Heading
|
||||
can [:hide, :update, :toggle_selection], Budget::Investment
|
||||
|
||||
@@ -35,6 +35,12 @@ class Budget < ApplicationRecord
|
||||
has_many :headings, through: :groups
|
||||
has_many :lines, through: :ballots, class_name: "Budget::Ballot::Line"
|
||||
has_many :phases, class_name: "Budget::Phase"
|
||||
has_many :budget_trackers
|
||||
has_many :trackers, through: :budget_trackers
|
||||
has_many :budget_administrators
|
||||
has_many :administrators, through: :budget_administrators
|
||||
has_many :budget_valuators
|
||||
has_many :valuators, through: :budget_valuators
|
||||
|
||||
has_one :poll
|
||||
|
||||
@@ -224,4 +230,5 @@ class Budget < ApplicationRecord
|
||||
def generate_slug?
|
||||
slug.nil? || drafting?
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -97,7 +97,8 @@ class Budget
|
||||
scope :by_admin, ->(admin_id) { where(administrator_id: admin_id) }
|
||||
scope :by_tag, ->(tag_name) { tagged_with(tag_name) }
|
||||
scope :by_valuator, ->(valuator_id) { where("budget_valuator_assignments.valuator_id = ?", valuator_id).joins(:valuator_assignments) }
|
||||
scope :by_tracker, ->(tracker_id) { where("budget_tracker_assignments.tracker_id = ?", tracker_id).joins(:tracker_assignments) }
|
||||
scope :by_tracker, ->(tracker_id) { where("budget_tracker_assignments.tracker_id = ?",
|
||||
tracker_id).joins(:tracker_assignments) }
|
||||
scope :by_valuator_group, ->(valuator_group_id) { where("budget_valuator_group_assignments.valuator_group_id = ?", valuator_group_id).joins(:valuator_group_assignments) }
|
||||
|
||||
scope :for_render, -> { includes(:heading) }
|
||||
@@ -130,6 +131,7 @@ class Budget
|
||||
params[:max_total_supports]) if params[:max_total_supports].present?
|
||||
results = results.where(group_id: params[:group_id]) if params[:group_id].present?
|
||||
results = results.by_tag(params[:tag_name]) if params[:tag_name].present?
|
||||
results = results.by_tag(params[:milestone_tag_name]) if params[:milestone_tag_name].present?
|
||||
results = results.by_heading(params[:heading_id]) if params[:heading_id].present?
|
||||
results = results.by_valuator(params[:valuator_id]) if params[:valuator_id].present?
|
||||
results = results.by_valuator_group(params[:valuator_group_id]) if params[:valuator_group_id].present?
|
||||
|
||||
5
app/models/budget_administrator.rb
Normal file
5
app/models/budget_administrator.rb
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
class BudgetAdministrator < ApplicationRecord
|
||||
belongs_to :budget
|
||||
belongs_to :administrator
|
||||
end
|
||||
4
app/models/budget_rol_assignment.rb
Normal file
4
app/models/budget_rol_assignment.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
class BudgetRolAssignment < ApplicationRecord
|
||||
belongs_to :budget
|
||||
belongs_to :user
|
||||
end
|
||||
4
app/models/budget_tracker.rb
Normal file
4
app/models/budget_tracker.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
class BudgetTracker < ApplicationRecord
|
||||
belongs_to :budget
|
||||
belongs_to :tracker
|
||||
end
|
||||
4
app/models/budget_valuator.rb
Normal file
4
app/models/budget_valuator.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
class BudgetValuator < ApplicationRecord
|
||||
belongs_to :budget
|
||||
belongs_to :valuator
|
||||
end
|
||||
@@ -33,6 +33,8 @@ class User < ApplicationRecord
|
||||
has_many :direct_messages_received, class_name: "DirectMessage", foreign_key: :receiver_id
|
||||
has_many :legislation_answers, class_name: "Legislation::Answer", dependent: :destroy, inverse_of: :user
|
||||
has_many :follows
|
||||
has_many :budget_rol_assignments
|
||||
has_many :budgets, through: :budget_rol_assignments
|
||||
belongs_to :geozone
|
||||
|
||||
validates :username, presence: true, if: :username_required?
|
||||
|
||||
@@ -57,6 +57,13 @@
|
||||
label: false} %>
|
||||
</div>
|
||||
|
||||
<div class="small-12 medium-3 column">
|
||||
<%= select_tag :milestone_tag_name,
|
||||
options_for_select(investment_milestone_tags_select_options(@budget), params[:milestone_tag_name]),
|
||||
{ prompt: t("admin.budget_investments.index.milestone_tags_filter_all"),
|
||||
label: false} %>
|
||||
</div>
|
||||
|
||||
<div class="small-12 medium-6 column">
|
||||
<div class="input-group">
|
||||
<%= text_field_tag :title_or_id, params["title_or_id"], placeholder: t("admin.budget_investments.index.placeholder") %>
|
||||
|
||||
25
app/views/admin/budgets/_association.html.erb
Normal file
25
app/views/admin/budgets/_association.html.erb
Normal file
@@ -0,0 +1,25 @@
|
||||
<div class="secondary callout is-hidden js-budget-users-list small-12" data-toggler="is-hidden" data-closable id="<%= assignable_type %>_list">
|
||||
<% if assignables.nil? || assignables.empty? %>
|
||||
<p><%= t("admin.budgets.edit.empty_#{assignable_type}") %></p>
|
||||
<% else %>
|
||||
<h3><%= t("admin.budgets.edit.#{assignable_type}", count: 0) %></h3>
|
||||
<table class="table-for-mobile">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="small-8"><%= t("admin.budgets.edit.name") %></th>
|
||||
<th class="small-4"><%= t("admin.budgets.edit.selected") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% assignables.each do |assignable| %>
|
||||
<tr>
|
||||
<td class="small-8"><%= assignable.name %></td>
|
||||
<td class="small-4 text-center">
|
||||
<input type="checkbox" id="<%= assignable_type.singularize %>_<%= assignable.user.id %>" name="budget[<%= assignable_type.singularize %>_ids][]" value="<%= assignable.id %>" <%= "checked" if @budget.send(assignable_type).include? assignable %> class="js-budget-list-checkbox-<%= assignable_type %> js-budget-list-checkbox-user">
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% end %>
|
||||
</div>
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
<%= translatable_form_for [:admin, @budget] do |f| %>
|
||||
|
||||
<div class="js-budget-id" id="<%= @budget.id %>"></div>
|
||||
|
||||
<%= render "shared/errors", resource: @budget %>
|
||||
|
||||
<div class="small-12 medium-9 column">
|
||||
@@ -22,6 +24,39 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="margin-top">
|
||||
<div class="small-12 medium-4 column end">
|
||||
<a id="administrators_button" class="button expanded hollow js-budget-show-users-list js-budget-show-administrators-list" data-toggle="administrators_list"><%= t("admin.budgets.edit.administrators", count: @budget.administrators.count) %>
|
||||
</a>
|
||||
</div>
|
||||
<div class="small-12 medium-4 column end">
|
||||
<a id="valuators_button" class="button expanded hollow js-budget-show-users-list js-budget-show-valuators-list" data-toggle="valuators_list"><%= t("admin.budgets.edit.valuators", count: @budget.valuators.count) %>
|
||||
</a>
|
||||
</div>
|
||||
<div class="small-12 medium-4 column end">
|
||||
<a id="trackers_button" class="button expanded hollow js-budget-show-users-list js-budget-show-trackers-list" data-toggle="trackers_list"><%= t("admin.budgets.edit.trackers", count: @budget.trackers.count) %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="margin-top">
|
||||
<%= render "/admin/budgets/association", assignable_type: "administrators", assignables: @admins, budget: @budget %>
|
||||
<%= render "/admin/budgets/association", assignable_type: "valuators", assignables: @valuators, budget: @budget %>
|
||||
<%= render "/admin/budgets/association", assignable_type: "trackers", assignables: @trackers, budget: @budget %>
|
||||
</div>
|
||||
|
||||
<div class="margin-top">
|
||||
<div class="small-12 medium-9 column end">
|
||||
<%= f.text_field :budget_milestone_tags, placeholder: t("admin.budget_investments.edit.tags_placeholder") %>
|
||||
</div>
|
||||
<div class="small-12 medium-9 column end">
|
||||
<%= f.text_field :budget_valuation_tags, placeholder: t("admin.budget_investments.edit.tags_placeholder") %>
|
||||
</div>
|
||||
<div class="small-12 medium-9 column end">
|
||||
<%= f.text_field :help_link %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% if @budget.phases.present? %>
|
||||
<div class="small-12 column">
|
||||
<table id="budget-phases-table" class="table-for-mobile">
|
||||
@@ -95,5 +130,4 @@
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% end %>
|
||||
|
||||
@@ -13,4 +13,3 @@
|
||||
<%= f.submit t("admin.trackers.form.update"), class: "button success" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<%= link_to tracking_budget_budget_investment_path(@budget, @investment), class: "back" do %>
|
||||
<span class="icon-angle-left"></span>
|
||||
<%= "#{t("tracking.budget_investments.show.title")} #{@investment.id}"%>
|
||||
<%= "#{t("tracking.budget_investments.show.title")} #{@investment.id}" %>
|
||||
<% end %>
|
||||
|
||||
<br>
|
||||
|
||||
Reference in New Issue
Block a user