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,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
class CreateProposalCustomField < Rectify::Command
|
7
|
+
include NeedsConstraintHelpers
|
8
|
+
|
9
|
+
# Public: Initializes the command.
|
10
|
+
#
|
11
|
+
def initialize(organization)
|
12
|
+
@organization = organization
|
13
|
+
@ident = rand(36**8).to_s(36)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Executes the command. Broadcasts these events:
|
17
|
+
#
|
18
|
+
# - :ok when everything is valid.
|
19
|
+
# - :invalid if we couldn't proceed.
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
def call
|
23
|
+
fields = AwesomeConfig.find_or_initialize_by(var: :proposal_custom_fields, organization: @organization)
|
24
|
+
fields.value = {} unless fields.value.is_a? Hash
|
25
|
+
# TODO: prevent (unlikely) colisions with exisiting values
|
26
|
+
fields.value[@ident] = default_definition
|
27
|
+
fields.save!
|
28
|
+
|
29
|
+
create_constraint_never(:proposal_custom_field)
|
30
|
+
|
31
|
+
broadcast(:ok, @ident)
|
32
|
+
rescue StandardError => e
|
33
|
+
broadcast(:invalid, e.message)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def default_definition
|
39
|
+
# '[{"type":"textarea","required":true,"label":"Body","className":"form-control","name":"body","subtype":"textarea"}]'
|
40
|
+
"[]"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
class CreateScopedAdmin < Rectify::Command
|
7
|
+
include NeedsConstraintHelpers
|
8
|
+
|
9
|
+
# Public: Initializes the command.
|
10
|
+
#
|
11
|
+
def initialize(organization)
|
12
|
+
@organization = organization
|
13
|
+
@ident = rand(36**8).to_s(36)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Executes the command. Broadcasts these events:
|
17
|
+
#
|
18
|
+
# - :ok when everything is valid.
|
19
|
+
# - :invalid if we couldn't proceed.
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
def call
|
23
|
+
admins = AwesomeConfig.find_or_initialize_by(var: :scoped_admins, organization: @organization)
|
24
|
+
admins.value = {} unless admins.value.is_a? Hash
|
25
|
+
# TODO: prevent (unlikely) colisions with exisiting values
|
26
|
+
admins.value[@ident] = []
|
27
|
+
admins.save!
|
28
|
+
|
29
|
+
create_constraint_never(:scoped_admin)
|
30
|
+
|
31
|
+
broadcast(:ok, @ident)
|
32
|
+
rescue StandardError => e
|
33
|
+
broadcast(:invalid, e.message)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -4,6 +4,8 @@ module Decidim
|
|
4
4
|
module DecidimAwesome
|
5
5
|
module Admin
|
6
6
|
class DestroyConstraint < Rectify::Command
|
7
|
+
include NeedsConstraintHelpers
|
8
|
+
|
7
9
|
# Public: Initializes the command.
|
8
10
|
#
|
9
11
|
# constraint - A constraint constraint
|
@@ -18,6 +20,8 @@ module Decidim
|
|
18
20
|
#
|
19
21
|
# Returns nothing.
|
20
22
|
def call
|
23
|
+
return broadcast(:invalid, I18n.t("cannot_be_destroyed", scope: "decidim.decidim_awesome.admin.config.constraints")) unless constraint_can_be_destroyed?(constraint)
|
24
|
+
|
21
25
|
constraint.destroy!
|
22
26
|
broadcast(:ok)
|
23
27
|
rescue StandardError => e
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
class DestroyProposalCustomField < Rectify::Command
|
7
|
+
# Public: Initializes the command.
|
8
|
+
#
|
9
|
+
# key - the key to destroy inise proposal_custom_fields
|
10
|
+
# organization
|
11
|
+
def initialize(key, organization)
|
12
|
+
@key = key
|
13
|
+
@organization = organization
|
14
|
+
end
|
15
|
+
|
16
|
+
# Executes the command. Broadcasts these events:
|
17
|
+
#
|
18
|
+
# - :ok when everything is valid.
|
19
|
+
# - :invalid if we couldn't proceed.
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
def call
|
23
|
+
fields = AwesomeConfig.find_by(var: :proposal_custom_fields, organization: @organization)
|
24
|
+
return broadcast(:invalid, "Not a hash") unless fields&.value.is_a? Hash
|
25
|
+
return broadcast(:invalid, "#{key} key invalid") unless fields.value.has_key?(@key)
|
26
|
+
|
27
|
+
fields.value.except!(@key)
|
28
|
+
fields.save!
|
29
|
+
# remove constrains associated (a new config var is generated automatically, by removing it, it will trigger destroy on dependents)
|
30
|
+
constraint = AwesomeConfig.find_by(var: "proposal_custom_field_#{@key}", organization: @organization)
|
31
|
+
constraint.destroy! if constraint.present?
|
32
|
+
|
33
|
+
broadcast(:ok, @key)
|
34
|
+
rescue StandardError => e
|
35
|
+
broadcast(:invalid, e.message)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
class DestroyScopedAdmin < Rectify::Command
|
7
|
+
# Public: Initializes the command.
|
8
|
+
#
|
9
|
+
# key - the key to destroy inside scoped_admins
|
10
|
+
# organization
|
11
|
+
def initialize(key, organization)
|
12
|
+
@key = key
|
13
|
+
@organization = organization
|
14
|
+
end
|
15
|
+
|
16
|
+
# Executes the command. Broadcasts these events:
|
17
|
+
#
|
18
|
+
# - :ok when everything is valid.
|
19
|
+
# - :invalid if we couldn't proceed.
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
def call
|
23
|
+
admins = AwesomeConfig.find_by(var: :scoped_admins, organization: @organization)
|
24
|
+
return broadcast(:invalid, "Not a hash") unless admins&.value.is_a? Hash
|
25
|
+
return broadcast(:invalid, "#{key} key invalid") unless admins.value.has_key?(@key)
|
26
|
+
|
27
|
+
admins.value.except!(@key)
|
28
|
+
admins.save!
|
29
|
+
# remove constrains associated (a new config var is generated automatically, by removing it, it will trigger destroy on dependents)
|
30
|
+
constraint = AwesomeConfig.find_by(var: "scoped_admin_#{@key}", organization: @organization)
|
31
|
+
constraint.destroy! if constraint.present?
|
32
|
+
|
33
|
+
broadcast(:ok, @key)
|
34
|
+
rescue StandardError => e
|
35
|
+
broadcast(:invalid, e.message)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -6,7 +6,7 @@ module Decidim
|
|
6
6
|
class DestroyScopedStyle < Rectify::Command
|
7
7
|
# Public: Initializes the command.
|
8
8
|
#
|
9
|
-
# key - the key to destroy
|
9
|
+
# key - the key to destroy inside scoped_styles
|
10
10
|
# organization
|
11
11
|
def initialize(key, organization)
|
12
12
|
@key = key
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
class RenameScopeLabel < Rectify::Command
|
7
|
+
# Public: Initializes the command.
|
8
|
+
#
|
9
|
+
# params - A constraint params
|
10
|
+
def initialize(params, organization)
|
11
|
+
@text = params[:text]&.strip&.gsub(" ", "_")&.parameterize&.truncate(64)
|
12
|
+
@scope = params[:scope]
|
13
|
+
@key = params[:key]
|
14
|
+
@attribute = params[:attribute]
|
15
|
+
@organization = organization
|
16
|
+
end
|
17
|
+
|
18
|
+
# Executes the command. Broadcasts these events:
|
19
|
+
#
|
20
|
+
# - :ok when everything is valid.
|
21
|
+
# - :invalid if we couldn't proceed.
|
22
|
+
#
|
23
|
+
# Returns nothing.
|
24
|
+
def call
|
25
|
+
raise StandardError, "empty value" if @text.blank?
|
26
|
+
raise StandardError, "key already exists" if config.value.keys.include? @text
|
27
|
+
|
28
|
+
transaction do
|
29
|
+
config.value[@text] = config.value.delete @key
|
30
|
+
config.save!
|
31
|
+
if config_scope
|
32
|
+
config_scope.var = scope
|
33
|
+
config_scope.save!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
broadcast(:ok, { scope: scope, key: @text })
|
38
|
+
rescue StandardError => e
|
39
|
+
broadcast(:invalid, e.message)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def scope
|
45
|
+
@scope.gsub(/_#{@key}$/, "_#{@text}")
|
46
|
+
end
|
47
|
+
|
48
|
+
def config
|
49
|
+
@config ||= Decidim::DecidimAwesome::AwesomeConfig.find_by!(var: @attribute, organization: @organization)
|
50
|
+
end
|
51
|
+
|
52
|
+
def config_scope
|
53
|
+
@config_scope ||= Decidim::DecidimAwesome::AwesomeConfig.find_by(var: @scope, organization: @organization)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -18,7 +18,11 @@ module Decidim
|
|
18
18
|
#
|
19
19
|
# Returns nothing.
|
20
20
|
def call
|
21
|
-
|
21
|
+
if form.invalid?
|
22
|
+
message = form.errors[:scoped_styles].join("; ") if @form.errors[:scoped_styles].any?
|
23
|
+
message = form.errors[:scoped_admins].join("; ") if @form.errors[:scoped_admins].any?
|
24
|
+
return broadcast(:invalid, message, form.errors)
|
25
|
+
end
|
22
26
|
|
23
27
|
begin
|
24
28
|
form.attributes.each do |key, val|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module AdminNotFoundRedirect
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
# rubocop:disable Rails/LexicallyScopedActionFilter:
|
10
|
+
before_action :redirect_unallowed_scoped_admins, only: :not_found
|
11
|
+
# rubocop:enable Rails/LexicallyScopedActionFilter
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def redirect_unallowed_scoped_admins
|
16
|
+
return unless request.original_fullpath =~ %r{^(/+)admin}
|
17
|
+
return unless Decidim::User.respond_to? :awesome_potential_admins
|
18
|
+
return unless defined? current_user
|
19
|
+
return unless Decidim::User.awesome_potential_admins.include? current_user.id
|
20
|
+
|
21
|
+
# assiging a flash message here does not work after redirection due the order of middleware in Rails
|
22
|
+
# as a workaround, send a message through a get parameter
|
23
|
+
path = "/admin/?unauthorized"
|
24
|
+
referer = request.headers["Referer"]
|
25
|
+
if referer
|
26
|
+
uri = URI(referer)
|
27
|
+
params = Rack::Utils.parse_query uri.query
|
28
|
+
unless request.params.has_key? "unauthorized"
|
29
|
+
params["unauthorized"] = nil
|
30
|
+
path = "#{uri.path}?#{Rack::Utils.build_query(params)}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
redirect_to path
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -37,7 +37,7 @@ module Decidim
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def decidim_version_valid?
|
40
|
-
Gem::Dependency.new("", DecidimAwesome::COMPAT_DECIDIM_VERSION).match?("", decidim_version)
|
40
|
+
Gem::Dependency.new("", DecidimAwesome::COMPAT_DECIDIM_VERSION).match?("", decidim_version, true)
|
41
41
|
end
|
42
42
|
|
43
43
|
def head_addons(part)
|
@@ -11,7 +11,7 @@ module Decidim
|
|
11
11
|
|
12
12
|
layout "decidim/admin/decidim_awesome"
|
13
13
|
|
14
|
-
helper_method :constraints_for
|
14
|
+
helper_method :constraints_for, :users_for
|
15
15
|
before_action do
|
16
16
|
enforce_permission_to :edit_config, configs
|
17
17
|
end
|
@@ -28,39 +28,44 @@ module Decidim
|
|
28
28
|
redirect_to decidim_admin_decidim_awesome.config_path
|
29
29
|
end
|
30
30
|
|
31
|
-
on(:invalid) do |message|
|
31
|
+
on(:invalid) do |message, err|
|
32
32
|
flash.now[:alert] = I18n.t("config.update.error", error: message, scope: "decidim.decidim_awesome.admin")
|
33
|
-
render :show
|
33
|
+
render :show, locals: { errors: err.presence }
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
38
|
+
def users
|
39
|
+
respond_to do |format|
|
40
|
+
format.json do
|
41
|
+
if (term = params[:term].to_s).present?
|
42
|
+
query = current_organization.users.order(name: :asc)
|
43
|
+
query = query.where("name ILIKE :term OR nickname ILIKE :term OR email ILIKE :term", term: "%#{term}%")
|
44
|
+
|
45
|
+
render json: query.all.collect { |u| { id: u.id, text: format_user_name(u) } }
|
46
|
+
else
|
47
|
+
render json: []
|
48
|
+
end
|
46
49
|
end
|
47
50
|
end
|
48
|
-
|
49
|
-
redirect_to decidim_admin_decidim_awesome.config_path(:styles)
|
50
51
|
end
|
51
52
|
|
52
|
-
def
|
53
|
-
|
54
|
-
on(:ok) do |
|
55
|
-
|
53
|
+
def rename_scope_label
|
54
|
+
RenameScopeLabel.call(params, current_organization) do
|
55
|
+
on(:ok) do |result|
|
56
|
+
render json: result.merge({
|
57
|
+
html: render_to_string(partial: "decidim/decidim_awesome/admin/config/constraints",
|
58
|
+
locals: {
|
59
|
+
key: result[:scope],
|
60
|
+
constraints: constraints_for(result[:scope])
|
61
|
+
})
|
62
|
+
})
|
56
63
|
end
|
57
64
|
|
58
65
|
on(:invalid) do |message|
|
59
|
-
|
66
|
+
render json: { error: message }, status: :unprocessable_entity
|
60
67
|
end
|
61
68
|
end
|
62
|
-
|
63
|
-
redirect_to decidim_admin_decidim_awesome.config_path(:styles)
|
64
69
|
end
|
65
70
|
|
66
71
|
private
|
@@ -74,6 +79,14 @@ module Decidim
|
|
74
79
|
|
75
80
|
DecidimAwesome.config.keys
|
76
81
|
end
|
82
|
+
|
83
|
+
def users_for(ids_list)
|
84
|
+
Decidim::User.where(id: ids_list).map { |user| OpenStruct.new(text: format_user_name(user), id: user.id) }
|
85
|
+
end
|
86
|
+
|
87
|
+
def format_user_name(user)
|
88
|
+
"<span class='#{"is-admin" if user.read_attribute("admin")}'>#{user.name} (@#{user.nickname} - #{user.email})</span>"
|
89
|
+
end
|
77
90
|
end
|
78
91
|
end
|
79
92
|
end
|
@@ -85,7 +85,7 @@ module Decidim
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def current_items
|
88
|
-
@current_items ||= current_menu.items(true)
|
88
|
+
@current_items ||= current_menu.items(include_invisible: true)
|
89
89
|
end
|
90
90
|
|
91
91
|
def current_menu
|
@@ -101,7 +101,7 @@ module Decidim
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def visibility_options
|
104
|
-
MenuForm::VISIBILITY_STATES.
|
104
|
+
MenuForm::VISIBILITY_STATES.index_by { |key| I18n.t(".menu_hacks.form.visibility.#{key}", scope: "decidim.decidim_awesome.admin") }
|
105
105
|
end
|
106
106
|
|
107
107
|
def target_options
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
# Global configuration controller
|
7
|
+
class ProposalCustomFieldsController < DecidimAwesome::Admin::ConfigController
|
8
|
+
def create
|
9
|
+
CreateProposalCustomField.call(current_organization) do
|
10
|
+
on(:ok) do |key|
|
11
|
+
flash[:notice] = I18n.t("config.create_proposal_custom_field.success", key: key, scope: "decidim.decidim_awesome.admin")
|
12
|
+
end
|
13
|
+
|
14
|
+
on(:invalid) do |message|
|
15
|
+
flash[:alert] = I18n.t("config.create_proposal_custom_field.error", error: message, scope: "decidim.decidim_awesome.admin")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
redirect_to decidim_admin_decidim_awesome.config_path(:proposal_custom_fields)
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
DestroyProposalCustomField.call(params[:key], current_organization) do
|
24
|
+
on(:ok) do |key|
|
25
|
+
flash[:notice] = I18n.t("config.destroy_proposal_custom_field.success", key: key, scope: "decidim.decidim_awesome.admin")
|
26
|
+
end
|
27
|
+
|
28
|
+
on(:invalid) do |message|
|
29
|
+
flash[:alert] = I18n.t("config.destroy_proposal_custom_field.error", error: message, scope: "decidim.decidim_awesome.admin")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
redirect_to decidim_admin_decidim_awesome.config_path(:proposal_custom_fields)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
# Global configuration controller
|
7
|
+
class ScopedAdminsController < DecidimAwesome::Admin::ConfigController
|
8
|
+
def create
|
9
|
+
CreateScopedAdmin.call(current_organization) do
|
10
|
+
on(:ok) do |key|
|
11
|
+
flash[:notice] = I18n.t("config.create_scoped_admin.success", key: key, scope: "decidim.decidim_awesome.admin")
|
12
|
+
end
|
13
|
+
|
14
|
+
on(:invalid) do |message|
|
15
|
+
flash[:alert] = I18n.t("config.create_scoped_admin.error", error: message, scope: "decidim.decidim_awesome.admin")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
redirect_to decidim_admin_decidim_awesome.config_path(:admins)
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
DestroyScopedAdmin.call(params[:key], current_organization) do
|
24
|
+
on(:ok) do |key|
|
25
|
+
flash[:notice] = I18n.t("config.destroy_scoped_admin.success", key: key, scope: "decidim.decidim_awesome.admin")
|
26
|
+
end
|
27
|
+
|
28
|
+
on(:invalid) do |message|
|
29
|
+
flash[:alert] = I18n.t("config.destroy_scoped_admin.error", error: message, scope: "decidim.decidim_awesome.admin")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
redirect_to decidim_admin_decidim_awesome.config_path(:admins)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Admin
|
6
|
+
# Global configuration controller
|
7
|
+
class ScopedStylesController < DecidimAwesome::Admin::ConfigController
|
8
|
+
def create
|
9
|
+
CreateScopedStyle.call(current_organization) do
|
10
|
+
on(:ok) do |key|
|
11
|
+
flash[:notice] = I18n.t("config.create_scoped_style.success", key: key, scope: "decidim.decidim_awesome.admin")
|
12
|
+
end
|
13
|
+
|
14
|
+
on(:invalid) do |message|
|
15
|
+
flash[:alert] = I18n.t("config.create_scoped_style.error", error: message, scope: "decidim.decidim_awesome.admin")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
redirect_to decidim_admin_decidim_awesome.config_path(:styles)
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
DestroyScopedStyle.call(params[:key], current_organization) do
|
24
|
+
on(:ok) do |key|
|
25
|
+
flash[:notice] = I18n.t("config.destroy_scoped_style.success", key: key, scope: "decidim.decidim_awesome.admin")
|
26
|
+
end
|
27
|
+
|
28
|
+
on(:invalid) do |message|
|
29
|
+
flash[:alert] = I18n.t("config.destroy_scoped_style.error", error: message, scope: "decidim.decidim_awesome.admin")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
redirect_to decidim_admin_decidim_awesome.config_path(:styles)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -4,6 +4,8 @@ module Decidim
|
|
4
4
|
module DecidimAwesome
|
5
5
|
module Admin
|
6
6
|
class ConfigForm < Decidim::Form
|
7
|
+
include ActionView::Helpers::SanitizeHelper
|
8
|
+
|
7
9
|
attribute :allow_images_in_full_editor, Boolean
|
8
10
|
attribute :allow_images_in_small_editor, Boolean
|
9
11
|
attribute :allow_images_in_proposals, Boolean
|
@@ -11,6 +13,8 @@ module Decidim
|
|
11
13
|
attribute :allow_images_in_markdown_editor, Boolean
|
12
14
|
attribute :auto_save_forms, Boolean
|
13
15
|
attribute :scoped_styles, Hash
|
16
|
+
attribute :proposal_custom_fields, Hash
|
17
|
+
attribute :scoped_admins, Hash
|
14
18
|
attribute :menu, Array[MenuForm]
|
15
19
|
attribute :intergram_for_admins, Boolean
|
16
20
|
attribute :intergram_for_admins_settings, IntergramForm
|
@@ -20,11 +24,57 @@ module Decidim
|
|
20
24
|
# collect all keys anything not specified in the params (UpdateConfig command ignores it)
|
21
25
|
attr_accessor :valid_keys
|
22
26
|
|
27
|
+
validate :css_syntax, if: ->(form) { form.scoped_styles.present? }
|
28
|
+
validate :json_syntax, if: ->(form) { form.proposal_custom_fields.present? }
|
29
|
+
|
30
|
+
# TODO: validate non general admins are here
|
31
|
+
|
23
32
|
def self.from_params(params, additional_params = {})
|
24
33
|
instance = super(params, additional_params)
|
25
34
|
instance.valid_keys = params.keys.map(&:to_sym) || []
|
35
|
+
instance.sanitize_labels!
|
26
36
|
instance
|
27
37
|
end
|
38
|
+
|
39
|
+
def css_syntax
|
40
|
+
scoped_styles.each do |key, code|
|
41
|
+
next unless code
|
42
|
+
|
43
|
+
SassC::Engine.new(code).render
|
44
|
+
rescue SassC::SyntaxError => e
|
45
|
+
errors.add(:scoped_styles, I18n.t("config.form.errors.incorrect_css", key: key, scope: "decidim.decidim_awesome.admin"))
|
46
|
+
errors.add(key.to_sym, e.message)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def json_syntax
|
51
|
+
proposal_custom_fields.each do |key, code|
|
52
|
+
next unless code
|
53
|
+
|
54
|
+
JSON.parse(code)
|
55
|
+
rescue JSON::ParserError => e
|
56
|
+
errors.add(:scoped_styles, I18n.t("config.form.errors.incorrect_json", key: key, scope: "decidim.decidim_awesome.admin"))
|
57
|
+
errors.add(key.to_sym, e.message)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# formBuilder has a bug and do not sanitize text if users copy/paste text with format in the label input
|
62
|
+
def sanitize_labels!
|
63
|
+
return unless proposal_custom_fields
|
64
|
+
|
65
|
+
proposal_custom_fields.transform_values! do |code|
|
66
|
+
next unless code
|
67
|
+
|
68
|
+
json = JSON.parse(code)
|
69
|
+
json.map! do |item|
|
70
|
+
item["label"] = strip_tags(item["label"])
|
71
|
+
item
|
72
|
+
end
|
73
|
+
JSON.generate(json)
|
74
|
+
rescue JSON::ParserError
|
75
|
+
code
|
76
|
+
end
|
77
|
+
end
|
28
78
|
end
|
29
79
|
end
|
30
80
|
end
|
@@ -10,7 +10,9 @@ module Decidim
|
|
10
10
|
attribute :component_manifest, String
|
11
11
|
attribute :component_id, Integer
|
12
12
|
|
13
|
-
validates :component_manifest, absence: true, if:
|
13
|
+
validates :component_manifest, absence: true, if: lambda { |form|
|
14
|
+
form.component_id.present? || ConfigConstraintsHelpers::OTHER_MANIFESTS.include?(form.participatory_space_manifest&.to_sym)
|
15
|
+
}
|
14
16
|
validates :component_id, absence: true, if: ->(form) { form.component_manifest.present? }
|
15
17
|
end
|
16
18
|
end
|