decidim-decidim_awesome 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +307 -0
- data/Rakefile +51 -0
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +3 -0
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -0
- data/app/assets/config/decidim_decidim_awesome_manifest.css +5 -0
- data/app/assets/config/decidim_decidim_awesome_manifest.js +2 -0
- data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
- data/app/assets/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin.js +2 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/constraints.js.es6 +54 -0
- data/app/assets/javascripts/decidim/decidim_awesome/application.js +4 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/api_fetcher.js.es6 +38 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/categories.js.es6 +25 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +215 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +129 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +78 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +12 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +162 -0
- data/app/assets/javascripts/decidim/decidim_awesome/forms/autosave.js.es6 +90 -0
- data/app/assets/javascripts/decidim/decidim_awesome/proposals/images.js.es6 +25 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin.scss +45 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +37 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +8 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +10 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +66 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +17 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +27 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +7 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/forms/autosave.scss +17 -0
- data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +31 -0
- data/app/commands/decidim/decidim_awesome/admin/create_constraint.rb +47 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +31 -0
- data/app/commands/decidim/decidim_awesome/admin/update_config.rb +44 -0
- data/app/commands/decidim/decidim_awesome/admin/update_constraint.rb +44 -0
- data/app/commands/decidim/decidim_awesome/create_editor_image.rb +34 -0
- data/app/controllers/concerns/decidim/decidim_awesome/needs_awesome_config.rb +17 -0
- data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +21 -0
- data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +37 -0
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +44 -0
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +126 -0
- data/app/controllers/decidim/decidim_awesome/application_controller.rb +14 -0
- data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +50 -0
- data/app/controllers/decidim/decidim_awesome/iframe_component/application_controller.rb +15 -0
- data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +33 -0
- data/app/controllers/decidim/decidim_awesome/map_component/application_controller.rb +15 -0
- data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +31 -0
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +22 -0
- data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +20 -0
- data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +21 -0
- data/app/forms/decidim/decidim_awesome/editor_image_form.rb +16 -0
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +90 -0
- data/app/helpers/decidim/decidim_awesome/application_helper.rb +10 -0
- data/app/helpers/decidim/decidim_awesome/map_helper.rb +121 -0
- data/app/models/decidim/decidim_awesome/application_record.rb +10 -0
- data/app/models/decidim/decidim_awesome/awesome_config.rb +23 -0
- data/app/models/decidim/decidim_awesome/config_constraint.rb +13 -0
- data/app/models/decidim/decidim_awesome/editor_image.rb +24 -0
- data/app/permissions/decidim/decidim_awesome/permissions.rb +29 -0
- data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +22 -0
- data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +35 -0
- data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +27 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +20 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_livechat.html.erb +44 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +12 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +9 -0
- data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +11 -0
- data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +15 -0
- data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +56 -0
- data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +14 -0
- data/app/views/decidim/decidim_awesome/admin/constraints/show.html.erb +14 -0
- data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +9 -0
- data/app/views/decidim/decidim_awesome/map_component/map/error.erb +7 -0
- data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +74 -0
- data/app/views/layouts/decidim/_head.html.erb +5 -0
- data/app/views/layouts/decidim/admin/_header.html.erb +5 -0
- data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +47 -0
- data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +20 -0
- data/app/views/layouts/decidim/decidim_awesome/_intergram_widget.html.erb +16 -0
- data/app/views/v0.21/layouts/decidim/_head.html.erb +34 -0
- data/app/views/v0.21/layouts/decidim/admin/_header.html.erb +9 -0
- data/app/views/v0.22/layouts/decidim/_head.html.erb +36 -0
- data/app/views/v0.22/layouts/decidim/admin/_header.html.erb +11 -0
- data/config/i18n-tasks.yml +10 -0
- data/config/locales/ca.yml +125 -0
- data/config/locales/cs.yml +125 -0
- data/config/locales/en.yml +176 -0
- data/config/locales/es.yml +125 -0
- data/config/locales/fr.yml +125 -0
- data/config/locales/sv.yml +125 -0
- data/db/migrate/20200324170000_create_decidim_awesome_config.rb +16 -0
- data/db/migrate/20200324230936_create_awesome_editor_images.rb +14 -0
- data/db/migrate/20200403142257_create_decidim_awesome_config_constraints.rb +13 -0
- data/db/seeds.rb +27 -0
- data/lib/decidim/decidim_awesome.rb +110 -0
- data/lib/decidim/decidim_awesome/admin.rb +10 -0
- data/lib/decidim/decidim_awesome/admin_engine.rb +45 -0
- data/lib/decidim/decidim_awesome/awesome_helpers.rb +55 -0
- data/lib/decidim/decidim_awesome/checksums.yml +15 -0
- data/lib/decidim/decidim_awesome/config.rb +129 -0
- data/lib/decidim/decidim_awesome/content_renderers.rb +9 -0
- data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +18 -0
- data/lib/decidim/decidim_awesome/context_analyzers.rb +11 -0
- data/lib/decidim/decidim_awesome/context_analyzers/component_analyzer.rb +38 -0
- data/lib/decidim/decidim_awesome/context_analyzers/participatory_space_analyzer.rb +31 -0
- data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +97 -0
- data/lib/decidim/decidim_awesome/engine.rb +38 -0
- data/lib/decidim/decidim_awesome/iframe_component/component.rb +59 -0
- data/lib/decidim/decidim_awesome/iframe_component/engine.rb +23 -0
- data/lib/decidim/decidim_awesome/map_component/component.rb +74 -0
- data/lib/decidim/decidim_awesome/map_component/engine.rb +23 -0
- data/lib/decidim/decidim_awesome/system_checker.rb +63 -0
- data/lib/decidim/decidim_awesome/test/factories.rb +36 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +25 -0
- data/lib/decidim/decidim_awesome/test/themes/css.lvh.me.css +3 -0
- data/lib/decidim/decidim_awesome/test/themes/erb.lvh.me.scss.erb +2 -0
- data/lib/decidim/decidim_awesome/test/themes/scss.lvh.me.scss +1 -0
- data/lib/decidim/decidim_awesome/test/themes/test-theme/body.scss +4 -0
- data/lib/decidim/decidim_awesome/version.rb +10 -0
- data/vendor/assets/images/layers-2x.png +0 -0
- data/vendor/assets/images/layers.png +0 -0
- data/vendor/assets/images/marker-icon.png +0 -0
- data/vendor/assets/javascripts/codemirror-4.inline-attachment.js +89 -0
- data/vendor/assets/javascripts/form-storage.js +824 -0
- data/vendor/assets/javascripts/highlight.min.js +44 -0
- data/vendor/assets/javascripts/image-resize.min.js +1 -0
- data/vendor/assets/javascripts/image-upload.min.js +6 -0
- data/vendor/assets/javascripts/inline-attachment.js +399 -0
- data/vendor/assets/javascripts/inscrybmde.min.js +7 -0
- data/vendor/assets/javascripts/jquery.inline-attachment.js +66 -0
- data/vendor/assets/javascripts/leaflet.featuregroup.subgroup.js +6 -0
- data/vendor/assets/stylesheets/default.min.css +1 -0
- data/vendor/assets/stylesheets/foundation.min.css +1 -0
- data/vendor/assets/stylesheets/github.min.css +2 -0
- data/vendor/assets/stylesheets/inscrybmde.min.css +8 -0
- metadata +267 -0
@@ -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
|