decidim-decidim_awesome 0.6.5 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -8
  3. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +2 -2
  4. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -1
  5. data/app/assets/config/decidim_decidim_awesome_manifest.css +2 -2
  6. data/app/assets/config/decidim_decidim_awesome_manifest.js +3 -2
  7. data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +2 -0
  8. data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +4 -0
  9. data/app/assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 +77 -0
  10. data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +14 -0
  11. data/app/assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 +80 -0
  12. data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +80 -0
  13. data/app/assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 +24 -0
  14. data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +7 -0
  15. data/app/assets/javascripts/decidim/decidim_awesome/{application.js → awesome_application.js} +1 -2
  16. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +48 -0
  17. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +107 -0
  18. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +15 -0
  19. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +170 -178
  20. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +56 -0
  21. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +7 -6
  22. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +18 -5
  23. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +57 -0
  24. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +172 -0
  25. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +34 -9
  26. data/app/assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 +24 -0
  27. data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +211 -0
  28. data/app/assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 +106 -0
  29. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +7 -0
  30. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +3 -0
  31. data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +21 -0
  32. data/app/assets/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +15 -0
  33. data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +27 -0
  34. data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +12 -0
  35. data/app/assets/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +66 -0
  36. data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +35 -0
  37. data/app/assets/stylesheets/decidim/decidim_awesome/{admin.scss → awesome_admin.scss} +19 -4
  38. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +22 -0
  39. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
  40. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +95 -1
  41. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
  42. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +16 -1
  43. data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +28 -0
  44. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +11 -3
  45. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +74 -0
  46. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +54 -0
  47. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +61 -0
  48. data/app/cells/decidim/decidim_awesome/content_blocks/map_form_cell.rb +19 -0
  49. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +32 -0
  50. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +45 -0
  51. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +38 -0
  52. data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +4 -0
  53. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +40 -0
  54. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +40 -0
  55. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +1 -1
  56. data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +58 -0
  57. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -1
  58. data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +39 -0
  59. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
  60. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +33 -20
  61. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
  62. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +2 -2
  63. data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +38 -0
  64. data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +38 -0
  65. data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +38 -0
  66. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
  67. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +50 -0
  68. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +3 -1
  69. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +11 -7
  70. data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +48 -0
  71. data/app/helpers/decidim/decidim_awesome/map_helper.rb +66 -53
  72. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +78 -0
  73. data/app/middleware/decidim/decidim_awesome/current_config.rb +182 -0
  74. data/app/models/decidim/decidim_awesome/awesome_config.rb +15 -0
  75. data/app/models/decidim/decidim_awesome/user_override.rb +25 -0
  76. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +2 -0
  77. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +0 -5
  78. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +2 -2
  79. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -0
  80. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +2 -2
  81. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +21 -0
  82. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +0 -3
  83. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +25 -0
  84. data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +0 -2
  85. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +4 -6
  86. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
  87. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +4 -0
  88. data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +6 -0
  89. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -32
  90. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +101 -0
  91. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +83 -0
  92. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -0
  93. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +25 -11
  94. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +8 -1
  95. data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
  96. data/app/views/v0.23/decidim/proposals/collaborative_drafts/_show.html.erb +134 -0
  97. data/app/views/v0.23/layouts/decidim/_head.html.erb +2 -2
  98. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +2 -2
  99. data/app/views/v0.24/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
  100. data/app/views/{v0.22 → v0.24}/layouts/decidim/_head.html.erb +4 -2
  101. data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +3 -2
  102. data/config/locales/ca.yml +75 -3
  103. data/config/locales/cs.yml +75 -3
  104. data/config/locales/en.yml +104 -11
  105. data/config/locales/es.yml +74 -2
  106. data/config/locales/eu.yml +76 -4
  107. data/config/locales/fr.yml +214 -142
  108. data/config/locales/it.yml +284 -0
  109. data/config/locales/ja.yml +284 -0
  110. data/config/locales/nl.yml +208 -136
  111. data/config/locales/sv.yml +109 -37
  112. data/db/migrate/20210628150825_change_awesome_config_var_type.rb +12 -0
  113. data/lib/decidim/decidim_awesome/admin_engine.rb +16 -4
  114. data/lib/decidim/decidim_awesome/awesome_helpers.rb +17 -10
  115. data/lib/decidim/decidim_awesome/checksums.yml +19 -9
  116. data/lib/decidim/decidim_awesome/config.rb +54 -9
  117. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +27 -21
  118. data/lib/decidim/decidim_awesome/custom_fields.rb +94 -0
  119. data/lib/decidim/decidim_awesome/engine.rb +64 -8
  120. data/lib/decidim/decidim_awesome/iframe_component/component.rb +1 -1
  121. data/lib/decidim/decidim_awesome/map_component/component.rb +8 -2
  122. data/lib/decidim/decidim_awesome/menu_hacker.rb +17 -15
  123. data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
  124. data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor.rb +116 -0
  125. data/lib/decidim/decidim_awesome/test/shared_examples/current_config_examples.rb +143 -0
  126. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +4 -0
  127. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +428 -0
  128. data/lib/decidim/decidim_awesome/version.rb +2 -2
  129. data/lib/decidim/decidim_awesome.rb +41 -8
  130. data/vendor/assets/javascripts/codemirror.js +9801 -0
  131. data/vendor/assets/javascripts/delta.min.js +405 -0
  132. data/vendor/assets/javascripts/delta.min.js.map +1 -0
  133. data/vendor/assets/javascripts/europa.min.js +4 -0
  134. data/vendor/assets/javascripts/form-builder.min.js +19 -0
  135. data/vendor/assets/javascripts/form-render.min.js +19 -0
  136. data/vendor/assets/javascripts/inscrybmde.min.js +1 -1
  137. data/vendor/assets/javascripts/jquery-ui.min.js +13 -0
  138. data/vendor/assets/javascripts/jquery.truncate.js +105 -0
  139. data/vendor/assets/javascripts/keymap/sublime.js +720 -0
  140. data/vendor/assets/javascripts/mode/css/css.js +864 -0
  141. data/vendor/assets/javascripts/select2.js +6147 -0
  142. data/vendor/assets/langs/en-US.lang +110 -0
  143. data/vendor/assets/stylesheets/codemirror.css +350 -0
  144. data/vendor/assets/stylesheets/inscrybmde.min.scss +194 -0
  145. data/vendor/assets/stylesheets/jquery-ui.min.css +7 -0
  146. data/vendor/assets/stylesheets/select2-foundation-theme.css +249 -0
  147. data/vendor/assets/stylesheets/select2.css +515 -0
  148. metadata +101 -34
  149. data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
  150. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -2
  151. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -225
  152. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -82
  153. data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +0 -12
  154. data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +0 -8
  155. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +0 -27
  156. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +0 -64
  157. data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
  158. data/lib/decidim/decidim_awesome/content_renderers.rb +0 -9
  159. data/vendor/assets/stylesheets/inscrybmde.min.css +0 -8
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ class CustomFields
6
+ def initialize(fields)
7
+ @fields = if fields.respond_to? :map
8
+ fields.map { |f| JSON.parse(f) }.flatten
9
+ else
10
+ JSON.parse(fields)
11
+ end
12
+ end
13
+
14
+ attr_reader :fields, :xml, :errors, :data
15
+
16
+ def apply_xml(xml)
17
+ parse_xml(xml)
18
+ map_fields!
19
+ rescue StandardError => e
20
+ @errors = e.message
21
+ end
22
+
23
+ def to_json(*_args)
24
+ @fields
25
+ end
26
+
27
+ def translate!
28
+ translate_values!
29
+ end
30
+
31
+ private
32
+
33
+ def parse_xml(xml)
34
+ @xml = xml
35
+ @data = Nokogiri.XML(xml).xpath("//dl/dd")
36
+ return if @data.present?
37
+
38
+ apply_to_first_textarea
39
+ end
40
+
41
+ def map_fields!
42
+ return unless data
43
+
44
+ @fields.map! do |field|
45
+ if field["name"] # ignore headers/paragraphs
46
+ value = data.search("##{field["name"]} div")
47
+ field["userData"] = value.map { |v| v.attribute("alt")&.value || v.inner_html(encoding: "UTF-8") } if value.present?
48
+ end
49
+
50
+ field
51
+ end
52
+ end
53
+
54
+ # Finds the first textarea and applies non-xml compatible content
55
+ # when textarea has not wysiwyg assigned, strips html
56
+ def apply_to_first_textarea
57
+ # quill editor might leave html traces without any user content
58
+ # so we won't process it if there is no text (html free) result
59
+ text = Nokogiri.HTML(xml).html? ? Nokogiri.HTML(xml).text.strip : text.strip
60
+ return if text.blank?
61
+
62
+ textarea = @fields.find { |field| field["type"] == "textarea" }
63
+ @errors = I18n.t(".invalid_xml", scope: "decidim.decidim_awesome.custom_fields.errors")
64
+ return unless textarea
65
+
66
+ textarea["userData"] = [textarea["subtype"] == "textarea" ? text : xml]
67
+ @errors = I18n.t(".invalid_fields", scope: "decidim.decidim_awesome.custom_fields.errors", field: textarea["label"] || textarea["name"])
68
+ end
69
+
70
+ def translate_values!
71
+ deep_transform_values!(@fields) do |value|
72
+ next value unless value.is_a? String
73
+ next value unless (match = value.match(/^(.*\..*)$/))
74
+
75
+ I18n.t(match[1], raise: true)
76
+ rescue I18n::MissingTranslationData
77
+ value
78
+ end
79
+ @fields
80
+ end
81
+
82
+ def deep_transform_values!(object, &block)
83
+ case object
84
+ when Hash
85
+ object.transform_values! { |value| deep_transform_values!(value, &block) }
86
+ when Array
87
+ object.map! { |e| deep_transform_values!(e, &block) }
88
+ else
89
+ yield(object)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -8,30 +8,86 @@ module Decidim
8
8
  module DecidimAwesome
9
9
  # This is the engine that runs on the public interface of decidim_awesome.
10
10
  class Engine < ::Rails::Engine
11
+ include AwesomeHelpers
12
+
11
13
  isolate_namespace Decidim::DecidimAwesome
12
14
 
13
15
  routes do
14
16
  post :editor_images, to: "editor_images#create"
15
17
  end
16
18
 
19
+ initializer "decidim.middleware" do |app|
20
+ app.config.middleware.insert_after Decidim::CurrentOrganization, Decidim::DecidimAwesome::CurrentConfig
21
+ end
22
+
23
+ # Prepare a zone to create overrides
24
+ # https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
25
+ # overrides
26
+ 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)
32
+ end
33
+
34
+ Decidim::Proposals::ApplicationHelper.include(Decidim::DecidimAwesome::Proposals::ApplicationHelperOverride)
35
+ Decidim::AmendmentsHelper.include(Decidim::DecidimAwesome::AmendmentsHelperOverride)
36
+
37
+ # TODO: move to include overrides
38
+ Dir.glob("#{Engine.root}/app/awesome_overrides/**/*_override.rb").each do |override|
39
+ require_dependency override
40
+ end
41
+ end
42
+
17
43
  initializer "decidim_awesome.view_helpers" do
18
- ActionView::Base.send :include, AwesomeHelpers
44
+ ActionView::Base.include AwesomeHelpers
19
45
  end
20
46
 
21
47
  initializer "decidim_decidim_awesome.assets" do |app|
22
- app.config.assets.precompile += %w(decidim_decidim_awesome_manifest.js decidim_decidim_awesome_manifest.css)
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
23
53
  # add to precompile any present theme asset
24
- Dir.glob(Rails.root.join("app", "assets", "themes", "*.*")).each do |path|
54
+ Dir.glob(Rails.root.join("app/assets/themes/*.*")).each do |path|
25
55
  app.config.assets.precompile << path
26
56
  end
27
57
  end
28
58
 
29
- # Prepare a zone to create overrides
30
- # https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
31
- config.to_prepare do
32
- Dir.glob("#{Engine.root}/app/awesome_overrides/**/*_override.rb").each do |override|
33
- require_dependency override
59
+ initializer "decidim_decidim_awesome.add_cells_view_paths" do
60
+ Cell::ViewModel.view_paths << File.expand_path("#{Decidim::DecidimAwesome::Engine.root}/app/cells")
61
+ Cell::ViewModel.view_paths << File.expand_path("#{Decidim::DecidimAwesome::Engine.root}/app/views")
62
+ 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
34
89
  end
90
+ # === TODO: processes groups map block ===
35
91
  end
36
92
  end
37
93
  end
@@ -43,7 +43,7 @@ Decidim.register_component(:awesome_iframe) do |component|
43
43
  published_at: Time.current,
44
44
  participatory_space: participatory_space,
45
45
  settings: {
46
- announcement: { en: Faker::Lorem.paragraphs(2).join("\n") }
46
+ announcement: { en: Faker::Lorem.paragraphs(number: 2).join("\n") }
47
47
  }
48
48
  }
49
49
 
@@ -16,7 +16,13 @@ Decidim.register_component(:awesome_map) do |component|
16
16
  # Available types: :integer, :boolean
17
17
  settings.attribute :announcement, type: :text, translated: true, editor: true
18
18
  settings.attribute :map_height, type: :integer, default: 700
19
+ settings.attribute :map_center, type: :string, default: ""
20
+ settings.attribute :map_zoom, type: :integer, default: 8
21
+ settings.attribute :truncate, type: :integer, default: 255
19
22
  settings.attribute :collapse, type: :boolean, default: false
23
+ settings.attribute :menu_amendments, type: :boolean, default: true
24
+ settings.attribute :menu_meetings, type: :boolean, default: true
25
+ settings.attribute :menu_hashtags, type: :boolean, default: true
20
26
  end
21
27
 
22
28
  component.settings(:step) do |settings|
@@ -26,7 +32,7 @@ Decidim.register_component(:awesome_map) do |component|
26
32
  settings.attribute :show_evaluating, type: :boolean, default: true
27
33
  settings.attribute :show_accepted, type: :boolean, default: true
28
34
  # Not possible yet (needs graphql update):
29
- # settings.attribute :show_rejected, type: :boolean, default: false
35
+ settings.attribute :show_rejected, type: :boolean, default: false
30
36
  settings.attribute :show_withdrawn, type: :boolean, default: false
31
37
  end
32
38
 
@@ -47,7 +53,7 @@ Decidim.register_component(:awesome_map) do |component|
47
53
  published_at: Time.current,
48
54
  participatory_space: participatory_space,
49
55
  settings: {
50
- announcement: { en: Faker::Lorem.paragraphs(2).join("\n") }
56
+ announcement: { en: Faker::Lorem.paragraphs(number: 2).join("\n") }
51
57
  }
52
58
  }
53
59
 
@@ -12,7 +12,7 @@ module Decidim
12
12
  end
13
13
 
14
14
  # returns a combined array of the Decidim defined menu and the hacked stored as config vars
15
- def items(include_invisible = false)
15
+ def items(include_invisible: false)
16
16
  return @items if @items
17
17
 
18
18
  @items = default_items
@@ -22,9 +22,10 @@ module Decidim
22
22
  item.send("overrided?=", true)
23
23
  @items.reject! { |i| i.url.gsub(/\?.*/, "") == item.url }
24
24
  end
25
- @items << item if include_invisible || visible?(item)
25
+ @items << item
26
26
  end
27
27
 
28
+ @items.select!(&:visible?) unless include_invisible
28
29
  @items.sort_by!(&:position)
29
30
  end
30
31
 
@@ -33,19 +34,6 @@ module Decidim
33
34
  attr_accessor :organization, :user
34
35
  attr_reader :name, :view
35
36
 
36
- def visible?(item)
37
- case item.visibility
38
- when "hidden"
39
- false
40
- when "logged"
41
- user.present?
42
- when "non_logged"
43
- user.blank?
44
- else
45
- true
46
- end
47
- end
48
-
49
37
  def default_items
50
38
  @default_items ||= build_menu.instance_variable_get(:@items).map do |item|
51
39
  item.instance_variable_set(:@active, method(:activate?)) unless item.active == :exact
@@ -69,6 +57,7 @@ module Decidim
69
57
  # see options in https://github.com/comfy/active_link_to
70
58
  active: method(:activate?),
71
59
  visibility: item["visibility"],
60
+ visible?: visible?(item),
72
61
  target: item["target"],
73
62
  overrided?: false
74
63
  )
@@ -80,6 +69,19 @@ module Decidim
80
69
  url == urls.find { |u| view.request.original_fullpath.start_with?(u) }
81
70
  end
82
71
 
72
+ def visible?(item)
73
+ case item["visibility"]
74
+ when "hidden"
75
+ false
76
+ when "logged"
77
+ user.present?
78
+ when "non_logged"
79
+ user.blank?
80
+ else
81
+ true
82
+ end
83
+ end
84
+
83
85
  def current_config
84
86
  @current_config ||= (AwesomeConfig.find_by(var: name, organization: organization)&.value || []).filter { |i| i.is_a? Hash }
85
87
  end
@@ -14,7 +14,7 @@ module Decidim
14
14
  @overrides = checksums.map do |package, files|
15
15
  props = {
16
16
  spec: ::Gem::Specification.find_by_name(package),
17
- files: files.map { |file, signatures| [file, signatures.values] }.to_h
17
+ files: files.transform_values(&:values)
18
18
  }
19
19
  [package, to_struct(props)]
20
20
  end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples "edits box label inline" do |test_case, key|
4
+ let(:data) { '[{"type":"text","label":"Short Name","subtype":"text","className":"form-control","name":"text-1476748004559"}]' }
5
+
6
+ it "updates the label when no changes" do
7
+ link = find("[data-key=#{key}] a.awesome-auto-edit", match: :first)
8
+ expect(page).not_to have_css("input.awesome-auto-edit")
9
+ link.click
10
+ expect(page).to have_css("input.awesome-auto-edit")
11
+ find("body").click
12
+ expect(page).not_to have_css("input.awesome-auto-edit")
13
+ link.click
14
+ input = find("[data-key=#{key}] input.awesome-auto-edit")
15
+ input.fill_in with: "A new làbel\n"
16
+ sleep 1
17
+ expect(page).not_to have_css("input.awesome-auto-edit")
18
+ expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
19
+
20
+ find("*[type=submit]").click
21
+ case test_case
22
+ when :css
23
+ expect(page).to have_content("body {background: red;}")
24
+ when :fields
25
+ expect(page).to have_content("Occupation")
26
+ expect(page).to have_content("Street Sweeper")
27
+ expect(page).not_to have_content("Short Bio")
28
+ when :admins
29
+ expect(page).not_to have_content(user.name.to_s)
30
+ expect(page).to have_content(user2.name.to_s)
31
+ expect(page).to have_content(user3.name.to_s)
32
+ end
33
+ expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
34
+ expect(page).not_to have_css("span.awesome-auto-edit[data-key=#{key}]")
35
+ end
36
+
37
+ it "updates the label with previous changes" do
38
+ case test_case
39
+ when :css
40
+ sleep 1
41
+ page.execute_script("document.querySelector(\"[data-key=#{key}] .CodeMirror\").CodeMirror.setValue(\"div {background: brown;}\");")
42
+ when :fields
43
+ sleep 2
44
+ page.execute_script("$('.proposal_custom_fields_container[data-key=#{key}] .proposal_custom_fields_editor')[0].FormBuilder.actions.setData(#{data})")
45
+ when :admins
46
+ sleep 1
47
+ page.execute_script("$('.multiusers-select:first').append(new Option('#{user.name}', #{user.id}, true, true)).trigger('change');")
48
+ end
49
+
50
+ link = find("[data-key=#{key}] a.awesome-auto-edit", match: :first)
51
+ expect(page).not_to have_css("input.awesome-auto-edit")
52
+ link.click
53
+ expect(page).to have_css("input.awesome-auto-edit")
54
+ find("body").click
55
+ expect(page).not_to have_css("input.awesome-auto-edit")
56
+ link.click
57
+ input = find("[data-key=#{key}] input.awesome-auto-edit")
58
+ input.fill_in with: "A new làbel\n"
59
+ sleep 1
60
+ expect(page).not_to have_css("input.awesome-auto-edit")
61
+ expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
62
+
63
+ find("*[type=submit]").click
64
+ case test_case
65
+ when :css
66
+ expect(page).to have_admin_callout("updated successfully")
67
+ expect(page).to have_content("div {background: brown;}")
68
+ when :fields
69
+ expect(page).to have_content("Short Name")
70
+ when :admins
71
+ expect(page).to have_content(user.name.to_s)
72
+ expect(page).to have_content(user2.name.to_s)
73
+ expect(page).to have_content(user3.name.to_s)
74
+ end
75
+ expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
76
+ expect(page).not_to have_css("span.awesome-auto-edit[data-key=#{key}]")
77
+ end
78
+
79
+ it "updates the label with post changes" do
80
+ link = find("[data-key=#{key}] a.awesome-auto-edit", match: :first)
81
+ expect(page).not_to have_css("input.awesome-auto-edit")
82
+ link.click
83
+ expect(page).to have_css("input.awesome-auto-edit")
84
+ find("body").click
85
+ expect(page).not_to have_css("input.awesome-auto-edit")
86
+ link.click
87
+ input = find("[data-key=#{key}] input.awesome-auto-edit")
88
+ input.fill_in with: "A new làbel\n"
89
+ sleep 1
90
+ expect(page).not_to have_css("input.awesome-auto-edit")
91
+ expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
92
+
93
+ case test_case
94
+ when :css
95
+ sleep 1
96
+ page.execute_script('document.querySelector("[data-key=a_new_label] .CodeMirror").CodeMirror.setValue("body {background: lilac;}");')
97
+ find("*[type=submit]").click
98
+ expect(page).to have_admin_callout("updated successfully")
99
+ expect(page).to have_content("body {background: lilac;}")
100
+ when :fields
101
+ expect(page).to have_content("Full Name")
102
+ sleep 2
103
+ page.execute_script("$('.proposal_custom_fields_container[data-key=a_new_label] .proposal_custom_fields_editor')[0].FormBuilder.actions.setData(#{data})")
104
+ find("*[type=submit]").click
105
+ expect(page).to have_content("Short Name")
106
+ when :admins
107
+ page.execute_script("$('.multiusers-select:first').append(new Option('#{user.name}', #{user.id}, true, true)).trigger('change');")
108
+ find("*[type=submit]").click
109
+ expect(page).to have_content(user.name.to_s)
110
+ expect(page).to have_content(user2.name.to_s)
111
+ expect(page).to have_content(user3.name.to_s)
112
+ end
113
+ expect(page).to have_css("span.awesome-auto-edit[data-key=a_new_label]")
114
+ expect(page).not_to have_css("span.awesome-auto-edit[data-key=#{key}]")
115
+ end
116
+ end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples "same environment" do
4
+ it "do not modify the environment" do
5
+ code, new_env = middleware.call(env)
6
+
7
+ expect(new_env).to eq(env)
8
+ expect(code).to eq(200)
9
+ end
10
+
11
+ it "has current organization in env" do
12
+ _code, new_env = middleware.call(env)
13
+
14
+ expect(new_env["decidim.current_organization"]).to eq(env["decidim.current_organization"])
15
+ expect(new_env["decidim_awesome.current_config"]).to be_a Decidim::DecidimAwesome::Config
16
+ end
17
+ end
18
+
19
+ shared_examples "untampered user model" do
20
+ it "user model is reset" do
21
+ # ensure model is always reset after calling the middleware
22
+ Decidim::User.awesome_admins_for_current_scope = [123]
23
+ middleware.call(env)
24
+
25
+ expect(Decidim::User.awesome_admins_for_current_scope).not_to be_present
26
+ end
27
+ end
28
+
29
+ shared_examples "tampered users model" do
30
+ it "user model is tampered" do
31
+ # ensure model is always reset after calling the middleware
32
+ Decidim::User.awesome_admins_for_current_scope = [123]
33
+ middleware.call(env)
34
+
35
+ expect(Decidim::User.awesome_admins_for_current_scope).to match_array([user.id, admin.id])
36
+ end
37
+ end
38
+
39
+ shared_examples "tampered user model" do
40
+ it "user model is tampered" do
41
+ # ensure model is always reset after calling the middleware
42
+ Decidim::User.awesome_admins_for_current_scope = [123]
43
+ middleware.call(env)
44
+
45
+ expect(Decidim::User.awesome_admins_for_current_scope).to match_array([user.id])
46
+ end
47
+ end
48
+
49
+ shared_examples "tampered admin model" do
50
+ it "user model is tampered" do
51
+ # ensure model is always reset after calling the middleware
52
+ Decidim::User.awesome_admins_for_current_scope = [123]
53
+ middleware.call(env)
54
+
55
+ expect(Decidim::User.awesome_admins_for_current_scope).to match_array([admin.id])
56
+ end
57
+ end
58
+
59
+ shared_examples "generic admin routes" do
60
+ context "when admin index" do
61
+ let(:path) { "admin/" }
62
+
63
+ it_behaves_like "tampered users model"
64
+
65
+ context "when additional slashes" do
66
+ let(:path) { "/admin/" }
67
+
68
+ it_behaves_like "untampered user model"
69
+ end
70
+
71
+ context "when multiple slashes" do
72
+ let(:path) { "//admin/" }
73
+
74
+ it_behaves_like "untampered user model"
75
+ end
76
+
77
+ context "when POST" do
78
+ let(:method) { "POST" }
79
+
80
+ it_behaves_like "untampered user model"
81
+ end
82
+
83
+ context "when PATCH" do
84
+ let(:method) { "PATCH" }
85
+
86
+ it_behaves_like "untampered user model"
87
+ end
88
+ end
89
+
90
+ context "when admin terms" do
91
+ let(:path) { "admin/admin_terms" }
92
+
93
+ it_behaves_like "tampered users model"
94
+
95
+ context "when POST" do
96
+ let(:method) { "POST" }
97
+
98
+ it_behaves_like "tampered users model"
99
+ end
100
+ end
101
+
102
+ context "when admin out of scope" do
103
+ let(:path) { "admin/some_path" }
104
+
105
+ it_behaves_like "untampered user model"
106
+ end
107
+
108
+ context "when admin an assembly" do
109
+ let(:path) { "admin/assemblies/#{assembly.slug}" }
110
+
111
+ it_behaves_like "tampered users model"
112
+
113
+ context "and accessing assemblies index" do
114
+ let(:path) { "admin/assemblies" }
115
+
116
+ it_behaves_like "tampered users model"
117
+
118
+ context "when POST" do
119
+ let(:method) { "POST" }
120
+
121
+ it_behaves_like "untampered user model"
122
+ end
123
+
124
+ context "when PATCH" do
125
+ let(:method) { "PATCH" }
126
+
127
+ it_behaves_like "untampered user model"
128
+ end
129
+ end
130
+ end
131
+
132
+ context "and accessing another assemblies index" do
133
+ let(:path) { "admin/assemblies/#{another_assembly.slug}" }
134
+
135
+ it_behaves_like "untampered user model"
136
+ end
137
+
138
+ context "when admin a participatory process" do
139
+ let(:path) { "admin/participatory_processes/some-process" }
140
+
141
+ it_behaves_like "tampered admin model"
142
+ end
143
+ end
@@ -11,10 +11,12 @@ shared_examples "has no drag and drop" do |rte|
11
11
  end
12
12
  else
13
13
  it "has no paste event" do
14
+ sleep 1
14
15
  expect(page.execute_script("return typeof $._data($('#{editor_selector}')[0], 'events').paste")).to eq("undefined")
15
16
  end
16
17
 
17
18
  it "has no drop event" do
19
+ sleep 1
18
20
  expect(page.execute_script("return typeof $._data($('#{editor_selector}')[0], 'events').drop")).to eq("undefined")
19
21
  end
20
22
  end
@@ -31,10 +33,12 @@ shared_examples "has drag and drop" do |rte|
31
33
  end
32
34
  else
33
35
  it "has paste event" do
36
+ sleep 1
34
37
  expect(page.execute_script("return typeof $._data($('#{editor_selector}')[0], 'events').paste")).to eq("object")
35
38
  end
36
39
 
37
40
  it "has drop event" do
41
+ sleep 1
38
42
  expect(page.execute_script("return typeof $._data($('#{editor_selector}')[0], 'events').drop")).to eq("object")
39
43
  end
40
44
  end