diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java index 9bef8e074417037eb6e9eb9815e7828d38bb4a57..41fe540841ec985c4c17620ffe5780219502eba9 100755 --- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java @@ -34,6 +34,7 @@ import java.util.Set; import java.util.TimeZone; import javax.ejb.Stateless; import javax.persistence.EntityManager; +import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import javax.persistence.Query; import no.nibio.vips.logic.entity.CropCategory; @@ -691,5 +692,26 @@ public class ObservationBean { } } } + + /** + * Returns the first time an observation of the given pest registered in the system was made + * @param organismId + * @return + */ + public Date getFirstObservationTime(Integer organismId) { + + try + { + List<Observation> obs = em.createNamedQuery("Observation.findFirstByOrganism") + .setParameter("organism", em.find(Organism.class, organismId)) + .getResultList(); + return obs.get(0).getTimeOfObservation(); + } + catch(NoResultException | IndexOutOfBoundsException ex) + { + return null; + } + + } } diff --git a/src/main/java/no/nibio/vips/logic/entity/Observation.java b/src/main/java/no/nibio/vips/logic/entity/Observation.java index 31e56e6934e85acaa0b9cab22c8c9cf078616994..8341bda59c072de94328efda8402f5131a1756a5 100755 --- a/src/main/java/no/nibio/vips/logic/entity/Observation.java +++ b/src/main/java/no/nibio/vips/logic/entity/Observation.java @@ -73,6 +73,7 @@ import org.hibernate.annotations.TypeDefs; @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessage", query = "SELECT o FROM Observation o WHERE o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"), @NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeIdAndBroadcastMessageAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId)) AND o.statusTypeId= :statusTypeId AND o.broadcastMessage IS TRUE"), @NamedQuery(name = "Observation.findByOrganism", query = "SELECT o FROM Observation o WHERE o.organism = :organism"), + @NamedQuery(name = "Observation.findFirstByOrganism", query = "SELECT o FROM Observation o WHERE o.organism = :organism AND o.timeOfObservation = (SELECT MIN(ob.timeOfObservation) FROM Observation ob WHERE ob.organism = :organism)"), @NamedQuery(name = "Observation.findByTimeOfObservation", query = "SELECT o FROM Observation o WHERE o.timeOfObservation = :timeOfObservation") }) public class Observation implements Serializable, no.nibio.vips.observation.Observation { diff --git a/src/main/java/no/nibio/vips/logic/service/ObservationService.java b/src/main/java/no/nibio/vips/logic/service/ObservationService.java index d3237ac9d13180b2c076f30ab8058dceea4d12b8..5f7a65d336776197660c888298cb2cfaf56cf3cd 100755 --- a/src/main/java/no/nibio/vips/logic/service/ObservationService.java +++ b/src/main/java/no/nibio/vips/logic/service/ObservationService.java @@ -309,6 +309,19 @@ public class ObservationService { } } - + /** + * Returns the time of the first observation in the system of the pest with given Id + * @param organismId + * @return + */ + @GET + @Path("first/{organismId}") + @Produces("text/plain;charset=UTF-8") + public Response getFirstObservation(@PathParam("organismId") Integer organismId) + { + Date firstObsTime = SessionControllerGetter.getObservationBean().getFirstObservationTime(organismId); + return firstObsTime != null ? Response.ok().entity(firstObsTime).build() + : Response.status(404).entity("No observations of organism with id=" + organismId).build(); + } } diff --git a/src/main/webapp/map_applications/fireblight/index.html b/src/main/webapp/map_applications/fireblight/index.html index 27aa20128a9239836229f0e52b70c345b02cb433..058c86bc13a60ef9414a947e5147c1774611618a 100755 --- a/src/main/webapp/map_applications/fireblight/index.html +++ b/src/main/webapp/map_applications/fireblight/index.html @@ -112,6 +112,14 @@ opacity: 0.85; } + #seasons { + position: absolute; + bottom: 1em; + top: auto; + left: 10px; + z-index: 1999; + } + #legend { position: absolute; top: 3.0em; @@ -124,6 +132,8 @@ opacity: 0.85; } + + #legend ul { list-style: none; padding:0; @@ -250,7 +260,12 @@ </div> <div id="featureForm"></div> - <div id="menu"></div> + <div id="seasons"> + <select name="startSeason" id="startSeason" onchange="getAndRenderObservations(this.options[this.options.selectedIndex].value);"> + + </select> + + </div> <div id="legend"> <ul> <li class="bulk">Bulkemispel</li> diff --git a/src/main/webapp/map_applications/fireblight/js/map.js b/src/main/webapp/map_applications/fireblight/js/map.js index c8633ea585279090329b811bbb2506a64b24eaea..45c681b5fa18dbbe73e2eccc014b3ed5a16b9d35 100755 --- a/src/main/webapp/map_applications/fireblight/js/map.js +++ b/src/main/webapp/map_applications/fireblight/js/map.js @@ -168,6 +168,10 @@ var styles = { // TODO feature properties must be synchronized var lastYear = new Date().getFullYear() - 1; + // Population the season select list, setting last year as default selected + initSeasonSelectList(lastYear); + getAndRenderObservations(lastYear); + /* $.getJSON("/rest/observation/filter/1/geoJSON?from=" + lastYear + "-01-01&pestId=" + paerebrann.organismId, function(geoData){ //console.info(geoData) var format = new ol.format.GeoJSON(); @@ -179,7 +183,7 @@ var styles = { }); //featureOverlay.clear(true); featureOverlay.getSource().addFeatures(drawnfeatures); - }); + });*/ map.on('click', function(evt){ //features = [] @@ -207,6 +211,28 @@ var styles = { } +/** + * + * @param {type} fromSeason + * @returns {undefined} + */ +function getAndRenderObservations(fromSeason) +{ + //console.info("getAndRenderObservations(" + season + ")"); + $.getJSON("/rest/observation/filter/1/geoJSON?from=" + fromSeason + "-01-01&pestId=" + paerebrann.organismId, function(geoData){ + //console.info(geoData) + var format = new ol.format.GeoJSON(); + + var drawnfeatures = format.readFeatures(geoData, { + //dataProjection: "EPSG:32633", + dataProjection: "EPSG:4326", + featureProjection: map.getView().getProjection().getCode() + }); + featureOverlay.getSource().clear(); + featureOverlay.getSource().addFeatures(drawnfeatures); + }); +} + function toggleRegistration(theButton) { if(registration) @@ -546,7 +572,7 @@ var navigateTo = function(center) function navToLocation() { if (navigator.geolocation) { - if(window.location.protocol === "https") + if(window.location.protocol === "https:") { navigator.geolocation.getCurrentPosition(function(geopositionObj){ navigateTo([geopositionObj.coords.longitude, geopositionObj.coords.latitude]); @@ -564,6 +590,39 @@ function navToLocation() { alert( "Lokaliseringsfunksjonen er ikke tilgjengelig i denne nettleseren."); } } - - +/** + * + * @param {type} selectedSeason + * @returns {undefined} + */ +function initSeasonSelectList(selectedSeason) +{ + // What's the current year? + var thisYear = new Date().getFullYear(); + // How many years do we go back? + $.ajax({ + url: "/rest/observation/first/" + paerebrann.organismId + }) + .done(function(data){ + var time = moment(data); + var firstYear = time.toDate().getFullYear(); + // Loop gjennom år, lag valgliste :-) + var startSeasonList = document.getElementById("startSeason"); + for(var i=firstYear;i<=thisYear;i++) + { + var yearOpt = new Option("",i); + yearOpt.innerHTML = i + " →" + if(i==selectedSeason) + { + yearOpt.selected=true; + } + startSeasonList.options[startSeasonList.options.length] = yearOpt; + } + }) + .fail(function(jqXHR, textStatus, errorThrown){ + alert(textStatus); + }); + +} +