Author: bleny Date: 2014-04-07 16:17:38 +0200 (Mon, 07 Apr 2014) New Revision: 1853 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1853 Log: refs #4490 add boat infos form Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/UpdateBoatInfosJsonAction.java Modified: 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/boat-details.jsp 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/enpoints-js.jsp trunk/wao-web/src/main/webapp/wao.css trunk/wao-web/src/main/webapp/wao.js 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-07 11:01:57 UTC (rev 1852) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-07 14:17:38 UTC (rev 1853) @@ -27,6 +27,7 @@ import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.entity.BoatInfos; +import fr.ifremer.wao.entity.BoatInfosImpl; import fr.ifremer.wao.entity.BoatInfosTopiaDao; import fr.ifremer.wao.entity.BoatTopiaDao; import fr.ifremer.wao.entity.Company; @@ -152,6 +153,20 @@ public BoatDetails getBoatDetails(ObsProgram obsProgram, String boatId, String companyId) { + BoatInfos boatInfos = getBoatInfos(boatId, companyId); + + Contact mostRecentContact = getContactDao().findMostRecentContactOrNull(obsProgram, boatId, companyId); + + long count = getContactDao().newQueryBuilder().addTopiaIdEquals(Contact.PROPERTY_BOAT, boatId).count(); + + BoatDetails boatDetails = new BoatDetails(boatInfos, mostRecentContact); + + return boatDetails; + + } + + public BoatInfos getBoatInfos(String boatId, String companyId) { + BoatInfosTopiaDao dao = getBoatInfosDao(); Optional<BoatInfos> optionalBoatInfos = @@ -166,19 +181,26 @@ } else { Boat boat = getBoatDao().findByTopiaId(boatId); Company company = getCompanyDao().findByTopiaId(companyId); - boatInfos = dao.create(BoatInfos.PROPERTY_BOAT, boat, - BoatInfos.PROPERTY_COMPANY, company); - commit(); + boatInfos = new BoatInfosImpl(); + boatInfos.setBoat(boat); + boatInfos.setCompany(company); } - Contact mostRecentContact = getContactDao().findMostRecentContactOrNull(obsProgram, boatId, companyId); + return boatInfos; - long count = getContactDao().newQueryBuilder().addTopiaIdEquals(Contact.PROPERTY_BOAT, boatId).count(); + } - BoatDetails boatDetails = new BoatDetails(boatInfos, mostRecentContact); + public void saveBoatInfos(BoatInfos boatInfos) { - return boatDetails; + BoatInfosTopiaDao dao = getBoatInfosDao(); + if (boatInfos.isPersisted()) { + dao.update(boatInfos); + } else { + dao.create(boatInfos); + } + + commit(); + } - } Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/UpdateBoatInfosJsonAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/UpdateBoatInfosJsonAction.java (rev 0) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/UpdateBoatInfosJsonAction.java 2014-04-07 14:17:38 UTC (rev 1853) @@ -0,0 +1,59 @@ +package fr.ifremer.wao.web.action.obsmer; + +import com.google.common.base.Preconditions; +import com.opensymphony.xwork2.Preparable; +import fr.ifremer.wao.entity.BoatInfos; +import fr.ifremer.wao.services.service.ObsMerBoatsService; +import fr.ifremer.wao.web.WaoJsonActionSupport; + +public class UpdateBoatInfosJsonAction extends WaoJsonActionSupport implements Preparable { + + private static final long serialVersionUID = 1L; + + protected transient ObsMerBoatsService service; + + protected String companyId; + + protected String boatId; + + protected BoatInfos boatInfos; + + 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 void prepare() { + + Preconditions.checkState(session.getAuthenticatedWaoUser().isAuthorizedToViewBoatDetails(companyId)); + + boatInfos = service.getBoatInfos(boatId, companyId); + + } + + public BoatInfos getBoatInfos() { + return boatInfos; + } + + public void setBoatInfos(BoatInfos boatInfos) { + this.boatInfos = boatInfos; + } + + @Override + public String execute() { + + service.saveBoatInfos(boatInfos); + + return SUCCESS; + + } + +} 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-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-04-07 14:17:38 UTC (rev 1853) @@ -97,6 +97,8 @@ wao.ui.boats.boatName=Name wao.ui.boats.buildYear=Build year wao.ui.boats.district=District +wao.ui.boats.info=Details +wao.ui.boats.interlocutor=Interlocutor wao.ui.boats.nbObservations=%s observation(s), %s with your company (all programs considered) wao.ui.boats.portOfRegistry=Port wao.ui.boats.portOfRegistry.description=It's the main operating port of the boat @@ -264,6 +266,7 @@ wao.ui.forgotPassword=Forgot password ? wao.ui.form.Boat.name=Name wao.ui.form.Boat.registrationCode=Registration number +wao.ui.form.BoatInfos.success=Modifications successfuly saved wao.ui.form.Company.error.nameMustBeUnique=Company name must be unique wao.ui.form.Company.title.creation=Create a new company wao.ui.form.Company.title.edition=Edit company %s 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-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-04-07 14:17:38 UTC (rev 1853) @@ -97,6 +97,8 @@ wao.ui.boats.boatName=Nom wao.ui.boats.buildYear=Année de construction wao.ui.boats.district=Quartier maritime +wao.ui.boats.info=Autres informations sur ce navire +wao.ui.boats.interlocutor=Coordonnées de l'interlocuteur wao.ui.boats.nbObservations=%s observation(s) dont %s avec votre société wao.ui.boats.portOfRegistry=Port wao.ui.boats.portOfRegistry.description=Il s'agit du port d'exploitation principal du navire @@ -264,6 +266,7 @@ wao.ui.forgotPassword=Mot de passe oublié ? wao.ui.form.Boat.name=Nom wao.ui.form.Boat.registrationCode=Immatriculation +wao.ui.form.BoatInfos.success=Les informations ont bien été enregistrées wao.ui.form.Company.error.nameMustBeUnique=Le nom de la société doit être unique wao.ui.form.Company.title.creation=Création d'une société wao.ui.form.Company.title.edition=Modification de la société %s Modified: 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 2014-04-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp 2014-04-07 14:17:38 UTC (rev 1853) @@ -21,48 +21,53 @@ <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@taglib uri="/struts-tags" prefix="s" %> -<table class="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"/> +<h2> + <s:text name="wao.ui.boatinfo.title"> + <s:param value="boatDetails.boatInfos.boat.name"/> + </s:text> +</h2> - <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> +<script> + $(document).ready(function () { + $boatInfosForm = $('#boat-infos-form'); + + $('#save-boat-infos').click(function () { + var data = {}; + $boatInfosForm.find('input').each(function (index, input) { + var $input = $(input); + var parameterName = $input.prop('name'); + if (parameterName.indexOf('__') === 0) { + return; + } + var parameterValue; + if ($input.attr('type') === 'checkbox') { + parameterValue = $input.prop('checked'); + } else { + parameterValue = $input.prop('value'); + } + data[parameterName] = parameterValue; + }); + var successCallback = function () { + WAO.notifications.success('<s:text name="wao.ui.form.BoatInfos.success"/>'); + } + WAO.post(WAO.OBSMER_UPDATE_BOAT_INFOS_JSON_URL, data, successCallback); + }); + + $('#unlock-boat-infos-form').click(function () { + $boatInfosForm.find('input[readOnly="true"], button').removeAttr('readOnly').removeAttr('disabled'); + $(this).attr('disabled', 'disabled'); + }); + }); +</script> + <s:if test="boatDetails.mostRecentContact != null"> + + <h3> + <s:text name="wao.ui.contact.lastContact"/> + </h3> + <table class="table"> - <caption> - <s:text name="wao.ui.contact.lastContact"/> - </caption> <tbody> <tr> <th> @@ -100,10 +105,15 @@ </table> </s:if> -<s:form cssClass="form-horizontal"> +<h3> + <s:text name="wao.ui.boats.interlocutor"/> +</h3> - <s:hidden name="boatInfosId" value="%{boatDetails.boatInfos.topiaId}" /> +<s:form id="boat-infos-form" cssClass="form-horizontal"> + <s:hidden name="boatId" value="%{boatDetails.boatInfos.boat.topiaId}" /> + <s:hidden name="companyId" value="%{boatDetails.boatInfos.company.topiaId}" /> + <s:textfield name="boatInfos.contactFirstName" value="%{boatDetails.boatInfos.contactFirstName}" label="%{getText('wao.ui.field.BoatInfos.contactFirstName')}" readOnly="true" /> <s:textfield name="boatInfos.contactLastName" value="%{boatDetails.boatInfos.contactLastName}" label="%{getText('wao.ui.field.BoatInfos.contactLastName')}" readOnly="true" /> <s:textfield type="email" name="boatInfos.contactEmail" value="%{boatDetails.boatInfos.contactEmail}" label="%{getText('wao.ui.field.BoatInfos.contactEmail')}" readOnly="true" /> @@ -115,9 +125,20 @@ <s:textfield name="boatInfos.contactCity" value="%{boatDetails.boatInfos.contactCity}" label="%{getText('wao.ui.field.BoatInfos.contactCity')}" readOnly="true" /> <s:textfield name="boatInfos.comment" value="%{boatDetails.boatInfos.comment}" label="%{getText('wao.ui.field.BoatInfos.comment')}" readOnly="true" /> + <button type="button" id="unlock-boat-infos-form" class="btn"> + <i class="icon-edit"></i> <s:text name="wao.ui.action.edit" /> + </button> + + <button type="button" id="save-boat-infos" class="btn" disabled="disabled"> + <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" /> + </button> + </s:form> -<s:text name="wao.ui.boats.associatedLine"/> + +<h3> + <s:text name="wao.ui.boats.associatedLine"/> +</h3> <ul> <s:iterator value="boatDetails.boatInfos.boat.elligibleBoat"> <li> @@ -128,3 +149,41 @@ </li> </s:iterator> </ul> + +<h3> + <s:text name="wao.ui.boats.info"/> +</h3> + +<table class="table"> + <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> 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-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp 2014-04-07 14:17:38 UTC (rev 1853) @@ -143,13 +143,13 @@ </div> <div> + <h2> + <s:text name="wao.ui.boats.title"> + <s:param value="%{pagination.nbRecords}"/> + </s:text> + </h2> <table id="boats-list" class="table-condensed table-striped table-hover"> - <caption> - <s:text name="wao.ui.boats.title"> - <s:param value="%{pagination.nbRecords}"/> - </s:text> - </caption> <thead> <tr> <th> Modified: trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml 2014-04-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/webapp/WEB-INF/decorators.xml 2014-04-07 14:17:38 UTC (rev 1853) @@ -23,6 +23,7 @@ <pattern>/css/*</pattern> <pattern>/img/*</pattern> <pattern>*?*fragment=true*</pattern> + <pattern>*-json*</pattern> </excludes> <decorator name="layout-login" page="layout-login.jsp"> Modified: trunk/wao-web/src/main/webapp/enpoints-js.jsp =================================================================== --- trunk/wao-web/src/main/webapp/enpoints-js.jsp 2014-04-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/webapp/enpoints-js.jsp 2014-04-07 14:17:38 UTC (rev 1853) @@ -29,6 +29,8 @@ WAO.OBSMER_SAMPLE_ROWS_FILTER_VALUES_JSON_URL = '<s:url namespace="/obsmer" action="sample-rows-filter-values-json"/>'; WAO.OBSMER_BOATS_FILTER_VALUES_JSON_URL = '<s:url namespace="/obsmer" action="boats-filter-values-json"/>'; WAO.OBSMER_CONTACTS_FILTER_VALUES_JSON_URL = '<s:url namespace="/obsmer" action="contacts-filter-values-json"/>'; + WAO.OBSMER_UPDATE_BOAT_INFOS_JSON_URL = '<s:url namespace="/obsmer" action="update-boat-infos-json"/>'; + }); Modified: trunk/wao-web/src/main/webapp/wao.css =================================================================== --- trunk/wao-web/src/main/webapp/wao.css 2014-04-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/webapp/wao.css 2014-04-07 14:17:38 UTC (rev 1853) @@ -292,7 +292,7 @@ } #boats-filters-list-details-layout > div { - margin-left: 20px; + margin-left: 50px; } #boats-filters-list-details-layout > div:nth-child(3) { Modified: trunk/wao-web/src/main/webapp/wao.js =================================================================== --- trunk/wao-web/src/main/webapp/wao.js 2014-04-07 11:01:57 UTC (rev 1852) +++ trunk/wao-web/src/main/webapp/wao.js 2014-04-07 14:17:38 UTC (rev 1853) @@ -54,7 +54,7 @@ this.$selects.each(function (index, select) { var $select = $(select); var parameterName = $select.prop('name'); - if (parameterName.indexOf('__') == 0) { + if (parameterName.indexOf('__') === 0) { return; } var parameterValues = []; @@ -66,11 +66,11 @@ this.$inputs.each(function (index, input) { var $input = $(input); var parameterName = $input.prop('name'); - if (parameterName.indexOf('__') == 0) { + if (parameterName.indexOf('__') === 0) { return; } var parameterValue; - if ($input.attr('type') == 'checkbox') { + if ($input.attr('type') === 'checkbox') { parameterValue = $input.prop('checked'); } else { parameterValue = $input.prop('value'); @@ -115,7 +115,7 @@ var parameterName = $input.prop('name'); var parameterValue = filter[parameterName]; $input.prop('value', parameterValue); - if ($input.attr('type') == 'checkbox') { + if ($input.attr('type') === 'checkbox') { $input.prop('checked', parameterValue); } }); @@ -238,6 +238,16 @@ $.get(url, data, stopSpinningAfterCallingSuccessCallback); } + this.post = function (url, data, successCallback) { + this.startSpinner(); + var stopSpinningAfterCallingSuccessCallback = function () { + var result = successCallback.apply(this, arguments); + self.stopSpinner(); + return result; + }; + $.post(url, data, stopSpinningAfterCallingSuccessCallback); + } + }; $(document).ready(function () {