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">