decidim-decidim_awesome 0.6.7 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (257) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +181 -0
  3. data/README.md +88 -36
  4. data/Rakefile +11 -12
  5. data/app/cells/decidim/decidim_awesome/content_blocks/map/error.erb +11 -0
  6. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +14 -0
  7. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +65 -0
  8. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +65 -0
  9. data/app/cells/decidim/decidim_awesome/content_blocks/map_form_cell.rb +19 -0
  10. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +32 -0
  11. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +51 -0
  12. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +45 -0
  13. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +38 -0
  14. data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +4 -0
  15. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +47 -0
  16. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +40 -0
  17. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +40 -0
  18. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +1 -1
  19. data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +58 -0
  20. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +1 -0
  21. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +49 -0
  22. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +12 -5
  23. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +58 -0
  24. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +15 -22
  25. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +39 -18
  26. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
  27. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +91 -0
  28. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +7 -10
  29. data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +38 -0
  30. data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +38 -0
  31. data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +38 -0
  32. data/app/controllers/decidim/decidim_awesome/blank_component_controller.rb +19 -0
  33. data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +2 -3
  34. data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +1 -1
  35. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +2 -9
  36. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +41 -0
  37. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +3 -1
  38. data/app/forms/decidim/decidim_awesome/admin/custom_redirect_form.rb +45 -0
  39. data/app/forms/decidim/decidim_awesome/editor_image_form.rb +3 -2
  40. data/app/forms/decidim/decidim_awesome/proposals/proposal_wizard_create_step_form_override.rb +38 -0
  41. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +32 -15
  42. data/app/helpers/decidim/decidim_awesome/admin/system_checker_helpers.rb +36 -0
  43. data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +48 -0
  44. data/app/helpers/decidim/decidim_awesome/map_helper.rb +76 -63
  45. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +78 -0
  46. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +106 -0
  47. data/app/middleware/decidim/decidim_awesome/current_config.rb +182 -0
  48. data/app/models/decidim/decidim_awesome/awesome_config.rb +15 -0
  49. data/app/models/decidim/decidim_awesome/editor_image.rb +4 -9
  50. data/app/models/decidim/decidim_awesome/user_override.rb +25 -0
  51. data/app/packs/entrypoints/decidim_admin_decidim_awesome.js +5 -0
  52. data/app/packs/entrypoints/decidim_admin_decidim_awesome.scss +1 -0
  53. data/app/packs/entrypoints/decidim_admin_decidim_awesome_custom_fields.js +2 -0
  54. data/app/packs/entrypoints/decidim_decidim_awesome.js +9 -0
  55. data/app/packs/entrypoints/decidim_decidim_awesome.scss +1 -0
  56. data/app/packs/entrypoints/decidim_decidim_awesome_admin_form_exit_warn.js +1 -0
  57. data/app/packs/entrypoints/decidim_decidim_awesome_custom_fields.js +1 -0
  58. data/app/packs/entrypoints/decidim_decidim_awesome_iframe.scss +1 -0
  59. data/app/packs/entrypoints/decidim_decidim_awesome_map.js +5 -0
  60. data/app/packs/entrypoints/decidim_decidim_awesome_map.scss +1 -0
  61. data/app/{assets → packs}/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
  62. data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +82 -0
  63. data/app/packs/src/decidim/decidim_awesome/admin/check_redirections.js +48 -0
  64. data/app/packs/src/decidim/decidim_awesome/admin/codemirror.js +14 -0
  65. data/app/packs/src/decidim/decidim_awesome/admin/constraints.js +55 -0
  66. data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +77 -0
  67. data/app/{assets/javascripts/decidim/decidim_awesome/admin/form_exit_warn.js.es6 → packs/src/decidim/decidim_awesome/admin/form_exit_warn.js} +0 -2
  68. data/app/packs/src/decidim/decidim_awesome/admin/user_picker.js +24 -0
  69. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +23 -0
  70. data/app/packs/src/decidim/decidim_awesome/awesome_application.js +17 -0
  71. data/app/{assets/javascripts/decidim/decidim_awesome/awesome_map/api_fetcher.js.es6 → packs/src/decidim/decidim_awesome/awesome_map/api/api_fetcher.js} +1 -15
  72. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/fetcher.js +131 -0
  73. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/meetings_fetcher.js +59 -0
  74. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +52 -0
  75. data/app/packs/src/decidim/decidim_awesome/awesome_map/awesome_map.js +130 -0
  76. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +112 -0
  77. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/meetings_controller.js +31 -0
  78. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +88 -0
  79. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +221 -0
  80. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +51 -0
  81. data/app/packs/src/decidim/decidim_awesome/editors/editor.js +190 -0
  82. data/app/packs/src/decidim/decidim_awesome/editors/tabs_focus.js +22 -0
  83. data/app/{assets/javascripts/decidim/decidim_awesome/forms/autosave.js.es6 → packs/src/decidim/decidim_awesome/forms/autosave.js} +20 -17
  84. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +207 -0
  85. data/app/packs/src/decidim/decidim_awesome/forms/rich_text_plugin.js +107 -0
  86. data/app/packs/src/decidim/decidim_awesome/proposals/custom_fields.js +22 -0
  87. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +25 -0
  88. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-resize.min.js +0 -0
  89. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-upload.min.js +0 -0
  90. data/{vendor/assets/javascripts → app/packs/src/vendor}/jquery.truncate.js +0 -0
  91. data/app/packs/src/vendor/leaflet.featuregroup.subgroup.js +184 -0
  92. data/app/packs/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +16 -0
  93. data/app/packs/stylesheets/decidim/decidim_awesome/admin/check_redirections.scss +28 -0
  94. data/app/packs/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +29 -0
  95. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/constraints.scss +21 -9
  96. data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +93 -0
  97. data/app/packs/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +41 -0
  98. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin.scss +71 -0
  99. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_application.scss +19 -0
  100. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +3 -3
  101. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +176 -0
  102. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +6 -4
  103. data/app/packs/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +58 -0
  104. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -2
  105. data/app/packs/stylesheets/vendor/select2-foundation-theme.scss +348 -0
  106. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +2 -0
  107. data/app/presenters/decidim/decidim_awesome/menu_item_presenter_override.rb +25 -0
  108. data/app/presenters/decidim/decidim_awesome/menu_presenter_override.rb +23 -0
  109. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +26 -0
  110. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +4 -21
  111. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +28 -22
  112. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -0
  113. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +3 -3
  114. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +21 -0
  115. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -3
  116. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +25 -0
  117. data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +0 -2
  118. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +11 -13
  119. data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +1 -1
  120. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +3 -3
  121. data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +1 -1
  122. data/app/views/decidim/decidim_awesome/admin/custom_redirects/_form.html.erb +6 -0
  123. data/app/views/decidim/decidim_awesome/admin/custom_redirects/edit.html.erb +13 -0
  124. data/app/views/decidim/decidim_awesome/admin/custom_redirects/index.html.erb +37 -0
  125. data/app/views/decidim/decidim_awesome/admin/custom_redirects/new.html.erb +13 -0
  126. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +1 -1
  127. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +1 -1
  128. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +6 -0
  129. data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +6 -0
  130. data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +1 -1
  131. data/app/views/decidim/decidim_awesome/map_component/map/_api_ready.html.erb +3 -0
  132. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +68 -0
  133. data/app/views/decidim/decidim_awesome/map_component/map/{error.erb → error.html.erb} +2 -0
  134. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -99
  135. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +101 -0
  136. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +83 -0
  137. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -0
  138. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +34 -16
  139. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +2 -0
  140. data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
  141. data/app/views/v0.25/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
  142. data/app/views/{v0.23 → v0.25}/layouts/decidim/_head.html.erb +12 -10
  143. data/app/views/v0.25/layouts/decidim/admin/_header.html.erb +11 -0
  144. data/app/views/v0.26/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
  145. data/app/views/{v0.22 → v0.26}/layouts/decidim/_head.html.erb +18 -10
  146. data/app/views/v0.26/layouts/decidim/admin/_header.html.erb +11 -0
  147. data/config/assets.rb +46 -0
  148. data/config/i18n-tasks.yml +6 -0
  149. data/config/locales/ca.yml +135 -14
  150. data/config/locales/cs.yml +124 -3
  151. data/config/locales/en.yml +156 -11
  152. data/config/locales/es.yml +123 -2
  153. data/config/locales/eu.yml +1 -174
  154. data/config/locales/fr.yml +136 -15
  155. data/config/locales/it.yml +346 -0
  156. data/config/locales/ja.yml +345 -0
  157. data/config/locales/nl.yml +23 -5
  158. data/config/locales/pt-BR.yml +346 -0
  159. data/config/locales/pt-PT.yml +7 -0
  160. data/config/locales/pt.yml +7 -0
  161. data/config/locales/sv.yml +75 -131
  162. data/db/migrate/20210628150825_change_awesome_config_var_type.rb +12 -0
  163. data/lib/decidim/decidim_awesome/admin_engine.rb +19 -12
  164. data/lib/decidim/decidim_awesome/awesome.rb +214 -0
  165. data/lib/decidim/decidim_awesome/awesome_helpers.rb +17 -17
  166. data/lib/decidim/decidim_awesome/checksums.yml +23 -16
  167. data/lib/decidim/decidim_awesome/config.rb +55 -9
  168. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +39 -0
  169. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +27 -21
  170. data/lib/decidim/decidim_awesome/custom_fields.rb +94 -0
  171. data/lib/decidim/decidim_awesome/engine.rb +42 -14
  172. data/lib/decidim/decidim_awesome/iframe_component/admin_engine.rb +23 -0
  173. data/lib/decidim/decidim_awesome/iframe_component/component.rb +6 -6
  174. data/lib/decidim/decidim_awesome/map_component/admin_engine.rb +23 -0
  175. data/lib/decidim/decidim_awesome/map_component/component.rb +6 -5
  176. data/lib/decidim/decidim_awesome/map_component/engine.rb +34 -0
  177. data/lib/decidim/decidim_awesome/menu_hacker.rb +2 -1
  178. data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
  179. data/lib/decidim/decidim_awesome/test/factories.rb +2 -2
  180. data/lib/decidim/decidim_awesome/test/initializer.rb +25 -0
  181. data/lib/decidim/decidim_awesome/test/layouts/decidim/_head.html.erb +30 -2
  182. data/lib/decidim/decidim_awesome/test/layouts/decidim/admin/_header.html.erb +7 -2
  183. data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor.rb +116 -0
  184. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +18 -0
  185. data/lib/decidim/decidim_awesome/test/shared_examples/controller_examples.rb +13 -0
  186. data/lib/decidim/decidim_awesome/test/shared_examples/current_config_examples.rb +143 -0
  187. data/lib/decidim/decidim_awesome/test/shared_examples/custom_redirects_contexts.rb +47 -0
  188. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +4 -0
  189. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +0 -17
  190. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +420 -0
  191. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +202 -0
  192. data/lib/decidim/decidim_awesome/version.rb +2 -2
  193. data/lib/decidim/decidim_awesome.rb +4 -119
  194. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +37 -0
  195. data/lib/tasks/decidim_awesome_webpacker_tasks.rake +64 -0
  196. data/package.json +211 -0
  197. metadata +149 -107
  198. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +0 -3
  199. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +0 -2
  200. data/app/assets/config/decidim_decidim_awesome_manifest.css +0 -5
  201. data/app/assets/config/decidim_decidim_awesome_manifest.js +0 -3
  202. data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
  203. data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +0 -15
  204. data/app/assets/javascripts/decidim/decidim_awesome/admin/constraints.js.es6 +0 -54
  205. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -3
  206. data/app/assets/javascripts/decidim/decidim_awesome/application.js +0 -4
  207. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/categories.js.es6 +0 -25
  208. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +0 -48
  209. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +0 -106
  210. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -218
  211. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -83
  212. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +0 -211
  213. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +0 -56
  214. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +0 -132
  215. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +0 -107
  216. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +0 -48
  217. data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +0 -12
  218. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +0 -160
  219. data/app/assets/javascripts/decidim/decidim_awesome/proposals/images.js.es6 +0 -25
  220. data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +0 -16
  221. data/app/assets/stylesheets/decidim/decidim_awesome/admin.scss +0 -52
  222. data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +0 -8
  223. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +0 -18
  224. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +0 -161
  225. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +0 -27
  226. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +0 -7
  227. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +0 -39
  228. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +0 -64
  229. data/app/controllers/decidim/decidim_awesome/iframe_component/application_controller.rb +0 -15
  230. data/app/controllers/decidim/decidim_awesome/map_component/application_controller.rb +0 -15
  231. data/app/views/v0.22/layouts/decidim/admin/_header.html.erb +0 -11
  232. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +0 -12
  233. data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
  234. data/lib/decidim/decidim_awesome/content_renderers.rb +0 -9
  235. data/lib/decidim/decidim_awesome/test/themes/css.lvh.me.css +0 -3
  236. data/lib/decidim/decidim_awesome/test/themes/erb.lvh.me.scss.erb +0 -2
  237. data/lib/decidim/decidim_awesome/test/themes/scss.lvh.me.scss +0 -1
  238. data/lib/decidim/decidim_awesome/test/themes/test-theme/body.scss +0 -4
  239. data/vendor/assets/images/layers-2x.png +0 -0
  240. data/vendor/assets/images/layers.png +0 -0
  241. data/vendor/assets/images/marker-icon.png +0 -0
  242. data/vendor/assets/javascripts/codemirror-4.inline-attachment.js +0 -89
  243. data/vendor/assets/javascripts/codemirror.js +0 -9801
  244. data/vendor/assets/javascripts/form-storage.js +0 -824
  245. data/vendor/assets/javascripts/highlight.min.js +0 -44
  246. data/vendor/assets/javascripts/inline-attachment.js +0 -399
  247. data/vendor/assets/javascripts/inscrybmde.min.js +0 -7
  248. data/vendor/assets/javascripts/jquery.inline-attachment.js +0 -66
  249. data/vendor/assets/javascripts/jsrender.min.js +0 -4
  250. data/vendor/assets/javascripts/keymap/sublime.js +0 -720
  251. data/vendor/assets/javascripts/leaflet.featuregroup.subgroup.js +0 -6
  252. data/vendor/assets/javascripts/mode/css/css.js +0 -864
  253. data/vendor/assets/stylesheets/codemirror.css +0 -350
  254. data/vendor/assets/stylesheets/default.min.css +0 -1
  255. data/vendor/assets/stylesheets/foundation.min.css +0 -1
  256. data/vendor/assets/stylesheets/github.min.css +0 -2
  257. data/vendor/assets/stylesheets/inscrybmde.min.scss +0 -180
@@ -0,0 +1,48 @@
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 = awesome_custom_fields(attribute, form)
15
+ return decidim_amendments_form_field_for(attribute, form, original_resource) if custom_fields.blank?
16
+
17
+ render_amendment_custom_fields_override(custom_fields, attribute, form, original_resource)
18
+ end
19
+
20
+ private
21
+
22
+ def render_amendment_custom_fields_override(fields, attribute, form, original_resource)
23
+ custom_fields = Decidim::DecidimAwesome::CustomFields.new(fields)
24
+ custom_fields.translate!
25
+ body = amendments_form_fields_value(original_resource, attribute)
26
+ custom_fields.apply_xml(body) if body.present?
27
+ # TODO: find a way to add errors as form is not the parent form
28
+ # form.object.errors.add(attribute, custom_fields.errors) if custom_fields.errors
29
+ render partial: "decidim/decidim_awesome/custom_fields/form_render", locals: { spec: custom_fields.to_json, form: form, name: attribute }
30
+ end
31
+
32
+ # Amendments don't use a URL specifying participatory space and component
33
+ # context for awesome config constraints must be obtained from the resource
34
+ def awesome_custom_fields(attribute, _form)
35
+ return unless attribute == :body
36
+
37
+ component = amendable.try(:component)
38
+ return unless component
39
+ return if component.settings.participatory_texts_enabled?
40
+
41
+ awesome_config = Decidim::DecidimAwesome::Config.new(component.organization)
42
+ awesome_config.context_from_component(component)
43
+ awesome_config.collect_sub_configs_values("proposal_custom_field")
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -5,13 +5,23 @@ module Decidim
5
5
  module MapHelper
6
6
  include Decidim::MapHelper
7
7
 
8
+ def api_ready?
9
+ Decidim::Api::Schema.max_complexity >= 1300
10
+ end
11
+
12
+ # rubocop:disable Metrics/CyclomaticComplexity
13
+ # rubocop:disable Metrics/PerceivedComplexity:
8
14
  def awesome_map_for(components, &block)
9
- return legacy_map_for(components, &block) unless defined?(Decidim::Map)
15
+ return unless map_utility_dynamic
10
16
 
11
- map = dynamic_map_for({}, {}, &block)
12
- return unless map
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
22
+ end
13
23
 
14
- map_html_options = {
24
+ html_options = {
15
25
  "class" => "awesome-map",
16
26
  "id" => "awesome-map",
17
27
  "data-components" => components.map do |component|
@@ -23,75 +33,53 @@ module Decidim
23
33
  amendments: component.manifest.name == :proposals ? Decidim::Proposals::Proposal.where(component: component).only_emendations.count : 0
24
34
  }
25
35
  end.to_json,
26
- "data-collapsed" => current_component.settings.collapse,
27
- "data-truncate" => current_component.settings.truncate,
28
- "data-map-center" => current_component.settings.map_center,
29
- "data-map-zoom" => current_component.settings.map_zoom,
30
- "data-menu-amendments" => current_component.settings.menu_amendments,
31
- "data-menu-meetings" => current_component.settings.menu_meetings,
32
- "data-menu-hashtags" => current_component.settings.menu_hashtags,
33
- "data-show-not-answered" => current_component.current_settings.show_not_answered,
34
- "data-show-accepted" => current_component.current_settings.show_accepted,
35
- "data-show-withdrawn" => current_component.current_settings.show_withdrawn,
36
- "data-show-evaluating" => current_component.current_settings.show_evaluating,
37
- "data-show-rejected" => current_component.current_settings.show_rejected
38
- }
39
- content_tag(:div, map, map_html_options)
40
- end
41
-
42
- # TODO: remove when 0.22 support is diched
43
- def legacy_map_for(components)
44
- return if Decidim.geocoder.blank?
45
-
46
- map_html_options = {
47
- class: "google-map",
48
- id: "map",
49
- "data-components" => components.map do |component|
50
- {
51
- id: component.id,
52
- type: component.manifest.name,
53
- name: translated_attribute(component.name),
54
- url: Decidim::EngineRouter.main_proxy(component).root_path,
55
- amendments: component.manifest.name == :proposals ? Decidim::Proposals::Proposal.where(component: component).only_emendations.count : 0
56
- }
57
- end.to_json,
58
- "data-collapsed" => current_component.settings.collapse,
59
- "data-show-not-answered" => current_component.current_settings.show_not_answered,
60
- "data-show-accepted" => current_component.current_settings.show_accepted,
61
- "data-show-withdrawn" => current_component.current_settings.show_withdrawn,
62
- "data-show-evaluating" => current_component.current_settings.show_evaluating,
63
- "data-show-rejected" => current_component.current_settings.show_rejected,
64
- "data-markers-data" => [].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
65
51
  }
66
52
 
67
- if Decidim.geocoder[:here_api_key]
68
- map_html_options["data-here-api-key"] = Decidim.geocoder[:here_api_key]
69
- else
70
- # Compatibility mode for old api_id/app_code configurations
71
- map_html_options["data-here-app-id"] = Decidim.geocoder[:here_app_id]
72
- map_html_options["data-here-app-code"] = Decidim.geocoder[:here_app_code]
53
+ content_tag(:div, html_options) do
54
+ content_tag :div, class: "row column" do
55
+ help + map
56
+ end
73
57
  end
58
+ end
59
+ # rubocop:enable Metrics/CyclomaticComplexity
60
+ # rubocop:enable Metrics/PerceivedComplexity:
74
61
 
75
- content = capture { yield }.html_safe
76
- help = content_tag(:div, class: "map__help") do
77
- content_tag(:p, I18n.t("screen_reader_explanation", scope: "decidim.map.dynamic"), class: "show-for-sr")
78
- end
79
- content_tag :div, class: "awesome-map" do
80
- map = content_tag(:div, "", map_html_options)
62
+ def step_settings
63
+ settings_source.try(:current_settings)
64
+ end
81
65
 
82
- help + map + content
83
- end
66
+ def global_settings
67
+ settings_source.try(:settings)
68
+ end
69
+
70
+ def settings_source
71
+ try(:current_component) || self
84
72
  end
85
73
 
86
74
  # rubocop:disable Rails/HelperInstanceVariable
87
- def current_categories
75
+ def current_categories(categories)
88
76
  return @current_categories if @current_categories
89
77
 
90
78
  @golden_ratio_conjugate = 0.618033988749895
91
79
  # @h = rand # use random start value
92
- @h = 0.4
80
+ @h = 0.41
93
81
  @current_categories = []
94
- current_participatory_space.categories.first_class.each do |category|
82
+ categories.first_class.each do |category|
95
83
  append_category category
96
84
  category.subcategories.each do |subcat|
97
85
  append_category subcat
@@ -102,11 +90,35 @@ module Decidim
102
90
 
103
91
  private
104
92
 
93
+ def awesome_builder
94
+ options = {
95
+ popup_template_id: "marker-popup",
96
+ markers: []
97
+ }
98
+ builder = map_utility_dynamic.create_builder(self, options)
99
+
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
112
+
113
+ builder
114
+ end
115
+
116
+ # rubocop:disable Style/FormatStringToken
105
117
  def append_category(category)
106
118
  @h += @golden_ratio_conjugate
107
119
  @h %= 1
108
120
  # r,g,b = hsv_to_rgb(@h, 0.5, 0.95)
109
- r, g, b = hsv_to_rgb(@h, 0.99, 0.96)
121
+ r, g, b = hsv_to_rgb(@h, 0.99, 0.95)
110
122
  @current_categories.append(
111
123
  id: category.id,
112
124
  name: translated_attribute(category.name),
@@ -114,11 +126,12 @@ module Decidim
114
126
  color: format("#%02x%02x%02x", r, g, b)
115
127
  )
116
128
  end
129
+ # rubocop:enable Style/FormatStringToken
117
130
  # rubocop:enable Rails/HelperInstanceVariable
118
131
 
119
- # rubocop:disable Naming/UncommunicativeMethodParamName
120
132
  # HSV values in [0..1[
121
133
  # returns [r, g, b] values from 0 to 255
134
+ # rubocop:disable Naming/MethodParameterName
122
135
  def hsv_to_rgb(h, s, v)
123
136
  h_i = (h * 6).to_i
124
137
  f = h * 6 - h_i
@@ -157,7 +170,7 @@ module Decidim
157
170
  end
158
171
  [(r * 256).to_i, (g * 256).to_i, (b * 256).to_i]
159
172
  end
160
- # rubocop:enable Naming/UncommunicativeMethodParamName
161
173
  end
174
+ # rubocop:enable Naming/MethodParameterName
162
175
  end
163
176
  end
@@ -0,0 +1,78 @@
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_safe_content?, :safe_content?
12
+
13
+ # replace safe content to consider all custom fields save (then embeded html will be rendered)
14
+ def safe_content?
15
+ awesome_proposal_custom_fields.present? || decidim_safe_content?
16
+ end
17
+
18
+ # replace normal method to draw the editor
19
+ def text_editor_for_proposal_body(form)
20
+ custom_fields = awesome_proposal_custom_fields
21
+
22
+ return decidim_text_editor_for_proposal_body(form) if custom_fields.blank?
23
+
24
+ render_proposal_custom_fields_override(custom_fields, form, :body)
25
+ end
26
+
27
+ # replace admin method to draw the editor (multi lang)
28
+ def admin_editor_for_proposal_body(form)
29
+ custom_fields = awesome_proposal_custom_fields
30
+
31
+ return form.translated(:editor, :body, hashtaggable: true) if custom_fields.blank?
32
+
33
+ locales = form.send(:locales)
34
+
35
+ return render_proposal_custom_fields_override(custom_fields, form, "body_#{locales.first}", locales.first) if locales.length == 1
36
+
37
+ tabs_id = form.send(:sanitize_tabs_selector, form.options[:tabs_id] || "#{form.object_name}-body-tabs")
38
+
39
+ label_tabs = form.content_tag(:div, class: "label--tabs") do
40
+ field_label = form.send(:label_i18n, "body", form.label_for("proposal_custom_fields"))
41
+
42
+ language_selector = "".html_safe
43
+ language_selector = form.create_language_selector(locales, tabs_id, "body") if form.options[:label] != false
44
+
45
+ safe_join [field_label, language_selector]
46
+ end
47
+
48
+ tabs_content = form.content_tag(:div, class: "tabs-content", data: { tabs_content: tabs_id }) do
49
+ locales.each_with_index.inject("".html_safe) do |string, (locale, index)|
50
+ tab_content_id = "#{tabs_id}-body-panel-#{index}"
51
+ string + content_tag(:div, class: form.send(:tab_element_class_for, "panel", index), id: tab_content_id) do
52
+ render_proposal_custom_fields_override(custom_fields, form, "body_#{locale}", locale)
53
+ end
54
+ end
55
+ end
56
+
57
+ safe_join [label_tabs, tabs_content]
58
+ end
59
+
60
+ def render_proposal_custom_fields_override(fields, form, name, locale = nil)
61
+ custom_fields = Decidim::DecidimAwesome::CustomFields.new(fields)
62
+ custom_fields.translate!
63
+
64
+ body = if form_presenter.proposal.body.is_a?(Hash) && locale.present?
65
+ form_presenter.body(extras: false, all_locales: true).with_indifferent_access[locale]
66
+ else
67
+ form_presenter.body(extras: false)
68
+ end
69
+
70
+ custom_fields.apply_xml(body) if body.present?
71
+ form.object.errors.add(name, custom_fields.errors) if custom_fields.errors
72
+ render partial: "decidim/decidim_awesome/custom_fields/form_render", locals: { spec: custom_fields.to_json, form: form, name: name }
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class MigrateLegacyImagesJob < ApplicationJob
6
+ queue_as :default
7
+
8
+ def perform(organization_id, mappings = [], logger = Rails.logger)
9
+ @organization_id = organization_id
10
+ @routes_mappings = mappings
11
+ @logger = logger
12
+
13
+ migrate_all!
14
+ transform_images_urls
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :routes_mappings, :logger
20
+
21
+ def migrate_all!
22
+ Decidim::CarrierWaveMigratorService.migrate_attachment!(
23
+ klass: Decidim::DecidimAwesome::EditorImage,
24
+ cw_attribute: "image",
25
+ cw_uploader: Decidim::Cw::DecidimAwesome::ImageUploader,
26
+ as_attribute: "file",
27
+ logger: @logger,
28
+ routes_mappings: routes_mappings
29
+ )
30
+ end
31
+
32
+ def transform_images_urls
33
+ mappings = routes_mappings.map do |mapping|
34
+ klass, id = mapping[:instance].split("#")
35
+ next unless klass == "Decidim::DecidimAwesome::EditorImage"
36
+
37
+ instance = Decidim::DecidimAwesome::EditorImage.find_by(id: id)
38
+
39
+ next if instance.blank?
40
+
41
+ mapping.merge!(instance: instance)
42
+ end.compact
43
+
44
+ editor_images_available_attributes.each do |model, attributes|
45
+ model.all.each do |item|
46
+ attributes.each do |attribute|
47
+ item.update(attribute => rewrite_value(item.send(attribute), mappings))
48
+ end
49
+ end
50
+ @logger.info "Updated model #{model.name} (attributes: #{attributes.join(", ")})"
51
+ end
52
+ end
53
+
54
+ def rewrite_value(value, mappings)
55
+ if value.is_a?(Hash)
56
+ value.transform_values do |nested_value|
57
+ rewrite_value(nested_value, mappings)
58
+ end
59
+ else
60
+ parser = Decidim::DecidimAwesome::ContentParsers::EditorImagesParser.new(value, routes_mappings: mappings)
61
+ parser.rewrite
62
+ end
63
+ end
64
+
65
+ def editor_images_available_attributes
66
+ {
67
+ "Decidim::Accountability::Result" => %w(description),
68
+ "Decidim::Proposals::Proposal" => %w(body answer cost_report execution_period),
69
+ "Decidim::Votings::Voting" => %w(description),
70
+ "Decidim::Elections::Question" => %w(description),
71
+ "Decidim::Elections::Answer" => %w(description),
72
+ "Decidim::Elections::Election" => %w(description),
73
+ "Decidim::Initiative" => %w(description answer),
74
+ "Decidim::InitiativesType" => %w(description extra_fields_legal_information),
75
+ "Decidim::Assembly" => %w(short_description description purpose_of_action composition internal_organisation announcement closing_date_reason special_features),
76
+ "Decidim::Forms::Questionnaire" => %w(description tos),
77
+ "Decidim::Forms::Question" => %w(description),
78
+ "Decidim::Organization" => %w(welcome_notification_body admin_terms_of_use_body description highlighted_content_banner_short_description id_documents_explanation_text),
79
+ "Decidim::StaticPage" => %w(content),
80
+ "Decidim::ContextualHelpSection" => %w(content),
81
+ "Decidim::Category" => %w(description),
82
+ "Decidim::Blogs::Post" => %w(body),
83
+ "Decidim::Pages::Page" => %w(body),
84
+ "Decidim::Sortitions::Sortition" => %w(additional_info witnesses cancel_reason),
85
+ "Decidim::Consultations::Question" => %w(title question_context what_is_decided instructions),
86
+ "Decidim::Consultation" => %w(description),
87
+ "Decidim::Debates::Debate" => %w(description instructions information_updates conclusions),
88
+ "Decidim::Budgets::Budget" => %w(description),
89
+ "Decidim::Budgets::Project" => %w(description),
90
+ "Decidim::ConferenceSpeaker" => %w(short_bio),
91
+ "Decidim::Conferences::RegistrationType" => %w(description),
92
+ "Decidim::Conference" => %w(short_description description objectives registration_terms),
93
+ "Decidim::ParticipatoryProcessGroup" => %w(description),
94
+ "Decidim::ParticipatoryProcess" => %w(short_description description announcement),
95
+ "Decidim::ParticipatoryProcessStep" => %w(description),
96
+ "Decidim::Meetings::AgendaItem" => %w(description),
97
+ "Decidim::Meetings::Meeting" => %w(registration_terms description registration_email_custom_content closing_report)
98
+ }.each_with_object({}) do |(main_model, attributes), hash|
99
+ hash[main_model.constantize] = attributes
100
+ rescue NameError
101
+ hash
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ # A middleware that stores the current awesome context by parsing the request
6
+ class CurrentConfig
7
+ # Initializes the Rack Middleware.
8
+ #
9
+ # app - The Rack application
10
+ def initialize(app)
11
+ @app = app
12
+ end
13
+
14
+ # Main entry point for a Rack Middleware.
15
+ #
16
+ # env - A Hash.
17
+ def call(env)
18
+ @request = Rack::Request.new(env)
19
+ if @request.env["decidim.current_organization"] && processable_path?
20
+ @config = awesome_config_instance
21
+ env["decidim_awesome.current_config"] = @config
22
+ tamper_user_model
23
+ add_flash_message_from_request(env)
24
+
25
+ # puts "requested path: #{env["PATH_INFO"]}"
26
+ # puts "current_organization: #{@request.env["decidim.current_organization"]&.id}"
27
+ # puts "potential_admins: #{Decidim::User.awesome_potential_admins}"
28
+ # puts "scoped admins: #{Decidim::User.awesome_admins_for_current_scope}"
29
+ else
30
+ reset_user_model
31
+ end
32
+
33
+ @app.call(env)
34
+ end
35
+
36
+ private
37
+
38
+ # a workaround to set a flash message if comming from the error controller (route not found)
39
+ def add_flash_message_from_request(env)
40
+ return unless scoped_admins_active?
41
+ return unless @request.params.has_key? "unauthorized"
42
+
43
+ env["rack.session"]["flash"] = ActionDispatch::Flash::FlashHash.new(alert: I18n.t("decidim.core.actions.unauthorized")).to_session_value
44
+ end
45
+
46
+ def awesome_config_instance
47
+ @awesome_config_instance = Config.new @request.env["decidim.current_organization"]
48
+ @awesome_config_instance.context_from_request @request
49
+ @awesome_config_instance
50
+ end
51
+
52
+ def reset_user_model
53
+ return unless scoped_admins_active?
54
+
55
+ Decidim::User.awesome_potential_admins = []
56
+ Decidim::User.awesome_admins_for_current_scope = []
57
+ end
58
+
59
+ def tamper_user_model
60
+ return unless scoped_admins_active?
61
+
62
+ Decidim::User.awesome_potential_admins = potential_admins
63
+
64
+ Decidim::User.awesome_admins_for_current_scope = if safe_get_route? || safe_post_route?
65
+ Decidim::User.awesome_potential_admins
66
+ else
67
+ valid_admins
68
+ end
69
+ end
70
+
71
+ def potential_admins
72
+ @config.collect_sub_configs_values("scoped_admin") do |subconfig|
73
+ subconfig&.constraints&.detect { |c| c.settings["participatory_space_manifest"] == "none" } ? false : true
74
+ end.flatten.uniq.map(&:to_i)
75
+ end
76
+
77
+ def valid_admins
78
+ @config.collect_sub_configs_values("scoped_admin") do |subconfig|
79
+ # allow index controllers if scoped to a subspace/component
80
+ constraints = subconfig&.constraints || []
81
+ additional_constraints = additional_get_constraints(constraints) + additional_post_constraints(constraints)
82
+ # inject additional constraints here for further use
83
+ @config.inject_sub_config_constraints("scoped_admin", subconfig.var[13..], additional_constraints) if subconfig
84
+ @config.valid_in_context?(constraints + additional_constraints)
85
+ end.flatten.uniq.map(&:to_i)
86
+ end
87
+
88
+ # avoid unnecessary processing for non-user routes
89
+ def processable_path?
90
+ return true if safe_get_route?
91
+
92
+ spaces = ContextAnalyzers::RequestAnalyzer.participatory_spaces_routes.keys.join("|^(/admin){0,1}/")
93
+ case @request.path
94
+ when %r{"|^(/admin){0,1}/#{spaces}}
95
+ true
96
+ when %r{^/admin/}
97
+ true
98
+ end
99
+ end
100
+
101
+ def safe_get_route?
102
+ return unless @request.get?
103
+
104
+ case @request.path
105
+ when "/"
106
+ true
107
+ when "/admin/"
108
+ true
109
+ when %r{^/admin/admin_terms}
110
+ true
111
+ when %r{^/profiles/|^/notifications/|^/conversations/|^/pages/}
112
+ true
113
+ end
114
+ end
115
+
116
+ def safe_post_route?
117
+ return unless @request.post? || @request.put? || @request.patch?
118
+
119
+ case @request.path
120
+ when %r{^/admin/admin_terms}
121
+ true
122
+ end
123
+ end
124
+
125
+ # to access certain deeper routes it requires first to click on a parent route, even without Post permissions in there
126
+ # this adds this additional routes to these cases
127
+ # For instance:
128
+ # accessing /admin/participatory_processes/som-procress requires access first to /admin/participatory_processes
129
+ def additional_get_constraints(constraints)
130
+ return [] unless @request.get?
131
+
132
+ additions = []
133
+ constraints.each do |constraint|
134
+ next if constraint.settings["participatory_space_manifest"].blank?
135
+
136
+ # processes groups must give access to processes generic url
137
+ if constraint.settings["participatory_space_manifest"] == "process_groups"
138
+ additions << OpenStruct.new(settings: { "participatory_space_manifest" => "participatory_processes", "match" => "exclusive" })
139
+ end
140
+
141
+ # adds a exclusive constraint to the parent participatory space (so index page can be accessed)
142
+ next unless constraint.settings.size > 1
143
+
144
+ additions << OpenStruct.new(settings: {
145
+ "participatory_space_manifest" => constraint.settings["participatory_space_manifest"],
146
+ "match" => "exclusive"
147
+ })
148
+ end
149
+
150
+ additions
151
+ end
152
+
153
+ # adds access to REST routes with id instead of the slug ot allow editing
154
+ # rubocop:disable Metrics/CyclomaticComplexity
155
+ # rubocop:disable Metrics/PerceivedComplexity
156
+ def additional_post_constraints(constraints)
157
+ return [] unless @request.post? || @request.patch?
158
+
159
+ constraints.filter_map do |constraint|
160
+ settings = constraint.settings.dup
161
+ next unless settings["participatory_space_manifest"].present? && settings["participatory_space_slug"].present?
162
+
163
+ # replicate the constraint with the id of the participatory space
164
+ manifest = Decidim.participatory_space_manifests.find { |s| s.name.to_s == settings["participatory_space_manifest"] }
165
+ next unless manifest
166
+
167
+ model = manifest.model_class_name.try(:constantize)
168
+ next unless model
169
+
170
+ settings["participatory_space_slug"] = model.find_by(slug: settings["participatory_space_slug"])&.id
171
+ OpenStruct.new(settings: settings) if settings["participatory_space_slug"]
172
+ end
173
+ end
174
+ # rubocop:enable Metrics/CyclomaticComplexity
175
+ # rubocop:enable Metrics/PerceivedComplexity
176
+
177
+ def scoped_admins_active?
178
+ Decidim::User.respond_to?(:awesome_admins_for_current_scope) && Decidim::User.respond_to?(:awesome_potential_admins)
179
+ end
180
+ end
181
+ end
182
+ end
@@ -15,9 +15,24 @@ module Decidim
15
15
  validates :organization, presence: true
16
16
  validates :var, uniqueness: { scope: :decidim_organization_id }
17
17
 
18
+ def additional_constraints
19
+ @additional_constraints ||= []
20
+ end
21
+
22
+ def add_constraints(constraints)
23
+ return if constraints.blank?
24
+
25
+ additional_constraints.concat(constraints.respond_to?(:each) ? constraints : [constraints])
26
+ end
27
+
18
28
  def self.for_organization(organization)
19
29
  where(organization: organization)
20
30
  end
31
+
32
+ # use this instead of "constraints" to evaluate dynamically added constants
33
+ def all_constraints
34
+ constraints + additional_constraints
35
+ end
21
36
  end
22
37
  end
23
38
  end
@@ -3,6 +3,8 @@
3
3
  module Decidim
4
4
  module DecidimAwesome
5
5
  class EditorImage < ApplicationRecord
6
+ include Decidim::HasUploadValidations
7
+
6
8
  self.table_name = "decidim_awesome_editor_images"
7
9
 
8
10
  belongs_to :author, foreign_key: :decidim_author_id, class_name: "Decidim::User"
@@ -11,15 +13,8 @@ module Decidim
11
13
  validates :organization, presence: true
12
14
  validates :author, presence: true
13
15
 
14
- validates :image, presence: true
15
- # validates :image,
16
- # file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
17
- # file_content_type: { allow: ["image/jpeg", "image/png"] }
18
-
19
- mount_uploader :image, Decidim::DecidimAwesome::ImageUploader
20
-
21
- delegate :url, to: :image
22
- delegate :thumbnail, to: :image
16
+ has_one_attached :file
17
+ validates_upload :file, uploader: Decidim::DecidimAwesome::ImageUploader
23
18
  end
24
19
  end
25
20
  end