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
@@ -7,63 +7,107 @@ module Decidim
7
7
  module Admin
8
8
  class ConfigForm < Decidim::Form
9
9
  include ActionView::Helpers::SanitizeHelper
10
+ include TranslatableAttributes
10
11
 
11
- attribute :allow_images_in_full_editor, Boolean
12
- attribute :allow_images_in_small_editor, Boolean
12
+ attribute :allow_images_in_editors, Boolean
13
+ attribute :allow_videos_in_editors, Boolean
13
14
  attribute :allow_images_in_proposals, Boolean
14
- attribute :use_markdown_editor, Boolean
15
- attribute :allow_images_in_markdown_editor, Boolean
16
15
  attribute :auto_save_forms, Boolean
17
16
  attribute :scoped_styles, Hash
17
+ attribute :scoped_admin_styles, Hash
18
18
  attribute :proposal_custom_fields, Hash
19
+ attribute :proposal_private_custom_fields, Hash
20
+ attribute :user_timezone, Boolean
21
+ attribute :force_authorization_after_login, Array
22
+ attribute :force_authorization_with_any_method, Boolean
23
+ translatable_attribute :force_authorization_help_text, String
19
24
  attribute :scoped_admins, Hash
20
- attribute :menu, Array[MenuForm]
25
+ attribute :menu, [MenuForm]
21
26
  attribute :intergram_for_admins, Boolean
22
27
  attribute :intergram_for_admins_settings, IntergramForm
23
28
  attribute :intergram_for_public, Boolean
24
29
  attribute :intergram_for_public_settings, IntergramForm
30
+ attribute :validate_title_min_length, Integer, default: 15
31
+ attribute :validate_title_max_caps_percent, Integer, default: 25
32
+ attribute :validate_title_max_marks_together, Integer, default: 1
33
+ attribute :validate_title_start_with_caps, Boolean, default: true
34
+ attribute :validate_body_min_length, Integer, default: 15
35
+ attribute :validate_body_max_caps_percent, Integer, default: 25
36
+ attribute :validate_body_max_marks_together, Integer, default: 1
37
+ attribute :validate_body_start_with_caps, Boolean, default: true
38
+ attribute :additional_proposal_sortings, Array, default: Decidim::DecidimAwesome.possible_additional_proposal_sortings
25
39
 
26
- # collect all keys anything not specified in the params (UpdateConfig command ignores it)
40
+ # collect all keys specified in the params (UpdateConfig command ignores everything else)
27
41
  attr_accessor :valid_keys
28
42
 
29
- validate :css_syntax, if: ->(form) { form.scoped_styles.present? }
30
- validate :json_syntax, if: ->(form) { form.proposal_custom_fields.present? }
43
+ validate :css_syntax
44
+ validate :json_syntax
31
45
 
46
+ validates :validate_title_min_length, presence: true, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 100 }
47
+ validates :validate_title_max_caps_percent, presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }
48
+ validates :validate_title_max_marks_together, presence: true, numericality: { greater_than_or_equal_to: 1 }
49
+ validates :validate_body_min_length, presence: true, numericality: { greater_than_or_equal_to: 0 }
50
+ validates :validate_body_max_caps_percent, presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }
51
+ validates :validate_body_max_marks_together, presence: true, numericality: { greater_than_or_equal_to: 1 }
52
+ validate :force_authorization_after_login_is_valid
32
53
  # TODO: validate non general admins are here
33
54
 
34
55
  def self.from_params(params, additional_params = {})
35
56
  instance = super(params, additional_params)
36
- instance.valid_keys = params.keys.map(&:to_sym) || []
57
+ instance.force_authorization_after_login = instance.force_authorization_after_login.compact_blank if instance.force_authorization_after_login.present?
58
+ instance.valid_keys = extract_valid_keys_from_params(params)
37
59
  instance.sanitize_labels!
38
60
  instance
39
61
  end
40
62
 
63
+ def self.extract_valid_keys_from_params(params)
64
+ keys = []
65
+ params.each do |key, _value|
66
+ keys << if key.to_s.starts_with?("force_authorization_help_text_")
67
+ :force_authorization_help_text if keys.exclude?(:force_authorization_help_text)
68
+ else
69
+ key.to_sym
70
+ end
71
+ end
72
+ keys
73
+ end
74
+
75
+ def additional_proposal_sorting_labels
76
+ Decidim::DecidimAwesome.possible_additional_proposal_sortings.index_by do |sorting|
77
+ I18n.t(sorting, scope: "decidim.proposals.proposals.orders")
78
+ end
79
+ end
80
+
41
81
  def css_syntax
42
- scoped_styles.each do |key, code|
43
- next unless code
82
+ styles = {}
83
+ styles.merge!(scoped_styles: scoped_styles.values) if scoped_styles.present?
84
+ styles.merge!(scoped_admin_styles: scoped_admin_styles.values) if scoped_admin_styles.present?
85
+ styles.each do |key, values|
86
+ next if values.blank?
44
87
 
45
- SassC::Engine.new(code).render
88
+ values.each { |code| SassC::Engine.new(code).render }
46
89
  rescue SassC::SyntaxError => e
47
- errors.add(:scoped_styles, I18n.t("config.form.errors.incorrect_css", key: key, scope: "decidim.decidim_awesome.admin"))
90
+ errors.add(key, I18n.t("config.form.errors.incorrect_css", key:, scope: "decidim.decidim_awesome.admin"))
48
91
  errors.add(key.to_sym, e.message)
49
92
  end
50
93
  end
51
94
 
52
95
  def json_syntax
53
- proposal_custom_fields.each do |key, code|
54
- next unless code
96
+ fields = {}
97
+ fields.merge!(proposal_custom_fields: proposal_custom_fields.values) if proposal_custom_fields.present?
98
+ fields.merge!(proposal_private_custom_fields: proposal_private_custom_fields.values) if proposal_private_custom_fields.present?
99
+ fields.each do |key, values|
100
+ next if values.blank?
55
101
 
56
- JSON.parse(code)
57
- rescue JSON::ParserError => e
58
- errors.add(:scoped_styles, I18n.t("config.form.errors.incorrect_json", key: key, scope: "decidim.decidim_awesome.admin"))
102
+ values.each { |code| JSON.parse(code) }
103
+ rescue JSON::JSONError => e
104
+ errors.add(key, I18n.t("config.form.errors.incorrect_json", key:, scope: "decidim.decidim_awesome.admin"))
59
105
  errors.add(key.to_sym, e.message)
60
106
  end
61
107
  end
62
108
 
63
109
  # formBuilder has a bug and do not sanitize text if users copy/paste text with format in the label input
64
110
  def sanitize_labels!
65
- return unless proposal_custom_fields
66
-
67
111
  proposal_custom_fields.transform_values! do |code|
68
112
  next unless code
69
113
 
@@ -76,6 +120,30 @@ module Decidim
76
120
  rescue JSON::ParserError
77
121
  code
78
122
  end
123
+
124
+ proposal_private_custom_fields.transform_values! do |code|
125
+ next unless code
126
+
127
+ json = JSON.parse(code)
128
+ json.map! do |item|
129
+ item["label"] = strip_tags(item["label"])
130
+ item
131
+ end
132
+ JSON.generate(json)
133
+ rescue JSON::ParserError
134
+ code
135
+ end
136
+ end
137
+
138
+ private
139
+
140
+ def force_authorization_after_login_is_valid
141
+ return if force_authorization_after_login.blank?
142
+
143
+ invalid = force_authorization_after_login - (current_organization.available_authorizations & Decidim.authorization_workflows.map(&:name))
144
+ return if invalid.empty?
145
+
146
+ errors.add(:force_authorization_after_login, :invalid)
79
147
  end
80
148
  end
81
149
  end
@@ -18,14 +18,14 @@ module Decidim
18
18
  sanitize_url(origin),
19
19
  {
20
20
  destination: sanitize_url(destination, strip_host: false),
21
- active: active,
22
- pass_query: pass_query
21
+ active:,
22
+ pass_query:
23
23
  }
24
24
  ]
25
25
  end
26
26
 
27
27
  def sanitize_url(url, strip_host: true)
28
- url = url.strip.downcase
28
+ url = url.strip
29
29
  parsed = Addressable::URI.parse(url)
30
30
  url = parsed.path if strip_host && parsed.host == current_organization.host
31
31
  url = "/#{url}" unless url.match?(%r{^https?://|^/})
@@ -13,6 +13,10 @@ module Decidim
13
13
  attribute :intro_message, String
14
14
  attribute :auto_response, String
15
15
  attribute :auto_no_response, String
16
+
17
+ def color
18
+ super || current_organization.colors["secondary"] || "#E91E63"
19
+ end
16
20
  end
17
21
  end
18
22
  end
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  class MenuForm < Decidim::Form
7
7
  include Decidim::TranslatableAttributes
8
- VISIBILITY_STATES = %w(default hidden logged non_logged).freeze
8
+ VISIBILITY_STATES = %w(default hidden logged non_logged verified_user).freeze
9
9
 
10
10
  translatable_attribute :raw_label, String
11
11
  attribute :url, String
@@ -27,10 +27,10 @@ module Decidim
27
27
  def to_params
28
28
  {
29
29
  label: raw_label,
30
- position: position,
31
- url: url,
32
- target: target,
33
- visibility: visibility
30
+ position:,
31
+ url:,
32
+ target:,
33
+ visibility:
34
34
  }
35
35
  end
36
36
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module AmendmentsHelperOverride
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ # original method
10
+ alias_method :decidim_amendments_form_field_for, :amendments_form_field_for
11
+
12
+ # override with custom fields if scope applies
13
+ def amendments_form_field_for(attribute, form, original_resource)
14
+ custom_fields, custom_private_fields = awesome_custom_fields(attribute, form)
15
+ content = if custom_fields.blank?
16
+ decidim_amendments_form_field_for(attribute, form, original_resource)
17
+ else
18
+ render_amendment_custom_fields_override(custom_fields, attribute, form, original_resource)
19
+ end
20
+ if custom_private_fields.present?
21
+ content = content_tag("div", content)
22
+ content += content_tag("div", render_amendment_custom_fields_override(custom_private_fields, :private_body, form, original_resource))
23
+ end
24
+ content
25
+ end
26
+
27
+ private
28
+
29
+ def render_amendment_custom_fields_override(custom_fields, attribute, form, original_resource)
30
+ # ensure decidim_editor is available as it is only required if the original FormBuilder is called
31
+ append_stylesheet_pack_tag "decidim_editor"
32
+ append_javascript_pack_tag "decidim_editor", defer: false
33
+
34
+ custom_fields.translate!
35
+ body = amendments_form_fields_value(original_resource, attribute)
36
+ custom_fields.apply_xml(body) if body.present?
37
+ # TODO: find a way to add errors as form is not the parent form
38
+ # form.object.errors.add(attribute, custom_fields.errors) if custom_fields.errors
39
+
40
+ editor_image = Decidim::EditorImage.new
41
+ editor_options = form.send(:editor_options, editor_image, { context: "participant", lines: 10 })
42
+ editor_upload = form.send(:editor_upload, editor_image, editor_options[:upload])
43
+ render partial: "decidim/decidim_awesome/custom_fields/form_render", locals: { spec: custom_fields.to_json, editor_options:, editor_upload:, form:, name: attribute }
44
+ end
45
+
46
+ # Amendments don't use a URL specifying participatory space and component
47
+ # context for awesome config constraints must be obtained from the resource
48
+ def awesome_custom_fields(attribute, _form)
49
+ return unless attribute == :body
50
+
51
+ component = amendable.try(:component)
52
+ return unless component
53
+ return if component.settings.participatory_texts_enabled?
54
+
55
+ awesome_config = Decidim::DecidimAwesome::Config.new(component.organization)
56
+ awesome_config.context_from_component(component)
57
+
58
+ pub = awesome_config.collect_sub_configs_values("proposal_custom_field")
59
+ priv = awesome_config.collect_sub_configs_values("proposal_private_custom_field")
60
+ [pub.presence && Decidim::DecidimAwesome::CustomFields.new(pub), priv.presence && Decidim::DecidimAwesome::CustomFields.new(priv)]
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module BreadcrumbHelperOverride
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ def active_breadcrumb_item(target_menu)
10
+ active_item = ::Decidim::MenuPresenter.new(target_menu, self).active_item_for_breadcrumb
11
+
12
+ return if active_item.blank?
13
+
14
+ {
15
+ label: active_item.label,
16
+ url: active_item.url,
17
+ active: active_item.active?
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Proposals
6
+ module ApplicationHelperOverride
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ alias_method :decidim_text_editor_for_proposal_body, :text_editor_for_proposal_body
11
+ alias_method :decidim_render_proposal_body, :render_proposal_body
12
+
13
+ # If the content is safe, HTML tags are sanitized, otherwise, they are stripped.
14
+ def render_proposal_body(proposal)
15
+ if awesome_proposal_custom_fields.present? || awesome_config[:allow_images_in_editors]
16
+ content = present(proposal).body(links: true, strip_tags: false)
17
+ sanitized = decidim_sanitize_editor_admin(content, {})
18
+ Decidim::ContentProcessor.render_without_format(sanitized).html_safe
19
+ else
20
+ decidim_render_proposal_body(proposal)
21
+ end
22
+ end
23
+
24
+ # replace normal method to draw the editor
25
+ def text_editor_for_proposal_body(form)
26
+ custom_fields = awesome_proposal_custom_fields_for(:body)
27
+ custom_private_fields = awesome_proposal_custom_fields_for(:private_body)
28
+
29
+ content = if custom_fields.empty?
30
+ decidim_text_editor_for_proposal_body(form)
31
+ else
32
+ render_proposal_custom_fields_override(custom_fields, form, :body)
33
+ end
34
+
35
+ unless custom_private_fields.empty?
36
+ content = content_tag("div", content)
37
+ content += content_tag("div", render_proposal_custom_fields_override(custom_private_fields, form, :private_body))
38
+ end
39
+ content
40
+ end
41
+
42
+ # replace admin method to draw the editor (multi lang)
43
+ def admin_editor_for_proposal_body(form)
44
+ custom_fields = awesome_proposal_custom_fields_for(:body)
45
+
46
+ return if custom_fields.empty?
47
+
48
+ locales = form.send(:locales)
49
+ return render_proposal_custom_fields_override(custom_fields, form, "body_#{locales.first}", locales.first) if locales.length == 1
50
+
51
+ tabs_id = form.send(:sanitize_tabs_selector, form.options[:tabs_id] || "#{form.object_name}-body-tabs")
52
+
53
+ label_tabs = form.content_tag(:div, class: "label--tabs") do
54
+ language_selector = "".html_safe
55
+ language_selector = form.create_language_selector(locales, tabs_id, "body") if form.options[:label] != false
56
+
57
+ safe_join [content_tag("label"), language_selector]
58
+ end
59
+
60
+ tabs_content = form.content_tag(:div, class: "tabs-content", data: { tabs_content: tabs_id }) do
61
+ locales.each_with_index.inject("".html_safe) do |string, (locale, index)|
62
+ tab_content_id = "#{tabs_id}-body-panel-#{index}"
63
+ string + content_tag(:div, class: form.send(:tab_element_class_for, "panel", index), id: tab_content_id, "aria-hidden": index.zero? ? "false" : "true") do
64
+ render_proposal_custom_fields_override(custom_fields, form, "body_#{locale}", locale)
65
+ end
66
+ end
67
+ end
68
+
69
+ safe_join [label_tabs, tabs_content]
70
+ end
71
+
72
+ def render_proposal_custom_fields_override(custom_fields, form, name, locale = nil)
73
+ # ensure decidim_editor is available as it is only required if the original FormBuilder is called
74
+ append_stylesheet_pack_tag "decidim_editor"
75
+ append_javascript_pack_tag "decidim_editor", defer: false
76
+
77
+ custom_fields.translate!
78
+
79
+ body = if name == :private_body
80
+ if form_presenter.proposal.private_body.is_a?(Hash) && locale.present?
81
+ form_presenter.private_body(extras: false, all_locales: locale.present?).with_indifferent_access[locale]
82
+ else
83
+ form_presenter.private_body(extras: false)
84
+ end
85
+ elsif form_presenter.proposal.body.is_a?(Hash) && locale.present?
86
+ form_presenter.body(extras: false, all_locales: locale.present?).with_indifferent_access[locale]
87
+ else
88
+ form_presenter.body(extras: false)
89
+ end
90
+
91
+ custom_fields.apply_xml(body) if body.present?
92
+ form.object.errors.add(name, custom_fields.errors) if custom_fields.errors
93
+ editor_image = Decidim::EditorImage.new
94
+ editor_options = form.send(:editor_options, editor_image, { context: "participant", lines: 10 })
95
+ editor_upload = form.send(:editor_upload, editor_image, editor_options[:upload])
96
+ render partial: "decidim/decidim_awesome/custom_fields/form_render", locals: { spec: custom_fields.to_json, editor_options:, editor_upload:, form:, name: }
97
+ end
98
+
99
+ def awesome_proposal_custom_fields_for(name)
100
+ if name == :private_body
101
+ Decidim::DecidimAwesome::CustomFields.new(awesome_proposal_private_custom_fields)
102
+ else
103
+ Decidim::DecidimAwesome::CustomFields.new(awesome_proposal_custom_fields)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -8,36 +8,19 @@ module Decidim
8
8
 
9
9
  include Decidim::TranslatableAttributes
10
10
 
11
- def check(status)
12
- content_tag(:span, icon(status ? "check" : "x", class: "icon", aria_label: status, role: "img"), class: "text-#{status ? "success" : "alert"}")
13
- end
11
+ delegate :menus, :config_enabled?, to: "Decidim::DecidimAwesome::Menu"
14
12
 
15
- def menus
16
- @menus ||= {
17
- editors: config_enabled?([:allow_images_in_full_editor, :allow_images_in_small_editor, :use_markdown_editor, :allow_images_in_markdown_editor]),
18
- proposals: config_enabled?(:allow_images_in_proposals),
19
- surveys: config_enabled?(:auto_save_forms),
20
- styles: config_enabled?(:scoped_styles),
21
- proposal_custom_fields: config_enabled?(:proposal_custom_fields),
22
- admins: config_enabled?(:scoped_admins),
23
- menu_hacks: config_enabled?(:menu),
24
- custom_redirects: config_enabled?(:custom_redirects),
25
- livechat: config_enabled?([:intergram_for_admins, :intergram_for_public])
26
- }
13
+ def check(status)
14
+ content_tag(:span, icon(status ? "check-line" : "close-line", class: "inline-block", aria_label: status, role: "img"), class: "fill-#{status ? "success" : "alert"}")
27
15
  end
28
16
 
29
17
  # returns only non :disabled vars in config
30
18
  def enabled_configs(vars)
31
- vars.filter do |var|
32
- config_enabled? var
19
+ vars.filter do |conf|
20
+ config_enabled?(conf)
33
21
  end
34
22
  end
35
23
 
36
- # ensure boolean value
37
- def config_enabled?(var)
38
- DecidimAwesome.enabled?(var) ? true : false
39
- end
40
-
41
24
  def participatory_space_manifests
42
25
  manifests = OTHER_MANIFESTS.index_with { |m| I18n.t("decidim.decidim_awesome.admin.config.#{m}") }
43
26
  Decidim.participatory_space_manifests.pluck(:name).each do |name|
@@ -49,28 +32,28 @@ module Decidim
49
32
  def component_manifests(space = nil)
50
33
  return {} if OTHER_MANIFESTS.include?(space)
51
34
 
52
- Decidim.component_manifests.pluck(:name).map do |name|
35
+ Decidim.component_manifests.pluck(:name).to_h do |name|
53
36
  [name.to_sym, I18n.t("decidim.components.#{name}.name")]
54
- end.to_h
37
+ end
55
38
  end
56
39
 
57
40
  def participatory_spaces_list(manifest)
58
41
  space = model_for_manifest(manifest)
59
42
  return {} if space.blank?
60
43
 
61
- space.where(organization: current_organization).map do |item|
44
+ space.where(organization: current_organization).to_h do |item|
62
45
  [item.try(:slug) || item.id.to_s, translated_attribute(item.title)]
63
- end.to_h
46
+ end
64
47
  end
65
48
 
66
49
  def components_list(manifest, slug)
67
50
  space = model_for_manifest(manifest)
68
51
  return {} unless space&.column_names&.include? "slug"
69
52
 
70
- components = Component.where(participatory_space: space.find_by(slug: slug))
71
- components.map do |item|
53
+ components = Component.where(participatory_space: space.find_by(slug:))
54
+ components.to_h do |item|
72
55
  [item.id, "#{item.id}: #{translated_attribute(item.name)}"]
73
- end.to_h
56
+ end
74
57
  end
75
58
 
76
59
  def translate_constraint_value(constraint, key)
@@ -16,6 +16,10 @@ module Decidim
16
16
  SystemChecker.to_h
17
17
  end
18
18
 
19
+ def exists?(spec, file)
20
+ SystemChecker.exists?(spec, file)
21
+ end
22
+
19
23
  def valid?(spec, file)
20
24
  SystemChecker.valid?(spec, file)
21
25
  end
@@ -11,47 +11,47 @@ module Decidim
11
11
 
12
12
  # rubocop:disable Metrics/CyclomaticComplexity
13
13
  # rubocop:disable Metrics/PerceivedComplexity:
14
- def awesome_map_for(components, &block)
14
+ def awesome_map_for(components, &)
15
15
  return unless map_utility_dynamic
16
16
 
17
- map = awesome_builder.map_element({ class: "google-map", id: "awesome-map-container" }, &block)
18
- help = content_tag(:div, class: "map__help") do
19
- sr_content = content_tag(:p, t("screen_reader_explanation", scope: "decidim.map.dynamic"), class: "show-for-sr")
20
-
21
- sr_content
17
+ map = awesome_builder.map_element({ class: "dynamic-map", id: "awesome-map-container" }, &)
18
+ help = content_tag(:div, class: "map__skip-container") do
19
+ content_tag(:p, t("screen_reader_explanation", scope: "decidim.map.dynamic"), class: "sr-only")
22
20
  end
23
21
 
24
22
  html_options = {
25
- "class" => "awesome-map",
26
- "id" => "awesome-map",
27
- "data-components" => components.map do |component|
28
- {
29
- id: component.id,
30
- type: component.manifest.name,
31
- name: translated_attribute(component.name),
32
- url: Decidim::EngineRouter.main_proxy(component).root_path,
33
- amendments: component.manifest.name == :proposals ? Decidim::Proposals::Proposal.where(component: component).only_emendations.count : 0
34
- }
35
- end.to_json,
36
- "data-hide-controls" => settings_source.try(:hide_controls),
37
- "data-collapsed" => global_settings.collapse,
38
- "data-truncate" => global_settings.truncate || 255,
39
- "data-map-center" => global_settings.map_center,
40
- "data-map-zoom" => global_settings.map_zoom || 8,
41
- "data-menu-merge-components" => global_settings.menu_merge_components,
42
- "data-menu-amendments" => global_settings.menu_amendments,
43
- "data-menu-meetings" => global_settings.menu_meetings,
44
- "data-menu-categories" => global_settings.menu_categories,
45
- "data-menu-hashtags" => global_settings.menu_hashtags,
46
- "data-show-not-answered" => step_settings&.show_not_answered,
47
- "data-show-accepted" => step_settings&.show_accepted,
48
- "data-show-withdrawn" => step_settings&.show_withdrawn,
49
- "data-show-evaluating" => step_settings&.show_evaluating,
50
- "data-show-rejected" => step_settings&.show_rejected
23
+ class: "awesome-map",
24
+ id: "awesome-map",
25
+ data: {
26
+ "components" => components.map do |component|
27
+ {
28
+ id: component.id,
29
+ type: component.manifest.name,
30
+ name: translated_attribute(component.name),
31
+ url: Decidim::EngineRouter.main_proxy(component).root_path,
32
+ amendments: component.manifest.name == :proposals ? Decidim::Proposals::Proposal.where(component:).only_emendations.count : 0
33
+ }
34
+ end.to_json,
35
+ "hide-controls" => settings_source.try(:hide_controls),
36
+ "collapsed" => global_settings.collapse,
37
+ "truncate" => global_settings.truncate || 255,
38
+ "map-center" => global_settings.map_center,
39
+ "map-zoom" => global_settings.map_zoom || 8,
40
+ "menu-merge-components" => global_settings.menu_merge_components,
41
+ "menu-amendments" => global_settings.menu_amendments,
42
+ "menu-meetings" => global_settings.menu_meetings,
43
+ "menu-categories" => global_settings.menu_categories,
44
+ "menu-hashtags" => global_settings.menu_hashtags,
45
+ "show-not-answered" => step_settings&.show_not_answered,
46
+ "show-accepted" => step_settings&.show_accepted,
47
+ "show-withdrawn" => step_settings&.show_withdrawn,
48
+ "show-evaluating" => step_settings&.show_evaluating,
49
+ "show-rejected" => step_settings&.show_rejected
50
+ }
51
51
  }
52
52
 
53
53
  content_tag(:div, html_options) do
54
- content_tag :div, class: "row column" do
54
+ content_tag :div, class: "w-full" do
55
55
  help + map
56
56
  end
57
57
  end
@@ -71,7 +71,6 @@ module Decidim
71
71
  try(:current_component) || self
72
72
  end
73
73
 
74
- # rubocop:disable Rails/HelperInstanceVariable
75
74
  def current_categories(categories)
76
75
  return @current_categories if @current_categories
77
76
 
@@ -97,23 +96,12 @@ module Decidim
97
96
  }
98
97
  builder = map_utility_dynamic.create_builder(self, options)
99
98
 
100
- # We need awesome map listeners before initialize the official map
101
- unless snippets.any?(:awesome_map)
102
- snippets.add(:awesome_map, javascript_pack_tag("decidim_decidim_awesome_map", defer: false))
103
- snippets.add(:awesome_map, stylesheet_pack_tag("decidim_decidim_awesome_map"))
104
- snippets.add(:head, snippets.for(:awesome_map))
105
- end
106
-
107
- unless snippets.any?(:map)
108
- snippets.add(:map, builder.stylesheet_snippets)
109
- snippets.add(:map, builder.javascript_snippets)
110
- snippets.add(:head, snippets.for(:map))
111
- end
99
+ append_stylesheet_pack_tag("decidim_decidim_awesome_map")
100
+ append_javascript_pack_tag("decidim_decidim_awesome_map")
112
101
 
113
102
  builder
114
103
  end
115
104
 
116
- # rubocop:disable Style/FormatStringToken
117
105
  def append_category(category)
118
106
  @h += @golden_ratio_conjugate
119
107
  @h %= 1
@@ -126,18 +114,16 @@ module Decidim
126
114
  color: format("#%02x%02x%02x", r, g, b)
127
115
  )
128
116
  end
129
- # rubocop:enable Style/FormatStringToken
130
- # rubocop:enable Rails/HelperInstanceVariable
131
117
 
132
118
  # HSV values in [0..1[
133
119
  # returns [r, g, b] values from 0 to 255
134
120
  # rubocop:disable Naming/MethodParameterName
135
121
  def hsv_to_rgb(h, s, v)
136
122
  h_i = (h * 6).to_i
137
- f = h * 6 - h_i
123
+ f = (h * 6) - h_i
138
124
  p = v * (1 - s)
139
- q = v * (1 - f * s)
140
- t = v * (1 - (1 - f) * s)
125
+ q = v * (1 - (f * s))
126
+ t = v * (1 - ((1 - f) * s))
141
127
  if h_i.zero?
142
128
  r = v
143
129
  g = t