decidim-proposals 0.28.5 → 0.29.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -18
  3. data/app/cells/decidim/proposals/cost_report_cell.rb +0 -3
  4. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +11 -11
  5. data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +1 -1
  6. data/app/cells/decidim/proposals/participatory_text_proposal/buttons.erb +1 -1
  7. data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +2 -3
  8. data/app/cells/decidim/proposals/proposal_cell.rb +2 -0
  9. data/app/cells/decidim/proposals/proposal_g/show.erb +23 -0
  10. data/app/cells/decidim/proposals/proposal_g_cell.rb +48 -0
  11. data/app/cells/decidim/proposals/proposal_l_cell.rb +18 -19
  12. data/app/cells/decidim/proposals/proposal_metadata_cell.rb +23 -15
  13. data/app/commands/decidim/proposals/admin/answer_proposal.rb +2 -1
  14. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +7 -5
  15. data/app/commands/decidim/proposals/admin/create_proposal.rb +4 -6
  16. data/app/commands/decidim/proposals/admin/create_proposal_state.rb +15 -0
  17. data/app/commands/decidim/proposals/admin/destroy_proposal_state.rb +10 -0
  18. data/app/commands/decidim/proposals/admin/import_proposals.rb +10 -2
  19. data/app/commands/decidim/proposals/admin/notify_proposal_answer.rb +4 -21
  20. data/app/commands/decidim/proposals/admin/unassign_proposals_from_valuator.rb +6 -4
  21. data/app/commands/decidim/proposals/admin/update_proposal_state.rb +13 -0
  22. data/app/commands/decidim/proposals/create_proposal.rb +21 -2
  23. data/app/commands/decidim/proposals/update_proposal.rb +2 -2
  24. data/app/commands/decidim/proposals/vote_proposal.rb +1 -1
  25. data/app/commands/decidim/proposals/withdraw_proposal.rb +3 -7
  26. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +10 -22
  27. data/app/controllers/decidim/proposals/admin/proposal_states_controller.rb +86 -0
  28. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +4 -0
  29. data/app/controllers/decidim/proposals/admin/valuation_assignments_controller.rb +8 -11
  30. data/app/controllers/decidim/proposals/proposals_controller.rb +38 -39
  31. data/app/events/decidim/proposals/proposal_state_changed_event.rb +37 -0
  32. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +8 -4
  33. data/app/forms/decidim/proposals/admin/proposal_form.rb +1 -1
  34. data/app/forms/decidim/proposals/admin/proposal_state_form.rb +22 -0
  35. data/app/forms/decidim/proposals/admin/proposals_fork_form.rb +1 -1
  36. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +1 -1
  37. data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +12 -14
  38. data/app/forms/decidim/proposals/proposal_form.rb +25 -4
  39. data/app/forms/decidim/proposals/reject_access_to_collaborative_draft_form.rb +1 -1
  40. data/app/forms/decidim/proposals/request_access_to_collaborative_draft_form.rb +1 -1
  41. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +7 -17
  42. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +13 -89
  43. data/app/helpers/decidim/proposals/application_helper.rb +16 -10
  44. data/app/helpers/decidim/proposals/map_helper.rb +1 -1
  45. data/app/helpers/decidim/proposals/proposal_cells_helper.rb +6 -2
  46. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +3 -3
  47. data/app/helpers/decidim/proposals/proposal_wizard_helper.rb +5 -8
  48. data/app/helpers/decidim/proposals/proposals_helper.rb +18 -24
  49. data/app/models/decidim/proposals/proposal.rb +83 -29
  50. data/app/models/decidim/proposals/proposal_state.rb +58 -0
  51. data/app/packs/documents/decidim/proposals/participatory_texts/participatory_text.md +1 -3
  52. data/app/packs/images/decidim/proposals/proposal-placeholder-card-g.svg +15 -0
  53. data/app/packs/src/decidim/proposals/add_proposal.js +2 -0
  54. data/app/packs/src/decidim/proposals/admin/proposals.js +43 -8
  55. data/app/packs/stylesheets/decidim/proposals/proposals.scss +39 -1
  56. data/app/permissions/decidim/proposals/admin/permissions.rb +16 -4
  57. data/app/permissions/decidim/proposals/permissions.rb +3 -4
  58. data/app/presenters/decidim/proposals/admin_log/proposal_state_presenter.rb +21 -0
  59. data/app/presenters/decidim/proposals/proposal_presenter.rb +12 -3
  60. data/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb +1 -1
  61. data/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb +1 -1
  62. data/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb +4 -4
  63. data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +1 -1
  64. data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +1 -1
  65. data/app/services/decidim/proposals/diff_renderer.rb +1 -3
  66. data/app/services/decidim/proposals/proposal_builder.rb +1 -1
  67. data/app/views/decidim/proposals/admin/imports/_proposals_fields.html.erb +1 -1
  68. data/app/views/decidim/proposals/admin/participatory_texts/index.html.erb +3 -2
  69. data/app/views/decidim/proposals/admin/proposal_answers/_form.html.erb +2 -2
  70. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +3 -3
  71. data/app/views/decidim/proposals/admin/proposal_states/_form.html.erb +67 -0
  72. data/app/views/decidim/proposals/admin/proposal_states/edit.html.erb +18 -0
  73. data/app/views/decidim/proposals/admin/proposal_states/index.html.erb +50 -0
  74. data/app/views/decidim/proposals/admin/proposal_states/new.html.erb +18 -0
  75. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +6 -12
  76. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +6 -6
  77. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +2 -2
  78. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_assign_to_valuator.html.erb +11 -7
  79. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +7 -5
  80. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_merge.html.erb +2 -2
  81. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_publish_answers.html.erb +2 -2
  82. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +2 -2
  83. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +2 -2
  84. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_split.html.erb +2 -2
  85. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_unassign_from_valuator.html.erb +11 -7
  86. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_valuators_picker.html.erb +12 -0
  87. data/app/views/decidim/proposals/admin/proposals/index.html.erb +11 -7
  88. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +1 -1
  89. data/app/views/decidim/proposals/admin/proposals/show.html.erb +3 -2
  90. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +3 -3
  91. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +12 -5
  92. data/app/views/decidim/proposals/proposals/_proposal.html.erb +1 -1
  93. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +1 -1
  94. data/app/views/decidim/proposals/proposals/_proposals.html.erb +9 -3
  95. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +1 -1
  96. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +3 -3
  97. data/app/views/decidim/proposals/proposals/_wizard_header.html.erb +0 -1
  98. data/app/views/decidim/proposals/proposals/index.html.erb +1 -1
  99. data/app/views/decidim/proposals/proposals/index.js.erb +0 -12
  100. data/app/views/decidim/proposals/proposals/new.html.erb +2 -7
  101. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +4 -4
  102. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_votes_count.html.erb +8 -8
  103. data/app/views/decidim/proposals/proposals/preview.html.erb +1 -1
  104. data/app/views/decidim/proposals/proposals/show.html.erb +3 -3
  105. data/config/locales/ar.yml +9 -115
  106. data/config/locales/bg.yml +117 -111
  107. data/config/locales/ca.yml +86 -83
  108. data/config/locales/cs.yml +65 -127
  109. data/config/locales/de.yml +128 -125
  110. data/config/locales/el.yml +8 -121
  111. data/config/locales/en.yml +110 -107
  112. data/config/locales/es-MX.yml +85 -82
  113. data/config/locales/es-PY.yml +88 -85
  114. data/config/locales/es.yml +83 -80
  115. data/config/locales/eu.yml +166 -170
  116. data/config/locales/fi-plain.yml +90 -87
  117. data/config/locales/fi.yml +139 -136
  118. data/config/locales/fr-CA.yml +92 -87
  119. data/config/locales/fr.yml +83 -78
  120. data/config/locales/ga-IE.yml +1 -27
  121. data/config/locales/gl.yml +11 -107
  122. data/config/locales/he-IL.yml +0 -17
  123. data/config/locales/hu.yml +18 -90
  124. data/config/locales/id-ID.yml +6 -106
  125. data/config/locales/is-IS.yml +8 -33
  126. data/config/locales/it.yml +14 -103
  127. data/config/locales/ja.yml +117 -112
  128. data/config/locales/lb.yml +1 -0
  129. data/config/locales/lt.yml +6 -123
  130. data/config/locales/lv.yml +4 -101
  131. data/config/locales/nl.yml +11 -102
  132. data/config/locales/no.yml +7 -108
  133. data/config/locales/pl.yml +110 -115
  134. data/config/locales/pt-BR.yml +10 -84
  135. data/config/locales/pt.yml +9 -109
  136. data/config/locales/ro-RO.yml +15 -117
  137. data/config/locales/ru.yml +9 -53
  138. data/config/locales/sk.yml +5 -109
  139. data/config/locales/sl.yml +4 -0
  140. data/config/locales/sv.yml +142 -337
  141. data/config/locales/tr-TR.yml +64 -108
  142. data/config/locales/uk.yml +11 -55
  143. data/config/locales/zh-CN.yml +5 -100
  144. data/config/locales/zh-TW.yml +8 -119
  145. data/db/migrate/20240110203500_add_withdrawn_at_field_to_proposals.rb +27 -0
  146. data/db/migrate/20240110203501_create_decidim_proposals_proposal_state.rb +14 -0
  147. data/db/migrate/20240110203502_add_state_id_to_decidim_proposals_proposals.rb +13 -0
  148. data/db/migrate/20240110203503_remove_state_from_decidim_proposals_proposals.rb +11 -0
  149. data/db/migrate/20240110203504_create_default_proposal_states.rb +31 -0
  150. data/db/migrate/20240209092404_change_color_fields_on_proposals_states.rb +54 -0
  151. data/decidim-proposals.gemspec +3 -3
  152. data/lib/decidim/api/proposal_type.rb +4 -13
  153. data/lib/decidim/api/proposals_type.rb +3 -1
  154. data/lib/decidim/proposals/admin_engine.rb +8 -0
  155. data/lib/decidim/proposals/admin_filter.rb +37 -0
  156. data/lib/decidim/proposals/component.rb +8 -5
  157. data/lib/decidim/proposals/engine.rb +1 -15
  158. data/lib/decidim/proposals/import/proposal_answer_creator.rb +6 -6
  159. data/lib/decidim/proposals/import/proposal_creator.rb +1 -1
  160. data/lib/decidim/proposals/markdown_to_proposals.rb +2 -8
  161. data/lib/decidim/proposals/proposal_serializer.rb +8 -9
  162. data/lib/decidim/proposals/seeds.rb +60 -51
  163. data/lib/decidim/proposals/test/factories.rb +69 -14
  164. data/lib/decidim/proposals/version.rb +1 -1
  165. data/lib/decidim/proposals.rb +84 -12
  166. data/lib/tasks/proposals/upgrade/{decdim_proposals_upgrade_tasks.rake → decidim_proposals_upgrade_tasks.rake} +0 -13
  167. metadata +51 -40
  168. data/app/events/decidim/proposals/accepted_proposal_event.rb +0 -17
  169. data/app/events/decidim/proposals/evaluating_proposal_event.rb +0 -11
  170. data/app/events/decidim/proposals/rejected_proposal_event.rb +0 -17
  171. data/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb +0 -44
  172. data/app/queries/decidim/proposals/similar_proposals.rb +0 -67
  173. data/app/services/decidim/proposals/collaborative_draft_diff_renderer.rb +0 -22
  174. data/app/views/decidim/proposals/proposals/_endorsements_card_row.html.erb +0 -0
  175. data/app/views/decidim/proposals/proposals/_proposal_badge.html.erb +0 -3
  176. data/app/views/decidim/proposals/proposals/compare.html.erb +0 -24
  177. data/app/views/decidim/proposals/proposals/complete.html.erb +0 -31
  178. data/config/locales/bn-BD.yml +0 -1
  179. data/config/locales/bs-BA.yml +0 -100
@@ -2,6 +2,8 @@
2
2
  /* eslint no-unused-vars: 0 */
3
3
  /* eslint id-length: ["error", { "exceptions": ["e"] }] */
4
4
 
5
+ import TomSelect from "tom-select/dist/cjs/tom-select.popular";
6
+
5
7
  $(() => {
6
8
  const selectedProposalsCount = function() {
7
9
  return $(".table-list .js-check-all-proposal:checked").length
@@ -16,6 +18,8 @@ $(() => {
16
18
  const selectedProposalsNotPublishedAnswer = selectedProposalsNotPublishedAnswerCount();
17
19
  if (selectedProposals === 0) {
18
20
  $("#js-selected-proposals-count").text("")
21
+ $("#js-assign-proposals-to-valuator-actions").addClass("hide");
22
+ $("#js-unassign-proposals-from-valuator-actions").addClass("hide");
19
23
  } else {
20
24
  $("#js-selected-proposals-count").text(selectedProposals);
21
25
  }
@@ -65,7 +69,7 @@ $(() => {
65
69
  $(".js-bulk-action-form").addClass("hide");
66
70
  }
67
71
 
68
- // Expose functions to make them avaialble in .js.erb templates
72
+ // Expose functions to make them available in .js.erb templates
69
73
  window.selectedProposalsCount = selectedProposalsCount;
70
74
  window.selectedProposalsNotPublishedAnswerCount = selectedProposalsNotPublishedAnswerCount;
71
75
  window.selectedProposalsCountUpdate = selectedProposalsCountUpdate;
@@ -80,20 +84,36 @@ $(() => {
80
84
  hideBulkActionForms();
81
85
  $("#js-bulk-actions-button").addClass("hide");
82
86
 
83
- $("#js-bulk-actions-dropdown ul li button").click(function(e) {
84
- e.preventDefault();
87
+ $("#js-bulk-actions-dropdown ul li button").click(function (e) {
88
+ $("#js-bulk-actions-dropdown").removeClass("is-open");
89
+ hideBulkActionForms();
90
+
85
91
  let action = $(e.target).data("action");
92
+ const panelActions = [
93
+ "assign-proposals-to-valuator",
94
+ "unassign-proposals-from-valuator"
95
+ ];
86
96
 
87
- if (action) {
88
- $(`#js-form-${action}`).submit(function() {
89
- $(".layout-content > .callout-wrapper").html("");
90
- })
97
+ if (!action) {
98
+ return;
99
+ }
100
+
101
+ if (panelActions.includes(action)) {
102
+ $(`#js-form-${action}`).submit(function () {
103
+ $(".layout-content > div[data-callout-wrapper]").html("");
104
+ });
105
+
106
+ $(`#js-${action}-actions`).removeClass("hide");
107
+ } else {
108
+ $(`#js-form-${action}`).submit(function () {
109
+ $(".layout-content > div[data-callout-wrapper]").html("");
110
+ });
91
111
 
92
112
  $(`#js-${action}-actions`).removeClass("hide");
93
113
  hideBulkActionsButton(true);
94
114
  hideOtherActionsButtons();
95
115
  }
96
- })
116
+ });
97
117
 
98
118
  // select all checkboxes
99
119
  $(".js-check-all").change(function() {
@@ -148,3 +168,18 @@ $(() => {
148
168
  });
149
169
  }
150
170
  });
171
+
172
+ document.addEventListener("DOMContentLoaded", () => {
173
+ const valuatorMultiselectContainers = document.querySelectorAll(
174
+ ".js-valuator-multiselect"
175
+ );
176
+
177
+ valuatorMultiselectContainers.forEach((container) => {
178
+ const config = {
179
+ plugins: ["remove_button", "dropdown_input"],
180
+ allowEmptyOption: true
181
+ };
182
+
183
+ return new TomSelect(container, config);
184
+ });
185
+ });
@@ -24,7 +24,7 @@
24
24
 
25
25
  &__aside {
26
26
  &-vote {
27
- @apply flex flex-row-reverse md:flex-col gap-4 items-center md:items-stretch justify-between first:[&>*]:grow last:[&>*]:w-1/4 md:last:[&>*]:w-auto;
27
+ @apply flex flex-row-reverse md:flex-col gap-4 items-center md:items-stretch justify-around md:last:[&>*]:w-auto;
28
28
  }
29
29
  }
30
30
 
@@ -77,6 +77,44 @@
77
77
  }
78
78
  }
79
79
 
80
+ #proposals {
81
+ .view-layout__links {
82
+ @apply flex gap-4 items-center;
83
+
84
+ svg {
85
+ @apply inline-block w-5 h-5;
86
+
87
+ &.view-icon--disabled {
88
+ @apply fill-gray;
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ .card {
95
+ &__proposal-placeholder-g {
96
+ @apply w-full h-full fill-primary;
97
+
98
+ g {
99
+ path {
100
+ @apply fill-primary;
101
+ }
102
+ }
103
+ }
104
+
105
+ &__grid-text-title {
106
+ @apply flex justify-between flex-row md:flex-col md:items-start lg:flex-row lg:items-center;
107
+
108
+ .label {
109
+ @apply md:mt-2;
110
+ }
111
+ }
112
+
113
+ &__list-metadata {
114
+ @apply md:flex md:flex-row md:items-center md:gap-4;
115
+ }
116
+ }
117
+
80
118
  /* overwrite tom-select defaults */
81
119
  .ts {
82
120
  &-control {
@@ -13,9 +13,9 @@ module Decidim
13
13
  if valuator_assigned_to_proposal?
14
14
  can_create_proposal_note?
15
15
  can_create_proposal_answer?
16
+ can_assign_valuator_to_proposal?
16
17
  end
17
18
  can_export_proposals?
18
- valuator_can_unassign_valuator_from_proposals?
19
19
 
20
20
  return permission_action
21
21
  end
@@ -49,7 +49,7 @@ module Decidim
49
49
  allow! if permission_action.subject == :proposals && permission_action.action == :split
50
50
 
51
51
  # Every user allowed by the space can assign proposals to a valuator
52
- allow! if permission_action.subject == :proposals && permission_action.action == :assign_to_valuator
52
+ can_assign_valuator_to_proposal?
53
53
 
54
54
  # Every user allowed by the space can unassign a valuator from proposals
55
55
  can_unassign_valuator_from_proposals?
@@ -62,11 +62,23 @@ module Decidim
62
62
  allow!
63
63
  end
64
64
 
65
+ if permission_action.subject == :proposal_state
66
+ if permission_action.action == :destroy
67
+ toggle_allow(proposal_state.proposals.empty?)
68
+ else
69
+ allow!
70
+ end
71
+ end
72
+
65
73
  permission_action
66
74
  end
67
75
 
68
76
  private
69
77
 
78
+ def proposal_state
79
+ @state ||= context.fetch(:proposal_state, nil)
80
+ end
81
+
70
82
  def proposal
71
83
  @proposal ||= context.fetch(:proposal, nil)
72
84
  end
@@ -137,8 +149,8 @@ module Decidim
137
149
  allow! if permission_action.subject == :proposals && permission_action.action == :unassign_from_valuator
138
150
  end
139
151
 
140
- def valuator_can_unassign_valuator_from_proposals?
141
- can_unassign_valuator_from_proposals? if user == context.fetch(:valuator, nil)
152
+ def can_assign_valuator_to_proposal?
153
+ allow! if permission_action.subject == :proposals && permission_action.action == :assign_to_valuator
142
154
  end
143
155
 
144
156
  def can_export_proposals?
@@ -4,16 +4,15 @@ module Decidim
4
4
  module Proposals
5
5
  class Permissions < Decidim::DefaultPermissions
6
6
  def permissions
7
+ return permission_action unless user
8
+
7
9
  # Delegate the admin permission checks to the admin permissions class
8
10
  return Decidim::Proposals::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
9
11
  return permission_action if permission_action.scope != :public
10
12
 
11
- toggle_allow(!proposal.hidden?) if permission_action.subject == :proposal && permission_action.action == :read
12
- return permission_action unless user
13
-
14
13
  case permission_action.subject
15
14
  when :proposal
16
- apply_proposal_permissions(permission_action) unless permission_action.action == :read
15
+ apply_proposal_permissions(permission_action)
17
16
  when :collaborative_draft
18
17
  apply_collaborative_draft_permissions(permission_action)
19
18
  else
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Proposals
5
+ module AdminLog
6
+ class ProposalStatePresenter < Decidim::Log::BasePresenter
7
+ private
8
+
9
+ def diff_fields_mapping
10
+ {
11
+ title: :i18n,
12
+ default: :boolean,
13
+ token: :string,
14
+ description: :i18n,
15
+ css_class: :string
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -69,10 +69,10 @@ module Decidim
69
69
  version_state_published = state_published_change.last.present? if state_published_change
70
70
 
71
71
  if version_state_published
72
- version.changeset["state"] = pending_state_change if pending_state_change
72
+ version.changeset["decidim_proposals_proposal_state_id"] = parsed_state_change(*pending_state_change) if pending_state_change
73
73
  pending_state_change = nil
74
- elsif version.changeset["state"]
75
- pending_state_change = version.changeset.delete("state")
74
+ elsif version.changeset["decidim_proposals_proposal_state_id"]
75
+ pending_state_change = version.changeset.delete("decidim_proposals_proposal_state_id")
76
76
  end
77
77
 
78
78
  next if version.event == "update" && Decidim::Proposals::DiffRenderer.new(version).diff.empty?
@@ -86,6 +86,15 @@ module Decidim
86
86
  def resource_manifest
87
87
  proposal.class.resource_manifest
88
88
  end
89
+
90
+ private
91
+
92
+ def parsed_state_change(old_state, new_state)
93
+ [
94
+ translated_attribute(Decidim::Proposals::ProposalState.find_by(id: old_state)&.title),
95
+ translated_attribute(Decidim::Proposals::ProposalState.find_by(id: new_state)&.title)
96
+ ]
97
+ end
89
98
  end
90
99
  end
91
100
  end
@@ -29,7 +29,7 @@ module Decidim
29
29
  return @query if @query
30
30
 
31
31
  components = Decidim::Component.where(participatory_space: retrieve_participatory_spaces).published
32
- proposals = Decidim::Proposals::Proposal.where(component: components).except_withdrawn
32
+ proposals = Decidim::Proposals::Proposal.where(component: components).not_withdrawn
33
33
  join_components = "INNER JOIN decidim_components ON decidim_components.manifest_name = 'proposals' AND proposals.decidim_component_id = decidim_components.id"
34
34
  join_categories = <<~EOJOINCATS
35
35
  LEFT OUTER JOIN decidim_categorizations
@@ -46,7 +46,7 @@ module Decidim
46
46
  end
47
47
 
48
48
  def retrieve_proposals
49
- Decidim::Proposals::Proposal.where(component: @resource).except_withdrawn
49
+ Decidim::Proposals::Proposal.where(component: @resource).not_withdrawn
50
50
  end
51
51
 
52
52
  def retrieve_collaborative_drafts
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Metrics
6
6
  # Searches for Participants in the following actions
7
7
  # - Create a proposal (Proposals)
8
- # - Give support to a proposal (Proposals)
8
+ # - Vote to a proposal (Proposals)
9
9
  # - Endorse (Proposals)
10
10
  class ProposalParticipantsMetricMeasure < Decidim::MetricMeasure
11
11
  def valid?
@@ -16,12 +16,12 @@ module Decidim
16
16
  cumulative_users = []
17
17
  cumulative_users |= retrieve_votes.pluck(:decidim_author_id)
18
18
  cumulative_users |= retrieve_endorsements.pluck(:decidim_author_id)
19
- cumulative_users |= retrieve_proposals.pluck("decidim_coauthorships.decidim_author_id") # To avoid ambiguosity must be called this way
19
+ cumulative_users |= retrieve_proposals.pluck("decidim_coauthorships.decidim_author_id") # To avoid ambiguousness must be called this way
20
20
 
21
21
  quantity_users = []
22
22
  quantity_users |= retrieve_votes(from_start: true).pluck(:decidim_author_id)
23
23
  quantity_users |= retrieve_endorsements(from_start: true).pluck(:decidim_author_id)
24
- quantity_users |= retrieve_proposals(from_start: true).pluck("decidim_coauthorships.decidim_author_id") # To avoid ambiguosity must be called this way
24
+ quantity_users |= retrieve_proposals(from_start: true).pluck("decidim_coauthorships.decidim_author_id") # To avoid ambiguousness must be called this way
25
25
 
26
26
  {
27
27
  cumulative_users: cumulative_users.uniq,
@@ -42,7 +42,7 @@ module Decidim
42
42
  ]
43
43
  })
44
44
  .where("decidim_proposals_proposals.published_at <= ?", end_time)
45
- .except_withdrawn
45
+ .not_withdrawn
46
46
 
47
47
  return @proposals.where("decidim_proposals_proposals.published_at >= ?", start_time) if from_start
48
48
 
@@ -32,7 +32,7 @@ module Decidim
32
32
  end
33
33
  @query = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).joins(:component)
34
34
  .left_outer_joins(:category)
35
- @query = @query.where("decidim_proposals_proposals.published_at <= ?", end_time).except_withdrawn.not_hidden
35
+ @query = @query.where("decidim_proposals_proposals.published_at <= ?", end_time).not_withdrawn.not_hidden
36
36
  @query = @query.group("decidim_categorizations.decidim_category_id",
37
37
  :participatory_space_type,
38
38
  :participatory_space_id)
@@ -31,7 +31,7 @@ module Decidim
31
31
  spaces = Decidim.participatory_space_manifests.flat_map do |manifest|
32
32
  manifest.participatory_spaces.call(@organization).public_spaces
33
33
  end
34
- proposal_ids = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).except_withdrawn.not_hidden.pluck(:id)
34
+ proposal_ids = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).not_withdrawn.not_hidden.pluck(:id)
35
35
  @query = Decidim::Proposals::ProposalVote.joins(proposal: :component)
36
36
  .left_outer_joins(proposal: :category)
37
37
  .where(proposal: proposal_ids)
@@ -15,15 +15,13 @@ module Decidim
15
15
  address: :string,
16
16
  latitude: :string,
17
17
  longitude: :string,
18
- state: :string
18
+ decidim_proposals_proposal_state_id: :string
19
19
  }
20
20
  end
21
21
 
22
22
  # Parses the values before parsing the changeset.
23
23
  def parse_changeset(attribute, values, type, diff)
24
- return parse_i18n_changeset(attribute, values, type, diff) if [:i18n, :i18n_html].include?(type)
25
24
  return parse_scope_changeset(attribute, values, type, diff) if type == :scope
26
- return parse_user_group_changeset(attribute, values, type, diff) if type == :user_group
27
25
 
28
26
  values = parse_values(attribute, values)
29
27
  old_value = values[0]
@@ -117,7 +117,7 @@ module Decidim
117
117
  if attachment.file.attached?
118
118
  new_attachment.file = attachment.file.blob
119
119
  else
120
- new_attachment.attached_uploader(:file).remote_url = attachment.attached_uploader(:file).url
120
+ new_attachment.attached_uploader(:file).remote_url = attachment.attached_uploader(:file).url(host: original_proposal.organization.host)
121
121
  end
122
122
 
123
123
  new_attachment.save!
@@ -1,5 +1,5 @@
1
1
  <% if current_organization.user_groups_enabled? && form.object.user_groups.any? %>
2
- <div class="field">
2
+ <div>
3
3
  <%= form.select(
4
4
  :user_group_id,
5
5
  form.object.user_groups.map { |g| [g.name, g.id] },
@@ -1,4 +1,5 @@
1
1
  <% add_decidim_page_title(t(".title")) %>
2
+ <%= append_stylesheet_pack_tag "participatory_texts_admin" %>
2
3
 
3
4
  <div class="item_show__header">
4
5
  <h1 class="item_show__header-title">
@@ -14,7 +15,7 @@
14
15
  <div class="card">
15
16
  <div class="row column">
16
17
  <p class="mt-3"><%= t(".info_1") %></p>
17
- <ul id="participatory-text" class="draggable-list js-connect js-list-actives accordion mb-m mt-2.5 ml-2.5 mr-2.5"
18
+ <ul id="participatory-text" class="draggable-list js-connect js-list-actives mt-2.5 ml-2.5 mr-2.5"
18
19
  data-component="accordion"
19
20
  data-accordion
20
21
  data-sort-url="#"
@@ -27,7 +28,7 @@
27
28
  <a data-open="true" data-controls="article-<%= proposal.id %>">
28
29
  <%= icon "arrow-right-s-line" %>
29
30
  <%= preview_participatory_text_section_title(proposal) %>
30
- <span class="mr-m"><%= icon "menu-line", class: "fill-black" %></span>
31
+ <span><%= icon "menu-line", class: "fill-black" %></span>
31
32
  </a>
32
33
  <div data-tab-content id="article-<%= proposal.id %>">
33
34
  <%= render "article-preview", { form: prop_form, proposal: } %>
@@ -5,12 +5,12 @@
5
5
  <h2 class="card-title"><%= t ".title", title: present(proposal).title %></h2>
6
6
  </div>
7
7
 
8
- <% if Decidim.module_installed?(:templates) %>
8
+ <% if defined?(Decidim::Templates) %>
9
9
  <%= render "decidim/templates/admin/proposal_answer_templates/template_chooser", form: f %>
10
10
  <% end %>
11
11
 
12
12
  <div class="row column flex items-center gap-x-4 my-2">
13
- <%= f.collection_radio_buttons :internal_state, [["not_answered", t(".not_answered")], ["accepted", t(".accepted")], ["rejected", t(".rejected")], ["evaluating", t(".evaluating")]], :first, :last, prompt: true do |builder|
13
+ <%= f.collection_radio_buttons :internal_state, available_states, :token, ->(a) { translated_attribute(a.title) }, prompt: true do |builder|
14
14
  builder.label { builder.radio_button + builder.text } end %>
15
15
  </div>
16
16
 
@@ -10,9 +10,9 @@
10
10
  <% proposal.notes.each do |note| %>
11
11
  <div class="comment">
12
12
  <div class="comment__header">
13
- <div class="author-data">
14
- <div class="author-data__main">
15
- <div class="author author--inline">
13
+ <div>
14
+ <div>
15
+ <div class="author">
16
16
  <strong><span class="author__name"><%= note.author.name %></span></strong>
17
17
  <span><%= l note.created_at, format: :decidim_short %></span>
18
18
  </div>
@@ -0,0 +1,67 @@
1
+ <div class="form__wrapper">
2
+ <div class="card pt-4">
3
+ <div class="card-section">
4
+ <div class="row column">
5
+ <%= form.translated :text_field, :title, aria: { label: :title }, data: { "text-copy" => true, "target" => "strong[data-label-preview]" } %>
6
+ </div>
7
+ <div class="row column">
8
+ <%= form.translated :text_area, :announcement_title, aria: { label: :announcement_title }, data: { "text-copy" => true, "target" => "div[data-announcement-preview] .flash__title" } %>
9
+ </div>
10
+
11
+ <div class="row column proposal-status__color">
12
+ <% Decidim::Proposals::ProposalState.colors.each do |color_key, color_values| %>
13
+ <% state_id = "proposal_state_text_color_#{color_values[:foreground].delete("#").downcase}" %>
14
+ <style>
15
+ <%= "##{state_id}" %> {
16
+ box-shadow: 0 0 0 1.5px <%= color_values[:foreground] %>, 0 0 0 6px <%= color_values[:background] %>;
17
+ accent-color: <%= color_values[:foreground] %>;
18
+ }
19
+
20
+ <%= "##{state_id}" %>:checked {
21
+ box-shadow: 0 0 0 6px <%= color_values[:foreground] %>;
22
+ }
23
+ </style>
24
+ <%= form.radio_button :text_color, color_values[:foreground],
25
+ label: color_values[:name],
26
+ class: "!mr-4",
27
+ data: {
28
+ "sync-radio-buttons" => true,
29
+ "sync-radio-buttons-value" => color_key,
30
+ "css-preview" => true,
31
+ "css-preview-updates" =>
32
+ "strong[data-label-preview]:color:#{color_values[:foreground]}; " +
33
+ "div[data-announcement-preview]:color:#{color_values[:foreground]}; " +
34
+ "div[data-announcement-preview]:borderColor:#{color_values[:foreground]}/var(--tw-border-opacity)"
35
+ } %>
36
+
37
+ <%= form.radio_button :bg_color, color_values[:background],
38
+ label: color_values[:name],
39
+ style: "display: none;",
40
+ data: {
41
+ "sync-radio-buttons-value-target" => color_key,
42
+ "css-preview" => true,
43
+ "css-preview-updates" =>
44
+ "strong[data-label-preview]:backgroundColor:#{color_values[:background]}; " +
45
+ "div[data-announcement-preview]:backgroundColor:#{color_values[:background]};"
46
+ } %>
47
+ <% end %>
48
+
49
+ <div class="mt-8">
50
+ <strong class="label" style="<%= "background-color: #{form.object.bg_color}; color: #{form.object.text_color};" %>" data-label-preview>
51
+ <%= decidim_escape_translated(form.object.title).presence || t(".preview") %>
52
+ </strong>
53
+ </div>
54
+
55
+ <div class="flash flex-col " style="<%= "background-color: #{form.object.bg_color}; color: #{form.object.text_color}; border-color: #{form.object.text_color} / var(--tw-border-opacity);" %>" data-announcement-preview>
56
+ <div class="flash__title">
57
+ <%= decidim_escape_translated(form.object.announcement_title).presence || t(".preview") %>
58
+ </div>
59
+ <div class="flash__message">
60
+ <p></p><div class="rich-text-display">Id voluptate amet optio nobis temporibus ipsam veritatis distinctio dolore.</div><p></p>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ </div>
66
+ </div>
67
+ </div>
@@ -0,0 +1,18 @@
1
+ <% add_decidim_page_title(t(".title")) %>
2
+ <div class="item_show__header">
3
+ <h1 class="item_show__header-title">
4
+ <%= t(".title") %>
5
+ </h1>
6
+ </div>
7
+ <div class="item__edit item__edit-1col">
8
+ <div class="item__edit-form">
9
+ <%= decidim_form_for(@form, html: { class: "form-defaults form edit_proposal_state proposal_form_admin" }) do |f| %>
10
+ <%= render partial: "form", object: f, locals: { title: t(".title") } %>
11
+ <div class="item__edit-sticky">
12
+ <div class="item__edit-sticky-container">
13
+ <%= f.submit t(".update"), class: "button button__sm button__secondary" %>
14
+ </div>
15
+ </div>
16
+ <% end %>
17
+ </div>
18
+ </div>
@@ -0,0 +1,50 @@
1
+ <% add_decidim_page_title(t(".title")) %>
2
+ <div class="card">
3
+ <div class="item_show__header">
4
+ <h1 class="item_show__header-title">
5
+ <%= t(".title") %>
6
+ <%= link_to t("actions.new_proposal_state", scope: "decidim.proposals"), new_proposal_state_path, class: "button button__sm button__secondary" if allowed_to? :create, :proposal_state %>
7
+ </h1>
8
+ </div>
9
+ <div class="table-scroll mt-16">
10
+ <table class="table-list">
11
+ <thead>
12
+ <tr>
13
+ <th class="!text-left">
14
+ <%= t("models.proposal_state.title", scope: "decidim.proposals") %>
15
+ </th>
16
+ <th>
17
+ <%= t("models.proposal_state.css_class", scope: "decidim.proposals") %>
18
+ </th>
19
+ <th><%= t("actions.title", scope: "decidim.proposals") %></th>
20
+ </tr>
21
+ </thead>
22
+ <tbody>
23
+ <% proposal_states.each do |state| %>
24
+ <tr>
25
+ <td>
26
+ <%= translated_attribute(state.title) %>
27
+ </td>
28
+ <td>
29
+ <strong class="label" style="<%= state.css_style %>">
30
+ <%= decidim_sanitize_translated(state.token) %>
31
+ </strong>
32
+ </td>
33
+ <td>
34
+ <% if allowed_to? :update, :proposal_state, proposal_state: state %>
35
+ <%= icon_link_to "pencil-line", edit_proposal_state_path(state), t("actions.edit_proposal_state", scope: "decidim.proposals"), class: "action-icon--edit-proposal" %>
36
+ <% else %>
37
+ <span class="action-space icon"></span>
38
+ <% end %>
39
+ <% if allowed_to?(:destroy, :proposal_state, proposal_state: state) %>
40
+ <%= icon_link_to "delete-bin-line", proposal_state_path(state), t("actions.destroy", scope: "decidim.proposals"), method: :delete, data: { confirm: t("actions.delete_proposal_state_confirm", scope: "decidim.proposals") }, class: "action-icon--delete-proposal" %>
41
+ <% end %>
42
+ </td>
43
+ </tr>
44
+ <% end %>
45
+ </tbody>
46
+ </table>
47
+ </div>
48
+ </div>
49
+
50
+ <%= decidim_paginate proposal_states %>
@@ -0,0 +1,18 @@
1
+ <% add_decidim_page_title(t(".title")) %>
2
+ <div class="item_show__header">
3
+ <h1 class="item_show__header-title">
4
+ <%= t(".title") %>
5
+ </h1>
6
+ </div>
7
+ <div class="item__edit item__edit-1col">
8
+ <div class="item__edit-form">
9
+ <%= decidim_form_for(@form, html: { class: "form-defaults form new_proposal_state proposal_form_admin" }) do |f| %>
10
+ <%= render partial: "form", object: f, locals: { title: t(".title") } %>
11
+ <div class="item__edit-sticky">
12
+ <div class="item__edit-sticky-container">
13
+ <%= f.submit t(".create"), class: "button button__sm button__secondary" %>
14
+ </div>
15
+ </div>
16
+ <% end %>
17
+ </div>
18
+ </div>
@@ -10,17 +10,13 @@
10
10
 
11
11
  <% if allowed_to? :import, :proposals %>
12
12
  <%= import_dropdown do %>
13
- <%= link_to new_proposals_import_path do %>
14
- <li class="imports--component imports--proposals">
15
- <%= t("actions.import", scope: "decidim.proposals", name: t("models.proposal.name", scope: "decidim.proposals.admin")) %>
13
+ <li class="imports--component imports--proposals">
14
+ <%= link_to t("actions.import", scope: "decidim.proposals", name: t("models.proposal.name", scope: "decidim.proposals.admin")), new_proposals_import_path %>
15
+ </li>
16
+ <% current_component.manifest.import_manifests.each do |import_manifest| %>
17
+ <li class="imports--file imports--<%= import_manifest.name %>">
18
+ <%= link_to import_manifest.message(:label, self), admin_imports_path(current_component, name: import_manifest.name) %>
16
19
  </li>
17
- <% current_component.manifest.import_manifests.each do |import_manifest| %>
18
- <%= link_to admin_imports_path(current_component, name: import_manifest.name) do %>
19
- <li class="imports--file imports--<%= import_manifest.name %>">
20
- <%= import_manifest.message(:label, self) %>
21
- </li>
22
- <% end %>
23
- <% end %>
24
20
  <% end %>
25
21
  <% end %>
26
22
  <% end %>
@@ -34,6 +30,4 @@
34
30
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/scope-change" %>
35
31
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/merge" %>
36
32
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/split" %>
37
- <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/assign_to_valuator" %>
38
- <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/unassign_from_valuator" %>
39
33
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/publish_answers" %>