decidim-navigation_maps 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -3
  3. data/Rakefile +8 -0
  4. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_tabs_content.erb +1 -1
  5. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/show.erb +2 -2
  6. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_cell.rb +5 -0
  7. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_form.erb +4 -4
  8. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_tabs_content.erb +0 -1
  9. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/show.erb +4 -2
  10. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form_cell.rb +9 -0
  11. data/app/controllers/decidim/navigation_maps/admin/blueprints_controller.rb +1 -1
  12. data/app/jobs/decidim/navigation_maps/migrate_legacy_images_job.rb +32 -0
  13. data/app/models/decidim/navigation_maps/blueprint.rb +4 -3
  14. data/app/packs/entrypoints/decidim_admin_navigation_maps.js +4 -0
  15. data/app/packs/entrypoints/decidim_admin_navigation_maps.scss +1 -0
  16. data/app/packs/entrypoints/decidim_navigation_maps.js +7 -0
  17. data/app/packs/entrypoints/decidim_navigation_maps.scss +1 -0
  18. data/app/packs/src/decidim/navigation_maps/admin/map_editor.js +83 -0
  19. data/app/packs/src/decidim/navigation_maps/admin/navigation_maps.js +154 -0
  20. data/app/packs/src/decidim/navigation_maps/map_view.js +125 -0
  21. data/app/packs/src/decidim/navigation_maps/navigation_maps.js +43 -0
  22. data/app/{assets → packs}/stylesheets/decidim/navigation_maps/_variables.scss +0 -0
  23. data/app/{assets → packs}/stylesheets/decidim/navigation_maps/admin/navigation_maps.scss +4 -4
  24. data/app/{assets → packs}/stylesheets/decidim/navigation_maps/navigation_maps.scss +1 -2
  25. data/app/uploaders/decidim/navigation_maps/blueprint_uploader.rb +4 -12
  26. data/app/uploaders/decidim/navigation_maps/cw/blueprint_uploader.rb +24 -0
  27. data/config/assets.rb +41 -0
  28. data/config/locales/cs.yml +1 -1
  29. data/db/seeds.rb +6 -5
  30. data/lib/decidim/navigation_maps/admin_engine.rb +0 -4
  31. data/lib/decidim/navigation_maps/engine.rb +4 -4
  32. data/lib/decidim/navigation_maps/navigation_map_cell_helpers.rb +1 -1
  33. data/lib/decidim/navigation_maps/version.rb +2 -2
  34. data/lib/decidim/navigation_maps.rb +0 -2
  35. data/lib/tasks/decidim_navigation_maps_webpacker_tasks.rake +58 -0
  36. data/lib/tasks/navigation_maps_active_storage_migration_tasks.rake +37 -0
  37. metadata +31 -27
  38. data/app/assets/config/admin/decidim_navigation_maps_manifest.css +0 -3
  39. data/app/assets/config/admin/decidim_navigation_maps_manifest.js +0 -3
  40. data/app/assets/config/decidim_navigation_maps_manifest.css +0 -3
  41. data/app/assets/config/decidim_navigation_maps_manifest.js +0 -1
  42. data/app/assets/images/decidim/navigation_maps/icon.svg +0 -1
  43. data/app/assets/javascripts/decidim/navigation_maps/admin/map_editor.js +0 -88
  44. data/app/assets/javascripts/decidim/navigation_maps/admin/navigation_maps.js +0 -143
  45. data/app/assets/javascripts/decidim/navigation_maps/map_view.js +0 -123
  46. data/app/assets/javascripts/decidim/navigation_maps/navigation_maps.js +0 -44
@@ -1,143 +0,0 @@
1
- // Place all the behaviors and hooks related to the matching controller here.
2
- // All this logic will automatically be available in application.js.
3
- //= require jquery.form
4
- //= require decidim/navigation_maps/admin/map_editor
5
- //= require_self
6
-
7
- $(function() {
8
-
9
- var $maps = $('.navigation_maps.admin .map');
10
- var $progress = $('.navigation_maps.admin .progress');
11
- var $bar = $('.navigation_maps.admin .progress-meter');
12
- var $loading = $('.navigation_maps.admin .loading');
13
- var $callout = $('.navigation_maps.admin .callout');
14
- var $modal = $('#mapEditModal');
15
- var $form = $('form');
16
- var $tabs = $('#navigation_maps-tabs');
17
- var $accordion = $('.navigation_maps.admin .accordion');
18
- var editors = {};
19
- var new_areas = {};
20
-
21
- $maps.each(function() {
22
- var id = $(this).data('id');
23
- var table = document.getElementById("navigation_maps-table-" + id);
24
- editors[id] = new NavigationMapEditor(this, table);
25
- editors[id].onCreateArea(function(area_id) {
26
- new_areas[area_id] = true;
27
- });
28
-
29
- editors[id].onClickArea(function(area_id, area) {
30
- $modal.find('.modal-content').html('');
31
- $modal.addClass('loading').foundation('open');
32
- $callout.hide();
33
- $callout.removeClass('alert success');
34
- // "new" form insted of editing
35
- var rel = new_areas[area_id] ? 'new' : area_id;
36
- $modal.find('.modal-content').load(`/admin/navigation_maps/blueprints/${id}/areas/${rel}`, function() {
37
- var $input1 = $modal.find('input[name="blueprint_area[area_id]"]');
38
- var $input2 = $modal.find('input[name="blueprint_area[area_type]"]');
39
- var $input3 = $modal.find('input[name="blueprint_area[area]"]');
40
- var a = area.toGeoJSON();
41
- $modal.removeClass('loading');
42
- if($input1.length) $input1.val(area_id);
43
- if($input2.length) $input2.val(a.type);
44
- if($input3.length) $input3.val(JSON.stringify(a));
45
- $modal.find('ul[data-tabs=true]').each(function() {
46
- new Foundation.Tabs($(this));
47
- });
48
- });
49
- });
50
- });
51
-
52
- // Rails AJAX events
53
- document.body.addEventListener('ajax:error', function(responseText) {
54
- $callout.contents('p').html(responseText.detail[0].message + ": <strong>" + responseText.detail[0].error + "</strong>");
55
- $callout.addClass('alert');
56
- });
57
-
58
- document.body.addEventListener('ajax:success', function(responseText) {
59
- if(new_areas[responseText.detail[0].area]) {
60
- delete new_areas[responseText.detail[0].area]
61
- }
62
- var blueprint_id = responseText.detail[0].blueprint_id;
63
- var area_id = responseText.detail[0].area_id;
64
- var area = responseText.detail[0].area;
65
- editors[blueprint_id].setLayerProperties(editors[blueprint_id].map._layers[area_id], area);
66
- editors[blueprint_id].blueprint[area_id] = area;
67
- $callout.contents('p').html(responseText.detail[0].message);
68
- $callout.addClass('success');
69
- });
70
-
71
- document.body.addEventListener('ajax:complete', function() {
72
- $callout.show();
73
- $modal.foundation('close');
74
- })
75
-
76
- $tabs.on('change.zf.tabs', function(e, $tab, $content) {
77
- var id = $content.find('.map').data('id');
78
- if(id) {
79
- editors[id].reload();
80
- }
81
- });
82
-
83
- $accordion.on('down.zf.accordion', function(e, $accordion) {
84
- var id = $accordion.find('.map').data('id');
85
- if(id) {
86
- editors[id].reload();
87
- }
88
- });
89
-
90
- // If a new item si going to be created o the image is changed a reload is needed
91
- var needsReload = function() {
92
- var reload = false;
93
- if($form.find('#map-new input:checked').length) return true;
94
- if($form.find('.delete-tab input[type=checkbox]:checked').length) return true;
95
-
96
- $form.find('input[type=file],input[tabs_id=blueprints___title]').each(function() {
97
- if($(this).val()) {
98
- reload = true;
99
- return false;
100
- }
101
- });
102
- return reload;
103
- };
104
-
105
- $form.ajaxForm({
106
- url: $form.find('[name=action]').val(),
107
- beforeSerialize: function() {
108
- Object.keys(editors).forEach(function(key) {
109
- var editor = editors[key];
110
- $(`#blueprints_${editor.id}_blueprint`).val(JSON.stringify(editor.getBlueprint()));
111
- });
112
- },
113
- beforeSend: function() {
114
- var percentVal = '0%';
115
- $bar.width(percentVal).html(percentVal);
116
- $progress.show();
117
- $callout.hide();
118
- $callout.removeClass('alert success');
119
- $loading.show();
120
- },
121
- uploadProgress: function(event, position, total, percentComplete) {
122
- var percentVal = percentComplete + '%';
123
- $bar.width(percentVal).html(percentVal);
124
- },
125
- success: function(responseText) {
126
- $callout.show();
127
- $progress.hide();
128
- $callout.contents('p').html(responseText);
129
- $callout.addClass('success');
130
- $loading.hide();
131
- if(needsReload()) {
132
- $loading.show();
133
- location.reload();
134
- }
135
- },
136
- error: function(xhr) {
137
- $loading.hide();
138
- $callout.show();
139
- $callout.contents('p').html(xhr.responseText);
140
- $callout.addClass('alert');
141
- }
142
- });
143
- });
@@ -1,123 +0,0 @@
1
- // Creates a map view
2
- //= require leaflet
3
- //= require leaflet-geoman.min
4
-
5
- function NavigationMapView(map_object, callback) {
6
- var self = this;
7
- self.features = {};
8
- self.map_object = map_object;
9
- self.id = map_object.dataset.id;
10
- self.image_path = map_object.dataset.image;
11
- self.blueprint = map_object.dataset.blueprint ? JSON.parse(map_object.dataset.blueprint) : {};
12
- self.image = new Image();
13
- self.image.onload = function() {
14
- self.createMap();
15
- if(typeof callback === "function") {
16
- callback(self);
17
- } else {
18
- if(self.blueprint) {
19
- self.createAreas();
20
- }
21
- }
22
- };
23
- self.image.src = self.image_path;
24
- this.clickAreaCallback = function () {};
25
- this.setLayerPropertiesCallback = function () {};
26
- }
27
-
28
- NavigationMapView.prototype.createMap = function() {
29
- var bounds = [[0,0], [this.image.height,this.image.width]];
30
- this.map = L.map(this.map_object, {
31
- minZoom: -1,
32
- maxZoom: 2,
33
- crs: L.CRS.Simple,
34
- noWrap: true,
35
- zoomSnap: 0,
36
- // zoomDelta: 0.1,
37
- maxBounds: [[0,0], [this.image.height,this.image.width]],
38
- center: [this.image.height/2, this.image.width/2],
39
- zoom: -1,
40
- scrollWheelZoom: false,
41
- attributionControl: false
42
- });
43
-
44
- L.imageOverlay(this.image.src, bounds).addTo(this.map);
45
- this.fitBounds();
46
- };
47
-
48
- NavigationMapView.prototype.fitBounds = function() {
49
- var image_ratio = this.image.height / this.image.width;
50
- var map_ratio = this.map_object.offsetHeight / this.map_object.offsetWidth;
51
-
52
- if(image_ratio > map_ratio) {
53
- this.map.fitBounds([[0,0], [0,this.image.width]]);
54
- }
55
- else {
56
- this.map.fitBounds([[0,0], [this.image.height,0]]);
57
- }
58
- this.map.setView([this.image.height/2, this.image.width/2]);
59
- };
60
-
61
- NavigationMapView.prototype.createAreas = function() {
62
- var self = this;
63
- self.forEachBlueprint(function(id, geoarea) {
64
- new L.GeoJSON(geoarea, {
65
- onEachFeature: function(feature, layer) {
66
- layer._leaflet_id = id;
67
- self.setLayerProperties(layer, geoarea);
68
- self.attachEditorEvents(layer);
69
- }
70
- }).addTo(self.map);
71
- });
72
- };
73
-
74
- NavigationMapView.prototype.setLayerProperties = function (layer, area) {
75
- var props = area.properties;
76
- if(props) {
77
- if(props.color) {
78
- layer.setStyle({fillColor: props.color, color: props.color});
79
- }
80
- this.setLayerPropertiesCallback(layer, props);
81
- }
82
- };
83
-
84
- NavigationMapView.prototype.attachEditorEvents = function (layer) {
85
- var self = this;
86
-
87
- layer.on('mouseover', function(e) {
88
- e.target.getElement().classList.add('selected')
89
- });
90
-
91
- layer.on('mouseout', function(e) {
92
- e.target.getElement().classList.remove('selected')
93
- });
94
-
95
- layer.on('click', function(e) {
96
- self.clickAreaCallback(e.target, self);
97
- });
98
- };
99
-
100
- // register callback to handle area clicks
101
- NavigationMapView.prototype.onClickArea = function(callback) {
102
- this.clickAreaCallback = callback;
103
- };
104
-
105
- NavigationMapView.prototype.onSetLayerProperties = function(callback) {
106
- this.setLayerPropertiesCallback = callback;
107
- };
108
-
109
- NavigationMapView.prototype.forEachBlueprint = function (callback) {
110
- for (var id in this.blueprint) {
111
- var geoarea = this.blueprint[id];
112
- // avoid non-polygons for the moment
113
- if(!geoarea.geometry || geoarea.geometry.type !== 'Polygon') continue;
114
- callback(id, geoarea);
115
- }
116
- };
117
-
118
- NavigationMapView.prototype.reload = function () {
119
- if(this.map) {
120
- this.map.invalidateSize(true);
121
- this.fitBounds();
122
- }
123
- };
@@ -1,44 +0,0 @@
1
- // Place all the behaviors and hooks related to the matching controller here.
2
- // All this logic will automatically be available in application.js.
3
- //= require decidim/navigation_maps/map_view
4
- //= require jsrender.min
5
- //= require_self
6
-
7
- $(function() {
8
-
9
- var $maps = $('.navigation_maps .map');
10
- var $tabs = $('#navigation_maps-tabs');
11
- var maps = {};
12
- var tmpl = $.templates("#navigation_maps-popup");
13
-
14
- $maps.each(function() {
15
- var id = $(this).data('id');
16
- maps[id] = new NavigationMapView(this);
17
- maps[id].onSetLayerProperties(function(layer, props) {
18
- if(!props.popup) {
19
- var node = document.createElement("div");
20
- var html = tmpl.render(props);
21
- $(node).html(html);
22
-
23
- layer.bindPopup(node, {
24
- maxHeight: 400,
25
- // autoPan: false,
26
- maxWidth: 640,
27
- minWidth: 200,
28
- keepInView: true,
29
- className: `navigation_map-info map-info-${id}-${layer._leaflet_id}`
30
- });
31
- }
32
- });
33
- maps[id].onClickArea(function(area) {
34
- var popup = area.feature.properties && area.feature.properties.link && area.feature.properties.popup;
35
- if(popup) location = area.feature.properties.link;
36
- });
37
- });
38
-
39
- $tabs.on('change.zf.tabs', function(e, $tab, $content) {
40
- var id = $content.find('.map').data('id');
41
- maps[id].reload();
42
- });
43
-
44
- });