diff --git a/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java b/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java
index b17ca3f07677000a04ab62b467eb4bf66406c83f..8fe10c0021bc0162188a245c540c4680a66e8f07 100644
--- a/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java
+++ b/src/main/java/no/nibio/vips/logic/i18n/ResourceBundleJSServlet.java
@@ -58,7 +58,39 @@ public class ResourceBundleJSServlet extends HttpServlet {
else output.append(",");
output.append("\n\"").append(key).append("\":\"").append(StringEscapeUtils.escapeJavaScript(i18nTexts.getString(key))).append("\"");
}
- output.append("\n};");
+ output.append("\n};\n\n");
+
+ // Adding the methods needed to utilize the i18Texts dictionary
+ output.append(
+ "/**\n" +
+ "* Gets a message by key. The message should be translated\n" +
+ "* Depends on /js/resourcebundle.js for the dictionary i18Texts\n" +
+ "* @param {String} msgKey\n" +
+ "* @param {Array} positionalArguments - for string substitution in message\n" +
+ "* @returns {String} the message\n" +
+ "*/\n" +
+ "function getI18nMsg(msgKey,positionalArguments)\n" +
+ "{\n" +
+ " if(i18Texts[msgKey] === undefined)\n" +
+ " {\n" +
+ " return getI18nMsg(\"unknownTranslationKey\",[msgKey]);\n" +
+ " }\n" +
+ " return replaceParams(i18Texts[msgKey], positionalArguments);\n" +
+ "}\n" +
+ " \n" +
+ "/**\n" +
+ " * Mimic of the MessageFormat.format method in Java.\n" +
+ " * Very nicely explained here: http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings\n" +
+ " * @param {String} string\n" +
+ " * @param {Array} replacements\n" +
+ " * @returns {String}\n" +
+ " */\n" +
+ "function replaceParams(string, replacements) {\n" +
+
+ " return string.replace(/\\{(\\d+)\\}/g, function() {\n" +
+ " return replacements[arguments[1]];\n" +
+ " });\n" +
+ "}\n");
out.print(output.toString());
}
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
index 3e5c09e293b8c3bf098743ccee15f2f347418d7d..add2ccfdfb098a3b77aac3a2a4f23ec7440915b3 100644
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties
@@ -287,3 +287,10 @@ rememberLogin=Remember login
task_DeleteAllExpiredUserUuidsTask_name=Delete all expired user UUIDs
task_DeleteAllExpiredUserUuidsTask_description=Cleaning up the database of UUIDs, which is used for remembering client logins
mapDataIsRequired=Map data is required
+showMeWhereIAm=Show me where I am
+unknownTranslationKey=Unknown translation key: {0}
+mapDrawTypeLabel=What do you want to draw
+point=Point
+polygon=Polygon
+clearAll=Clear all
+clearOne=Clear one
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties
index 7ae7ba080e9570038d97c8c612dd54b33f7e1481..8aea801067d3035ae89183bf5031315bb98a842a 100644
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties
@@ -287,3 +287,10 @@ rememberLogin=Remember login
task_DeleteAllExpiredUserUuidsTask_name=Delete all expired user UUIDs
task_DeleteAllExpiredUserUuidsTask_description=Cleaning up the database of UUIDs, which is used for remembering client logins
mapDataIsRequired=Map data is required
+showMeWhereIAm=Show me where I Am
+unknownTranslationKey=Unknown translation key: {0}
+mapDrawTypeLabel=What do you want to draw
+point=point
+polygon=Polygon
+clearAll=Clear all
+clearOne=Clear one
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties
index 8b56087dd472d1b317cc8e47fbe30eb7694b663f..d7988747ad07948ab6dfb7f22c296ddb81420fa4 100644
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties
@@ -286,3 +286,10 @@ rememberLogin=Remember login
task_DeleteAllExpiredUserUuidsTask_name=Delete all expired user UUIDs
task_DeleteAllExpiredUserUuidsTask_description=Cleaning up the database of UUIDs, which is used for remembering client logins
mapDataIsRequired=Map data is required
+showMeWhereIAm=Show me where I Am
+unknownTranslationKey=Unknown translation key: {0}
+mapDrawTypeLabel=What do you want to draw
+point=point
+polygon=Polygon
+clearAll=Clear all
+clearOne=Clear one
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
index 13b3239f3a9ae4c6163d8c9dc66c1a088c39eeaa..e48c63d1d9204cc995e5c2a0dc28c06d770e7b7f 100644
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties
@@ -287,3 +287,10 @@ rememberLogin=Husk innlogging
task_DeleteAllExpiredUserUuidsTask_name=Slett alle utdaterte brukerUUIDer
task_DeleteAllExpiredUserUuidsTask_description=Rydder opp i tabellen over brukerUUIDer, som brukes til \u00e5 huske klientinnlogginger
mapDataIsRequired=Kartdata m\u00e5 registreres
+showMeWhereIAm=Vis meg hvor jeg er
+unknownTranslationKey=Ukjent oversettelsesn\u00f8kkel: {0}
+mapDrawTypeLabel=Jeg vil tegne
+point=Punkt
+polygon=Omr\u00e5de
+clearAll=Slett alt
+clearOne=Slett ett element
diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties
index 9d905c280aacdc8a8f4acb1ceff760c8a3408e81..88fc8bceb0c73aecdba1ced25121e8848978ae68 100644
--- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties
+++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties
@@ -287,3 +287,10 @@ rememberLogin=Remember login
task_DeleteAllExpiredUserUuidsTask_name=Delete all expired user UUIDs
task_DeleteAllExpiredUserUuidsTask_description=Cleaning up the database of UUIDs, which is used for remembering client logins
mapDataIsRequired=Map data is required
+showMeWhereIAm=Show me where I Am
+unknownTranslationKey=Unknown translation key: {0}
+mapDrawTypeLabel=What do you want to draw
+point=point
+polygon=Polygon
+clearAll=Clear all
+clearOne=Clear one
diff --git a/src/main/webapp/css/map.css b/src/main/webapp/css/map.css
index 8c2103ad3c8b5d947fe2d944a50e0e19669c2994..735c709a49f64c9f7da2feeae9fa99557f94699d 100755
--- a/src/main/webapp/css/map.css
+++ b/src/main/webapp/css/map.css
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 NIBIO <http://www.nibio.no/>.
+ * Copyright (c) 2016 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSLogic.
* VIPSLogic is free software: you can redistribute it and/or modify
@@ -18,10 +18,9 @@
*/
/*
Document : stylesheet
- Created on : Aug 28, 2013, 10:55:15 AM
- Author : Viggo Lunde <viggo.lunde@nibio.no>
+ Author : Viggo Lunde <viggo.lunde@nibio.no>, Tor-Einar Skog <tor-einar.skog@nibio.no>
Description:
- Main stylesheet of the VIPSLogic web app. Cusomizes the bootstrap.css
+ Stylesheet for the objectGISInfoMap. Cusomizes the bootstrap.css
*/
#toolbox {
@@ -66,7 +65,7 @@
float: right;
width: 22px;
height: 22px;
- background-image: url('../images/geoloc3.png');
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkY3RkRGRkNGQTU2MDExRTU5NzkwREJDNkE0NDk4ODlEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY3RkRGRkQwQTU2MDExRTU5NzkwREJDNkE0NDk4ODlEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjdGREZGQ0RBNTYwMTFFNTk3OTBEQkM2QTQ0OTg4OUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjdGREZGQ0VBNTYwMTFFNTk3OTBEQkM2QTQ0OTg4OUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7kZLS4AAAABlBMVEX9/fwAAABwf477AAAAAnRSTlP/AOW3MEoAAAHzSURBVHja7NvBcsJADANQ+f9/misHsmvZkhNgfWwhes10htheEOXCe9Wvosm/H4ADOIADOIBZAD7WEADLcgOQKB8A6bIAQJUcALqkAJRKB0C1NAA0SgFAr7oAtKsHANwC2PM3BAzkLwWYyF8JMJK/EGAm/1qAofxLAabySQAwJUAx/8NDaU1QAlw+FRcEoPPXj+W0AGT+vi/wAlKNCSUAk5/tjHqA7LsJ3EpAAKjeMC1AlN9J/boPoLvj7I2s5gf7gh6gNB/I/S+XO3/2FTkA9Tm2/6DxAjSTFDjzRYAIsWASsL8ivPn3A+KRADCAGAQ4bsD2r3o8IH4T8P5wzXRhnqGqY/p5AAdwAAdwAAdAXlO/jiTS//SB5KnPhPGTgHZj8u2tGdec3t6eDw0oWACcNyA1pBqcEYlvAVSA4qCyMid86qi2BKgNq/MC07heti8oLyzy7zStbDQ7o87SSrC2623NsntH3+Kyubold7f08noHUCyvc1v4zA+r6/ttY3EB0B1g8HR3Nx9ioc6Q3H+KRi8IFhAz+VNnyaICiIn8mfOEUQWICNEAhDt/f6zXPdcyH2xOHFu2jv0yF3dOHkMGCFc88QUH01A1HONPbqiq6Lc77Tzd+0vTo/ZFJ1l4FfBRUb6Oav5zAAdwAH8PiK8FvAQYAObrJPi2gfjAAAAAAElFTkSuQmCC);
background-size: 20px 20px;
background-repeat: no-repeat;
background-position: 1px;
diff --git a/src/main/webapp/css/vipslogic.css b/src/main/webapp/css/vipslogic.css
index 156bca2975a8797c4eca8b27ad39b11b5d4cd22e..bf71bed29801753b50ee94683a8199fbd2cc982b 100644
--- a/src/main/webapp/css/vipslogic.css
+++ b/src/main/webapp/css/vipslogic.css
@@ -70,7 +70,7 @@ legend {
display: block;
}
-#observationFormMap, #weatherStationListMap, #weatherStationFormMap, #weatherStationViewMap{
+#objectGISInfoMap, #weatherStationListMap, #weatherStationFormMap, #weatherStationViewMap {
height: 400px;
width: 100%;
}
diff --git a/src/main/webapp/js/observationFormMap.js b/src/main/webapp/js/objectGISInfoMap.js
similarity index 85%
rename from src/main/webapp/js/observationFormMap.js
rename to src/main/webapp/js/objectGISInfoMap.js
index ef9b75f6940829dfe2f763d58e2f047652cf1540..9c91356e05854068b80a9714250ece279b41ebfc 100755
--- a/src/main/webapp/js/observationFormMap.js
+++ b/src/main/webapp/js/objectGISInfoMap.js
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 NIBIO <http://www.nibio.no/>.
+ * Copyright (c) 2015-2016 NIBIO <http://www.nibio.no/>.
*
* This file is part of VIPSLogic.
* VIPSLogic is free software: you can redistribute it and/or modify
@@ -18,22 +18,76 @@
*/
/**
- * Logic for registering location of an observation using an OpenLayers v3 map
+ * Logic for GIS information about an object
+ *
+ * To get the current registered GIS as GEOJson, call getFeatures();
+ *
+ * @author Viggo Lunde <viggo.lunde@nibio.no>
+ * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
*/
var featureOverlay, map;
+var olMapDivId = "objectGISInfoMap";
/**
- *
+ * @param {string} containerId - DOM id of the div where we can intialize the map
* @param {ol.Coordinate} center - coordinates for the map's center (WGS84)
* @param {int} zoomLevel - the zoom level (1-15, 1 is world wide view, 15 is greatest zoom)
* @param {boolean} displayMarker - show observation marker in center location
* @param {string} drawnObjs - GeoJSON with geometries to display
+ * @param {string} chooseLayersObj Which polygon layers to choose from. Sample:
+ * <pre>
+ * {
+ * "chooseFromMapLayers":[
+ * {
+ * "mapLayerId":1,
+ * "mapLayerTitle":"Kommunegrenser",
+ * "description":"Norske kommunegrenser",
+ * "mapLayerType":"overlay",
+ * "defaultVisible":false,
+ * "hoverAttribute":"navn",
+ * "url":"http://kart13.skogoglandskap.no/geoserver/ows?srsname=EPSG:3857&format_options=decimals:0&service=WFS&version=1.0.0&outputFormat=json&request=GetFeature&typeName=sl:n2000_komm_flate&"
+ * },
+ * {
+ * "mapLayerId":2,
+ * "mapLayerTitle":"Fylkesgrenser",
+ * "description":"Norske fylkesgrenser",
+ * "mapLayerType":"overlay",
+ * "defaultVisible":false,
+ * "hoverAttribute":null,
+ * "url":"http://kart13.skogoglandskap.no/geoserver/ows?srsname=EPSG:3857&format_options=decimals:0&service=WFS&version=1.0.0&outputFormat=json&request=GetFeature&typeName=sl:n5_forv_fylke_mv&"
+ * }
+ * ]
+ * }
+ * </pre>
+ *
* @returns {void}
*/
-function initMap(center, zoomLevel, displayMarker, drawnObjs, chooseLayersObj) {
+function initMap(containerId, center, zoomLevel, displayMarker, drawnObjs, chooseLayersObj) {
+
+ // Create the DOM structure
+ var theContainer = el(containerId);
+ theContainer.innerHTML = [
+ "<div>",
+ " <label>",getI18nMsg("mapDrawTypeLabel"),"</label>",
+ " <select id='type'>",
+ " <option value='Point'>",getI18nMsg("point"),"</option>",
+ " <option value='Polygon'>",getI18nMsg("polygon"),"</option>",
+ " </select>",
+ " <button id='delete' type='button'>",getI18nMsg("clearAll"),"</button>",
+ " <button id='deleteOne' type='button'>",getI18nMsg("clearOne"),"</button>",
+ "</div>",
+ "<div id='", olMapDivId ,"' class='map'></div>",
+ "<div id='alert_placeholder'></div>"
+ ].join("");
+
+
+ // Adding standard base layers
+ //
+ // TODO: Make this configurable per organization (input base layers as function parameter)
+ // OpenStreetMap
var osm = new ol.layer.Tile({
'title': 'OSM',
type: 'base',
@@ -47,6 +101,7 @@ function initMap(center, zoomLevel, displayMarker, drawnObjs, chooseLayersObj) {
})
});
+ // Satellite photo map from Microsoft/Bing
var bingArial = new ol.layer.Tile({
title: 'Bing Arial',
type: 'base',
@@ -57,7 +112,7 @@ function initMap(center, zoomLevel, displayMarker, drawnObjs, chooseLayersObj) {
})
});
-
+ // Detailed map of Norway in shades of grey
var topo2graatone = new ol.layer.Tile({
title: "GrĂ¥tone",
type: 'base',
@@ -130,7 +185,7 @@ app.geoLocationControl = function(opt_options) {
var button = document.createElement('button');
//button.innerHTML = 'O';
- button.title = 'Show me where I am'
+ button.title = getI18nMsg("showMeWhereIAm");
var this_ = this;
@@ -166,7 +221,7 @@ ol.inherits(app.geoLocationControl, ol.control.Control);
// Creating the map
map = new ol.Map({
- target: 'observationFormMap',
+ target: olMapDivId, // Defined at the top of this file
controls: ol.control.defaults({
attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
collapsible: true
@@ -545,7 +600,9 @@ ol.inherits(app.geoLocationControl, ol.control.Control);
}
-
+/**
+ * Listen for changes in the user's location
+ */
geolocation.on('change:position', function() {
removeFeature('geoLoc');
@@ -618,6 +675,9 @@ ol.inherits(app.geoLocationControl, ol.control.Control);
}*/
}
+/**
+ * @return {GEOJson} returns all features currently on the map in GEOJson format
+ */
function getFeatures() {
var features = featureOverlay.getSource().getFeatures();
var format = new ol.format.GeoJSON();
diff --git a/src/main/webapp/js/validateForm.js b/src/main/webapp/js/validateForm.js
index a9315c10d91c48ddd2e3507c2016df0ab38cd23a..1545b80e3f2af535e753fb03761d112ed02547c4 100644
--- a/src/main/webapp/js/validateForm.js
+++ b/src/main/webapp/js/validateForm.js
@@ -20,6 +20,7 @@
* This validator has its Java counterpart in no.nibio.web.forms.FormValidator.java
* (for server side validation). They use the same JSON file for form validation.
* Changes in logic client side should be reflected server side
+ * Depends on /js/resourcebundle.js for the dictionary i18Texts
*/
// Constant defs for field types. Also found in no.nibio.web.forms.FormField
@@ -559,28 +560,3 @@ function styleValid(inputEl)
{
$(inputEl.parentNode).removeClass("has-error");
}
-
-/**
- * Gets a message by key. The message should be translated
- * Depends on /js/resourcebundle.js for the dictionary i18Texts
- * @param {String} msgKey
- * @param {Array} positionalArguments - for string substitution in message
- * @returns {String} the message
- */
-function getI18nMsg(msgKey,positionalArguments)
-{
- return replaceParams(i18Texts[msgKey], positionalArguments);
-}
-
-/**
- * Mimic of the MessageFormat.format method in Java.
- * Very nicely explained here: http://stackoverflow.com/questions/1353408/messageformat-in-javascript-parameters-in-localized-ui-strings
- * @param {String} string
- * @param {Array} replacements
- * @returns {String}
- */
-function replaceParams(string, replacements) {
- return string.replace(/\{(\d+)\}/g, function() {
- return replacements[arguments[1]];
- });
-}
\ No newline at end of file
diff --git a/src/main/webapp/templates/observationForm.ftl b/src/main/webapp/templates/observationForm.ftl
index bef0cd52bfff9d60e2f953a793100d23538170c4..ffda393c465c1d9eb011da2d8fda344742c2ee30 100755
--- a/src/main/webapp/templates/observationForm.ftl
+++ b/src/main/webapp/templates/observationForm.ftl
@@ -33,7 +33,7 @@
<script type="text/javascript" src="/js/constants.js"></script>
<script type="text/javascript" src="/js/resourcebundle.js"></script>
<script type="text/javascript" src="/js/validateForm.js"></script>
- <script type="text/javascript" src="/js/observationFormMap.js"></script>
+ <script type="text/javascript" src="/js/objectGISInfoMap.js"></script>
<script type="text/javascript">
$(document).ready(function() {
// Make sure that there is a datetime picker present for HTML5
@@ -57,7 +57,7 @@
<#else>
var geoInfo = <#if observation.geoinfo?has_content>${observation.geoinfo}<#else>{}</#if>;
var chooseFromMapLayers = {"chooseFromMapLayers":<#if mapLayers?has_content>${mapLayers}<#else>[]</#if>};
- initMap([${defaultMapCenter.x?c},${defaultMapCenter.y?c}],${defaultMapZoom},false, geoInfo, chooseFromMapLayers);
+ initMap("observationFormMap",[${defaultMapCenter.x?c},${defaultMapCenter.y?c}],${defaultMapZoom},false, geoInfo, chooseFromMapLayers);
</#if>
});
</script>
@@ -128,20 +128,9 @@
</form>
</div>
<div class="col-md-6">
- <div>
- <label>What do you want to draw</label>
- <select id="type">
- <option value="Point">Point</option>
- <option value="Polygon">Polygon</option>
- </select>
- <button id="delete" type="button">Clear all</button>
- <button id="deleteOne" type="button">Clear one</button>
- </div>
- <div id="observationFormMap" class="map">
- </div>
- <div id="alert_placeholder"></div>
+ <div id="observationFormMap"></div> <!-- Contents is added dynamically by objectGISInfoMap -->
</div>
</div>
- <div style="display: none;"><div id="marker" title="Marker"><img src="/images/bug_medium.png"/></div></div>
+ <!--div style="display: none;"><div id="marker" title="Marker"><img src="/images/bug_medium.png"/></div></div-->
</#macro>
<@page_html/>