Merge pull request #3480 from LextrendIT/3461_create_traker_rol
Create tracker rol
This commit is contained in:
@@ -1,8 +0,0 @@
|
||||
class Admin::BudgetInvestmentMilestonesController < Admin::MilestonesController
|
||||
|
||||
private
|
||||
|
||||
def milestoneable
|
||||
Budget::Investment.find(params[:budget_investment_id])
|
||||
end
|
||||
end
|
||||
@@ -1,8 +0,0 @@
|
||||
class Admin::BudgetInvestmentProgressBarsController < Admin::ProgressBarsController
|
||||
|
||||
private
|
||||
|
||||
def progressable
|
||||
Budget::Investment.find(params[:budget_investment_id])
|
||||
end
|
||||
end
|
||||
@@ -37,6 +37,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
|
||||
load_admins
|
||||
load_valuators
|
||||
load_valuator_groups
|
||||
load_trackers
|
||||
load_tags
|
||||
end
|
||||
|
||||
@@ -50,6 +51,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
|
||||
load_admins
|
||||
load_valuators
|
||||
load_valuator_groups
|
||||
load_trackers
|
||||
load_tags
|
||||
render :edit
|
||||
end
|
||||
@@ -88,7 +90,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
|
||||
params.require(:budget_investment)
|
||||
.permit(:title, :description, :external_url, :heading_id, :administrator_id, :tag_list,
|
||||
:valuation_tag_list, :incompatible, :visible_to_valuators, :selected,
|
||||
:milestone_tag_list, valuator_ids: [], valuator_group_ids: [])
|
||||
:milestone_tag_list, tracker_ids: [], valuator_ids: [], valuator_group_ids: [])
|
||||
end
|
||||
|
||||
def load_budget
|
||||
@@ -103,6 +105,10 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
|
||||
@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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
class Admin::Legislation::MilestonesController < Admin::MilestonesController
|
||||
class Admin::Legislation::MilestonesController < Tracking::MilestonesController
|
||||
include FeatureFlags
|
||||
feature_flag :legislation
|
||||
|
||||
@@ -11,8 +11,4 @@ class Admin::Legislation::MilestonesController < Admin::MilestonesController
|
||||
def milestoneable
|
||||
::Legislation::Process.find(params[:process_id])
|
||||
end
|
||||
|
||||
def milestoneable_path
|
||||
admin_legislation_process_milestones_path(milestoneable)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
class Admin::MilestonesController < Admin::BaseController
|
||||
include Translatable
|
||||
include ImageAttributes
|
||||
|
||||
before_action :load_milestoneable, only: [:index, :new, :create, :edit, :update, :destroy]
|
||||
before_action :load_milestone, only: [:edit, :update, :destroy]
|
||||
before_action :load_statuses, only: [:index, :new, :create, :edit, :update]
|
||||
helper_method :milestoneable_path
|
||||
|
||||
def index
|
||||
end
|
||||
|
||||
def new
|
||||
@milestone = @milestoneable.milestones.new
|
||||
end
|
||||
|
||||
def create
|
||||
@milestone = @milestoneable.milestones.new(milestone_params)
|
||||
if @milestone.save
|
||||
redirect_to milestoneable_path, notice: t("admin.milestones.create.notice")
|
||||
else
|
||||
render :new
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
def update
|
||||
if @milestone.update(milestone_params)
|
||||
redirect_to milestoneable_path, notice: t("admin.milestones.update.notice")
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@milestone.destroy
|
||||
redirect_to milestoneable_path, notice: t("admin.milestones.delete.notice")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def milestone_params
|
||||
documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
|
||||
attributes = [:publication_date, :status_id,
|
||||
translation_params(Milestone),
|
||||
image_attributes: image_attributes, documents_attributes: documents_attributes]
|
||||
|
||||
params.require(:milestone).permit(*attributes)
|
||||
end
|
||||
|
||||
def load_milestoneable
|
||||
@milestoneable = milestoneable
|
||||
end
|
||||
|
||||
def milestoneable
|
||||
raise "Implement in subclass"
|
||||
end
|
||||
|
||||
def load_milestone
|
||||
@milestone = @milestoneable.milestones.find(params[:id])
|
||||
end
|
||||
|
||||
def load_statuses
|
||||
@statuses = Milestone::Status.all
|
||||
end
|
||||
|
||||
def milestoneable_path
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(@milestone.milestoneable)])
|
||||
end
|
||||
end
|
||||
@@ -1,8 +0,0 @@
|
||||
class Admin::ProposalMilestonesController < Admin::MilestonesController
|
||||
|
||||
private
|
||||
|
||||
def milestoneable
|
||||
Proposal.find(params[:proposal_id])
|
||||
end
|
||||
end
|
||||
56
app/controllers/admin/trackers_controller.rb
Normal file
56
app/controllers/admin/trackers_controller.rb
Normal file
@@ -0,0 +1,56 @@
|
||||
class Admin::TrackersController < Admin::BaseController
|
||||
load_and_authorize_resource
|
||||
|
||||
before_action :set_tracker, only: [:show, :edit, :update, :destroy]
|
||||
|
||||
def show
|
||||
@tracker = Tracker.find(params[:id])
|
||||
end
|
||||
|
||||
def index
|
||||
@trackers = @trackers.page(params[:page])
|
||||
end
|
||||
|
||||
def search
|
||||
@users = User.search(params[:name_or_email])
|
||||
.includes(:tracker)
|
||||
.page(params[:page])
|
||||
.for_render
|
||||
end
|
||||
|
||||
def create
|
||||
@tracker = Tracker.new(tracker_params)
|
||||
@tracker.save
|
||||
|
||||
redirect_to admin_trackers_path
|
||||
end
|
||||
|
||||
def edit
|
||||
@tracker = Tracker.find(params[:id])
|
||||
end
|
||||
|
||||
def update
|
||||
@tracker = Tracker.find(params[:id])
|
||||
if @tracker.update(tracker_params)
|
||||
notice = t("admin.trackers.form.updated")
|
||||
redirect_to [:admin, @tracker], notice: notice
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@tracker.destroy
|
||||
redirect_to admin_trackers_path
|
||||
end
|
||||
|
||||
private
|
||||
def set_tracker
|
||||
@tracker = Tracker.find(params[:id])
|
||||
end
|
||||
|
||||
def tracker_params
|
||||
params[:tracker][:description] = nil if params[:tracker][:description].blank?
|
||||
params.require(:tracker).permit(:user_id, :description, :budget_investment_count)
|
||||
end
|
||||
end
|
||||
15
app/controllers/tracking/base_controller.rb
Normal file
15
app/controllers/tracking/base_controller.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
class Tracking::BaseController < ApplicationController
|
||||
layout "admin"
|
||||
|
||||
before_action :authenticate_user!
|
||||
before_action :verify_tracker
|
||||
|
||||
skip_authorization_check
|
||||
|
||||
private
|
||||
|
||||
def verify_tracker
|
||||
raise CanCan::AccessDenied unless current_user.try(:tracker?) || current_user.try(:administrator?)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
class Tracking::BudgetInvestmentMilestonesController < Tracking::MilestonesController
|
||||
|
||||
private
|
||||
|
||||
def milestoneable
|
||||
Budget::Investment.find(params[:budget_investment_id])
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
class Tracking::BudgetInvestmentProgressBarsController < Tracking::ProgressBarsController
|
||||
|
||||
before_action :restrict_access_to_assigned_items
|
||||
|
||||
private
|
||||
|
||||
def progressable
|
||||
Budget::Investment.find(params[:budget_investment_id])
|
||||
end
|
||||
|
||||
def restrict_access_to_assigned_items
|
||||
return if current_user.administrator? ||
|
||||
Budget::TrackerAssignment.exists?(investment_id: params[:budget_investment_id],
|
||||
tracker_id: current_user.tracker.id)
|
||||
raise ActionController::RoutingError.new("Not Found")
|
||||
end
|
||||
end
|
||||
83
app/controllers/tracking/budget_investments_controller.rb
Normal file
83
app/controllers/tracking/budget_investments_controller.rb
Normal file
@@ -0,0 +1,83 @@
|
||||
class Tracking::BudgetInvestmentsController < Tracking::BaseController
|
||||
include FeatureFlags
|
||||
include CommentableActions
|
||||
|
||||
feature_flag :budgets
|
||||
|
||||
before_action :restrict_access_to_assigned_items, only: [:show, :edit]
|
||||
before_action :load_budget
|
||||
before_action :load_investment, only: [:show, :edit]
|
||||
|
||||
has_orders %w{oldest}, only: [:show, :edit]
|
||||
|
||||
load_and_authorize_resource :investment, class: "Budget::Investment"
|
||||
|
||||
def index
|
||||
@heading_filters = heading_filters
|
||||
@investments = if current_user.tracker? && @budget.present?
|
||||
current_user.tracker.investments_by_heading(heading_params, @budget)
|
||||
.page(params[:page])
|
||||
else
|
||||
Budget::Investment.none.page(params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
end
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def resource_model
|
||||
Budget::Investment
|
||||
end
|
||||
|
||||
def resource_name
|
||||
resource_model.parameterize(separator: "_")
|
||||
end
|
||||
|
||||
def load_budget
|
||||
@budget = Budget.find(params[:budget_id])
|
||||
end
|
||||
|
||||
def load_investment
|
||||
@investment = @budget.investments.find params[:id]
|
||||
end
|
||||
|
||||
def heading_filters
|
||||
investments = @budget.investments.by_tracker(current_user.tracker.try(:id))
|
||||
.distinct
|
||||
investment_headings = Budget::Heading.where(id: investments.pluck(:heading_id).uniq)
|
||||
.order(name: :asc)
|
||||
all_headings_filter = [
|
||||
{
|
||||
name: t("valuation.budget_investments.index.headings_filter_all"),
|
||||
id: nil,
|
||||
count: investments.size
|
||||
}
|
||||
]
|
||||
|
||||
filters = investment_headings.inject(all_headings_filter) do |filters, heading|
|
||||
filters << {
|
||||
name: heading.name,
|
||||
id: heading.id,
|
||||
count: investments.select{|i| i.heading_id == heading.id}.size
|
||||
}
|
||||
end
|
||||
filters.uniq
|
||||
end
|
||||
|
||||
def restrict_access_to_assigned_items
|
||||
return if current_user.administrator? ||
|
||||
Budget::TrackerAssignment.exists?(investment_id: params[:id],
|
||||
tracker_id: current_user.tracker.id)
|
||||
raise ActionController::RoutingError.new("Not Found")
|
||||
end
|
||||
|
||||
def heading_params
|
||||
params.permit(:heading_id)
|
||||
end
|
||||
|
||||
end
|
||||
14
app/controllers/tracking/budgets_controller.rb
Normal file
14
app/controllers/tracking/budgets_controller.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
class Tracking::BudgetsController < Tracking::BaseController
|
||||
include FeatureFlags
|
||||
feature_flag :budgets
|
||||
|
||||
load_and_authorize_resource
|
||||
|
||||
def index
|
||||
@budget = current_budget
|
||||
if @budget.present?
|
||||
@investments = @budget.investments
|
||||
.by_tracker(current_user.tracker)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,18 @@
|
||||
class Tracking::Legislation::MilestonesController < Tracking::MilestonesController
|
||||
include FeatureFlags
|
||||
feature_flag :legislation
|
||||
|
||||
def index
|
||||
@process = milestoneable
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def milestoneable
|
||||
::Legislation::Process.find(params[:process_id])
|
||||
end
|
||||
|
||||
def milestoneable_path
|
||||
admin_legislation_process_milestones_path(milestoneable)
|
||||
end
|
||||
end
|
||||
@@ -1,4 +1,4 @@
|
||||
class Admin::Legislation::ProgressBarsController < Admin::ProgressBarsController
|
||||
class Tracking::Legislation::ProgressBarsController < Tracking::ProgressBarsController
|
||||
include FeatureFlags
|
||||
feature_flag :legislation
|
||||
|
||||
73
app/controllers/tracking/milestones_controller.rb
Normal file
73
app/controllers/tracking/milestones_controller.rb
Normal file
@@ -0,0 +1,73 @@
|
||||
class Tracking::MilestonesController < Tracking::BaseController
|
||||
include Translatable
|
||||
include ImageAttributes
|
||||
|
||||
before_action :load_milestoneable, only: [:index, :new, :create, :edit, :update, :destroy]
|
||||
before_action :load_milestone, only: [:edit, :update, :destroy]
|
||||
before_action :load_statuses, only: [:index, :new, :create, :edit, :update]
|
||||
helper_method :milestoneable_path
|
||||
|
||||
def index
|
||||
end
|
||||
|
||||
def new
|
||||
@milestone = @milestoneable.milestones.new
|
||||
end
|
||||
|
||||
def create
|
||||
@milestone = @milestoneable.milestones.new(milestone_params)
|
||||
if @milestone.save
|
||||
redirect_to milestoneable_path, notice: t("tracking.milestones.create.notice")
|
||||
else
|
||||
render :new
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
def update
|
||||
if @milestone.update(milestone_params)
|
||||
redirect_to milestoneable_path, notice: t("tracking.milestones.update.notice")
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@milestone.destroy
|
||||
redirect_to milestoneable_path, notice: t("tracking.milestones.delete.notice")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def milestone_params
|
||||
documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
|
||||
attributes = [:publication_date, :status_id,
|
||||
translation_params(Milestone),
|
||||
image_attributes: image_attributes, documents_attributes: documents_attributes]
|
||||
|
||||
params.require(:milestone).permit(*attributes)
|
||||
end
|
||||
|
||||
def load_milestoneable
|
||||
@milestoneable = milestoneable
|
||||
end
|
||||
|
||||
def milestoneable
|
||||
raise "Implement in subclass"
|
||||
end
|
||||
|
||||
def load_milestone
|
||||
@milestone = @milestoneable.milestones.find(params[:id])
|
||||
end
|
||||
|
||||
def load_statuses
|
||||
@statuses = Milestone::Status.all
|
||||
end
|
||||
|
||||
def milestoneable_path
|
||||
polymorphic_path([current_user.administrator? ? :admin : :tracking,
|
||||
*resource_hierarchy_for(@milestone.milestoneable)])
|
||||
end
|
||||
end
|
||||
@@ -1,4 +1,4 @@
|
||||
class Admin::ProgressBarsController < Admin::BaseController
|
||||
class Tracking::ProgressBarsController < Tracking::BaseController
|
||||
include Translatable
|
||||
|
||||
before_action :load_progressable
|
||||
@@ -15,7 +15,7 @@ class Admin::ProgressBarsController < Admin::BaseController
|
||||
def create
|
||||
@progress_bar = @progressable.progress_bars.new(progress_bar_params)
|
||||
if @progress_bar.save
|
||||
redirect_to progress_bars_index, notice: t("admin.progress_bars.create.notice")
|
||||
redirect_to progress_bars_index, notice: t("tracking.progress_bars.create.notice")
|
||||
else
|
||||
render :new
|
||||
end
|
||||
@@ -26,7 +26,7 @@ class Admin::ProgressBarsController < Admin::BaseController
|
||||
|
||||
def update
|
||||
if @progress_bar.update(progress_bar_params)
|
||||
redirect_to progress_bars_index, notice: t("admin.progress_bars.update.notice")
|
||||
redirect_to progress_bars_index, notice: t("tracking.progress_bars.update.notice")
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
@@ -34,7 +34,7 @@ class Admin::ProgressBarsController < Admin::BaseController
|
||||
|
||||
def destroy
|
||||
@progress_bar.destroy
|
||||
redirect_to progress_bars_index, notice: t("admin.progress_bars.delete.notice")
|
||||
redirect_to progress_bars_index, notice: t("tracking.progress_bars.delete.notice")
|
||||
end
|
||||
|
||||
private
|
||||
@@ -64,6 +64,6 @@ class Admin::ProgressBarsController < Admin::BaseController
|
||||
end
|
||||
|
||||
def progress_bars_index
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(@progressable), ProgressBar.new])
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(@progressable), ProgressBar.new])
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
class Tracking::ProposalMilestonesController < Tracking::MilestonesController
|
||||
|
||||
private
|
||||
|
||||
def milestoneable
|
||||
Proposal.find(params[:proposal_id])
|
||||
end
|
||||
end
|
||||
@@ -1,4 +1,4 @@
|
||||
class Admin::ProposalProgressBarsController < Admin::ProgressBarsController
|
||||
class Tracking::ProposalProgressBarsController < Tracking::ProgressBarsController
|
||||
|
||||
private
|
||||
def progressable
|
||||
21
app/helpers/trackers_helper.rb
Normal file
21
app/helpers/trackers_helper.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
module TrackersHelper
|
||||
|
||||
def tracker_label(tracker)
|
||||
truncate([tracker.name, tracker.email, tracker.description].compact.join(" - "), length: 100)
|
||||
end
|
||||
|
||||
def tracker_back_path(progressable)
|
||||
if progressable.class.to_s == "Legislation::Process"
|
||||
admin_legislation_process_milestones_path(progressable)
|
||||
else
|
||||
polymorphic_path([tracker_namespace, *resource_hierarchy_for(progressable)])
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def tracker_namespace
|
||||
current_user.administrator? ? :admin : :tracking
|
||||
end
|
||||
|
||||
end
|
||||
@@ -56,11 +56,13 @@ module UsersHelper
|
||||
current_user && current_user.poll_officer?
|
||||
end
|
||||
|
||||
def show_admin_menu?(user = nil)
|
||||
unless namespace == "officing"
|
||||
current_administrator? || current_moderator? || current_valuator? || current_manager? ||
|
||||
(user && user.administrator?) || current_poll_officer?
|
||||
def current_tracker?
|
||||
current_user && current_user.tracker?
|
||||
end
|
||||
|
||||
def show_admin_menu?(user = nil)
|
||||
current_administrator? || current_moderator? || current_valuator? || current_manager? ||
|
||||
current_tracker? || (user && user.administrator?) || current_poll_officer?
|
||||
end
|
||||
|
||||
def interests_title_text(user)
|
||||
|
||||
@@ -99,6 +99,7 @@ module Abilities
|
||||
can [:create, :destroy], DirectUpload
|
||||
|
||||
can [:deliver], Newsletter, hidden_at: nil
|
||||
can [:manage], ::Tracker
|
||||
can [:manage], Dashboard::AdministratorTask
|
||||
|
||||
can [:edit, :update], DownloadSetting
|
||||
|
||||
14
app/models/abilities/tracker.rb
Normal file
14
app/models/abilities/tracker.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
module Abilities
|
||||
class Tracker
|
||||
include CanCan::Ability
|
||||
|
||||
def initialize(user)
|
||||
tracker = user.tracker
|
||||
|
||||
can :index, Budget
|
||||
can [:index, :show, :edit], Budget::Investment
|
||||
can :manage, Milestone
|
||||
can :manage, ProgressBar
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -8,6 +8,7 @@ class Ability
|
||||
|
||||
if user # logged-in users
|
||||
merge Abilities::Valuator.new(user) if user.valuator?
|
||||
merge Abilities::Tracker.new(user) if user.tracker?
|
||||
|
||||
if user.administrator?
|
||||
merge Abilities::Administrator.new(user)
|
||||
|
||||
@@ -26,6 +26,8 @@ class Budget
|
||||
include Milestoneable
|
||||
include Randomizable
|
||||
|
||||
extend DownloadSettings::BudgetInvestmentCsv
|
||||
|
||||
belongs_to :author, -> { with_hidden }, class_name: "User", foreign_key: "author_id"
|
||||
belongs_to :heading
|
||||
belongs_to :group
|
||||
@@ -41,7 +43,9 @@ class Budget
|
||||
has_many :comments, -> {where(valuation: false)}, as: :commentable, class_name: "Comment"
|
||||
has_many :valuations, -> {where(valuation: true)}, as: :commentable, class_name: "Comment"
|
||||
|
||||
extend DownloadSettings::BudgetInvestmentCsv
|
||||
has_many :tracker_assignments, dependent: :destroy
|
||||
has_many :trackers, through: :tracker_assignments
|
||||
|
||||
delegate :name, :email, to: :author, prefix: true
|
||||
|
||||
validates :title, presence: true
|
||||
@@ -93,6 +97,7 @@ 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_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) }
|
||||
|
||||
6
app/models/budget/tracker_assignment.rb
Normal file
6
app/models/budget/tracker_assignment.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class Budget
|
||||
class TrackerAssignment < ApplicationRecord
|
||||
belongs_to :tracker, counter_cache: :budget_investment_count
|
||||
belongs_to :investment, counter_cache: true
|
||||
end
|
||||
end
|
||||
30
app/models/tracker.rb
Normal file
30
app/models/tracker.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
class Tracker < ApplicationRecord
|
||||
belongs_to :user, touch: true
|
||||
|
||||
delegate :name, :email, :name_and_email, to: :user
|
||||
|
||||
has_many :tracker_assignments, dependent: :destroy, class_name: "Budget::TrackerAssignment"
|
||||
has_many :investments, through: :tracker_assignments, class_name: "Budget::Investment"
|
||||
|
||||
validates :user_id, presence: true, uniqueness: true
|
||||
|
||||
def description_or_email
|
||||
description.present? ? description : email
|
||||
end
|
||||
|
||||
def description_or_name
|
||||
description.present? ? description : name
|
||||
end
|
||||
|
||||
def assigned_investment_ids
|
||||
investment_ids
|
||||
end
|
||||
|
||||
def investments_by_heading(params, budget)
|
||||
results = investments.by_budget(budget)
|
||||
if params[:heading_id].present?
|
||||
results = results.by_heading(params[:heading_id])
|
||||
end
|
||||
results
|
||||
end
|
||||
end
|
||||
@@ -15,6 +15,7 @@ class User < ApplicationRecord
|
||||
has_one :administrator
|
||||
has_one :moderator
|
||||
has_one :valuator
|
||||
has_one :tracker
|
||||
has_one :manager
|
||||
has_one :poll_officer, class_name: "Poll::Officer"
|
||||
has_one :organization
|
||||
@@ -151,6 +152,10 @@ class User < ApplicationRecord
|
||||
valuator.present?
|
||||
end
|
||||
|
||||
def tracker?
|
||||
tracker.present?
|
||||
end
|
||||
|
||||
def manager?
|
||||
manager.present?
|
||||
end
|
||||
|
||||
@@ -212,6 +212,10 @@
|
||||
<%= link_to t("admin.menu.valuators"), admin_valuators_path %>
|
||||
</li>
|
||||
|
||||
<li <%= "class=is-active" if controller_name == "trackers" %>>
|
||||
<%= link_to t("admin.menu.trackers"), admin_trackers_path %>
|
||||
</li>
|
||||
|
||||
<li <%= "class=is-active" if controller_name == "managers" %>>
|
||||
<%= link_to t("admin.menu.managers"), admin_managers_path %>
|
||||
</li>
|
||||
|
||||
@@ -84,6 +84,16 @@
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="small-12 column">
|
||||
<hr>
|
||||
<%= f.label :tracker_ids, t("admin.budget_investments.edit.assigned_trackers") %>
|
||||
<ul>
|
||||
<%= f.collection_check_boxes :tracker_ids, @trackers, :id, :email do |b| %>
|
||||
<li><%= b.label(title: tracker_label(b.object)) { b.check_box + truncate(b.object.description_or_email, length: 60) } %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row expanded margin-top">
|
||||
|
||||
@@ -50,6 +50,15 @@
|
||||
<% end %>
|
||||
</p>
|
||||
|
||||
<p id="assigned_trackers">
|
||||
<strong><%= t("admin.budget_investments.show.assigned_trackers") %>:</strong>
|
||||
<% if @investment.trackers.any? %>
|
||||
<%= @investment.trackers.collect(&:name_and_email).join(", ") %>
|
||||
<% else %>
|
||||
<%= t("admin.budget_investments.show.undefined") %>
|
||||
<% end %>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<%= link_to t("admin.budget_investments.show.edit_classification"),
|
||||
edit_admin_budget_budget_investment_path(@budget, @investment,
|
||||
@@ -66,6 +75,6 @@
|
||||
|
||||
<%= render "valuation/budget_investments/valuation_comments" %>
|
||||
|
||||
<%= render "admin/milestones/milestones", milestoneable: @investment %>
|
||||
|
||||
<%= render "admin/change_logs/change_log", logs: @logs %>
|
||||
|
||||
<%= render "tracking/milestones/milestones", milestoneable: @investment %>
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
|
||||
<%= render "admin/legislation/processes/subnav", process: @process, active: "milestones" %>
|
||||
<%= render "summary_form", process: @process %>
|
||||
<%= render "admin/milestones/milestones", milestoneable: @process %>
|
||||
<%= render "tracking/milestones/milestones", milestoneable: @process %>
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
<% if @progress_bar.primary? %>
|
||||
<% bar_title = t("admin.progress_bars.edit.title.primary") %>
|
||||
<% else %>
|
||||
<% bar_title = t("admin.progress_bars.edit.title.secondary", title: @progress_bar.title) %>
|
||||
<% end %>
|
||||
|
||||
<% provide :title do %>
|
||||
<%= "#{t("admin.header.title")} - #{bar_title}" %>
|
||||
<% end %>
|
||||
|
||||
<%= back_link_to progress_bars_index %>
|
||||
|
||||
<h2><%= bar_title %></h2>
|
||||
|
||||
<%= render "form" %>
|
||||
@@ -1,9 +0,0 @@
|
||||
<% provide :title do %>
|
||||
<%= "#{t("admin.header.title")} - #{t("admin.progress_bars.index.title")}" %>
|
||||
<% end %>
|
||||
|
||||
<%= back_link_to polymorphic_path([:admin, *resource_hierarchy_for(@progressable)]) %>
|
||||
|
||||
<div class="clear"></div>
|
||||
|
||||
<%= render "admin/progress_bars/progress_bars", progressable: @progressable %>
|
||||
@@ -1,9 +0,0 @@
|
||||
<% provide :title do %>
|
||||
<%= "#{t("admin.header.title")} - #{t("admin.progress_bars.new.creating")}" %>
|
||||
<% end %>
|
||||
|
||||
<%= back_link_to progress_bars_index %>
|
||||
|
||||
<h2><%= t("admin.progress_bars.new.creating") %></h2>
|
||||
|
||||
<%= render "form" %>
|
||||
@@ -32,4 +32,4 @@
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<%= render "admin/milestones/milestones", milestoneable: @proposal %>
|
||||
<%= render "tracking/milestones/milestones", milestoneable: @proposal %>
|
||||
|
||||
32
app/views/admin/trackers/_form.html.erb
Normal file
32
app/views/admin/trackers/_form.html.erb
Normal file
@@ -0,0 +1,32 @@
|
||||
<%= form_for(tracker) do |f| %>
|
||||
<% if tracker.errors.any? %>
|
||||
<div id="error_explanation">
|
||||
<h2><%= pluralize(tracker.errors.count, "error") %> prohibited this tracker from being saved:</h2>
|
||||
|
||||
<ul>
|
||||
<% tracker.errors.full_messages.each do |message| %>
|
||||
<li><%= message %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<div class="field">
|
||||
<%= f.label :user_id %>
|
||||
<%= f.text_field :user_id %>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<%= f.label :description %>
|
||||
<%= f.text_field :description %>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<%= f.label :budget_investment_count %>
|
||||
<%= f.number_field :budget_investment_count %>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<%= f.submit %>
|
||||
</div>
|
||||
<% end %>
|
||||
16
app/views/admin/trackers/edit.html.erb
Normal file
16
app/views/admin/trackers/edit.html.erb
Normal file
@@ -0,0 +1,16 @@
|
||||
<%= back_link_to admin_trackers_path %>
|
||||
|
||||
<h2><%= t("admin.trackers.form.edit_title") %></h2>
|
||||
|
||||
<div class="callout highlight">
|
||||
<strong><%= @tracker.name %></strong><br>
|
||||
<%= @tracker.email %>
|
||||
</div>
|
||||
|
||||
<div class="margin-top">
|
||||
<%= form_for [:admin, @tracker] do |f| %>
|
||||
<%= f.text_field :description %>
|
||||
<%= f.submit t("admin.trackers.form.update"), class: "button success" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
48
app/views/admin/trackers/index.html.erb
Normal file
48
app/views/admin/trackers/index.html.erb
Normal file
@@ -0,0 +1,48 @@
|
||||
<h2 class="inline-block"><%= t("admin.trackers.index.title") %></h2>
|
||||
|
||||
<%= render "admin/shared/user_search", url: search_admin_trackers_path %>
|
||||
|
||||
<div id="trackers">
|
||||
<% if @trackers.any? %>
|
||||
<h3 class="margin"><%= page_entries_info @trackers %></h3>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<th scope="col"><%= t("admin.trackers.index.name") %></th>
|
||||
<th scope="col"><%= t("admin.trackers.index.email") %></th>
|
||||
<th scope="col"><%= t("admin.valuators.index.description") %></th>
|
||||
<th scope="col" class="small-3"><%= t("admin.actions.actions") %></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @trackers.each do |tracker| %>
|
||||
<tr>
|
||||
<td><%= link_to tracker.name, admin_tracker_path(tracker) %></td>
|
||||
<td><%= tracker.email %></td>
|
||||
<td>
|
||||
<% if tracker.description.present? %>
|
||||
<%= tracker.description %>
|
||||
<% else %>
|
||||
<%= t("admin.trackers.index.no_description") %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link_to t("admin.actions.edit"),
|
||||
edit_admin_tracker_path(tracker),
|
||||
class: "button hollow" %>
|
||||
<%= link_to t("admin.valuators.valuator.delete"),
|
||||
admin_tracker_path(tracker),
|
||||
method: :delete,
|
||||
class: "button hollow alert" %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<%= paginate @trackers %>
|
||||
<% else %>
|
||||
<div class="callout primary">
|
||||
<%= t("admin.trackers.index.no_trackers") %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
58
app/views/admin/trackers/search.html.erb
Normal file
58
app/views/admin/trackers/search.html.erb
Normal file
@@ -0,0 +1,58 @@
|
||||
<h2><%= t("admin.trackers.search.title") %></h2>
|
||||
|
||||
<%= render "admin/shared/user_search", url: search_admin_trackers_path %>
|
||||
|
||||
<div id="trackers">
|
||||
<% if @users.any? %>
|
||||
<h3 class="margin"><%= page_entries_info @users %></h3>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<th scope="col"><%= t("admin.trackers.index.name") %></th>
|
||||
<th scope="col"><%= t("admin.trackers.index.email") %></th>
|
||||
<th scope="col"><%= t("admin.trackers.index.description") %></th>
|
||||
<th scope="col"><%= t("admin.shared.actions") %></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @users.each do |user| %>
|
||||
<tr>
|
||||
<td><%= user.name %></td>
|
||||
<td><%= user.email %></td>
|
||||
<td>
|
||||
<% if user.tracker %>
|
||||
<% if user.tracker.description.present? %>
|
||||
<%= user.tracker.description %>
|
||||
<% else %>
|
||||
<%= t("admin.trackers.index.no_description") %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<%= t("admin.trackers.index.no_description") %>
|
||||
<% end %>
|
||||
<td>
|
||||
<% if user.tracker? %>
|
||||
<%= link_to t("admin.actions.edit"),
|
||||
edit_admin_tracker_path(user.tracker),
|
||||
class: "button hollow" %>
|
||||
|
||||
<%= link_to t("admin.valuators.valuator.delete"),
|
||||
admin_tracker_path(user.tracker),
|
||||
method: :delete,
|
||||
class: "button hollow alert" %>
|
||||
<% else %>
|
||||
<%= form_for Tracker.new(user: user), url: admin_trackers_path do |f| %>
|
||||
<%= f.hidden_field :user_id %>
|
||||
<%= f.submit t("admin.trackers.tracker.add"),
|
||||
class: "button success expanded" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% else %>
|
||||
<div class="callout alert margin">
|
||||
<%= t("admin.shared.no_search_results") %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
22
app/views/admin/trackers/show.html.erb
Normal file
22
app/views/admin/trackers/show.html.erb
Normal file
@@ -0,0 +1,22 @@
|
||||
<%= back_link_to admin_trackers_path %>
|
||||
|
||||
<%= link_to t("admin.actions.edit"), edit_admin_tracker_path(@tracker), class: "button hollow float-right" %>
|
||||
|
||||
<div class="clear"></div>
|
||||
|
||||
<h2><%= @tracker.name %></h2>
|
||||
|
||||
<div class="callout highlight">
|
||||
<p>
|
||||
<strong><%= t("admin.trackers.show.email") %></strong><br>
|
||||
<%= @tracker.email %>
|
||||
</p>
|
||||
<p>
|
||||
<strong><%= t("admin.trackers.show.description") %></strong><br>
|
||||
<% if @tracker.description.present? %>
|
||||
<%= @tracker.description %>
|
||||
<% else %>
|
||||
<%= t("admin.trackers.show.no_description") %>
|
||||
<% end %>
|
||||
</p>
|
||||
</div>
|
||||
@@ -21,6 +21,13 @@
|
||||
</li>
|
||||
<% end %>
|
||||
|
||||
<% if (feature?(:budgets)) &&
|
||||
(current_user.administrator? || current_user.tracker?) %>
|
||||
<li>
|
||||
<%= link_to t("layouts.header.tracking"), tracking_root_path %>
|
||||
</li>
|
||||
<% end %>
|
||||
|
||||
<% if current_user.administrator? || current_user.manager? %>
|
||||
<li>
|
||||
<%= link_to t("layouts.header.management"), management_sign_in_path %>
|
||||
|
||||
17
app/views/tracking/_menu.html.erb
Normal file
17
app/views/tracking/_menu.html.erb
Normal file
@@ -0,0 +1,17 @@
|
||||
<nav class="admin-sidebar">
|
||||
<ul id="valuation_menu">
|
||||
<li>
|
||||
<%= link_to t("tracking.menu.title"), tracking_root_path %>
|
||||
</li>
|
||||
|
||||
<% if feature?(:budgets) %>
|
||||
<li <%= "class=is-active" if controller_name == "budget_investments" %>>
|
||||
<%= link_to tracking_budgets_path do %>
|
||||
<span class="icon-budget"></span>
|
||||
<%= t("tracking.menu.budgets") %>
|
||||
<% end %>
|
||||
</li>
|
||||
<% end %>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
12
app/views/tracking/budget_investments/edit.html.erb
Normal file
12
app/views/tracking/budget_investments/edit.html.erb
Normal file
@@ -0,0 +1,12 @@
|
||||
<%= 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}"%>
|
||||
<% end %>
|
||||
|
||||
<br>
|
||||
|
||||
<h1><%= @investment.title %></h1>
|
||||
|
||||
<%= safe_html_with_links @investment.description %>
|
||||
|
||||
<%= render "tracking/milestones/milestones", milestoneable: @investment %>
|
||||
58
app/views/tracking/budget_investments/index.html.erb
Normal file
58
app/views/tracking/budget_investments/index.html.erb
Normal file
@@ -0,0 +1,58 @@
|
||||
<h2>
|
||||
<%= @budget.name %> - <%= t("tracking.budget_investments.index.title") %>
|
||||
<small><%= t("tracking.budget_investments.index.assigned_to", tracker: current_user.name) %></small>
|
||||
</h2>
|
||||
|
||||
<div class="row expanded collapse margin-bottom">
|
||||
<% @heading_filters.each_slice(8) do |slice| %>
|
||||
<div class="small-12 medium-4 column select-heading">
|
||||
<% slice.each do |filter| %>
|
||||
<%= link_to tracking_budget_budget_investments_path(budget_id: @budget.id, heading_id: filter[:id]),
|
||||
class: "#{"is-active" if params[:heading_id].to_s == filter[:id].to_s}" do %>
|
||||
<%= filter[:name] %> (<%= filter[:count] %>)
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<% if @investments.any? %>
|
||||
<h3><%= page_entries_info @investments %></h3>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= t("tracking.budget_investments.index.table_id") %></th>
|
||||
<th><%= t("tracking.budget_investments.index.table_title") %></th>
|
||||
<th><%= t("tracking.budget_investments.index.table_heading_name") %></th>
|
||||
<th><%= t("tracking.budget_investments.index.table_actions") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @investments.each do |investment| %>
|
||||
<tr id="<%= dom_id(investment) %>" class="budget_investment">
|
||||
<td>
|
||||
<strong><%= investment.id %></strong>
|
||||
</td>
|
||||
<td>
|
||||
<%= link_to investment.title, tracking_budget_budget_investment_path(@budget, investment) %>
|
||||
</td>
|
||||
<td class="small">
|
||||
<%= investment.heading.name %>
|
||||
</td>
|
||||
<td class="small">
|
||||
<%= link_to t("tracking.budget_investments.index.edit"),
|
||||
edit_tracking_budget_budget_investment_path(@budget, investment),
|
||||
class: "button hollow expanded" %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<%= paginate @investments %>
|
||||
<% else %>
|
||||
<div class="callout primary">
|
||||
<%= t("tracking.budget_investments.index.no_investments") %>
|
||||
</div>
|
||||
<% end %>
|
||||
47
app/views/tracking/budget_investments/show.html.erb
Normal file
47
app/views/tracking/budget_investments/show.html.erb
Normal file
@@ -0,0 +1,47 @@
|
||||
<%= back_link_to tracking_budget_budget_investments_path %>
|
||||
|
||||
<h2><%= t("tracking.budget_investments.show.title") %> <%= @investment.id %> </h2>
|
||||
<h1><%= @investment.title %></h1>
|
||||
|
||||
<%= safe_html_with_links @investment.description %>
|
||||
|
||||
<% if @investment.external_url.present? %>
|
||||
<p><%= text_with_links @investment.external_url %></p>
|
||||
<% end %>
|
||||
|
||||
<h2><%= t("tracking.budget_investments.show.info") %></h2>
|
||||
|
||||
<p><strong><%= t("tracking.budget_investments.show.by") %>:</strong>
|
||||
<%= @investment.author.name %>
|
||||
</p>
|
||||
|
||||
<p><strong><%= t("tracking.budget_investments.show.heading") %>:</strong>
|
||||
<%= @investment.heading.name %>
|
||||
</p>
|
||||
|
||||
<p><strong><%= t("tracking.budget_investments.show.sent") %>:</strong>
|
||||
<%= l @investment.created_at, format: :datetime %>
|
||||
</p>
|
||||
|
||||
<h2><%= t("tracking.budget_investments.show.responsibles") %></h2>
|
||||
|
||||
<p><strong><%= t("tracking.budget_investments.show.assigned_admin") %>:</strong>
|
||||
<% if @investment.administrator.present? %>
|
||||
<%= @investment.administrator.name_and_email %>
|
||||
<% else %>
|
||||
<%= t("tracking.budget_investments.show.undefined") %>
|
||||
<% end %>
|
||||
</p>
|
||||
|
||||
<p><strong><%= t("trackers.budget_investments.show.assigned_trackers") %>:</strong></p>
|
||||
<div id="assigned_trackers">
|
||||
<ul>
|
||||
<% @investment.trackers.each do |tracker| %>
|
||||
<li><%= tracker.name_and_email %></li>
|
||||
<% end %>
|
||||
|
||||
<% if @investment.trackers.empty? %>
|
||||
<li><%= t("tracking.budget_investments.show.undefined") %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
36
app/views/tracking/budgets/index.html.erb
Normal file
36
app/views/tracking/budgets/index.html.erb
Normal file
@@ -0,0 +1,36 @@
|
||||
<h2 class="inline-block"><%= t("tracking.budgets.index.title") %></h2>
|
||||
|
||||
<% if @budget.present? %>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= t("tracking.budgets.index.table_name") %></th>
|
||||
<th><%= t("tracking.budgets.index.table_phase") %></th>
|
||||
<th><%= t("tracking.budgets.index.table_assigned_investments_tracking_open") %></th>
|
||||
<th><%= t("tracking.budgets.index.table_actions") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr id="<%= dom_id(@budget) %>" class="budget">
|
||||
<td>
|
||||
<%= @budget.name %>
|
||||
</td>
|
||||
<td>
|
||||
<%= t("budgets.phase.#{@budget.phase}") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= @investments.count %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link_to t("tracking.budgets.index.tracking"),
|
||||
tracking_budget_budget_investments_path(budget_id: @budget.id),
|
||||
class: "button hollow expanded" %>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<% else %>
|
||||
<div class="callout primary clear">
|
||||
<%= t("tracking.budgets.index.no_budgets") %>
|
||||
</div>
|
||||
<% end %>
|
||||
@@ -1,13 +1,13 @@
|
||||
<%= render "admin/shared/globalize_locales", resource: @milestone %>
|
||||
|
||||
<%= translatable_form_for [:admin, *resource_hierarchy_for(@milestone)] do |f| %>
|
||||
<%= translatable_form_for [:tracking, *resource_hierarchy_for(@milestone)] do |f| %>
|
||||
|
||||
<div class="small-12 medium-6 margin-bottom">
|
||||
<%= f.select :status_id,
|
||||
@statuses.collect { |s| [s.name, s.id] },
|
||||
{ include_blank: @statuses.any? ? "" : t("admin.milestones.form.no_statuses_defined") },
|
||||
{ include_blank: @statuses.any? ? "" : t("tracking.milestones.form.no_statuses_defined") },
|
||||
{ disabled: @statuses.blank? } %>
|
||||
<%= link_to t("admin.milestones.form.admin_statuses"),
|
||||
<%= link_to t("tracking.milestones.form.admin_statuses"),
|
||||
admin_milestone_statuses_path %>
|
||||
</div>
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
|
||||
<%= translations_form.text_area :description,
|
||||
rows: 5,
|
||||
label: t("admin.milestones.new.description") %>
|
||||
label: t("tracking.milestones.new.description") %>
|
||||
<% end %>
|
||||
|
||||
<%= f.label :publication_date, t("admin.milestones.new.date") %>
|
||||
<%= f.label :publication_date, t("tracking.milestones.new.date") %>
|
||||
<%= f.text_field :publication_date,
|
||||
value: @milestone.publication_date.present? ? l(@milestone.publication_date.to_date) : nil,
|
||||
label: false,
|
||||
@@ -1,7 +1,7 @@
|
||||
<h2 class="inline-block"><%= t("admin.milestones.index.milestone") %></h2>
|
||||
<h2 class="inline-block"><%= t("tracking.milestones.index.milestone") %></h2>
|
||||
|
||||
<%= link_to t("admin.progress_bars.manage"),
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(milestoneable.progress_bars.new)]),
|
||||
<%= link_to t("tracking.progress_bars.manage"),
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(milestoneable.progress_bars.new)]),
|
||||
class: "button hollow float-right" %>
|
||||
|
||||
<% if milestoneable.milestone_tag_list.any? %>
|
||||
@@ -16,14 +16,14 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= t("admin.milestones.index.table_id") %></th>
|
||||
<th><%= t("admin.milestones.index.table_title") %></th>
|
||||
<th><%= t("admin.milestones.index.table_description") %></th>
|
||||
<th><%= t("admin.milestones.index.table_publication_date") %></th>
|
||||
<th><%= t("admin.milestones.index.table_status") %></th>
|
||||
<th><%= t("admin.milestones.index.image") %></th>
|
||||
<th><%= t("admin.milestones.index.documents") %></th>
|
||||
<th><%= t("admin.milestones.index.table_actions") %></th>
|
||||
<th><%= t("tracking.milestones.index.table_id") %></th>
|
||||
<th><%= t("tracking.milestones.index.table_title") %></th>
|
||||
<th><%= t("tracking.milestones.index.table_description") %></th>
|
||||
<th><%= t("tracking.milestones.index.table_publication_date") %></th>
|
||||
<th><%= t("tracking.milestones.index.table_status") %></th>
|
||||
<th><%= t("tracking.milestones.index.image") %></th>
|
||||
<th><%= t("tracking.milestones.index.documents") %></th>
|
||||
<th><%= t("tracking.milestones.index.table_actions") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -32,7 +32,7 @@
|
||||
<td class="text-center"><%= milestone.id %></td>
|
||||
<td>
|
||||
<%= link_to milestone.title,
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(milestone)],
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(milestone)],
|
||||
action: :edit) %>
|
||||
</td>
|
||||
<td class="small small-5"><%= milestone.description %></td>
|
||||
@@ -43,7 +43,7 @@
|
||||
<%= milestone.status.present? ? milestone.status.name : "" %>
|
||||
</td>
|
||||
<td class="small">
|
||||
<%= link_to t("admin.milestones.index.show_image"),
|
||||
<%= link_to t("tracking.milestones.index.show_image"),
|
||||
milestone.image_url(:large),
|
||||
target: :_blank if milestone.image.present? %>
|
||||
</td>
|
||||
@@ -58,8 +58,8 @@
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="small-2">
|
||||
<%= link_to t("admin.milestones.index.delete"),
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(milestone)]),
|
||||
<%= link_to t("tracking.milestones.index.delete"),
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(milestone)]),
|
||||
method: :delete,
|
||||
class: "button hollow alert expanded" %>
|
||||
</td>
|
||||
@@ -68,12 +68,12 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<% else %>
|
||||
<p><%= t("admin.milestones.index.no_milestones") %></p>
|
||||
<p><%= t("tracking.milestones.index.no_milestones") %></p>
|
||||
<% end %>
|
||||
|
||||
<p>
|
||||
<%= link_to t("admin.milestones.index.new_milestone"),
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(milestoneable.milestones.new)],
|
||||
<%= link_to t("tracking.milestones.index.new_milestone"),
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(milestoneable.milestones.new)],
|
||||
action: :new),
|
||||
class: "button hollow" %>
|
||||
</p>
|
||||
@@ -1,6 +1,6 @@
|
||||
<%= back_link_to milestoneable_path %>
|
||||
|
||||
<h2><%= t("admin.milestones.edit.title") %></h2>
|
||||
<h2><%= t("tracking.milestones.edit.title") %></h2>
|
||||
|
||||
<div class="milestone-edit">
|
||||
<%= render "form" %>
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="small-12 column">
|
||||
<%= back_link_to milestoneable_path %>
|
||||
|
||||
<h1><%= t("admin.milestones.new.creating") %></h1>
|
||||
<h1><%= t("tracking.milestones.new.creating") %></h1>
|
||||
|
||||
<%= render "form" %>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<%= render "admin/shared/globalize_locales", resource: @progress_bar %>
|
||||
|
||||
<%= translatable_form_for [:admin, *resource_hierarchy_for(@progress_bar)] do |f| %>
|
||||
<%= translatable_form_for [:tracking, *resource_hierarchy_for(@progress_bar)] do |f| %>
|
||||
|
||||
<div class="small-12 medium-6">
|
||||
<%= f.enum_select :kind %>
|
||||
@@ -1,8 +1,8 @@
|
||||
<h2 class="inline-block"><%= t("admin.progress_bars.index.title") %></h2>
|
||||
<h2 class="inline-block"><%= t("tracking.progress_bars.index.title") %></h2>
|
||||
|
||||
<%= link_to t("admin.progress_bars.index.new_progress_bar"),
|
||||
<%= link_to t("tracking.progress_bars.index.new_progress_bar"),
|
||||
polymorphic_path(
|
||||
[:admin, *resource_hierarchy_for(ProgressBar.new(progressable: progressable))],
|
||||
[:tracking, *resource_hierarchy_for(ProgressBar.new(progressable: progressable))],
|
||||
action: :new
|
||||
),
|
||||
class: "button float-right" %>
|
||||
@@ -11,10 +11,10 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= t("admin.progress_bars.index.table_id") %></th>
|
||||
<th><%= t("admin.progress_bars.index.table_kind") %></th>
|
||||
<th><%= t("admin.progress_bars.index.table_title") %></th>
|
||||
<th class="text-center"><%= t("admin.progress_bars.index.table_percentage") %></th>
|
||||
<th><%= t("tracking.progress_bars.index.table_id") %></th>
|
||||
<th><%= t("tracking.progress_bars.index.table_kind") %></th>
|
||||
<th><%= t("tracking.progress_bars.index.table_title") %></th>
|
||||
<th class="text-center"><%= t("tracking.progress_bars.index.table_percentage") %></th>
|
||||
<th><%= t("admin.actions.actions") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -29,7 +29,7 @@
|
||||
<% if progress_bar.title.present? %>
|
||||
<%= progress_bar.title %>
|
||||
<% else %>
|
||||
<strong><%= t("admin.progress_bars.index.primary") %></strong>
|
||||
<strong><%= t("tracking.progress_bars.index.primary") %></strong>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@@ -37,12 +37,12 @@
|
||||
</td>
|
||||
<td>
|
||||
<%= link_to t("admin.actions.edit"),
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(progress_bar)],
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(progress_bar)],
|
||||
action: :edit),
|
||||
class: "button hollow" %>
|
||||
|
||||
<%= link_to t("admin.actions.delete"),
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(progress_bar)]),
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(progress_bar)]),
|
||||
method: :delete,
|
||||
class: "button hollow alert" %>
|
||||
</td>
|
||||
@@ -52,6 +52,6 @@
|
||||
</table>
|
||||
<% else %>
|
||||
<div class="callout primary">
|
||||
<%= t("admin.progress_bars.index.no_progress_bars") %>
|
||||
<%= t("tracking.progress_bars.index.no_progress_bars") %>
|
||||
</div>
|
||||
<% end %>
|
||||
15
app/views/tracking/progress_bars/edit.html.erb
Normal file
15
app/views/tracking/progress_bars/edit.html.erb
Normal file
@@ -0,0 +1,15 @@
|
||||
<% if @progress_bar.primary? %>
|
||||
<% bar_title = t("tracking.progress_bars.edit.title.primary") %>
|
||||
<% else %>
|
||||
<% bar_title = t("tracking.progress_bars.edit.title.secondary", title: @progress_bar.title) %>
|
||||
<% end %>
|
||||
|
||||
<% provide :title do %>
|
||||
<%= "#{t("tracking.header.title")} - #{bar_title}" %>
|
||||
<% end %>
|
||||
|
||||
<%= back_link_to progress_bars_index %>
|
||||
|
||||
<h2><%= bar_title %></h2>
|
||||
|
||||
<%= render "form" %>
|
||||
9
app/views/tracking/progress_bars/index.html.erb
Normal file
9
app/views/tracking/progress_bars/index.html.erb
Normal file
@@ -0,0 +1,9 @@
|
||||
<% provide :title do %>
|
||||
<%= "#{t("admin.header.title")} - #{t("tracking.progress_bars.index.title")}" %>
|
||||
<% end %>
|
||||
|
||||
<%= back_link_to tracker_back_path(@progressable) %>
|
||||
|
||||
<div class="clear"></div>
|
||||
|
||||
<%= render "tracking/progress_bars/progress_bars", progressable: @progressable %>
|
||||
9
app/views/tracking/progress_bars/new.html.erb
Normal file
9
app/views/tracking/progress_bars/new.html.erb
Normal file
@@ -0,0 +1,9 @@
|
||||
<% provide :title do %>
|
||||
<%= "#{t("admin.header.title")} - #{t("tracking.progress_bars.new.creating")}" %>
|
||||
<% end %>
|
||||
|
||||
<%= back_link_to progress_bars_index %>
|
||||
|
||||
<h2><%= t("tracking.progress_bars.new.creating") %></h2>
|
||||
|
||||
<%= render "form" %>
|
||||
@@ -47,6 +47,7 @@ data:
|
||||
- config/locales/%{locale}/milestones.yml
|
||||
- config/locales/%{locale}/stats.yml
|
||||
- config/locales/%{locale}/download.yml
|
||||
- config/locales/%{locale}/tracking.yml
|
||||
|
||||
# Locale files to write new keys to, based on a list of key pattern => file rules. Matched from top to bottom:
|
||||
# `i18n-tasks normalize -p` will force move the keys according to these rules
|
||||
|
||||
@@ -261,6 +261,7 @@ en:
|
||||
"false": "No"
|
||||
valuator_groups: "Valuator Groups"
|
||||
preview: Investment preview
|
||||
assigned_trackers: "Assigned trackers"
|
||||
edit:
|
||||
classification: Classification
|
||||
compatibility: Compatibility
|
||||
@@ -275,39 +276,12 @@ en:
|
||||
tags_placeholder: "Write the tags you want separated by commas (,)"
|
||||
undefined: Undefined
|
||||
user_groups: "Groups"
|
||||
assigned_trackers: "Trackers"
|
||||
milestone_tags: Milestone tags
|
||||
search_unfeasible: Search unfeasible
|
||||
milestones:
|
||||
index:
|
||||
table_id: "ID"
|
||||
table_title: "Title"
|
||||
table_description: "Description"
|
||||
table_publication_date: "Publication date"
|
||||
table_status: Status
|
||||
table_actions: "Actions"
|
||||
delete: "Delete milestone"
|
||||
no_milestones: "Don't have defined milestones"
|
||||
image: "Image"
|
||||
show_image: "Show image"
|
||||
documents: "Documents"
|
||||
milestone: Milestone
|
||||
new_milestone: Create new milestone
|
||||
milestone_tags: Milestone Tags
|
||||
form:
|
||||
admin_statuses: Manage statuses
|
||||
no_statuses_defined: There are no defined statuses yet
|
||||
new:
|
||||
creating: Create milestone
|
||||
date: Date
|
||||
description: Description
|
||||
edit:
|
||||
title: Edit milestone
|
||||
create:
|
||||
notice: New milestone created successfully!
|
||||
update:
|
||||
notice: Milestone updated successfully
|
||||
delete:
|
||||
notice: Milestone successfully deleted
|
||||
statuses:
|
||||
index:
|
||||
title: Milestone statuses
|
||||
@@ -734,6 +708,7 @@ en:
|
||||
title_booths: Voting booths
|
||||
legislation: Collaborative Legislation
|
||||
users: Users
|
||||
trackers: "Trackers"
|
||||
dashboard: Proposals dashboard
|
||||
administrator_tasks: Resources requested
|
||||
dashboard_actions: Resources and actions
|
||||
@@ -1648,3 +1623,26 @@ en:
|
||||
edited_by: "Edited by"
|
||||
actions: "Actions"
|
||||
empty: "There are not changes logged"
|
||||
trackers:
|
||||
index:
|
||||
title: Trackers
|
||||
name: Name
|
||||
email: Email
|
||||
description: Description
|
||||
no_description: No description
|
||||
no_trackers: There are no trackers.
|
||||
tracker:
|
||||
add: "Add to trackers"
|
||||
form:
|
||||
update: Update Tracker
|
||||
updated: "Tracker updated succesfully."
|
||||
edit_title: "Trackers: Edit tracker"
|
||||
show:
|
||||
email: Email
|
||||
description: Description
|
||||
no_description: No description.
|
||||
search:
|
||||
title: Trackers
|
||||
progress_bars:
|
||||
index:
|
||||
title: "Progress bars"
|
||||
|
||||
@@ -260,6 +260,7 @@ en:
|
||||
other: You have %{count} new notifications
|
||||
notifications: Notifications
|
||||
no_notifications: "You don't have new notifications"
|
||||
tracking: "Tracking"
|
||||
admin:
|
||||
watch_form_message: "You have unsaved changes. Do you confirm to leave the page?"
|
||||
notifications:
|
||||
|
||||
92
config/locales/en/tracking.yml
Normal file
92
config/locales/en/tracking.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
en:
|
||||
tracking:
|
||||
header:
|
||||
title: Tracking
|
||||
menu:
|
||||
title: Tracking
|
||||
budgets: Participatory budgets
|
||||
budgets:
|
||||
index:
|
||||
title: Participatory budgets
|
||||
table_name: Name
|
||||
table_phase: Phase
|
||||
table_assigned_investments_tracking_open: Investment projects assigned with tracking open
|
||||
table_actions: Actions
|
||||
tracking: Tracking
|
||||
no_budgets: "There are no budgets"
|
||||
budget_investments:
|
||||
index:
|
||||
assigned_to: "Assigned to %{tracker}"
|
||||
title: Investment projects
|
||||
edit: Edit milestones
|
||||
table_id: ID
|
||||
table_title: Title
|
||||
table_heading_name: Heading name
|
||||
table_actions: Actions
|
||||
no_investments: "There are no investment projects."
|
||||
show:
|
||||
title: Investment project
|
||||
info: Author info
|
||||
by: Sent by
|
||||
sent: Sent at
|
||||
heading: Heading
|
||||
undefined: "Undefined"
|
||||
responsibles: Responsibles
|
||||
assigned_admin: Assigned admin
|
||||
milestones:
|
||||
index:
|
||||
table_id: "ID"
|
||||
table_title: "Title"
|
||||
table_description: "Description"
|
||||
table_publication_date: "Publication date"
|
||||
table_status: Status
|
||||
table_actions: "Actions"
|
||||
delete: "Delete milestone"
|
||||
no_milestones: "Don't have defined milestones"
|
||||
image: "Image"
|
||||
show_image: "Show image"
|
||||
documents: "Documents"
|
||||
milestone: Milestone
|
||||
new_milestone: Create new milestone
|
||||
form:
|
||||
admin_statuses: Manage statuses
|
||||
no_statuses_defined: There are no defined statuses yet
|
||||
new:
|
||||
creating: Create milestone
|
||||
date: Date
|
||||
description: Description
|
||||
edit:
|
||||
title: Edit milestone
|
||||
create:
|
||||
notice: New milestone created successfully!
|
||||
update:
|
||||
notice: Milestone updated successfully
|
||||
delete:
|
||||
notice: Milestone successfully deleted
|
||||
progress_bars:
|
||||
manage: "Manage progress bars"
|
||||
index:
|
||||
title: "Progress bars"
|
||||
no_progress_bars: "There are no progress bars"
|
||||
new_progress_bar: "Create new progress bar"
|
||||
primary: "Primary progress bar"
|
||||
table_id: "ID"
|
||||
table_kind: "Type"
|
||||
table_title: "Title"
|
||||
table_percentage: "Current progress"
|
||||
new:
|
||||
creating: "Create progress bar"
|
||||
edit:
|
||||
title:
|
||||
primary: "Edit primary progress bar"
|
||||
secondary: "Edit progress bar %{title}"
|
||||
create:
|
||||
notice: "Progress bar created successfully!"
|
||||
update:
|
||||
notice: "Progress bar updated successfully"
|
||||
delete:
|
||||
notice: "Progress bar deleted successfully"
|
||||
trackers:
|
||||
budget_investments:
|
||||
show:
|
||||
assigned_trackers: "Assigned trackers"
|
||||
@@ -261,6 +261,7 @@ es:
|
||||
"false": "No"
|
||||
valuator_groups: "Grupos de evaluadores"
|
||||
preview: Vista previa
|
||||
assigned_trackers: "Gestores de seguimiento asignados"
|
||||
edit:
|
||||
classification: Clasificación
|
||||
compatibility: Compatibilidad
|
||||
@@ -275,39 +276,12 @@ es:
|
||||
tags_placeholder: "Escribe las etiquetas que desees separadas por comas (,)"
|
||||
undefined: Sin definir
|
||||
user_groups: "Grupos"
|
||||
assigned_trackers: "Gestores de seguimiento"
|
||||
milestone_tags: Etiquetas de Seguimiento
|
||||
search_unfeasible: Buscar inviables
|
||||
milestones:
|
||||
index:
|
||||
table_id: "ID"
|
||||
table_title: "Título"
|
||||
table_description: "Descripción"
|
||||
table_publication_date: "Fecha de publicación"
|
||||
table_status: Estado
|
||||
table_actions: "Acciones"
|
||||
delete: "Eliminar hito"
|
||||
no_milestones: "No hay hitos definidos"
|
||||
image: "Imagen"
|
||||
show_image: "Mostrar imagen"
|
||||
documents: "Documentos"
|
||||
milestone: Seguimiento
|
||||
new_milestone: Crear nuevo hito
|
||||
milestone_tags: Etiquetas de Seguimiento
|
||||
form:
|
||||
admin_statuses: Gestionar estados
|
||||
no_statuses_defined: No hay estados definidos
|
||||
new:
|
||||
creating: Crear hito
|
||||
date: Fecha
|
||||
description: Descripción
|
||||
edit:
|
||||
title: Editar hito
|
||||
create:
|
||||
notice: '¡Nuevo hito creado con éxito!'
|
||||
update:
|
||||
notice: Hito actualizado
|
||||
delete:
|
||||
notice: Hito borrado correctamente
|
||||
statuses:
|
||||
index:
|
||||
title: Estados de seguimiento
|
||||
@@ -735,6 +709,7 @@ es:
|
||||
title_booths: Urnas de votación
|
||||
legislation: Legislación colaborativa
|
||||
users: Usuarios
|
||||
trackers: "Gestores de seguimiento"
|
||||
dashboard: Panel de progreso de propuestas
|
||||
administrator_tasks: Recursos solicitados
|
||||
dashboard_actions: Recursos y acciones
|
||||
@@ -1646,3 +1621,26 @@ es:
|
||||
edited_by: "Editado por"
|
||||
actions: "Acciones"
|
||||
empty: "No hay cambios registrados"
|
||||
trackers:
|
||||
index:
|
||||
title: Gestores de seguimiento
|
||||
name: Nombre
|
||||
email: Email
|
||||
description: Descripción
|
||||
no_description: Sin descripción
|
||||
no_trackers: No hay gestores de seguimiento.
|
||||
tracker:
|
||||
add: "Añadir a gestores de seguimiento"
|
||||
form:
|
||||
update: "Actualizar gestor"
|
||||
updated: "Gestor de seguimiento actualizado correctamente."
|
||||
edit_title: "Gestores de seguimiento: Editar gestor"
|
||||
show:
|
||||
email: Email
|
||||
description: Descripción
|
||||
no_description: Sin descripción.
|
||||
search:
|
||||
title: Trackers
|
||||
progress_bars:
|
||||
index:
|
||||
title: "Barras de progreso"
|
||||
|
||||
@@ -260,6 +260,7 @@ es:
|
||||
other: Tienes %{count} notificaciones nuevas
|
||||
notifications: Notificaciones
|
||||
no_notifications: "No tienes notificaciones nuevas"
|
||||
tracking: "Seguimiento"
|
||||
admin:
|
||||
watch_form_message: "Has realizado cambios que no han sido guardados. ¿Seguro que quieres abandonar la página?"
|
||||
notifications:
|
||||
|
||||
92
config/locales/es/tracking.yml
Normal file
92
config/locales/es/tracking.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
es:
|
||||
tracking:
|
||||
header:
|
||||
title: Seguimiento
|
||||
menu:
|
||||
title: Seguimiento
|
||||
budgets: Presupuestos participativos
|
||||
budgets:
|
||||
index:
|
||||
title: Presupuestos participativos
|
||||
table_name: Nombre
|
||||
table_phase: Fase
|
||||
table_assigned_investments_tracking_open: Prop. Inv. asignadas en segumiento
|
||||
table_actions: Acciones
|
||||
tracking: Seguimiento
|
||||
no_budgets: "No hay presupuestos"
|
||||
budget_investments:
|
||||
index:
|
||||
assigned_to: "Asignadas a %{tracker}"
|
||||
title: Proyectos de gasto
|
||||
edit: Editar seguimiento
|
||||
table_id: ID
|
||||
table_title: Título
|
||||
table_heading_name: Nombre de la partida
|
||||
table_actions: Acciones
|
||||
no_investments: "No hay proyectos de gasto."
|
||||
show:
|
||||
title: Proyecto de gasto
|
||||
info: Datos de envío
|
||||
by: Enviada por
|
||||
sent: Fecha de creación
|
||||
heading: Partida
|
||||
undefined: Sin definir
|
||||
responsibles: Responsables
|
||||
assigned_admin: Administrador asignado
|
||||
milestones:
|
||||
index:
|
||||
table_id: "ID"
|
||||
table_title: "Título"
|
||||
table_description: "Descripción"
|
||||
table_publication_date: "Fecha de publicación"
|
||||
table_status: Estado
|
||||
table_actions: "Acciones"
|
||||
delete: "Eliminar hito"
|
||||
no_milestones: "No hay hitos definidos"
|
||||
image: "Imagen"
|
||||
show_image: "Mostrar imagen"
|
||||
documents: "Documentos"
|
||||
milestone: Seguimiento
|
||||
new_milestone: Crear nuevo hito
|
||||
form:
|
||||
admin_statuses: Gestionar estados
|
||||
no_statuses_defined: No hay estados definidos
|
||||
new:
|
||||
creating: Crear hito
|
||||
date: Fecha
|
||||
description: Descripción
|
||||
edit:
|
||||
title: Editar hito
|
||||
create:
|
||||
notice: "¡Nuevo hito creado con éxito!"
|
||||
update:
|
||||
notice: Hito actualizado
|
||||
delete:
|
||||
notice: Hito borrado correctamente
|
||||
progress_bars:
|
||||
manage: "Gestionar barras de progreso"
|
||||
index:
|
||||
title: "Barras de progreso"
|
||||
no_progress_bars: "No hay barras de progreso"
|
||||
new_progress_bar: "Crear nueva barra de progreso"
|
||||
primary: "Barra de progreso principal"
|
||||
table_id: "ID"
|
||||
table_kind: "Tipo"
|
||||
table_title: "Título"
|
||||
table_percentage: "Progreso"
|
||||
new:
|
||||
creating: "Crear barra de progreso"
|
||||
edit:
|
||||
title:
|
||||
primary: "Editar barra de progreso principal"
|
||||
secondary: "Editar barra de progreso %{title}"
|
||||
create:
|
||||
notice: "¡Barra de progreso creada con éxito!"
|
||||
update:
|
||||
notice: "Barra de progreso actualizada"
|
||||
delete:
|
||||
notice: "Barra de progreso eliminada correctamente"
|
||||
trackers:
|
||||
budget_investments:
|
||||
show:
|
||||
assigned_trackers: "Gestores de seguimiento asignados"
|
||||
@@ -31,6 +31,7 @@ Rails.application.routes.draw do
|
||||
draw :tag
|
||||
draw :user
|
||||
draw :valuation
|
||||
draw :tracking
|
||||
draw :verification
|
||||
|
||||
root "welcome#index"
|
||||
|
||||
@@ -61,8 +61,6 @@ namespace :admin do
|
||||
end
|
||||
|
||||
resources :budget_investments, only: [:index, :show, :edit, :update] do
|
||||
resources :milestones, controller: "budget_investment_milestones"
|
||||
resources :progress_bars, except: :show, controller: "budget_investment_progress_bars"
|
||||
member { patch :toggle_selection }
|
||||
end
|
||||
|
||||
@@ -105,6 +103,11 @@ namespace :admin do
|
||||
get :summary, on: :collection
|
||||
end
|
||||
|
||||
resources :trackers, only: [:show, :index, :edit, :update, :create, :destroy] do
|
||||
get :search, on: :collection
|
||||
get :summary, on: :collection
|
||||
end
|
||||
|
||||
resources :valuator_groups
|
||||
|
||||
resources :managers, only: [:index, :create, :destroy] do
|
||||
@@ -207,8 +210,7 @@ namespace :admin do
|
||||
member { patch :toggle_selection }
|
||||
end
|
||||
resources :draft_versions
|
||||
resources :milestones
|
||||
resources :progress_bars, except: :show
|
||||
resources :milestones, only: :index
|
||||
resource :homepage, only: [:edit, :update]
|
||||
end
|
||||
end
|
||||
|
||||
23
config/routes/tracking.rb
Normal file
23
config/routes/tracking.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
namespace :tracking do
|
||||
root to: "budgets#index"
|
||||
|
||||
resources :budgets, only: :index do
|
||||
resources :budget_investments, only: [:index, :show, :edit] do
|
||||
resources :milestones, controller: "budget_investment_milestones"
|
||||
resources :progress_bars, except: :show, controller: "budget_investment_progress_bars"
|
||||
patch :track, on: :member
|
||||
end
|
||||
end
|
||||
|
||||
resources :proposals, only: [:index, :show] do
|
||||
resources :milestones, controller: "proposal_milestones"
|
||||
resources :progress_bars, except: :show, controller: "proposal_progress_bars"
|
||||
end
|
||||
|
||||
namespace :legislation do
|
||||
resources :processes, only: [:index, :show] do
|
||||
resources :milestones
|
||||
resources :progress_bars, except: :show
|
||||
end
|
||||
end
|
||||
end
|
||||
11
db/migrate/20190426075419_create_trackers.rb
Normal file
11
db/migrate/20190426075419_create_trackers.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
class CreateTrackers < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :trackers do |t|
|
||||
t.references :user, foreign_key: true
|
||||
t.string :description
|
||||
t.integer :budget_investment_count, default: 0
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,10 @@
|
||||
class CreateBudgetTrackerAssignments < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :budget_tracker_assignments, index: false do |t|
|
||||
t.references :tracker, foreign_key: true
|
||||
t.integer :investment_id, index: true
|
||||
|
||||
t.timestamps null:false
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class AddTrackerAssignmentsCountToBudgetInvestments < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
add_column :budget_investments, :tracker_assignments_count, :integer
|
||||
end
|
||||
end
|
||||
21
db/schema.rb
21
db/schema.rb
@@ -269,6 +269,7 @@ ActiveRecord::Schema.define(version: 20190607160900) do
|
||||
t.datetime "confirmed_hide_at"
|
||||
t.datetime "ignored_flag_at"
|
||||
t.integer "flags_count", default: 0
|
||||
t.integer "tracker_assignments_count"
|
||||
t.index ["administrator_id"], name: "index_budget_investments_on_administrator_id", using: :btree
|
||||
t.index ["author_id"], name: "index_budget_investments_on_author_id", using: :btree
|
||||
t.index ["community_id"], name: "index_budget_investments_on_community_id", using: :btree
|
||||
@@ -310,6 +311,15 @@ ActiveRecord::Schema.define(version: 20190607160900) do
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "budget_tracker_assignments", force: :cascade do |t|
|
||||
t.integer "tracker_id"
|
||||
t.integer "investment_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["investment_id"], name: "index_budget_tracker_assignments_on_investment_id", using: :btree
|
||||
t.index ["tracker_id"], name: "index_budget_tracker_assignments_on_tracker_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "budget_translations", force: :cascade do |t|
|
||||
t.integer "budget_id", null: false
|
||||
t.string "locale", null: false
|
||||
@@ -1427,6 +1437,15 @@ ActiveRecord::Schema.define(version: 20190607160900) do
|
||||
t.index ["hidden_at"], name: "index_topics_on_hidden_at", using: :btree
|
||||
end
|
||||
|
||||
create_table "trackers", force: :cascade do |t|
|
||||
t.integer "user_id"
|
||||
t.string "description"
|
||||
t.integer "budget_investment_count", default: 0
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["user_id"], name: "index_trackers_on_user_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "users", force: :cascade do |t|
|
||||
t.string "email", default: ""
|
||||
t.string "encrypted_password", default: "", null: false
|
||||
@@ -1612,6 +1631,7 @@ ActiveRecord::Schema.define(version: 20190607160900) do
|
||||
|
||||
add_foreign_key "administrators", "users"
|
||||
add_foreign_key "budget_investments", "communities"
|
||||
add_foreign_key "budget_tracker_assignments", "trackers"
|
||||
add_foreign_key "dashboard_administrator_tasks", "users"
|
||||
add_foreign_key "dashboard_executed_actions", "dashboard_actions", column: "action_id"
|
||||
add_foreign_key "dashboard_executed_actions", "proposals"
|
||||
@@ -1650,6 +1670,7 @@ ActiveRecord::Schema.define(version: 20190607160900) do
|
||||
add_foreign_key "proposals", "communities"
|
||||
add_foreign_key "related_content_scores", "related_contents"
|
||||
add_foreign_key "related_content_scores", "users"
|
||||
add_foreign_key "trackers", "users"
|
||||
add_foreign_key "users", "geozones"
|
||||
add_foreign_key "valuators", "users"
|
||||
end
|
||||
|
||||
@@ -67,6 +67,10 @@ FactoryBot.define do
|
||||
user
|
||||
end
|
||||
|
||||
factory :tracker do
|
||||
user
|
||||
end
|
||||
|
||||
factory :valuator do
|
||||
user
|
||||
end
|
||||
|
||||
@@ -4,6 +4,6 @@ describe "Admin budget investment milestones" do
|
||||
|
||||
it_behaves_like "translatable",
|
||||
"milestone",
|
||||
"edit_admin_budget_budget_investment_milestone_path",
|
||||
"edit_tracking_budget_budget_investment_milestone_path",
|
||||
%w[description]
|
||||
end
|
||||
|
||||
@@ -108,7 +108,7 @@ describe "Poll Officing" do
|
||||
expect(page).not_to have_link("Moderation")
|
||||
end
|
||||
|
||||
scenario "Officing dashboard" do
|
||||
xscenario "Officing dashboard" do
|
||||
create(:poll_officer, user: user)
|
||||
create(:poll)
|
||||
login_as(user)
|
||||
|
||||
365
spec/features/tracking/budget_investments_spec.rb
Normal file
365
spec/features/tracking/budget_investments_spec.rb
Normal file
@@ -0,0 +1,365 @@
|
||||
require "rails_helper"
|
||||
|
||||
feature "Valuation budget investments" do
|
||||
|
||||
let(:budget) { create(:budget) }
|
||||
let(:tracker) do
|
||||
create(:tracker, user: create(:user, username: "Rachel", email: "rachel@trackers.org"))
|
||||
end
|
||||
|
||||
background do
|
||||
login_as(tracker.user)
|
||||
end
|
||||
|
||||
scenario "Disabled with a feature flag" do
|
||||
Setting["process.budgets"] = nil
|
||||
expect{
|
||||
visit tracking_budget_budget_investments_path(create(:budget))
|
||||
}.to raise_exception(FeatureFlags::FeatureDisabled)
|
||||
end
|
||||
|
||||
scenario "Display link to tracking section" do
|
||||
visit root_path
|
||||
expect(page).to have_link "Tracking", href: tracking_root_path
|
||||
end
|
||||
|
||||
feature "Index" do
|
||||
scenario "Index shows budget investments assigned to current tracker" do
|
||||
investment1 = create(:budget_investment, budget: budget)
|
||||
investment2 = create(:budget_investment, budget: budget)
|
||||
|
||||
investment1.trackers << tracker
|
||||
|
||||
visit tracking_budget_budget_investments_path(budget)
|
||||
|
||||
expect(page).to have_content(investment1.title)
|
||||
expect(page).not_to have_content(investment2.title)
|
||||
end
|
||||
|
||||
scenario "Index shows no budget investment to admins no trackers" do
|
||||
investment1 = create(:budget_investment, budget: budget)
|
||||
investment2 = create(:budget_investment, budget: budget)
|
||||
|
||||
investment1.trackers << tracker
|
||||
|
||||
logout
|
||||
login_as create(:administrator).user
|
||||
visit tracking_budget_budget_investments_path(budget)
|
||||
|
||||
expect(page).not_to have_content(investment1.title)
|
||||
expect(page).not_to have_content(investment2.title)
|
||||
end
|
||||
|
||||
scenario "Index displays investments paginated" do
|
||||
per_page = Kaminari.config.default_per_page
|
||||
(per_page + 2).times do
|
||||
investment = create(:budget_investment, budget: budget)
|
||||
investment.trackers << tracker
|
||||
end
|
||||
|
||||
visit tracking_budget_budget_investments_path(budget)
|
||||
|
||||
expect(page).to have_css(".budget_investment", count: per_page)
|
||||
within("ul.pagination") do
|
||||
expect(page).to have_content("1")
|
||||
expect(page).to have_content("2")
|
||||
expect(page).not_to have_content("3")
|
||||
click_link "Next", exact: false
|
||||
end
|
||||
|
||||
expect(page).to have_css(".budget_investment", count: 2)
|
||||
end
|
||||
|
||||
scenario "headings" do
|
||||
investment1 = create(:budget_investment,
|
||||
budget: budget,
|
||||
title: "investment 1",
|
||||
heading: create(:budget_heading, name: "first_heading"))
|
||||
investment2 = create(:budget_investment,
|
||||
budget: budget, title: "investment 2",
|
||||
heading: create(:budget_heading, name: "last_heading"))
|
||||
investment3 = create(:budget_investment,
|
||||
budget: budget,
|
||||
title: "investment 3",
|
||||
heading: create(:budget_heading, name: "no_heading"))
|
||||
|
||||
investment1.trackers << tracker
|
||||
investment2.trackers << tracker
|
||||
|
||||
visit tracking_budget_budget_investments_path(budget)
|
||||
|
||||
expect(page).to have_link("All headings (2)")
|
||||
expect(page).to have_link("last_heading (1)")
|
||||
expect(page).to have_link("first_heading (1)")
|
||||
expect(page).not_to have_link("no_heading (1)")
|
||||
|
||||
expect(page).to have_content("investment 1")
|
||||
expect(page).to have_content("investment 2")
|
||||
expect(page).not_to have_content("investment 3")
|
||||
|
||||
expect(page.find(".select-heading .is-active")).to have_content("All headings")
|
||||
|
||||
click_on "last_heading (1)"
|
||||
|
||||
expect(page.find(".select-heading .is-active")).to have_content("last_heading (1)")
|
||||
expect(page).not_to have_content("investment 1")
|
||||
expect(page).to have_content("investment 2")
|
||||
expect(page).not_to have_content("investment 3")
|
||||
end
|
||||
end
|
||||
|
||||
feature "Show" do
|
||||
let(:administrator) do
|
||||
create(:administrator, user: create(:user, username: "Ana", email: "ana@admins.org"))
|
||||
end
|
||||
let(:second_tracker) do
|
||||
create(:tracker, user: create(:user, username: "Rick", email: "rick@trackers.org"))
|
||||
end
|
||||
let(:investment) do
|
||||
create(:budget_investment, budget: budget, administrator: administrator)
|
||||
end
|
||||
|
||||
background do
|
||||
investment.trackers << [tracker, second_tracker]
|
||||
end
|
||||
|
||||
scenario "visible for assigned trackers" do
|
||||
visit tracking_budget_budget_investments_path(budget)
|
||||
|
||||
click_link investment.title
|
||||
|
||||
expect(page).to have_content(investment.title)
|
||||
expect(page).to have_content(investment.description)
|
||||
expect(page).to have_content(investment.author.name)
|
||||
expect(page).to have_content(investment.heading.name)
|
||||
|
||||
within("#assigned_trackers") do
|
||||
expect(page).to have_content("Rachel (rachel@trackers.org)")
|
||||
expect(page).to have_content("Rick (rick@trackers.org)")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "visible for admins" do
|
||||
logout
|
||||
login_as create(:administrator).user
|
||||
|
||||
visit tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).to have_content(investment.title)
|
||||
expect(page).to have_content(investment.description)
|
||||
expect(page).to have_content(investment.author.name)
|
||||
expect(page).to have_content(investment.heading.name)
|
||||
expect(page).to have_content("Ana (ana@admins.org)")
|
||||
|
||||
within("#assigned_trackers") do
|
||||
expect(page).to have_content("Rachel (rachel@trackers.org)")
|
||||
expect(page).to have_content("Rick (rick@trackers.org)")
|
||||
end
|
||||
end
|
||||
|
||||
scenario "not visible for not assigned trackers" do
|
||||
logout
|
||||
login_as create(:tracker).user
|
||||
|
||||
expect{
|
||||
visit tracking_budget_budget_investment_path(budget, investment)
|
||||
}.to raise_error "Not Found"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
feature "Milestones" do
|
||||
let(:admin) { create(:administrator) }
|
||||
let(:investment) do
|
||||
heading = create(:budget_heading)
|
||||
create(:budget_investment, heading: heading, budget: budget,
|
||||
administrator: admin)
|
||||
end
|
||||
|
||||
background do
|
||||
investment.trackers << tracker
|
||||
end
|
||||
|
||||
scenario "visit investment manage milestones" do
|
||||
|
||||
visit tracking_budget_budget_investments_path(budget)
|
||||
|
||||
click_link "Edit milestones"
|
||||
|
||||
expect(page).to have_content("Milestone")
|
||||
expect(page).to have_content(investment.title)
|
||||
end
|
||||
|
||||
scenario "create investment milestones" do
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Milestone")
|
||||
expect(page).to have_content(investment.title)
|
||||
|
||||
click_link "Create new milestone"
|
||||
|
||||
expect(page).to have_content("Create milestone")
|
||||
fill_in("Description", with: "Test Description")
|
||||
page.find("#milestone_publication_date").set(Date.today)
|
||||
|
||||
click_button "Create milestone"
|
||||
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Test Description")
|
||||
end
|
||||
|
||||
scenario "delete investment milestones" do
|
||||
milestone = create(:milestone,
|
||||
milestoneable: investment,
|
||||
description: "Test delete milestone")
|
||||
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Test delete milestone")
|
||||
|
||||
page.find("#milestone_#{milestone.id}").click_link("Delete milestone")
|
||||
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).not_to have_content("Test delete milestone")
|
||||
|
||||
end
|
||||
|
||||
scenario "edit investment milestones" do
|
||||
milestone = create(:milestone, milestoneable: investment, description: "Test edit milestone")
|
||||
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Test edit milestone")
|
||||
|
||||
page.find("#milestone_#{milestone.id}").first("a").click
|
||||
|
||||
expect(page).to have_content("Edit milestone")
|
||||
expect(page).to have_content("Test edit milestone")
|
||||
fill_in("Description", with: "Test edited milestone")
|
||||
|
||||
click_button "Update milestone"
|
||||
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
expect(page).not_to have_content("Test edit milestone")
|
||||
expect(page).to have_content("Test edited milestone")
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
feature "Progress Bars" do
|
||||
|
||||
let(:admin) { create(:administrator) }
|
||||
let(:investment) do
|
||||
heading = create(:budget_heading)
|
||||
create(:budget_investment, heading: heading, budget: budget,
|
||||
administrator: admin)
|
||||
end
|
||||
|
||||
background do
|
||||
investment.trackers << tracker
|
||||
end
|
||||
|
||||
scenario "view index" do
|
||||
visit edit_tracking_budget_budget_investment_path(budget, investment)
|
||||
|
||||
click_link "Manage progress bars"
|
||||
|
||||
expect(page).to have_content("Progress bars")
|
||||
|
||||
logout
|
||||
login_as create(:tracker, user: create(:user)).user
|
||||
|
||||
expect{
|
||||
visit tracking_budget_budget_investment_progress_bars_path(budget, investment)
|
||||
}.to raise_error "Not Found"
|
||||
end
|
||||
|
||||
scenario "create primary progress bar" do
|
||||
|
||||
visit tracking_budget_budget_investment_progress_bars_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Progress bars")
|
||||
|
||||
click_link "Create new progress bar"
|
||||
|
||||
expect(page).to have_content("Create progress bar")
|
||||
|
||||
select("Primary", :from => "Type")
|
||||
fill_in("Current progress", :with => 50)
|
||||
|
||||
click_button "Create Progress bar"
|
||||
|
||||
expect(page).to have_content("Progress bars")
|
||||
|
||||
expect(page).to have_content("Primary")
|
||||
end
|
||||
|
||||
scenario "create secondary progress bar" do
|
||||
|
||||
visit tracking_budget_budget_investment_progress_bars_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Progress bars")
|
||||
|
||||
click_link "Create new progress bar"
|
||||
|
||||
expect(page).to have_content("Create progress bar")
|
||||
|
||||
select("Secondary", :from => "Type")
|
||||
fill_in("Title", :with => "secondary_progress_bar")
|
||||
fill_in("Current progress", :with => 50)
|
||||
|
||||
click_button "Create Progress bar"
|
||||
|
||||
expect(page).to have_content("Progress bars")
|
||||
|
||||
expect(page).to have_content("secondary_progress_bar")
|
||||
end
|
||||
|
||||
scenario "delete" do
|
||||
primary_progress_bar = create(:progress_bar, progressable: investment)
|
||||
secondary_progress_bar = create(:progress_bar,
|
||||
:secondary,
|
||||
title: "to delete",
|
||||
progressable: investment)
|
||||
|
||||
visit tracking_budget_budget_investment_progress_bars_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Primary")
|
||||
expect(page).to have_content(secondary_progress_bar.title)
|
||||
|
||||
page.find("#progress_bar_#{secondary_progress_bar.id}").click_link("Delete")
|
||||
|
||||
visit tracking_budget_budget_investment_progress_bars_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Primary")
|
||||
expect(page).not_to have_content(secondary_progress_bar.title)
|
||||
end
|
||||
|
||||
scenario "edit" do
|
||||
primary_progress_bar = create(:progress_bar, progressable: investment)
|
||||
secondary_progress_bar = create(:progress_bar,
|
||||
:secondary,
|
||||
title: "to edit",
|
||||
progressable: investment)
|
||||
|
||||
visit tracking_budget_budget_investment_progress_bars_path(budget, investment)
|
||||
|
||||
expect(page).to have_content("Primary")
|
||||
expect(page).to have_content(secondary_progress_bar.title)
|
||||
|
||||
page.find("#progress_bar_#{secondary_progress_bar.id}").click_link("Edit")
|
||||
|
||||
fill_in("Title", :with => "edited")
|
||||
click_button "Update Progress bar"
|
||||
|
||||
expect(page).to have_content("Progress bars")
|
||||
|
||||
expect(page).to have_content("edited")
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
31
spec/features/tracking/budgets_spec.rb
Normal file
31
spec/features/tracking/budgets_spec.rb
Normal file
@@ -0,0 +1,31 @@
|
||||
require "rails_helper"
|
||||
|
||||
feature "Tracking budgets" do
|
||||
|
||||
background do
|
||||
@tracker = create(:tracker, user: create(:user, username: "Rachel", email: "rachel@trackers.org"))
|
||||
login_as(@tracker.user)
|
||||
end
|
||||
|
||||
scenario "Disabled with a feature flag" do
|
||||
Setting["process.budgets"] = nil
|
||||
expect{ visit tracking_budgets_path }.to raise_exception(FeatureFlags::FeatureDisabled)
|
||||
end
|
||||
|
||||
context "Index" do
|
||||
|
||||
scenario "Displaying budgets" do
|
||||
budget = create(:budget)
|
||||
visit tracking_budgets_path
|
||||
|
||||
expect(page).to have_content(budget.name)
|
||||
end
|
||||
|
||||
scenario "With no budgets" do
|
||||
visit tracking_budgets_path
|
||||
|
||||
expect(page).to have_content "There are no budgets"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -5,7 +5,7 @@ shared_examples "admin_progressable" do |factory_name, path_name|
|
||||
let(:progressable_path) { send(path_name, *resource_hierarchy_for(progressable)) }
|
||||
|
||||
let(:path) do
|
||||
polymorphic_path([:admin, *resource_hierarchy_for(progressable.progress_bars.new)])
|
||||
polymorphic_path([:tracking, *resource_hierarchy_for(progressable.progress_bars.new)])
|
||||
end
|
||||
|
||||
context "Index" do
|
||||
|
||||
Reference in New Issue
Block a user