decidim-proposals 0.20.1 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/proposals/admin/proposals.es6 +24 -11
  3. data/app/cells/decidim/proposals/cost_report/show.erb +35 -0
  4. data/app/cells/decidim/proposals/cost_report_cell.rb +42 -0
  5. data/app/cells/decidim/proposals/proposal_m_cell.rb +9 -1
  6. data/app/cells/decidim/proposals/proposal_tags/show.erb +12 -10
  7. data/app/cells/decidim/proposals/proposal_tags_cell.rb +5 -0
  8. data/app/commands/decidim/proposals/admin/answer_proposal.rb +24 -46
  9. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +61 -0
  10. data/app/commands/decidim/proposals/admin/create_proposal.rb +5 -0
  11. data/app/commands/decidim/proposals/admin/notify_proposal_answer.rb +85 -0
  12. data/app/commands/decidim/proposals/admin/publish_answers.rb +67 -0
  13. data/app/commands/decidim/proposals/admin/unassign_proposals_from_valuator.rb +62 -0
  14. data/app/commands/decidim/proposals/admin/update_proposal_scope.rb +75 -0
  15. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +82 -0
  16. data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +16 -6
  17. data/app/controllers/decidim/proposals/admin/proposal_notes_controller.rb +8 -9
  18. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +105 -29
  19. data/app/controllers/decidim/proposals/admin/valuation_assignments_controller.rb +58 -0
  20. data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +19 -3
  21. data/app/controllers/decidim/proposals/proposals_controller.rb +42 -7
  22. data/app/controllers/decidim/proposals/versions_controller.rb +4 -1
  23. data/app/events/decidim/proposals/admin/update_proposal_scope_event.rb +11 -0
  24. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +27 -2
  25. data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +37 -0
  26. data/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb +8 -0
  27. data/app/helpers/decidim/proposals/admin/filterable_helper.rb +17 -0
  28. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +35 -0
  29. data/app/helpers/decidim/proposals/admin/proposal_rankings_helper.rb +63 -0
  30. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +122 -0
  31. data/app/helpers/decidim/proposals/application_helper.rb +36 -25
  32. data/app/helpers/decidim/proposals/collaborative_draft_helper.rb +9 -9
  33. data/app/helpers/decidim/proposals/proposal_cells_helper.rb +1 -1
  34. data/app/helpers/decidim/proposals/proposals_helper.rb +18 -0
  35. data/app/models/decidim/proposals/proposal.rb +163 -16
  36. data/app/models/decidim/proposals/valuation_assignment.rb +24 -0
  37. data/app/permissions/decidim/proposals/admin/permissions.rb +77 -11
  38. data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +1 -1
  39. data/app/presenters/decidim/proposals/admin_log/valuation_assignment_presenter.rb +51 -0
  40. data/app/presenters/decidim/proposals/admin_log/value_types/valuator_role_user_presenter.rb +19 -0
  41. data/app/presenters/decidim/proposals/collaborative_draft_presenter.rb +2 -28
  42. data/app/presenters/decidim/proposals/log/valuation_assignment_presenter.rb +22 -0
  43. data/app/presenters/decidim/proposals/proposal_presenter.rb +26 -1
  44. data/app/services/decidim/proposals/collaborative_draft_search.rb +18 -10
  45. data/app/services/decidim/proposals/proposal_search.rb +33 -40
  46. data/app/types/decidim/proposals/proposal_input_filter.rb +29 -0
  47. data/app/types/decidim/proposals/proposal_input_sort.rb +28 -0
  48. data/app/types/decidim/proposals/proposal_type.rb +35 -4
  49. data/app/types/decidim/proposals/proposals_type.rb +14 -17
  50. data/app/views/decidim/proposals/admin/proposal_answers/_form.html.erb +35 -0
  51. data/app/views/decidim/proposals/admin/proposal_notes/_form.html.erb +1 -1
  52. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +1 -1
  53. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +8 -2
  54. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  55. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +25 -17
  56. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_assign_to_valuator.html.erb +15 -0
  57. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +21 -1
  58. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_publish_answers.html.erb +14 -0
  59. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +25 -0
  60. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_unassign_from_valuator.html.erb +15 -0
  61. data/app/views/decidim/proposals/admin/proposals/index.html.erb +16 -7
  62. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +12 -0
  63. data/app/views/decidim/proposals/admin/proposals/show.html.erb +186 -0
  64. data/app/views/decidim/proposals/admin/proposals/update_category.js.erb +3 -2
  65. data/app/views/decidim/proposals/admin/proposals/update_scope.js.erb +27 -0
  66. data/app/views/decidim/proposals/collaborative_drafts/_filters.html.erb +3 -3
  67. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +1 -1
  68. data/app/views/decidim/proposals/proposals/_filters.html.erb +12 -12
  69. data/app/views/decidim/proposals/proposals/_proposal_badge.html.erb +1 -4
  70. data/app/views/decidim/proposals/proposals/_proposal_preview.html.erb +1 -1
  71. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +1 -1
  72. data/app/views/decidim/proposals/proposals/index.html.erb +1 -1
  73. data/app/views/decidim/proposals/proposals/new.html.erb +1 -1
  74. data/app/views/decidim/proposals/proposals/show.html.erb +17 -23
  75. data/config/locales/ar.yml +69 -17
  76. data/config/locales/ca.yml +113 -18
  77. data/config/locales/cs.yml +123 -31
  78. data/config/locales/de.yml +38 -18
  79. data/config/locales/el.yml +1 -0
  80. data/config/locales/en.yml +112 -17
  81. data/config/locales/es-MX.yml +112 -17
  82. data/config/locales/es-PY.yml +112 -17
  83. data/config/locales/es.yml +113 -18
  84. data/config/locales/eu.yml +38 -18
  85. data/config/locales/fi-plain.yml +113 -18
  86. data/config/locales/fi.yml +113 -18
  87. data/config/locales/fr.yml +38 -18
  88. data/config/locales/gl.yml +38 -18
  89. data/config/locales/hu.yml +112 -17
  90. data/config/locales/id-ID.yml +38 -18
  91. data/config/locales/is-IS.yml +25 -15
  92. data/config/locales/it.yml +38 -18
  93. data/config/locales/nl.yml +43 -18
  94. data/config/locales/no.yml +66 -18
  95. data/config/locales/pl.yml +38 -18
  96. data/config/locales/pt-BR.yml +39 -19
  97. data/config/locales/pt.yml +39 -19
  98. data/config/locales/ru.yml +25 -17
  99. data/config/locales/sv.yml +39 -18
  100. data/config/locales/tr-TR.yml +38 -18
  101. data/config/locales/uk.yml +25 -17
  102. data/db/migrate/20200203111239_add_proposal_valuation_assignments.rb +12 -0
  103. data/db/migrate/20200210135152_add_costs_to_proposals.rb +9 -0
  104. data/db/migrate/20200212120110_sync_proposals_state_with_amendments_state.rb +28 -0
  105. data/db/migrate/20200227175922_add_state_published_at_to_proposals.rb +7 -0
  106. data/db/migrate/20200306123652_publish_existing_proposals_state.rb +15 -0
  107. data/lib/decidim/proposals.rb +1 -0
  108. data/lib/decidim/proposals/admin_engine.rb +7 -3
  109. data/lib/decidim/proposals/component.rb +39 -19
  110. data/lib/decidim/proposals/engine.rb +1 -1
  111. data/lib/decidim/proposals/test/factories.rb +55 -0
  112. data/lib/decidim/proposals/valuatable.rb +21 -0
  113. data/lib/decidim/proposals/version.rb +1 -1
  114. metadata +53 -36
  115. data/app/views/decidim/proposals/admin/proposal_answers/edit.html.erb +0 -22
  116. data/app/views/decidim/proposals/admin/proposal_notes/index.html.erb +0 -3
  117. data/app/views/decidim/proposals/admin/shared/_info_proposal.html.erb +0 -20
  118. data/app/views/decidim/proposals/proposal_widgets/show.html.erb +0 -4
@@ -8,27 +8,24 @@ module Decidim
8
8
  name "Proposals"
9
9
  description "A proposals component of a participatory space."
10
10
 
11
- connection :proposals, ProposalType.connection_type do
12
- resolve ->(component, _args, _ctx) {
13
- ProposalsTypeHelper.base_scope(component).includes(:component)
14
- }
15
- end
11
+ connection :proposals,
12
+ type: ProposalType.connection_type,
13
+ description: "List all proposals",
14
+ function: ProposalListHelper.new(model_class: Proposal)
16
15
 
17
- field(:proposal, ProposalType) do
18
- argument :id, !types.ID
16
+ field :proposal,
17
+ type: ProposalType,
18
+ description: "Finds one proposal",
19
+ function: ProposalFinderHelper.new(model_class: Proposal)
20
+ end
19
21
 
20
- resolve ->(component, args, _ctx) {
21
- ProposalsTypeHelper.base_scope(component).find_by(id: args[:id])
22
- }
23
- end
22
+ class ProposalListHelper < Decidim::Core::ComponentListBase
23
+ argument :order, ProposalInputSort, "Provides several methods to order the results"
24
+ argument :filter, ProposalInputFilter, "Provides several methods to filter the results"
24
25
  end
25
26
 
26
- module ProposalsTypeHelper
27
- def self.base_scope(component)
28
- Proposal
29
- .where(component: component)
30
- .published
31
- end
27
+ class ProposalFinderHelper < Decidim::Core::ComponentFinderBase
28
+ argument :id, !types.ID, "The ID of the proposal"
32
29
  end
33
30
  end
34
31
  end
@@ -0,0 +1,35 @@
1
+ <%= decidim_form_for(@answer_form, url: proposal_proposal_answer_path(proposal, @answer_form), html: { class: "form edit_proposal_answer" }) do |f| %>
2
+ <div class="card" id="proposal-answer">
3
+ <div class="card-divider">
4
+ <h2 class="card-title"><%= t ".title", title: present(proposal).title %></h2>
5
+ </div>
6
+
7
+ <div class="card-section">
8
+ <div class="row column">
9
+ <%= f.collection_radio_buttons :internal_state, [["accepted", t(".accepted")], ["rejected", t(".rejected")], ["evaluating", t(".evaluating")]], :first, :last, prompt: true %>
10
+ </div>
11
+
12
+ <div class="row column">
13
+ <%= f.translated :editor, :answer, autofocus: true, rows: 15 %>
14
+ </div>
15
+
16
+ <% if current_component.current_settings.answers_with_costs? %>
17
+ <div class="row column">
18
+ <%= f.number_field :cost %>
19
+ </div>
20
+
21
+ <div class="row column">
22
+ <%= f.translated :editor, :cost_report, lines: 12 %>
23
+ </div>
24
+
25
+ <div class="row column">
26
+ <%= f.translated :editor, :execution_period, lines: 12 %>
27
+ </div>
28
+ <% end %>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="button--double form-general-submit">
33
+ <%= f.submit t(".answer_proposal") %>
34
+ </div>
35
+ <% end %>
@@ -1,4 +1,4 @@
1
- <%= decidim_form_for(@form, url: proposal_proposal_notes_path(proposal, @form), html: { class: "form new_proposal_note" }) do |f| %>
1
+ <%= decidim_form_for(@notes_form, url: proposal_proposal_notes_path(proposal, @notes_form), html: { class: "form new_proposal_note" }) do |f| %>
2
2
  <div class="row column">
3
3
  <%= f.text_area :body, rows: 10, label: t(".note") %>
4
4
  </div>
@@ -36,7 +36,7 @@
36
36
  <h2 class="card-title"><%= t("leave_your_note", scope: "decidim.proposals.admin.proposal_notes") %></h2>
37
37
  </div>
38
38
  <div class="card-section">
39
- <%= render "form" %>
39
+ <%= render "decidim/proposals/admin/proposal_notes/form" %>
40
40
  </div>
41
41
  </div>
42
42
  </div>
@@ -7,14 +7,20 @@
7
7
  <% end %>
8
8
  <%= link_to t("actions.import", scope: "decidim.proposals", name: t("models.proposal.name", scope: "decidim.proposals.admin")), new_proposals_import_path, class: "button tiny button--simple" if allowed_to? :import, :proposals %>
9
9
 
10
+ <% if allowed_to? :export, :proposals %>
11
+ <%= export_dropdown %>
12
+ <% end %>
13
+
10
14
  <% if allowed_to? :create, :proposal %>
11
15
  <%= link_to t("actions.new", scope: "decidim.proposals"), new_proposal_path, class: "button tiny button--simple" %>
12
16
  <% end %>
13
-
14
- <%= export_dropdown %>
15
17
  </div>
16
18
 
17
19
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/recategorize" %>
20
+ <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/scope-change" %>
18
21
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/merge" %>
19
22
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/split" %>
23
+ <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/assign_to_valuator" %>
24
+ <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/unassign_from_valuator" %>
25
+ <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/publish_answers" %>
20
26
  </div>
@@ -9,7 +9,7 @@
9
9
  </div>
10
10
 
11
11
  <div class="row column hashtags__container">
12
- <%= form.text_area :body, rows: 10, class: "js-hashtags", hashtaggable: true, value: form_presenter.body(extras: false).strip %>
12
+ <%= form.editor :body, hashtaggable: true, value: form_presenter.body(extras: false).strip %>
13
13
  </div>
14
14
 
15
15
  <% if @form.component_automatic_hashtags.any? %>
@@ -1,4 +1,4 @@
1
- <tr data-id="<%= proposal.id %>">
1
+ <tr data-id="<%= proposal.id %>" <%= "data-published-state=false" if proposal.answered? && !proposal.published_state? %>>
2
2
  <td>
3
3
  <%= check_box_tag "proposal_ids_s[]", proposal.id, false, class: "js-check-all-proposal js-proposal-list-check js-proposal-id-#{proposal.id}" %><br>
4
4
  </td>
@@ -6,7 +6,10 @@
6
6
  <%= proposal.id %><br>
7
7
  </td>
8
8
  <td>
9
- <%= decidim_html_escape(present(proposal).title).html_safe %><br>
9
+ <%= link_to(
10
+ decidim_html_escape(present(proposal).title).html_safe,
11
+ proposal_path(proposal)
12
+ ) %><br>
10
13
  </td>
11
14
  <td>
12
15
  <% if proposal.category %>
@@ -22,13 +25,24 @@
22
25
  <% end %>
23
26
  </td>
24
27
  <% end %>
28
+
25
29
  <td>
26
30
  <strong class="<%= proposal_state_css_class proposal.state %>">
27
31
  <%= t("decidim/amendment", scope: "activerecord.models", count: 1) if proposal.emendation? %>
28
- <%= humanize_proposal_state proposal.state %>
32
+ <%= proposal_complete_state proposal %>
29
33
  </strong>
30
34
  </td>
31
35
 
36
+ <% unless current_settings.publish_answers_immediately? %>
37
+ <td>
38
+ <% if proposal.answered? && !proposal.emendation? %>
39
+ <%= humanize_boolean proposal.published_state? %>
40
+ <% else %>
41
+ -
42
+ <% end %>
43
+ </td>
44
+ <% end %>
45
+
32
46
  <% if current_settings.votes_enabled? %>
33
47
  <td>
34
48
  <%= proposal.proposal_votes_count %>
@@ -41,11 +55,13 @@
41
55
  </td>
42
56
  <% end %>
43
57
 
44
- <% if allowed_to? :create, :proposal_note %>
45
- <td>
46
- <%= proposal.proposal_notes_count %>
47
- </td>
48
- <% end %>
58
+ <td>
59
+ <%= proposal.proposal_notes_count %>
60
+ </td>
61
+
62
+ <td class="valuators-count">
63
+ <%= proposal.valuation_assignments.count %>
64
+ </td>
49
65
 
50
66
  <td>
51
67
  <%= l proposal.created_at, format: :decidim_short %>
@@ -56,15 +72,7 @@
56
72
  <%= icon_link_to "pencil", edit_proposal_path(proposal), t("actions.edit_proposal", scope: "decidim.proposals"), class: "action-icon--edit-proposal" %>
57
73
  <% end %>
58
74
 
59
- <% if allowed_to? :create, :proposal_note %>
60
- <%= icon_link_to "chat", proposal_proposal_notes_path(proposal_id: proposal.id), t("actions.private_notes", scope: "decidim.proposals"), class: "action-icon--index-notes" %>
61
- <% end %>
62
-
63
- <% if allowed_to? :create, :proposal_answer and !proposal.emendation? %>
64
- <%= icon_link_to "comment-square", edit_proposal_proposal_answer_path(proposal_id: proposal.id, id: proposal.id), t("actions.answer", scope: "decidim.proposals"), class: " icon--small" %>
65
- <% else %>
66
- <%= icon "comment-square", scope: "decidim.proposals.admin", class: "action-icon action-icon--disabled" %>
67
- <% end %>
75
+ <%= icon_with_link_to_proposal(proposal) %>
68
76
 
69
77
  <%= resource_permissions_link(proposal) %>
70
78
 
@@ -0,0 +1,15 @@
1
+ <div id="js-assign-proposals-to-valuator-actions" class="hide js-bulk-action-form">
2
+ <%= form_tag(valuation_assignment_path, method: :post, id: "js-form-assign-proposals-to-valuator", class: "flex--cc flex-gap--1") do %>
3
+ <div class="checkboxes hide">
4
+ <% proposals.each do |proposal| %>
5
+ <%= check_box_tag "proposal_ids[]", proposal.id, false, class: "js-check-all-proposal js-proposal-id-#{proposal.id}" %>
6
+ <% end %>
7
+ </div>
8
+
9
+ <%= bulk_valuators_select(current_participatory_space, t("decidim.proposals.admin.proposals.index.assign_to_valuator")) %>
10
+
11
+ <%= submit_tag(t("decidim.proposals.admin.proposals.index.assign_to_valuator_button"), id: "js-submit-assign-proposals-to-valuator", class: "button small button--simple float-left") %>
12
+
13
+ <button id="js-cancel-assign-proposals-to-valuator" class="button tiny clear compact js-cancel-bulk-action" type="button"><%= t("decidim.proposals.admin.proposals.index.cancel") %></button>
14
+ <% end %>
15
+ </div>
@@ -1,7 +1,7 @@
1
1
  <div id="js-bulk-actions-wrapper">
2
2
  <button
3
3
  id="js-bulk-actions-button"
4
- class="button button--nomargin tiny success light dropdown"
4
+ class="button button--nomargin tiny success light dropdown hide"
5
5
  type="button"
6
6
  data-toggle="js-bulk-actions-dropdown">
7
7
  <%= t("decidim.proposals.admin.proposals.index.actions") %>
@@ -21,6 +21,11 @@
21
21
  <%= t("decidim.proposals.admin.proposals.index.change_category") %>
22
22
  </button>
23
23
  </li>
24
+ <li>
25
+ <button type="button" data-action="scope-change-proposals">
26
+ <%= t("decidim.proposals.admin.proposals.index.change_scope") %>
27
+ </button>
28
+ </li>
24
29
  <li>
25
30
  <button type="button" data-action="merge-proposals">
26
31
  <%= t("decidim.proposals.admin.proposals.index.merge") %>
@@ -31,6 +36,21 @@
31
36
  <%= t("decidim.proposals.admin.proposals.index.split") %>
32
37
  </button>
33
38
  </li>
39
+ <li>
40
+ <button type="button" data-action="assign-proposals-to-valuator">
41
+ <%= t("decidim.proposals.admin.proposals.index.assign_to_valuator") %>
42
+ </button>
43
+ </li>
44
+ <li>
45
+ <button type="button" data-action="unassign-proposals-from-valuator">
46
+ <%= t("decidim.proposals.admin.proposals.index.unassign_from_valuator") %>
47
+ </button>
48
+ </li>
49
+ <li>
50
+ <button type="button" data-action="publish-answers">
51
+ <%= t("decidim.proposals.admin.proposals.index.publish_answers") %>
52
+ </button>
53
+ </li>
34
54
  </ul>
35
55
  </div>
36
56
  </div>
@@ -0,0 +1,14 @@
1
+ <div id="js-publish-answers-actions" class="hide js-bulk-action-form">
2
+ <%= form_tag(publish_answers_proposals_path, method: :post, remote: true, id: "js-form-publish-answers", class: "flex--cc flex-gap--1") do %>
3
+ <div class="checkboxes hide">
4
+ <% proposals.each do |proposal| %>
5
+ <%= check_box_tag "proposal_ids[]", proposal.id, false, class: "js-check-all-proposal js-proposal-id-#{proposal.id}" %>
6
+ <% end %>
7
+ </div>
8
+ <p><%= t("decidim.proposals.admin.proposals.publish_answers.number_of_proposals", number: '<span id="js-form-publish-answers-number"></span>').html_safe %></p>
9
+
10
+ <%= submit_tag(t("decidim.proposals.admin.proposals.index.publish"), id: "js-submit-publish-answers", class: "button small button--simple float-left") %>
11
+
12
+ <button id="js-cancel-publish-answers" class="button tiny clear compact js-cancel-bulk-action" type="button"><%= t("decidim.proposals.admin.proposals.index.cancel") %></button>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,25 @@
1
+ <div id="js-scope-change-proposals-actions" class="hide js-bulk-action-form">
2
+ <%= form_tag(update_scope_proposals_path, method: :post, remote: true, id: "js-form-scope-change-proposals", class: "flex--cc flex-gap--1") do %>
3
+ <div class="checkboxes hide">
4
+ <% proposals.each do |proposal| %>
5
+ <%= check_box_tag "proposal_ids[]", proposal.id, false, class: "js-check-all-proposal js-proposal-id-#{proposal.id}" %>
6
+ <% end %>
7
+ </div>
8
+
9
+ <%= scopes_picker_tag(
10
+ :scope_id,
11
+ try(:current_participatory_space)&.scope,
12
+ field: t("models.proposal.fields.scope", scope: "decidim.proposals")
13
+ ) %>
14
+
15
+ <%= submit_tag(
16
+ t("decidim.proposals.admin.proposals.index.update_scope_button"),
17
+ id: "js-submit-scope-change-proposals",
18
+ class: "button small button--simple float-left"
19
+ ) %>
20
+
21
+ <button id="js-cancel-scope-change-proposals" class="button tiny clear compact js-cancel-bulk-action" type="button">
22
+ <%= t("decidim.proposals.admin.proposals.index.cancel") %>
23
+ </button>
24
+ <% end %>
25
+ </div>
@@ -0,0 +1,15 @@
1
+ <div id="js-unassign-proposals-from-valuator-actions" class="hide js-bulk-action-form">
2
+ <%= form_tag(valuation_assignment_path, method: :delete, id: "js-form-unassign-proposals-from-valuator", class: "flex--cc flex-gap--1") do %>
3
+ <div class="checkboxes hide">
4
+ <% proposals.each do |proposal| %>
5
+ <%= check_box_tag "proposal_ids[]", proposal.id, false, class: "js-check-all-proposal js-proposal-id-#{proposal.id}" %>
6
+ <% end %>
7
+ </div>
8
+
9
+ <%= bulk_valuators_select(current_participatory_space, t("decidim.proposals.admin.proposals.index.unassign_from_valuator")) %>
10
+
11
+ <%= submit_tag(t("decidim.proposals.admin.proposals.index.unassign_from_valuator_button"), id: "js-submit-unassign-proposals-from-valuator", class: "button small button--simple float-left") %>
12
+
13
+ <button id="js-cancel-unassign-proposals-from-valuator" class="button tiny clear compact js-cancel-bulk-action" type="button"><%= t("decidim.proposals.admin.proposals.index.cancel") %></button>
14
+ <% end %>
15
+ </div>
@@ -1,4 +1,4 @@
1
- <div class="card">
1
+ <div class="card with-overflow">
2
2
  <div class="card-divider">
3
3
  <h2 class="card-title flex--sbc">
4
4
  <div>
@@ -8,6 +8,7 @@
8
8
  <%= render partial: "bulk-actions" %>
9
9
  </h2>
10
10
  </div>
11
+ <%= admin_filter_selector %>
11
12
  <div class="card-section">
12
13
  <div class="table-scroll">
13
14
  <table class="table-list">
@@ -33,9 +34,15 @@
33
34
  <% end %>
34
35
 
35
36
  <th>
36
- <%= sort_link(query, :state, t("models.proposal.fields.state", scope: "decidim.proposals") ) %>
37
+ <%= sort_link(query, :state, [:state, :is_emendation], t("models.proposal.fields.state", scope: "decidim.proposals") ) %>
37
38
  </th>
38
39
 
40
+ <% unless current_settings.publish_answers_immediately? %>
41
+ <th>
42
+ <%= sort_link(query, :state_published, t("models.proposal.fields.published_answer", scope: "decidim.proposals") ) %>
43
+ </th>
44
+ <% end %>
45
+
39
46
  <% if current_settings.votes_enabled? %>
40
47
  <th>
41
48
  <%= sort_link(query, :proposal_votes_count, t("models.proposal.fields.votes", scope: "decidim.proposals") ) %>
@@ -48,11 +55,13 @@
48
55
  </th>
49
56
  <% end %>
50
57
 
51
- <% if allowed_to? :create, :proposal_note %>
52
- <th>
53
- <%= sort_link(query, :proposal_notes_count, t("models.proposal.fields.notes", scope: "decidim.proposals") ) %>
54
- </th>
55
- <% end %>
58
+ <th>
59
+ <%= sort_link(query, :proposal_notes_count, t("models.proposal.fields.notes", scope: "decidim.proposals") ) %>
60
+ </th>
61
+
62
+ <th>
63
+ <%= sort_link(query, :valuation_assignments_count, t("models.proposal.fields.valuators", scope: "decidim.proposals") ) %>
64
+ </th>
56
65
 
57
66
  <th>
58
67
  <%= sort_link(query, :published_at, t("models.proposal.fields.published_at", scope: "decidim.proposals") ) %>
@@ -0,0 +1,12 @@
1
+ $("<%= escape_javascript(render partial: %q{js-callout}, locals: { css: %q{success}, text: flash.now[:notice] }) %>").appendTo(".callout-wrapper");
2
+
3
+ <% proposal_ids.each do |id| %>
4
+ $(".table-list [data-id='<%= id %>']")
5
+ .replaceWith("<%= escape_javascript(render partial: %q{proposal-tr}, locals: { proposal: proposal_find(id) }) %>");
6
+ <% end %>
7
+
8
+ $(".js-check-all").prop('checked', false);
9
+ $(".js-check-all-proposal").prop('checked', false);
10
+ window.hideBulkActionForms()
11
+ window.showOtherActionsButtons();
12
+ window.selectedProposalsCountUpdate();
@@ -0,0 +1,186 @@
1
+ <div class="card">
2
+ <div class="card-divider">
3
+ <h2 class="card-title">
4
+ <%= link_to "#{t ".proposals"} > ", proposals_path %>
5
+ <%= decidim_html_escape(present(proposal).title).html_safe %>
6
+
7
+ <% if allowed_to? :edit, :proposal, proposal: proposal %>
8
+ <%= icon_link_to "pencil", edit_proposal_path(proposal), t("actions.edit_proposal", scope: "decidim.proposals"), class: "action-icon--edit-proposal" %>
9
+ <% end %>
10
+ </h2>
11
+ </div>
12
+
13
+ <div class="card-section">
14
+ <div class="row column">
15
+ <strong><%= t ".link" %>:</strong> <%= link_to resource_locator(proposal).url, resource_locator(proposal).path %>
16
+ </div>
17
+
18
+ <div class="row column">
19
+ <strong><%= t ".authors" %>:</strong>
20
+ <ul id="proposal-authors-list">
21
+ <% coauthor_presenters_for(proposal).each do |presented_author| %>
22
+ <li>
23
+ <%= link_to_if(
24
+ presented_author.profile_path.present?,
25
+ presented_author.name,
26
+ presented_author.profile_path,
27
+ target: :blank
28
+ ) %>
29
+ <% if presented_author.can_be_contacted? && presented_author.nickname != present(current_user).nickname %>
30
+ <%= icon_link_to "envelope-closed", current_or_new_conversation_path_with(presented_author), t("decidim.contact"), class:"action-icon--new" %>
31
+ <% end %>
32
+ </li>
33
+ <% end %>
34
+ </ul>
35
+ </div>
36
+
37
+ <div class="row column">
38
+ <strong><%= t ".body" %>:</strong> <%= simple_format(present(proposal).body(strip_tags: true)) %>
39
+ </div>
40
+
41
+ <div class="row column">
42
+ <strong><%= t ".created_at" %>:</strong> <%= l proposal.created_at, format: :decidim_short %>
43
+ </div>
44
+
45
+ <div class="row column">
46
+ <strong><%= t ".votes_count" %>:</strong> <%= proposal.proposal_votes_count %>
47
+ </div>
48
+
49
+ <div class="row column">
50
+ <strong><%= t ".votes_ranking" %>:</strong> <%= i18n_votes_ranking_for(proposal) %>
51
+ </div>
52
+
53
+ <div class="row column">
54
+ <strong><%= t ".endorsements_count" %>:</strong> <%= proposal.proposal_endorsements_count %>
55
+ </div>
56
+
57
+ <div class="row column">
58
+ <strong><%= t ".endorsements_ranking" %>:</strong> <%= i18n_endorsements_ranking_for(proposal) %>
59
+ </div>
60
+
61
+ <div class="row column">
62
+ <strong><%= t ".amendments_count" %>:</strong> <%= proposal.amendments.count %>
63
+ </div>
64
+
65
+ <div class="row column">
66
+ <strong><%= t ".comments_count" %>:</strong> <%= proposal.comments.count %>
67
+ <ul id="proposal-comments-alignment-count">
68
+ <li><strong><%= t ".comments_positive_count" %>:</strong> <%= proposal.comments.positive.count %></li>
69
+ <li><strong><%= t ".comments_neutral_count" %>:</strong> <%= proposal.comments.neutral.count %></li>
70
+ <li><strong><%= t ".comments_negative_count" %>:</strong> <%= proposal.comments.negative.count %></li>
71
+ </ul>
72
+ </div>
73
+
74
+ <div class="row column">
75
+ <strong><%= t ".endorsers" %>:</strong>
76
+ <ul id="proposal-endorsers-list">
77
+ <% presented_endorsers = endorsers_presenters_for(proposal).to_a %>
78
+ <% presented_endorsers.first(5).each do |presented_endorser| %>
79
+ <li>
80
+ <%= link_to_if(
81
+ presented_endorser.profile_path.present?,
82
+ presented_endorser.name,
83
+ presented_endorser.profile_path,
84
+ target: :blank
85
+ ) %>
86
+ </li>
87
+ <% end %>
88
+ <% if presented_endorsers.count > 5 %>
89
+ <li>
90
+ <%= link_to(
91
+ t(".n_more_endorsers", count: presented_endorsers.count - 5),
92
+ resource_locator(proposal).path
93
+ ) %>
94
+ </li>
95
+ <% end %>
96
+ </ul>
97
+ </div>
98
+
99
+ <div class="row column">
100
+ <strong><%= t ".related_meetings" %>:</strong>
101
+ <ul id="related-meetings">
102
+ <% proposal.linked_resources(:meetings, "proposals_from_meeting").each do |meeting| %>
103
+ <% presented_meeting = present(meeting) %>
104
+ <li>
105
+ <%= link_to presented_meeting.title, presented_meeting.profile_path %>
106
+ </li>
107
+ <% end %>
108
+ </ul>
109
+ </div>
110
+
111
+ <% if proposal.documents.any? %>
112
+ <div class="row column">
113
+ <strong><%= t ".documents" %>:</strong>
114
+ <ul id="documents">
115
+ <% proposal.documents.each do |document| %>
116
+ <li>
117
+ <%= link_to translated_attribute(document.title), document.url %>
118
+ <small><%= document.file_type %> <%= number_to_human_size(document.file_size) %></small>
119
+ </li>
120
+ <% end %>
121
+ </ul>
122
+ </div>
123
+ <% end %>
124
+
125
+ <% if proposal.photos.any? %>
126
+ <div class="row column">
127
+ <strong><%= t(".photos") %>:</strong>
128
+ <div id="photos" class="gallery row">
129
+ <% proposal.photos.each do |photo| %>
130
+ <%= link_to photo.big_url, target: "_blank", rel: "noopener" do %>
131
+ <%= image_tag photo.thumbnail_url, class:"thumbnail", alt: strip_tags(translated_attribute(photo.title)) %>
132
+ <% end %>
133
+ <% end %>
134
+ </div>
135
+ </div>
136
+ <% end %>
137
+
138
+ </div>
139
+ </div>
140
+
141
+ <% if proposal.valuators.any? %>
142
+ <div class="card">
143
+ <div class="card-divider">
144
+ <h2 class="card-title">
145
+ <%= t ".valuators" %>
146
+ </h2>
147
+ </div>
148
+
149
+ <div class="card-section">
150
+ <div class="row column">
151
+ <strong><%= t ".assigned_valuators" %>:</strong>
152
+ <ul id="valuators">
153
+ <% proposal.valuation_assignments.each do |assignment| %>
154
+ <% presented_valuator = present(assignment.valuator) %>
155
+ <li>
156
+ <%= link_to(
157
+ presented_valuator.name,
158
+ presented_valuator.profile_path,
159
+ target: :blank
160
+ ) %>
161
+
162
+ <% if allowed_to? :unassign_from_valuator, :proposals, valuator: assignment.valuator %>
163
+ <%= icon_link_to(
164
+ "circle-x",
165
+ proposal_valuation_assignment_path(proposal, assignment.valuator_role),
166
+ t(".remove_assignment"),
167
+ method: :delete,
168
+ data: { confirm: t(".remove_assignment_confirmation") },
169
+ class: "red-icon"
170
+ ) %>
171
+ <% end %>
172
+ </li>
173
+ <% end %>
174
+ </ul>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ <% end %>
179
+
180
+ <% if allowed_to?(:create, :proposal_note, proposal: proposal) %>
181
+ <%= render "decidim/proposals/admin/proposal_notes/proposal_notes" %>
182
+ <% end %>
183
+
184
+ <% if allowed_to?(:create, :proposal_answer, proposal: proposal) && !proposal.emendation? %>
185
+ <%= render "decidim/proposals/admin/proposal_answers/form" %>
186
+ <% end %>