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
@@ -8,8 +8,6 @@ module Decidim
8
8
  include NeedsAwesomeConfig
9
9
  include ConfigConstraintsHelpers
10
10
 
11
- layout "decidim/admin/decidim_awesome"
12
-
13
11
  before_action do
14
12
  enforce_permission_to :edit_config, :menu
15
13
  end
@@ -23,6 +21,10 @@ module Decidim
23
21
  @form = form(CustomRedirectForm).instance
24
22
  end
25
23
 
24
+ def edit
25
+ @form = form(CustomRedirectForm).from_model(redirect_item)
26
+ end
27
+
26
28
  def create
27
29
  @form = form(CustomRedirectForm).from_params(params)
28
30
  CreateCustomRedirect.call(@form) do
@@ -38,10 +40,6 @@ module Decidim
38
40
  end
39
41
  end
40
42
 
41
- def edit
42
- @form = form(CustomRedirectForm).from_model(redirect_item)
43
- end
44
-
45
43
  def update
46
44
  @form = form(CustomRedirectForm).from_params(params)
47
45
  UpdateCustomRedirect.call(@form, redirect_item) do
@@ -63,7 +61,7 @@ module Decidim
63
61
  flash[:notice] = I18n.t("custom_redirects.destroy.success", scope: "decidim.decidim_awesome.admin")
64
62
  end
65
63
  on(:invalid) do |error|
66
- flash[:alert] = I18n.t("custom_redirects.destroy.error", scope: "decidim.decidim_awesome.admin", error: error)
64
+ flash[:alert] = I18n.t("custom_redirects.destroy.error", scope: "decidim.decidim_awesome.admin", error:)
67
65
  end
68
66
  end
69
67
  redirect_to decidim_admin_decidim_awesome.custom_redirects_path
@@ -76,7 +74,7 @@ module Decidim
76
74
  raise ActiveRecord::RecordNotFound unless item
77
75
 
78
76
  OpenStruct.new(
79
- origin: origin,
77
+ origin:,
80
78
  destination: item["destination"],
81
79
  active: item["active"]
82
80
  )
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/decidim_awesome/version"
4
+
5
+ module Decidim
6
+ module DecidimAwesome
7
+ module Admin
8
+ # System compatibility analyzer
9
+ class MaintenanceController < DecidimAwesome::Admin::ApplicationController
10
+ include NeedsAwesomeConfig
11
+ include MaintenanceContext
12
+ include Decidim::Admin::Filterable
13
+ include ActionView::Helpers::DateHelper
14
+
15
+ helper ConfigConstraintsHelpers
16
+ helper_method :collection, :resource, :present, :time_ago
17
+
18
+ before_action do
19
+ enforce_permission_to :edit_config, :private_data, private_data:
20
+ end
21
+
22
+ def show
23
+ respond_to do |format|
24
+ format.json do
25
+ render json: private_data_finder.for(params[:resources].to_s.split(",")).map { |resource| present(resource) }
26
+ end
27
+ format.all do
28
+ render :show
29
+ end
30
+ end
31
+ end
32
+
33
+ def destroy_private_data
34
+ if private_data && private_data.total.to_i.positive?
35
+ Decidim::ActionLogger.log("destroy_private_data", current_user, resource, nil, count: private_data.total)
36
+
37
+ Lock.new(current_organization).get!(resource)
38
+ DestroyPrivateDataJob.set(wait: 1.second).perform_later(resource)
39
+ end
40
+ redirect_to decidim_admin_decidim_awesome.maintenance_path("private_data"),
41
+ notice: I18n.t("destroying_private_data", scope: "decidim.decidim_awesome.admin.maintenance.private_data", title: present_private_data(resource).name)
42
+ end
43
+
44
+ private
45
+
46
+ def resource
47
+ @resource ||= Component.find_by(id: params[:resource_id])
48
+ end
49
+
50
+ def private_data
51
+ @private_data ||= present_private_data(resource) if resource
52
+ end
53
+
54
+ def collection
55
+ filtered_collection
56
+ end
57
+
58
+ def base_query
59
+ private_data_finder.query
60
+ end
61
+
62
+ def present(resource)
63
+ present_private_data(resource)
64
+ end
65
+
66
+ def private_data_finder
67
+ @private_data_finder ||= PrivateDataFinder.new
68
+ end
69
+
70
+ def time_ago
71
+ @time_ago ||= time_ago_in_words(Time.current - Decidim::DecidimAwesome.private_data_expiration_time)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -8,8 +8,6 @@ module Decidim
8
8
  include NeedsAwesomeConfig
9
9
  include ConfigConstraintsHelpers
10
10
 
11
- layout "decidim/admin/decidim_awesome"
12
-
13
11
  helper ConfigConstraintsHelpers
14
12
  helper_method :current_items, :visibility_options, :target_options
15
13
 
@@ -23,6 +21,10 @@ module Decidim
23
21
  @form = form(MenuForm).instance
24
22
  end
25
23
 
24
+ def edit
25
+ @form = form(MenuForm).from_model(menu_item)
26
+ end
27
+
26
28
  def create
27
29
  @form = form(MenuForm).from_params(params)
28
30
  CreateMenuHack.call(@form, current_menu_name) do
@@ -38,10 +40,6 @@ module Decidim
38
40
  end
39
41
  end
40
42
 
41
- def edit
42
- @form = form(MenuForm).from_model(menu_item)
43
- end
44
-
45
43
  def update
46
44
  @form = form(MenuForm).from_params(params)
47
45
  UpdateMenuHack.call(@form, current_menu_name) do
@@ -63,7 +61,7 @@ module Decidim
63
61
  flash[:notice] = I18n.t("menu_hacks.destroy.success", scope: "decidim.decidim_awesome.admin")
64
62
  end
65
63
  on(:invalid) do |error|
66
- flash[:alert] = I18n.t("menu_hacks.destroy.error", scope: "decidim.decidim_awesome.admin", error: error)
64
+ flash[:alert] = I18n.t("menu_hacks.destroy.error", scope: "decidim.decidim_awesome.admin", error:)
67
65
  end
68
66
  end
69
67
  redirect_to decidim_admin_decidim_awesome.menu_hacks_path
@@ -94,7 +92,7 @@ module Decidim
94
92
  end
95
93
 
96
94
  def current_menu_name
97
- :menu
95
+ params[:menu_id].to_sym
98
96
  end
99
97
 
100
98
  def visibility_options
@@ -6,9 +6,9 @@ module Decidim
6
6
  # Global configuration controller
7
7
  class ProposalCustomFieldsController < DecidimAwesome::Admin::ConfigController
8
8
  def create
9
- CreateProposalCustomField.call(current_organization) do
9
+ CreateProposalCustomField.call(current_organization, config_var) do
10
10
  on(:ok) do |key|
11
- flash[:notice] = I18n.t("config.create_proposal_custom_field.success", key: key, scope: "decidim.decidim_awesome.admin")
11
+ flash[:notice] = I18n.t("config.create_proposal_custom_field.success", key:, scope: "decidim.decidim_awesome.admin")
12
12
  end
13
13
 
14
14
  on(:invalid) do |message|
@@ -16,13 +16,13 @@ module Decidim
16
16
  end
17
17
  end
18
18
 
19
- redirect_to decidim_admin_decidim_awesome.config_path(:proposal_custom_fields)
19
+ redirect_to decidim_admin_decidim_awesome.config_path(config_var)
20
20
  end
21
21
 
22
22
  def destroy
23
- DestroyProposalCustomField.call(params[:key], current_organization) do
23
+ DestroyProposalCustomField.call(params[:key], current_organization, config_var) do
24
24
  on(:ok) do |key|
25
- flash[:notice] = I18n.t("config.destroy_proposal_custom_field.success", key: key, scope: "decidim.decidim_awesome.admin")
25
+ flash[:notice] = I18n.t("config.destroy_proposal_custom_field.success", key:, scope: "decidim.decidim_awesome.admin")
26
26
  end
27
27
 
28
28
  on(:invalid) do |message|
@@ -30,7 +30,15 @@ module Decidim
30
30
  end
31
31
  end
32
32
 
33
- redirect_to decidim_admin_decidim_awesome.config_path(:proposal_custom_fields)
33
+ redirect_to decidim_admin_decidim_awesome.config_path(config_var)
34
+ end
35
+
36
+ private
37
+
38
+ def config_var
39
+ return :proposal_private_custom_fields if params[:private] == "true"
40
+
41
+ :proposal_custom_fields
34
42
  end
35
43
  end
36
44
  end
@@ -8,7 +8,7 @@ module Decidim
8
8
  def create
9
9
  CreateScopedAdmin.call(current_organization) do
10
10
  on(:ok) do |key|
11
- flash[:notice] = I18n.t("config.create_scoped_admin.success", key: key, scope: "decidim.decidim_awesome.admin")
11
+ flash[:notice] = I18n.t("config.create_scoped_admin.success", key:, scope: "decidim.decidim_awesome.admin")
12
12
  end
13
13
 
14
14
  on(:invalid) do |message|
@@ -22,7 +22,7 @@ module Decidim
22
22
  def destroy
23
23
  DestroyScopedAdmin.call(params[:key], current_organization) do
24
24
  on(:ok) do |key|
25
- flash[:notice] = I18n.t("config.destroy_scoped_admin.success", key: key, scope: "decidim.decidim_awesome.admin")
25
+ flash[:notice] = I18n.t("config.destroy_scoped_admin.success", key:, scope: "decidim.decidim_awesome.admin")
26
26
  end
27
27
 
28
28
  on(:invalid) do |message|
@@ -6,9 +6,9 @@ module Decidim
6
6
  # Global configuration controller
7
7
  class ScopedStylesController < DecidimAwesome::Admin::ConfigController
8
8
  def create
9
- CreateScopedStyle.call(current_organization) do
9
+ CreateScopedStyle.call(current_organization, config_var) do
10
10
  on(:ok) do |key|
11
- flash[:notice] = I18n.t("config.create_scoped_style.success", key: key, scope: "decidim.decidim_awesome.admin")
11
+ flash[:notice] = I18n.t("config.create_scoped_style.success", key:, scope: "decidim.decidim_awesome.admin")
12
12
  end
13
13
 
14
14
  on(:invalid) do |message|
@@ -16,13 +16,13 @@ module Decidim
16
16
  end
17
17
  end
18
18
 
19
- redirect_to decidim_admin_decidim_awesome.config_path(:styles)
19
+ redirect_to decidim_admin_decidim_awesome.config_path(config_var)
20
20
  end
21
21
 
22
22
  def destroy
23
- DestroyScopedStyle.call(params[:key], current_organization) do
23
+ DestroyScopedStyle.call(params[:key], current_organization, config_var) do
24
24
  on(:ok) do |key|
25
- flash[:notice] = I18n.t("config.destroy_scoped_style.success", key: key, scope: "decidim.decidim_awesome.admin")
25
+ flash[:notice] = I18n.t("config.destroy_scoped_style.success", key:, scope: "decidim.decidim_awesome.admin")
26
26
  end
27
27
 
28
28
  on(:invalid) do |message|
@@ -30,7 +30,15 @@ module Decidim
30
30
  end
31
31
  end
32
32
 
33
- redirect_to decidim_admin_decidim_awesome.config_path(:styles)
33
+ redirect_to decidim_admin_decidim_awesome.config_path(config_var)
34
+ end
35
+
36
+ private
37
+
38
+ def config_var
39
+ return :scoped_admin_styles if params[:admin_panel] == "true"
40
+
41
+ :scoped_styles
34
42
  end
35
43
  end
36
44
  end
@@ -6,13 +6,18 @@ module Decidim
6
6
  class BlankComponentController < Decidim::Components::BaseController
7
7
  # just redirects to settings
8
8
  def settings
9
- redirect_to EngineRouter.admin_proxy(component.participatory_space).edit_component_path(id: component)
9
+ redirect_to EngineRouter.admin_proxy(current_component.participatory_space).edit_component_path(id: current_component)
10
10
  end
11
11
 
12
12
  private
13
13
 
14
- def component
15
- Decidim::Component.find(params[:component_id])
14
+ def set_component_breadcrumb_item
15
+ context_breadcrumb_items << {
16
+ label: current_component.name,
17
+ url: EngineRouter.admin_proxy(current_component.participatory_space).edit_component_path(id: current_component),
18
+ active: false,
19
+ resource: current_component
20
+ }
16
21
  end
17
22
  end
18
23
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  module DecidimAwesome
5
- # This controller handles image uploads for the hacked Quill editor
5
+ # This controller handles image uploads for the Tiptap editor
6
6
  class EditorImagesController < DecidimAwesome::ApplicationController
7
7
  include FormFactory
8
8
  include NeedsAwesomeConfig
@@ -11,14 +11,14 @@ module Decidim
11
11
  rescue_from Decidim::ActionForbidden, with: :ajax_user_has_no_permission
12
12
 
13
13
  def create
14
- enforce_permission_to :create, :editor_image, awesome_config: awesome_config
14
+ enforce_permission_to(:create, :editor_image, awesome_config:)
15
15
 
16
16
  @form = form(EditorImageForm).from_params(form_values)
17
17
  CreateEditorImage.call(@form) do
18
18
  on(:ok) do |image|
19
19
  url = image.attached_uploader(:file).path
20
20
  url = "#{request.base_url}#{url}" unless url&.start_with?("http")
21
- render json: { url: url, message: I18n.t("decidim_awesome.editor_images.create.success", scope: "decidim") }
21
+ render json: { url:, message: I18n.t("decidim_awesome.editor_images.create.success", scope: "decidim") }
22
22
  end
23
23
 
24
24
  on(:invalid) do |_message|
@@ -32,8 +32,6 @@ module Decidim
32
32
  # Rescue ajax calls and print the update.js view which prints the info on the message ajax form
33
33
  # Only if the request is AJAX, otherwise behave as Decidim standards
34
34
  def ajax_user_has_no_permission
35
- return user_has_no_permission unless request.xhr?
36
-
37
35
  render json: { message: I18n.t("actions.unauthorized", scope: "decidim.core") }, status: :unprocessable_entity
38
36
  end
39
37
 
@@ -5,7 +5,8 @@ module Decidim
5
5
  module IframeComponent
6
6
  class IframeController < DecidimAwesome::BlankComponentController
7
7
  ALLOWED_ATTRIBUTES = %w(src width height frameborder title allow allowpaymentrequest name referrerpolicy sandbox srcdoc allowfullscreen).freeze
8
- helper_method :iframe, :remove_margins?, :viewport_width?
8
+ helper_method :iframe, :viewport_width?
9
+ before_action :add_additional_csp_directives, only: :show
9
10
 
10
11
  def show; end
11
12
 
@@ -17,16 +18,28 @@ module Decidim
17
18
 
18
19
  def sanitize(html)
19
20
  sanitizer = Rails::Html::SafeListSanitizer.new
20
- sanitizer.sanitize(html, tags: %w(iframe), attributes: ALLOWED_ATTRIBUTES)
21
- end
21
+ partially_sanitized_html = sanitizer.sanitize(html, tags: %w(iframe), attributes: ALLOWED_ATTRIBUTES)
22
+
23
+ document = Nokogiri::HTML::DocumentFragment.parse(partially_sanitized_html)
24
+ document.css("iframe").each do |iframe|
25
+ iframe["srcdoc"] = Loofah.fragment(iframe["srcdoc"]).scrub!(:prune).to_s if iframe["srcdoc"]
26
+ end
22
27
 
23
- def remove_margins?
24
- current_component.settings.no_margins
28
+ document.to_s
25
29
  end
26
30
 
27
31
  def viewport_width?
28
32
  current_component.settings.viewport_width
29
33
  end
34
+
35
+ def add_additional_csp_directives
36
+ iframe_urls = Nokogiri::HTML::DocumentFragment.parse(iframe).children.select { |x| x.name == "iframe" }.filter_map { |x| x.attribute("src")&.value }
37
+ return if iframe_urls.blank?
38
+
39
+ iframe_urls.each do |url|
40
+ content_security_policy.append_csp_directive("frame-src", url)
41
+ end
42
+ end
30
43
  end
31
44
  end
32
45
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ # This controller handles image uploads for the Tiptap editor
6
+ class RequiredAuthorizationsController < DecidimAwesome::ApplicationController
7
+ layout "layouts/decidim/authorizations"
8
+ helper_method :granted_authorizations, :pending_authorizations, :missing_authorizations, :redirect_url
9
+
10
+ before_action do
11
+ redirect_to redirect_url unless user_signed_in?
12
+ redirect_to redirect_url if user_is_authorized?
13
+ end
14
+
15
+ def redirect_url
16
+ @redirect_url ||= begin
17
+ path = params[:redirect_url] || request.referer
18
+ if path.blank? || path.include?(decidim_decidim_awesome.required_authorizations_path.split("?").first)
19
+ decidim.root_path
20
+ else
21
+ path
22
+ end
23
+ end
24
+ end
25
+
26
+ def index
27
+ enforce_permission_to :read, :required_authorizations, user_is_authorized: user_is_authorized?
28
+ end
29
+
30
+ private
31
+
32
+ def missing_authorizations
33
+ @missing_authorizations ||= required_authorizations.filter do |manifest|
34
+ Decidim::Verifications::Authorizations.new(
35
+ organization: current_organization,
36
+ user: current_user,
37
+ name: required_authorizations.map(&:name)
38
+ ).pluck(:name).exclude?(manifest.name)
39
+ end
40
+ end
41
+
42
+ def pending_authorizations
43
+ @pending_authorizations ||= required_authorizations.filter do |manifest|
44
+ Decidim::Verifications::Authorizations.new(
45
+ organization: current_organization,
46
+ user: current_user,
47
+ name: required_authorizations.map(&:name),
48
+ granted: false
49
+ ).pluck(:name).include?(manifest.name)
50
+ end
51
+ end
52
+
53
+ def granted_authorizations
54
+ @granted_authorizations ||= required_authorizations.filter { |manifest| current_authorizations.pluck(:name).include?(manifest.name) }
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AccountFormOverride
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ attribute :user_time_zone
10
+ validates :user_time_zone, time_zone: true, if: -> { user_time_zone.present? }
11
+
12
+ def user_time_zone
13
+ return nil if awesome_config[:user_timezone].blank?
14
+
15
+ super.presence || current_user.extended_data["time_zone"].presence || current_organization.time_zone
16
+ end
17
+
18
+ # Used for the user_time_zone setting, which does not have constraints
19
+ def awesome_config
20
+ @awesome_config ||= Decidim::DecidimAwesome::Config.new(current_organization)&.organization_config || {}
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Recreate validations to take into account custom fields and ignore the length limit in proposals
4
+ module Decidim
5
+ module DecidimAwesome
6
+ module Proposals
7
+ module ProposalFormCustomizations
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ clear_validators!
12
+
13
+ validates :title, presence: true, etiquette: true
14
+ validates :title, proposal_length: {
15
+ minimum: ->(form) { form.minimum_title_length },
16
+ maximum: 150
17
+ }
18
+
19
+ validates :body, presence: true, unless: ->(form) { form.override_validations? || form.minimum_body_length.zero? }
20
+ validates :body, etiquette: true, unless: ->(form) { form.override_validations? }
21
+ validates :body, proposal_length: {
22
+ minimum: ->(form) { form.minimum_body_length },
23
+ maximum: ->(form) { form.override_validations? ? 0 : form.component.settings.proposal_length }
24
+ }
25
+
26
+ validate :body_is_not_bare_template, unless: ->(form) { form.override_validations? }
27
+
28
+ def override_validations?
29
+ return false if context.current_component.settings.participatory_texts_enabled
30
+
31
+ custom_fields.present?
32
+ end
33
+
34
+ def minimum_title_length
35
+ awesome_config.config[:validate_title_min_length].to_i
36
+ end
37
+
38
+ def minimum_body_length
39
+ awesome_config.config[:validate_body_min_length].to_i
40
+ end
41
+
42
+ def custom_fields
43
+ @custom_fields ||= awesome_config.collect_sub_configs_values("proposal_custom_field")
44
+ end
45
+
46
+ def awesome_config
47
+ @awesome_config ||= begin
48
+ conf = Decidim::DecidimAwesome::Config.new(context.current_organization)
49
+ conf.context_from_component(context.current_component)
50
+ conf
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Proposals
6
+ module ProposalFormOverride
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ alias_method :decidim_original_map_model, :map_model
11
+ attribute :private_body, String
12
+
13
+ def map_model(model)
14
+ decidim_original_map_model(model)
15
+ self.private_body = model.private_body
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module System
6
+ module OrganizationFormOverride
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ alias_method :decidim_original_map_model, :map_model
11
+
12
+ attribute :awesome_admins_available_authorizations, [String]
13
+
14
+ def map_model(model)
15
+ decidim_original_map_model(model)
16
+ map_awesome_configs(model)
17
+ end
18
+
19
+ def clean_awesome_admins_available_authorizations
20
+ return unless awesome_admins_available_authorizations
21
+
22
+ awesome_admins_available_authorizations.compact_blank
23
+ end
24
+
25
+ private
26
+
27
+ def map_awesome_configs(organization)
28
+ self.awesome_admins_available_authorizations = Decidim::DecidimAwesome::AwesomeConfig.find_by(var: :admins_available_authorizations, organization:)&.value
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end