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
@@ -53,33 +53,41 @@ module Decidim
53
53
 
54
54
  # config processed for the organization config, without context
55
55
  def organization_config
56
- @organization_config ||= unfiltered_config.map do |key, value|
56
+ @organization_config ||= unfiltered_config.to_h do |key, value|
57
57
  value = defaults[key] unless enabled_for_organization? key
58
58
  [key, value]
59
- end.to_h
59
+ end
60
60
  end
61
61
 
62
62
  # config normalized according default values, without context, without organization config
63
63
  def unfiltered_config
64
- valid = @vars.map { |v| [v.var.to_sym, v.value] }.to_h
64
+ valid = @vars.to_h { |v| [v.var.to_sym, v.value] }
65
65
 
66
- map_defaults do |key|
67
- valid[key].presence
66
+ map_defaults do |key, val|
67
+ valid.has_key?(key) ? valid[key] : val
68
68
  end
69
69
  end
70
70
 
71
71
  def setting_for(var)
72
72
  @vars.find_or_initialize_by(
73
73
  organization: @organization,
74
- var: var
74
+ var:
75
75
  )
76
76
  end
77
77
 
78
- # Checks if some config option es enabled in a certain context
79
- def enabled_for?(setting)
78
+ # Checks if some config setting is enabled in a certain context
79
+ def enabled_in_context?(setting)
80
80
  config[setting]
81
81
  end
82
82
 
83
+ # returns true if some setting is constrained in the current context
84
+ # if no constraints defined, applies to everything
85
+ def constrained_in_context?(setting)
86
+ return true unless @vars.exists?(var: setting)
87
+
88
+ @vars.where(var: setting).any? { |v| valid_in_context?(v.all_constraints) }
89
+ end
90
+
83
91
  # checks if some constraint blocks the validity fot the current context
84
92
  def valid_in_context?(constraints)
85
93
  # if no constraints defined, applies to everything
@@ -135,31 +143,31 @@ module Decidim
135
143
  plural_key = singular_key.pluralize.to_sym
136
144
  return {} unless config[plural_key]
137
145
 
138
- @sub_configs[singular_key] = config[plural_key].map do |key, _value|
146
+ @sub_configs[singular_key] = config[plural_key].to_h do |key, _value|
139
147
  [key, AwesomeConfig.find_by(var: "#{singular_key}_#{key}", organization: @organization)]
140
- end.to_h
148
+ end
141
149
  end
142
150
 
143
151
  private
144
152
 
145
153
  def map_defaults
146
- defaults.map do |key, val|
154
+ defaults.to_h do |key, val|
147
155
  value = false
148
156
  unless val == :disabled
149
- value = yield(key) || val
150
- value = val.merge(value.transform_keys(&:to_sym)) if val.is_a? Hash
157
+ value = yield(key, val)
158
+ value = val.merge(value.transform_keys(&:to_sym)) if val.is_a?(Hash) && value.is_a?(Hash)
151
159
  end
152
160
  [key, value]
153
- end.to_h
161
+ end
154
162
  end
155
163
 
156
164
  def calculate_config
157
165
  # filter vars compliant with current context
158
166
  valid = @vars.filter { |item| enabled_for_organization?(item.var) && valid_in_context?(item.all_constraints) }
159
- .map { |v| [v.var.to_sym, v.value] }.to_h
167
+ .to_h { |v| [v.var.to_sym, v.value] }
160
168
 
161
- map_defaults do |key|
162
- valid[key].presence
169
+ map_defaults do |key, val|
170
+ valid.has_key?(key) ? valid[key] : val
163
171
  end
164
172
  end
165
173
 
@@ -14,9 +14,9 @@ module Decidim
14
14
 
15
15
  # In the frontend there's no a 100% correspondence between url and manifest name
16
16
  def participatory_spaces_routes
17
- spaces = Decidim.participatory_space_manifests \
18
- .filter { |space| !DecidimAwesome.config.participatory_spaces_routes_context.has_key?(space.name) } \
19
- .map { |space| [space.name.to_s, space.name.to_s] }.to_h
17
+ spaces = Decidim.participatory_space_manifests
18
+ .filter { |space| !DecidimAwesome.config.participatory_spaces_routes_context.has_key?(space.name) }
19
+ .to_h { |space| [space.name.to_s, space.name.to_s] }
20
20
  DecidimAwesome.config.participatory_spaces_routes_context.each do |manifest, routes|
21
21
  routes.each do |route|
22
22
  spaces[route.to_s] = manifest.to_s
@@ -13,6 +13,14 @@ module Decidim
13
13
 
14
14
  attr_reader :fields, :xml, :errors, :data
15
15
 
16
+ def empty?
17
+ @fields.empty?
18
+ end
19
+
20
+ def present?
21
+ !@fields.empty?
22
+ end
23
+
16
24
  def apply_xml(xml)
17
25
  parse_xml(xml)
18
26
  map_fields!
@@ -32,7 +40,7 @@ module Decidim
32
40
 
33
41
  def parse_xml(xml)
34
42
  @xml = xml
35
- @data = Nokogiri.XML(xml).xpath("//dl/dd")
43
+ @data = Nokogiri.XML(@xml).xpath("//dl/dd")
36
44
  return if @data.present?
37
45
 
38
46
  apply_to_first_textarea
@@ -54,7 +62,7 @@ module Decidim
54
62
  # Finds the first textarea and applies non-xml compatible content
55
63
  # when textarea has not wysiwyg assigned, strips html
56
64
  def apply_to_first_textarea
57
- # quill editor might leave html traces without any user content
65
+ # HTML editors might leave html traces without any user content
58
66
  # so we won't process it if there is no text (html free) result
59
67
  text = Nokogiri.HTML(xml).html? ? Nokogiri.HTML(xml).text.strip : text.strip
60
68
  return if text.blank?
@@ -79,12 +87,12 @@ module Decidim
79
87
  @fields
80
88
  end
81
89
 
82
- def deep_transform_values!(object, &block)
90
+ def deep_transform_values!(object, &)
83
91
  case object
84
92
  when Hash
85
- object.transform_values! { |value| deep_transform_values!(value, &block) }
93
+ object.transform_values! { |value| deep_transform_values!(value, &) }
86
94
  when Array
87
- object.map! { |e| deep_transform_values!(e, &block) }
95
+ object.map! { |e| deep_transform_values!(e, &) }
88
96
  else
89
97
  yield(object)
90
98
  end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails"
4
+ require "deface"
4
5
  require "decidim/core"
5
6
  require "decidim/decidim_awesome/awesome_helpers"
7
+ require "decidim/decidim_awesome/menu"
8
+ require "decidim/decidim_awesome/middleware/current_config"
6
9
 
7
10
  module Decidim
8
11
  module DecidimAwesome
@@ -13,6 +16,7 @@ module Decidim
13
16
  isolate_namespace Decidim::DecidimAwesome
14
17
 
15
18
  routes do
19
+ get :required_authorizations, to: "required_authorizations#index"
16
20
  post :editor_images, to: "editor_images#create"
17
21
  end
18
22
 
@@ -20,47 +24,274 @@ module Decidim
20
24
  # https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
21
25
  # overrides
22
26
  config.to_prepare do
23
- # activate Decidim LayoutHelper for the overriden views
24
- ActiveSupport.on_load :action_controller do
25
- helper Decidim::LayoutHelper if respond_to?(:helper)
26
- end
27
27
  # Include additional helpers globally
28
- ActionView::Base.include(Decidim::DecidimAwesome::AwesomeHelpers)
29
-
30
- # override user's admin property
31
- Decidim::User.include(Decidim::DecidimAwesome::UserOverride) if DecidimAwesome.enabled?(:scoped_admins)
28
+ ActiveSupport.on_load(:action_view) { include Decidim::DecidimAwesome::AwesomeHelpers }
29
+ # Also for cells
30
+ Decidim::ViewModel.include(Decidim::DecidimAwesome::AwesomeHelpers)
32
31
 
33
- # redirect unauthorized scoped admins to allowed places or custom redirects if configured
34
- Decidim::ErrorsController.include(Decidim::DecidimAwesome::NotFoundRedirect) if DecidimAwesome.enabled?([:scoped_admins, :custom_redirects])
32
+ # Override EtiquetteValidator
33
+ EtiquetteValidator.include(Decidim::DecidimAwesome::EtiquetteValidatorOverride) if DecidimAwesome.enabled?(:validate_title_max_caps_percent,
34
+ :validate_title_max_marks_together,
35
+ :validate_title_start_with_caps,
36
+ :validate_body_max_caps_percent,
37
+ :validate_body_max_marks_together,
38
+ :validate_body_start_with_caps)
35
39
 
36
40
  # Custom fields need to deal with several places
37
- if DecidimAwesome.enabled?(:proposal_custom_fields)
38
- Decidim::Proposals::ApplicationHelper.include(Decidim::DecidimAwesome::Proposals::ApplicationHelperOverride)
39
- Decidim::Proposals::ProposalWizardCreateStepForm.include(Decidim::DecidimAwesome::Proposals::ProposalWizardCreateStepFormOverride)
40
- Decidim::AmendmentsHelper.include(Decidim::DecidimAwesome::AmendmentsHelperOverride)
41
+ if DecidimAwesome.enabled?(:proposal_custom_fields,
42
+ :proposal_private_custom_fields,
43
+ :validate_title_min_length,
44
+ :validate_title_max_caps_percent,
45
+ :validate_title_max_marks_together,
46
+ :validate_title_start_with_caps,
47
+ :validate_body_min_length,
48
+ :validate_body_max_caps_percent,
49
+ :validate_body_max_marks_together,
50
+ :validate_body_start_with_caps)
51
+ Decidim::Proposals::ProposalForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormCustomizations)
52
+ end
53
+
54
+ if DecidimAwesome.enabled?(:proposal_custom_fields, :proposal_private_custom_fields)
55
+ Decidim::Proposals::ProposalForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormOverride)
56
+ Decidim::Proposals::Admin::ProposalForm.include(Decidim::DecidimAwesome::Proposals::ProposalFormOverride)
57
+ Decidim::Proposals::ProposalPresenter.include(Decidim::DecidimAwesome::Proposals::ProposalPresenterOverride)
58
+ Decidim::Proposals::CreateProposal.include(Decidim::DecidimAwesome::Proposals::CreateProposalOverride)
59
+ Decidim::Proposals::CreateCollaborativeDraft.include(Decidim::DecidimAwesome::Proposals::CreateCollaborativeDraftOverride)
60
+ Decidim::Proposals::Admin::CreateProposal.include(Decidim::DecidimAwesome::Proposals::CreateProposalOverride)
61
+ Decidim::Proposals::UpdateProposal.include(Decidim::DecidimAwesome::Proposals::UpdateProposalOverride)
62
+ Decidim::Proposals::UpdateCollaborativeDraft.include(Decidim::DecidimAwesome::Proposals::UpdateCollaborativeDraftOverride)
63
+ Decidim::Proposals::Admin::UpdateProposal.include(Decidim::DecidimAwesome::Proposals::Admin::UpdateProposalOverride)
64
+ Decidim::Proposals::ProposalType.include(Decidim::DecidimAwesome::AddProposalTypeCustomFields)
65
+ end
66
+
67
+ if DecidimAwesome.enabled?(:admins_available_authorizations)
68
+ Decidim::System::RegisterOrganizationForm.include(Decidim::DecidimAwesome::System::OrganizationFormOverride)
69
+ Decidim::System::UpdateOrganizationForm.include(Decidim::DecidimAwesome::System::OrganizationFormOverride)
70
+ Decidim::System::UpdateOrganization.include(Decidim::DecidimAwesome::System::UpdateOrganizationOverride)
71
+ Decidim::System::CreateOrganization.include(Decidim::DecidimAwesome::System::CreateOrganizationOverride)
72
+ end
73
+
74
+ if DecidimAwesome.enabled?(:proposal_custom_fields, :proposal_private_custom_fields, :weighted_proposal_voting)
75
+ # add vote weight/private_body to proposals
76
+ Decidim::Proposals::Proposal.include(Decidim::DecidimAwesome::HasProposalExtraFields)
77
+ Decidim::Proposals::CollaborativeDraft.include(Decidim::DecidimAwesome::HasProposalExtraFields)
78
+ end
79
+
80
+ if Decidim::DecidimAwesome.enabled?(:user_timezone)
81
+ Decidim::AccountForm.include(Decidim::DecidimAwesome::AccountFormOverride)
82
+ Decidim::UpdateAccount.include(Decidim::DecidimAwesome::UpdateAccountOverride)
83
+ end
84
+
85
+ if DecidimAwesome.enabled?(:weighted_proposal_voting)
86
+ # add vote weight to proposal vote
87
+ Decidim::Proposals::ProposalVote.include(Decidim::DecidimAwesome::HasVoteWeight)
88
+ Decidim::Proposals::ProposalType.include(Decidim::DecidimAwesome::AddProposalTypeVoteWeights)
89
+ Decidim::Proposals::ProposalLCell.include(Decidim::DecidimAwesome::ProposalLCellOverride)
41
90
  end
42
91
 
43
- Decidim::MenuPresenter.include(Decidim::DecidimAwesome::MenuPresenterOverride)
44
- Decidim::MenuItemPresenter.include(Decidim::DecidimAwesome::MenuItemPresenterOverride)
92
+ # override user's admin property
93
+ Decidim::User.include(Decidim::DecidimAwesome::UserOverride) if DecidimAwesome.enabled?(:scoped_admins)
94
+
95
+ if DecidimAwesome.enabled?(:menu, :content_block_main_menu)
96
+ Decidim::ContentBlocks::GlobalMenuCell.include(Decidim::DecidimAwesome::GlobalMenuCellOverride)
97
+ Decidim::BreadcrumbHelper.include(Decidim::DecidimAwesome::BreadcrumbHelperOverride)
98
+ Decidim::MenuPresenter.include(Decidim::DecidimAwesome::MenuPresenterOverride)
99
+ Decidim::MenuItemPresenter.include(Decidim::DecidimAwesome::MenuItemPresenterOverride)
100
+ Decidim::BreadcrumbRootMenuItemPresenter.include(Decidim::DecidimAwesome::BreadcrumbRootMenuItemPresenterOverride)
101
+ end
45
102
 
46
103
  # Late registering of components to take into account initializer values
47
104
  DecidimAwesome.registered_components.each do |manifest, block|
48
- Decidim.register_component(manifest, &block) unless DecidimAwesome.disabled_components.include?(manifest)
105
+ next if DecidimAwesome.disabled_components.include?(manifest)
106
+ next if Decidim.find_component_manifest(manifest)
107
+
108
+ Decidim.register_component(manifest, &block)
109
+ end
110
+ end
111
+
112
+ initializer "decidim_decidim_awesome.overrides", after: "decidim.action_controller" do
113
+ config.to_prepare do
114
+ Decidim::ApplicationController.include(Decidim::DecidimAwesome::CheckLoginAuthorizations) if DecidimAwesome.enabled?(:force_authorization_after_login)
115
+ Decidim::ApplicationController.include(Decidim::DecidimAwesome::UseUserTimeZone) if Decidim::DecidimAwesome.enabled?(:user_timezone)
116
+
117
+ # Auto-insert some csp directives
118
+ Decidim::ApplicationController.include(Decidim::DecidimAwesome::ContentSecurityPolicy)
119
+ Decidim::Admin::ApplicationController.include(Decidim::DecidimAwesome::ContentSecurityPolicy)
120
+
121
+ # redirect unauthorized scoped admins to allowed places or custom redirects if configured
122
+ Decidim::ErrorsController.include(Decidim::DecidimAwesome::NotFoundRedirect) if DecidimAwesome.enabled?(:scoped_admins, :custom_redirects)
123
+
124
+ # Custom fields need to deal with several places
125
+ if DecidimAwesome.enabled?(:proposal_custom_fields, :proposal_private_custom_fields)
126
+ Decidim::Proposals::ApplicationHelper.include(Decidim::DecidimAwesome::Proposals::ApplicationHelperOverride)
127
+ Decidim::AmendmentsHelper.include(Decidim::DecidimAwesome::AmendmentsHelperOverride)
128
+ end
129
+ if DecidimAwesome.enabled?(:proposal_custom_fields, :proposal_private_custom_fields, :weighted_proposal_voting)
130
+ Decidim::Proposals::ProposalSerializer.include(Decidim::DecidimAwesome::Proposals::ProposalSerializerOverride)
131
+ Decidim::AdminLog::ComponentPresenter.include(Decidim::DecidimAwesome::AdminLog::ComponentPresenterOverride)
132
+ end
133
+
134
+ if DecidimAwesome.enabled?(:weighted_proposal_voting)
135
+ Decidim::Proposals::ProposalsController.include(Decidim::DecidimAwesome::Proposals::MemoizeExtraFields)
136
+ Decidim::Proposals::ProposalVotesController.include(Decidim::DecidimAwesome::Proposals::ProposalVotesControllerOverride)
137
+ end
138
+
139
+ Decidim::AdminLog::UserPresenter.include(Decidim::DecidimAwesome::AdminLog::UserPresenterOverride) if DecidimAwesome.enabled?(:admins_available_authorizations)
140
+
141
+ Decidim::AmendmentsController.include(Decidim::DecidimAwesome::LimitPendingAmendments) if DecidimAwesome.enabled?(:allow_limiting_amendments)
142
+
143
+ Decidim::Proposals::ProposalsController.include(Decidim::DecidimAwesome::Proposals::OrderableOverride) if DecidimAwesome.enabled?(:additional_proposal_sortings)
49
144
  end
50
145
  end
51
146
 
52
- initializer "decidim.middleware" do |app|
147
+ initializer "decidim_decidim_awesome.middleware" do |app|
53
148
  app.config.middleware.insert_after Decidim::Middleware::CurrentOrganization, Decidim::DecidimAwesome::CurrentConfig
54
149
  end
55
150
 
151
+ initializer "decidim_decidim_awesome.additional_proposal_options" do |_app|
152
+ Decidim.component_registry.find(:proposals).tap do |component|
153
+ component.settings(:global) do |settings|
154
+ if DecidimAwesome.enabled?(:additional_proposal_sortings)
155
+ settings.attribute(
156
+ :default_sort_order,
157
+ type: :select,
158
+ default: "default",
159
+ choices: -> { (POSSIBLE_SORT_ORDERS + DecidimAwesome.possible_additional_proposal_sortings).uniq }
160
+ )
161
+ end
162
+ if DecidimAwesome.enabled?(:allow_limiting_amendments)
163
+ DecidimAwesome.hash_append!(
164
+ settings.attributes,
165
+ :amendments_enabled,
166
+ :limit_pending_amendments,
167
+ Decidim::SettingsManifest::Attribute.new(type: :boolean, default: DecidimAwesome.allow_limiting_amendments)
168
+ )
169
+ end
170
+ end
171
+
172
+ if DecidimAwesome.enabled?(:additional_proposal_sortings)
173
+ component.settings(:step) do |settings|
174
+ settings.attribute(
175
+ :default_sort_order,
176
+ type: :select,
177
+ include_blank: true,
178
+ choices: -> { (POSSIBLE_SORT_ORDERS + DecidimAwesome.possible_additional_proposal_sortings).uniq }
179
+ )
180
+ end
181
+ end
182
+
183
+ if DecidimAwesome.enabled?(:proposal_private_custom_fields)
184
+ # Add to the "proposals" component an exporter that is not
185
+ # included in open-data to be able to export all private fields
186
+ # from the administration without exposing data to the frontend.
187
+ component.exports :awesome_private_proposals do |exports|
188
+ exports.collection do |component_instance, user|
189
+ space = component_instance.participatory_space
190
+
191
+ collection = Decidim::Proposals::Proposal
192
+ .published
193
+ .not_hidden
194
+ .where(component: component_instance)
195
+ .includes(:scope, :category, :component)
196
+
197
+ if space.user_roles(:valuator).where(user:).any?
198
+ collection.with_valuation_assigned_to(user, space)
199
+ else
200
+ collection
201
+ end
202
+ end
203
+
204
+ exports.include_in_open_data = false
205
+ exports.serializer Decidim::DecidimAwesome::Proposals::PrivateProposalSerializer
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ initializer "decidim_decidim_awesome.weighted_proposal_voting" do |_app|
212
+ if DecidimAwesome.enabled?(:weighted_proposal_voting)
213
+ # register available processors
214
+ Decidim::DecidimAwesome.voting_registry.register(:voting_cards) do |voting|
215
+ voting.show_vote_button_view = "decidim/decidim_awesome/voting/voting_cards/show_vote_button"
216
+ # voting.show_votes_count_view = "decidim/decidim_awesome/voting/voting_cards/show_votes_count"
217
+ voting.show_votes_count_view = "" # hide votes count if not needed (in this case is integrated in the show_vote_button_view)
218
+ voting.proposal_metadata_cell = "decidim/decidim_awesome/voting/proposal_metadata"
219
+ voting.weight_validator do |weight, context|
220
+ allowed = [1, 2, 3]
221
+ allowed << 0 if context[:proposal]&.component&.settings&.voting_cards_show_abstain
222
+ weight.in? allowed
223
+ end
224
+ end
225
+
226
+ Decidim::DecidimAwesome.voting_components&.each do |manifest|
227
+ component = Decidim.component_registry.find(manifest)
228
+ next unless component
229
+
230
+ component.settings(:global) do |settings|
231
+ DecidimAwesome.hash_append!(
232
+ settings.attributes,
233
+ :can_accumulate_votes_beyond_threshold,
234
+ :awesome_voting_manifest,
235
+ Decidim::SettingsManifest::Attribute.new(
236
+ type: :select,
237
+ default: "",
238
+ choices: -> { ["default"] + Decidim::DecidimAwesome.voting_registry.manifests.map(&:name) },
239
+ readonly: lambda { |context|
240
+ Decidim::Proposals::Proposal.where(component: context[:component]).where.not(proposal_votes_count: -Float::INFINITY..0).any?
241
+ }
242
+ )
243
+ )
244
+ DecidimAwesome.hash_append!(
245
+ settings.attributes,
246
+ :awesome_voting_manifest,
247
+ :voting_cards_box_title,
248
+ Decidim::SettingsManifest::Attribute.new(type: :string, translated: true)
249
+ )
250
+ DecidimAwesome.hash_append!(
251
+ settings.attributes,
252
+ :voting_cards_box_title,
253
+ :voting_cards_show_modal_help,
254
+ Decidim::SettingsManifest::Attribute.new(type: :boolean, default: true)
255
+ )
256
+ DecidimAwesome.hash_append!(
257
+ settings.attributes,
258
+ :voting_cards_show_modal_help,
259
+ :voting_cards_show_abstain,
260
+ Decidim::SettingsManifest::Attribute.new(type: :boolean, default: false)
261
+ )
262
+ DecidimAwesome.hash_append!(
263
+ settings.attributes,
264
+ :voting_cards_show_abstain,
265
+ :voting_cards_instructions,
266
+ Decidim::SettingsManifest::Attribute.new(type: :text, translated: true, editor: true)
267
+ )
268
+ end
269
+ end
270
+ end
271
+ end
272
+
56
273
  initializer "decidim_decidim_awesome.webpacker.assets_path" do
57
274
  Decidim.register_assets_path File.expand_path("app/packs", root)
58
275
  end
59
276
 
60
- initializer "decidim_decidim_awesome.add_cells_view_paths" do
277
+ # Votings may override proposals cells, let's be sure to add these paths after the proposal component initializer
278
+ initializer "decidim_decidim_awesome.add_cells_view_paths", before: "decidim_proposals.add_cells_view_paths" do
61
279
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::DecidimAwesome::Engine.root}/app/cells")
62
280
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::DecidimAwesome::Engine.root}/app/views")
63
281
  end
282
+
283
+ initializer "decidim_decidim_awesome.register_icons" do
284
+ Decidim.icons.register(name: "editors-text", icon: "text", category: "system", description: "", engine: :decidim_awesome)
285
+ Decidim.icons.register(name: "surveys", icon: "survey-line", category: "system", description: "", engine: :decidim_awesome)
286
+ Decidim.icons.register(name: "brush", icon: "brush-line", category: "system", description: "", engine: :decidim_awesome)
287
+ Decidim.icons.register(name: "layers", icon: "stack-line", category: "system", description: "", engine: :decidim_awesome)
288
+ Decidim.icons.register(name: "pulse", icon: "pulse-line", category: "system", description: "", engine: :decidim_awesome)
289
+ Decidim.icons.register(name: "fire", icon: "fire-line", category: "system", description: "", engine: :decidim_awesome)
290
+ Decidim.icons.register(name: "line-chart-line", icon: "line-chart-line", category: "system", description: "", engine: :decidim_awesome)
291
+ Decidim.icons.register(name: "spy", icon: "spy-fill", category: "system", description: "", engine: :decidim_awesome)
292
+ Decidim.icons.register(name: "forbid-line", icon: "forbid-line", category: "system", description: "", engine: :decidim_awesome)
293
+ Decidim.icons.register(name: "file-settings-line", icon: "file-settings-line", category: "system", description: "", engine: :decidim_awesome)
294
+ end
64
295
  end
65
296
  end
66
297
  end
@@ -5,7 +5,7 @@ require "decidim/components/namer"
5
5
  Decidim::DecidimAwesome.register_component(:awesome_iframe) do |component|
6
6
  component.engine = Decidim::DecidimAwesome::IframeComponent::Engine
7
7
  component.admin_engine = Decidim::DecidimAwesome::IframeComponent::AdminEngine
8
- component.icon = "decidim/meetings/icon.svg" # TODO: create a Icon
8
+ component.icon = "media/images/decidim_meetings.svg" # TODO: create a Icon
9
9
  component.permissions_class_name = "Decidim::DecidimAwesome::Permissions"
10
10
 
11
11
  # These actions permissions can be configured in the admin panel
@@ -17,7 +17,6 @@ Decidim::DecidimAwesome.register_component(:awesome_iframe) do |component|
17
17
  settings.attribute :announcement, type: :text, translated: true, editor: true
18
18
  settings.attribute :iframe, type: :text, default: ""
19
19
  settings.attribute :viewport_width, type: :boolean, default: false
20
- settings.attribute :no_margins, type: :boolean, default: false
21
20
  end
22
21
 
23
22
  component.settings(:step) do |settings|
@@ -41,9 +40,10 @@ Decidim::DecidimAwesome.register_component(:awesome_iframe) do |component|
41
40
  name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :awesome_iframe).i18n_name,
42
41
  manifest_name: :awesome_iframe,
43
42
  published_at: Time.current,
44
- participatory_space: participatory_space,
43
+ participatory_space:,
45
44
  settings: {
46
- announcement: { en: Faker::Lorem.paragraphs(number: 2).join("\n") }
45
+ announcement: { en: Faker::Lorem.paragraphs(number: 2).join("\n") },
46
+ iframe: '<iframe src="https://picsum.photos/800/600" width="100%" height="700" frameborder="0"></iframe>'
47
47
  }
48
48
  }
49
49
 
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class Lock
6
+ def initialize(organization, lock_time: DecidimAwesome.lock_time)
7
+ @organization = organization
8
+ @lock_time = lock_time
9
+ end
10
+
11
+ attr_reader :resource, :organization, :lock_time
12
+
13
+ def get!(resource)
14
+ @resource = resource
15
+ if config
16
+ config.update!(updated_at: Time.current)
17
+ else
18
+ AwesomeConfig.create!(var:, organization:)
19
+ end
20
+ end
21
+
22
+ def release!(resource)
23
+ @resource = resource
24
+ config.destroy! if config
25
+ end
26
+
27
+ def locked?(resource)
28
+ @resource = resource
29
+ return false unless config
30
+ return true if config.reload.updated_at > lock_time.ago
31
+
32
+ config.destroy!
33
+ false
34
+ end
35
+
36
+ def config
37
+ AwesomeConfig.find_by(var:, organization:)
38
+ end
39
+
40
+ private
41
+
42
+ def var
43
+ "lock-#{resource.class.name.underscore}_#{resource.id}"
44
+ end
45
+ end
46
+ end
47
+ end
@@ -5,7 +5,7 @@ require "decidim/components/namer"
5
5
  Decidim::DecidimAwesome.register_component(:awesome_map) do |component|
6
6
  component.engine = Decidim::DecidimAwesome::MapComponent::Engine
7
7
  component.admin_engine = Decidim::DecidimAwesome::MapComponent::AdminEngine
8
- component.icon = "decidim/meetings/icon.svg" # TODO: create a Icon
8
+ component.icon = "media/images/decidim_meetings.svg" # TODO: create a Icon
9
9
  component.permissions_class_name = "Decidim::DecidimAwesome::Permissions"
10
10
 
11
11
  # These actions permissions can be configured in the admin panel
@@ -52,7 +52,7 @@ Decidim::DecidimAwesome.register_component(:awesome_map) do |component|
52
52
  name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :awesome_map).i18n_name,
53
53
  manifest_name: :awesome_map,
54
54
  published_at: Time.current,
55
- participatory_space: participatory_space,
55
+ participatory_space:,
56
56
  settings: {
57
57
  announcement: { en: Faker::Lorem.paragraphs(number: 2).join("\n") }
58
58
  }