Author: fdesbois Date: 2010-06-16 19:12:34 +0000 (Wed, 16 Jun 2010) New Revision: 539 Log: Evo #2332 : - Add saveComment method in serviceContact - Add extra comments in ContactModelFactory - Use other window (better js usage) for extra comment (admin or coordinator) Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties trunk/wao-business/src/main/xmi/wao.zargo trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java trunk/wao-ui/src/main/webapp/Contacts.tml trunk/wao-ui/src/main/webapp/js/wao.js Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java 2010-06-16 19:12:34 UTC (rev 539) @@ -45,6 +45,11 @@ private static final long serialVersionUID = 1L; + @Override + public String getId() { + return getTopiaId(); + } + /** * Calculate the number of days between the tideBeginDate and the tideEndDate. * Automatically called when tideBeginDate or tideEndDate are modified. Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2010-06-16 19:12:34 UTC (rev 539) @@ -39,6 +39,7 @@ import com.csvreader.CsvReader; import com.csvreader.CsvWriter; import fr.ifremer.wao.bean.ConnectedUser; +import fr.ifremer.wao.bean.UserRole; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.nuiton.topia.TopiaContext; @@ -269,6 +270,31 @@ } @Override + public Contact executeSaveComment(TopiaContext transaction, + String contactId, + UserRole userRole, + String comment) + throws TopiaException { + + ContactDAO dao = WaoDAOHelper.getContactDAO(transaction); + + Contact contactToUpdate = dao.findByTopiaId(contactId); + + switch (userRole) { + case ADMIN: + contactToUpdate.setCommentAdmin(comment); break; + case COORDINATOR: + contactToUpdate.setCommentCoordinator(comment); + } + + dao.update(contactToUpdate); + + transaction.commitTransaction(); + + return contactToUpdate; + } + + @Override public InputStream executeExportContactCsv(TopiaContext transaction, ContactFilter filter) throws Exception { Modified: trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-business/src/main/resources/i18n/wao-business-en_GB.properties 2010-06-16 19:12:34 UTC (rev 539) @@ -29,6 +29,7 @@ wao.error.serviceContact.getNbContacts= wao.error.serviceContact.getNewContact= wao.error.serviceContact.importContactCsv= +wao.error.serviceContact.saveComment= wao.error.serviceContact.saveContact= wao.error.serviceContact.updateSampleMonthTidesValue= wao.error.serviceNews.getNewNews= Modified: trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-business/src/main/resources/i18n/wao-business-fr_FR.properties 2010-06-16 19:12:34 UTC (rev 539) @@ -28,6 +28,7 @@ wao.error.serviceContact.getNbContacts=Impossible de compter le nombre de contacts filtr\u00E9s wao.error.serviceContact.getNewContact=Impossible d'instancier un nouveau contact wao.error.serviceContact.importContactCsv=Impossible d'importer les contacts +wao.error.serviceContact.saveComment= wao.error.serviceContact.saveContact=Impossible de sauvegarder le contact wao.error.serviceContact.updateSampleMonthTidesValue= wao.error.serviceNews.getNewNews= Modified: trunk/wao-business/src/main/xmi/wao.zargo =================================================================== (Binary files differ) Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java 2010-06-16 19:12:34 UTC (rev 539) @@ -56,8 +56,11 @@ import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.Field; +import org.apache.tapestry5.Link; import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.RenderSupport; import org.apache.tapestry5.StreamResponse; +import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.IncludeStylesheet; import org.apache.tapestry5.annotations.InjectComponent; import org.apache.tapestry5.annotations.Log; @@ -70,7 +73,9 @@ import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.services.PropertyAccess; +import org.apache.tapestry5.json.JSONObject; import org.apache.tapestry5.services.BeanModelSource; +import org.apache.tapestry5.services.Request; import org.apache.tapestry5.upload.services.UploadedFile; import org.nuiton.util.DateUtils; import org.slf4j.Logger; @@ -312,9 +317,15 @@ public BeanModel<Contact> getContactModel() { if (contactModel == null) { - contactModel = fullView ? - contactModelFactory.buildAdminContactModel(beanModelSource, resources) : - contactModelFactory.buildContactModel(beanModelSource, resources); + + if (user.isAdmin() || user.isCoordinator()) { + contactModel = fullView ? + contactModelFactory.buildAdminContactModel(beanModelSource, resources) : + contactModelFactory.buildCoordinatorContactModel(beanModelSource, resources); + } else { + contactModel = + contactModelFactory.buildContactModel(beanModelSource, resources); + } } return contactModel; } @@ -433,7 +444,6 @@ contact.getDataInputDate() != null; return contact.getValidationCompany() == null && (state.isUnfinishedState() || boardingDone); - case OBSERVER: default: return false; } @@ -447,7 +457,6 @@ case COORDINATOR: return contact.getValidationCompany() != null && contact.getValidationProgram() == null; - case OBSERVER: default: return false; } @@ -666,7 +675,7 @@ @Log Object onSuccessFromContactsForm() { - if (!edited) { + if (!edited && contactEdited != null) { try { if (log.isDebugEnabled()) { log.debug("Contact save : " + contactEdited); @@ -706,4 +715,37 @@ layout.addError("Un contact en cours existe déjà pour ce navire"); } } + + /****************************** COMMENT POPUP *****************************/ + + @Property + private String contactId; + + @Property + private String extraComment; + + @Environmental + private RenderSupport renderSupport; + + @Log + void afterRender() { + renderSupport.addScript("extraComment = new ExtraComment();"); + } + + public String getValidationComment() { + String comment = null; + switch (user.getRole()) { + case ADMIN: + comment = contact.getCommentAdmin(); break; + case COORDINATOR: + comment = contact.getCommentCoordinator(); + } + return comment == null ? "" : comment.replace("'", "\'"); + } + + @Log + void onSuccessFromCommentForm() { + serviceContact.saveComment(contactId, user.getRole(), extraComment); + } + } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java 2010-06-16 19:12:34 UTC (rev 539) @@ -89,8 +89,15 @@ return contactModel; } + public BeanModel<Contact> buildCoordinatorContactModel(BeanModelSource beanModelSource, ComponentResources resources) { + BeanModel<Contact> contactModel = buildContactModel(beanModelSource, resources); + contactModel.add(RelativePosition.AFTER, "validation", "commentCoordinator", getCommentCoordinatorPropertyConduit()); + contactModel.add(RelativePosition.AFTER, "commentCoordinator", "commentAdmin", getCommentAdminPropertyConduit()); + return contactModel; + } + public BeanModel<Contact> buildAdminContactModel(BeanModelSource beanModelSource, ComponentResources resources) { - BeanModel<Contact> contactModel = buildContactModel(beanModelSource, resources); + BeanModel<Contact> contactModel = buildCoordinatorContactModel(beanModelSource, resources); contactModel.exclude("createdBy"); contactModel.add(RelativePosition.AFTER, TopiaEntity.TOPIA_CREATE_DATE, "observer", getUserPropertyConduit()); contactModel.add(RelativePosition.AFTER, "observer", WaoUser.COMPANY, getCompanyPropertyConduit()); @@ -445,4 +452,52 @@ } }; } + + public PropertyConduit getCommentCoordinatorPropertyConduit() { + return new PropertyConduit() { + @Override + public Object get(Object arg0) { + Contact contact = (Contact)arg0; + return contact.getCommentCoordinator(); + } + + @Override + public void set(Object arg0, Object arg1) { + } + + @Override + public Class getPropertyType() { + return String.class; + } + + @Override + public <T extends Annotation> T getAnnotation(Class<T> arg0) { + return null; + } + }; + } + + public PropertyConduit getCommentAdminPropertyConduit() { + return new PropertyConduit() { + @Override + public Object get(Object arg0) { + Contact contact = (Contact)arg0; + return contact.getCommentAdmin(); + } + + @Override + public void set(Object arg0, Object arg1) { + } + + @Override + public Class getPropertyType() { + return String.class; + } + + @Override + public <T extends Annotation> T getAnnotation(Class<T> arg0) { + return null; + } + }; + } } Modified: trunk/wao-ui/src/main/webapp/Contacts.tml =================================================================== --- trunk/wao-ui/src/main/webapp/Contacts.tml 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-ui/src/main/webapp/Contacts.tml 2010-06-16 19:12:34 UTC (rev 539) @@ -330,10 +330,32 @@ <input t:type="submitContext" t:id="unvalidateContact" class="ico22px unvalidate" value="Unvalidate" t:context="contact.topiaId" title="Enlever la validation du contact" /> </t:if> + <!--<a onclick="openContactCommentWindow('${validationComment}','${contact.id}');">--> + <a onclick="extraComment.openWindow('${validationComment}','${contact.id}');"> + <!--<a href="#" onclick="commentWindow.showCenter(true);">--> + <img src="${asset:context:img/comment-22px.png}" alt="Add comment" /> + </a> + <!--<t:contactValidationComment t:contact="contact" t:userRole="user.role" />--> </t:if> </p:actionsCell> </div> </form> </t:zone> +<div t:type="ck/Window" t:id="commentWindow" t:show="false" t:modal="true" + title="literal:Ajouter un commentaire" t:width="550" t:height="230"> + <form t:type="form" t:id="commentForm" action="tapestry"> + <p> + <textarea t:type="textarea" t:id="extraComment" t:value="extraComment" cols="50" rows="7" /> + <input t:type="hidden" t:id="hiddenContactId" t:value="contactId" /> + </p> + <p> </p> + <p class="aright"> + <a onclick="extraComment.saveComment()" class="save"> + <img src="${asset:context:img/save-22px.png}" alt="Save comment"/> + </a> + + </p> + </form> +</div> </t:layout> Modified: trunk/wao-ui/src/main/webapp/js/wao.js =================================================================== --- trunk/wao-ui/src/main/webapp/js/wao.js 2010-06-16 13:22:34 UTC (rev 538) +++ trunk/wao-ui/src/main/webapp/js/wao.js 2010-06-16 19:12:34 UTC (rev 539) @@ -37,6 +37,7 @@ var hidden = $$('.' + commentHiddenClass)[0]; var oldValue = hidden.getValue(); var newValue = $F(commentPopupId); + // TODO-fdesbois-2010-06-16 : use hidden images directly in tml instead of using context + imgId in argument var img = $(imgId); if ((unfinishedState && !newValue) || (unfinishedState && oldValue == newValue)) { img.setAttribute('src', context + '/img/comment-invalid-22px.png'); @@ -60,48 +61,48 @@ * - loginValid : img to display in case of login Ok (select is defined) * - loginInvalid : img to display in case of login Ko (select is undefined) */ -function refreshUserRoles(response) { +//function refreshUserRoles(response) { +// +// //Tapestry.debug('reponse.select = ' + response.select); +// +// if (response.select) { +// var content = ''; +// +// for (i = 0; i < response.select.length; i++) { +// var option = response.select[i]; +// +// //Tapestry.debug('option.name = ' + option.name); +// //Tapestry.debug('option.label = ' + option.label); +// +// content += '<option value="' + option.name + '"'; +// // First option is selected +// if (i == 0) { +// content += ' selected="selected"'; +// } +// content += '>' + option.label + '</option>\n\t'; +// } +// // Update select userRole +// $('userRole').update(content); +// $('userRole').enable(); +// // Display valid picture +// $('loginValid').toggleClassName('hidden'); +// // Hide invalid picture if needed +// if (!$('loginInvalid').hasClassName('hidden')) { +// $('loginInvalid').toggleClassName('hidden'); +// } +// } else { +// // Update select userRole (empty options) +// $('userRole').update('<option value=""></option>'); +// $('userRole').disable(); +// // Display invalid picture +// $('loginInvalid').toggleClassName('hidden'); +// // Hide valid picture if needed +// if (!$('loginValid').hasClassName('hidden')) { +// $('loginValid').toggleClassName('hidden'); +// } +// } +//} - //Tapestry.debug('reponse.select = ' + response.select); - - if (response.select) { - var content = ''; - - for (i = 0; i < response.select.length; i++) { - var option = response.select[i]; - - //Tapestry.debug('option.name = ' + option.name); - //Tapestry.debug('option.label = ' + option.label); - - content += '<option value="' + option.name + '"'; - // First option is selected - if (i == 0) { - content += ' selected="selected"'; - } - content += '>' + option.label + '</option>\n\t'; - } - // Update select userRole - $('userRole').update(content); - $('userRole').enable(); - // Display valid picture - $('loginValid').toggleClassName('hidden'); - // Hide invalid picture if needed - if (!$('loginInvalid').hasClassName('hidden')) { - $('loginInvalid').toggleClassName('hidden'); - } - } else { - // Update select userRole (empty options) - $('userRole').update('<option value=""></option>'); - $('userRole').disable(); - // Display invalid picture - $('loginInvalid').toggleClassName('hidden'); - // Hide valid picture if needed - if (!$('loginValid').hasClassName('hidden')) { - $('loginValid').toggleClassName('hidden'); - } - } -} - function toggleNewsDetails(element) { $(element).toggleClassName('hidden'); } @@ -132,7 +133,7 @@ // Update params of the anchor to be clickable anchor.update('Lire la suite...'); anchor.addClassName('news-details-link'); - anchor.writeAttribute('onClick', 'toggleNewsDetails("' + detailsContent.id + '")'); + anchor.writeAttribute('onclick', 'toggleNewsDetails("' + detailsContent.id + '")'); // Retrieve siblings paragraphs to wrap them into the hidden detailsContent var otherParagraphs = paragraph.nextSiblings(); @@ -147,3 +148,19 @@ } } } + +ExtraComment = Class.create({ + initialize: function() { + this.commentForm = $('commentForm'); + this.window = commentWindow; + }, + openWindow: function(comment, contactId) { + this.commentForm.extraComment.setValue(comment); + this.commentForm.hiddenContactId.setValue(contactId); + this.window.showCenter(true); + }, + saveComment: function() { + this.commentForm.submit(); + this.window.close(); + } +});