decidim-decidim_awesome 0.8.0 → 0.12.0

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 (351) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +363 -0
  3. data/README.md +375 -100
  4. data/Rakefile +2 -1
  5. data/app/cells/concerns/decidim/decidim_awesome/global_menu_cell_override.rb +20 -0
  6. data/app/cells/concerns/decidim/decidim_awesome/proposal_l_cell_override.rb +26 -0
  7. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +5 -12
  8. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +7 -7
  9. data/app/cells/decidim/decidim_awesome/voting/proposal_metadata_cell.rb +69 -0
  10. data/app/cells/decidim/decidim_awesome/voting/voting_cards_base_cell.rb +40 -0
  11. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/modal.erb +18 -0
  12. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/show.erb +40 -0
  13. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +16 -0
  14. data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal_cell.rb +90 -0
  15. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +2 -2
  16. data/app/commands/concerns/decidim/decidim_awesome/proposals/admin/update_proposal_override.rb +31 -0
  17. data/app/commands/concerns/decidim/decidim_awesome/proposals/create_collaborative_draft_override.rb +27 -0
  18. data/app/commands/concerns/decidim/decidim_awesome/proposals/create_proposal_override.rb +27 -0
  19. data/app/commands/concerns/decidim/decidim_awesome/proposals/update_collaborative_draft_override.rb +27 -0
  20. data/app/commands/concerns/decidim/decidim_awesome/proposals/update_proposal_override.rb +26 -0
  21. data/app/commands/concerns/decidim/decidim_awesome/system/create_organization_override.rb +29 -0
  22. data/app/commands/concerns/decidim/decidim_awesome/system/update_organization_override.rb +35 -0
  23. data/app/commands/concerns/decidim/decidim_awesome/update_account_override.rb +30 -0
  24. data/app/commands/decidim/decidim_awesome/admin/create_constraint.rb +3 -3
  25. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +1 -1
  26. data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +1 -1
  27. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +5 -4
  28. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +1 -1
  29. data/app/commands/decidim/decidim_awesome/admin/create_scoped_style.rb +4 -3
  30. data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +1 -1
  31. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +2 -2
  32. data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +2 -2
  33. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +7 -4
  34. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +1 -1
  35. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +7 -5
  36. data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +2 -2
  37. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +2 -3
  38. data/app/commands/decidim/decidim_awesome/admin/update_constraint.rb +3 -3
  39. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +3 -3
  40. data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +1 -1
  41. data/app/commands/decidim/decidim_awesome/command.rb +8 -0
  42. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +2 -2
  43. data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +43 -0
  44. data/app/controllers/concerns/decidim/decidim_awesome/admin_accountability/admin/filterable.rb +67 -0
  45. data/app/controllers/concerns/decidim/decidim_awesome/admin_accountability/admin/filterable_helper.rb +38 -0
  46. data/app/controllers/concerns/decidim/decidim_awesome/check_login_authorizations.rb +60 -0
  47. data/app/controllers/concerns/decidim/decidim_awesome/content_security_policy.rb +34 -0
  48. data/app/controllers/concerns/decidim/decidim_awesome/limit_pending_amendments.rb +35 -0
  49. data/app/controllers/concerns/decidim/decidim_awesome/needs_awesome_config.rb +0 -2
  50. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +3 -3
  51. data/app/controllers/concerns/decidim/decidim_awesome/proposals/memoize_extra_fields.rb +23 -0
  52. data/app/controllers/concerns/decidim/decidim_awesome/proposals/orderable_override.rb +94 -0
  53. data/app/controllers/concerns/decidim/decidim_awesome/proposals/proposal_votes_controller_override.rb +64 -0
  54. data/app/controllers/concerns/decidim/decidim_awesome/use_user_time_zone.rb +32 -0
  55. data/app/controllers/decidim/decidim_awesome/admin/admin_accountability_controller.rb +72 -0
  56. data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +122 -0
  57. data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +2 -0
  58. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +21 -17
  59. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +17 -8
  60. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +27 -20
  61. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +6 -8
  62. data/app/controllers/decidim/decidim_awesome/admin/maintenance_controller.rb +76 -0
  63. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +6 -8
  64. data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +14 -6
  65. data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +2 -2
  66. data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +14 -6
  67. data/app/controllers/decidim/decidim_awesome/blank_component_controller.rb +8 -3
  68. data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +3 -5
  69. data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +18 -5
  70. data/app/controllers/decidim/decidim_awesome/required_authorizations_controller.rb +58 -0
  71. data/app/forms/concerns/decidim/decidim_awesome/account_form_override.rb +25 -0
  72. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations.rb +57 -0
  73. data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +21 -0
  74. data/app/forms/concerns/decidim/decidim_awesome/system/organization_form_override.rb +34 -0
  75. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +88 -20
  76. data/app/forms/decidim/decidim_awesome/admin/custom_redirect_form.rb +3 -3
  77. data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +4 -0
  78. data/app/forms/decidim/decidim_awesome/admin/menu_form.rb +5 -5
  79. data/app/helpers/concerns/decidim/decidim_awesome/amendments_helper_override.rb +65 -0
  80. data/app/helpers/concerns/decidim/decidim_awesome/breadcrumb_helper_override.rb +23 -0
  81. data/app/helpers/concerns/decidim/decidim_awesome/proposals/application_helper_override.rb +110 -0
  82. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +12 -29
  83. data/app/helpers/decidim/decidim_awesome/admin/system_checker_helpers.rb +4 -0
  84. data/app/helpers/decidim/decidim_awesome/map_helper.rb +38 -52
  85. data/app/jobs/decidim/decidim_awesome/destroy_private_data_job.rb +22 -0
  86. data/app/jobs/decidim/decidim_awesome/export_admin_actions_job.rb +28 -0
  87. data/app/models/concerns/decidim/decidim_awesome/has_proposal_extra_fields.rb +80 -0
  88. data/app/models/concerns/decidim/decidim_awesome/has_vote_weight.rb +30 -0
  89. data/app/models/decidim/decidim_awesome/awesome_config.rb +1 -2
  90. data/app/models/decidim/decidim_awesome/config_constraint.rb +0 -2
  91. data/app/models/decidim/decidim_awesome/editor_image.rb +0 -3
  92. data/app/models/decidim/decidim_awesome/paper_trail_version.rb +117 -0
  93. data/app/models/decidim/decidim_awesome/proposal_extra_field.rb +45 -0
  94. data/app/models/decidim/decidim_awesome/vote_weight.rb +30 -0
  95. data/app/overrides/decidim/account/show/add_timezone_select.html.erb.deface +3 -0
  96. data/app/overrides/decidim/admin/officializations/index/add_modal.html.erb.deface +3 -0
  97. data/app/overrides/decidim/admin/officializations/index/add_td.html.erb.deface +5 -0
  98. data/app/overrides/decidim/admin/officializations/index/add_th.html.erb.deface +5 -0
  99. data/app/overrides/decidim/proposals/admin/proposals/_form/replace_editor.html.erb.deface +3 -0
  100. data/app/overrides/decidim/proposals/admin/proposals/show/add_private_body.html.erb.deface +7 -0
  101. data/app/overrides/decidim/proposals/admin/proposals/show/replace_body.html.erb.deface +5 -0
  102. data/app/overrides/decidim/proposals/proposals/_proposal_aside/limit_amendments_modal.html.erb.deface +5 -0
  103. data/app/overrides/decidim/proposals/proposals/_vote_button/replace_vote_button.html.erb.deface +7 -0
  104. data/app/overrides/decidim/proposals/proposals/_votes_count/replace_counter.html.erb.deface +10 -0
  105. data/app/overrides/decidim/system/organizations/_advanced_settings/add_awesome_config.html.erb.deface +9 -0
  106. data/app/{views/layouts/decidim/_head.html.erb → overrides/layouts/decidim/_decidim_javascript/add_awesome_tags.html.erb.deface} +2 -1
  107. data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +7 -0
  108. data/app/overrides/layouts/decidim/admin/_header/add_awesome_custom_styles.html.erb.deface +3 -0
  109. data/app/overrides/layouts/decidim/admin/_header/add_awesome_tags.html.erb.deface +10 -0
  110. data/app/packs/entrypoints/decidim_admin_decidim_awesome.js +2 -2
  111. data/app/packs/entrypoints/decidim_admin_decidim_awesome_global.js +4 -0
  112. data/app/packs/entrypoints/decidim_admin_decidim_awesome_global.scss +1 -0
  113. data/app/packs/entrypoints/decidim_admin_decidim_awesome_search_form.scss +1 -0
  114. data/app/packs/entrypoints/decidim_decidim_awesome.js +2 -2
  115. data/app/packs/entrypoints/decidim_decidim_awesome_map.scss +1 -1
  116. data/app/packs/entrypoints/decidim_editor.js +14 -0
  117. data/app/packs/images/decidim/decidim_awesome/handcard.svg +14 -0
  118. data/app/packs/images/decidim/decidim_awesome/handcheck.svg +17 -0
  119. data/app/packs/images/decidim/decidim_awesome/pokecode-logo.png +0 -0
  120. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +96 -69
  121. data/app/packs/src/decidim/decidim_awesome/admin/check_redirections.js +46 -41
  122. data/app/packs/src/decidim/decidim_awesome/admin/codemirror.js +3 -3
  123. data/app/packs/src/decidim/decidim_awesome/admin/constraint_form_events.js +115 -0
  124. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +19 -14
  125. data/app/packs/src/decidim/decidim_awesome/admin/form_exit_warn.js +23 -11
  126. data/app/packs/src/decidim/decidim_awesome/admin/proposal_sortings.js +26 -0
  127. data/app/packs/src/decidim/decidim_awesome/admin/tabs_change.js +31 -0
  128. data/app/packs/src/decidim/decidim_awesome/admin/user_picker.js +34 -20
  129. data/app/packs/src/decidim/decidim_awesome/admin/verification_selects.js +21 -0
  130. data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +43 -0
  131. data/app/packs/src/decidim/decidim_awesome/amendments/show_modal_on_limits.js +28 -0
  132. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +7 -16
  133. data/app/packs/src/decidim/decidim_awesome/awesome_admin_global.js +2 -0
  134. data/app/packs/src/decidim/decidim_awesome/awesome_application.js +2 -15
  135. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/fetcher.js +48 -23
  136. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/meetings_fetcher.js +9 -12
  137. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +28 -0
  138. data/app/packs/src/decidim/decidim_awesome/awesome_map/awesome_map.js +15 -15
  139. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +70 -37
  140. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/meetings_controller.js +11 -7
  141. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +9 -16
  142. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +75 -45
  143. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +28 -18
  144. data/app/packs/src/decidim/decidim_awesome/editor/index.js +94 -0
  145. data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +29 -28
  146. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +55 -42
  147. data/app/packs/src/decidim/decidim_awesome/forms/rich_text_plugin.js +30 -32
  148. data/app/packs/src/decidim/decidim_awesome/proposals/custom_fields.js +32 -16
  149. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +16 -10
  150. data/app/packs/src/decidim/decidim_awesome/voting/voting_cards.js +72 -0
  151. data/app/packs/stylesheets/decidim/decidim_awesome/admin/admin_accountability.scss +67 -0
  152. data/app/packs/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +11 -12
  153. data/app/packs/stylesheets/decidim/decidim_awesome/admin/check_redirections.scss +15 -0
  154. data/app/packs/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +24 -12
  155. data/app/packs/stylesheets/decidim/decidim_awesome/admin/constraints.scss +49 -29
  156. data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +28 -71
  157. data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_styles.scss +48 -0
  158. data/app/packs/stylesheets/decidim/decidim_awesome/admin/intergram_fixes.scss +11 -0
  159. data/app/packs/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +17 -26
  160. data/app/packs/stylesheets/decidim/decidim_awesome/admin/verifications.scss +99 -0
  161. data/app/packs/stylesheets/decidim/decidim_awesome/amendments/modal.scss +5 -0
  162. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin.scss +14 -49
  163. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin_global.scss +20 -0
  164. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_application.scss +4 -18
  165. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +1 -1
  166. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +41 -35
  167. data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +6 -6
  168. data/app/packs/stylesheets/decidim/decidim_awesome/forms/custom_fields.scss +118 -0
  169. data/app/packs/stylesheets/decidim/decidim_awesome/shared/spinner.scss +26 -0
  170. data/app/packs/stylesheets/decidim/decidim_awesome/voting/voting_cards.scss +205 -0
  171. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +57 -1
  172. data/app/permissions/decidim/decidim_awesome/permissions.rb +11 -6
  173. data/app/presenters/concerns/decidim/decidim_awesome/breadcrumb_root_menu_item_presenter_override.rb +23 -0
  174. data/app/presenters/{decidim → concerns/decidim}/decidim_awesome/menu_item_presenter_override.rb +10 -2
  175. data/app/presenters/{decidim → concerns/decidim}/decidim_awesome/menu_presenter_override.rb +8 -0
  176. data/app/presenters/concerns/decidim/decidim_awesome/proposals/proposal_presenter_override.rb +20 -0
  177. data/app/presenters/decidim/decidim_awesome/admin_log/component_presenter_override.rb +28 -0
  178. data/app/presenters/decidim/decidim_awesome/admin_log/user_presenter_override.rb +46 -0
  179. data/app/presenters/decidim/decidim_awesome/paper_trail_base_presenter.rb +28 -0
  180. data/app/presenters/decidim/decidim_awesome/participatory_space_role_presenter.rb +45 -0
  181. data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +70 -0
  182. data/app/presenters/decidim/decidim_awesome/role_base_presenter.rb +102 -0
  183. data/app/presenters/decidim/decidim_awesome/user_entity_presenter.rb +50 -0
  184. data/app/queries/decidim/decidim_awesome/private_data_finder.rb +19 -0
  185. data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb +72 -0
  186. data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_override.rb +38 -0
  187. data/app/serializers/decidim/decidim_awesome/paper_trail_version_serializer.rb +37 -0
  188. data/app/serializers/decidim/decidim_awesome/proposals/private_proposal_serializer.rb +34 -0
  189. data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_custom_fields.rb +59 -0
  190. data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_vote_weights.rb +20 -0
  191. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +12 -0
  192. data/app/validators/concerns/decidim/decidim_awesome/etiquette_validator_override.rb +41 -0
  193. data/app/views/decidim/decidim_awesome/account/_timezone_select.html.erb +3 -0
  194. data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +71 -0
  195. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/authorization.html.erb +20 -0
  196. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +3 -0
  197. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +5 -0
  198. data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +41 -0
  199. data/app/views/decidim/decidim_awesome/admin/checks/_assets_tester.html.erb +2 -0
  200. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +51 -48
  201. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -2
  202. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +25 -18
  203. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +7 -6
  204. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +12 -16
  205. data/app/views/decidim/decidim_awesome/admin/config/_form_livechat.html.erb +39 -23
  206. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +35 -17
  207. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_private_custom_fields.html.erb +1 -0
  208. data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +92 -6
  209. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_admin_styles.html.erb +1 -0
  210. data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +48 -0
  211. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +16 -6
  212. data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +15 -0
  213. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +22 -12
  214. data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +1 -49
  215. data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +14 -9
  216. data/app/views/decidim/decidim_awesome/admin/constraints/no_permissions.html.erb +6 -0
  217. data/app/views/decidim/decidim_awesome/admin/constraints/show.html.erb +14 -9
  218. data/app/views/decidim/decidim_awesome/admin/custom_redirects/_form.html.erb +20 -5
  219. data/app/views/decidim/decidim_awesome/admin/custom_redirects/edit.html.erb +5 -5
  220. data/app/views/decidim/decidim_awesome/admin/custom_redirects/index.html.erb +14 -13
  221. data/app/views/decidim/decidim_awesome/admin/custom_redirects/new.html.erb +5 -5
  222. data/app/views/decidim/decidim_awesome/admin/maintenance/_private_data.html.erb +44 -0
  223. data/app/views/decidim/decidim_awesome/admin/maintenance/show.html.erb +44 -0
  224. data/app/views/decidim/decidim_awesome/admin/menu_hacks/_form.html.erb +6 -6
  225. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +21 -12
  226. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +39 -42
  227. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +21 -12
  228. data/app/views/decidim/decidim_awesome/admin/officializations/_participants_td.html.erb +25 -0
  229. data/app/views/decidim/decidim_awesome/admin/officializations/_participants_th.html.erb +1 -0
  230. data/app/views/decidim/decidim_awesome/admin/officializations/_verification_modal.html.erb +9 -0
  231. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +8 -5
  232. data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +20 -0
  233. data/app/views/decidim/decidim_awesome/admin/shared/_filters_with_date.html.erb +61 -0
  234. data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +23 -0
  235. data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +8 -2
  236. data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +7 -12
  237. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +53 -37
  238. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +14 -5
  239. data/app/views/decidim/decidim_awesome/required_authorizations/index.html.erb +66 -0
  240. data/app/views/decidim/decidim_awesome/system/organizations/_admin_allowed_authorizations.html.erb +5 -0
  241. data/app/views/decidim/decidim_awesome/voting/voting_cards/_show_vote_button.html.erb +3 -0
  242. data/app/views/decidim/decidim_awesome/voting/voting_cards/_show_votes_count.html.erb +1 -0
  243. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +11 -8
  244. data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
  245. data/app/views/layouts/decidim/decidim_awesome/_intergram_widget.html.erb +9 -6
  246. data/app/views/layouts/decidim/decidim_awesome/admin/_base.html.erb +12 -0
  247. data/app/views/layouts/decidim/decidim_awesome/admin/_custom_styles.html.erb +3 -0
  248. data/app/views/layouts/decidim/decidim_awesome/admin/admin_authorizations.html.erb +7 -0
  249. data/app/views/layouts/decidim/decidim_awesome/admin/application.html.erb +3 -0
  250. data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +19 -0
  251. data/config/assets.rb +5 -34
  252. data/config/i18n-tasks.yml +30 -0
  253. data/config/locales/ca.yml +335 -26
  254. data/config/locales/cs.yml +331 -22
  255. data/config/locales/de.yml +642 -0
  256. data/config/locales/en.yml +403 -33
  257. data/config/locales/es.yml +333 -24
  258. data/config/locales/eu.yml +623 -20
  259. data/config/locales/fr.yml +282 -23
  260. data/config/locales/hu.yml +268 -0
  261. data/config/locales/it.yml +155 -24
  262. data/config/locales/ja.yml +334 -25
  263. data/config/locales/lt.yml +94 -0
  264. data/config/locales/nl.yml +20 -19
  265. data/config/locales/pt-BR.yml +31 -24
  266. data/config/locales/ro-RO.yml +152 -0
  267. data/config/locales/sv.yml +28 -12
  268. data/config/rubocop/disabled.yml +11 -0
  269. data/config/rubocop/faker.yml +480 -0
  270. data/config/rubocop/rails.yml +88 -0
  271. data/config/rubocop/rspec.yml +65 -0
  272. data/config/rubocop/ruby.yml +1210 -0
  273. data/db/migrate/20231006113837_create_decidim_awesome_vote_weights.rb +13 -0
  274. data/db/migrate/20231006113841_create_decidim_awesome_proposal_extra_fields.rb +14 -0
  275. data/db/migrate/20240306175331_rename_editor_images_awesome_config.rb +18 -0
  276. data/db/migrate/20240531224204_add_decidim_awesome_proposal_private_fields.rb +29 -0
  277. data/db/migrate/20240729164227_add_decidim_awesome_proposal_private_fields_date.rb +20 -0
  278. data/db/seeds.rb +4 -4
  279. data/lib/decidim/decidim_awesome/admin_engine.rb +41 -6
  280. data/lib/decidim/decidim_awesome/api/types/localized_custom_fields_type.rb +22 -0
  281. data/lib/decidim/decidim_awesome/api/types/translated_custom_fields_type.rb +51 -0
  282. data/lib/decidim/decidim_awesome/authorizator.rb +34 -0
  283. data/lib/decidim/decidim_awesome/awesome.rb +236 -29
  284. data/lib/decidim/decidim_awesome/awesome_helpers.rb +57 -17
  285. data/lib/decidim/decidim_awesome/checksums.yml +95 -20
  286. data/lib/decidim/decidim_awesome/config.rb +25 -17
  287. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +3 -3
  288. data/lib/decidim/decidim_awesome/custom_fields.rb +13 -5
  289. data/lib/decidim/decidim_awesome/engine.rb +250 -19
  290. data/lib/decidim/decidim_awesome/iframe_component/component.rb +4 -4
  291. data/lib/decidim/decidim_awesome/lock.rb +47 -0
  292. data/lib/decidim/decidim_awesome/map_component/component.rb +2 -2
  293. data/lib/decidim/decidim_awesome/menu.rb +201 -0
  294. data/lib/decidim/decidim_awesome/menu_hacker.rb +7 -5
  295. data/{app/middleware/decidim/decidim_awesome → lib/decidim/decidim_awesome/middleware}/current_config.rb +5 -3
  296. data/lib/decidim/decidim_awesome/request_memoizer.rb +16 -0
  297. data/lib/decidim/decidim_awesome/system_checker.rb +6 -2
  298. data/lib/decidim/decidim_awesome/test/factories.rb +31 -9
  299. data/lib/decidim/decidim_awesome/test/initializer.rb +22 -6
  300. data/lib/decidim/decidim_awesome/test/layouts/decidim/_head.html.erb +2 -2
  301. data/lib/decidim/decidim_awesome/test/layouts/decidim/admin/_header.html.erb +2 -2
  302. data/lib/decidim/decidim_awesome/test/shared_examples/action_log_presenter_examples.rb +61 -0
  303. data/lib/decidim/decidim_awesome/test/shared_examples/{box_label_editor.rb → box_label_editor_examples.rb} +22 -22
  304. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +24 -6
  305. data/lib/decidim/decidim_awesome/test/shared_examples/custom_fields_examples.rb +155 -0
  306. data/lib/decidim/decidim_awesome/test/shared_examples/custom_redirects_contexts.rb +7 -7
  307. data/lib/decidim/decidim_awesome/test/shared_examples/custom_styles_examples.rb +156 -0
  308. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +42 -58
  309. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +9 -8
  310. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +40 -29
  311. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +129 -38
  312. data/lib/decidim/decidim_awesome/version.rb +2 -2
  313. data/lib/decidim/decidim_awesome/voting_manifest.rb +55 -0
  314. data/lib/decidim/decidim_awesome.rb +1 -3
  315. data/lib/tasks/decidim_awesome_upgrade_tasks.rake +9 -0
  316. data/lib/tasks/decidim_awesome_webpacker_tasks.rake +2 -0
  317. data/package.json +54 -0
  318. metadata +192 -86
  319. data/app/forms/decidim/decidim_awesome/proposals/proposal_wizard_create_step_form_override.rb +0 -38
  320. data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +0 -48
  321. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +0 -78
  322. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +0 -106
  323. data/app/packs/entrypoints/decidim_admin_decidim_awesome_custom_fields.js +0 -2
  324. data/app/packs/entrypoints/decidim_decidim_awesome_admin_form_exit_warn.js +0 -1
  325. data/app/packs/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
  326. data/app/packs/src/decidim/decidim_awesome/admin/constraints.js +0 -55
  327. data/app/packs/src/decidim/decidim_awesome/editors/editor.js +0 -190
  328. data/app/packs/src/decidim/decidim_awesome/editors/tabs_focus.js +0 -22
  329. data/app/packs/src/vendor/image-resize.min.js +0 -1
  330. data/app/packs/src/vendor/image-upload.min.js +0 -6
  331. data/app/packs/src/vendor/leaflet.featuregroup.subgroup.js +0 -184
  332. data/app/packs/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +0 -19
  333. data/app/packs/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +0 -58
  334. data/app/packs/stylesheets/vendor/select2-foundation-theme.scss +0 -348
  335. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +0 -26
  336. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +0 -26
  337. data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +0 -11
  338. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +0 -101
  339. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +0 -83
  340. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +0 -1
  341. data/app/views/layouts/decidim/admin/_header.html.erb +0 -5
  342. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +0 -75
  343. data/app/views/v0.25/decidim/proposals/collaborative_drafts/_show.html.erb +0 -128
  344. data/app/views/v0.25/layouts/decidim/_head.html.erb +0 -41
  345. data/app/views/v0.25/layouts/decidim/admin/_header.html.erb +0 -11
  346. data/app/views/v0.26/decidim/proposals/collaborative_drafts/_show.html.erb +0 -128
  347. data/app/views/v0.26/layouts/decidim/_head.html.erb +0 -45
  348. data/app/views/v0.26/layouts/decidim/admin/_header.html.erb +0 -11
  349. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +0 -39
  350. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +0 -37
  351. /data/app/models/{decidim → concerns/decidim}/decidim_awesome/user_override.rb +0 -0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Proposals
6
+ ##
7
+ # Override Proposal Presenter to access private field.
8
+ module ProposalPresenterOverride
9
+ extend ActiveSupport::Concern
10
+ included do
11
+ def private_body(*)
12
+ return unless proposal
13
+
14
+ proposal.private_body
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AdminLog
6
+ module ComponentPresenterOverride
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ alias_method :decidim_original_action_string, :action_string
11
+ alias_method :decidim_original_i18n_params, :i18n_params
12
+
13
+ def action_string
14
+ return "decidim.decidim_awesome.admin_log.component.#{action}" if action == "destroy_private_data"
15
+
16
+ decidim_original_action_string
17
+ end
18
+
19
+ def i18n_params
20
+ return decidim_original_i18n_params unless action == "destroy_private_data"
21
+
22
+ decidim_original_i18n_params.merge({ count: action_log.extra["count"] })
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AdminLog
6
+ module UserPresenterOverride
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ alias_method :decidim_original_action_string, :action_string
11
+ alias_method :decidim_original_i18n_params, :i18n_params
12
+ alias_method :decidim_original_resource_presenter, :resource_presenter
13
+
14
+ def action_string
15
+ return "decidim.decidim_awesome.admin_log.user.#{action}" if authorization_action?
16
+
17
+ decidim_original_action_string
18
+ end
19
+
20
+ def i18n_params
21
+ return decidim_original_i18n_params unless authorization_action?
22
+
23
+ decidim_original_i18n_params.merge({
24
+ handler_name: h.content_tag(:span, action_log.extra["handler_name"], class: "logs__log__resource"),
25
+ reason: h.content_tag(:em, action_log.extra["reason"])
26
+ })
27
+ end
28
+
29
+ def resource_presenter
30
+ return decidim_original_resource_presenter unless authorization_action? && authorization_user
31
+
32
+ @resource_presenter ||= Decidim::Log::UserPresenter.new(authorization_user, h, { "name" => authorization_user.name, "nickname" => authorization_user.nickname })
33
+ end
34
+
35
+ def authorization_user
36
+ @authorization_user ||= Decidim::User.find_by(id: action_log.extra["user_id"])
37
+ end
38
+
39
+ def authorization_action?
40
+ action.in?(%w(admin_creates_authorization admin_forces_authorization admin_destroys_authorization))
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class PaperTrailBasePresenter
6
+ attr_reader :entry, :html
7
+
8
+ def initialize(entry, html: true)
9
+ @entry = entry
10
+ @html = html
11
+ end
12
+
13
+ # try to use the object in the database if exists
14
+ # Note that "reify" does not work on "create" events
15
+ def item
16
+ @item ||= entry&.item
17
+ end
18
+
19
+ def item_type
20
+ @item_type ||= entry&.item_type
21
+ end
22
+
23
+ def item_id
24
+ @item_id ||= entry&.item_id
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class ParticipatorySpaceRolePresenter < RoleBasePresenter
6
+ # Finds the destroyed entry if exists
7
+ def destroy_entry
8
+ @destroy_entry ||= PaperTrail::Version.find_by(item_type:, event: "destroy", item_id:)
9
+ end
10
+
11
+ # roles are in the destroyed event if the role has been removed
12
+ def role
13
+ @role ||= destroy_item&.role || item&.role
14
+ end
15
+
16
+ def role_name
17
+ type = I18n.t(role, scope: "decidim.decidim_awesome.admin.admin_accountability.roles", default: role)
18
+ return type unless html && role_class
19
+
20
+ "<span class=\"#{role_class}\">#{type}</span>".html_safe
21
+ end
22
+
23
+ def user
24
+ @user ||= Decidim::User.find_by(id: entry.changeset["decidim_user_id"]&.last)
25
+ end
26
+
27
+ # participatory spaces is in the normal entry if the role hasn't been removed
28
+ # otherwise is in the removed role log entry
29
+ def participatory_space
30
+ item&.participatory_space || destroy_item&.participatory_space
31
+ end
32
+
33
+ private
34
+
35
+ def role_class
36
+ case role
37
+ when "admin"
38
+ "text-alert"
39
+ when "valuator"
40
+ "text-secondary"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class PrivateDataPresenter < SimpleDelegator
6
+ include Decidim::TranslatableAttributes
7
+ include ActionView::Helpers::DateHelper
8
+ include ActionView::Helpers::TagHelper
9
+
10
+ def name
11
+ @name ||= "#{translated_attribute(participatory_space.title)} / #{translated_attribute(super)}"
12
+ end
13
+
14
+ def path
15
+ @path ||= Decidim::EngineRouter.main_proxy(self).root_path
16
+ end
17
+
18
+ def total
19
+ @total ||= Decidim::Proposals::Proposal.joins(:extra_fields)
20
+ .where(component: self)
21
+ .where.not(extra_fields: { private_body: nil })
22
+ .count.to_s
23
+ end
24
+
25
+ def last_date
26
+ @last_date ||= Decidim::Proposals::Proposal.joins(:extra_fields)
27
+ .where(component: self)
28
+ .where.not(extra_fields: { private_body: nil })
29
+ .order(private_body_updated_at: :desc)
30
+ .first&.extra_fields&.private_body_updated_at
31
+ end
32
+
33
+ def time_ago
34
+ I18n.t("decidim.decidim_awesome.admin.maintenance.private_data.time_ago", time: time_ago_in_words(last_date)) if last_date
35
+ end
36
+
37
+ def destroyable?
38
+ return false unless last_date
39
+
40
+ last_date < DecidimAwesome.private_data_expiration_time.ago
41
+ end
42
+
43
+ def locked?
44
+ Decidim::DecidimAwesome::Lock.new(organization).locked?(__getobj__)
45
+ end
46
+
47
+ def as_json(_options = nil)
48
+ {
49
+ id:,
50
+ name:,
51
+ path:,
52
+ total:,
53
+ last_date:,
54
+ time_ago:,
55
+ locked: locked?,
56
+ done:
57
+ }
58
+ end
59
+
60
+ def done
61
+ return content_tag("span", "", class: "loading-spinner primary") if locked?
62
+
63
+ return if destroyable?
64
+ return if last_date
65
+
66
+ I18n.t("decidim.decidim_awesome.admin.maintenance.private_data.done")
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class RoleBasePresenter < PaperTrailBasePresenter
6
+ include TranslatableAttributes
7
+
8
+ # Finds the destroyed entry if exists
9
+ def destroy_entry
10
+ nil
11
+ end
12
+
13
+ alias destroyed? destroy_entry
14
+
15
+ # try to reconstruct a destroyed event
16
+ def destroy_item
17
+ @destroy_item ||= destroy_entry&.reify
18
+ end
19
+
20
+ def user
21
+ raise "Please implement this method to return the user object"
22
+ end
23
+
24
+ def role_name
25
+ raise "Please implement this method to return the role text"
26
+ end
27
+
28
+ def participatory_space
29
+ nil
30
+ end
31
+
32
+ def participatory_space_name
33
+ participatory_space_type.present? ? "#{participatory_space_type} > #{translated_attribute participatory_space&.title}" : ""
34
+ end
35
+
36
+ def participatory_space_type
37
+ I18n.t(participatory_space&.manifest&.name, scope: "decidim.admin.menu") if participatory_space.present?
38
+ end
39
+
40
+ # try to link to the user roles page or to the participatory space if not existing
41
+ def participatory_space_path
42
+ proxy.send("#{participatory_space.manifest.route_name}_user_roles_path")
43
+ rescue NoMethodError
44
+ begin
45
+ proxy.send("#{participatory_space.manifest.route_name}_path", participatory_space)
46
+ rescue NoMethodError
47
+ ""
48
+ end
49
+ end
50
+
51
+ def user_name
52
+ return I18n.t("missing_user", scope: "decidim.decidim_awesome.admin.admin_accountability") unless user
53
+ return I18n.t("deleted_user", scope: "decidim.decidim_awesome.admin.admin_accountability") if user.deleted?
54
+
55
+ user&.name
56
+ end
57
+
58
+ def user_email
59
+ user&.email || entry.changeset["email"]&.last
60
+ end
61
+
62
+ def created_at
63
+ entry.changeset["created_at"]&.last || entry&.created_at
64
+ end
65
+
66
+ def created_date
67
+ I18n.l(created_at, format: :short)
68
+ rescue I18n::ArgumentError
69
+ ""
70
+ end
71
+
72
+ def destroyed_at
73
+ destroy_entry&.created_at
74
+ end
75
+
76
+ def removal_date
77
+ I18n.l(destroyed_at, format: :short)
78
+ rescue I18n::ArgumentError
79
+ info_text("currently_active", klass: "text-success")
80
+ end
81
+
82
+ def last_sign_in_date
83
+ I18n.l(user&.last_sign_in_at, format: :short)
84
+ rescue I18n::ArgumentError
85
+ info_text("never_logged")
86
+ end
87
+
88
+ protected
89
+
90
+ def info_text(key, klass: :muted)
91
+ text = I18n.t(key, scope: "decidim.decidim_awesome.admin.admin_accountability")
92
+ return text unless html
93
+
94
+ "<span class=\"#{klass}\">#{text}</span>".html_safe
95
+ end
96
+
97
+ def proxy
98
+ @proxy ||= Decidim::EngineRouter.admin_proxy(participatory_space)
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class UserEntityPresenter < RoleBasePresenter
6
+ # Finds the destroyed entry if exists
7
+ def destroy_entry
8
+ @destroy_entry ||= begin
9
+ query = PaperTrail::Version.where(item_type:, event: "update", item_id:)
10
+ .where("id > ?", entry.id)
11
+ if roles.include? "admin"
12
+ query.where("object_changes LIKE '%\nadmin:\n- true\n- false%'").first
13
+ else
14
+ query.where("object_changes LIKE '%\nroles:\n- - %'").first
15
+ end
16
+ end
17
+ end
18
+
19
+ def roles
20
+ @roles ||= begin
21
+ rls = entry.changeset["roles"]&.last || []
22
+ rls << "admin" if entry.changeset["admin"]&.last
23
+ rls
24
+ end
25
+ end
26
+
27
+ def role_name
28
+ types = roles.index_with { |role| I18n.t(role, scope: "decidim.decidim_awesome.admin.admin_accountability.admin_roles", default: role) }
29
+ return types.values.join(", ") unless html
30
+
31
+ types.map { |role, type| "<span class=\"#{role_class(role)}\">#{type}</span>" }.join(" ").html_safe
32
+ end
33
+
34
+ def user
35
+ @user ||= entry&.item || Decidim::User.find_by(id: entry.changeset["id"]&.last)
36
+ end
37
+
38
+ private
39
+
40
+ def role_class(role)
41
+ case role
42
+ when "admin"
43
+ "text-alert"
44
+ when "user_manager"
45
+ "text-secondary"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class PrivateDataFinder
6
+ def query
7
+ Component.where(id: proposals.where.not(extra_fields: { private_body: nil }))
8
+ end
9
+
10
+ def proposals
11
+ Decidim::Proposals::Proposal.select(:decidim_component_id).joins(:extra_fields)
12
+ end
13
+
14
+ def for(resources)
15
+ Component.where(id: proposals).where(id: resources)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Proposals
6
+ # Adds one custom field per column in export if custom fields are activted
7
+ # Adds vote weights
8
+ module ProposalSerializerMethods
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include ::Decidim::DecidimAwesome::NeedsAwesomeConfig
13
+
14
+ # Override the NeedsAwesomeConfig's awesome_config_instance,
15
+ # to take context from proposal instead of controller's request.
16
+ def awesome_config_instance
17
+ return @custom_config if @custom_config
18
+
19
+ @custom_config = Config.new(proposal.organization)
20
+ @custom_config.context_from_component(proposal.component)
21
+ @custom_config
22
+ end
23
+
24
+ def serialize_custom_fields
25
+ payload = {}
26
+ custom_fields = CustomFields.new(awesome_proposal_custom_fields)
27
+ if custom_fields.present?
28
+ @proposal.body.each do |locale, body|
29
+ if body.is_a?(Hash)
30
+ body.each do |translation_locale, value|
31
+ fields_entries(custom_fields, value) do |field_key, field_value|
32
+ payload["body/#{field_key}/#{translation_locale}".to_sym] = field_value if payload["body/#{field_key}/#{translation_locale}".to_sym].blank?
33
+ end
34
+ end
35
+ else
36
+ fields_entries(custom_fields, body) do |key, value|
37
+ payload["body/#{key}/#{locale}".to_sym] = value
38
+ end
39
+ end
40
+ end
41
+ end
42
+ payload
43
+ end
44
+
45
+ def serialize_private_custom_fields
46
+ payload = {}
47
+ private_custom_fields = CustomFields.new(awesome_proposal_private_custom_fields)
48
+ if private_custom_fields.present?
49
+ fields_entries(private_custom_fields, proposal.private_body) do |key, value|
50
+ value = value.first if value.is_a? Array
51
+ payload["private_body/#{key}".to_sym] = value
52
+ end
53
+ end
54
+ payload
55
+ end
56
+
57
+ # Iterate on custom fields that has a label and name
58
+ # (will ignore paragraphs and title)
59
+ def fields_entries(custom_fields, body)
60
+ custom_fields.apply_xml(body)
61
+ custom_fields.fields.each do |field|
62
+ next unless field["label"].present? && field.has_key?("name")
63
+
64
+ value = field["userData"].is_a?(Array) ? field["userData"].first : field["userData"]
65
+ yield field["label"].parameterize, value
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Proposals
6
+ # Adds one custom field per column in export if custom fields are activted
7
+ # Adds vote weights
8
+ module ProposalSerializerOverride
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include ProposalSerializerMethods
13
+
14
+ alias_method :decidim_original_serialize, :serialize
15
+
16
+ def serialize
17
+ # serialize first the custom fields,
18
+ # as default serialization will strip proposal body's <xml> tags.
19
+ serialization = decidim_original_serialize
20
+ serialization.merge!(proposal_vote_weights)
21
+ serialization.merge!(serialize_custom_fields)
22
+ end
23
+
24
+ protected
25
+
26
+ def proposal_vote_weights
27
+ payload = {}
28
+ if proposal.respond_to?(:vote_weights)
29
+ proposal.update_vote_weights!
30
+ payload[:votes] = proposal.reload.vote_weights
31
+ end
32
+ payload
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ # This class serializes a AdminAccountability so can be exported to CSV, JSON or other
6
+ # formats.
7
+ class PaperTrailVersionSerializer < Decidim::Exporters::Serializer
8
+ include Decidim::ApplicationHelper
9
+ include Decidim::ResourceHelper
10
+ include Decidim::TranslationsHelper
11
+
12
+ # Public: Initializes the serializer with a admin actions.
13
+ def initialize(log_entry)
14
+ @entry = log_entry.present(html: false)
15
+ end
16
+
17
+ # Public: Exports a hash with the serialized data for this admin action.
18
+ def serialize
19
+ {
20
+ role: entry.role_name,
21
+ user_name: entry.user_name,
22
+ user_email: entry.user_email,
23
+ user_role_type: entry.entry.item_type,
24
+ participatory_space_type: entry.participatory_space_type,
25
+ participatory_space_title: translated_attribute(entry.participatory_space&.title),
26
+ last_sign_in_at: entry.last_sign_in_date,
27
+ role_created_at: entry.created_date,
28
+ role_removed_at: entry.removal_date
29
+ }
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :entry
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Proposals
6
+ ##
7
+ # Custom serializer for Proposals with private data.
8
+ # Used to separate open-data export and admin export.
9
+ class PrivateProposalSerializer < ::Decidim::Proposals::ProposalSerializer
10
+ include ProposalSerializerMethods
11
+
12
+ def serialize
13
+ serialization = super.merge!(serialize_private_custom_fields)
14
+ serialization.merge!(serialize_private_notes)
15
+ end
16
+
17
+ def serialize_private_notes
18
+ payload = {}
19
+ notes = proposal.notes
20
+ return payload unless notes.any?
21
+
22
+ notes.each do |note|
23
+ payload["notes/#{note.id}".to_sym] = {
24
+ created_at: note.created_at,
25
+ note: note.body,
26
+ author: author_name(note.author)
27
+ }
28
+ end
29
+ payload
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AddProposalTypeCustomFields
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ include ::Decidim::DecidimAwesome::NeedsAwesomeConfig
10
+
11
+ field :body_fields, TranslatedCustomFieldsType, "Custom fields for this proposal", null: true
12
+
13
+ def body_fields
14
+ return if custom_fields.empty?
15
+
16
+ @body_fields ||= object.body.transform_values do |body|
17
+ sanitize_translated_fields(body)
18
+ end
19
+ end
20
+
21
+ # Override the NeedsAwesomeConfig's awesome_config_instance,
22
+ # to take context from proposal instead of controller's request.
23
+ def awesome_config_instance
24
+ return @custom_config if @custom_config
25
+
26
+ @custom_config = Config.new(object.organization)
27
+ @custom_config.context_from_component(object.component)
28
+ @custom_config
29
+ end
30
+
31
+ private
32
+
33
+ def custom_fields
34
+ @custom_fields ||= CustomFields.new(awesome_proposal_custom_fields)
35
+ end
36
+
37
+ def fields_for_xml(body)
38
+ custom_fields.apply_xml(body)
39
+ custom_fields.fields.filter_map do |field|
40
+ next unless field["label"].present? && field.has_key?("name")
41
+
42
+ field["userData"] = field["userData"].first if field["userData"].is_a?(Array)
43
+ field.dup
44
+ end
45
+ end
46
+
47
+ def sanitize_translated_fields(body)
48
+ if body.is_a?(Hash)
49
+ body.transform_values do |value|
50
+ fields_for_xml(value)
51
+ end
52
+ else
53
+ fields_for_xml(body)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AddProposalTypeVoteWeights
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ field :vote_weights, GraphQL::Types::JSON, description: "The corresponding weights count to the proposal votes", null: true
10
+
11
+ def vote_weights
12
+ current_component = object.component
13
+ return unless current_component.current_settings.respond_to?(:votes_hidden?)
14
+
15
+ object.vote_weights unless current_component.current_settings.votes_hidden?
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end