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
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class CreateCustomRedirect < Rectify::Command
6
+ class CreateCustomRedirect < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  def initialize(form)
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class CreateMenuHack < Rectify::Command
6
+ class CreateMenuHack < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  def initialize(form, menu_name)
@@ -3,14 +3,15 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class CreateProposalCustomField < Rectify::Command
6
+ class CreateProposalCustomField < Command
7
7
  include NeedsConstraintHelpers
8
8
 
9
9
  # Public: Initializes the command.
10
10
  #
11
- def initialize(organization)
11
+ def initialize(organization, config_var = :proposal_custom_fields)
12
12
  @organization = organization
13
13
  @ident = rand(36**8).to_s(36)
14
+ @config_var = config_var
14
15
  end
15
16
 
16
17
  # Executes the command. Broadcasts these events:
@@ -20,13 +21,13 @@ module Decidim
20
21
  #
21
22
  # Returns nothing.
22
23
  def call
23
- fields = AwesomeConfig.find_or_initialize_by(var: :proposal_custom_fields, organization: @organization)
24
+ fields = AwesomeConfig.find_or_initialize_by(var: @config_var, organization: @organization)
24
25
  fields.value = {} unless fields.value.is_a? Hash
25
26
  # TODO: prevent (unlikely) colisions with exisiting values
26
27
  fields.value[@ident] = default_definition
27
28
  fields.save!
28
29
 
29
- create_constraint_never(:proposal_custom_field)
30
+ create_constraint_never(@config_var == :proposal_custom_fields ? :proposal_custom_field : :proposal_private_custom_field)
30
31
 
31
32
  broadcast(:ok, @ident)
32
33
  rescue StandardError => e
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class CreateScopedAdmin < Rectify::Command
6
+ class CreateScopedAdmin < Command
7
7
  include NeedsConstraintHelpers
8
8
 
9
9
  # Public: Initializes the command.
@@ -3,12 +3,13 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class CreateScopedStyle < Rectify::Command
6
+ class CreateScopedStyle < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
- def initialize(organization)
9
+ def initialize(organization, config_var = :scoped_styles)
10
10
  @organization = organization
11
11
  @ident = rand(36**8).to_s(36)
12
+ @config_var = config_var
12
13
  end
13
14
 
14
15
  # Executes the command. Broadcasts these events:
@@ -18,7 +19,7 @@ module Decidim
18
19
  #
19
20
  # Returns nothing.
20
21
  def call
21
- styles = AwesomeConfig.find_or_initialize_by(var: :scoped_styles, organization: @organization)
22
+ styles = AwesomeConfig.find_or_initialize_by(var: @config_var, organization: @organization)
22
23
  styles.value = {} unless styles.value.is_a? Hash
23
24
  # TODO: prevent (unlikely) colisions with exisiting values
24
25
  styles.value[@ident] = ""
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class DestroyConstraint < Rectify::Command
6
+ class DestroyConstraint < Command
7
7
  include NeedsConstraintHelpers
8
8
 
9
9
  # Public: Initializes the command.
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class DestroyCustomRedirect < Rectify::Command
6
+ class DestroyCustomRedirect < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # item - the redirections item to destroy
@@ -11,7 +11,7 @@ module Decidim
11
11
  def initialize(item, organization)
12
12
  @item = item
13
13
  @organization = organization
14
- @redirections = AwesomeConfig.find_by(var: :custom_redirects, organization: organization)
14
+ @redirections = AwesomeConfig.find_by(var: :custom_redirects, organization:)
15
15
  end
16
16
 
17
17
  # Executes the command. Broadcasts these events:
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class DestroyMenuHack < Rectify::Command
6
+ class DestroyMenuHack < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # item - the menu item to destroy
@@ -11,7 +11,7 @@ module Decidim
11
11
  def initialize(item, menu_name, organization)
12
12
  @item = item
13
13
  @organization = organization
14
- @menu = AwesomeConfig.find_by(var: menu_name, organization: organization)
14
+ @menu = AwesomeConfig.find_by(var: menu_name, organization:)
15
15
  end
16
16
 
17
17
  # Executes the command. Broadcasts these events:
@@ -3,14 +3,15 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class DestroyProposalCustomField < Rectify::Command
6
+ class DestroyProposalCustomField < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # key - the key to destroy inise proposal_custom_fields
10
10
  # organization
11
- def initialize(key, organization)
11
+ def initialize(key, organization, config_var = :proposal_custom_fields)
12
12
  @key = key
13
13
  @organization = organization
14
+ @config_var = config_var
14
15
  end
15
16
 
16
17
  # Executes the command. Broadcasts these events:
@@ -20,14 +21,16 @@ module Decidim
20
21
  #
21
22
  # Returns nothing.
22
23
  def call
23
- fields = AwesomeConfig.find_by(var: :proposal_custom_fields, organization: @organization)
24
+ fields = AwesomeConfig.find_by(var: @config_var, organization: @organization)
24
25
  return broadcast(:invalid, "Not a hash") unless fields&.value.is_a? Hash
25
26
  return broadcast(:invalid, "#{key} key invalid") unless fields.value.has_key?(@key)
26
27
 
27
28
  fields.value.except!(@key)
28
29
  fields.save!
30
+
29
31
  # remove constrains associated (a new config var is generated automatically, by removing it, it will trigger destroy on dependents)
30
- constraint = AwesomeConfig.find_by(var: "proposal_custom_field_#{@key}", organization: @organization)
32
+ constraint = @config_var == :proposal_custom_fields ? :proposal_custom_field : :proposal_private_custom_field
33
+ constraint = AwesomeConfig.find_by(var: "#{constraint}_#{@key}", organization: @organization)
31
34
  constraint.destroy! if constraint.present?
32
35
 
33
36
  broadcast(:ok, @key)
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class DestroyScopedAdmin < Rectify::Command
6
+ class DestroyScopedAdmin < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # key - the key to destroy inside scoped_admins
@@ -3,14 +3,15 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class DestroyScopedStyle < Rectify::Command
6
+ class DestroyScopedStyle < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
- # key - the key to destroy inside scoped_styles
9
+ # key - the key to destroy inside scoped_styles/scoped_admin_styles
10
10
  # organization
11
- def initialize(key, organization)
11
+ def initialize(key, organization, config_var = :scoped_styles)
12
12
  @key = key
13
13
  @organization = organization
14
+ @config_var = config_var
14
15
  end
15
16
 
16
17
  # Executes the command. Broadcasts these events:
@@ -20,14 +21,15 @@ module Decidim
20
21
  #
21
22
  # Returns nothing.
22
23
  def call
23
- styles = AwesomeConfig.find_by(var: :scoped_styles, organization: @organization)
24
+ styles = AwesomeConfig.find_by(var: @config_var, organization: @organization)
24
25
  return broadcast(:invalid, "Not a hash") unless styles&.value.is_a? Hash
25
26
  return broadcast(:invalid, "#{key} key invalid") unless styles.value.has_key?(@key)
26
27
 
27
28
  styles.value.except!(@key)
28
29
  styles.save!
29
30
  # remove constrains associated (a new config var is generated automatically, by removing it, it will trigger destroy on dependents)
30
- constraint = AwesomeConfig.find_by(var: "scoped_style_#{@key}", organization: @organization)
31
+ constraint = @config_var == :scoped_styles ? :scoped_style : :scoped_admin_style
32
+ constraint = AwesomeConfig.find_by(var: "#{constraint}_#{@key}", organization: @organization)
31
33
  constraint.destroy! if constraint.present?
32
34
 
33
35
  broadcast(:ok, @key)
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class RenameScopeLabel < Rectify::Command
6
+ class RenameScopeLabel < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # params - A constraint params
@@ -34,7 +34,7 @@ module Decidim
34
34
  end
35
35
  end
36
36
 
37
- broadcast(:ok, { scope: scope, key: @text })
37
+ broadcast(:ok, { scope:, key: @text })
38
38
  rescue StandardError => e
39
39
  broadcast(:invalid, e.message)
40
40
  end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class UpdateConfig < Rectify::Command
6
+ class UpdateConfig < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A config form
@@ -27,10 +27,9 @@ module Decidim
27
27
  begin
28
28
  form.attributes.each do |key, val|
29
29
  # ignore nil attributes (must specifically be set to false if necessary)
30
- next unless form.valid_keys.include?(key)
30
+ next unless form.valid_keys.include?(key.to_sym)
31
31
 
32
32
  setting = AwesomeConfig.find_or_initialize_by(var: key, organization: form.current_organization)
33
-
34
33
  setting.value = val.respond_to?(:attributes) ? val.attributes : val
35
34
  setting.save!
36
35
  end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class UpdateConstraint < Rectify::Command
6
+ class UpdateConstraint < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # form - A constraint form
@@ -18,7 +18,7 @@ module Decidim
18
18
  #
19
19
  # Returns nothing.
20
20
  def call
21
- return broadcast(:invalid) if form.invalid?
21
+ return broadcast(:invalid, form.errors.full_messages.join(". ")) if form.invalid?
22
22
  return broadcast(:invalid) if attributes.blank?
23
23
 
24
24
  begin
@@ -36,7 +36,7 @@ module Decidim
36
36
  attr_reader :form
37
37
 
38
38
  def attributes
39
- form.attributes.filter { |_i, v| v.present? }
39
+ form.attributes.filter { |key, val| key != "id" && val.present? }
40
40
  end
41
41
  end
42
42
  end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class UpdateCustomRedirect < Rectify::Command
6
+ class UpdateCustomRedirect < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  def initialize(form, item)
@@ -38,8 +38,8 @@ module Decidim
38
38
  delegate :to_params, to: :form
39
39
 
40
40
  def url_exists?
41
- return unless redirects
42
- return unless redirects.value.is_a? Hash
41
+ return false unless redirects
42
+ return false unless redirects.value.is_a? Hash
43
43
 
44
44
  redirects.value[item.origin].present?
45
45
  end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  module Admin
6
- class UpdateMenuHack < Rectify::Command
6
+ class UpdateMenuHack < Command
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  def initialize(form, menu_name)
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class Command < ::Decidim::Command
6
+ end
7
+ end
8
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  module DecidimAwesome
5
- class CreateEditorImage < Rectify::Command
5
+ class CreateEditorImage < Decidim::Command
6
6
  # Creates a blueprint.
7
7
  #
8
8
  # form - The form with the data.
@@ -13,7 +13,7 @@ module Decidim
13
13
  # Executes the command. Broadcasts these events:
14
14
  #
15
15
  # - :ok when everything is valid
16
- # - :invalid if the form wasn't valid and we couldn't proceed.
16
+ # - :invalid if the form wasn't valid, and we couldn't proceed.
17
17
  #
18
18
  # Returns nothing.
19
19
  def call
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Admin
6
+ module MaintenanceContext
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ layout "decidim/decidim_awesome/admin/maintenance"
11
+ helper_method :current_view, :available_views, :present_private_data
12
+
13
+ private
14
+
15
+ def present_private_data(model)
16
+ PrivateDataPresenter.new(model)
17
+ end
18
+
19
+ def current_view
20
+ return params[:id] if available_views.include?(params[:id])
21
+
22
+ available_views.keys.first
23
+ end
24
+
25
+ def available_views
26
+ {
27
+ "private_data" => {
28
+ title: I18n.t("private_data", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
29
+ icon: "spy-line",
30
+ path: decidim_admin_decidim_awesome.maintenance_path("private_data")
31
+ },
32
+ "checks" => {
33
+ title: I18n.t("checks", scope: "decidim.decidim_awesome.admin.menu.maintenance"),
34
+ icon: "pulse",
35
+ path: decidim_admin_decidim_awesome.checks_maintenance_index_path
36
+ }
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module DecidimAwesome
7
+ module AdminAccountability
8
+ module Admin
9
+ module Filterable
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ include Decidim::Admin::Filterable
14
+
15
+ helper Decidim::DecidimAwesome::AdminAccountability::Admin::FilterableHelper
16
+
17
+ private
18
+
19
+ def base_query
20
+ collection
21
+ end
22
+
23
+ def filters
24
+ [:role_type_eq, :participatory_space_type_eq]
25
+ end
26
+
27
+ def filters_with_values
28
+ return { admin_role_type: [] } if global?
29
+
30
+ { role_type_eq: role_types, participatory_space_type_eq: participatory_space_types }
31
+ end
32
+
33
+ def dynamically_translated_filters
34
+ [:role_type_eq, :participatory_space_type_eq]
35
+ end
36
+
37
+ def extra_allowed_params
38
+ [:per_page, :admins, :admin_role_type]
39
+ end
40
+
41
+ def translated_role_type_eq(role)
42
+ I18n.t(role, scope: "decidim.decidim_awesome.admin.admin_accountability.roles")
43
+ end
44
+
45
+ def translated_participatory_space_type_eq(item_type)
46
+ item_type.gsub("UserRole", "").safe_constantize&.model_name&.human&.pluralize || item_type
47
+ end
48
+
49
+ def search_field_predicate
50
+ :user_name_or_user_email_cont
51
+ end
52
+
53
+ def participatory_space_types
54
+ @participatory_space_types ||= collection.pluck(:item_type).uniq.sort
55
+ end
56
+
57
+ def role_types
58
+ @role_types ||= PaperTrailVersion.safe_user_roles.map do |role_class|
59
+ role_class.safe_constantize.select(:role).distinct.pluck(:role)
60
+ end.union.flatten.sort
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AdminAccountability
6
+ module Admin
7
+ module FilterableHelper
8
+ def extra_dropdown_submenu_options_items(_filter, _i18n_scope)
9
+ Decidim.user_roles.sort.map do |role_type|
10
+ link_to(I18n.t(role_type, scope: "decidim.decidim_awesome.admin.admin_accountability.admin_roles"),
11
+ url_for(export_params.merge({ admin_role_type: role_type })))
12
+ end
13
+ end
14
+
15
+ def applied_filters_tags(i18n_ctx)
16
+ admin_role_type = PaperTrailVersion.safe_admin_role_type(params[:admin_role_type])
17
+ if global? && admin_role_type.present?
18
+ content_tag(:span, class: "label secondary") do
19
+ concat "#{i18n_filter_label(:admin_role_type, filterable_i18n_scope_from_ctx(i18n_ctx))}: "
20
+ concat t("decidim.decidim_awesome.admin.admin_accountability.admin_roles.#{admin_role_type}", default: admin_role_type)
21
+ concat icon_link_to(
22
+ "close-circle-line",
23
+ url_for(export_params.except(:admin_role_type)),
24
+ t("decidim.admin.actions.cancel"),
25
+ class: "action-icon--remove"
26
+ )
27
+ end
28
+ else
29
+ ransack_params.slice(*filters).map do |filter, value|
30
+ applied_filter_tag(filter, value, filterable_i18n_scope_from_ctx(i18n_ctx))
31
+ end.join.html_safe
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module CheckLoginAuthorizations
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ include ::Decidim::DecidimAwesome::NeedsAwesomeConfig
10
+ before_action :check_required_login_authorizations
11
+ end
12
+
13
+ private
14
+
15
+ def check_required_login_authorizations
16
+ return unless user_signed_in?
17
+ return unless current_user.confirmed?
18
+ return if current_user.blocked?
19
+ return if allowed_controllers.include?(controller_name)
20
+
21
+ unless user_is_authorized?
22
+ flash[:alert] = I18n.t("decidim.decidim_awesome.session.authorization_is_required",
23
+ authorizations: required_authorizations.map(&:fullname).join(", "))
24
+ redirect_to decidim_decidim_awesome.required_authorizations_path(redirect_url: request.fullpath)
25
+ end
26
+ end
27
+
28
+ def user_is_authorized?
29
+ return true if required_authorizations.blank?
30
+
31
+ @user_is_authorized ||= if awesome_config[:force_authorization_with_any_method]
32
+ current_authorizations.any?
33
+ else
34
+ current_authorizations.count == required_authorizations.count
35
+ end
36
+ end
37
+
38
+ def required_authorizations
39
+ return unless awesome_config[:force_authorization_after_login].is_a?(Array)
40
+
41
+ @required_authorizations ||= Decidim::Verifications::Adapter.from_collection(
42
+ awesome_config[:force_authorization_after_login] & current_organization.available_authorizations & Decidim.authorization_workflows.map(&:name)
43
+ )
44
+ end
45
+
46
+ def current_authorizations
47
+ @current_authorizations ||= Decidim::Verifications::Authorizations.new(
48
+ organization: current_organization,
49
+ user: current_user,
50
+ name: required_authorizations.map(&:name),
51
+ granted: true
52
+ )
53
+ end
54
+
55
+ def allowed_controllers
56
+ %w(required_authorizations authorizations upload_validations timeouts editor_images locales pages tos) + awesome_config[:force_authorization_allowed_controller_names].to_a
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContentSecurityPolicy
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ after_action :append_awesome_csp_directives
10
+ end
11
+
12
+ private
13
+
14
+ def append_awesome_csp_directives
15
+ # this is necessary for custom fields
16
+ content_security_policy.append_csp_directive("font-src", "data:") if DecidimAwesome.enabled?(:proposal_custom_fields)
17
+ append_awesome_intergram_directives
18
+ end
19
+
20
+ def append_awesome_intergram_directives
21
+ return unless DecidimAwesome.enabled?(:intergram_for_admins) || DecidimAwesome.enabled?(:intergram_for_public)
22
+
23
+ intergram = URI.parse(DecidimAwesome.intergram_url)
24
+ if intergram.host && intergram.scheme
25
+ content_security_policy.append_csp_directive("script-src", "#{intergram.scheme}://#{intergram.host}")
26
+ content_security_policy.append_csp_directive("frame-src", "#{intergram.scheme}://#{intergram.host}")
27
+ # this script is in the intergram code, but does not look necessary to work
28
+ # content_security_policy.append_csp_directive("frame-src", "http://www.loadmill.com")
29
+ # content_security_policy.append_csp_directive("frame-src", "http://app.loadmill.com")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module LimitPendingAmendments
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ # rubocop:disable Rails/LexicallyScopedActionFilter
10
+ before_action :limit_pending_amendments, only: [:new, :create]
11
+ # rubocop:enable Rails/LexicallyScopedActionFilter
12
+
13
+ private
14
+
15
+ def limit_pending_amendments
16
+ return unless amendable&.amendments && amendable&.component&.settings.try(:limit_pending_amendments)
17
+ return unless amendable.component.settings.try(:amendments_enabled)
18
+ return unless amendable.component.current_settings.try(:amendment_creation_enabled)
19
+
20
+ return unless existing_emendations.any?
21
+
22
+ flash[:alert] = t("pending_limit_reached", scope: "decidim.decidim_awesome.amendments", emendation: translated_attribute(existing_emendations.first.title))
23
+ redirect_back(fallback_location: Decidim::ResourceLocatorPresenter.new(amendable).path)
24
+ end
25
+
26
+ def existing_emendations
27
+ @existing_emendations ||= begin
28
+ existing = amendable.amendments.where(state: :evaluating)
29
+ existing.filter_map { |amendment| !amendment.emendation&.hidden? && amendment.emendation }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "decidim/decidim_awesome/awesome_helpers"
4
-
5
3
  module Decidim
6
4
  module DecidimAwesome
7
5
  module NeedsAwesomeConfig
@@ -43,14 +43,14 @@ module Decidim
43
43
  return unless redirects.is_a? Hash
44
44
 
45
45
  path, query = fullpath.split("?")
46
- destination = redirects.dig(path.downcase, "destination")
47
- pass_query = redirects.dig(path.downcase, "pass_query")
46
+ destination = redirects.dig(path, "destination")
47
+ pass_query = redirects.dig(path, "pass_query")
48
48
  if pass_query.present?
49
49
  union = destination.include?("?") ? "&" : "?"
50
50
  destination = "#{destination}#{union}#{query}"
51
51
  end
52
52
 
53
- return destination.strip if destination.present?
53
+ destination.strip if destination.present?
54
54
  end
55
55
  end
56
56
  end