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.
- checksums.yaml +4 -4
- data/README.md +38 -8
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +2 -2
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -1
- data/app/assets/config/decidim_decidim_awesome_manifest.css +2 -2
- data/app/assets/config/decidim_decidim_awesome_manifest.js +3 -2
- data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +2 -0
- data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +4 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 +77 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +14 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 +80 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +80 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 +24 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +7 -0
- data/app/assets/javascripts/decidim/decidim_awesome/{application.js → awesome_application.js} +1 -2
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +48 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +107 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +15 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +170 -178
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +56 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +7 -6
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +18 -5
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +57 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +172 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +34 -9
- data/app/assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 +24 -0
- data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +211 -0
- data/app/assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 +106 -0
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +7 -0
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +3 -0
- data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +21 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +15 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +27 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +12 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +66 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +35 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/{admin.scss → awesome_admin.scss} +19 -4
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +22 -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 +95 -1
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +16 -1
- data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +28 -0
- data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +11 -3
- data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +74 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +54 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +61 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map_form_cell.rb +19 -0
- data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +32 -0
- data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +45 -0
- data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +38 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +4 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +40 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +40 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +58 -0
- data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -1
- data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +39 -0
- data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +33 -20
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
- data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +2 -2
- data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +38 -0
- data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +38 -0
- data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +38 -0
- data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +50 -0
- data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +3 -1
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +11 -7
- data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +48 -0
- data/app/helpers/decidim/decidim_awesome/map_helper.rb +66 -53
- data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +78 -0
- data/app/middleware/decidim/decidim_awesome/current_config.rb +182 -0
- data/app/models/decidim/decidim_awesome/awesome_config.rb +15 -0
- data/app/models/decidim/decidim_awesome/user_override.rb +25 -0
- data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +2 -0
- data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +0 -5
- data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -0
- data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +21 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +0 -3
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +25 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +0 -2
- data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +4 -6
- data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
- data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +4 -0
- data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +6 -0
- data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -32
- data/app/views/decidim/proposals/admin/proposals/_form.html.erb +101 -0
- data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +83 -0
- data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -0
- data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +25 -11
- data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +8 -1
- data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
- data/app/views/v0.23/decidim/proposals/collaborative_drafts/_show.html.erb +134 -0
- data/app/views/v0.23/layouts/decidim/_head.html.erb +2 -2
- data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +2 -2
- data/app/views/v0.24/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
- data/app/views/{v0.22 → v0.24}/layouts/decidim/_head.html.erb +4 -2
- data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +3 -2
- data/config/locales/ca.yml +75 -3
- data/config/locales/cs.yml +75 -3
- data/config/locales/en.yml +104 -11
- data/config/locales/es.yml +74 -2
- data/config/locales/eu.yml +76 -4
- data/config/locales/fr.yml +214 -142
- data/config/locales/it.yml +284 -0
- data/config/locales/ja.yml +284 -0
- data/config/locales/nl.yml +208 -136
- data/config/locales/sv.yml +109 -37
- data/db/migrate/20210628150825_change_awesome_config_var_type.rb +12 -0
- data/lib/decidim/decidim_awesome/admin_engine.rb +16 -4
- data/lib/decidim/decidim_awesome/awesome_helpers.rb +17 -10
- data/lib/decidim/decidim_awesome/checksums.yml +19 -9
- data/lib/decidim/decidim_awesome/config.rb +54 -9
- data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +27 -21
- data/lib/decidim/decidim_awesome/custom_fields.rb +94 -0
- data/lib/decidim/decidim_awesome/engine.rb +64 -8
- data/lib/decidim/decidim_awesome/iframe_component/component.rb +1 -1
- data/lib/decidim/decidim_awesome/map_component/component.rb +8 -2
- data/lib/decidim/decidim_awesome/menu_hacker.rb +17 -15
- data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
- data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor.rb +116 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/current_config_examples.rb +143 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +4 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +428 -0
- data/lib/decidim/decidim_awesome/version.rb +2 -2
- data/lib/decidim/decidim_awesome.rb +41 -8
- data/vendor/assets/javascripts/codemirror.js +9801 -0
- data/vendor/assets/javascripts/delta.min.js +405 -0
- data/vendor/assets/javascripts/delta.min.js.map +1 -0
- data/vendor/assets/javascripts/europa.min.js +4 -0
- data/vendor/assets/javascripts/form-builder.min.js +19 -0
- data/vendor/assets/javascripts/form-render.min.js +19 -0
- data/vendor/assets/javascripts/inscrybmde.min.js +1 -1
- data/vendor/assets/javascripts/jquery-ui.min.js +13 -0
- data/vendor/assets/javascripts/jquery.truncate.js +105 -0
- data/vendor/assets/javascripts/keymap/sublime.js +720 -0
- data/vendor/assets/javascripts/mode/css/css.js +864 -0
- data/vendor/assets/javascripts/select2.js +6147 -0
- data/vendor/assets/langs/en-US.lang +110 -0
- data/vendor/assets/stylesheets/codemirror.css +350 -0
- data/vendor/assets/stylesheets/inscrybmde.min.scss +194 -0
- data/vendor/assets/stylesheets/jquery-ui.min.css +7 -0
- data/vendor/assets/stylesheets/select2-foundation-theme.css +249 -0
- data/vendor/assets/stylesheets/select2.css +515 -0
- metadata +101 -34
- data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -2
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -225
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -82
- data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +0 -12
- data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +0 -8
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +0 -27
- data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +0 -64
- data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
- data/lib/decidim/decidim_awesome/content_renderers.rb +0 -9
- 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.
|
44
|
+
ActionView::Base.include AwesomeHelpers
|
19
45
|
end
|
20
46
|
|
21
47
|
initializer "decidim_decidim_awesome.assets" do |app|
|
22
|
-
app.config.assets.precompile +=
|
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
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
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
|
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
|
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.
|
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
|