Author: bleny Date: 2014-04-03 10:46:37 +0200 (Thu, 03 Apr 2014) New Revision: 1811 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1811 Log: refs #4490 start displaying boat details Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatDetailsAction.java trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml trunk/wao-web/src/main/webapp/wao.css Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-04-03 08:46:37 UTC (rev 1811) @@ -9,6 +9,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.HqlAndParametersBuilder; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import java.util.Collection; import java.util.List; @@ -140,4 +141,13 @@ } + public Contact findMostRecentContactOrNull(ObsProgram obsProgram, String boatId, String companyId) { + TopiaQueryBuilderAddCriteriaOrRunQueryStep<Contact> query = newQueryBuilder(); + query.addTopiaIdEquals(Contact.PROPERTY_BOAT, boatId); + query.addTopiaIdEquals(Contact.PROPERTY_SAMPLE_ROW + "." + SampleRow.PROPERTY_COMPANY, companyId); + query.addEquals(Contact.PROPERTY_SAMPLE_ROW + "." + SampleRow.PROPERTY_OBS_PROGRAM_ORDINAL, obsProgram.ordinal()); + query.setOrderByArguments(Contact.PROPERTY_CREATION_DATE + " desc"); + return query.findFirstOrNull(); + } + } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/AuthenticatedWaoUser.java 2014-04-03 08:46:37 UTC (rev 1811) @@ -200,4 +200,9 @@ return ! userProfile.isCoordinatorOrObserver(); } + public boolean isAuthorizedToViewBoatDetails(String companyId) { + boolean authorizedToViewBoatDetails = userProfile.isAdmin() + || userProfile.isCoordinatorOrObserver() && waoUser.getCompany().getTopiaId().equals(companyId); + return authorizedToViewBoatDetails; + } } Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java 2014-04-03 08:46:37 UTC (rev 1811) @@ -0,0 +1,30 @@ +package fr.ifremer.wao.services.service; + +import fr.ifremer.wao.entity.BoatInfos; +import fr.ifremer.wao.entity.Contact; + +public class BoatDetails { + + protected BoatInfos boatInfos; + + protected Contact mostRecentContact; + + public BoatDetails(BoatInfos boatInfos, Contact mostRecentContact) { + this.boatInfos = boatInfos; + this.mostRecentContact = mostRecentContact; + } + + public BoatInfos getBoatInfos() { + return boatInfos; + } + + public Contact getMostRecentContact() { + return mostRecentContact; + } + + public boolean isNewContactCreatable() { + boolean newContactCreatable = mostRecentContact != null + && mostRecentContact.getContactState().isFinalState(); + return newContactCreatable; + } +} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-03 08:46:37 UTC (rev 1811) @@ -1,12 +1,18 @@ package fr.ifremer.wao.services.service; import com.google.common.base.Charsets; +import com.google.common.base.Optional; import com.google.common.collect.Sets; import fr.ifremer.wao.BoatsFilter; import fr.ifremer.wao.SampleRowsFilter; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.BoatInfos; +import fr.ifremer.wao.entity.BoatInfosTopiaDao; import fr.ifremer.wao.entity.BoatTopiaDao; +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.Contact; +import fr.ifremer.wao.entity.ObsProgram; import fr.ifremer.wao.services.AuthenticatedWaoUser; import fr.ifremer.wao.services.service.csv.BoatImportExportModel; import org.apache.commons.collections4.CollectionUtils; @@ -132,4 +138,33 @@ throw new WaoTechnicalException(e); } } + + public BoatDetails getBoatDetails(ObsProgram obsProgram, String boatId, String companyId) { + + BoatInfosTopiaDao dao = getBoatInfosDao(); + + Optional<BoatInfos> optionalBoatInfos = + dao.newQueryBuilder() + .addTopiaIdEquals(BoatInfos.PROPERTY_BOAT, boatId) + .addTopiaIdEquals(BoatInfos.PROPERTY_COMPANY, companyId) + .tryFindUnique(); + + BoatInfos boatInfos; + if (optionalBoatInfos.isPresent()) { + boatInfos = optionalBoatInfos.get(); + } else { + Boat boat = getBoatDao().findByTopiaId(boatId); + Company company = getCompanyDao().findByTopiaId(companyId); + boatInfos = dao.create(BoatInfos.PROPERTY_BOAT, boat, + BoatInfos.PROPERTY_COMPANY, company); + } + + Contact mostRecentContact = getContactDao().findMostRecentContactOrNull(obsProgram, boatId, companyId); + + BoatDetails boatDetails = new BoatDetails(boatInfos, mostRecentContact); + + return boatDetails; + + } + } Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatDetailsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatDetailsAction.java (rev 0) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatDetailsAction.java 2014-04-03 08:46:37 UTC (rev 1811) @@ -0,0 +1,47 @@ +package fr.ifremer.wao.web.action.obsmer; + +import com.google.common.base.Preconditions; +import fr.ifremer.wao.services.service.BoatDetails; +import fr.ifremer.wao.services.service.ObsMerBoatsService; +import fr.ifremer.wao.web.WaoJspActionSupport; + +public class BoatDetailsAction extends WaoJspActionSupport { + + private static final long serialVersionUID = 1L; + + protected transient ObsMerBoatsService service; + + protected String companyId; + + protected String boatId; + + protected BoatDetails boatDetails; + + public void setService(ObsMerBoatsService service) { + this.service = service; + } + + public void setCompanyId(String companyId) { + this.companyId = companyId; + } + + public void setBoatId(String boatId) { + this.boatId = boatId; + } + + @Override + public String execute() { + + Preconditions.checkState(getAuthenticatedWaoUser().isAuthorizedToViewBoatDetails(companyId)); + + boatDetails = service.getBoatDetails(getObsProgram(), boatId, companyId); + + return SUCCESS; + + } + + public BoatDetails getBoatDetails() { + return boatDetails; + } + +} Modified: trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-04-03 08:46:37 UTC (rev 1811) @@ -83,6 +83,7 @@ wao.ui.action.viewIndicatorsHistory=View indicators historic wao.ui.action.viewReal=View real observation effort wao.ui.action.viewSampleRowLog=View sample row log +wao.ui.action.viewShipOwnerBoats=View all boats for this shipowner wao.ui.action.zoomOnSampleRowPeriod=Use as filter dates the one of this sample row wao.ui.actions=Actions wao.ui.boatList=List of %s boats @@ -167,6 +168,7 @@ wao.ui.field.Contact.observationType=Observation type wao.ui.field.Contact.observedDataControl=Observed data control wao.ui.field.Contact.restitution=Restitution forwarding date +wao.ui.field.Contact.sampleRow= wao.ui.field.Contact.samplingStrategy=Sampling strategy followed wao.ui.field.Contact.secondaryObservers=Observers wao.ui.field.Contact.terrestrialLocation=Observation's place Modified: trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-04-03 08:46:37 UTC (rev 1811) @@ -83,6 +83,7 @@ wao.ui.action.viewIndicatorsHistory=Voir l'historique des modifications des indicateurs wao.ui.action.viewReal=Voir l'effort d'observation réalisé wao.ui.action.viewSampleRowLog=Consulter l'historique de cette ligne +wao.ui.action.viewShipOwnerBoats=Voir tous les navires de cet armateur wao.ui.action.zoomOnSampleRowPeriod=Changer les dates de la période par rapport à celles de la ligne wao.ui.actions=Actions wao.ui.boatList=Liste de %s navires @@ -167,6 +168,7 @@ wao.ui.field.Contact.observationType=Type d'observation wao.ui.field.Contact.observedDataControl=Contrôle des données observées wao.ui.field.Contact.restitution=Transmission de la restitution +wao.ui.field.Contact.sampleRow= wao.ui.field.Contact.samplingStrategy=Stratégie d'échantillonnage suivie wao.ui.field.Contact.secondaryObservers=Observateurs wao.ui.field.Contact.terrestrialLocation=Lieu d'observation Added: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp (rev 0) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp 2014-04-03 08:46:37 UTC (rev 1811) @@ -0,0 +1,93 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@taglib uri="/struts-tags" prefix="s" %> + +<table> + <caption> + <s:text name="wao.ui.contact.lastContact"/> + </caption> + <tbody> + <tr> + <th> + <s:text name="wao.ui.field.Boat.shipOwner"/> + </th> + <td> + <s:property value="boatDetails.boatInfos.boat.shipOwner.firstName"/> + <s:property value="boatDetails.boatInfos.boat.shipOwner.lastName"/> + + <s:url action="boats" id="shipOwnerBoatsUrl"> + <s:param name="filter.shipOwnerIds" value="boatDetails.boatInfos.boat.shipOwner.topiaId"/> + </s:url> + <s:a href="%{shipOwnerBoatsUrl}"> + <s:text name="wao.ui.action.viewShipOwnerBoats"/> + </s:a> + </td> + </tr> + <tr> + <th> + <s:text name="wao.ui.field.Boat.boatGroup"/> + </th> + <td> + <s:if test="boatDetails.boatInfos.boat.boatGroup == null"> + <s:text name="wao.ui.misc.N/A"/> + </s:if> + <s:else> + <s:property value="boatDetails.boatInfos.boat.boatGroup.description"/> + </s:else> + </td> + </tr> + </tbody> +</table> + +<s:if test="boatDetails.mostRecentContact != null"> + <table> + <caption> + <s:text name="wao.ui.contact.lastContact"/> + </caption> + <tbody> + <tr> + <th> + <s:text name="wao.ui.field.Contact.creationDate"/> + </th> + <td> + <s:property value="boatDetails.mostRecentContact.creationDate"/> + </td> + </tr> + <tr> + <th> + <s:text name="wao.ui.field.Contact.mainObserver"/> + </th> + <td> + <s:property value="boatDetails.mostRecentContact.mainObserver.fullName"/> + </td> + </tr> + <tr> + <th> + <s:text name="wao.ui.field.Contact.contactState"/> + </th> + <td> + <s:property value="%{getText(boatDetails.mostRecentContact.contactState)}"/> + </td> + </tr> + <tr> + <th> + <s:text name="wao.ui.field.Contact.sampleRow"/> + </th> + <td> + <s:property value="boatDetails.mostRecentContact.sampleRow.code"/> + </td> + </tr> + </tbody> + </table> +</s:if> + +<s:text name="wao.ui.boats.associatedLine"/> +<ul> + <s:iterator value="boatDetails.boatInfos.boat.elligibleBoat"> + <li> + <s:property value="sampleRow.code"/> + <s:if test="boatDetails.isNewContactCreatable && authenticatedWaoUser.authorizedToCreateContact"> + <s:text name="wao.ui.contacts.createFromBoat"/> + </s:if> + </li> + </s:iterator> +</ul> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp 2014-04-03 08:46:37 UTC (rev 1811) @@ -34,6 +34,16 @@ var boatsFilterController = new FilterController(WAO.OBSMER_BOATS_FILTER_VALUES_JSON_URL, $('#boats-filters-form')); boatsFilterController.init(); + + $('a.boat-details-action').click(function (e) { + e.preventDefault(); + var url = $(this).prop('href'); + var successCallback = function (data) { + $('#boat-details').html(data); + } + WAO.get(url, {}, successCallback); + }); + }); </script> @@ -206,9 +216,16 @@ <tbody> <s:iterator value="boats" var="boat"> - <tr class="boat-row<s:if test="!active"> inactive-boat-row</s:if>"> + <tr class="boat-row<s:if test="!active"> inactive</s:if>"> <td> - <s:property value="name"/> + <s:url action="boat-details" id="boatDetailsUrl"> + <s:param name="companyId" value="authenticatedWaoUser.waoUser.company.topiaId" /> + <s:param name="boatId" value="topiaId" /> + <s:param name="fragment" value="true" /> + </s:url> + <s:a href="%{boatDetailsUrl}" cssClass="boat-details-action"> + <s:property value="name"/> + </s:a> </td> <td><s:property value="%{'' + immatriculation}"/></td> <td><s:property value="boatLength"/> m</td> @@ -225,4 +242,8 @@ </todby> </table> +<div id="boat-details"></div> + +<div style="clear: both;"/> + </html> Modified: trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml 2014-04-03 08:46:37 UTC (rev 1811) @@ -22,6 +22,7 @@ <excludes> <pattern>/css/*</pattern> <pattern>/img/*</pattern> + <pattern>*?*fragment=true*</pattern> </excludes> <decorator name="layout-login" page="layout-login.jsp"> Modified: trunk/wao-web/src/main/webapp/wao.css =================================================================== --- trunk/wao-web/src/main/webapp/wao.css 2014-04-03 08:27:31 UTC (rev 1810) +++ trunk/wao-web/src/main/webapp/wao.css 2014-04-03 08:46:37 UTC (rev 1811) @@ -264,7 +264,7 @@ left: -200px } -table.boats-list tbody tr.inactive-boat-row { - background-color: #ffaaaa; +#boats-list, #boat-details { + float: left; }