decidim-navigation_maps 1.1.1 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -5
- data/Rakefile +18 -0
- data/app/cells/decidim/navigation_maps/content_blocks/groups_navigation_map_cell.rb +21 -0
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_tabs_content.erb +1 -1
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/show.erb +6 -6
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_cell.rb +31 -0
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_form.erb +4 -4
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_tabs_content.erb +0 -1
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/show.erb +7 -3
- data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form_cell.rb +10 -1
- data/app/commands/decidim/navigation_maps/save_blueprints.rb +7 -1
- data/app/controllers/decidim/navigation_maps/admin/blueprints_controller.rb +3 -3
- data/app/forms/decidim/navigation_maps/area_form.rb +1 -1
- data/app/forms/decidim/navigation_maps/blueprint_form.rb +1 -0
- data/app/forms/decidim/navigation_maps/blueprint_forms.rb +1 -0
- data/app/jobs/decidim/navigation_maps/migrate_legacy_images_job.rb +32 -0
- data/app/models/decidim/navigation_maps/blueprint.rb +5 -3
- data/app/packs/entrypoints/decidim_admin_navigation_maps.js +4 -0
- data/app/packs/entrypoints/decidim_admin_navigation_maps.scss +1 -0
- data/app/packs/entrypoints/decidim_navigation_maps.js +7 -0
- data/app/packs/entrypoints/decidim_navigation_maps.scss +1 -0
- data/app/packs/src/decidim/navigation_maps/admin/map_editor.js +83 -0
- data/app/packs/src/decidim/navigation_maps/admin/navigation_maps.js +154 -0
- data/app/packs/src/decidim/navigation_maps/map_view.js +125 -0
- data/app/packs/src/decidim/navigation_maps/navigation_maps.js +43 -0
- data/app/{assets → packs}/stylesheets/decidim/navigation_maps/_variables.scss +0 -0
- data/app/{assets → packs}/stylesheets/decidim/navigation_maps/admin/navigation_maps.scss +4 -4
- data/app/{assets → packs}/stylesheets/decidim/navigation_maps/navigation_maps.scss +1 -2
- data/app/queries/decidim/navigation_maps/content_block_blueprints.rb +20 -0
- data/app/uploaders/decidim/navigation_maps/blueprint_uploader.rb +4 -12
- data/app/uploaders/decidim/navigation_maps/cw/blueprint_uploader.rb +24 -0
- data/config/assets.rb +41 -0
- data/config/locales/ca.yml +1 -0
- data/config/locales/cs.yml +2 -1
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/db/migrate/20201105130724_add_reference_to_content_block_to_blueprints_table.rb +12 -0
- data/db/seeds/pla-cerda.jpg +0 -0
- data/db/seeds.rb +62 -11
- data/lib/decidim/navigation_maps/admin_engine.rb +0 -4
- data/lib/decidim/navigation_maps/engine.rb +16 -4
- data/lib/decidim/navigation_maps/navigation_map_cell_helpers.rb +4 -4
- data/lib/decidim/navigation_maps/test/factories.rb +1 -0
- data/lib/decidim/navigation_maps/version.rb +2 -2
- data/lib/decidim/navigation_maps.rb +0 -2
- data/lib/tasks/custom_seeds.rake +8 -0
- data/lib/tasks/decidim_navigation_maps_webpacker_tasks.rake +58 -0
- data/lib/tasks/navigation_maps_active_storage_migration_tasks.rake +37 -0
- data/package.json +197 -0
- metadata +39 -48
- data/app/assets/config/admin/decidim_navigation_maps_manifest.css +0 -3
- data/app/assets/config/admin/decidim_navigation_maps_manifest.js +0 -3
- data/app/assets/config/decidim_navigation_maps_manifest.css +0 -3
- data/app/assets/config/decidim_navigation_maps_manifest.js +0 -1
- data/app/assets/images/decidim/navigation_maps/icon.svg +0 -1
- data/app/assets/javascripts/decidim/navigation_maps/admin/map_editor.js +0 -88
- data/app/assets/javascripts/decidim/navigation_maps/admin/navigation_maps.js +0 -143
- data/app/assets/javascripts/decidim/navigation_maps/map_view.js +0 -123
- data/app/assets/javascripts/decidim/navigation_maps/navigation_maps.js +0 -44
- data/vendor/assets/images/draw/layers-2x.png +0 -0
- data/vendor/assets/images/draw/layers.png +0 -0
- data/vendor/assets/images/draw/marker-icon-2x.png +0 -0
- data/vendor/assets/images/draw/marker-icon.png +0 -0
- data/vendor/assets/images/draw/marker-shadow.png +0 -0
- data/vendor/assets/images/draw/spritesheet-2x.png +0 -0
- data/vendor/assets/images/draw/spritesheet.png +0 -0
- data/vendor/assets/images/draw/spritesheet.svg +0 -156
- data/vendor/assets/images/images/layers-2x.png +0 -0
- data/vendor/assets/images/images/layers.png +0 -0
- data/vendor/assets/images/images/marker-icon-2x.png +0 -0
- data/vendor/assets/images/images/marker-icon.png +0 -0
- data/vendor/assets/images/images/marker-shadow.png +0 -0
- data/vendor/assets/javascripts/jquery.form.js +0 -1277
- data/vendor/assets/javascripts/jsrender.min.js +0 -4
- data/vendor/assets/javascripts/jsrender.min.js.map +0 -1
- data/vendor/assets/javascripts/leaflet-geoman.min.js +0 -1
- data/vendor/assets/javascripts/leaflet.js +0 -5
- data/vendor/assets/stylesheets/leaflet-geoman.css +0 -164
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12f9636d7c5efbbafe00544fe75c0e4322077eef70372002745b1410fe38e708
|
4
|
+
data.tar.gz: f8067c6af595868868386de9cf7459fdbf21d950c396f8113a14254af02f4c42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: caae4440a22439a2a87b0b723c0afba1c540224d10319466813200cd68a6bbf62b40133089a468cdeb760eb715be7b0d691630e1cbd8524fbd559f3d9080f08e
|
7
|
+
data.tar.gz: aca2ed28852c52ba098a4046e72652d21e8d89f81b51c36e706c191f2f547bfe34fc2477eafc01b2fec1bed006d49a2771dec39767ac8024a6a26085d5c6b6ac
|
data/README.md
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
[![Maintainability](https://api.codeclimate.com/v1/badges/f69b2b0ab0ffcd26f002/maintainability)](https://codeclimate.com/github/Platoniq/decidim-module-navigation_maps/maintainability)
|
5
5
|
[![Codecov](https://codecov.io/gh/Platoniq/decidim-module-navigation_maps/branch/master/graph/badge.svg?token=XhzWO0IiWt)](https://codecov.io/gh/Platoniq/decidim-module-navigation_maps)
|
6
6
|
|
7
|
-
|
7
|
+
This module allows admins to upload any arbitrary image and draw sensible zones over it with direct links to other places (ie: a specific participatory process) or display a popup explaining something.
|
8
8
|
|
9
|
-
|
9
|
+
Maps can be displayed in the homepage or as part of a process group landing.
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
@@ -24,23 +24,43 @@ homepage only).
|
|
24
24
|
Add this line to your application's Gemfile:
|
25
25
|
|
26
26
|
```ruby
|
27
|
-
gem "decidim-navigation_maps"
|
27
|
+
gem "decidim-navigation_maps"
|
28
28
|
```
|
29
29
|
|
30
|
-
And then execute:
|
30
|
+
And then execute (remember to repeat this if you are upgrading from version 1.1):
|
31
31
|
|
32
32
|
```bash
|
33
33
|
bundle
|
34
34
|
bundle exec rails decidim_navigation_maps:install:migrations
|
35
|
+
bundle exec rails decidim_navigation_maps:webpacker:install
|
35
36
|
bundle exec rails db:migrate
|
36
37
|
```
|
37
38
|
|
39
|
+
> NOTE: the `decidim_notify:webpacker:install` is only necessary for Decidim versions starting at 0.25.
|
40
|
+
|
41
|
+
If you are upgrading from a version prior to 1.3, make sure that you migrate your existing images to Active Storae:
|
42
|
+
|
43
|
+
```
|
44
|
+
RAILS_ENV=production bin/rails navigation_maps:active_storage_migrations:migrate_from_carrierwave
|
45
|
+
```
|
46
|
+
|
47
|
+
Or check your migration status with:
|
48
|
+
```
|
49
|
+
RAILS_ENV=production bin/rails navigation_maps:active_storage_migrations:check_migration_from_carrierwave
|
50
|
+
```
|
51
|
+
|
52
|
+
The correct version of Navigation Maps should resolved automatically by the Bundler.
|
53
|
+
However you can force some specific version using `gem "decidim-navigation_maps", "~> 1.3.0"` in the Gemfile.
|
54
|
+
|
55
|
+
|
38
56
|
Depending on your Decidim version, choose the corresponding Plugin version to ensure compatibility:
|
39
57
|
|
40
58
|
| Navigation Maps version | Compatible Decidim versions |
|
41
59
|
|---|---|
|
42
|
-
| 1.
|
60
|
+
| 1.3.x | 0.25.x, 0.26.x |
|
61
|
+
| 1.2.x | 0.24.x |
|
43
62
|
| 1.1.x | 0.22.x, 0.23.x |
|
63
|
+
| 1.0.x | 0.18.x - 0.21.x |
|
44
64
|
|
45
65
|
## Contributing
|
46
66
|
|
data/Rakefile
CHANGED
@@ -9,16 +9,29 @@ def install_module(path)
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
def override_webpacker_config_files(path)
|
13
|
+
Dir.chdir(path) do
|
14
|
+
system("bundle exec rake decidim_navigation_maps:webpacker:install")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
12
18
|
def seed_db(path)
|
13
19
|
Dir.chdir(path) do
|
14
20
|
system("bundle exec rake db:seed")
|
15
21
|
end
|
16
22
|
end
|
17
23
|
|
24
|
+
def seed_module_db(path)
|
25
|
+
Dir.chdir(path) do
|
26
|
+
system("bundle exec rake decidim_navigation_maps:seed")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
18
30
|
desc "Generates a dummy app for testing"
|
19
31
|
task test_app: "decidim:generate_external_test_app" do
|
20
32
|
ENV["RAILS_ENV"] = "test"
|
21
33
|
install_module("spec/decidim_dummy_app")
|
34
|
+
override_webpacker_config_files("spec/decidim_dummy_app")
|
22
35
|
end
|
23
36
|
|
24
37
|
desc "Generates a development app"
|
@@ -36,5 +49,10 @@ task :development_app do
|
|
36
49
|
end
|
37
50
|
|
38
51
|
install_module("development_app")
|
52
|
+
override_webpacker_config_files("development_app")
|
53
|
+
ENV["SKIP_MODULE_SEEDS"] = "1"
|
39
54
|
seed_db("development_app")
|
55
|
+
# manually seed navigation maps to ensure participatory process groups are created
|
56
|
+
ENV.delete "SKIP_MODULE_SEEDS"
|
57
|
+
seed_module_db("development_app")
|
40
58
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module NavigationMaps
|
5
|
+
module ContentBlocks
|
6
|
+
class GroupsNavigationMapCell < NavigationMapCell
|
7
|
+
def section_classes
|
8
|
+
"section"
|
9
|
+
end
|
10
|
+
|
11
|
+
def wrapper_classes
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def row_classes
|
16
|
+
"row column"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class="tabs-content admin" data-tabs-content="navigation_maps-tabs">
|
3
3
|
<% tabs.each_with_index do |item, index| %>
|
4
4
|
<div class="tabs-panel<%= " is-active" if index.zero? %>" id="map<%= index %>">
|
5
|
-
<%= content_tag(:div, "", id: "navigation_maps-map-#{item.id}", class: "map", style: "height: #{item.height}px", data: { id: item.id, image: item.image
|
5
|
+
<%= content_tag(:div, "", id: "navigation_maps-map-#{item.id}", class: "map", style: "height: #{item.height}px", data: { id: item.id, image: image_path(item.image), blueprint: item.blueprint }) %>
|
6
6
|
</div>
|
7
7
|
<% end %>
|
8
8
|
</div>
|
@@ -1,16 +1,16 @@
|
|
1
|
-
<%=
|
1
|
+
<%= stylesheet_pack_tag "decidim_navigation_maps" %>
|
2
2
|
<%= render partial: "styles", locals: { blueprints: valid_blueprints } %>
|
3
3
|
|
4
|
-
<section
|
5
|
-
<div
|
6
|
-
<div
|
4
|
+
<section<%= class_tag(section_classes) %>>
|
5
|
+
<div<%= class_tag(wrapper_classes) %>>
|
6
|
+
<div<%= class_tag(row_classes) %>>
|
7
7
|
|
8
8
|
<% if translated_title.present? %>
|
9
9
|
<h3 class="heading3"><%= decidim_sanitize translated_title %></h3>
|
10
10
|
<% end %>
|
11
11
|
|
12
12
|
<div class="navigation_maps">
|
13
|
-
<%=
|
13
|
+
<%= tabs %>
|
14
14
|
<%= render partial: "tabs_content", locals: { tabs: valid_blueprints } %>
|
15
15
|
</div>
|
16
16
|
</div>
|
@@ -18,4 +18,4 @@
|
|
18
18
|
</section>
|
19
19
|
|
20
20
|
<%= render partial: "template" %>
|
21
|
-
<%=
|
21
|
+
<%= javascript_pack_tag "decidim_navigation_maps" %>
|
@@ -7,15 +7,46 @@ module Decidim
|
|
7
7
|
include NavigationMaps::NavigationMapCellHelpers
|
8
8
|
include Decidim::SanitizeHelper
|
9
9
|
|
10
|
+
alias content_block model
|
11
|
+
|
10
12
|
view_paths << "#{Decidim::NavigationMaps::Engine.root}/app/cells/decidim/navigation_maps/content_blocks/navigation_map"
|
11
13
|
|
12
14
|
def show
|
13
15
|
render if valid_blueprints?
|
14
16
|
end
|
15
17
|
|
18
|
+
def tabs
|
19
|
+
return if model.settings.autohide_tabs? && valid_blueprints.count < 2
|
20
|
+
|
21
|
+
render partial: "tabs", locals: { tabs: valid_blueprints }
|
22
|
+
end
|
23
|
+
|
16
24
|
def translated_title
|
17
25
|
translated_attribute(model.settings.title)
|
18
26
|
end
|
27
|
+
|
28
|
+
def section_classes
|
29
|
+
"extended home-section"
|
30
|
+
end
|
31
|
+
|
32
|
+
def wrapper_classes
|
33
|
+
"wrapper-home"
|
34
|
+
end
|
35
|
+
|
36
|
+
def row_classes
|
37
|
+
"row column text-center"
|
38
|
+
end
|
39
|
+
|
40
|
+
def class_tag(class_string)
|
41
|
+
return if class_string.blank?
|
42
|
+
|
43
|
+
" class=\"#{class_string}\""
|
44
|
+
end
|
45
|
+
|
46
|
+
def image_path(image, options = {})
|
47
|
+
options.merge!({ only_path: true })
|
48
|
+
Rails.application.routes.url_helpers.rails_blob_url(image, options)
|
49
|
+
end
|
19
50
|
end
|
20
51
|
end
|
21
52
|
end
|
data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_form.erb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<ul class="accordion" data-accordion>
|
2
|
-
<li class="accordion-item<%= " is-active" unless
|
2
|
+
<li class="accordion-item<%= " is-active" unless image?(form) %>" data-accordion-item>
|
3
3
|
<a href="#" class="accordion-title"><%= t("navigation_map_settings_form.info", scope: "decidim.navigation_maps.content_blocks") %></a>
|
4
4
|
|
5
5
|
<div class="accordion-content" data-tab-content>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
<%= label_tag t("navigation_map_settings_form.blueprint_image", scope: "decidim.navigation_maps.content_blocks") %>
|
11
11
|
<div class="thumbnail">
|
12
|
-
<%= image_tag form.image
|
12
|
+
<%= image_tag image_path(form.image, variant: :thumbnail) if image?(form) %>
|
13
13
|
</div>
|
14
14
|
<%= file_field_tag "blueprints[#{form.ident}][image]", { id: "blueprints_#{form.ident}_image", label: t("navigation_map_settings_form.title", scope: "decidim.navigation_maps.content_blocks") } %>
|
15
15
|
|
@@ -25,12 +25,12 @@
|
|
25
25
|
</div>
|
26
26
|
</li>
|
27
27
|
|
28
|
-
<% if
|
28
|
+
<% if image?(form) %>
|
29
29
|
<li class="accordion-item is-active" data-accordion-item>
|
30
30
|
<a href="#" class="accordion-title"><%= t("navigation_map_settings_form.editor", scope: "decidim.navigation_maps.content_blocks") %></a>
|
31
31
|
<div class="accordion-content navigation_maps-content" data-tab-content>
|
32
32
|
|
33
|
-
<%= content_tag(:div, "", id: "navigation_maps-map-#{form.ident}", class: "map", data: { id: form.ident, image: form.image
|
33
|
+
<%= content_tag(:div, "", id: "navigation_maps-map-#{form.ident}", class: "map", data: { id: form.ident, image: image_path(form.image), blueprint: form.blueprint }) %>
|
34
34
|
|
35
35
|
</div>
|
36
36
|
</li>
|
@@ -1,11 +1,13 @@
|
|
1
1
|
<!-- Original settings -->
|
2
2
|
<% form.fields_for :settings, form.object.settings do |settings_fields| %>
|
3
|
-
<%= settings_fields.translated :text_field, :title %>
|
3
|
+
<%= settings_fields.translated :text_field, :title, label: t("content_blocks.navigation_map_settings_form.title", scope: "decidim.navigation_maps") %>
|
4
|
+
<%= settings_fields.check_box :autohide_tabs, label: t("content_blocks.navigation_map_settings_form.autohide_tabs", scope: "decidim.navigation_maps") %>
|
4
5
|
<% end %>
|
5
6
|
|
6
7
|
<!-- Override rails default patch (using post via ajax) -->
|
7
8
|
<%= hidden_field_tag :_method, "post" %>
|
8
9
|
<%= hidden_field_tag :action, blueprints_path %>
|
10
|
+
<%= hidden_field_tag :content_block_id, content_block.id %>
|
9
11
|
|
10
12
|
<div class="navigation_maps admin">
|
11
13
|
<div class="callout" style="display:none" data-closable>
|
@@ -31,5 +33,7 @@
|
|
31
33
|
</div>
|
32
34
|
|
33
35
|
<%= render partial: "modal" %>
|
34
|
-
|
35
|
-
<%=
|
36
|
+
<%# we need to rely on a CDN due a bug in webpacker that renders twice jquery if importing a plugin %>
|
37
|
+
<%= javascript_include_tag "https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js", integrity: "sha384-qlmct0AOBiA2VPZkMY3+2WqkHtIQ9lSdAsAn5RUJD/3vA5MKDgSGcdmIv4ycVxyn", crossorigin: "anonymous" %>
|
38
|
+
<%= javascript_pack_tag "decidim_admin_navigation_maps" %>
|
39
|
+
<%= stylesheet_pack_tag "decidim_admin_navigation_maps" %>
|
@@ -10,7 +10,7 @@ module Decidim
|
|
10
10
|
view_paths << "#{Decidim::NavigationMaps::Engine.root}/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form"
|
11
11
|
|
12
12
|
def blueprint_form(blueprint = nil)
|
13
|
-
blueprint ||= Blueprint.new
|
13
|
+
blueprint ||= Blueprint.new(content_block: content_block)
|
14
14
|
BlueprintForm.from_model(blueprint).with_context(organization: current_organization)
|
15
15
|
end
|
16
16
|
|
@@ -26,6 +26,15 @@ module Decidim
|
|
26
26
|
def label
|
27
27
|
I18n.t("decidim.content_blocks.html.html_content")
|
28
28
|
end
|
29
|
+
|
30
|
+
def image?(frm)
|
31
|
+
frm.image.attached?
|
32
|
+
end
|
33
|
+
|
34
|
+
def image_path(image, options = {})
|
35
|
+
options.merge!({ only_path: true })
|
36
|
+
Rails.application.routes.url_helpers.rails_blob_url(image, options)
|
37
|
+
end
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
module Decidim
|
4
4
|
module NavigationMaps
|
5
|
-
# This command creates or updates the blueprints for the organization
|
5
|
+
# This command creates or updates the blueprints for the organization and
|
6
|
+
# content block.
|
6
7
|
class SaveBlueprints < Rectify::Command
|
7
8
|
# Creates a blueprint.
|
8
9
|
#
|
@@ -42,6 +43,7 @@ module Decidim
|
|
42
43
|
def initialize_blueprint(form)
|
43
44
|
@blueprint = Blueprint.find_or_initialize_by(id: form.id) do |blueprint|
|
44
45
|
blueprint.organization = @forms.current_organization
|
46
|
+
blueprint.content_block = content_block
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
@@ -61,6 +63,10 @@ module Decidim
|
|
61
63
|
@blueprint.areas.where.not(area_id: except).destroy_all
|
62
64
|
end
|
63
65
|
|
66
|
+
def content_block
|
67
|
+
Decidim::ContentBlock.where(organization: @forms.current_organization, manifest_name: :navigation_map).find_by(id: @forms.content_block_id)
|
68
|
+
end
|
69
|
+
|
64
70
|
def create_areas(blueprint)
|
65
71
|
blueprint.each do |key, area|
|
66
72
|
a = BlueprintArea.find_or_initialize_by(area_id: key, blueprint: @blueprint)
|
@@ -13,7 +13,7 @@ module Decidim
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def show
|
16
|
-
render json: organization_blueprints.find(params[:id])
|
16
|
+
render json: organization_blueprints.find(params[:id]).to_json(except: :image)
|
17
17
|
end
|
18
18
|
|
19
19
|
def create
|
@@ -39,11 +39,11 @@ module Decidim
|
|
39
39
|
return unless params[:content_block][:settings]
|
40
40
|
|
41
41
|
@form = form(Decidim::Admin::ContentBlockForm).from_params(params)
|
42
|
-
Decidim::Admin::UpdateContentBlock.call(@form, content_block,
|
42
|
+
Decidim::Admin::UpdateContentBlock.call(@form, content_block, content_block.scope_name&.to_sym)
|
43
43
|
end
|
44
44
|
|
45
45
|
def content_block
|
46
|
-
@content_block ||= Decidim::ContentBlock.
|
46
|
+
@content_block ||= Decidim::ContentBlock.where(organization: current_organization, manifest_name: :navigation_map).find(params[:content_block_id])
|
47
47
|
end
|
48
48
|
|
49
49
|
# Convert blueprint data to an object
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module NavigationMaps
|
5
|
+
class MigrateLegacyImagesJob < ApplicationJob
|
6
|
+
queue_as :default
|
7
|
+
|
8
|
+
def perform(organization_id, mappings = [], logger = Rails.logger)
|
9
|
+
@organization_id = organization_id
|
10
|
+
@routes_mappings = mappings
|
11
|
+
@logger = logger
|
12
|
+
|
13
|
+
migrate_all!
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :routes_mappings, :logger
|
19
|
+
|
20
|
+
def migrate_all!
|
21
|
+
Decidim::CarrierWaveMigratorService.migrate_attachment!(
|
22
|
+
klass: Decidim::NavigationMaps::BluePrint,
|
23
|
+
cw_attribute: "image",
|
24
|
+
cw_uploader: Decidim::NavigationMaps::Cw::ImageUploader,
|
25
|
+
as_attribute: "image",
|
26
|
+
logger: @logger,
|
27
|
+
routes_mappings: routes_mappings
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -4,22 +4,24 @@ module Decidim
|
|
4
4
|
module NavigationMaps
|
5
5
|
# Abstract class from which all models in this engine inherit.
|
6
6
|
class Blueprint < ApplicationRecord
|
7
|
+
include Decidim::HasUploadValidations
|
8
|
+
|
7
9
|
self.table_name = "decidim_navigation_maps_blueprints"
|
8
10
|
|
9
11
|
attribute :height, :integer, default: 475
|
10
12
|
|
11
13
|
belongs_to :organization, foreign_key: :decidim_organization_id, class_name: "Decidim::Organization"
|
14
|
+
belongs_to :content_block, foreign_key: :decidim_content_block_id, class_name: "Decidim::ContentBlock"
|
12
15
|
has_many :areas,
|
13
16
|
foreign_key: "decidim_navigation_maps_blueprint_id",
|
14
17
|
class_name: "Decidim::NavigationMaps::BlueprintArea",
|
15
18
|
dependent: :destroy
|
16
19
|
|
17
20
|
validates :organization, presence: true
|
18
|
-
validates :image,
|
19
|
-
file_content_type: { allow: ["image/jpeg", "image/png", "image/svg+xml"] }
|
20
21
|
validates :height, numericality: { greater_than: 0 }
|
21
22
|
|
22
|
-
|
23
|
+
has_one_attached :image
|
24
|
+
validates_upload :image, uploader: Decidim::NavigationMaps::BlueprintUploader
|
23
25
|
|
24
26
|
def blueprint
|
25
27
|
areas.map { |area| [area.area_id.to_s, area.to_geoson] }.to_h
|
@@ -0,0 +1 @@
|
|
1
|
+
@import "stylesheets/decidim/navigation_maps/admin/navigation_maps";
|
@@ -0,0 +1 @@
|
|
1
|
+
@import "stylesheets/decidim/navigation_maps/navigation_maps";
|
@@ -0,0 +1,83 @@
|
|
1
|
+
// Creates a map
|
2
|
+
import NavigationMapView from "src/decidim/navigation_maps/map_view.js";
|
3
|
+
|
4
|
+
export default class NavigationMapEditor extends NavigationMapView {
|
5
|
+
constructor(map_object, table_object) {
|
6
|
+
// Call constructor of superclass to initialize superclass-derived members.
|
7
|
+
super(map_object, () => {
|
8
|
+
this.createControls();
|
9
|
+
if (this.blueprint) {
|
10
|
+
this.createAreas();
|
11
|
+
}
|
12
|
+
});
|
13
|
+
this.table_object = table_object;
|
14
|
+
this.createAreaCallback = function () {};
|
15
|
+
this.editAreaCallback = function () {};
|
16
|
+
this.removeAreaCallback = function () {};
|
17
|
+
}
|
18
|
+
|
19
|
+
createControls() {
|
20
|
+
this.map.pm.addControls({
|
21
|
+
position: "topleft",
|
22
|
+
drawCircle: false,
|
23
|
+
drawMarker: false,
|
24
|
+
drawCircleMarker: false,
|
25
|
+
drawPolyline: false,
|
26
|
+
cutPolygon: false
|
27
|
+
});
|
28
|
+
|
29
|
+
this.map.on("pm:create", (e) => {
|
30
|
+
let geojson = e.layer.toGeoJSON();
|
31
|
+
this.blueprint[e.layer._leaflet_id] = geojson;
|
32
|
+
this.attachEditorEvents(e.layer);
|
33
|
+
this.createAreaCallback(e.layer._leaflet_id, e.layer, this);
|
34
|
+
});
|
35
|
+
|
36
|
+
this.map.on("pm:remove", (e) => {
|
37
|
+
delete this.blueprint[e.layer._leaflet_id];
|
38
|
+
this.removeAreaCallback(e.layer._leaflet_id, e.layer, this);
|
39
|
+
});
|
40
|
+
};
|
41
|
+
|
42
|
+
editing() {
|
43
|
+
let pm = this.map.pm;
|
44
|
+
return pm.globalRemovalEnabled() || pm.globalDragModeEnabled() || pm.globalEditEnabled();
|
45
|
+
};
|
46
|
+
|
47
|
+
// register callback to handle area edits,removals and creations
|
48
|
+
onCreateArea(callback) {
|
49
|
+
this.createAreaCallback = callback;
|
50
|
+
};
|
51
|
+
onEditArea(callback) {
|
52
|
+
this.editAreaCallback = callback;
|
53
|
+
};
|
54
|
+
onRemoveArea(callback) {
|
55
|
+
this.removeCreateCallback = callback;
|
56
|
+
};
|
57
|
+
|
58
|
+
attachEditorEvents (layer) {
|
59
|
+
layer.on("mouseover", (e) => {
|
60
|
+
e.target.getElement().classList.add("selected")
|
61
|
+
});
|
62
|
+
|
63
|
+
layer.on("mouseout", (e) => {
|
64
|
+
e.target.getElement().classList.remove("selected")
|
65
|
+
});
|
66
|
+
|
67
|
+
layer.on("pm:edit", (e) => {
|
68
|
+
this.blueprint[e.target._leaflet_id] = e.target.toGeoJSON();
|
69
|
+
this.editAreaCallback(e.target._leaflet_id, e.target, this);
|
70
|
+
});
|
71
|
+
|
72
|
+
layer.on("click", (e) => {
|
73
|
+
if (!this.editing()) {
|
74
|
+
this.clickAreaCallback(e.target._leaflet_id, e.target, this);
|
75
|
+
}
|
76
|
+
});
|
77
|
+
};
|
78
|
+
|
79
|
+
getBlueprint () {
|
80
|
+
return this.blueprint;
|
81
|
+
};
|
82
|
+
|
83
|
+
}
|