Skip to content
Snippets Groups Projects
Commit 44994787 authored by Sébastien DA ROCHA's avatar Sébastien DA ROCHA :bicyclist:
Browse files

Merge branch 'redmine-issues/13822' into 'develop'

REDMINE_ISSUE-13822|Les pop-up des autres signalements ne s'affichent pa

See merge request geocontrib/geocontrib-frontend!391
parents 1879d285 ace68978
No related branches found
No related tags found
No related merge requests found
...@@ -378,55 +378,3 @@ body { ...@@ -378,55 +378,3 @@ body {
background: #f3f3f3 !important; background: #f3f3f3 !important;
color: #35495e !important; color: #35495e !important;
} }
/* OPENLAYERS */
.ol-zoom{
right: 5px !important;
left:unset !important;
}
.ol-popup {
position: absolute;
background-color: white;
padding: 15px;
border-radius: 10px;
border: 1px solid #cccccc;
bottom: 12px;
left: -106px;
width: 212px;
line-height: 1.4;
-webkit-box-shadow: 0px 0px 15px -1px #000000;
box-shadow: 0px 0px 15px -1px #000000;
font: 12px/1.5 Helvetica Neue,Arial,Helvetica,sans-serif;
}
.ol-popup:after, .ol-popup:before {
top: 100%;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
}
.ol-popup:after {
border-top-color: white;
border-width: 10px;
left: 50%;
margin-left: -10px;
}
.ol-popup:before {
border-top-color: #cccccc;
border-width: 11px;
left: 50%;
margin-left: -11px;
}
.ol-popup-closer {
text-decoration: none;
position: absolute;
top: 2px;
right: 8px;
}
.ol-popup-closer:after {
content: "✖";
}
/* OPENLAYERS */
.ol-zoom{
right: 5px !important;
left:unset !important;
}
.ol-popup {
position: absolute;
background-color: white;
padding: 15px;
border-radius: 10px;
bottom: 12px;
left: -106px;
min-width: 212px;
line-height: 1.4;
-webkit-box-shadow: 0 3px 14px rgba(0,0,0,.4);
box-shadow: 0 3px 14px rgba(0,0,0,.4);
}
.ol-popup #popup-content {
white-space: nowrap;
color: #2d2d2d;
}
.ol-popup:after, .ol-popup:before {
top: 100%;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
}
.ol-popup:after {
border-top-color: white;
border-width: 10px;
left: 50%;
margin-left: -10px;
}
.ol-popup:before {
border-top-color: #cccccc;
border-width: 11px;
left: 50%;
margin-left: -11px;
}
.ol-popup-closer {
text-decoration: none;
position: absolute;
top: 4px;
right: 0;
width: 24px;
height: 24px;
font: 18px/24px Tahoma,Verdana,sans-serif;
color: #757575;
}
.ol-popup-closer:after {
content: "×";
}
.ol-scale-line { .ol-scale-line {
left: 2em; left: 2em;
background: hsla(0,0%,100%,.5); background: hsla(0,0%,100%,.5);
...@@ -34,41 +91,6 @@ ...@@ -34,41 +91,6 @@
background-color: #ebebeb; background-color: #ebebeb;
} }
/* .leaflet-bar {
box-shadow: none !important;
}
.leaflet-bar a {
background-color: #fff;
color: #000;
height: 30px !important;
width: 30px !important;
font: 700 16px Lucida Console,Monaco,monospace;
margin: 0;
}
.leaflet-bar a:hover {
cursor: pointer;
background-color: #ebebeb;
}
.leaflet-bar a > i {
margin: 0;
} */
/* For geocoder search bar */
.multiselect {
font: 500 12px Lucida Console,Monaco,monospace;
}
.multiselect__content-wrapper {
border: 2px solid rgba(0,0,0,.2) !important;
background-clip: padding-box !important;
padding: 0 !important;
border-top: none !important;
left: -2px;
width: calc(100% + 4px) !important;
}
/* hide the popup before the map get loaded */ /* hide the popup before the map get loaded */
.map-container > #popup.ol-popup { .map-container > #popup.ol-popup {
display: none; display: none;
......
...@@ -228,7 +228,11 @@ export default { ...@@ -228,7 +228,11 @@ export default {
onQueryLayerChange(layer) { onQueryLayerChange(layer) {
this.selectedQueryLayer = layer.name; this.selectedQueryLayer = layer.name;
this.baseMaps[0].layers.find((l) => l.title === layer.name).query = true; if (this.baseMaps[0].layers.find((l) => l.title === layer.name)) {
this.baseMaps[0].layers.find((l) => l.title === layer.name).query = true;
} else {
console.error('No such param \'query\' found among basemap[0].layers');
}
layer.query = true; layer.query = true;
}, },
...@@ -365,7 +369,7 @@ export default { ...@@ -365,7 +369,7 @@ export default {
addLayers(baseMap) { addLayers(baseMap) {
baseMap.layers.forEach((layer) => { baseMap.layers.forEach((layer) => {
var layerOptions = this.availableLayers.find((l) => l.id === layer.id); const layerOptions = this.availableLayers.find((l) => l.id === layer.id);
layer = Object.assign(layer, layerOptions); layer = Object.assign(layer, layerOptions);
layer.options.basemapId = baseMap.id; layer.options.basemapId = baseMap.id;
}); });
......
...@@ -591,7 +591,7 @@ export default { ...@@ -591,7 +591,7 @@ export default {
onGeoJSONFileChange(e) { onGeoJSONFileChange(e) {
this.importing = true; this.importing = true;
var files = e.target.files || e.dataTransfer.files; const files = e.target.files || e.dataTransfer.files;
if (!files.length) { if (!files.length) {
return; return;
} }
...@@ -620,7 +620,7 @@ export default { ...@@ -620,7 +620,7 @@ export default {
onCSVFileChange(e) { onCSVFileChange(e) {
this.featureTypeImporting = true; this.featureTypeImporting = true;
var files = e.target.files || e.dataTransfer.files; const files = e.target.files || e.dataTransfer.files;
if (!files.length) { if (!files.length) {
return; return;
} }
......
...@@ -24,24 +24,6 @@ import router from '@/router'; ...@@ -24,24 +24,6 @@ import router from '@/router';
let dictLayersToLeaflet = {}; let dictLayersToLeaflet = {};
let statusList = [
{
name: 'Brouillon',
value: 'draft',
},
{
name: 'Publié',
value: 'published',
},
{
name: 'Archivé',
value: 'archived',
},
{
name: 'En attente de publication',
value: 'pending',
},
];
const mapService = { const mapService = {
layers: [], layers: [],
...@@ -58,9 +40,11 @@ const mapService = { ...@@ -58,9 +40,11 @@ const mapService = {
getMap() { getMap() {
return this.map; return this.map;
}, },
destroyMap() { destroyMap() {
this.map = undefined; this.map = undefined;
}, },
createMap(el, options) { createMap(el, options) {
const { const {
lat, lat,
...@@ -133,8 +117,8 @@ const mapService = { ...@@ -133,8 +117,8 @@ const mapService = {
router.push({ router.push({
name: 'details-signalement', name: 'details-signalement',
params: { params: {
slug_type_signal: featureTypeSlug, //'1-polygones' slug_type_signal: featureTypeSlug,
slug_signal: featureId, //'d267c6fa-d676-45c9-8e34-ec3d1bcc7c25' slug_signal: featureId,
}, },
}); });
} }
...@@ -143,7 +127,7 @@ const mapService = { ...@@ -143,7 +127,7 @@ const mapService = {
router.push({ router.push({
name: 'details-type-signalement', name: 'details-type-signalement',
params: { params: {
feature_type_slug: featureTypeSlug, //'1-polygones' feature_type_slug: featureTypeSlug,
}, },
}); });
} }
...@@ -152,11 +136,13 @@ const mapService = { ...@@ -152,11 +136,13 @@ const mapService = {
}, },
onMapClick(event) { onMapClick(event) {
//* retrieve features under pointer
const features = this.map.getFeaturesAtPixel(event.pixel, { const features = this.map.getFeaturesAtPixel(event.pixel, {
layerFilter: (l) => l === this.mvtLayer layerFilter: (l) => l === this.mvtLayer || this.olLayer
}); });
//* prepare popup content
if (features && features.length > 0) { if (features && features.length > 0) {
const popupContent = this._createContentPopup(features[0], this.mvtLayer.featureTypes); const popupContent = this._createContentPopup(features[0], this.featureTypes);
this.content.innerHTML = popupContent.html; this.content.innerHTML = popupContent.html;
this.overlay.setPosition(event.coordinate); this.overlay.setPosition(event.coordinate);
this.addRouterToPopup(popupContent.feature_type.slug, popupContent.featureId); this.addRouterToPopup(popupContent.feature_type.slug, popupContent.featureId);
...@@ -188,42 +174,31 @@ const mapService = { ...@@ -188,42 +174,31 @@ const mapService = {
} }
}); });
params.url = urlInfos[0]; params.url = urlInfos[0];
let self = this;
axios.get( axios.get(
window.proxy_url, window.proxy_url,
{ { params }
params: params,
}
).then(response => { ).then(response => {
const data = response.data; const data = response.data;
var err = typeof data === 'object' ? null : data; const err = typeof data === 'object' ? null : data;
if (data.features || err) { if (data.features || err) this.showGetFeatureInfo(err, event, data, queryLayer);
self.showGetFeatureInfo(err, event, data, queryLayer); }).catch(error => {
} throw error;
}) });
.catch(error => {
throw (error);
}
);
} }
} }
}, },
showGetFeatureInfo: function (err, event, data, layer) {
showGetFeatureInfo: function (err, event, data, layer) {
let content; let content;
if (err) { if (err) {
content = ` content = `
<h4>${layer.options.title}</h4> <h4>${layer.options.title}</h4>
<p>Données de la couche inaccessibles</p> <p>Données de la couche inaccessibles</p>
`; `;
this.content.innerHTML = content; this.content.innerHTML = content;
this.overlay.setPosition(event.coordinate); this.overlay.setPosition(event.coordinate);
} else { } else { // Otherwise show the content in a popup
// Otherwise show the content in a popup
const contentLines = []; const contentLines = [];
let contentTitle; let contentTitle;
if (data.features.length > 0) { if (data.features.length > 0) {
...@@ -238,10 +213,10 @@ const mapService = { ...@@ -238,10 +213,10 @@ const mapService = {
this.content.innerHTML = content; this.content.innerHTML = content;
this.overlay.setPosition(event.coordinate); this.overlay.setPosition(event.coordinate);
} }
} }
}, },
getFeatureInfoUrl(event, layer) { getFeatureInfoUrl(event, layer) {
const olLayer = dictLayersToLeaflet[layer.id]; const olLayer = dictLayersToLeaflet[layer.id];
const source = olLayer.getSource(); const source = olLayer.getSource();
...@@ -253,12 +228,14 @@ const mapService = { ...@@ -253,12 +228,14 @@ const mapService = {
} }
return url; return url;
}, },
fitBounds(bounds) { fitBounds(bounds) {
let ext = boundingExtent([[bounds[0][1], bounds[0][0]], [bounds[1][1], bounds[1][0]]]); let ext = boundingExtent([[bounds[0][1], bounds[0][0]], [bounds[1][1], bounds[1][0]]]);
ext = transformExtent(ext, 'EPSG:4326', 'EPSG:3857'); ext = transformExtent(ext, 'EPSG:4326', 'EPSG:3857');
this.map.getView().fit(ext, { padding: [25, 25, 25, 25] }); this.map.getView().fit(ext, { padding: [25, 25, 25, 25] });
}, },
fitExtent(ext) { fitExtent(ext) {
//ext = transformExtent(ext, 'EPSG:4326', 'EPSG:3857'); //ext = transformExtent(ext, 'EPSG:4326', 'EPSG:3857');
this.map.getView().fit(ext, { padding: [25, 25, 25, 25] }); this.map.getView().fit(ext, { padding: [25, 25, 25, 25] });
...@@ -270,7 +247,6 @@ const mapService = { ...@@ -270,7 +247,6 @@ const mapService = {
if (layers) { //* if admin has defined basemaps for this project if (layers) { //* if admin has defined basemaps for this project
let count = 0; let count = 0;
layers.forEach((layer) => { layers.forEach((layer) => {
if (layer) { if (layer) {
count +=1; count +=1;
const options = layer.options; const options = layer.options;
...@@ -335,14 +311,12 @@ const mapService = { ...@@ -335,14 +311,12 @@ const mapService = {
Object.values(dictLayersToLeaflet).forEach(element => { Object.values(dictLayersToLeaflet).forEach(element => {
this.map.removeLayer(element); this.map.removeLayer(element);
}); });
dictLayersToLeaflet = {}; dictLayersToLeaflet = {};
}, },
updateOpacity(layerId, opacity) { updateOpacity(layerId, opacity) {
const layer = dictLayersToLeaflet[layerId]; const layer = dictLayersToLeaflet[layerId];
layer.setOpacity(parseFloat(opacity)); layer.setOpacity(parseFloat(opacity));
}, },
updateOrder(layers) { updateOrder(layers) {
...@@ -366,9 +340,8 @@ const mapService = { ...@@ -366,9 +340,8 @@ const mapService = {
} }
}, },
addVectorTileLayer: function (url, projectId, projectSlug, featureTypes, formFilters) { addVectorTileLayer: function (url, projectId, featureTypes, formFilters) {
let format_cfg = {/*featureClass: Feature*/ }; const format_cfg = {/*featureClass: Feature*/ };
const mvt = new MVT(format_cfg); const mvt = new MVT(format_cfg);
const options = { const options = {
urls: [], urls: [],
...@@ -384,8 +357,7 @@ const mapService = { ...@@ -384,8 +357,7 @@ const mapService = {
style: styleFunction, style: styleFunction,
source: layerSource source: layerSource
}); });
this.mvtLayer.featureTypes = featureTypes; this.featureTypes = featureTypes; // store featureTypes for popups
this.mvtLayer.project_slug = projectSlug;
this.mvtLayer.setZIndex(30); this.mvtLayer.setZIndex(30);
this.map.addLayer(this.mvtLayer); this.map.addLayer(this.mvtLayer);
window.layerMVT = this.mvtLayer; window.layerMVT = this.mvtLayer;
...@@ -471,7 +443,7 @@ const mapService = { ...@@ -471,7 +443,7 @@ const mapService = {
let retour; let retour;
// TODO verifier utilité de cette boucle et remplacer par readFeatures plutot // TODO verifier utilité de cette boucle et remplacer par readFeatures plutot
features.forEach((feature) => { features.forEach((feature) => {
retour = new GeoJSON().readFeature(feature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' }); retour = new GeoJSON().readFeature(feature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' }, featureTypes);
drawSource.addFeature(retour); drawSource.addFeature(retour);
// const featureProperties = feature.properties ? feature.properties : feature; // const featureProperties = feature.properties ? feature.properties : feature;
// const featureType = featureTypes // const featureType = featureTypes
...@@ -493,6 +465,8 @@ const mapService = { ...@@ -493,6 +465,8 @@ const mapService = {
}); });
olLayer.setZIndex(29); olLayer.setZIndex(29);
this.map.addLayer(olLayer); this.map.addLayer(olLayer);
this.olLayer = olLayer;
this.featureTypes = featureTypes; // store featureTypes for popups
return drawSource; return drawSource;
}, },
...@@ -502,33 +476,36 @@ const mapService = { ...@@ -502,33 +476,36 @@ const mapService = {
_createContentPopup: function (feature, featureTypes) { _createContentPopup: function (feature, featureTypes) {
const formatDate = (current_datetime) => { const formatDate = (current_datetime) => {
let formatted_date = current_datetime.getFullYear() + '-' + ('0' + (current_datetime.getMonth() + 1)).slice(-2) + '-' + ('0' + current_datetime.getDate()).slice(-2) + ' ' + let formatted_date = current_datetime.getFullYear() + '-' + ('0' + (current_datetime.getMonth() + 1)).slice(-2) + '-' + ('0' + current_datetime.getDate()).slice(-2) + '&nbsp;' +
('0' + current_datetime.getHours()).slice(-2) + ':' + ('0' + current_datetime.getMinutes()).slice(-2); ('0' + current_datetime.getHours()).slice(-2) + ':' + ('0' + current_datetime.getMinutes()).slice(-2);
return formatted_date; return formatted_date;
}; };
let feature_type; let feature_type;
let status; let status;
let date_maj; let date_maj;
let creator;
if (feature.getProperties) { if (feature.getProperties) {
status = feature.getProperties().status; status = feature.getProperties().status;
if (status) status = status.label;
date_maj = feature.getProperties().updated_on; date_maj = feature.getProperties().updated_on;
} else { creator = feature.getProperties().creator;
if (featureTypes) {
feature_type = feature.getProperties().feature_type ||
featureTypes.find((x) => x.slug.split('-')[0] === '' + feature.getProperties().feature_type_id);
}
} else { //? I couldn't find when this code is used, is this still in use ?
status = feature.status; status = feature.status;
if (status) status = status.name;
date_maj = feature.updated_on; date_maj = feature.updated_on;
creator = feature.creator;
if (featureTypes) {
feature_type = featureTypes.find((x) => x.slug === feature.feature_type.slug);
}
} }
if(date_maj && date_maj.updated_on) date_maj = formatDate(new Date(date_maj.updated_on));
if (featureTypes) { // => VectorTile
feature_type = featureTypes.find((x) => x.slug.split('-')[0] === '' + feature.getProperties().feature_type_id);
status = statusList.find((x) => x.value === feature.getProperties().status).name;
date_maj = formatDate(new Date(feature.getProperties().updated_on));
} else {
feature_type = feature.getProperties ? feature.getProperties().feature_type : feature.feature_type;
status = feature.getProperties ? feature.getProperties().status.label : feature.status.label;
}
let author = ''; let author = '';
const creator = feature.getProperties ? feature.getProperties().creator : feature.creator;
if (creator) { if (creator) {
author = creator.full_name author = creator.full_name
? `<div> ? `<div>
...@@ -549,13 +526,14 @@ const mapService = { ...@@ -549,13 +526,14 @@ const mapService = {
Type : <a id="goToFeatureTypeDetail" class="pointer"> ${feature_type.title} </a> Type : <a id="goToFeatureTypeDetail" class="pointer"> ${feature_type.title} </a>
</div> </div>
<div> <div>
Dernière mise à jour : ${date_maj} Dernière&nbsp;mise&nbsp;à&nbsp;jour&nbsp;:&nbsp;${date_maj}
</div> </div>
${author} ${author}
`; `;
const featureId = feature.getProperties ? feature.getProperties().feature_id : feature.id; const featureId = feature.getProperties ? feature.getProperties().feature_id : feature.id;
return { html, feature_type, featureId }; return { html, feature_type, featureId };
}, },
zoomTo(location, zoomlevel, lon, lat) { zoomTo(location, zoomlevel, lon, lat) {
if (lon && lat) { if (lon && lat) {
location = [+lon, +lat]; location = [+lon, +lat];
...@@ -565,8 +543,8 @@ const mapService = { ...@@ -565,8 +543,8 @@ const mapService = {
}, },
addOverlay(loc) { addOverlay(loc) {
var pos = fromLonLat(loc); const pos = fromLonLat(loc);
var marker = new Overlay({ const marker = new Overlay({
position: pos, position: pos,
positioning: OverlayPositioning.CENTER_CENTER, positioning: OverlayPositioning.CENTER_CENTER,
element: document.getElementById('marker'), element: document.getElementById('marker'),
......
...@@ -351,16 +351,14 @@ export default { ...@@ -351,16 +351,14 @@ export default {
}); });
// --------- End sidebar events ---------- // --------- End sidebar events ----------
let self=this;
setTimeout(() => { setTimeout(() => {
const project_id = this.projectSlug.split('-')[0]; const project_id = this.projectSlug.split('-')[0];
const mvtUrl = `${this.API_BASE_URL}features.mvt/`; const mvtUrl = `${this.API_BASE_URL}features.mvt/`;
mapService.addVectorTileLayer( mapService.addVectorTileLayer(
mvtUrl, mvtUrl,
project_id, project_id,
self.projectSlug, this.feature_types,
self.feature_types, this.form
self.form
); );
}, 1000); }, 1000);
......
...@@ -437,12 +437,11 @@ export default { ...@@ -437,12 +437,11 @@ export default {
if (this.project && this.permissions.can_view_project) { if (this.project && this.permissions.can_view_project) {
await this.INITIATE_MAP(this.$refs.map); await this.INITIATE_MAP(this.$refs.map);
this.checkForOfflineFeature(); this.checkForOfflineFeature();
let project_id = this.$route.params.slug.split('-')[0]; const project_id = this.$route.params.slug.split('-')[0];
const mvtUrl = `${this.API_BASE_URL}features.mvt`; const mvtUrl = `${this.API_BASE_URL}features.mvt`;
mapService.addVectorTileLayer( mapService.addVectorTileLayer(
mvtUrl, mvtUrl,
project_id, project_id,
this.$route.params.slug,
this.feature_types this.feature_types
); );
this.mapLoading = false; this.mapLoading = false;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment