decidim-decidim_awesome 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -7
  3. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -0
  4. data/app/assets/config/decidim_decidim_awesome_manifest.js +1 -1
  5. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +1 -0
  6. data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +15 -0
  7. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +48 -0
  8. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +106 -0
  9. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +166 -170
  10. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +56 -0
  11. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +6 -5
  12. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +17 -4
  13. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +48 -0
  14. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +160 -0
  15. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +16 -5
  16. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +3 -0
  17. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +4 -0
  18. data/app/assets/stylesheets/decidim/decidim_awesome/admin.scss +10 -3
  19. data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +16 -0
  20. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
  21. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +95 -0
  22. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
  23. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +39 -0
  24. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +3 -9
  25. data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +51 -0
  26. data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +47 -0
  27. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -2
  28. data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +47 -0
  29. data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +4 -3
  30. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
  31. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +12 -3
  32. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +13 -0
  33. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +116 -0
  34. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
  35. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +21 -2
  36. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +0 -2
  37. data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +0 -2
  38. data/app/forms/decidim/decidim_awesome/admin/menu_form.rb +39 -0
  39. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +5 -1
  40. data/app/helpers/decidim/decidim_awesome/map_helper.rb +12 -50
  41. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +19 -0
  42. data/app/permissions/decidim/decidim_awesome/permissions.rb +2 -0
  43. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +0 -5
  44. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +1 -1
  45. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +1 -1
  46. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
  47. data/app/views/decidim/decidim_awesome/admin/menu_hacks/_form.html.erb +7 -0
  48. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +13 -0
  49. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +44 -0
  50. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +13 -0
  51. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +4 -31
  52. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +5 -0
  53. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +4 -1
  54. data/app/views/v0.23/layouts/decidim/_head.html.erb +1 -1
  55. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +1 -1
  56. data/app/views/{v0.22 → v0.24}/layouts/decidim/_head.html.erb +2 -0
  57. data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +1 -0
  58. data/config/locales/ca.yml +70 -2
  59. data/config/locales/cs.yml +71 -3
  60. data/config/locales/en.yml +61 -4
  61. data/config/locales/es.yml +70 -2
  62. data/config/locales/eu.yml +225 -0
  63. data/config/locales/fr.yml +172 -104
  64. data/config/locales/nl.yml +225 -0
  65. data/config/locales/sv.yml +93 -25
  66. data/lib/decidim/decidim_awesome.rb +15 -0
  67. data/lib/decidim/decidim_awesome/admin_engine.rb +1 -0
  68. data/lib/decidim/decidim_awesome/awesome_helpers.rb +1 -1
  69. data/lib/decidim/decidim_awesome/checksums.yml +7 -4
  70. data/lib/decidim/decidim_awesome/config.rb +1 -3
  71. data/lib/decidim/decidim_awesome/engine.rb +3 -3
  72. data/lib/decidim/decidim_awesome/iframe_component/component.rb +1 -1
  73. data/lib/decidim/decidim_awesome/map_component/component.rb +8 -2
  74. data/lib/decidim/decidim_awesome/menu_hacker.rb +90 -0
  75. data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
  76. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +4 -2
  77. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +71 -0
  78. data/lib/decidim/decidim_awesome/version.rb +2 -2
  79. data/vendor/assets/javascripts/codemirror.js +9801 -0
  80. data/vendor/assets/javascripts/jquery.truncate.js +105 -0
  81. data/vendor/assets/javascripts/keymap/sublime.js +720 -0
  82. data/vendor/assets/javascripts/mode/css/css.js +864 -0
  83. data/vendor/assets/stylesheets/codemirror.css +350 -0
  84. data/vendor/assets/stylesheets/inscrybmde.min.scss +180 -0
  85. metadata +61 -20
  86. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -225
  87. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -82
  88. data/vendor/assets/stylesheets/inscrybmde.min.css +0 -8
@@ -0,0 +1,16 @@
1
+ .awesome-edit-config{
2
+ .scoped-style{
3
+ .form-error {
4
+ margin: 0;
5
+ }
6
+ >.CodeMirror{
7
+ border-top: .5em solid #f6f6f6;
8
+ border-right: .5em solid #f6f6f6;
9
+ min-height: 6em;
10
+ height: auto;
11
+ max-height: 40em;
12
+ resize: vertical;
13
+ overflow: vertical !important;
14
+ }
15
+ }
16
+ }
@@ -7,3 +7,12 @@
7
7
  .leaflet-default-icon-path {
8
8
  background-image: url(<%= asset_path "marker-icon.png" %>);
9
9
  }
10
+ .leaflet-container {
11
+ font: inherit;
12
+
13
+ #bodyContent .description {
14
+ img, iframe {
15
+ max-height: 5em;
16
+ }
17
+ }
18
+ }
@@ -63,4 +63,99 @@
63
63
  border: 2px solid #bbb;
64
64
  border-radius: 4px;
65
65
  }
66
+
67
+ .awesome_map-title-control{
68
+ display: block;
69
+ cursor: pointer;
70
+
71
+ &::after{
72
+ content: '';
73
+ width: 0;
74
+ height: 0;
75
+ border-left: 5px solid transparent;
76
+ border-right: 5px solid transparent;
77
+ border-top: 5px solid black;
78
+ border-bottom: 0;
79
+ display: inline-block;
80
+ margin: 0 0 2px 5px;
81
+ }
82
+ }
83
+
84
+ .active{
85
+ .awesome_map-title-control::after{
86
+ border-top: 0;
87
+ border-bottom: 5px solid black;
88
+ }
89
+ }
90
+
91
+ #awesome_map-{
92
+ &categories-control{
93
+ display: none;
94
+
95
+ label{
96
+ margin-left: .5rem;
97
+ display: none;
98
+
99
+ i{
100
+ display: inline-block;
101
+ width: .8rem;
102
+ height: .8rem;
103
+ border-radius: 50%;
104
+ background-color: var(-- primary);
105
+ }
106
+
107
+ &.subcategory{
108
+ padding-left: 1em;
109
+ }
110
+ }
111
+
112
+ .categories-container{
113
+ display: none;
114
+ }
115
+
116
+ &.active{
117
+ .categories-container{
118
+ display: block;
119
+ }
120
+ }
121
+ }
122
+
123
+ &hashtags-control{
124
+ display: none;
125
+
126
+ label{
127
+ display: inline-block;
128
+ line-height: 1;
129
+ background-color: #f0f0f0;
130
+ border-radius: 5px;
131
+ margin: .5rem;
132
+ padding: .5rem;
133
+
134
+ span{
135
+ margin: 0 .5rem 2px 0;
136
+ }
137
+
138
+ input{
139
+ vertical-align: top;
140
+ }
141
+ }
142
+
143
+ .awesome_map-toggle_all_tags{
144
+ margin: .5rem 1rem;
145
+ font-size: .875rem;
146
+ }
147
+
148
+ .hashtags-container,
149
+ .awesome_map-toggle_all_tags{
150
+ display: none;
151
+ }
152
+
153
+ &.active{
154
+ .hashtags-container,
155
+ .awesome_map-toggle_all_tags{
156
+ display: block;
157
+ }
158
+ }
159
+ }
160
+ }
66
161
  }
@@ -1,6 +1,6 @@
1
1
  // editor tweaks
2
2
  //
3
- .CodeMirror{
3
+ .editor .CodeMirror{
4
4
  color: #333;
5
5
  font-weight: normal;
6
6
  line-height: 1.45;
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ Decidim::MenuPresenter.class_eval do
4
+ def evaluated_menu
5
+ @evaluated_menu ||= if awesome_override?
6
+ Decidim::DecidimAwesome::MenuHacker.new(@name, @view)
7
+ else
8
+ begin
9
+ menu = Decidim::Menu.new(@name)
10
+ menu.build_for(@view)
11
+ menu
12
+ end
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def awesome_override?
19
+ return false unless Decidim::DecidimAwesome.config.has_key?(@name)
20
+
21
+ Decidim::DecidimAwesome.config.send(@name) != :disabled
22
+ end
23
+ end
24
+
25
+ Decidim::MenuItemPresenter.class_eval do
26
+ def link_to(name = nil, options = nil, html_options = nil, &block)
27
+ html_options ||= {}
28
+ html_options[:target] = @menu_item.try(:target)
29
+
30
+ options ||= html_options
31
+ @view.link_to(name, options, html_options, &block)
32
+ end
33
+
34
+ def active
35
+ return @menu_item.active.call(url, @view) if @menu_item.try(:active).respond_to?(:call)
36
+
37
+ @menu_item&.active
38
+ end
39
+ end
@@ -25,15 +25,9 @@ Decidim::Proposals::ProposalPresenter.class_eval do
25
25
  # rubocop:enable Metrics/CyclomaticComplexity
26
26
  # rubocop:enable Metrics/PerceivedComplexity
27
27
 
28
- if defined? translated_attribute
29
- text = translated_attribute(proposal.body)
30
-
31
- text = strip_tags(sanitize_text(text)) if strip_tags
32
- else
33
- # TODO: remove when 0.22 is diched
34
- text = proposal.body
35
- text = strip_tags(text) if strip_tags
36
- end
28
+ # TODO: remove when 0.23 is ditched
29
+ text = translated_attribute(proposal.body)
30
+ text = strip_tags(sanitize_text(text)) if strip_tags
37
31
 
38
32
  renderer = Decidim::ContentRenderers::HashtagRenderer.new(text)
39
33
  text = renderer.render(links: links, extras: extras).html_safe
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Admin
6
+ class CreateMenuHack < Rectify::Command
7
+ # Public: Initializes the command.
8
+ #
9
+ def initialize(form, menu_name)
10
+ @form = form
11
+ @menu = AwesomeConfig.find_or_initialize_by(var: menu_name, organization: form.current_organization)
12
+ end
13
+
14
+ # Executes the command. Broadcasts these events:
15
+ #
16
+ # - :ok when everything is valid.
17
+ # - :invalid if we couldn't proceed.
18
+ #
19
+ # Returns nothing.
20
+ def call
21
+ return broadcast(:invalid) if form.invalid?
22
+ return broadcast(:invalid, I18n.t("menu_hacks.url_exists", scope: "decidim.decidim_awesome.admin")) if url_exists?
23
+
24
+ menu.value = [] unless menu.value.is_a? Array
25
+ menu.value << to_params
26
+ menu.save!
27
+ broadcast(:ok, menu)
28
+ rescue StandardError => e
29
+ broadcast(:invalid, e.message)
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :form, :menu
35
+
36
+ def url_exists?
37
+ return false unless menu
38
+
39
+ menu.value&.detect { |i| i["url"] == form.url.gsub(/\?.*/, "") }
40
+ end
41
+
42
+ def to_params
43
+ params = form.to_params
44
+ url = Addressable::URI.parse(params[:url])
45
+ params[:url] = url.path if url.host == form.current_organization.host
46
+ params
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Admin
6
+ class DestroyMenuHack < Rectify::Command
7
+ # Public: Initializes the command.
8
+ #
9
+ # item - the menu item to destroy
10
+ # organization
11
+ def initialize(item, menu_name, organization)
12
+ @item = item
13
+ @organization = organization
14
+ @menu = AwesomeConfig.find_by(var: menu_name, organization: organization)
15
+ end
16
+
17
+ # Executes the command. Broadcasts these events:
18
+ #
19
+ # - :ok when everything is valid.
20
+ # - :invalid if we couldn't proceed.
21
+ #
22
+ # Returns nothing.
23
+ def call
24
+ return broadcast(:invalid) unless url_exists?
25
+
26
+ menu.value&.reject! { |i| i["url"] == item.url }
27
+ menu.save!
28
+
29
+ broadcast(:ok, @item)
30
+ rescue StandardError => e
31
+ broadcast(:invalid, e.message)
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :organization, :item, :menu
37
+
38
+ def url_exists?
39
+ return false unless menu
40
+ return false unless menu.value.is_a? Array
41
+
42
+ menu.value&.detect { |i| i["url"] == item.url }
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -18,12 +18,15 @@ module Decidim
18
18
  #
19
19
  # Returns nothing.
20
20
  def call
21
- return broadcast(:invalid) if form.invalid?
21
+ if form.invalid?
22
+ message = form.errors[:scoped_styles].join("; ") if @form.errors[:scoped_styles].any?
23
+ return broadcast(:invalid, message, form.errors)
24
+ end
22
25
 
23
26
  begin
24
27
  form.attributes.each do |key, val|
25
28
  # ignore nil attributes (must specifically be set to false if necessary)
26
- next if val.nil?
29
+ next unless form.valid_keys.include?(key)
27
30
 
28
31
  setting = AwesomeConfig.find_or_initialize_by(var: key, organization: form.current_organization)
29
32
 
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DecidimAwesome
5
+ module Admin
6
+ class UpdateMenuHack < Rectify::Command
7
+ # Public: Initializes the command.
8
+ #
9
+ def initialize(form, menu_name)
10
+ @form = form
11
+ @menu = AwesomeConfig.find_or_initialize_by(var: menu_name, organization: form.current_organization)
12
+ end
13
+
14
+ # Executes the command. Broadcasts these events:
15
+ #
16
+ # - :ok when everything is valid.
17
+ # - :invalid if we couldn't proceed.
18
+ #
19
+ # Returns nothing.
20
+ def call
21
+ return broadcast(:invalid) if form.invalid?
22
+
23
+ menu.value = [] unless menu.value.is_a? Array
24
+ menu.value = menu.value.filter { |i| i.is_a? Hash }
25
+ found = false
26
+ menu.value.map! do |item|
27
+ if item["url"] == form.url
28
+ found = true
29
+ form.to_params
30
+ else
31
+ item
32
+ end
33
+ end
34
+ menu.value << form.to_params unless found
35
+ menu.save!
36
+ broadcast(:ok, menu)
37
+ rescue StandardError => e
38
+ broadcast(:invalid, e.message)
39
+ end
40
+
41
+ private
42
+
43
+ attr_reader :form, :menu
44
+ end
45
+ end
46
+ end
47
+ end
@@ -9,9 +9,10 @@ module Decidim
9
9
  # Note that it inherits from `Decidim::Admin::Components::BaseController`, which
10
10
  # override its layout and provide all kinds of useful methods.
11
11
  class ApplicationController < Decidim::Admin::ApplicationController
12
- # def permission_class_chain
13
- # [::Decidim::DecidimAwesome::Admin::Permissions] + super
14
- # end
12
+ def permission_class_chain
13
+ [::Decidim::DecidimAwesome::Admin::Permissions] + super
14
+ end
15
+
15
16
  before_action do
16
17
  enforce_permission_to :update, :organization, organization: current_organization
17
18
  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)
@@ -12,22 +12,25 @@ module Decidim
12
12
  layout "decidim/admin/decidim_awesome"
13
13
 
14
14
  helper_method :constraints_for
15
+ before_action do
16
+ enforce_permission_to :edit_config, configs
17
+ end
15
18
 
16
19
  def show
17
20
  @form = form(ConfigForm).from_params(organization_awesome_config)
18
21
  end
19
22
 
20
23
  def update
21
- @form = form(ConfigForm).from_params(params)
24
+ @form = form(ConfigForm).from_params(params[:config])
22
25
  UpdateConfig.call(@form) do
23
26
  on(:ok) do
24
27
  flash[:notice] = I18n.t("config.update.success", scope: "decidim.decidim_awesome.admin")
25
28
  redirect_to decidim_admin_decidim_awesome.config_path
26
29
  end
27
30
 
28
- on(:invalid) do |message|
31
+ on(:invalid) do |message, err|
29
32
  flash.now[:alert] = I18n.t("config.update.error", error: message, scope: "decidim.decidim_awesome.admin")
30
- render :show
33
+ render :show, locals: { errors: err.presence }
31
34
  end
32
35
  end
33
36
  end
@@ -65,6 +68,12 @@ module Decidim
65
68
  def constraints_for(key)
66
69
  awesome_config_instance.setting_for(key)&.constraints
67
70
  end
71
+
72
+ def configs
73
+ return params[:config].keys if params.has_key?(:config)
74
+
75
+ DecidimAwesome.config.keys
76
+ end
68
77
  end
69
78
  end
70
79
  end
@@ -9,6 +9,9 @@ module Decidim
9
9
  helper ConfigConstraintsHelpers
10
10
 
11
11
  layout false
12
+ before_action do
13
+ enforce_permission_to :edit_config, constraint_key
14
+ end
12
15
 
13
16
  def new
14
17
  @form = form(ConstraintForm).from_params(filtered_params, setting: current_setting)
@@ -118,6 +121,16 @@ module Decidim
118
121
  def current_setting
119
122
  awesome_config_instance.setting_for params[:key]
120
123
  end
124
+
125
+ def constraint_key
126
+ key = params[:key] || constraint.awesome_config.var
127
+ case key
128
+ when /^scoped_style_/
129
+ :scoped_styles
130
+ else
131
+ key
132
+ end
133
+ end
121
134
  end
122
135
  end
123
136
  end