diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java
index 64546df01804d4d83f8ebcccbc834c767d8104d8..9755e849f3ab0785c959a27f915891ad86776e52 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/ObservationController.java
@@ -21,6 +21,8 @@ package no.nibio.vips.logic.controller.servlet;
import java.io.File;
import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
@@ -105,6 +107,48 @@ public class ObservationController extends HttpServlet {
Integer pestOrganismId;
Set<Integer> organizationGroupId;
Boolean viewOthersObservations;
+
+ // Default period is current season
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(SystemTime.getSystemTime());
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ Date timeOfObservationFrom;
+ Date timeOfObservationTo;
+ Boolean userDefinedFrom = false;
+ Boolean userDefinedTo = false;
+ try
+ {
+ timeOfObservationFrom = format.parse(request.getParameter("timeOfObservationFrom"));
+ userDefinedFrom = true;
+ }
+ catch(NullPointerException | ParseException ex)
+ {
+ cal.set(cal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
+ timeOfObservationFrom = cal.getTime();
+ }
+ try
+ {
+ timeOfObservationTo = format.parse(request.getParameter("timeOfObservationTo"));
+ userDefinedTo = true;
+ }
+ catch(NullPointerException | ParseException ex)
+ {
+ cal.set(cal.get(Calendar.YEAR), Calendar.DECEMBER, 31, 23, 59, 59);
+ timeOfObservationTo = cal.getTime();
+ }
+
+ // If only one date is set, the unset date should not limit the data set
+ if(!userDefinedFrom && userDefinedTo)
+ {
+ cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - 100);
+ timeOfObservationFrom = cal.getTime();
+ }
+ if(userDefinedFrom && !userDefinedTo)
+ {
+ cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + 100);
+ timeOfObservationTo = cal.getTime();
+ }
+
try
{
statusTypeId = request.getParameter("statusTypeId") != null ? Integer.valueOf(request.getParameter("statusTypeId")) : -1;
@@ -129,18 +173,18 @@ public class ObservationController extends HttpServlet {
viewOthersObservations = false;
organizationGroupId = null;
}
-
+
// First: Get observations for organization or user
if(viewOthersObservations && SessionControllerGetter.getUserBean().authorizeUser(user,
VipsLogicRole.OBSERVATION_AUTHORITY,
VipsLogicRole.ORGANIZATION_ADMINISTRATOR,
VipsLogicRole.SUPERUSER))
{
- observations = SessionControllerGetter.getObservationBean().getObservations(user.getOrganizationId().getOrganizationId());
+ observations = SessionControllerGetter.getObservationBean().getObservations(user.getOrganizationId().getOrganizationId(), timeOfObservationFrom, timeOfObservationTo);
}
else
{
- observations = SessionControllerGetter.getObservationBean().getObservationsForUser(user);
+ observations = SessionControllerGetter.getObservationBean().getObservationsForUser(user, timeOfObservationFrom, timeOfObservationTo);
}
// Then: Filter on other criteria
@@ -191,6 +235,8 @@ public class ObservationController extends HttpServlet {
request.setAttribute("shortcuts", shortcuts);
request.setAttribute("allPests", SessionControllerGetter.getOrganismBean().sortOrganismsByLocalName(allPests, SessionLocaleUtil.getCurrentLocale(request).getLanguage()));
request.setAttribute("hierarchyCategories", SessionControllerGetter.getOrganismBean().getHierarchyCategoryNames(SessionLocaleUtil.getCurrentLocale(request)));
+ request.setAttribute("timeOfObservationFrom", userDefinedFrom ? timeOfObservationFrom : null);
+ request.setAttribute("timeOfObservationTo", userDefinedTo ? timeOfObservationTo : null);
request.setAttribute("selectedPestOrganismId", pestOrganismId);
request.setAttribute("selectedStatusTypeId", statusTypeId);
request.setAttribute("viewOthersObservations",viewOthersObservations);
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 ba2bd2dac38a4f1b00752b80d5cfb63d3d0994c8..0c72eaadb74fa921b5fc523267cf9518a82596d2 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
@@ -78,6 +78,22 @@ public class ObservationBean {
return observations;
}
+ public List<Observation> getObservations(Integer organizationId, Date periodStart, Date periodEnd)
+ {
+ Organization organization = em.find(Organization.class,organizationId);
+ List<Observation> observations = em.createNamedQuery("Observation.findByOrganizationIdAndPeriod")
+ .setParameter("organizationId", organization)
+ .setParameter("start", periodStart)
+ .setParameter("end", periodEnd)
+ .getResultList();
+
+ observations = this.getObservationsWithGeoInfo(observations);
+ observations = this.getObservationsWithLocations(observations);
+ observations = this.getObservationsWithObservers(observations);
+
+ return observations;
+ }
+
public List<Observation> getObservations(Integer organizationId, Integer statusTypeId)
{
Organization organization= em.find(Organization.class, organizationId);
@@ -105,6 +121,20 @@ public class ObservationBean {
return retVal;
}
+ public List<Observation> getObservationsForUser(VipsLogicUser user, Date periodStart, Date periodEnd)
+ {
+ List<Observation> retVal = this.getObservationsWithGeoInfo(em.createNamedQuery("Observation.findByUserIdAndPeriod")
+ .setParameter("userId", user.getUserId())
+ .setParameter("start", periodStart)
+ .setParameter("end", periodEnd)
+ .getResultList());
+
+ retVal = this.getObservationsWithLocations(retVal);
+ retVal = this.getObservationsWithObservers(retVal);
+
+ return retVal;
+ }
+
public List<Observation> getObservationsForUser(VipsLogicUser user, Integer statusTypeId)
{
List<Observation> retVal = this.getObservationsWithGeoInfo(em.createNamedQuery("Observation.findByUserIdAndStatusTypeId")
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 110984161a49fc3fc6c2d4163bb00fc0c4dc4b4c..78b386dc1e2f0ee93f9ad83f1c9b340523a03267 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Observation.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Observation.java
@@ -64,9 +64,11 @@ import org.hibernate.annotations.TypeDefs;
@NamedQuery(name = "Observation.findAll", query = "SELECT o FROM Observation o"),
@NamedQuery(name = "Observation.findByObservationId", query = "SELECT o FROM Observation o WHERE o.observationId = :observationId"),
@NamedQuery(name = "Observation.findByUserId", query = "SELECT o FROM Observation o WHERE o.userId IN(:userId)"),
+ @NamedQuery(name = "Observation.findByUserIdAndPeriod", query = "SELECT o FROM Observation o WHERE o.timeOfObservation BETWEEN :start AND :end AND o.userId IN(:userId)"),
@NamedQuery(name = "Observation.findByUserIdAndStatusTypeId", query = "SELECT o FROM Observation o WHERE o.userId IN(:userId) AND o.statusTypeId= :statusTypeId"),
@NamedQuery(name = "Observation.findByUserIdAndOrganism", query = "SELECT o FROM Observation o WHERE o.userId IN(:userId) AND o.organism = :organism"),
@NamedQuery(name = "Observation.findByOrganizationId", 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))"),
+ @NamedQuery(name = "Observation.findByOrganizationIdAndPeriod", 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))"),
@NamedQuery(name = "Observation.findByOrganizationIdAndStatusTypeId", 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"),
@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"),
diff --git a/src/main/webapp/templates/observationList.ftl b/src/main/webapp/templates/observationList.ftl
index 11aab27f5966f320775ec4c1b96653d31c262139..52594948cb63419d846366bc70ace2a3b9d58413 100755
--- a/src/main/webapp/templates/observationList.ftl
+++ b/src/main/webapp/templates/observationList.ftl
@@ -21,20 +21,32 @@
</#macro>
<#macro custom_css>
<link href="/css/3rdparty/chosen.min.css" rel="stylesheet" />
+ <link rel="stylesheet" type="text/css" href="/css/3rdparty/jquery.datetimepicker.css"/>
</#macro>
- <#macro custom_js>
+<#macro custom_js>
<script type="text/javascript" src="/js/3rdparty/chosen.jquery.min.js"></script>
+ <script type="text/javascript" src="/js/3rdparty/jquery.datetimepicker.js"></script>
+ <script type="text/javascript" src="/js/3rdparty/modernizr_custom.js"></script>
<script type="text/javascript">
$(document).ready( function() {
- // Activating chosen plugin
- $(".chosen-select").chosen();
+ // Make sure that there is a date picker present for HTML5
+ // date input fields
+ if (!Modernizr.inputtypes.date) {
+ $('input[type=date]').datetimepicker({
+ timepicker: false,
+ lang:"no",
+ dayOfWeekStart: 1,
+ format: "Y-m-d"
+ });
+ }
+ // Activating chosen plugin
+ $(".chosen-select").chosen();
});
</script>
</#macro>
<#macro page_contents>
<div class="singleBlockContainer">
<h1>${i18nBundle.observations}</h1>
- <p>TODO: Add map and filter for time</p>
<#if messageKey?has_content>
<div class="alert alert-success">${i18nBundle(messageKey)}</div>
</#if>
@@ -67,10 +79,10 @@
</select>
</div>
<div class="form-group">
- <input type="date" class="form-control" name="timeOfObservationFrom" value="" placeholder="Dato fra"/>
+ <input type="date" class="form-control" name="timeOfObservationFrom" value="${(timeOfObservationFrom?date)!""}" placeholder="${i18nBundle.dateStart}"/>
</div> –
<div class="form-group">
- <input type="date" class="form-control" name="timeOfObservationTo" value="" placeholder="Dato til"/>
+ <input type="date" class="form-control" name="timeOfObservationTo" value="${(timeOfObservationTo?date)!""}" placeholder="${i18nBundle.dateEnd}"/>
</div>
</div>
<div class="form-inline">