decidim-proposals 0.28.3 → 0.29.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) 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_cell.rb +1 -1
  5. data/app/cells/decidim/proposals/participatory_text_proposal/buttons.erb +1 -1
  6. data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +2 -3
  7. data/app/cells/decidim/proposals/proposal_cell.rb +2 -0
  8. data/app/cells/decidim/proposals/proposal_g/show.erb +23 -0
  9. data/app/cells/decidim/proposals/proposal_g_cell.rb +48 -0
  10. data/app/cells/decidim/proposals/proposal_l_cell.rb +1 -3
  11. data/app/cells/decidim/proposals/proposal_metadata_cell.rb +23 -15
  12. data/app/commands/decidim/proposals/admin/answer_proposal.rb +2 -1
  13. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +7 -5
  14. data/app/commands/decidim/proposals/admin/create_proposal.rb +2 -2
  15. data/app/commands/decidim/proposals/admin/create_proposal_state.rb +15 -0
  16. data/app/commands/decidim/proposals/admin/destroy_proposal_state.rb +10 -0
  17. data/app/commands/decidim/proposals/admin/import_proposals.rb +10 -2
  18. data/app/commands/decidim/proposals/admin/notify_proposal_answer.rb +4 -21
  19. data/app/commands/decidim/proposals/admin/unassign_proposals_from_valuator.rb +6 -4
  20. data/app/commands/decidim/proposals/admin/update_proposal_state.rb +13 -0
  21. data/app/commands/decidim/proposals/create_proposal.rb +21 -2
  22. data/app/commands/decidim/proposals/update_proposal.rb +2 -2
  23. data/app/commands/decidim/proposals/vote_proposal.rb +1 -1
  24. data/app/commands/decidim/proposals/withdraw_proposal.rb +3 -7
  25. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +10 -22
  26. data/app/controllers/decidim/proposals/admin/proposal_states_controller.rb +86 -0
  27. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +4 -0
  28. data/app/controllers/decidim/proposals/admin/valuation_assignments_controller.rb +8 -11
  29. data/app/controllers/decidim/proposals/proposals_controller.rb +30 -35
  30. data/app/events/decidim/proposals/proposal_state_changed_event.rb +37 -0
  31. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +5 -1
  32. data/app/forms/decidim/proposals/admin/proposal_state_form.rb +22 -0
  33. data/app/forms/decidim/proposals/admin/proposals_fork_form.rb +1 -1
  34. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +1 -1
  35. data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +12 -14
  36. data/app/forms/decidim/proposals/proposal_form.rb +25 -4
  37. data/app/forms/decidim/proposals/reject_access_to_collaborative_draft_form.rb +1 -1
  38. data/app/forms/decidim/proposals/request_access_to_collaborative_draft_form.rb +1 -1
  39. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +7 -17
  40. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +13 -89
  41. data/app/helpers/decidim/proposals/application_helper.rb +16 -10
  42. data/app/helpers/decidim/proposals/proposal_cells_helper.rb +6 -2
  43. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +3 -3
  44. data/app/helpers/decidim/proposals/proposal_wizard_helper.rb +5 -8
  45. data/app/helpers/decidim/proposals/proposals_helper.rb +18 -24
  46. data/app/models/decidim/proposals/proposal.rb +78 -28
  47. data/app/models/decidim/proposals/proposal_state.rb +58 -0
  48. data/app/packs/documents/decidim/proposals/participatory_texts/participatory_text.md +1 -3
  49. data/app/packs/images/decidim/proposals/proposal-placeholder-card-g.svg +15 -0
  50. data/app/packs/src/decidim/proposals/add_proposal.js +2 -0
  51. data/app/packs/src/decidim/proposals/admin/proposals.js +43 -8
  52. data/app/packs/stylesheets/decidim/proposals/proposals.scss +39 -1
  53. data/app/permissions/decidim/proposals/admin/permissions.rb +16 -4
  54. data/app/presenters/decidim/proposals/admin_log/proposal_state_presenter.rb +21 -0
  55. data/app/presenters/decidim/proposals/proposal_presenter.rb +12 -3
  56. data/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb +1 -1
  57. data/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb +1 -1
  58. data/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb +4 -4
  59. data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +1 -1
  60. data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +1 -1
  61. data/app/services/decidim/proposals/diff_renderer.rb +1 -1
  62. data/app/views/decidim/proposals/admin/imports/_proposals_fields.html.erb +1 -1
  63. data/app/views/decidim/proposals/admin/participatory_texts/index.html.erb +3 -2
  64. data/app/views/decidim/proposals/admin/proposal_answers/_form.html.erb +2 -2
  65. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +3 -3
  66. data/app/views/decidim/proposals/admin/proposal_states/_form.html.erb +67 -0
  67. data/app/views/decidim/proposals/admin/proposal_states/edit.html.erb +18 -0
  68. data/app/views/decidim/proposals/admin/proposal_states/index.html.erb +50 -0
  69. data/app/views/decidim/proposals/admin/proposal_states/new.html.erb +18 -0
  70. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +6 -12
  71. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +6 -6
  72. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +2 -2
  73. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_assign_to_valuator.html.erb +11 -7
  74. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +7 -5
  75. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_merge.html.erb +2 -2
  76. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_publish_answers.html.erb +2 -2
  77. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +2 -2
  78. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +2 -2
  79. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_split.html.erb +2 -2
  80. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_unassign_from_valuator.html.erb +11 -7
  81. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_valuators_picker.html.erb +12 -0
  82. data/app/views/decidim/proposals/admin/proposals/index.html.erb +9 -5
  83. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +1 -1
  84. data/app/views/decidim/proposals/admin/proposals/show.html.erb +3 -2
  85. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +3 -3
  86. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +12 -5
  87. data/app/views/decidim/proposals/proposals/_proposal.html.erb +1 -1
  88. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +1 -1
  89. data/app/views/decidim/proposals/proposals/_proposals.html.erb +9 -3
  90. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +1 -1
  91. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +3 -3
  92. data/app/views/decidim/proposals/proposals/_wizard_header.html.erb +0 -1
  93. data/app/views/decidim/proposals/proposals/new.html.erb +2 -7
  94. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +4 -4
  95. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_votes_count.html.erb +8 -8
  96. data/app/views/decidim/proposals/proposals/preview.html.erb +1 -1
  97. data/app/views/decidim/proposals/proposals/show.html.erb +1 -1
  98. data/config/locales/ar.yml +6 -114
  99. data/config/locales/bg.yml +110 -106
  100. data/config/locales/ca.yml +81 -78
  101. data/config/locales/cs.yml +60 -122
  102. data/config/locales/de.yml +122 -119
  103. data/config/locales/el.yml +3 -118
  104. data/config/locales/en.yml +110 -107
  105. data/config/locales/es-MX.yml +82 -79
  106. data/config/locales/es-PY.yml +85 -82
  107. data/config/locales/es.yml +81 -78
  108. data/config/locales/eu.yml +103 -107
  109. data/config/locales/fi-plain.yml +87 -84
  110. data/config/locales/fi.yml +118 -115
  111. data/config/locales/fr-CA.yml +86 -83
  112. data/config/locales/fr.yml +78 -75
  113. data/config/locales/ga-IE.yml +1 -27
  114. data/config/locales/gl.yml +5 -104
  115. data/config/locales/he-IL.yml +0 -13
  116. data/config/locales/hu.yml +15 -88
  117. data/config/locales/id-ID.yml +2 -97
  118. data/config/locales/is-IS.yml +1 -33
  119. data/config/locales/it.yml +6 -96
  120. data/config/locales/ja.yml +110 -107
  121. data/config/locales/lb.yml +1 -0
  122. data/config/locales/lt.yml +3 -122
  123. data/config/locales/lv.yml +2 -96
  124. data/config/locales/nl.yml +6 -95
  125. data/config/locales/no.yml +3 -107
  126. data/config/locales/pl.yml +106 -113
  127. data/config/locales/pt-BR.yml +5 -81
  128. data/config/locales/pt.yml +5 -107
  129. data/config/locales/ro-RO.yml +6 -110
  130. data/config/locales/ru.yml +2 -53
  131. data/config/locales/sk.yml +2 -103
  132. data/config/locales/sv.yml +66 -206
  133. data/config/locales/tr-TR.yml +57 -103
  134. data/config/locales/uk.yml +3 -54
  135. data/config/locales/zh-CN.yml +2 -99
  136. data/config/locales/zh-TW.yml +3 -116
  137. data/db/migrate/20240110203500_add_withdrawn_at_field_to_proposals.rb +27 -0
  138. data/db/migrate/20240110203501_create_decidim_proposals_proposal_state.rb +14 -0
  139. data/db/migrate/20240110203502_add_state_id_to_decidim_proposals_proposals.rb +13 -0
  140. data/db/migrate/20240110203503_remove_state_from_decidim_proposals_proposals.rb +11 -0
  141. data/db/migrate/20240110203504_create_default_proposal_states.rb +31 -0
  142. data/db/migrate/20240209092404_change_color_fields_on_proposals_states.rb +54 -0
  143. data/decidim-proposals.gemspec +2 -2
  144. data/lib/decidim/api/proposal_type.rb +4 -0
  145. data/lib/decidim/proposals/admin_engine.rb +8 -0
  146. data/lib/decidim/proposals/admin_filter.rb +37 -0
  147. data/lib/decidim/proposals/component.rb +8 -5
  148. data/lib/decidim/proposals/engine.rb +1 -15
  149. data/lib/decidim/proposals/import/proposal_answer_creator.rb +6 -6
  150. data/lib/decidim/proposals/import/proposal_creator.rb +1 -1
  151. data/lib/decidim/proposals/markdown_to_proposals.rb +2 -8
  152. data/lib/decidim/proposals/proposal_serializer.rb +5 -3
  153. data/lib/decidim/proposals/seeds.rb +60 -51
  154. data/lib/decidim/proposals/test/factories.rb +64 -8
  155. data/lib/decidim/proposals/version.rb +1 -1
  156. data/lib/decidim/proposals.rb +84 -12
  157. data/lib/tasks/proposals/upgrade/decidim_proposals_upgrade_tasks.rake +32 -0
  158. metadata +50 -36
  159. data/app/events/decidim/proposals/accepted_proposal_event.rb +0 -17
  160. data/app/events/decidim/proposals/evaluating_proposal_event.rb +0 -11
  161. data/app/events/decidim/proposals/rejected_proposal_event.rb +0 -17
  162. data/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb +0 -44
  163. data/app/queries/decidim/proposals/similar_proposals.rb +0 -67
  164. data/app/views/decidim/proposals/proposals/_endorsements_card_row.html.erb +0 -0
  165. data/app/views/decidim/proposals/proposals/_proposal_badge.html.erb +0 -3
  166. data/app/views/decidim/proposals/proposals/compare.html.erb +0 -24
  167. data/app/views/decidim/proposals/proposals/complete.html.erb +0 -31
  168. data/lib/tasks/proposals/upgrade/decdim_proposal_upgrade_tasks.rake +0 -34
@@ -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?
@@ -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,7 +15,7 @@ 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
 
@@ -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" %>
@@ -1,16 +1,16 @@
1
1
  <div class="form__wrapper">
2
2
  <div class="card pt-4">
3
3
  <div class="card-section">
4
- <div class="row column hashtags__container pb-4">
4
+ <div class="row column pb-4">
5
5
  <%= form.translated :text_field, :title, autofocus: true, class: "js-hashtags", hashtaggable: true, aria: { label: :title } %>
6
6
  </div>
7
- <div class="row column hashtags__container">
7
+ <div class="row column">
8
8
  <%= form.translated :editor, :body, hashtaggable: true, aria: { label: :body } %>
9
9
  </div>
10
10
  <% if @form.component_automatic_hashtags.any? %>
11
- <div class="field">
11
+ <div>
12
12
  <%= form.label :automatic_hashtags %>
13
- <div class="checkboxes hashtags">
13
+ <div class="hashtags">
14
14
  <% @form.component_automatic_hashtags.each do |hashtag| %>
15
15
  <label>
16
16
  <%= check_box_tag "", "", { checked: true }, { disabled: true } %>#<%= hashtag %>
@@ -20,9 +20,9 @@
20
20
  </div>
21
21
  <% end %>
22
22
  <% if @form.component_suggested_hashtags.any? %>
23
- <div class="field">
23
+ <div>
24
24
  <%= form.label :suggested_hashtags %>
25
- <div class="checkboxes hashtags">
25
+ <div class="hashtags">
26
26
  <%= form.collection_check_boxes :suggested_hashtags, @form.component_suggested_hashtags.map { |hashtag| [hashtag.downcase, "##{hashtag}"] }, :first, :last do |option|
27
27
  option.label { option.check_box(checked: @form.suggested_hashtag_checked?(option.value)) + option.text }
28
28
  end %>
@@ -56,11 +56,11 @@
56
56
  </td>
57
57
 
58
58
  <td class="valuators-count">
59
- <%= proposal.valuation_assignments.size %>
59
+ <%= proposal.valuation_assignments_count %>
60
60
  </td>
61
61
 
62
62
  <td>
63
- <strong class="label <%= proposal_state_css_class proposal %>">
63
+ <strong class="label <%= proposal_state_css_class proposal %>" style="<%= proposal_state_css_style proposal %>">
64
64
  <%= t("decidim/amendment", scope: "activerecord.models", count: 1) if proposal.emendation? %>
65
65
  <%= proposal_complete_state proposal %>
66
66
  </strong>