decidim-proposals 0.29.3 → 0.30.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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +13 -1
  3. data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +1 -1
  4. data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +1 -1
  5. data/app/cells/decidim/proposals/proposal_g/show.erb +13 -0
  6. data/app/cells/decidim/proposals/proposal_g_cell.rb +13 -0
  7. data/app/cells/decidim/proposals/proposal_history_cell.rb +107 -0
  8. data/app/cells/decidim/proposals/proposal_l/show.erb +37 -0
  9. data/app/cells/decidim/proposals/proposal_l_cell.rb +9 -0
  10. data/app/cells/decidim/proposals/proposal_metadata_cell.rb +2 -2
  11. data/app/cells/decidim/proposals/proposal_vote/show.erb +75 -0
  12. data/app/cells/decidim/proposals/proposal_vote_cell.rb +43 -0
  13. data/app/commands/decidim/proposals/accept_coauthorship.rb +62 -0
  14. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +14 -0
  15. data/app/commands/decidim/proposals/admin/create_proposal.rb +6 -14
  16. data/app/commands/decidim/proposals/admin/create_proposal_note.rb +20 -11
  17. data/app/commands/decidim/proposals/admin/import_proposals.rb +60 -7
  18. data/app/commands/decidim/proposals/admin/merge_proposals.rb +2 -2
  19. data/app/commands/decidim/proposals/admin/proposal_notes_methods.rb +48 -0
  20. data/app/commands/decidim/proposals/admin/reply_proposal_note.rb +92 -0
  21. data/app/commands/decidim/proposals/admin/split_proposals.rb +2 -2
  22. data/app/commands/decidim/proposals/admin/update_proposal.rb +10 -16
  23. data/app/commands/decidim/proposals/admin/update_proposal_taxonomies.rb +34 -0
  24. data/app/commands/decidim/proposals/cancel_coauthorship.rb +32 -0
  25. data/app/commands/decidim/proposals/create_collaborative_draft.rb +1 -2
  26. data/app/commands/decidim/proposals/create_proposal.rb +1 -2
  27. data/app/commands/decidim/proposals/invite_coauthor.rb +45 -0
  28. data/app/commands/decidim/proposals/publish_collaborative_draft.rb +1 -2
  29. data/app/commands/decidim/proposals/reject_coauthorship.rb +54 -0
  30. data/app/commands/decidim/proposals/update_collaborative_draft.rb +1 -2
  31. data/app/commands/decidim/proposals/update_proposal.rb +1 -2
  32. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +5 -1
  33. data/app/controllers/concerns/decidim/proposals/admin/needs_interpolations.rb +40 -0
  34. data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +46 -5
  35. data/app/controllers/decidim/proposals/admin/proposal_notes_controller.rb +18 -0
  36. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +41 -85
  37. data/app/controllers/decidim/proposals/admin/proposals_imports_controller.rb +2 -2
  38. data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +2 -4
  39. data/app/controllers/decidim/proposals/invite_coauthors_controller.rb +87 -0
  40. data/app/controllers/decidim/proposals/proposals_controller.rb +7 -32
  41. data/app/controllers/decidim/proposals/versions_controller.rb +1 -1
  42. data/app/events/decidim/proposals/accepted_coauthorship_event.rb +8 -0
  43. data/app/events/decidim/proposals/admin/proposal_assigned_to_valuator_event.rb +27 -0
  44. data/app/events/decidim/proposals/admin/proposal_note_created_event.rb +5 -0
  45. data/app/events/decidim/proposals/coauthor_accepted_invite_event.rb +49 -0
  46. data/app/events/decidim/proposals/coauthor_invited_event.rb +45 -0
  47. data/app/events/decidim/proposals/coauthor_rejected_invite_event.rb +8 -0
  48. data/app/events/decidim/proposals/rejected_coauthorship_event.rb +8 -0
  49. data/app/events/decidim/proposals/update_proposal_taxonomies_event.rb +9 -0
  50. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +16 -0
  51. data/app/forms/decidim/proposals/admin/proposal_base_form.rb +3 -31
  52. data/app/forms/decidim/proposals/admin/proposal_form.rb +11 -6
  53. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +0 -5
  54. data/app/forms/decidim/proposals/collaborative_draft_form.rb +0 -8
  55. data/app/forms/decidim/proposals/proposal_form.rb +5 -32
  56. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +25 -0
  57. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +0 -1
  58. data/app/helpers/decidim/proposals/application_helper.rb +23 -15
  59. data/app/helpers/decidim/proposals/collaborative_draft_helper.rb +7 -7
  60. data/app/helpers/decidim/proposals/map_helper.rb +0 -18
  61. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +15 -2
  62. data/app/helpers/decidim/proposals/proposals_helper.rb +3 -1
  63. data/app/jobs/decidim/proposals/admin/proposal_answer_job.rb +20 -0
  64. data/app/models/decidim/proposals/collaborative_draft.rb +13 -3
  65. data/app/models/decidim/proposals/proposal.rb +71 -5
  66. data/app/models/decidim/proposals/proposal_note.rb +11 -0
  67. data/app/models/decidim/proposals/proposal_state.rb +1 -1
  68. data/app/packs/entrypoints/decidim_proposals.js +1 -0
  69. data/app/packs/entrypoints/decidim_proposals_geocoding.js +2 -0
  70. data/app/packs/src/decidim/proposals/admin/proposals.js +16 -1
  71. data/app/packs/src/decidim/proposals/exit_handler.js +73 -0
  72. data/app/packs/stylesheets/decidim/proposals/proposals.scss +248 -3
  73. data/app/permissions/decidim/proposals/admin/permissions.rb +2 -5
  74. data/app/permissions/decidim/proposals/permissions.rb +42 -0
  75. data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +1 -1
  76. data/app/presenters/decidim/proposals/proposal_presenter.rb +1 -1
  77. data/app/queries/decidim/proposals/filtered_proposals.rb +2 -2
  78. data/app/queries/decidim/proposals/metrics/accepted_proposals_metric_manage.rb +2 -2
  79. data/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb +10 -10
  80. data/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb +4 -4
  81. data/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb +6 -6
  82. data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +6 -6
  83. data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +6 -6
  84. data/app/services/decidim/proposals/proposal_builder.rb +1 -2
  85. data/app/views/decidim/proposals/admin/proposal_notes/_form.html.erb +3 -3
  86. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_note.html.erb +28 -0
  87. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_note_reply.html.erb +9 -0
  88. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +4 -28
  89. data/app/views/decidim/proposals/admin/proposal_states/_form.html.erb +1 -1
  90. data/app/views/decidim/proposals/admin/proposals/_actions.html.erb +21 -0
  91. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +3 -2
  92. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +17 -24
  93. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +12 -28
  94. data/app/views/decidim/proposals/admin/proposals/_proposals-thead.html.erb +45 -0
  95. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_apply_answer_template.html.erb +22 -0
  96. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +15 -11
  97. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_taxonomy_change.html.erb +23 -0
  98. data/app/views/decidim/proposals/admin/proposals/index.html.erb +17 -48
  99. data/app/views/decidim/proposals/admin/proposals/manage_trash.html.erb +18 -0
  100. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +1 -1
  101. data/app/views/decidim/proposals/admin/proposals/show.html.erb +14 -26
  102. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +1 -1
  103. data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +0 -3
  104. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_actions.html.erb +9 -0
  105. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_draft_aside.html.erb +0 -15
  106. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +4 -6
  107. data/app/views/decidim/proposals/collaborative_drafts/index.html.erb +6 -2
  108. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +27 -11
  109. data/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +29 -9
  110. data/app/views/decidim/proposals/proposals/_actions.html.erb +4 -7
  111. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +17 -22
  112. data/app/views/decidim/proposals/proposals/_exit_modal.html.erb +17 -0
  113. data/app/views/decidim/proposals/proposals/_notification_alert_box.html.erb +1 -0
  114. data/app/views/decidim/proposals/proposals/_proposal_actions.html.erb +19 -0
  115. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +9 -32
  116. data/app/views/decidim/proposals/proposals/_proposal_voting_rules.html.erb +33 -0
  117. data/app/views/decidim/proposals/proposals/_proposals.html.erb +1 -1
  118. data/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +2 -2
  119. data/app/views/decidim/proposals/proposals/_remaining_votes_notification.html.erb +12 -0
  120. data/app/views/decidim/proposals/proposals/_update_proposal_voting_rules.html.erb +6 -0
  121. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +12 -8
  122. data/app/views/decidim/proposals/proposals/_votes_count.html.erb +2 -1
  123. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +1 -7
  124. data/app/views/decidim/proposals/proposals/index.html.erb +3 -18
  125. data/app/views/decidim/proposals/proposals/index.js.erb +1 -1
  126. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +3 -1
  127. data/app/views/decidim/proposals/proposals/show.html.erb +35 -15
  128. data/config/locales/ar.yml +15 -73
  129. data/config/locales/bg.yml +12 -89
  130. data/config/locales/bs-BA.yml +2 -13
  131. data/config/locales/ca.yml +209 -84
  132. data/config/locales/cs.yml +210 -81
  133. data/config/locales/de.yml +213 -89
  134. data/config/locales/el.yml +12 -84
  135. data/config/locales/en.yml +206 -81
  136. data/config/locales/es-MX.yml +213 -88
  137. data/config/locales/es-PY.yml +213 -88
  138. data/config/locales/es.yml +214 -89
  139. data/config/locales/eu.yml +288 -164
  140. data/config/locales/fi-plain.yml +213 -87
  141. data/config/locales/fi.yml +213 -87
  142. data/config/locales/fr-CA.yml +116 -97
  143. data/config/locales/fr.yml +116 -97
  144. data/config/locales/ga-IE.yml +1 -21
  145. data/config/locales/gl.yml +8 -45
  146. data/config/locales/hu.yml +12 -68
  147. data/config/locales/id-ID.yml +9 -43
  148. data/config/locales/is-IS.yml +0 -19
  149. data/config/locales/it.yml +11 -77
  150. data/config/locales/ja.yml +165 -106
  151. data/config/locales/lt.yml +13 -85
  152. data/config/locales/lv.yml +10 -52
  153. data/config/locales/nl.yml +10 -59
  154. data/config/locales/no.yml +10 -44
  155. data/config/locales/pl.yml +11 -88
  156. data/config/locales/pt-BR.yml +9 -74
  157. data/config/locales/pt.yml +10 -56
  158. data/config/locales/ro-RO.yml +12 -72
  159. data/config/locales/ru.yml +0 -23
  160. data/config/locales/sk.yml +10 -52
  161. data/config/locales/sr-CS.yml +2 -14
  162. data/config/locales/sv.yml +127 -86
  163. data/config/locales/tr-TR.yml +10 -53
  164. data/config/locales/uk.yml +0 -23
  165. data/config/locales/zh-CN.yml +10 -53
  166. data/config/locales/zh-TW.yml +12 -86
  167. data/db/migrate/20171220084719_add_published_at_to_proposals.rb +1 -1
  168. data/db/migrate/20181016132225_add_organization_as_author.rb +1 -1
  169. data/db/migrate/20200120215928_move_proposal_endorsements_to_core_endorsements.rb +1 -1
  170. data/db/migrate/20200827154156_add_commentable_counter_cache_to_proposals.rb +3 -3
  171. data/db/migrate/20210310102839_add_followable_counter_cache_to_proposals.rb +1 -1
  172. data/db/migrate/20240110203504_create_default_proposal_states.rb +1 -1
  173. data/db/migrate/20240404202756_add_valuation_assignments_count_to_decidim_proposals_proposals.rb +1 -1
  174. data/db/migrate/20240617091140_add_email_on_assigned_proposals_to_users.rb +7 -0
  175. data/db/migrate/20240617170052_add_parent_relation_to_decidim_proposal_notes.rb +7 -0
  176. data/db/migrate/20240828103755_add_deleted_at_to_decidim_proposals_proposals.rb +8 -0
  177. data/decidim-proposals.gemspec +1 -1
  178. data/lib/decidim/api/functions/proposal_finder_helper.rb +12 -0
  179. data/lib/decidim/api/functions/proposal_list_helper.rb +12 -0
  180. data/lib/decidim/api/proposal_type.rb +17 -25
  181. data/lib/decidim/api/proposals_type.rb +4 -19
  182. data/lib/decidim/proposals/admin_engine.rb +12 -3
  183. data/lib/decidim/proposals/admin_filter.rb +3 -6
  184. data/lib/decidim/proposals/component.rb +4 -5
  185. data/lib/decidim/proposals/download_your_data_proposal_serializer.rb +15 -0
  186. data/lib/decidim/proposals/engine.rb +5 -0
  187. data/lib/decidim/proposals/import/proposal_creator.rb +4 -4
  188. data/lib/decidim/proposals/proposal_serializer.rb +12 -29
  189. data/lib/decidim/proposals/seeds.rb +21 -17
  190. data/lib/decidim/proposals/test/factories.rb +2 -1
  191. data/lib/decidim/proposals/version.rb +1 -1
  192. data/lib/decidim/proposals.rb +4 -0
  193. data/lib/tasks/proposals/upgrade/decidim_proposals_upgrade_tasks.rake +0 -22
  194. metadata +65 -34
  195. data/app/commands/decidim/proposals/admin/update_proposal_category.rb +0 -70
  196. data/app/commands/decidim/proposals/admin/update_proposal_scope.rb +0 -75
  197. data/app/events/decidim/proposals/admin/update_proposal_category_event.rb +0 -11
  198. data/app/events/decidim/proposals/admin/update_proposal_scope_event.rb +0 -11
  199. data/app/jobs/decidim/proposals/admin/import_proposals_job.rb +0 -91
  200. data/app/mailers/decidim/proposals/admin/import_proposals_mailer.rb +0 -30
  201. data/app/views/decidim/proposals/admin/import_proposals_mailer/notify_failure.html.erb +0 -1
  202. data/app/views/decidim/proposals/admin/import_proposals_mailer/notify_success.html.erb +0 -2
  203. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +0 -15
  204. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +0 -21
  205. data/app/views/decidim/proposals/collaborative_drafts/_actions.html.erb +0 -7
  206. data/config/locales/ca-IT.yml +0 -945
@@ -13,9 +13,9 @@ module Decidim
13
13
  next if cumulative_value.zero?
14
14
 
15
15
  quantity_value = quantity[key] || 0
16
- category_id, space_type, space_id, proposal_id = key
16
+ taxonomy_id, space_type, space_id, proposal_id = key
17
17
  record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
18
- organization: @organization, decidim_category_id: category_id,
18
+ organization: @organization, decidim_taxonomy_id: taxonomy_id,
19
19
  participatory_space_type: space_type, participatory_space_id: space_id,
20
20
  related_object_type: "Decidim::Proposals::Proposal", related_object_id: proposal_id)
21
21
  record.assign_attributes(cumulative: cumulative_value, quantity: quantity_value)
@@ -31,18 +31,18 @@ module Decidim
31
31
  components = Decidim::Component.where(participatory_space: retrieve_participatory_spaces).published
32
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
- join_categories = <<~EOJOINCATS
35
- LEFT OUTER JOIN decidim_categorizations
36
- ON (proposals.id = decidim_categorizations.categorizable_id
37
- AND decidim_categorizations.categorizable_type = 'Decidim::Proposals::Proposal')
34
+ join_taxonomies = <<~EOJOINCATS
35
+ LEFT OUTER JOIN decidim_taxonomizations
36
+ ON (proposals.id = decidim_taxonomizations.taxonomizable_id
37
+ AND decidim_taxonomizations.taxonomizable_type = 'Decidim::Proposals::Proposal')
38
38
  EOJOINCATS
39
39
  @query = Decidim::Endorsement.joins("INNER JOIN decidim_proposals_proposals proposals ON resource_id = proposals.id")
40
40
  .joins(join_components)
41
- .joins(join_categories)
41
+ .joins(join_taxonomies)
42
42
  .where(resource_id: proposals.pluck(:id))
43
43
  .where(resource_type: Decidim::Proposals::Proposal.name)
44
- @query = @query.where("decidim_endorsements.created_at <= ?", end_time)
45
- @query = @query.group("decidim_categorizations.id",
44
+ @query = @query.where(decidim_endorsements: { created_at: ..end_time })
45
+ @query = @query.group("decidim_taxonomizations.taxonomy_id",
46
46
  :participatory_space_type,
47
47
  :participatory_space_id,
48
48
  :resource_id)
@@ -50,7 +50,7 @@ module Decidim
50
50
  end
51
51
 
52
52
  def quantity
53
- @quantity ||= query.where("decidim_endorsements.created_at >= ?", start_time).count
53
+ @quantity ||= query.where(decidim_endorsements: { created_at: start_time.. }).count
54
54
  end
55
55
  end
56
56
  end
@@ -30,17 +30,17 @@ module Decidim
30
30
 
31
31
  def retrieve_proposals_followers(from_start: false)
32
32
  @proposals_followers ||= Decidim::Follow.where(followable: retrieve_proposals).joins(:user)
33
- .where("decidim_follows.created_at <= ?", end_time)
33
+ .where(decidim_follows: { created_at: ..end_time })
34
34
 
35
- return @proposals_followers.where("decidim_follows.created_at >= ?", start_time) if from_start
35
+ return @proposals_followers.where(decidim_follows: { created_at: start_time.. }) if from_start
36
36
 
37
37
  @proposals_followers
38
38
  end
39
39
 
40
40
  def retrieve_drafts_followers(from_start: false)
41
41
  @drafts_followers ||= Decidim::Follow.where(followable: retrieve_collaborative_drafts).joins(:user)
42
- .where("decidim_follows.created_at <= ?", end_time)
43
- return @drafts_followers.where("decidim_follows.created_at >= ?", start_time) if from_start
42
+ .where(decidim_follows: { created_at: ..end_time })
43
+ return @drafts_followers.where(decidim_follows: { created_at: start_time.. }) if from_start
44
44
 
45
45
  @drafts_followers
46
46
  end
@@ -41,19 +41,19 @@ module Decidim
41
41
  "Decidim::Meetings::Meeting"
42
42
  ]
43
43
  })
44
- .where("decidim_proposals_proposals.published_at <= ?", end_time)
44
+ .where(decidim_proposals_proposals: { published_at: ..end_time })
45
45
  .not_withdrawn
46
46
 
47
- return @proposals.where("decidim_proposals_proposals.published_at >= ?", start_time) if from_start
47
+ return @proposals.where(decidim_proposals_proposals: { published_at: start_time.. }) if from_start
48
48
 
49
49
  @proposals
50
50
  end
51
51
 
52
52
  def retrieve_votes(from_start: false)
53
53
  @votes ||= Decidim::Proposals::ProposalVote.joins(:proposal).where(proposal: retrieve_proposals).joins(:author)
54
- .where("decidim_proposals_proposal_votes.created_at <= ?", end_time)
54
+ .where(decidim_proposals_proposal_votes: { created_at: ..end_time })
55
55
 
56
- return @votes.where("decidim_proposals_proposal_votes.created_at >= ?", start_time) if from_start
56
+ return @votes.where(decidim_proposals_proposal_votes: { created_at: start_time.. }) if from_start
57
57
 
58
58
  @votes
59
59
  end
@@ -61,10 +61,10 @@ module Decidim
61
61
  def retrieve_endorsements(from_start: false)
62
62
  @endorsements ||= Decidim::Endorsement.joins("INNER JOIN decidim_proposals_proposals proposals ON resource_id = proposals.id")
63
63
  .where(resource: retrieve_proposals)
64
- .where("decidim_endorsements.created_at <= ?", end_time)
64
+ .where(decidim_endorsements: { created_at: ..end_time })
65
65
  .where(decidim_author_type: "Decidim::UserBaseEntity")
66
66
 
67
- return @endorsements.where("decidim_endorsements.created_at >= ?", start_time) if from_start
67
+ return @endorsements.where(decidim_endorsements: { created_at: start_time.. }) if from_start
68
68
 
69
69
  @endorsements
70
70
  end
@@ -13,9 +13,9 @@ module Decidim
13
13
  next if cumulative_value.zero?
14
14
 
15
15
  quantity_value = quantity[key] || 0
16
- category_id, space_type, space_id = key
16
+ taxonomy_id, space_type, space_id = key
17
17
  record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
18
- organization: @organization, decidim_category_id: category_id,
18
+ organization: @organization, decidim_taxonomy_id: taxonomy_id,
19
19
  participatory_space_type: space_type, participatory_space_id: space_id)
20
20
  record.assign_attributes(cumulative: cumulative_value, quantity: quantity_value)
21
21
  record.save!
@@ -31,16 +31,16 @@ module Decidim
31
31
  manifest.participatory_spaces.call(@organization)
32
32
  end
33
33
  @query = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).joins(:component)
34
- .left_outer_joins(:category)
35
- @query = @query.where("decidim_proposals_proposals.published_at <= ?", end_time).not_withdrawn.not_hidden
36
- @query = @query.group("decidim_categorizations.decidim_category_id",
34
+ .left_outer_joins(:taxonomizations)
35
+ @query = @query.where(decidim_proposals_proposals: { published_at: ..end_time }).not_withdrawn.not_hidden
36
+ @query = @query.group("decidim_taxonomizations.taxonomy_id",
37
37
  :participatory_space_type,
38
38
  :participatory_space_id)
39
39
  @query
40
40
  end
41
41
 
42
42
  def quantity
43
- @quantity ||= query.where("decidim_proposals_proposals.published_at >= ?", start_time).count
43
+ @quantity ||= query.where(decidim_proposals_proposals: { published_at: start_time.. }).count
44
44
  end
45
45
  end
46
46
  end
@@ -13,9 +13,9 @@ module Decidim
13
13
  next if cumulative_value.zero?
14
14
 
15
15
  quantity_value = quantity[key] || 0
16
- category_id, space_type, space_id, proposal_id = key
16
+ taxonomy_id, space_type, space_id, proposal_id = key
17
17
  record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
18
- organization: @organization, decidim_category_id: category_id,
18
+ organization: @organization, decidim_taxonomy_id: taxonomy_id,
19
19
  participatory_space_type: space_type, participatory_space_id: space_id,
20
20
  related_object_type: "Decidim::Proposals::Proposal", related_object_id: proposal_id)
21
21
  record.assign_attributes(cumulative: cumulative_value, quantity: quantity_value)
@@ -33,10 +33,10 @@ module Decidim
33
33
  end
34
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
- .left_outer_joins(proposal: :category)
36
+ .left_outer_joins(proposal: :taxonomizations)
37
37
  .where(proposal: proposal_ids)
38
- @query = @query.where("decidim_proposals_proposal_votes.created_at <= ?", end_time)
39
- @query = @query.group("decidim_categorizations.id",
38
+ @query = @query.where(decidim_proposals_proposal_votes: { created_at: ..end_time })
39
+ @query = @query.group("decidim_taxonomizations.taxonomy_id",
40
40
  :participatory_space_type,
41
41
  :participatory_space_id,
42
42
  :decidim_proposal_id)
@@ -44,7 +44,7 @@ module Decidim
44
44
  end
45
45
 
46
46
  def quantity
47
- @quantity ||= query.where("decidim_proposals_proposal_votes.created_at >= ?", start_time).count
47
+ @quantity ||= query.where(decidim_proposals_proposal_votes: { created_at: start_time.. }).count
48
48
  end
49
49
  end
50
50
  end
@@ -63,7 +63,6 @@ module Decidim
63
63
  "created_at",
64
64
  "updated_at",
65
65
  "state",
66
- "decidim_proposals_proposal_state_id",
67
66
  "state_published_at",
68
67
  "answer",
69
68
  "answered_at",
@@ -75,7 +74,7 @@ module Decidim
75
74
  "proposal_notes_count",
76
75
  "proposal_votes_count"
77
76
  ).merge(
78
- "category" => original_proposal.category
77
+ "taxonomies" => original_proposal.taxonomies
79
78
  ).merge(
80
79
  extra_attributes
81
80
  )
@@ -1,7 +1,7 @@
1
- <%= decidim_form_for(@notes_form, url: proposal_proposal_notes_path(proposal, @notes_form), html: { class: "form form-defaults new_proposal_note" }) do |f| %>
1
+ <%= decidim_form_for(@notes_form, url: form_path, html: { class: "form form-defaults new_proposal_note flex flex-col mt-4" }) do |f| %>
2
2
  <div class="form__wrapper">
3
- <%= f.text_area :body, rows: 4, label: t(".note"), class: "rounded border border-text-gray-2 mt-2" %>
3
+ <%= f.text_area :body, rows: 4, label: t(".note"), class: "js-mentions" %>
4
4
  </div>
5
5
 
6
- <%= f.submit t(".submit"), class: "button button__sm button__secondary" %>
6
+ <%= f.submit t(".submit"), class: "button button__sm button__secondary ml-auto" %>
7
7
  <% end %>
@@ -0,0 +1,28 @@
1
+ <% reply_id = "note#{proposal_note.id}-reply" %>
2
+
3
+ <div class="comment">
4
+ <div class="comment__header">
5
+ <%= cell "decidim/author", present(proposal_note.author), from: proposal_note, context_actions: [:date], tooltip: false, show_icons: false %>
6
+ </div>
7
+
8
+ <div class="comment__content">
9
+ <%= simple_format proposal_note.formatted_body %>
10
+ </div>
11
+
12
+ <div class="comment-actions">
13
+ <button class="button button__sm button__text-secondary" data-controls="panel-<%= reply_id %>" id="panel-<%= reply_id %>-trigger">
14
+ <%= icon "chat-1-line" %>
15
+ <span class="font-normal"><%= t("decidim.components.comment.reply") %></span>
16
+ <%= icon "close-circle-line" %>
17
+ <span class="font-normal"><%= t("decidim.components.comment.cancel_reply") %></span>
18
+ </button>
19
+ </div>
20
+
21
+ <div class="mt-6 space-y-2">
22
+ <%= render partial: "decidim/proposals/admin/proposal_notes/proposal_note_reply", collection: proposal_note.replies %>
23
+ </div>
24
+
25
+ <div id="panel-<%= reply_id %>" class="add-comment" data-additional-reply>
26
+ <%= render partial: "decidim/proposals/admin/proposal_notes/form", locals: { form_path: reply_proposal_proposal_note_path(proposal, proposal_note, @notes_form) } %>
27
+ </div>
28
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="comment-reply">
2
+ <div class="comment__header">
3
+ <%= cell "decidim/author", present(proposal_note_reply.author), from: proposal_note_reply, context_actions: [:date], tooltip: false, show_icons: false %>
4
+ </div>
5
+
6
+ <div class="comment__content">
7
+ <%= simple_format proposal_note_reply.formatted_body %>
8
+ </div>
9
+ </div>
@@ -1,37 +1,13 @@
1
1
  <div class="component__show_notes" data-component="accordion" id="accordion-notes">
2
- <button class="card-divider-button" data-controls="panel-notes" type="button">
2
+ <button type="button" class="card-divider-button" data-controls="panel-notes">
3
3
  <%= icon "arrow-right-s-line" %>
4
4
  <h2 class="card-title">
5
5
  <%= t("title", scope: "decidim.proposals.admin.proposal_notes") %>
6
6
  </h2>
7
7
  </button>
8
+
8
9
  <div id="panel-notes">
9
- <div class="component__show_notes-grid">
10
- <% proposal.notes.each do |note| %>
11
- <div class="comment">
12
- <div class="comment__header">
13
- <div>
14
- <div>
15
- <div class="author">
16
- <strong><span class="author__name"><%= note.author.name %></span></strong>
17
- <span><%= l note.created_at, format: :decidim_short %></span>
18
- </div>
19
- </div>
20
- </div>
21
- </div>
22
- <div class="comment__content">
23
- <%= simple_format note.body %>
24
- </div>
25
- </div>
26
- <% end %>
27
- </div>
28
- <div class="card add-comment">
29
- <div class="card-divider">
30
- <h2 class="card-title"><%= t("leave_your_note", scope: "decidim.proposals.admin.proposal_notes") %></h2>
31
- </div>
32
- <div class="card-section">
33
- <%= render "decidim/proposals/admin/proposal_notes/form" %>
34
- </div>
35
- </div>
10
+ <%= render partial: "decidim/proposals/admin/proposal_notes/proposal_note", collection: proposal.notes.not_reply %>
11
+ <%= render partial: "decidim/proposals/admin/proposal_notes/form", locals: { form_path: proposal_proposal_notes_path(proposal, @notes_form) } %>
36
12
  </div>
37
13
  </div>
@@ -52,7 +52,7 @@
52
52
  </strong>
53
53
  </div>
54
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>
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
56
  <div class="flash__title">
57
57
  <%= decidim_escape_translated(form.object.announcement_title).presence || t(".preview") %>
58
58
  </div>
@@ -0,0 +1,21 @@
1
+ <% if view == :deleted %>
2
+ <%= icon_link_to "refresh-line", restore_proposal_path(proposal), t("actions.restore", scope: "decidim.admin"), method: :patch, class: "action-icon--restore" %>
3
+ <% else %>
4
+ <% if allowed_to? :edit, :proposal, proposal: proposal %>
5
+ <%= icon_link_to "pencil-line", edit_proposal_path(proposal), t("actions.edit_proposal", scope: "decidim.proposals"), class: "action-icon--edit-proposal" %>
6
+ <% else %>
7
+ <span class="action-space icon"></span>
8
+ <% end %>
9
+
10
+ <%= icon_with_link_to_proposal(proposal) %>
11
+
12
+ <%= icon_link_to "eye-line", resource_locator(proposal).path, t("actions.preview", scope: "decidim.proposals.admin"), class: "action-icon--preview", target: :blank, data: { "external-link": false } %>
13
+
14
+ <%= resource_permissions_link(proposal) %>
15
+
16
+ <% if allowed_to?(:soft_delete, :proposal, trashable_deleted_resource: proposal) %>
17
+ <%= icon_link_to "delete-bin-line", soft_delete_proposal_path(proposal), t("actions.soft_delete", scope: "decidim.admin"), method: :patch, class: "action-icon--delete", data: { confirm: t("actions.confirm_delete_proposal", scope: "decidim.proposals.admin") } %>
18
+ <% else %>
19
+ <%= icon "delete-bin-line", class: "action-icon action-icon--disabled", role: "img", aria_label: t("actions.soft_delete", scope: "decidim.admin") %>
20
+ <% end %>
21
+ <% end %>
@@ -30,8 +30,9 @@
30
30
  <% end %>
31
31
  </div>
32
32
 
33
- <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/recategorize" %>
34
- <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/scope-change" %>
35
33
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/merge" %>
36
34
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/split" %>
37
35
  <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/publish_answers" %>
36
+ <% if templates_available? %>
37
+ <%= render partial: "decidim/proposals/admin/proposals/bulk_actions/apply_answer_template", locals: { templates: find_templates_for_select(current_component) } %>
38
+ <% end %>
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <% end %>
22
22
  <% if @form.component_suggested_hashtags.any? %>
23
- <div class="row column">
23
+ <div>
24
24
  <%= form.label :suggested_hashtags %>
25
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|
@@ -47,32 +47,25 @@
47
47
  <%= form.geocoding_field :address %>
48
48
  </div>
49
49
  <% end %>
50
- <% if @form.categories&.any? %>
51
- <div class="row column">
52
- <%= form.categories_select :category_id, @form.categories, include_blank: t(".select_a_category") %>
53
- </div>
54
- <% end %>
55
- <% if current_component.has_subscopes? %>
56
- <div class="row column">
57
- <%= scopes_select_field form, :scope_id, root: current_component.scope %>
58
- </div>
59
- <% end %>
60
- <% if component_settings.attachments_allowed? %>
61
- <%= render partial: "decidim/admin/shared/gallery", locals: { form: } %>
50
+
51
+ <% if @form.taxonomy_filters&.any? %>
52
+ <% @form.taxonomy_filters.each do |filter| %>
53
+ <div class="row column">
54
+ <%= filter_taxonomy_items_select_field form, :taxonomies, filter %>
55
+ </div>
56
+ <% end %>
62
57
  <% end %>
58
+
63
59
  <% if component_settings.attachments_allowed? %>
64
60
  <div class="row column">
65
- <legend><%= t(".attachment_legend") %></legend>
66
- <%= form.fields_for :attachment, @form.attachment do |form| %>
67
- <%= form.text_field :title %>
68
- <%= form.upload :file, button_class: "button button__sm button__transparent-secondary" %>
69
- <% if params[:id].present? %>
70
- <% if proposal.documents.present? %>
71
- <%= form.hidden_field :id, value: proposal.documents.first.id %>
72
- <%= form.check_box :delete_file, label: t(".delete_attachment"), value: proposal.documents.first.id %>
73
- <% end %>
74
- <% end %>
75
- <% end %>
61
+ <%= form.attachment :documents,
62
+ multiple: true,
63
+ label: t("decidim.proposals.proposals.edit.add_attachments"),
64
+ button_label: t("decidim.proposals.proposals.edit.add_attachments"),
65
+ button_edit_label: t("decidim.proposals.proposals.edit.edit_attachments"),
66
+ button_class: "button button__lg button__transparent-secondary w-full",
67
+ help_i18n_scope: "decidim.forms.file_help.file",
68
+ help_text: t("attachment_legend", scope: "decidim.proposals.proposals.edit") %>
76
69
  </div>
77
70
  <% end %>
78
71
  </div>
@@ -1,4 +1,6 @@
1
- <tr data-id="<%= proposal.id %>" <%= "data-published-state=false" if proposal.answered? && !proposal.published_state? %>>
1
+ <tr data-id="<%= proposal.id %>"
2
+ data-allow-answer="<%= allowed_to?(:create, :proposal_answer, proposal:) && !proposal.emendation? %>"
3
+ <%= "data-published-state=false" if proposal.answered? && !proposal.published_state? %>>
2
4
  <td>
3
5
  <%= 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
6
  </td>
@@ -6,24 +8,16 @@
6
8
  <% if allowed_to? :edit, :proposal, proposal: proposal %>
7
9
  <%= link_to present(proposal).title(html_escape: true), proposal_path(proposal) %><br>
8
10
  <% else %>
9
- <%= present(proposal).title(html_escape: true) %><br>
11
+ <span class="text-md">
12
+ <%= present(proposal).title(html_escape: true) %><br>
13
+ </span>
10
14
  <% end %>
11
- <div class="flex items-center gap-x-1 mt-2">
12
- <% if proposal.category %>
13
- <%= icon "price-tag-3-line", class: "fill-gray w-4 h-4" %>
14
- <%= translated_attribute proposal.category.name %>
15
- <% end %>
16
- <div class="flex items-center gap-x-1">
17
- <%= icon "scan-line", class: "fill-gray w-4 h-4" %>
18
- <span>
19
- <% if proposal.scope %>
20
- <%= translated_attribute proposal.scope.name %>
21
- <% else %>
22
- <%= t("decidim.scopes.global") %>
23
- <% end %>
24
- </span>
15
+ <% proposal.taxonomies.each do |taxonomy| %>
16
+ <div class="flex items-center gap-x-1 mt-1 text-xs">
17
+ <%= icon "price-tag-3-line", class: "fill-gray w-3 h-3" %>
18
+ <%= translated_attribute taxonomy.name %>
25
19
  </div>
26
- </div>
20
+ <% end %>
27
21
  </td>
28
22
  <td class="table-list__date">
29
23
  <%= l proposal.published_at, format: :decidim_short %>
@@ -67,16 +61,6 @@
67
61
  </td>
68
62
 
69
63
  <td class="table-list__actions">
70
- <% if allowed_to? :edit, :proposal, proposal: proposal %>
71
- <%= icon_link_to "pencil-line", edit_proposal_path(proposal), t("actions.edit_proposal", scope: "decidim.proposals"), class: "action-icon--edit-proposal" %>
72
- <% else %>
73
- <span class="action-space icon"></span>
74
- <% end %>
75
-
76
- <%= icon_with_link_to_proposal(proposal) %>
77
-
78
- <%= icon_link_to "eye-line", resource_locator(proposal).path, t("actions.preview", scope: "decidim.proposals.admin"), class: "action-icon--preview", target: :blank, data: { "external-link": false } %>
79
-
80
- <%= resource_permissions_link(proposal) %>
64
+ <%= render partial: "decidim/proposals/admin/proposals/actions", locals: { proposal:, view: } %>
81
65
  </td>
82
66
  </tr>
@@ -0,0 +1,45 @@
1
+ <thead>
2
+ <tr>
3
+ <th>
4
+ <%= check_box_tag "proposals_bulk", "all", false, class: "js-check-all" %>
5
+ </th>
6
+ <th class="!text-left">
7
+ <%= sort_link(query, :translated_title, t("models.proposal.fields.title", scope: "decidim.proposals") ) %>
8
+ </th>
9
+ <th>
10
+ <%= sort_link(query, :published_at, t("models.proposal.fields.published_at", scope: "decidim.proposals") ) %>
11
+ </th>
12
+
13
+ <% unless current_settings.publish_answers_immediately? %>
14
+ <th>
15
+ <%= sort_link(query, :state_published, t("models.proposal.fields.published_answer", scope: "decidim.proposals") ) %>
16
+ </th>
17
+ <% end %>
18
+
19
+ <% if current_settings.votes_enabled? %>
20
+ <th>
21
+ <%= sort_link(query, :proposal_votes_count, t("models.proposal.fields.votes", scope: "decidim.proposals") ) %>
22
+ </th>
23
+ <% end %>
24
+
25
+ <% if current_component.settings.comments_enabled? and !current_settings.comments_blocked? %>
26
+ <th>
27
+ <%= sort_link(query, :comments_count, t("models.proposal.fields.comments", scope: "decidim.proposals") ) %>
28
+ </th>
29
+ <% end %>
30
+
31
+ <th>
32
+ <%= sort_link(query, :proposal_notes_count, t("models.proposal.fields.notes", scope: "decidim.proposals") ) %>
33
+ </th>
34
+
35
+ <th>
36
+ <%= sort_link(query, :valuation_assignments_count, t("models.proposal.fields.valuators", scope: "decidim.proposals") ) %>
37
+ </th>
38
+
39
+ <th>
40
+ <%= t("models.proposal.fields.state", scope: "decidim.proposals") %>
41
+ </th>
42
+
43
+ <th><%= t("actions.title", scope: "decidim.proposals") %></th>
44
+ </tr>
45
+ </thead>
@@ -0,0 +1,22 @@
1
+ <div id="js-apply-answer-template-actions" class="hide js-bulk-action-form">
2
+ <%= form_tag(update_multiple_answers_proposals_path, method: :post, id: "js-form-apply-answer-template", class: "form form-defaults flex items-center gap-x-2") do %>
3
+ <div class="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
+ <%= hidden_field_tag :template_id %>
9
+
10
+ <%= bulk_templates_select(
11
+ current_component,
12
+ templates.present? ?
13
+ t("apply_answer_template", scope: "decidim.proposals.admin.proposals.index") :
14
+ t("no_templates_available", scope: "decidim.proposals.admin.proposals.index"),
15
+ id: "template_id_select"
16
+ ) %>
17
+
18
+ <%= submit_tag(t("decidim.proposals.admin.proposals.index.update"), id: "js-submit-apply-answer-template", class: "button button__sm button__secondary small button--simple float-left") %>
19
+
20
+ <button id="js-cancel-apply-answer-template" class="button button__sm button__secondary button__sm button__secondary js-cancel-bulk-action" type="button"><%= t("decidim.proposals.admin.proposals.index.cancel") %></button>
21
+ <% end %>
22
+ </div>
@@ -10,23 +10,20 @@
10
10
 
11
11
  <div
12
12
  id="js-bulk-actions-dropdown"
13
- class="dropdown-pane"
13
+ class="dropdown-pane dropdown-pane--buttons"
14
14
  data-position="bottom"
15
15
  data-alignment="right"
16
16
  data-dropdown="dropdown"
17
17
  data-auto-focus="false"
18
18
  data-events="resize">
19
19
  <ul>
20
- <li>
21
- <button type="button" data-action="recategorize-proposals">
22
- <%= t("decidim.proposals.admin.proposals.index.change_category") %>
23
- </button>
24
- </li>
25
- <li>
26
- <button type="button" data-action="scope-change-proposals">
27
- <%= t("decidim.proposals.admin.proposals.index.change_scope") %>
28
- </button>
29
- </li>
20
+ <% if current_component_taxonomy_filters&.any? %>
21
+ <li>
22
+ <button type="button" data-action="taxonomy-change-proposals">
23
+ <%= t("decidim.proposals.admin.proposals.index.change_taxonomies") %>
24
+ </button>
25
+ </li>
26
+ <% end %>
30
27
  <li>
31
28
  <button type="button" data-action="merge-proposals">
32
29
  <%= t("decidim.proposals.admin.proposals.index.merge") %>
@@ -49,6 +46,13 @@
49
46
  </button>
50
47
  </li>
51
48
  <% end %>
49
+ <% if templates_available? %>
50
+ <li>
51
+ <button type="button" data-action="apply-answer-template">
52
+ <%= t("decidim.proposals.admin.proposals.index.apply_answer_template") %>
53
+ </button>
54
+ </li>
55
+ <% end %>
52
56
  <li>
53
57
  <button type="button" data-action="publish-answers">
54
58
  <%= t("decidim.proposals.admin.proposals.index.publish_answers") %>
@@ -0,0 +1,23 @@
1
+ <div id="js-taxonomy-change-proposals-actions" class="item_show__header__action-options js-bulk-action-form hide">
2
+ <%= form_tag(update_taxonomies_proposals_path, method: :post, id: "js-form-taxonomy-change-proposals", class: "form form-defaults w-full") do %>
3
+ <div class="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
+ <% current_component_taxonomy_filters.each do |filter| %>
10
+ <div class="row column">
11
+ <label class="w-full font-semibold block mb-4" for="taxonomies_for_filter_<%= filter.id %>">
12
+ <%= decidim_sanitize_translated(filter.name) %>
13
+ <%= select_tag "taxonomies[]", options_for_select(taxonomy_items_options_for_filter(filter)), include_blank: I18n.t("decidim.taxonomies.prompt"), class: "w-full mt-2", id: "taxonomies_for_filter_#{filter.id}" %>
14
+ </label>
15
+ </div>
16
+ <% end %>
17
+
18
+ <div class="flex justify-end gap-x-4 mt-4">
19
+ <%= submit_tag(t("decidim.proposals.admin.proposals.index.change_taxonomies"), id: "js-submit-taxonomy-change-proposals", class: "button button__sm button__secondary small button--simple float-left") %>
20
+ <button class="button button__sm button__secondary js-cancel-bulk-action" type="button"><%= t("decidim.proposals.admin.proposals.index.cancel") %></button>
21
+ </div>
22
+ <% end %>
23
+ </div>