decidim-decidim_awesome 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +307 -0
  4. data/Rakefile +51 -0
  5. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +3 -0
  6. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -0
  7. data/app/assets/config/decidim_decidim_awesome_manifest.css +5 -0
  8. data/app/assets/config/decidim_decidim_awesome_manifest.js +2 -0
  9. data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
  10. data/app/assets/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
  11. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +2 -0
  12. data/app/assets/javascripts/decidim/decidim_awesome/admin/constraints.js.es6 +54 -0
  13. data/app/assets/javascripts/decidim/decidim_awesome/application.js +4 -0
  14. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/api_fetcher.js.es6 +38 -0
  15. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/categories.js.es6 +25 -0
  16. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +215 -0
  17. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +129 -0
  18. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +78 -0
  19. data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +12 -0
  20. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +162 -0
  21. data/app/assets/javascripts/decidim/decidim_awesome/forms/autosave.js.es6 +90 -0
  22. data/app/assets/javascripts/decidim/decidim_awesome/proposals/images.js.es6 +25 -0
  23. data/app/assets/stylesheets/decidim/decidim_awesome/admin.scss +45 -0
  24. data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +37 -0
  25. data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +8 -0
  26. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +10 -0
  27. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
  28. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +66 -0
  29. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +17 -0
  30. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +27 -0
  31. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +7 -0
  32. data/app/assets/stylesheets/decidim/decidim_awesome/forms/autosave.scss +17 -0
  33. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +31 -0
  34. data/app/commands/decidim/decidim_awesome/admin/create_constraint.rb +47 -0
  35. data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +31 -0
  36. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +44 -0
  37. data/app/commands/decidim/decidim_awesome/admin/update_constraint.rb +44 -0
  38. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +34 -0
  39. data/app/controllers/concerns/decidim/decidim_awesome/needs_awesome_config.rb +17 -0
  40. data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +21 -0
  41. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +37 -0
  42. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +44 -0
  43. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +126 -0
  44. data/app/controllers/decidim/decidim_awesome/application_controller.rb +14 -0
  45. data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +50 -0
  46. data/app/controllers/decidim/decidim_awesome/iframe_component/application_controller.rb +15 -0
  47. data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +33 -0
  48. data/app/controllers/decidim/decidim_awesome/map_component/application_controller.rb +15 -0
  49. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +31 -0
  50. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +22 -0
  51. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +20 -0
  52. data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +21 -0
  53. data/app/forms/decidim/decidim_awesome/editor_image_form.rb +16 -0
  54. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +90 -0
  55. data/app/helpers/decidim/decidim_awesome/application_helper.rb +10 -0
  56. data/app/helpers/decidim/decidim_awesome/map_helper.rb +121 -0
  57. data/app/models/decidim/decidim_awesome/application_record.rb +10 -0
  58. data/app/models/decidim/decidim_awesome/awesome_config.rb +23 -0
  59. data/app/models/decidim/decidim_awesome/config_constraint.rb +13 -0
  60. data/app/models/decidim/decidim_awesome/editor_image.rb +24 -0
  61. data/app/permissions/decidim/decidim_awesome/permissions.rb +29 -0
  62. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +22 -0
  63. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +35 -0
  64. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +27 -0
  65. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +20 -0
  66. data/app/views/decidim/decidim_awesome/admin/config/_form_livechat.html.erb +44 -0
  67. data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +12 -0
  68. data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +9 -0
  69. data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +11 -0
  70. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +15 -0
  71. data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +56 -0
  72. data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +14 -0
  73. data/app/views/decidim/decidim_awesome/admin/constraints/show.html.erb +14 -0
  74. data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +9 -0
  75. data/app/views/decidim/decidim_awesome/map_component/map/error.erb +7 -0
  76. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +74 -0
  77. data/app/views/layouts/decidim/_head.html.erb +5 -0
  78. data/app/views/layouts/decidim/admin/_header.html.erb +5 -0
  79. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +47 -0
  80. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +20 -0
  81. data/app/views/layouts/decidim/decidim_awesome/_intergram_widget.html.erb +16 -0
  82. data/app/views/v0.21/layouts/decidim/_head.html.erb +34 -0
  83. data/app/views/v0.21/layouts/decidim/admin/_header.html.erb +9 -0
  84. data/app/views/v0.22/layouts/decidim/_head.html.erb +36 -0
  85. data/app/views/v0.22/layouts/decidim/admin/_header.html.erb +11 -0
  86. data/config/i18n-tasks.yml +10 -0
  87. data/config/locales/ca.yml +125 -0
  88. data/config/locales/cs.yml +125 -0
  89. data/config/locales/en.yml +176 -0
  90. data/config/locales/es.yml +125 -0
  91. data/config/locales/fr.yml +125 -0
  92. data/config/locales/sv.yml +125 -0
  93. data/db/migrate/20200324170000_create_decidim_awesome_config.rb +16 -0
  94. data/db/migrate/20200324230936_create_awesome_editor_images.rb +14 -0
  95. data/db/migrate/20200403142257_create_decidim_awesome_config_constraints.rb +13 -0
  96. data/db/seeds.rb +27 -0
  97. data/lib/decidim/decidim_awesome.rb +110 -0
  98. data/lib/decidim/decidim_awesome/admin.rb +10 -0
  99. data/lib/decidim/decidim_awesome/admin_engine.rb +45 -0
  100. data/lib/decidim/decidim_awesome/awesome_helpers.rb +55 -0
  101. data/lib/decidim/decidim_awesome/checksums.yml +15 -0
  102. data/lib/decidim/decidim_awesome/config.rb +129 -0
  103. data/lib/decidim/decidim_awesome/content_renderers.rb +9 -0
  104. data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +18 -0
  105. data/lib/decidim/decidim_awesome/context_analyzers.rb +11 -0
  106. data/lib/decidim/decidim_awesome/context_analyzers/component_analyzer.rb +38 -0
  107. data/lib/decidim/decidim_awesome/context_analyzers/participatory_space_analyzer.rb +31 -0
  108. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +97 -0
  109. data/lib/decidim/decidim_awesome/engine.rb +38 -0
  110. data/lib/decidim/decidim_awesome/iframe_component/component.rb +59 -0
  111. data/lib/decidim/decidim_awesome/iframe_component/engine.rb +23 -0
  112. data/lib/decidim/decidim_awesome/map_component/component.rb +74 -0
  113. data/lib/decidim/decidim_awesome/map_component/engine.rb +23 -0
  114. data/lib/decidim/decidim_awesome/system_checker.rb +63 -0
  115. data/lib/decidim/decidim_awesome/test/factories.rb +36 -0
  116. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +25 -0
  117. data/lib/decidim/decidim_awesome/test/themes/css.lvh.me.css +3 -0
  118. data/lib/decidim/decidim_awesome/test/themes/erb.lvh.me.scss.erb +2 -0
  119. data/lib/decidim/decidim_awesome/test/themes/scss.lvh.me.scss +1 -0
  120. data/lib/decidim/decidim_awesome/test/themes/test-theme/body.scss +4 -0
  121. data/lib/decidim/decidim_awesome/version.rb +10 -0
  122. data/vendor/assets/images/layers-2x.png +0 -0
  123. data/vendor/assets/images/layers.png +0 -0
  124. data/vendor/assets/images/marker-icon.png +0 -0
  125. data/vendor/assets/javascripts/codemirror-4.inline-attachment.js +89 -0
  126. data/vendor/assets/javascripts/form-storage.js +824 -0
  127. data/vendor/assets/javascripts/highlight.min.js +44 -0
  128. data/vendor/assets/javascripts/image-resize.min.js +1 -0
  129. data/vendor/assets/javascripts/image-upload.min.js +6 -0
  130. data/vendor/assets/javascripts/inline-attachment.js +399 -0
  131. data/vendor/assets/javascripts/inscrybmde.min.js +7 -0
  132. data/vendor/assets/javascripts/jquery.inline-attachment.js +66 -0
  133. data/vendor/assets/javascripts/leaflet.featuregroup.subgroup.js +6 -0
  134. data/vendor/assets/stylesheets/default.min.css +1 -0
  135. data/vendor/assets/stylesheets/foundation.min.css +1 -0
  136. data/vendor/assets/stylesheets/github.min.css +2 -0
  137. data/vendor/assets/stylesheets/inscrybmde.min.css +8 -0
  138. metadata +267 -0
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContentRenderers
6
+ autoload :MarkdownRenderer, "decidim/decidim_awesome/content_renderers/markdown_renderer"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redcarpet"
4
+
5
+ module Decidim
6
+ module DecidimAwesome
7
+ module ContentRenderers
8
+ # A renderer that processes markdown
9
+ class MarkdownRenderer < Decidim::ContentRenderers::BaseRenderer
10
+ # @return [String] the content ready to display (contains HTML)
11
+ def render(options = { filter_html: true, autolink: true, no_intra_emphasis: true, fenced_code_blocks: true, disable_indented_code_blocks: true, tables: true })
12
+ md = Redcarpet::Markdown.new(Redcarpet::Render::HTML, options).render(content)
13
+ "<div class=\"awesome-markdown-editor\">#{md}</div>"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContextAnalyzers
6
+ autoload :RequestAnalyzer, "decidim/decidim_awesome/context_analyzers/request_analyzer"
7
+ autoload :ComponentAnalyzer, "decidim/decidim_awesome/context_analyzers/component_analyzer"
8
+ autoload :ParticipatorySpaceAnalyzer, "decidim/decidim_awesome/context_analyzers/participatory_space_analyzer"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContextAnalyzers
6
+ # Translates a decidim component to detected participatory spaces and components
7
+ class ComponentAnalyzer
8
+ def initialize(component)
9
+ @component = component
10
+ @context = {}
11
+ end
12
+
13
+ def self.context_for(component)
14
+ analyzer = new component
15
+ analyzer.extract_context!
16
+ analyzer.context
17
+ end
18
+
19
+ attr_reader :component, :context
20
+
21
+ def extract_context!
22
+ if @component.respond_to? :participatory_space
23
+ @context[:participatory_space_manifest] = @component.participatory_space.manifest.name.to_s
24
+ @context[:participatory_space_slug] = @component.participatory_space&.slug
25
+ end
26
+
27
+ if @component.respond_to? :component
28
+ @context[:component_manifest] = @component.component.manifest.name.to_s
29
+ @context[:component_id] = @component.component&.id&.to_s
30
+ elsif @component.is_a? Decidim::Component
31
+ @context[:component_manifest] = @component.manifest.name.to_s
32
+ @context[:component_id] = @component&.id&.to_s
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContextAnalyzers
6
+ # Translates a decidim participatory_space to detected participatory spaces
7
+ class ParticipatorySpaceAnalyzer
8
+ def initialize(participatory_space)
9
+ @participatory_space = participatory_space
10
+ @context = {}
11
+ end
12
+
13
+ def self.context_for(participatory_space)
14
+ analyzer = new participatory_space
15
+ analyzer.extract_context!
16
+ analyzer.context
17
+ end
18
+
19
+ attr_reader :participatory_space, :context
20
+
21
+ def extract_context!
22
+ return unless @participatory_space.respond_to? :manifest
23
+ return unless @participatory_space.manifest.is_a? Decidim::ParticipatorySpaceManifest
24
+
25
+ @context[:participatory_space_manifest] = @participatory_space.manifest.name.to_s
26
+ @context[:participatory_space_slug] = @participatory_space&.slug
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module ContextAnalyzers
6
+ # Translates some Decidim URL path to detected participatory spaces and components
7
+ class RequestAnalyzer
8
+ def initialize(request)
9
+ @request = request
10
+ @context = {}
11
+ end
12
+
13
+ def self.context_for(request)
14
+ analyzer = new request
15
+ analyzer.extract_context!
16
+ analyzer.context
17
+ end
18
+
19
+ attr_reader :request, :context
20
+
21
+ def extract_context!
22
+ path = URI.parse(@request.url).path
23
+ context_from_path path
24
+ end
25
+
26
+ private
27
+
28
+ # In the frontend there's no a 100% correspondence between url and manifest name
29
+ def participatory_spaces
30
+ spaces = Decidim.participatory_space_manifests.map do |space|
31
+ [space.name.to_s, space.name.to_s]
32
+ end.to_h
33
+ spaces.merge(
34
+ "processes" => "participatory_processes",
35
+ "participatory_process_groups" => "participatory_processes",
36
+ "assemblies_types" => "assemblies"
37
+ )
38
+ end
39
+
40
+ def process_admin_segments(segments)
41
+ spaces = participatory_spaces
42
+ return unless spaces[segments[0]]
43
+
44
+ @context[:participatory_space_manifest] = spaces[segments[0]]
45
+ @context[:participatory_space_slug] = segments[1] if segments[1].present?
46
+
47
+ return unless segments[2].presence == "components" && segments[3].present?
48
+
49
+ @context[:component_id] = segments[3]
50
+ # Try to infer component_manifest
51
+ c = Component.find_by(id: segments[3])
52
+ @context[:component_manifest] = c.manifest_name if c
53
+ end
54
+
55
+ def process_front_segments(segments)
56
+ spaces = participatory_spaces
57
+ return unless spaces[segments[0]]
58
+
59
+ @context[:participatory_space_manifest] = spaces[segments[0]]
60
+ @context[:participatory_space_slug] = segments[1] if segments[1].present?
61
+
62
+ return unless segments[2].presence == "f" && segments[3].present?
63
+
64
+ @context[:component_id] = segments[3]
65
+ # Try to infer component_manifest
66
+ c = Component.find_by(id: segments[3])
67
+ @context[:component_manifest] = c.manifest_name if c
68
+ end
69
+
70
+ def system_manifest?(path)
71
+ patterns = [
72
+ %r{^/admin/newsletters},
73
+ %r{^/admin/organization},
74
+ %r{^/admin/static_pages}
75
+ ]
76
+ path.match(Regexp.union(patterns))
77
+ end
78
+
79
+ def context_from_path(path)
80
+ if system_manifest?(path)
81
+ @context[:participatory_space_manifest] = "system"
82
+ return
83
+ end
84
+
85
+ segments = path.sub(%r{^/}, "").split("/")
86
+ return if segments.blank?
87
+
88
+ if segments[0] == "admin"
89
+ segments.shift
90
+ return process_admin_segments(segments)
91
+ end
92
+ process_front_segments(segments)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+ require "decidim/core"
5
+ require "decidim/decidim_awesome/awesome_helpers"
6
+
7
+ module Decidim
8
+ module DecidimAwesome
9
+ # This is the engine that runs on the public interface of decidim_awesome.
10
+ class Engine < ::Rails::Engine
11
+ isolate_namespace Decidim::DecidimAwesome
12
+
13
+ routes do
14
+ post :editor_images, to: "editor_images#create"
15
+ end
16
+
17
+ initializer "decidim_awesome.view_helpers" do
18
+ ActionView::Base.send :include, AwesomeHelpers
19
+ end
20
+
21
+ initializer "decidim_decidim_awesome.assets" do |app|
22
+ app.config.assets.precompile += %w(decidim_decidim_awesome_manifest.js decidim_decidim_awesome_manifest.css)
23
+ # add to precompile any present
24
+ Dir.glob(Rails.root.join("app", "assets", "themes", "*.*")).each do |path|
25
+ app.config.assets.precompile << path
26
+ end
27
+ end
28
+
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
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "decidim/components/namer"
4
+
5
+ Decidim.register_component(:awesome_iframe) do |component|
6
+ component.engine = Decidim::DecidimAwesome::IframeComponent::Engine
7
+ # component.admin_engine = Decidim::DecidimAwesome::AdminIframeEngine
8
+ component.icon = "decidim/meetings/icon.svg" # TODO: create a Icon
9
+ component.permissions_class_name = "Decidim::DecidimAwesome::Permissions"
10
+
11
+ # These actions permissions can be configured in the admin panel
12
+ # component.actions = %w()
13
+
14
+ component.settings(:global) do |settings|
15
+ # Add your global settings
16
+ # Available types: :integer, :boolean
17
+ # settings.attribute :announcement, type: :text, translated: true, editor: true
18
+ settings.attribute :iframe, type: :text
19
+ settings.attribute :viewport_width, type: :boolean, default: false
20
+ settings.attribute :no_margins, type: :boolean, default: false
21
+ end
22
+
23
+ component.settings(:step) do |settings|
24
+ # Add your settings per step
25
+ # settings.attribute :announcement, type: :text, translated: true, editor: true
26
+ settings.attribute :iframe, type: :text
27
+ end
28
+
29
+ # component.register_stat :some_stat do |context, start_at, end_at|
30
+ # # Register some stat number to the application
31
+ # end
32
+
33
+ component.seeds do |participatory_space|
34
+ # Create a Iframe and a few geolocated proposals
35
+ admin_user = Decidim::User.find_by(
36
+ organization: participatory_space.organization,
37
+ email: "admin@example.org"
38
+ )
39
+
40
+ params = {
41
+ name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :awesome_iframe).i18n_name,
42
+ manifest_name: :awesome_iframe,
43
+ published_at: Time.current,
44
+ participatory_space: participatory_space,
45
+ settings: {
46
+ announcement: { en: Faker::Lorem.paragraphs(2).join("\n") }
47
+ }
48
+ }
49
+
50
+ component = Decidim.traceability.perform_action!(
51
+ "publish",
52
+ Decidim::Component,
53
+ admin_user,
54
+ visibility: "all"
55
+ ) do
56
+ Decidim::Component.create!(params)
57
+ end
58
+ end
59
+ 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 Engine < ::Rails::Engine
11
+ isolate_namespace Decidim::DecidimAwesome::IframeComponent
12
+
13
+ routes do
14
+ root to: "iframe#show"
15
+ end
16
+
17
+ def load_seed
18
+ nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "decidim/components/namer"
4
+
5
+ Decidim.register_component(:awesome_map) do |component|
6
+ component.engine = Decidim::DecidimAwesome::MapComponent::Engine
7
+ # component.admin_engine = Decidim::DecidimAwesome::AdminMapEngine
8
+ component.icon = "decidim/meetings/icon.svg" # TODO: create a Icon
9
+ component.permissions_class_name = "Decidim::DecidimAwesome::Permissions"
10
+
11
+ # These actions permissions can be configured in the admin panel
12
+ # component.actions = %w()
13
+
14
+ component.settings(:global) do |settings|
15
+ # Add your global settings
16
+ # Available types: :integer, :boolean
17
+ settings.attribute :announcement, type: :text, translated: true, editor: true
18
+ settings.attribute :map_height, type: :integer, default: 700
19
+ settings.attribute :collapse, type: :boolean, default: false
20
+ end
21
+
22
+ component.settings(:step) do |settings|
23
+ # Add your settings per step
24
+ settings.attribute :announcement, type: :text, translated: true, editor: true
25
+ end
26
+
27
+ # component.register_stat :some_stat do |context, start_at, end_at|
28
+ # # Register some stat number to the application
29
+ # end
30
+
31
+ component.seeds do |participatory_space|
32
+ # Create a Map and a few geolocated proposals
33
+ admin_user = Decidim::User.find_by(
34
+ organization: participatory_space.organization,
35
+ email: "admin@example.org"
36
+ )
37
+
38
+ params = {
39
+ name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :awesome_map).i18n_name,
40
+ manifest_name: :awesome_map,
41
+ published_at: Time.current,
42
+ participatory_space: participatory_space,
43
+ settings: {
44
+ announcement: { en: Faker::Lorem.paragraphs(2).join("\n") }
45
+ }
46
+ }
47
+
48
+ component = Decidim.traceability.perform_action!(
49
+ "publish",
50
+ Decidim::Component,
51
+ admin_user,
52
+ visibility: "all"
53
+ ) do
54
+ Decidim::Component.create!(params)
55
+ end
56
+
57
+ # Tweak proposals in Assemblies to geolocate them
58
+ next unless participatory_space.manifest.name == :assemblies
59
+
60
+ participatory_space.components.each do |comp|
61
+ next unless comp.manifest.name == :proposals
62
+
63
+ comp.attributes["settings"]["global"]["geocoding_enabled"] = true
64
+ comp.save!
65
+
66
+ Decidim::Proposals::Proposal.where(component: comp).each do |proposal|
67
+ proposal.address = "#{Faker::Address.street_address} #{Faker::Address.zip} #{Faker::Address.city}"
68
+ proposal.latitude = Faker::Address.latitude
69
+ proposal.longitude = Faker::Address.longitude
70
+ proposal.save!
71
+ end
72
+ end
73
+ end
74
+ 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 MapComponent
9
+ # This is the engine is used to create the component Map.
10
+ class Engine < ::Rails::Engine
11
+ isolate_namespace Decidim::DecidimAwesome::MapComponent
12
+
13
+ routes do
14
+ root to: "map#show"
15
+ end
16
+
17
+ def load_seed
18
+ nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module SystemChecker
6
+ class << self
7
+ # List of files overriden by this plugin
8
+ # overriden files has to match MD5 calculation to be sure is the same as the expected
9
+ def overrides
10
+ return @overrides if @overrides
11
+
12
+ # rubocop:disable Rails/DynamicFindBy
13
+ checksums = YAML.load_file("#{__dir__}/checksums.yml")
14
+ @overrides = checksums.map do |package, files|
15
+ props = {
16
+ spec: ::Gem::Specification.find_by_name(package),
17
+ files: files.map { |file, signatures| [file, signatures.values] }.to_h
18
+ }
19
+ [package, to_struct(props)]
20
+ end
21
+ # rubocop:enable Rails/DynamicFindBy
22
+ @overrides = to_struct(@overrides.to_h)
23
+ end
24
+
25
+ delegate :to_h, to: :overrides
26
+
27
+ def each(&block)
28
+ to_h.each(&block)
29
+ end
30
+
31
+ def each_file
32
+ each do |_, props|
33
+ props.files.each do |file, signatures|
34
+ yield "#{props.spec.gem_dir}#{file}", signatures
35
+ end
36
+ end
37
+ end
38
+
39
+ def valid?(spec, file)
40
+ find_signatures("#{spec.gem_dir}#{file}").detect { |s| md5("#{spec.gem_dir}#{file}") == s }
41
+ end
42
+
43
+ private
44
+
45
+ def find_signatures(file)
46
+ to_h.each do |_, props|
47
+ props.files.each do |f, signatures|
48
+ return signatures if file == "#{props.spec.gem_dir}#{f}"
49
+ end
50
+ end
51
+ end
52
+
53
+ def md5(file)
54
+ Digest::MD5.hexdigest(File.read(file))
55
+ end
56
+
57
+ def to_struct(obj)
58
+ OpenStruct.new obj
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end