decidim-navigation_maps 1.1.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.
- checksums.yaml +4 -4
- data/README.md +32 -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 -4
- 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
- metadata +38 -29
- 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
@@ -0,0 +1,154 @@
|
|
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
|
+
// import "jquery-form"; // we use a CDN instead due a bug in webpacker
|
4
|
+
import NavigationMapEditor from "src/decidim/navigation_maps/admin/map_editor.js";
|
5
|
+
|
6
|
+
$(() => {
|
7
|
+
|
8
|
+
let $maps = $(".navigation_maps.admin .map");
|
9
|
+
let $progress = $(".navigation_maps.admin .progress");
|
10
|
+
let $bar = $(".navigation_maps.admin .progress-meter");
|
11
|
+
let $loading = $(".navigation_maps.admin .loading");
|
12
|
+
let $callout = $(".navigation_maps.admin .callout");
|
13
|
+
let $modal = $("#mapEditModal");
|
14
|
+
let $form = $("form");
|
15
|
+
let $tabs = $("#navigation_maps-tabs");
|
16
|
+
let $accordion = $(".navigation_maps.admin .accordion");
|
17
|
+
let editors = {};
|
18
|
+
let new_areas = {};
|
19
|
+
|
20
|
+
$maps.each((_i, el) => {
|
21
|
+
let id = $(el).data("id");
|
22
|
+
let table = document.getElementById(`navigation_maps-table-${id}`);
|
23
|
+
editors[id] = new NavigationMapEditor(el, table);
|
24
|
+
editors[id].onCreateArea((area_id) => {
|
25
|
+
new_areas[area_id] = true;
|
26
|
+
});
|
27
|
+
|
28
|
+
editors[id].onClickArea((area_id, area) => {
|
29
|
+
$modal.find(".modal-content").html("");
|
30
|
+
$modal.addClass("loading").foundation("open");
|
31
|
+
$callout.hide();
|
32
|
+
$callout.removeClass("alert success");
|
33
|
+
// "new" form insted of editing
|
34
|
+
let rel = new_areas[area_id]
|
35
|
+
? "new"
|
36
|
+
: area_id;
|
37
|
+
$modal.find(".modal-content").load(`/admin/navigation_maps/blueprints/${id}/areas/${rel}`, () => {
|
38
|
+
let $input1 = $modal.find('input[name="blueprint_area[area_id]"]');
|
39
|
+
let $input2 = $modal.find('input[name="blueprint_area[area_type]"]');
|
40
|
+
let $input3 = $modal.find('input[name="blueprint_area[area]"]');
|
41
|
+
let a = area.toGeoJSON();
|
42
|
+
$modal.removeClass("loading");
|
43
|
+
if ($input1.length) {
|
44
|
+
$input1.val(area_id);
|
45
|
+
}
|
46
|
+
if ($input2.length) {
|
47
|
+
$input2.val(a.type);
|
48
|
+
}
|
49
|
+
if ($input3.length) {
|
50
|
+
$input3.val(JSON.stringify(a));
|
51
|
+
}
|
52
|
+
$modal.find("ul[data-tabs=true]").each(() => {
|
53
|
+
new Foundation.Tabs($(el)); // eslint-disable-line
|
54
|
+
});
|
55
|
+
});
|
56
|
+
});
|
57
|
+
});
|
58
|
+
|
59
|
+
// Rails AJAX events
|
60
|
+
document.body.addEventListener("ajax:error", (responseText) => {
|
61
|
+
$callout.contents("p").html(`${responseText.detail[0].message}: <strong>${responseText.detail[0].error}</strong>`);
|
62
|
+
$callout.addClass("alert");
|
63
|
+
});
|
64
|
+
|
65
|
+
document.body.addEventListener("ajax:success", (responseText) => {
|
66
|
+
if (new_areas[responseText.detail[0].area]) {
|
67
|
+
delete new_areas[responseText.detail[0].area]
|
68
|
+
}
|
69
|
+
let blueprint_id = responseText.detail[0].blueprint_id;
|
70
|
+
let area_id = responseText.detail[0].area_id;
|
71
|
+
let area = responseText.detail[0].area;
|
72
|
+
editors[blueprint_id].setLayerProperties(editors[blueprint_id].map._layers[area_id], area);
|
73
|
+
editors[blueprint_id].blueprint[area_id] = area;
|
74
|
+
$callout.contents("p").html(responseText.detail[0].message);
|
75
|
+
$callout.addClass("success");
|
76
|
+
});
|
77
|
+
|
78
|
+
document.body.addEventListener("ajax:complete", () => {
|
79
|
+
$callout.show();
|
80
|
+
$modal.foundation("close");
|
81
|
+
})
|
82
|
+
|
83
|
+
$tabs.on("change.zf.tabs", (e, $tab, $content) => {
|
84
|
+
let id = $content.find(".map").data("id");
|
85
|
+
if (id) {
|
86
|
+
editors[id].reload();
|
87
|
+
}
|
88
|
+
});
|
89
|
+
|
90
|
+
$accordion.on("down.zf.accordion", () => {
|
91
|
+
let id = $accordion.find(".map").data("id");
|
92
|
+
if (id) {
|
93
|
+
editors[id].reload();
|
94
|
+
}
|
95
|
+
});
|
96
|
+
|
97
|
+
// If a new item si going to be created o the image is changed a reload is needed
|
98
|
+
let needsReload = () => {
|
99
|
+
let reload = false;
|
100
|
+
if ($form.find("#map-new input:checked").length) {
|
101
|
+
return true;
|
102
|
+
}
|
103
|
+
if ($form.find(".delete-tab input[type=checkbox]:checked").length) {
|
104
|
+
return true;
|
105
|
+
}
|
106
|
+
|
107
|
+
$form.find("input[type=file],input[tabs_id=blueprints___title]").each((_i, el) => {
|
108
|
+
if ($(el).val()) {
|
109
|
+
reload = true;
|
110
|
+
return false;
|
111
|
+
}
|
112
|
+
});
|
113
|
+
return reload;
|
114
|
+
};
|
115
|
+
|
116
|
+
$form.ajaxForm({
|
117
|
+
url: $form.find("[name=action]").val(),
|
118
|
+
beforeSerialize: () => {
|
119
|
+
Object.keys(editors).forEach((key) => {
|
120
|
+
let editor = editors[key];
|
121
|
+
$(`#blueprints_${editor.id}_blueprint`).val(JSON.stringify(editor.getBlueprint()));
|
122
|
+
});
|
123
|
+
},
|
124
|
+
beforeSend: () => {
|
125
|
+
let percentVal = "0%";
|
126
|
+
$bar.width(percentVal).html(percentVal);
|
127
|
+
$progress.show();
|
128
|
+
$callout.hide();
|
129
|
+
$callout.removeClass("alert success");
|
130
|
+
$loading.show();
|
131
|
+
},
|
132
|
+
uploadProgress: (event, position, total, percentComplete) => { // eslint-disable-line
|
133
|
+
let percentVal = `${percentComplete}%`;
|
134
|
+
$bar.width(percentVal).html(percentVal);
|
135
|
+
},
|
136
|
+
success: (responseText) => {
|
137
|
+
$callout.show();
|
138
|
+
$progress.hide();
|
139
|
+
$callout.contents("p").html(responseText);
|
140
|
+
$callout.addClass("success");
|
141
|
+
$loading.hide();
|
142
|
+
if (needsReload()) {
|
143
|
+
$loading.show();
|
144
|
+
location.reload();
|
145
|
+
}
|
146
|
+
},
|
147
|
+
error: (xhr) => {
|
148
|
+
$loading.hide();
|
149
|
+
$callout.show();
|
150
|
+
$callout.contents("p").html(xhr.responseText);
|
151
|
+
$callout.addClass("alert");
|
152
|
+
}
|
153
|
+
});
|
154
|
+
});
|
@@ -0,0 +1,125 @@
|
|
1
|
+
// Creates a map view
|
2
|
+
import "leaflet";
|
3
|
+
import "leaflet/dist/leaflet.css";
|
4
|
+
import "@geoman-io/leaflet-geoman-free";
|
5
|
+
import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css";
|
6
|
+
|
7
|
+
export default class NavigationMapView {
|
8
|
+
constructor(map_object, imageDecorator) {
|
9
|
+
this.features = {};
|
10
|
+
this.map_object = map_object;
|
11
|
+
this.id = map_object.dataset.id;
|
12
|
+
this.image_path = map_object.dataset.image;
|
13
|
+
this.blueprint = map_object.dataset.blueprint
|
14
|
+
? JSON.parse(map_object.dataset.blueprint)
|
15
|
+
: {};
|
16
|
+
this.image = new Image();
|
17
|
+
this.image.onload = () => {
|
18
|
+
this.createMap();
|
19
|
+
if (typeof imageDecorator === "function") {
|
20
|
+
imageDecorator(this);
|
21
|
+
} else if (this.blueprint) {
|
22
|
+
this.createAreas();
|
23
|
+
}
|
24
|
+
};
|
25
|
+
this.image.src = this.image_path;
|
26
|
+
this.clickAreaCallback = () => {};
|
27
|
+
this.setLayerPropertiesCallback = () => {};
|
28
|
+
}
|
29
|
+
|
30
|
+
createMap() {
|
31
|
+
let bounds = [[0, 0], [this.image.height, this.image.width]];
|
32
|
+
this.map = L.map(this.map_object, {
|
33
|
+
minZoom: -1,
|
34
|
+
maxZoom: 2,
|
35
|
+
crs: L.CRS.Simple,
|
36
|
+
noWrap: true,
|
37
|
+
zoomSnap: 0,
|
38
|
+
// zoomDelta: 0.1,
|
39
|
+
maxBounds: [[0, 0], [this.image.height, this.image.width]],
|
40
|
+
center: [this.image.height / 2, this.image.width / 2],
|
41
|
+
zoom: -1,
|
42
|
+
scrollWheelZoom: false,
|
43
|
+
attributionControl: false
|
44
|
+
});
|
45
|
+
|
46
|
+
L.imageOverlay(this.image.src, bounds).addTo(this.map);
|
47
|
+
this.fitBounds();
|
48
|
+
};
|
49
|
+
|
50
|
+
fitBounds() {
|
51
|
+
let image_ratio = this.image.height / this.image.width;
|
52
|
+
let map_ratio = this.map_object.offsetHeight / this.map_object.offsetWidth;
|
53
|
+
|
54
|
+
if (image_ratio > map_ratio) {
|
55
|
+
this.map.fitBounds([[0, 0], [0, this.image.width]]);
|
56
|
+
}
|
57
|
+
else {
|
58
|
+
this.map.fitBounds([[0, 0], [this.image.height, 0]]);
|
59
|
+
}
|
60
|
+
this.map.setView([this.image.height / 2, this.image.width / 2]);
|
61
|
+
};
|
62
|
+
|
63
|
+
createAreas() {
|
64
|
+
this.forEachBlueprint((id, geoarea) => {
|
65
|
+
new L.GeoJSON(geoarea, {
|
66
|
+
onEachFeature: (feature, layer) => {
|
67
|
+
layer._leaflet_id = id;
|
68
|
+
this.setLayerProperties(layer, geoarea);
|
69
|
+
this.attachEditorEvents(layer);
|
70
|
+
}
|
71
|
+
}).addTo(this.map);
|
72
|
+
});
|
73
|
+
};
|
74
|
+
|
75
|
+
setLayerProperties (layer, area) {
|
76
|
+
let props = area.properties;
|
77
|
+
if (props) {
|
78
|
+
if (props.color) {
|
79
|
+
layer.setStyle({fillColor: props.color, color: props.color});
|
80
|
+
}
|
81
|
+
this.setLayerPropertiesCallback(layer, props);
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
attachEditorEvents (layer) {
|
86
|
+
layer.on("mouseover", (e) => {
|
87
|
+
e.target.getElement().classList.add("selected")
|
88
|
+
});
|
89
|
+
|
90
|
+
layer.on("mouseout", (e) => {
|
91
|
+
e.target.getElement().classList.remove("selected")
|
92
|
+
});
|
93
|
+
|
94
|
+
layer.on("click", (e) => {
|
95
|
+
this.clickAreaCallback(e.target, this);
|
96
|
+
});
|
97
|
+
};
|
98
|
+
|
99
|
+
// register callback to handle area clicks
|
100
|
+
onClickArea(callback) {
|
101
|
+
this.clickAreaCallback = callback;
|
102
|
+
};
|
103
|
+
|
104
|
+
onSetLayerProperties(callback) {
|
105
|
+
this.setLayerPropertiesCallback = callback;
|
106
|
+
};
|
107
|
+
|
108
|
+
forEachBlueprint (decorator) {
|
109
|
+
for (let id in this.blueprint) {
|
110
|
+
let geoarea = this.blueprint[id];
|
111
|
+
// avoid non-polygons for the moment
|
112
|
+
if (geoarea.geometry && geoarea.geometry.type === "Polygon") {
|
113
|
+
decorator(id, geoarea);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
};
|
117
|
+
|
118
|
+
reload () {
|
119
|
+
if (this.map) {
|
120
|
+
this.map.invalidateSize(true);
|
121
|
+
this.fitBounds();
|
122
|
+
}
|
123
|
+
};
|
124
|
+
}
|
125
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import NavigationMapView from "src/decidim/navigation_maps/map_view.js";
|
2
|
+
import "jsviews/jsrender";
|
3
|
+
|
4
|
+
$(function() {
|
5
|
+
|
6
|
+
let $maps = $(".navigation_maps .map");
|
7
|
+
let $tabs = $("#navigation_maps-tabs");
|
8
|
+
let maps = {};
|
9
|
+
let tmpl = $.templates("#navigation_maps-popup");
|
10
|
+
|
11
|
+
$maps.each(function() {
|
12
|
+
let id = $(this).data("id");
|
13
|
+
maps[id] = new NavigationMapView(this);
|
14
|
+
maps[id].onSetLayerProperties(function(layer, props) {
|
15
|
+
if (!props.popup) {
|
16
|
+
let node = document.createElement("div");
|
17
|
+
let html = tmpl.render(props);
|
18
|
+
$(node).html(html);
|
19
|
+
|
20
|
+
layer.bindPopup(node, {
|
21
|
+
maxHeight: 400,
|
22
|
+
// autoPan: false,
|
23
|
+
maxWidth: 640,
|
24
|
+
minWidth: 200,
|
25
|
+
keepInView: true,
|
26
|
+
className: `navigation_map-info map-info-${id}-${layer._leaflet_id}`
|
27
|
+
});
|
28
|
+
}
|
29
|
+
});
|
30
|
+
maps[id].onClickArea(function(area) {
|
31
|
+
let popup = area.feature.properties && area.feature.properties.link && area.feature.properties.popup;
|
32
|
+
if (popup) {
|
33
|
+
location = area.feature.properties.link;
|
34
|
+
}
|
35
|
+
});
|
36
|
+
});
|
37
|
+
|
38
|
+
$tabs.on("change.zf.tabs", function(e, $tab, $content) {
|
39
|
+
let id = $content.find(".map").data("id");
|
40
|
+
maps[id].reload();
|
41
|
+
});
|
42
|
+
|
43
|
+
});
|
File without changes
|
@@ -2,10 +2,10 @@
|
|
2
2
|
//= require leaflet-geoman
|
3
3
|
//= require_self
|
4
4
|
|
5
|
-
@import "decidim/variables";
|
6
|
-
@import "decidim/utils/settings";
|
7
|
-
@import "decidim/utils/mixins";
|
8
|
-
@import "decidim/navigation_maps/variables";
|
5
|
+
@import "stylesheets/decidim/variables";
|
6
|
+
@import "stylesheets/decidim/utils/settings";
|
7
|
+
@import "stylesheets/decidim/utils/mixins";
|
8
|
+
@import "stylesheets/decidim/navigation_maps/variables";
|
9
9
|
|
10
10
|
.navigation_maps.admin {
|
11
11
|
.accordion-item {
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module NavigationMaps
|
5
|
+
# This query finds the published blueprints for a content block
|
6
|
+
class ContentBlockBlueprints < Rectify::Query
|
7
|
+
def initialize(content_block)
|
8
|
+
@content_block = content_block
|
9
|
+
end
|
10
|
+
|
11
|
+
def query
|
12
|
+
Decidim::NavigationMaps::Blueprint.where(content_block: @content_block)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :content_block
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -4,18 +4,10 @@ module Decidim
|
|
4
4
|
module NavigationMaps
|
5
5
|
# This class deals with uploading images to a Blueprints.
|
6
6
|
class BlueprintUploader < Decidim::ImageUploader
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def extension_white_list
|
14
|
-
%w(jpg jpeg png svg)
|
15
|
-
end
|
16
|
-
|
17
|
-
def max_image_height_or_width
|
18
|
-
8000
|
7
|
+
set_variants do
|
8
|
+
{
|
9
|
+
thumbnail: { resize_to_fit: [nil, 237] }
|
10
|
+
}
|
19
11
|
end
|
20
12
|
end
|
21
13
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module NavigationMaps
|
5
|
+
module Cw
|
6
|
+
# This class deals with uploading images to a Blueprints.
|
7
|
+
class BlueprintUploader < Decidim::Cw::ImageUploader
|
8
|
+
process :validate_size, :validate_dimensions
|
9
|
+
|
10
|
+
version :thumbnail do
|
11
|
+
process resize_to_fit: [nil, 237]
|
12
|
+
end
|
13
|
+
|
14
|
+
def extension_white_list
|
15
|
+
%w(jpg jpeg png svg)
|
16
|
+
end
|
17
|
+
|
18
|
+
def max_image_height_or_width
|
19
|
+
8000
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/config/assets.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This file is located at `config/assets.rb` of your module.
|
4
|
+
|
5
|
+
# Define the base path of your module. Please note that `Rails.root` may not be
|
6
|
+
# used because we are not inside the Rails environment when this file is loaded.
|
7
|
+
base_path = File.expand_path("..", __dir__)
|
8
|
+
|
9
|
+
# Register an additional load path for webpack. All the assets within these
|
10
|
+
# directories will be available for inclusion within the Decidim assets. For
|
11
|
+
# example, if you have `app/packs/src/decidim/foo.js`, you can include that file
|
12
|
+
# in your JavaScript entrypoints (or other JavaScript files within Decidim)
|
13
|
+
# using `import "src/decidim/foo"` after you have registered the additional path
|
14
|
+
# as follows.
|
15
|
+
Decidim::Webpacker.register_path("#{base_path}/app/packs")
|
16
|
+
|
17
|
+
# Register the entrypoints for your module. These entrypoints can be included
|
18
|
+
# within your application using `javascript_pack_tag` and if you include any
|
19
|
+
# SCSS files within the entrypoints, they become available for inclusion using
|
20
|
+
# `stylesheet_pack_tag`.
|
21
|
+
Decidim::Webpacker.register_entrypoints(
|
22
|
+
decidim_navigation_maps: "#{base_path}/app/packs/entrypoints/decidim_navigation_maps.js",
|
23
|
+
decidim_admin_navigation_maps: "#{base_path}/app/packs/entrypoints/decidim_admin_navigation_maps.js"
|
24
|
+
)
|
25
|
+
|
26
|
+
# If you want to import some extra SCSS files in the Decidim main SCSS file
|
27
|
+
# without adding any extra stylesheet inclusion tags, you can use the following
|
28
|
+
# method to register the stylesheet import for the main application.
|
29
|
+
# Decidim::Webpacker.register_stylesheet_import("stylesheets/decidim/navigation_maps/navigation_maps")
|
30
|
+
|
31
|
+
# If you want to do the same but include the SCSS file for the admin panel's
|
32
|
+
# main SCSS file, you can use the following method.
|
33
|
+
# Decidim::Webpacker.register_stylesheet_import("stylesheets/decidim/navigation_maps/admin", group: :admin)
|
34
|
+
|
35
|
+
# If you want to override some SCSS variables/settings for Foundation from the
|
36
|
+
# module, you can add the following registered import.
|
37
|
+
# Decidim::Webpacker.register_stylesheet_import("stylesheets/decidim/foo/settings", type: :settings)
|
38
|
+
|
39
|
+
# If you want to do the same but override the SCSS variables of the admin
|
40
|
+
# panel's styles, you can use the following method.
|
41
|
+
# Decidim::Webpacker.register_stylesheet_import("stylesheets/decidim/foo/admin_settings", type: :settings, group: :admin)
|
data/config/locales/ca.yml
CHANGED
data/config/locales/cs.yml
CHANGED
@@ -29,10 +29,11 @@ cs:
|
|
29
29
|
view: Zapojte se
|
30
30
|
navigation_map_settings_form:
|
31
31
|
add: Přidat
|
32
|
+
autohide_tabs: Skrýt navigaci v záložkách, pokud je pouze jedna mapa
|
32
33
|
blueprint_image: Obrázek plánu
|
33
34
|
description: Popis
|
34
35
|
editor: Editor mapy
|
35
|
-
height:
|
36
|
+
height: Výška (px)
|
36
37
|
id: Id
|
37
38
|
image_missing: Pro začátek přidejte obrázek plánu
|
38
39
|
info: Obecné informace
|
data/config/locales/en.yml
CHANGED
data/config/locales/es.yml
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddReferenceToContentBlockToBlueprintsTable < ActiveRecord::Migration[5.2]
|
4
|
+
def change
|
5
|
+
add_reference(
|
6
|
+
:decidim_navigation_maps_blueprints,
|
7
|
+
:decidim_content_block,
|
8
|
+
foreign_key: true,
|
9
|
+
index: { name: "decidim_navigation_maps_constraint_content_block" }
|
10
|
+
)
|
11
|
+
end
|
12
|
+
end
|
Binary file
|
data/db/seeds.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
print "Skipping seeds for decidim_navigation maps as required by SKIP_MODULE_SEEDS\n" if ENV["SKIP_MODULE_SEEDS"]
|
4
|
+
|
5
|
+
if !ENV["SKIP_MODULE_SEEDS"] && (!Rails.env.production? || ENV["SEED"])
|
6
|
+
|
4
7
|
print "Creating seeds for decidim_navigation maps...\n" unless Rails.env.test?
|
5
8
|
|
6
9
|
require "decidim/faker/localized"
|
@@ -8,29 +11,32 @@ if !Rails.env.production? || ENV["SEED"]
|
|
8
11
|
|
9
12
|
organization = Decidim::Organization.first
|
10
13
|
|
11
|
-
|
14
|
+
# homepage blueprint
|
15
|
+
content_block = Decidim::ContentBlock.create(
|
12
16
|
decidim_organization_id: organization.id,
|
13
17
|
weight: 1,
|
14
18
|
scope_name: :homepage,
|
15
19
|
manifest_name: :navigation_map,
|
16
20
|
published_at: Time.current,
|
17
|
-
settings: { title: Decidim::Faker::Localized.sentence(5) }
|
21
|
+
settings: { title: Decidim::Faker::Localized.sentence(word_count: 5) }
|
18
22
|
)
|
19
23
|
|
20
24
|
blueprint1 = Decidim::NavigationMaps::Blueprint.create(
|
21
25
|
organization: organization,
|
22
|
-
|
23
|
-
title: Decidim::Faker::Localized.sentence(2),
|
24
|
-
description: Decidim::Faker::Localized.sentence(10)
|
26
|
+
content_block: content_block,
|
27
|
+
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
28
|
+
description: Decidim::Faker::Localized.sentence(word_count: 10)
|
25
29
|
)
|
26
30
|
|
27
|
-
Decidim::NavigationMaps::Blueprint.create(
|
31
|
+
blueprint2 = Decidim::NavigationMaps::Blueprint.create(
|
28
32
|
organization: organization,
|
29
|
-
|
30
|
-
|
31
|
-
description: Decidim::Faker::Localized.sentence(10)
|
33
|
+
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
34
|
+
description: Decidim::Faker::Localized.sentence(word_count: 10)
|
32
35
|
)
|
33
36
|
|
37
|
+
blueprint1.image.attach(io: File.open(File.join(seeds_root, "antarctica.png")), filename: "antarctica.png", content_type: "image/png")
|
38
|
+
blueprint2.image.attach(io: File.open(File.join(seeds_root, "penguins.jpg")), filename: "penguins.jpg", content_type: "image/jpeg")
|
39
|
+
|
34
40
|
Decidim::NavigationMaps::BlueprintArea.create(
|
35
41
|
blueprint: blueprint1,
|
36
42
|
area_id: "10",
|
@@ -79,7 +85,7 @@ if !Rails.env.production? || ENV["SEED"]
|
|
79
85
|
link_type: "link",
|
80
86
|
color: "#ffbb00",
|
81
87
|
title: { en: "Penguins" },
|
82
|
-
description: { en: "Penguins are
|
88
|
+
description: { en: "Penguins are beautiful animals" }
|
83
89
|
)
|
84
90
|
|
85
91
|
Decidim::NavigationMaps::BlueprintArea.create(
|
@@ -100,4 +106,49 @@ if !Rails.env.production? || ENV["SEED"]
|
|
100
106
|
link: "#map1",
|
101
107
|
link_type: "direct"
|
102
108
|
)
|
109
|
+
|
110
|
+
# participatory process groups blueprint
|
111
|
+
Decidim::ParticipatoryProcessGroup.find_each do |group|
|
112
|
+
content_block = Decidim::ContentBlock.create(
|
113
|
+
decidim_organization_id: organization.id,
|
114
|
+
weight: 1,
|
115
|
+
scope_name: :participatory_process_group_homepage,
|
116
|
+
scoped_resource_id: group.id,
|
117
|
+
manifest_name: :navigation_map,
|
118
|
+
published_at: Time.current,
|
119
|
+
settings: { title: Decidim::Faker::Localized.sentence(word_count: 5), autohide_tabs: true }
|
120
|
+
)
|
121
|
+
|
122
|
+
blueprint = Decidim::NavigationMaps::Blueprint.create(
|
123
|
+
organization: organization,
|
124
|
+
content_block: content_block,
|
125
|
+
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
126
|
+
description: Decidim::Faker::Localized.sentence(word_count: 10)
|
127
|
+
)
|
128
|
+
blueprint1.image.attach(io: File.open(File.join(seeds_root, "pla-cerda.jpg")), filename: "pla-cerda.jpg", content_type: "image/jpeg")
|
129
|
+
|
130
|
+
Decidim::NavigationMaps::BlueprintArea.create(
|
131
|
+
blueprint: blueprint,
|
132
|
+
area_id: "10",
|
133
|
+
area_type: "Feature",
|
134
|
+
area: {
|
135
|
+
type: "Polygon",
|
136
|
+
coordinates: [[
|
137
|
+
[286.211699, 216.817532],
|
138
|
+
[342.618384, 252.332852],
|
139
|
+
[449.164345, 210.550122],
|
140
|
+
[447.075209, 191.747894],
|
141
|
+
[429.665738, 147.179649],
|
142
|
+
[323.816156, 126.288284],
|
143
|
+
[285.51532, 170.856529],
|
144
|
+
[286.211699, 216.817532]
|
145
|
+
]]
|
146
|
+
},
|
147
|
+
link: "https://en.wikipedia.org/wiki/Centelles",
|
148
|
+
link_type: "link",
|
149
|
+
color: "#ff4700",
|
150
|
+
title: { en: "Pla Cerdà" },
|
151
|
+
description: { en: "Cerdà was from the town of Centelles" }
|
152
|
+
)
|
153
|
+
end
|
103
154
|
end
|
@@ -22,10 +22,6 @@ module Decidim
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
initializer "decidim_navigation_maps.admin_assets" do |app|
|
26
|
-
app.config.assets.precompile += %w(admin/decidim_navigation_maps_manifest.js admin/decidim_navigation_maps_manifest.css)
|
27
|
-
end
|
28
|
-
|
29
25
|
def load_seed
|
30
26
|
nil
|
31
27
|
end
|