decidim-decidim_awesome 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -35
  3. data/Rakefile +11 -12
  4. data/app/cells/decidim/decidim_awesome/content_blocks/map/error.erb +11 -0
  5. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +1 -61
  6. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +11 -0
  7. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +8 -4
  8. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +51 -0
  9. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +47 -0
  10. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +49 -0
  11. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +12 -5
  12. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +58 -0
  13. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +15 -22
  14. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +9 -1
  15. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +91 -0
  16. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +5 -8
  17. data/app/controllers/decidim/decidim_awesome/blank_component_controller.rb +19 -0
  18. data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +2 -3
  19. data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +1 -1
  20. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +2 -6
  21. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +2 -0
  22. data/app/forms/decidim/decidim_awesome/admin/custom_redirect_form.rb +45 -0
  23. data/app/forms/decidim/decidim_awesome/editor_image_form.rb +3 -2
  24. data/app/forms/decidim/decidim_awesome/proposals/proposal_wizard_create_step_form_override.rb +38 -0
  25. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +22 -9
  26. data/app/helpers/decidim/decidim_awesome/admin/system_checker_helpers.rb +36 -0
  27. data/app/helpers/decidim/decidim_awesome/map_helper.rb +18 -12
  28. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +2 -2
  29. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +106 -0
  30. data/app/models/decidim/decidim_awesome/editor_image.rb +4 -9
  31. data/app/packs/entrypoints/decidim_admin_decidim_awesome.js +5 -0
  32. data/app/packs/entrypoints/decidim_admin_decidim_awesome.scss +1 -0
  33. data/app/packs/entrypoints/decidim_admin_decidim_awesome_custom_fields.js +2 -0
  34. data/app/packs/entrypoints/decidim_decidim_awesome.js +9 -0
  35. data/app/packs/entrypoints/decidim_decidim_awesome.scss +1 -0
  36. data/app/packs/entrypoints/decidim_decidim_awesome_admin_form_exit_warn.js +1 -0
  37. data/app/packs/entrypoints/decidim_decidim_awesome_custom_fields.js +1 -0
  38. data/app/packs/entrypoints/decidim_decidim_awesome_iframe.scss +1 -0
  39. data/app/packs/entrypoints/decidim_decidim_awesome_map.js +5 -0
  40. data/app/packs/entrypoints/decidim_decidim_awesome_map.scss +1 -0
  41. data/app/{assets → packs}/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
  42. data/app/{assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 → packs/src/decidim/decidim_awesome/admin/auto_edit.js} +39 -34
  43. data/app/packs/src/decidim/decidim_awesome/admin/check_redirections.js +48 -0
  44. data/app/{assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 → packs/src/decidim/decidim_awesome/admin/codemirror.js} +4 -4
  45. data/app/packs/src/decidim/decidim_awesome/admin/constraints.js +55 -0
  46. data/app/{assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 → packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js} +23 -26
  47. 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
  48. data/app/{assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 → packs/src/decidim/decidim_awesome/admin/user_picker.js} +3 -3
  49. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +23 -0
  50. data/app/packs/src/decidim/decidim_awesome/awesome_application.js +17 -0
  51. 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
  52. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/fetcher.js +131 -0
  53. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/meetings_fetcher.js +59 -0
  54. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +52 -0
  55. data/app/packs/src/decidim/decidim_awesome/awesome_map/awesome_map.js +130 -0
  56. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +112 -0
  57. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/meetings_controller.js +31 -0
  58. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +88 -0
  59. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +221 -0
  60. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +51 -0
  61. data/app/packs/src/decidim/decidim_awesome/editors/editor.js +190 -0
  62. data/app/{assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 → packs/src/decidim/decidim_awesome/editors/tabs_focus.js} +4 -6
  63. data/app/{assets/javascripts/decidim/decidim_awesome/forms/autosave.js.es6 → packs/src/decidim/decidim_awesome/forms/autosave.js} +20 -17
  64. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +207 -0
  65. data/app/{assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 → packs/src/decidim/decidim_awesome/forms/rich_text_plugin.js} +21 -20
  66. data/app/packs/src/decidim/decidim_awesome/proposals/custom_fields.js +22 -0
  67. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +25 -0
  68. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-resize.min.js +0 -0
  69. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-upload.min.js +0 -0
  70. data/{vendor/assets/javascripts → app/packs/src/vendor}/jquery.truncate.js +0 -0
  71. data/app/packs/src/vendor/leaflet.featuregroup.subgroup.js +184 -0
  72. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +2 -1
  73. data/app/packs/stylesheets/decidim/decidim_awesome/admin/check_redirections.scss +28 -0
  74. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +8 -6
  75. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/constraints.scss +13 -13
  76. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +37 -10
  77. data/app/packs/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +41 -0
  78. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin.scss +71 -0
  79. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_application.scss +19 -0
  80. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +3 -3
  81. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +176 -0
  82. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +6 -4
  83. data/app/packs/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +58 -0
  84. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -2
  85. data/app/packs/stylesheets/vendor/select2-foundation-theme.scss +348 -0
  86. data/app/presenters/decidim/decidim_awesome/menu_item_presenter_override.rb +25 -0
  87. data/app/presenters/decidim/decidim_awesome/menu_presenter_override.rb +23 -0
  88. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +26 -0
  89. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +4 -16
  90. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +28 -22
  91. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +1 -1
  92. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +1 -1
  93. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -0
  94. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +1 -1
  95. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +7 -6
  96. data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +1 -1
  97. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +3 -3
  98. data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +1 -1
  99. data/app/views/decidim/decidim_awesome/admin/custom_redirects/_form.html.erb +6 -0
  100. data/app/views/decidim/decidim_awesome/admin/custom_redirects/edit.html.erb +13 -0
  101. data/app/views/decidim/decidim_awesome/admin/custom_redirects/index.html.erb +37 -0
  102. data/app/views/decidim/decidim_awesome/admin/custom_redirects/new.html.erb +13 -0
  103. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +1 -1
  104. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +1 -1
  105. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +5 -3
  106. data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +1 -1
  107. data/app/views/decidim/decidim_awesome/map_component/map/_api_ready.html.erb +3 -0
  108. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +68 -0
  109. data/app/views/decidim/decidim_awesome/map_component/map/{error.erb → error.html.erb} +2 -0
  110. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -67
  111. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  112. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +13 -9
  113. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +0 -2
  114. data/app/views/{v0.24 → v0.25}/decidim/proposals/collaborative_drafts/_show.html.erb +0 -0
  115. data/app/views/{v0.23 → v0.25}/layouts/decidim/_head.html.erb +12 -10
  116. data/app/views/v0.25/layouts/decidim/admin/_header.html.erb +11 -0
  117. data/app/views/{v0.23 → v0.26}/decidim/proposals/collaborative_drafts/_show.html.erb +1 -7
  118. data/app/views/{v0.24 → v0.26}/layouts/decidim/_head.html.erb +16 -10
  119. data/app/views/v0.26/layouts/decidim/admin/_header.html.erb +11 -0
  120. data/config/assets.rb +46 -0
  121. data/config/i18n-tasks.yml +6 -0
  122. data/config/locales/ca.yml +75 -13
  123. data/config/locales/cs.yml +63 -1
  124. data/config/locales/en.yml +67 -1
  125. data/config/locales/es.yml +63 -1
  126. data/config/locales/eu.yml +0 -232
  127. data/config/locales/fr.yml +115 -53
  128. data/config/locales/it.yml +63 -1
  129. data/config/locales/ja.yml +64 -3
  130. data/config/locales/nl.yml +5 -46
  131. data/config/locales/pt-BR.yml +346 -0
  132. data/config/locales/pt-PT.yml +7 -0
  133. data/config/locales/pt.yml +7 -0
  134. data/config/locales/sv.yml +67 -182
  135. data/lib/decidim/decidim_awesome/admin_engine.rb +10 -15
  136. data/lib/decidim/decidim_awesome/awesome.rb +214 -0
  137. data/lib/decidim/decidim_awesome/awesome_helpers.rb +0 -7
  138. data/lib/decidim/decidim_awesome/checksums.yml +13 -16
  139. data/lib/decidim/decidim_awesome/config.rb +1 -0
  140. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +39 -0
  141. data/lib/decidim/decidim_awesome/engine.rb +27 -55
  142. data/lib/decidim/decidim_awesome/iframe_component/admin_engine.rb +23 -0
  143. data/lib/decidim/decidim_awesome/iframe_component/component.rb +5 -5
  144. data/lib/decidim/decidim_awesome/map_component/admin_engine.rb +23 -0
  145. data/lib/decidim/decidim_awesome/map_component/component.rb +5 -4
  146. data/lib/decidim/decidim_awesome/map_component/engine.rb +34 -0
  147. data/lib/decidim/decidim_awesome/menu_hacker.rb +1 -0
  148. data/lib/decidim/decidim_awesome/test/factories.rb +2 -2
  149. data/lib/decidim/decidim_awesome/test/initializer.rb +25 -0
  150. data/lib/decidim/decidim_awesome/test/layouts/decidim/_head.html.erb +30 -2
  151. data/lib/decidim/decidim_awesome/test/layouts/decidim/admin/_header.html.erb +7 -2
  152. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +18 -0
  153. data/lib/decidim/decidim_awesome/test/shared_examples/controller_examples.rb +13 -0
  154. data/lib/decidim/decidim_awesome/test/shared_examples/custom_redirects_contexts.rb +47 -0
  155. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +0 -17
  156. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +9 -17
  157. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +202 -0
  158. data/lib/decidim/decidim_awesome/version.rb +2 -2
  159. data/lib/decidim/decidim_awesome.rb +4 -152
  160. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +37 -0
  161. data/lib/tasks/decidim_awesome_webpacker_tasks.rake +62 -0
  162. metadata +111 -113
  163. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +0 -3
  164. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +0 -2
  165. data/app/assets/config/decidim_decidim_awesome_manifest.css +0 -5
  166. data/app/assets/config/decidim_decidim_awesome_manifest.js +0 -4
  167. data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +0 -2
  168. data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +0 -4
  169. data/app/assets/javascripts/decidim/decidim_awesome/admin/constraints.js.es6 +0 -54
  170. data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +0 -80
  171. data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +0 -7
  172. data/app/assets/javascripts/decidim/decidim_awesome/awesome_application.js +0 -3
  173. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/categories.js.es6 +0 -25
  174. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +0 -48
  175. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +0 -107
  176. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +0 -15
  177. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +0 -207
  178. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +0 -56
  179. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +0 -132
  180. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +0 -107
  181. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +0 -57
  182. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +0 -172
  183. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +0 -185
  184. data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +0 -211
  185. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +0 -7
  186. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +0 -3
  187. data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +0 -21
  188. data/app/assets/javascripts/decidim/decidim_awesome/proposals/images.js.es6 +0 -25
  189. data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +0 -35
  190. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_admin.scss +0 -64
  191. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +0 -22
  192. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +0 -18
  193. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +0 -160
  194. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +0 -22
  195. data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +0 -28
  196. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +0 -39
  197. data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +0 -39
  198. data/app/controllers/decidim/decidim_awesome/iframe_component/application_controller.rb +0 -15
  199. data/app/controllers/decidim/decidim_awesome/map_component/application_controller.rb +0 -15
  200. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +0 -12
  201. data/app/views/v0.24/layouts/decidim/admin/_header.html.erb +0 -12
  202. data/lib/decidim/decidim_awesome/test/themes/css.lvh.me.css +0 -3
  203. data/lib/decidim/decidim_awesome/test/themes/erb.lvh.me.scss.erb +0 -2
  204. data/lib/decidim/decidim_awesome/test/themes/scss.lvh.me.scss +0 -1
  205. data/lib/decidim/decidim_awesome/test/themes/test-theme/body.scss +0 -4
  206. data/vendor/assets/images/layers-2x.png +0 -0
  207. data/vendor/assets/images/layers.png +0 -0
  208. data/vendor/assets/images/marker-icon.png +0 -0
  209. data/vendor/assets/javascripts/codemirror-4.inline-attachment.js +0 -89
  210. data/vendor/assets/javascripts/codemirror.js +0 -9801
  211. data/vendor/assets/javascripts/delta.min.js +0 -405
  212. data/vendor/assets/javascripts/delta.min.js.map +0 -1
  213. data/vendor/assets/javascripts/europa.min.js +0 -4
  214. data/vendor/assets/javascripts/form-builder.min.js +0 -19
  215. data/vendor/assets/javascripts/form-render.min.js +0 -19
  216. data/vendor/assets/javascripts/form-storage.js +0 -824
  217. data/vendor/assets/javascripts/highlight.min.js +0 -44
  218. data/vendor/assets/javascripts/inline-attachment.js +0 -399
  219. data/vendor/assets/javascripts/inscrybmde.min.js +0 -7
  220. data/vendor/assets/javascripts/jquery-ui.min.js +0 -13
  221. data/vendor/assets/javascripts/jquery.inline-attachment.js +0 -66
  222. data/vendor/assets/javascripts/jsrender.min.js +0 -4
  223. data/vendor/assets/javascripts/keymap/sublime.js +0 -720
  224. data/vendor/assets/javascripts/leaflet.featuregroup.subgroup.js +0 -6
  225. data/vendor/assets/javascripts/mode/css/css.js +0 -864
  226. data/vendor/assets/javascripts/select2.js +0 -6147
  227. data/vendor/assets/langs/en-US.lang +0 -110
  228. data/vendor/assets/stylesheets/codemirror.css +0 -350
  229. data/vendor/assets/stylesheets/default.min.css +0 -1
  230. data/vendor/assets/stylesheets/foundation.min.css +0 -1
  231. data/vendor/assets/stylesheets/github.min.css +0 -2
  232. data/vendor/assets/stylesheets/inscrybmde.min.scss +0 -194
  233. data/vendor/assets/stylesheets/jquery-ui.min.css +0 -7
  234. data/vendor/assets/stylesheets/select2-foundation-theme.css +0 -249
  235. data/vendor/assets/stylesheets/select2.css +0 -515
@@ -115,6 +115,7 @@ module Decidim
115
115
  # collect_sub_configs_values("scoped_style") { true }
116
116
  def collect_sub_configs_values(singular_key)
117
117
  plural_key = singular_key.pluralize.to_sym
118
+ return [] unless config[plural_key].respond_to?(:filter)
118
119
 
119
120
  fields = config[plural_key]&.filter do |key, _value|
120
121
  subconfig = sub_configs_for(singular_key)[key]
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContentParsers
6
+ # A parser that searches for editor images from CarrierWave in html
7
+ # contents and replaces them with migrated images to ActiveStorage
8
+ #
9
+ # @see BaseParser Examples of how to use a content parser
10
+ class EditorImagesParser < Decidim::ContentParsers::BaseParser
11
+ # @return [String] the content with the CarrierWave images replaced.
12
+ def rewrite
13
+ return content if editor_images.blank?
14
+
15
+ replace_editor_images
16
+ parsed_content.to_html
17
+ end
18
+
19
+ def editor_images
20
+ @editor_images ||= parsed_content.search(:img).index_with do |image|
21
+ context[:routes_mappings].find { |mapping| image.attr(:src).end_with?(mapping[:origin_path]) }
22
+ end.compact
23
+ end
24
+
25
+ private
26
+
27
+ def parsed_content
28
+ @parsed_content ||= Nokogiri::HTML(content)
29
+ end
30
+
31
+ def replace_editor_images
32
+ editor_images.each do |image, mapping|
33
+ image.set_attribute(:src, mapping[:instance].attached_uploader(:file).path)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -16,79 +16,51 @@ module Decidim
16
16
  post :editor_images, to: "editor_images#create"
17
17
  end
18
18
 
19
- initializer "decidim.middleware" do |app|
20
- app.config.middleware.insert_after Decidim::CurrentOrganization, Decidim::DecidimAwesome::CurrentConfig
21
- end
22
-
23
19
  # Prepare a zone to create overrides
24
20
  # https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
25
21
  # overrides
26
22
  config.to_prepare do
27
- if DecidimAwesome.config[:scoped_admins] != :disabled
28
- # override user's admin property
29
- Decidim::User.include(UserOverride)
30
- # redirect unauthorized scoped admins to allowed places
31
- Decidim::ErrorsController.include(AdminNotFoundRedirect)
23
+ # activate Decidim LayoutHelper for the overriden views
24
+ ActiveSupport.on_load :action_controller do
25
+ helper Decidim::LayoutHelper if respond_to?(:helper)
26
+ end
27
+ # Include additional helpers globally
28
+ ActionView::Base.include(Decidim::DecidimAwesome::AwesomeHelpers)
29
+
30
+ # override user's admin property
31
+ Decidim::User.include(Decidim::DecidimAwesome::UserOverride) if DecidimAwesome.enabled?(:scoped_admins)
32
+
33
+ # redirect unauthorized scoped admins to allowed places or custom redirects if configured
34
+ Decidim::ErrorsController.include(Decidim::DecidimAwesome::NotFoundRedirect) if DecidimAwesome.enabled?([:scoped_admins, :custom_redirects])
35
+
36
+ # Custom fields need to deal with several places
37
+ if DecidimAwesome.enabled?(:proposal_custom_fields)
38
+ Decidim::Proposals::ApplicationHelper.include(Decidim::DecidimAwesome::Proposals::ApplicationHelperOverride)
39
+ Decidim::Proposals::ProposalWizardCreateStepForm.include(Decidim::DecidimAwesome::Proposals::ProposalWizardCreateStepFormOverride)
40
+ Decidim::AmendmentsHelper.include(Decidim::DecidimAwesome::AmendmentsHelperOverride)
32
41
  end
33
42
 
34
- Decidim::Proposals::ApplicationHelper.include(Decidim::DecidimAwesome::Proposals::ApplicationHelperOverride)
35
- Decidim::AmendmentsHelper.include(Decidim::DecidimAwesome::AmendmentsHelperOverride)
43
+ Decidim::MenuPresenter.include(Decidim::DecidimAwesome::MenuPresenterOverride)
44
+ Decidim::MenuItemPresenter.include(Decidim::DecidimAwesome::MenuItemPresenterOverride)
36
45
 
37
- # TODO: move to include overrides
38
- Dir.glob("#{Engine.root}/app/awesome_overrides/**/*_override.rb").each do |override|
39
- require_dependency override
46
+ # Late registering of components to take into account initializer values
47
+ DecidimAwesome.registered_components.each do |manifest, block|
48
+ Decidim.register_component(manifest, &block) unless DecidimAwesome.disabled_components.include?(manifest)
40
49
  end
41
50
  end
42
51
 
43
- initializer "decidim_awesome.view_helpers" do
44
- ActionView::Base.include AwesomeHelpers
52
+ initializer "decidim.middleware" do |app|
53
+ app.config.middleware.insert_after Decidim::Middleware::CurrentOrganization, Decidim::DecidimAwesome::CurrentConfig
45
54
  end
46
55
 
47
- initializer "decidim_decidim_awesome.assets" do |app|
48
- app.config.assets.precompile += if version_prefix == "v0.23"
49
- %w(legacy_decidim_decidim_awesome_manifest.js decidim_decidim_awesome_manifest.css)
50
- else
51
- %w(decidim_decidim_awesome_manifest.js decidim_decidim_awesome_manifest.css)
52
- end
53
- # add to precompile any present theme asset
54
- Dir.glob(Rails.root.join("app/assets/themes/*.*")).each do |path|
55
- app.config.assets.precompile << path
56
- end
56
+ initializer "decidim_decidim_awesome.webpacker.assets_path" do
57
+ Decidim.register_assets_path File.expand_path("app/packs", root)
57
58
  end
58
59
 
59
60
  initializer "decidim_decidim_awesome.add_cells_view_paths" do
60
61
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::DecidimAwesome::Engine.root}/app/cells")
61
62
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::DecidimAwesome::Engine.root}/app/views")
62
63
  end
63
-
64
- initializer "decidim_decidim_awesome.content_blocks" do |_app|
65
- # === Home Map block ===
66
- Decidim.content_blocks.register(:homepage, :awesome_map) do |content_block|
67
- content_block.cell = "decidim/decidim_awesome/content_blocks/map"
68
- content_block.settings_form_cell = "decidim/decidim_awesome/content_blocks/map_form"
69
- content_block.public_name_key = "decidim.decidim_awesome.content_blocks.map.name"
70
-
71
- content_block.settings do |settings|
72
- settings.attribute :title, type: :text, translated: true
73
-
74
- settings.attribute :map_height, type: :integer, default: 500
75
- settings.attribute :map_center, type: :string, default: ""
76
- settings.attribute :map_zoom, type: :integer, default: 8
77
- settings.attribute :truncate, type: :integer, default: 255
78
- settings.attribute :collapse, type: :boolean, default: false
79
- settings.attribute :menu_amendments, type: :boolean, default: true
80
- settings.attribute :menu_meetings, type: :boolean, default: true
81
- settings.attribute :menu_hashtags, type: :boolean, default: true
82
-
83
- settings.attribute :show_not_answered, type: :boolean, default: true
84
- settings.attribute :show_accepted, type: :boolean, default: true
85
- settings.attribute :show_withdrawn, type: :boolean, default: false
86
- settings.attribute :show_evaluating, type: :boolean, default: true
87
- settings.attribute :show_rejected, type: :boolean, default: false
88
- end
89
- end
90
- # === TODO: processes groups map block ===
91
- end
92
64
  end
93
65
  end
94
66
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+ require "decidim/core"
5
+
6
+ module Decidim
7
+ module DecidimAwesome
8
+ module IframeComponent
9
+ # This is the engine is used to create the component Map.
10
+ class AdminEngine < ::Rails::Engine
11
+ isolate_namespace Decidim::DecidimAwesome::IframeComponent
12
+
13
+ routes do
14
+ root to: "iframe#settings"
15
+ end
16
+
17
+ def load_seed
18
+ nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_dependency "decidim/components/namer"
3
+ require "decidim/components/namer"
4
4
 
5
- Decidim.register_component(:awesome_iframe) do |component|
5
+ Decidim::DecidimAwesome.register_component(:awesome_iframe) do |component|
6
6
  component.engine = Decidim::DecidimAwesome::IframeComponent::Engine
7
- # component.admin_engine = Decidim::DecidimAwesome::AdminIframeEngine
7
+ component.admin_engine = Decidim::DecidimAwesome::IframeComponent::AdminEngine
8
8
  component.icon = "decidim/meetings/icon.svg" # TODO: create a Icon
9
9
  component.permissions_class_name = "Decidim::DecidimAwesome::Permissions"
10
10
 
@@ -15,7 +15,7 @@ Decidim.register_component(:awesome_iframe) do |component|
15
15
  # Add your global settings
16
16
  # Available types: :integer, :boolean
17
17
  settings.attribute :announcement, type: :text, translated: true, editor: true
18
- settings.attribute :iframe, type: :text
18
+ settings.attribute :iframe, type: :text, default: ""
19
19
  settings.attribute :viewport_width, type: :boolean, default: false
20
20
  settings.attribute :no_margins, type: :boolean, default: false
21
21
  end
@@ -23,7 +23,7 @@ Decidim.register_component(:awesome_iframe) do |component|
23
23
  component.settings(:step) do |settings|
24
24
  # Add your settings per step
25
25
  settings.attribute :announcement, type: :text, translated: true, editor: true
26
- settings.attribute :iframe, type: :text
26
+ settings.attribute :iframe, type: :text, default: ""
27
27
  end
28
28
 
29
29
  # component.register_stat :some_stat do |context, start_at, end_at|
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+ require "decidim/core"
5
+
6
+ module Decidim
7
+ module DecidimAwesome
8
+ module MapComponent
9
+ # This is the engine is used to create the component Map.
10
+ class AdminEngine < ::Rails::Engine
11
+ isolate_namespace Decidim::DecidimAwesome::MapComponent
12
+
13
+ routes do
14
+ root to: "map#settings"
15
+ end
16
+
17
+ def load_seed
18
+ nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_dependency "decidim/components/namer"
3
+ require "decidim/components/namer"
4
4
 
5
- Decidim.register_component(:awesome_map) do |component|
5
+ Decidim::DecidimAwesome.register_component(:awesome_map) do |component|
6
6
  component.engine = Decidim::DecidimAwesome::MapComponent::Engine
7
- # component.admin_engine = Decidim::DecidimAwesome::AdminMapEngine
7
+ component.admin_engine = Decidim::DecidimAwesome::MapComponent::AdminEngine
8
8
  component.icon = "decidim/meetings/icon.svg" # TODO: create a Icon
9
9
  component.permissions_class_name = "Decidim::DecidimAwesome::Permissions"
10
10
 
@@ -22,7 +22,9 @@ Decidim.register_component(:awesome_map) do |component|
22
22
  settings.attribute :collapse, type: :boolean, default: false
23
23
  settings.attribute :menu_amendments, type: :boolean, default: true
24
24
  settings.attribute :menu_meetings, type: :boolean, default: true
25
+ settings.attribute :menu_categories, type: :boolean, default: true
25
26
  settings.attribute :menu_hashtags, type: :boolean, default: true
27
+ settings.attribute :menu_merge_components, type: :boolean, default: false
26
28
  end
27
29
 
28
30
  component.settings(:step) do |settings|
@@ -31,7 +33,6 @@ Decidim.register_component(:awesome_map) do |component|
31
33
  settings.attribute :show_not_answered, type: :boolean, default: true
32
34
  settings.attribute :show_evaluating, type: :boolean, default: true
33
35
  settings.attribute :show_accepted, type: :boolean, default: true
34
- # Not possible yet (needs graphql update):
35
36
  settings.attribute :show_rejected, type: :boolean, default: false
36
37
  settings.attribute :show_withdrawn, type: :boolean, default: false
37
38
  end
@@ -14,6 +14,40 @@ module Decidim
14
14
  root to: "map#show"
15
15
  end
16
16
 
17
+ initializer "decidim_decidim_awesome.content_blocks" do |_app|
18
+ # do not register this if awesome_map is disabled
19
+ next if DecidimAwesome.disabled_components.include?(:awesome_map)
20
+
21
+ # === Home Map block ===
22
+ Decidim.content_blocks.register(:homepage, :awesome_map) do |content_block|
23
+ content_block.cell = "decidim/decidim_awesome/content_blocks/map"
24
+ content_block.settings_form_cell = "decidim/decidim_awesome/content_blocks/map_form"
25
+ content_block.public_name_key = "decidim.decidim_awesome.content_blocks.map.name"
26
+
27
+ content_block.settings do |settings|
28
+ settings.attribute :title, type: :text, translated: true
29
+
30
+ settings.attribute :map_height, type: :integer, default: 500
31
+ settings.attribute :map_center, type: :string, default: ""
32
+ settings.attribute :map_zoom, type: :integer, default: 8
33
+ settings.attribute :truncate, type: :integer, default: 255
34
+ settings.attribute :collapse, type: :boolean, default: false
35
+ settings.attribute :menu_amendments, type: :boolean, default: true
36
+ settings.attribute :menu_meetings, type: :boolean, default: true
37
+ settings.attribute :menu_hashtags, type: :boolean, default: true
38
+ settings.attribute :menu_categories, type: :boolean, default: true
39
+ settings.attribute :menu_merge_components, type: :boolean, default: true
40
+
41
+ settings.attribute :show_not_answered, type: :boolean, default: true
42
+ settings.attribute :show_accepted, type: :boolean, default: true
43
+ settings.attribute :show_withdrawn, type: :boolean, default: false
44
+ settings.attribute :show_evaluating, type: :boolean, default: true
45
+ settings.attribute :show_rejected, type: :boolean, default: false
46
+ end
47
+ end
48
+ # === TODO: processes groups map block ===
49
+ end
50
+
17
51
  def load_seed
18
52
  nil
19
53
  end
@@ -4,6 +4,7 @@ module Decidim
4
4
  module DecidimAwesome
5
5
  class MenuHacker
6
6
  include Decidim::TranslatableAttributes
7
+
7
8
  def initialize(name, view)
8
9
  @name = name
9
10
  @organization = view.try(:current_organization)
@@ -15,8 +15,8 @@ FactoryBot.define do
15
15
  awesome_config { create :awesome_config }
16
16
  end
17
17
 
18
- factory :editor_image, class: "Decidim::DecidimAwesome::EditorImage" do
19
- image { Decidim::Dev.test_file("city.jpeg", "image/jpeg") }
18
+ factory :awesome_editor_image, class: "Decidim::DecidimAwesome::EditorImage" do
19
+ file { Decidim::Dev.test_file("city.jpeg", "image/jpeg") }
20
20
  path { Faker::Internet.url(host: "", scheme: "") }
21
21
  author { create :user }
22
22
  organization { create :organization }
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ Decidim::DecidimAwesome.configure do |config|
4
+ if ENV["FEATURES"] == "disabled"
5
+ [
6
+ :allow_images_in_full_editor,
7
+ :allow_images_in_small_editor,
8
+ :allow_images_in_proposals,
9
+ :use_markdown_editor,
10
+ :allow_images_in_markdown_editor,
11
+ :auto_save_forms,
12
+ :intergram_for_admins,
13
+ :intergram_for_public,
14
+ :scoped_styles,
15
+ :proposal_custom_fields,
16
+ :menu,
17
+ :scoped_admins,
18
+ :custom_redirects
19
+ ].each do |conf|
20
+ config.send("#{conf}=", :disabled)
21
+ end
22
+
23
+ config.disabled_components = [:awesome_map, :awesome_iframe]
24
+ end
25
+ end
@@ -1,2 +1,30 @@
1
- <%= stylesheet_link_tag "application", media: "all" %>
2
- <%= javascript_include_tag "application" %>
1
+ <%= csrf_meta_tags %>
2
+
3
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
4
+ <% available_locales.each do |locale| %>
5
+ <link rel="alternate" href="<%= url_for(request.parameters.merge(locale: locale)) %>" hreflang="<%= locale %>">
6
+ <% end %>
7
+
8
+ <meta name="twitter:card" content="summary_large_image">
9
+ <meta name="twitter:site" content="@<%= decidim_meta_twitter_handler %>">
10
+ <meta name="twitter:title" content="<%= decidim_page_title %>">
11
+ <meta name="twitter:description" content="<%= decidim_meta_description %>">
12
+ <meta name="twitter:image" content="<%= decidim_meta_image_url %>">
13
+
14
+ <meta property="og:url" content="<%= decidim_meta_url %>">
15
+ <meta property="og:type" content="article">
16
+ <meta property="og:title" content="<%= decidim_page_title %>">
17
+ <meta property="og:description" content="<%= decidim_meta_description %>">
18
+ <meta property="og:image" content="<%= decidim_meta_image_url %>">
19
+
20
+ <%= favicon %>
21
+ <%= stylesheet_pack_tag "decidim_core", media: "all" %>
22
+ <%= invisible_captcha_styles %>
23
+
24
+ <%= organization_colors %>
25
+ <%= javascript_pack_tag "decidim_core", defer: false %>
26
+
27
+ <%= render partial: "layouts/decidim/head_extra" %>
28
+ <%== current_organization.header_snippets if Decidim.enable_html_header_snippets %>
29
+ <%= snippets.display(:head) %>
30
+ <%= content_for :header_snippets %>
@@ -1,3 +1,8 @@
1
- <%= stylesheet_link_tag "decidim/admin/application", media: "all" %>
2
- <%= javascript_include_tag "decidim/admin/application" %>
1
+ <meta name="viewport" content="width=device-width, initial-scale=1">
2
+ <%= csrf_meta_tags %>
3
+ <%= organization_colors %>
3
4
 
5
+ <%= stylesheet_pack_tag "decidim_admin", media: "all" %>
6
+ <%= javascript_pack_tag "decidim_admin", defer: false %>
7
+
8
+ <%= snippets.display(:head) %>
@@ -3,6 +3,7 @@
3
3
  shared_examples "javascript config vars" do
4
4
  it "has DecidimAwesome object" do
5
5
  expect(page.body).to have_content("window.DecidimAwesome")
6
+ expect(page.body).to have_content("window.DecidimAwesome.version")
6
7
  expect(page.body).to have_content("window.DecidimAwesome.editor_uploader_path")
7
8
  expect(page.body).to have_content("window.DecidimAwesome.texts")
8
9
  end
@@ -25,3 +26,20 @@ shared_examples "do not have menu link" do |item|
25
26
  end
26
27
  end
27
28
  end
29
+
30
+ shared_examples "forbids disabled feature" do
31
+ let(:feature) { :menu }
32
+ let(:features) { [feature] }
33
+ before do
34
+ features.each do |feat|
35
+ allow(Decidim::DecidimAwesome.config).to receive(feat).and_return(:disabled)
36
+ end
37
+ end
38
+
39
+ it "redirects with error" do
40
+ action
41
+
42
+ expect(flash[:alert]).not_to be_empty
43
+ expect(response).to redirect_to("/admin/")
44
+ end
45
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples "a blank component" do |engine|
4
+ routes { engine.routes }
5
+
6
+ describe "GET settings" do
7
+ it "redirects to settings" do
8
+ get :settings, params: { component_id: component }
9
+ expect(response).to have_http_status(:redirect)
10
+ expect(response.location).to include("#{component.id}/edit")
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_context "with custom redirects params" do
4
+ let(:organization) { create(:organization) }
5
+ let(:context) do
6
+ {
7
+ current_user: create(:user, organization: organization),
8
+ current_organization: organization
9
+ }
10
+ end
11
+ let(:params) do
12
+ {
13
+ origin: origin,
14
+ destination: destination,
15
+ active: active,
16
+ pass_query: pass_query
17
+ }
18
+ end
19
+ let(:attributes) do
20
+ [
21
+ origin,
22
+ {
23
+ "destination" => destination,
24
+ "active" => active,
25
+ "pass_query" => pass_query
26
+ }
27
+ ]
28
+ end
29
+ let(:origin) { "/origin" }
30
+ let(:destination) { "/processes" }
31
+ let(:active) { true }
32
+ let(:pass_query) { true }
33
+
34
+ let(:another_params) do
35
+ {
36
+ allow_images_in_full_editor: true,
37
+ allow_images_in_small_editor: true
38
+ }
39
+ end
40
+ let(:form) do
41
+ Decidim::DecidimAwesome::Admin::CustomRedirectForm.from_params(params).with_context(context)
42
+ end
43
+ let(:another_form) do
44
+ Decidim::DecidimAwesome::Admin::ConfigForm.from_params(another_params).with_context(context)
45
+ end
46
+ let(:another_config) { Decidim::DecidimAwesome::Admin::UpdateConfig.new(another_form) }
47
+ end
@@ -52,20 +52,3 @@ shared_context "with menu hacks params" do
52
52
  end
53
53
  let(:another_config) { Decidim::DecidimAwesome::Admin::UpdateConfig.new(another_form) }
54
54
  end
55
-
56
- shared_examples "forbids disabled feature" do
57
- let(:feature) { :menu }
58
- let(:features) { [feature] }
59
- before do
60
- features.each do |feat|
61
- allow(Decidim::DecidimAwesome.config).to receive(feat).and_return(:disabled)
62
- end
63
- end
64
-
65
- it "redirects with error" do
66
- action
67
-
68
- expect(flash[:alert]).not_to be_empty
69
- expect(response).to redirect_to("/admin/")
70
- end
71
- end
@@ -60,14 +60,12 @@ shared_examples "forbids external accesses" do
60
60
  it_behaves_like "redirects to index"
61
61
  end
62
62
 
63
- unless legacy_version?
64
- describe "forbids moderation access" do
65
- before do
66
- visit decidim_admin.moderations_path
67
- end
68
-
69
- it_behaves_like "redirects to index"
63
+ describe "forbids moderation access" do
64
+ before do
65
+ visit decidim_admin.moderations_path
70
66
  end
67
+
68
+ it_behaves_like "redirects to index"
71
69
  end
72
70
 
73
71
  describe "forbids organization access" do
@@ -87,11 +85,7 @@ shared_examples "allows external accesses" do
87
85
 
88
86
  it "shows participants access" do
89
87
  visit decidim_admin.users_path
90
- if legacy_version?
91
- expect(page).to have_content("New Participant")
92
- else
93
- expect(page).to have_content("New user")
94
- end
88
+ expect(page).to have_content("New user")
95
89
  end
96
90
 
97
91
  it "shows pages access" do
@@ -99,11 +93,9 @@ shared_examples "allows external accesses" do
99
93
  expect(page).to have_content("Pages without topic")
100
94
  end
101
95
 
102
- unless legacy_version?
103
- it "shows moderation access" do
104
- visit decidim_admin.moderations_path
105
- expect(page).to have_content("Reported content URL")
106
- end
96
+ it "shows moderation access" do
97
+ visit decidim_admin.moderations_path
98
+ expect(page).to have_content("Reported content URL")
107
99
  end
108
100
 
109
101
  it "shows organization access" do