decidim-admin 0.0.1.alpha7 → 0.0.1.alpha8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim-admin might be problematic. Click here for more details.

Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +619 -0
  3. data/README.md +1 -1
  4. data/app/assets/javascripts/decidim/admin/application.js.es6 +12 -0
  5. data/app/assets/javascripts/decidim/admin/sort_steps.js.es6 +21 -0
  6. data/app/assets/stylesheets/decidim/admin/_tables.scss +9 -0
  7. data/app/commands/decidim/admin/activate_participatory_process_step.rb +43 -0
  8. data/app/commands/decidim/admin/create_participatory_process.rb +1 -0
  9. data/app/commands/decidim/admin/create_participatory_process_step.rb +46 -0
  10. data/app/commands/decidim/admin/deactivate_participatory_process_step.rb +35 -0
  11. data/app/commands/decidim/admin/publish_participatory_process.rb +35 -0
  12. data/app/commands/decidim/admin/reorder_participatory_process_steps.rb +47 -0
  13. data/app/commands/decidim/admin/unpublish_participatory_process.rb +35 -0
  14. data/app/commands/decidim/admin/update_participatory_process.rb +1 -0
  15. data/app/commands/decidim/admin/update_participatory_process_step.rb +49 -0
  16. data/app/constraints/decidim/admin/organization_dashboard_constraint.rb +1 -1
  17. data/app/controllers/decidim/admin/application_controller.rb +4 -0
  18. data/app/controllers/decidim/admin/dashboard_controller.rb +1 -9
  19. data/app/controllers/decidim/admin/participatory_process_publications_controller.rb +49 -0
  20. data/app/controllers/decidim/admin/participatory_process_step_activations_controller.rb +56 -0
  21. data/app/controllers/decidim/admin/participatory_process_step_ordering_controller.rb +30 -0
  22. data/app/controllers/decidim/admin/participatory_process_steps_controller.rb +81 -0
  23. data/app/controllers/decidim/admin/participatory_processes_controller.rb +7 -12
  24. data/app/forms/decidim/admin/participatory_process_form.rb +1 -0
  25. data/app/forms/decidim/admin/participatory_process_step_form.rb +25 -0
  26. data/app/helpers/decidim/admin/application_helper.rb +1 -0
  27. data/app/mailers/decidim/admin/application_mailer.rb +1 -1
  28. data/app/models/decidim/admin/abilities/admin.rb +21 -0
  29. data/app/views/decidim/admin/participatory_process_steps/_form.html.erb +19 -0
  30. data/app/views/decidim/admin/participatory_process_steps/_table.html.erb +53 -0
  31. data/app/views/decidim/admin/participatory_process_steps/edit.html.erb +11 -0
  32. data/app/views/decidim/admin/participatory_process_steps/new.html.erb +11 -0
  33. data/app/views/decidim/admin/participatory_process_steps/show.html.erb +22 -0
  34. data/app/views/decidim/admin/participatory_processes/_form.html.erb +4 -0
  35. data/app/views/decidim/admin/participatory_processes/index.html.erb +22 -2
  36. data/app/views/decidim/admin/participatory_processes/show.html.erb +21 -2
  37. data/config/i18n-tasks.yml +2 -2
  38. data/config/locales/ca.yml +55 -2
  39. data/config/locales/en.yml +55 -2
  40. data/config/locales/es.yml +56 -3
  41. data/config/routes.rb +10 -1
  42. data/lib/decidim/admin/engine.rb +6 -1
  43. data/vendor/assets/javascripts/html.sortable.min.js +2 -0
  44. metadata +39 -37
  45. data/app/assets/javascripts/decidim/admin/application.js +0 -22
  46. data/app/controllers/concerns/decidim/needs_authorization.rb +0 -50
  47. data/app/policies/decidim/admin/application_policy.rb +0 -20
  48. data/app/policies/decidim/admin/dashboard_policy.rb +0 -15
  49. data/app/policies/decidim/admin/organization_policy.rb +0 -15
  50. data/app/policies/decidim/admin/participatory_process_policy.rb +0 -57
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ require_dependency "decidim/admin/application_controller"
3
+
4
+ module Decidim
5
+ module Admin
6
+ # Controller that allows managing all the Admins.
7
+ #
8
+ class ParticipatoryProcessStepActivationsController < ApplicationController
9
+ def create
10
+ authorize! :activate, process_step
11
+
12
+ ActivateParticipatoryProcessStep.call(process_step) do
13
+ on(:ok) do
14
+ flash[:notice] = I18n.t("participatory_process_step_activations.create.success", scope: "decidim.admin")
15
+ redirect_to participatory_process_path(participatory_process)
16
+ end
17
+
18
+ on(:invalid) do
19
+ flash.now[:alert] = I18n.t("participatory_process_step_activations.create.error", scope: "decidim.admin")
20
+ redirect_to participatory_process_path(participatory_process)
21
+ end
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ authorize! :deactivate, process_step
27
+
28
+ DeactivateParticipatoryProcessStep.call(process_step) do
29
+ on(:ok) do
30
+ flash[:notice] = I18n.t("participatory_process_step_activations.destroy.success", scope: "decidim.admin")
31
+ redirect_to participatory_process_path(participatory_process)
32
+ end
33
+
34
+ on(:invalid) do
35
+ flash.now[:alert] = I18n.t("participatory_process_step_activations.destroy.error", scope: "decidim.admin")
36
+ redirect_to participatory_process_path(participatory_process)
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def process_step
44
+ collection.find(params[:step_id])
45
+ end
46
+
47
+ def participatory_process
48
+ current_organization.participatory_processes.find(params[:participatory_process_id])
49
+ end
50
+
51
+ def collection
52
+ participatory_process.steps
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ require_dependency "decidim/admin/application_controller"
3
+
4
+ module Decidim
5
+ module Admin
6
+ # Controller that allows managing all the Admins.
7
+ #
8
+ class ParticipatoryProcessStepOrderingController < ApplicationController
9
+ def create
10
+ authorize! :reorder, Decidim::ParticipatoryProcessStep
11
+ ReorderParticipatoryProcessSteps.call(collection, params[:items_ids]) do
12
+ on(:invalid) do
13
+ flash.now[:alert] = I18n.t("participatory_process_steps.ordering.error", scope: "decidim.admin")
14
+ redirect_to participatory_process_path(participatory_process)
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def participatory_process
22
+ current_organization.participatory_processes.find(params[:participatory_process_id])
23
+ end
24
+
25
+ def collection
26
+ participatory_process.steps
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ require_dependency "decidim/admin/application_controller"
3
+
4
+ module Decidim
5
+ module Admin
6
+ # Controller that allows managing all the Admins.
7
+ #
8
+ class ParticipatoryProcessStepsController < ApplicationController
9
+ def new
10
+ authorize! :create, Decidim::ParticipatoryProcessStep
11
+ @form = ParticipatoryProcessStepForm.new
12
+ end
13
+
14
+ def create
15
+ authorize! :create, Decidim::ParticipatoryProcessStep
16
+ @form = ParticipatoryProcessStepForm.from_params(params)
17
+
18
+ CreateParticipatoryProcessStep.call(@form, participatory_process) do
19
+ on(:ok) do
20
+ flash[:notice] = I18n.t("participatory_process_steps.create.success", scope: "decidim.admin")
21
+ redirect_to participatory_process_path(participatory_process)
22
+ end
23
+
24
+ on(:invalid) do
25
+ flash.now[:alert] = I18n.t("participatory_process_steps.create.error", scope: "decidim.admin")
26
+ render :new
27
+ end
28
+ end
29
+ end
30
+
31
+ def edit
32
+ @participatory_process_step = collection.find(params[:id])
33
+ authorize! :update, @participatory_process_step
34
+ @form = ParticipatoryProcessStepForm.from_model(@participatory_process_step)
35
+ end
36
+
37
+ def update
38
+ @participatory_process_step = collection.find(params[:id])
39
+ authorize! :update, @participatory_process_step
40
+ @form = ParticipatoryProcessStepForm.from_params(params)
41
+
42
+ UpdateParticipatoryProcessStep.call(@participatory_process_step, @form) do
43
+ on(:ok) do
44
+ flash[:notice] = I18n.t("participatory_process_steps.update.success", scope: "decidim.admin")
45
+ redirect_to participatory_process_path(participatory_process)
46
+ end
47
+
48
+ on(:invalid) do
49
+ flash.now[:alert] = I18n.t("participatory_process_steps.update.error", scope: "decidim.admin")
50
+ render :edit
51
+ end
52
+ end
53
+ end
54
+
55
+ def show
56
+ @participatory_process_step = collection.find(params[:id])
57
+ authorize! :read, @participatory_process_step
58
+ end
59
+
60
+ def destroy
61
+ @participatory_process_step = collection.find(params[:id])
62
+ authorize! :destroy, @participatory_process_step
63
+ @participatory_process_step.destroy!
64
+
65
+ flash[:notice] = I18n.t("participatory_process_steps.destroy.success", scope: "decidim.admin")
66
+
67
+ redirect_to participatory_process_path(@participatory_process_step.participatory_process)
68
+ end
69
+
70
+ private
71
+
72
+ def participatory_process
73
+ @participatory_process ||= current_organization.participatory_processes.find(params[:participatory_process_id])
74
+ end
75
+
76
+ def collection
77
+ @collection ||= participatory_process.steps
78
+ end
79
+ end
80
+ end
81
+ end
@@ -7,18 +7,18 @@ module Decidim
7
7
  #
8
8
  class ParticipatoryProcessesController < ApplicationController
9
9
  def index
10
+ authorize! :index, Decidim::ParticipatoryProcess
10
11
  @participatory_processes = collection
11
- authorize @participatory_processes
12
12
  end
13
13
 
14
14
  def new
15
+ authorize! :new, Decidim::ParticipatoryProcess
15
16
  @form = ParticipatoryProcessForm.new
16
- authorize ParticipatoryProcess
17
17
  end
18
18
 
19
19
  def create
20
+ authorize! :new, Decidim::ParticipatoryProcess
20
21
  @form = ParticipatoryProcessForm.from_params(params)
21
- authorize ParticipatoryProcess
22
22
 
23
23
  CreateParticipatoryProcess.call(@form, current_organization) do
24
24
  on(:ok) do
@@ -35,13 +35,13 @@ module Decidim
35
35
 
36
36
  def edit
37
37
  @participatory_process = collection.find(params[:id])
38
- authorize @participatory_process
38
+ authorize! :update, @participatory_process
39
39
  @form = ParticipatoryProcessForm.from_model(@participatory_process)
40
40
  end
41
41
 
42
42
  def update
43
43
  @participatory_process = collection.find(params[:id])
44
- authorize @participatory_process
44
+ authorize! :update, @participatory_process
45
45
  @form = ParticipatoryProcessForm.from_params(params)
46
46
 
47
47
  UpdateParticipatoryProcess.call(@participatory_process, @form) do
@@ -59,13 +59,12 @@ module Decidim
59
59
 
60
60
  def show
61
61
  @participatory_process = collection.find(params[:id])
62
- authorize @participatory_process
62
+ authorize! :read, @participatory_process
63
63
  end
64
64
 
65
65
  def destroy
66
66
  @participatory_process = collection.find(params[:id])
67
- authorize @participatory_process
68
-
67
+ authorize! :destroy, @participatory_process
69
68
  @participatory_process.destroy!
70
69
 
71
70
  flash[:notice] = I18n.t("participatory_processes.destroy.success", scope: "decidim.admin")
@@ -78,10 +77,6 @@ module Decidim
78
77
  def collection
79
78
  current_organization.participatory_processes
80
79
  end
81
-
82
- def policy_class
83
- Decidim::Admin::ParticipatoryProcessPolicy
84
- end
85
80
  end
86
81
  end
87
82
  end
@@ -16,6 +16,7 @@ module Decidim
16
16
 
17
17
  attribute :slug, String
18
18
  attribute :hashtag, String
19
+ attribute :promoted, Boolean
19
20
  attribute :hero_image
20
21
  attribute :banner_image
21
22
 
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Admin
4
+ # A form object used to create participatory processes steps from the admin
5
+ # dashboard.
6
+ #
7
+ class ParticipatoryProcessStepForm < Rectify::Form
8
+ include TranslatableAttributes
9
+
10
+ translatable_attribute :title, String
11
+ translatable_attribute :description, String
12
+ translatable_attribute :short_description, String
13
+
14
+ mimic :participatory_process_step
15
+
16
+ attribute :start_date, DateTime
17
+ attribute :end_date, DateTime
18
+
19
+ translatable_validates :title, :description, :short_description, presence: true
20
+
21
+ validates :start_date, date: { before: :end_date, allow_blank: true, if: proc { |obj| obj.end_date.present? } }
22
+ validates :end_date, date: { after: :start_date, allow_blank: true, if: proc { |obj| obj.start_date.present? } }
23
+ end
24
+ end
25
+ end
@@ -5,6 +5,7 @@ module Decidim
5
5
  #
6
6
  module ApplicationHelper
7
7
  include Decidim::TranslationsHelper
8
+ include Decidim::HumanizeBooleansHelper
8
9
 
9
10
  def title
10
11
  current_organization.name
@@ -4,7 +4,7 @@ module Decidim
4
4
  # Custom application mailer, scoped to the admin mailer.
5
5
  #
6
6
  class ApplicationMailer < ActionMailer::Base
7
- default from: "from@example.com"
7
+ default from: Decidim.config.mailer_sender
8
8
  layout "mailer"
9
9
  end
10
10
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Admin
4
+ module Abilities
5
+ # Defines the abilities for a user in the admin section. Intended to be
6
+ # used with `cancancan`.
7
+ class Admin
8
+ include CanCan::Ability
9
+
10
+ def initialize(user)
11
+ return unless user
12
+ return unless user.role?(:admin)
13
+
14
+ can :manage, ParticipatoryProcess
15
+ can :manage, ParticipatoryProcessStep
16
+ can :read, :admin_dashboard
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ <div class="field">
2
+ <%= form.translated :text_field, :title, autofocus: true %>
3
+ </div>
4
+
5
+ <div class="field">
6
+ <%= form.translated :text_area, :short_description %>
7
+ </div>
8
+
9
+ <div class="field">
10
+ <%= form.translated :text_area, :description %>
11
+ </div>
12
+
13
+ <div class="field">
14
+ <%= form.date_field :start_date %>
15
+ </div>
16
+
17
+ <div class="field">
18
+ <%= form.date_field :end_date %>
19
+ </div>
@@ -0,0 +1,53 @@
1
+ <section id="steps">
2
+ <h4><%= t(".steps_title", scope: "decidim.admin") %></h4>
3
+
4
+ <% if can? :create, Decidim::ParticipatoryProcessStep %>
5
+ <div class="actions title">
6
+ <%= link_to t("actions.new", scope: "decidim.admin", name: t("models.participatory_process_step.name", scope: "decidim.admin")), new_participatory_process_step_path(@participatory_process), class: 'new' %>
7
+ </div>
8
+ <% end %>
9
+
10
+ <% if @participatory_process.steps.any? %>
11
+ <p><%= t(".steps_hint", scope: "decidim.admin") %></p>
12
+ <table class="stack">
13
+ <thead>
14
+ <tr>
15
+ <th><%= t("models.participatory_process_step.fields.title", scope: "decidim.admin") %></th>
16
+ <th><%= t("models.participatory_process_step.fields.start_date", scope: "decidim.admin") %></th>
17
+ <th><%= t("models.participatory_process_step.fields.end_date", scope: "decidim.admin") %></th>
18
+ <th><%= t("models.participatory_process_step.fields.active", scope: "decidim.admin") %></th>
19
+ <th class="actions"><%= t("actions.title", scope: "decidim.admin") %></th>
20
+ </tr>
21
+ </thead>
22
+ <tbody class="sortable" data-sort-url="<%= ordering_participatory_process_steps_path(@participatory_process) %>">
23
+ <% @participatory_process.steps.each do |step| %>
24
+ <tr data-id="<%= step.id %>">
25
+ <td>
26
+ <%= link_to translated_attribute(step.title), participatory_process_step_path(@participatory_process, step) %><br />
27
+ </td>
28
+ <td>
29
+ <%= l step.start_date, format: :short %>
30
+ </td>
31
+ <td>
32
+ <%= l step.end_date, format: :short %>
33
+ </td>
34
+ <td>
35
+ <%= humanize_boolean step.active? %>
36
+ </td>
37
+ <td class="actions">
38
+ <%= link_to t("actions.edit", scope: "decidim.admin"), edit_participatory_process_step_path(@participatory_process, step) if can? :update, step %>
39
+ <% if can? :activate, step %>
40
+ <% if step.active? %>
41
+ <%= link_to t("actions.deactivate", scope: "decidim.admin"), participatory_process_step_activate_path(@participatory_process, step), method: :delete, class: "small button secondary" %>
42
+ <% else %>
43
+ <%= link_to t("actions.activate", scope: "decidim.admin"), participatory_process_step_activate_path(@participatory_process, step), method: :post, class: "small button secondary" %>
44
+ <% end %>
45
+ <% end %>
46
+ <%= link_to t("actions.destroy", scope: "decidim.admin"), participatory_process_step_path(@participatory_process, step), method: :delete, class: "small alert button", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } if can? :destroy, step %>
47
+ </td>
48
+ </tr>
49
+ <% end %>
50
+ </tbody>
51
+ </table>
52
+ <% end %>
53
+ </section>
@@ -0,0 +1,11 @@
1
+ <% content_for :title do %>
2
+ <h2><%= t ".title" %></h2>
3
+ <% end %>
4
+
5
+ <%= form_for(@form, url: participatory_process_step_path(@participatory_process_step.participatory_process, @participatory_process_step)) do |f| %>
6
+ <%= render partial: 'form', object: f %>
7
+
8
+ <div class="actions">
9
+ <%= f.submit t(".update") %>
10
+ </div>
11
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <% content_for :title do %>
2
+ <h2><%= t ".title" %></h2>
3
+ <% end %>
4
+
5
+ <%= form_for(@form) do |f| %>
6
+ <%= render partial: 'form', object: f %>
7
+
8
+ <div class="actions">
9
+ <%= f.submit t(".create") %>
10
+ </div>
11
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <% content_for :title do %>
2
+ <h2><%= link_to translated_attribute(@participatory_process_step.participatory_process.title), @participatory_process_step.participatory_process %></h2>
3
+ <h3 class="subheader"><%= translated_attribute(@participatory_process_step.title) %></h3>
4
+ <% end %>
5
+
6
+ <div class="actions">
7
+ <hr />
8
+ <%= link_to t("decidim.admin.actions.edit"), ['edit', @participatory_process_step] if can? :update, @participatory_process_step %>
9
+ <%= link_to t("decidim.admin.actions.destroy"), @participatory_process_step, method: :delete, class: "alert button", data: { confirm: t("decidim.admin.actions.confirm_destroy") } if can? :destroy, @participatory_process_step %>
10
+ </div>
11
+
12
+ <dl>
13
+ <%= display_for @participatory_process_step,
14
+ :title,
15
+ :short_description,
16
+ :description
17
+ %>
18
+ <dt><%= display_label(@participatory_process_step, :start_date) %></dt>
19
+ <dd><%= l @participatory_process_step.start_date, format: :short %></dd>
20
+ <dt><%= display_label(@participatory_process_step, :end_date) %></dt>
21
+ <dd><%= l @participatory_process_step.end_date, format: :short %></dd>
22
+ </dl>
@@ -29,3 +29,7 @@
29
29
  <div class="field">
30
30
  <%= form.file_field :banner_image %>
31
31
  </div>
32
+
33
+ <div class="field">
34
+ <%= form.check_box :promoted %>
35
+ </div>
@@ -10,6 +10,8 @@
10
10
  <thead>
11
11
  <tr>
12
12
  <th><%= t("models.participatory_process.fields.title", scope: "decidim.admin") %></th>
13
+ <th><%= t("models.participatory_process.fields.promoted", scope: "decidim.admin") %></th>
14
+ <th><%= t("models.participatory_process.fields.published", scope: "decidim.admin") %></th>
13
15
  <th><%= t("models.participatory_process.fields.created_at", scope: "decidim.admin") %></th>
14
16
  <th class="actions"><%= t("actions.title", scope: "decidim.admin") %></th>
15
17
  </tr>
@@ -20,13 +22,31 @@
20
22
  <td>
21
23
  <%= link_to translated_attribute(process.title), process %><br />
22
24
  </td>
25
+ <td>
26
+ <%= humanize_boolean process.promoted? %>
27
+ </td>
28
+ <td>
29
+ <%= humanize_boolean process.published? %>
30
+ </td>
23
31
  <td>
24
32
  <%= l process.created_at, format: :short %>
25
33
  </td>
26
34
  <td class="actions">
27
- <%= link_to_if policy(process).edit?, t("actions.edit", scope: "decidim.admin"), ['edit', process] %>
35
+ <% if can? :update, process %>
36
+ <%= link_to t("actions.edit", scope: "decidim.admin"), ['edit', process] %>
37
+ <% end %>
38
+
39
+ <% if can? :publish, process %>
40
+ <% if process.published? %>
41
+ <%= link_to t("actions.unpublish", scope: "decidim.admin"), participatory_process_publish_path(process), method: :delete, class: "small button secondary" %>
42
+ <% else %>
43
+ <%= link_to t("actions.publish", scope: "decidim.admin"), participatory_process_publish_path(process), method: :post, class: "small button secondary" %>
44
+ <% end %>
45
+ <% end %>
28
46
 
29
- <%= link_to_if policy(process).destroy?, t("actions.destroy", scope: "decidim.admin"), process, method: :delete, class: "small alert button", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
47
+ <% if can? :destroy, process %>
48
+ <%= link_to t("actions.destroy", scope: "decidim.admin"), process, method: :delete, class: "small alert button", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
49
+ <% end %>
30
50
  </td>
31
51
  </tr>
32
52
  <% end %>