This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git commit 43249fb297d6583611a8eb471cac509869b0b71a Author: Yannick Martel <martel@©odelutin.com> Date: Thu Dec 11 10:38:49 2014 +0100 can add conclusion and file with question close --- .../src/main/xmi/coselmar-model.properties | 3 +- .../src/main/xmi/coselmar-model.zargo | Bin 10020 -> 10090 bytes .../fr/ifremer/coselmar/beans/QuestionBean.java | 27 +++++++++++++++ .../coselmar/converter/BeanEntityConverter.java | 20 +++++++++++ .../coselmar/services/v1/QuestionsWebService.java | 20 ++++++++++- .../src/main/webapp/js/coselmar-controllers.js | 10 +++++- .../src/main/webapp/views/questions/question.html | 22 +++++++----- .../views/questions/viewRestrictedQuestion.html | 2 -- .../main/webapp/views/questions/viewquestion.html | 37 +++++++++++++++++++++ 9 files changed, 128 insertions(+), 13 deletions(-) diff --git a/coselmar-persistence/src/main/xmi/coselmar-model.properties b/coselmar-persistence/src/main/xmi/coselmar-model.properties index 6f8eef4..1d2db03 100644 --- a/coselmar-persistence/src/main/xmi/coselmar-model.properties +++ b/coselmar-persistence/src/main/xmi/coselmar-model.properties @@ -28,4 +28,5 @@ model.tagvalue.useEnumerationName=true # Text fr.ifremer.coselmar.persistence.entity.Document.attribute.summary.tagValue.hibernateAttributeType=text -fr.ifremer.coselmar.persistence.entity.Question.attribute.summary.tagValue.hibernateAttributeType=text \ No newline at end of file +fr.ifremer.coselmar.persistence.entity.Question.attribute.summary.tagValue.hibernateAttributeType=text +fr.ifremer.coselmar.persistence.entity.Question.attribute.conclusion.tagValue.hibernateAttributeType=text \ No newline at end of file diff --git a/coselmar-persistence/src/main/xmi/coselmar-model.zargo b/coselmar-persistence/src/main/xmi/coselmar-model.zargo index 7b908f2..a776669 100644 Binary files a/coselmar-persistence/src/main/xmi/coselmar-model.zargo and b/coselmar-persistence/src/main/xmi/coselmar-model.zargo differ diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionBean.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionBean.java index ff9e9d2..3126de1 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionBean.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionBean.java @@ -44,6 +44,10 @@ public class QuestionBean implements Serializable { protected Boolean isRestricted; + protected String conclusion; + + protected Set<DocumentBean> closingDocuments; + public String getId() { return id; @@ -245,4 +249,27 @@ public class QuestionBean implements Serializable { public void setRestricted(boolean isRestricted) { this.isRestricted = isRestricted; } + + public String getConclusion() { + return conclusion; + } + + public void setConclusion(String conclusion) { + this.conclusion = conclusion; + } + + public Set<DocumentBean> getClosingDocuments() { + return this.closingDocuments; + } + + public void setClosingDocuments(Set<DocumentBean> closingDocuments) { + this.closingDocuments = closingDocuments; + } + + public void addClosingDocument(DocumentBean closingDocument) { + if (this.closingDocuments == null) { + this.closingDocuments = new HashSet<>(); + } + this.closingDocuments.add(closingDocument); + } } //Question diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java index 67682d6..faa27c8 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java @@ -188,6 +188,16 @@ public class BeanEntityConverter { } } + result.setConclusion(question.getConclusion()); + Collection<Document> closingDocuments = question.getClosingDocuments(); + if (closingDocuments != null && !closingDocuments.isEmpty()) { + for (Document relatedDocument : closingDocuments) { + String lightId = idFactory.getRandomPart(relatedDocument.getTopiaId()); + DocumentBean documentBean = toBean(lightId, relatedDocument); + result.addClosingDocument(documentBean); + } + } + result.setRestricted(question.isUnavailable()); return result; } @@ -220,6 +230,16 @@ public class BeanEntityConverter { Date closingDate = question.getClosingDate(); if (closingDate != null){ result.setClosingDate(new Date(closingDate.getTime())); + result.setConclusion(question.getConclusion()); + } + + Collection<Document> closingDocuments = question.getClosingDocuments(); + if (closingDocuments != null && !closingDocuments.isEmpty()) { + for (Document relatedDocument : closingDocuments) { + String lightId = idFactory.getRandomPart(relatedDocument.getTopiaId()); + DocumentBean documentBean = toBean(lightId, relatedDocument); + result.addClosingDocument(documentBean); + } } Collection<Question> parents = question.getParents(); diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java index eafd6c7..59b3f39 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java @@ -200,7 +200,6 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { } else if (StringUtils.equalsIgnoreCase(CoselmarUserRole.EXPERT.name(), currentUserRole)) { questionList = getQuestionDao().findForExpert(currentUser); - //TODO ymartel : manage privacy for experts } else if (StringUtils.equalsIgnoreCase(CoselmarUserRole.CLIENT.name(), currentUserRole)) { questionList = getQuestionDao().forClientsContains(currentUser).findAll(); @@ -609,6 +608,25 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { questionEntity.clearRelatedDocuments(); } + questionEntity.setConclusion(question.getConclusion()); + + // Documents on init + Set<DocumentBean> closingDocuments = question.getClosingDocuments(); + if (closingDocuments != null && !closingDocuments.isEmpty()) { + Set<Document> documents = retrieveDocuments(closingDocuments); + // Manage restriction list for document with Privacy.RESTRICTED + for (Document document : documents) { + if (document.getPrivacy() == Privacy.RESTRICTED) { + document.addRestrictedList(participantGroup); + } + } + + questionEntity.clearClosingDocuments(); + questionEntity.addAllClosingDocuments(documents); + } else if (inEdition) { + questionEntity.clearClosingDocuments(); + } + commit(); } diff --git a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js index e655776..16017d1 100644 --- a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js +++ b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js @@ -323,7 +323,7 @@ coselmarControllers.controller("QuestionsCtrl", ['$scope', '$route', '$routePara coselmarControllers.controller("QuestionCtrl", ['$scope', '$route', '$routeParams', '$location', '$modal', 'questionsService', function($scope, $route, $routeParams, $location, $modal, questionsService){ - $scope.editMode = $routeParams.edit ? $routeParams.edit : false; + $scope.editSession = $routeParams.edit ? $routeParams.edit : false; $scope.isCurrentParticipant = false; $scope.question = {'privacy' : 'PUBLIC', @@ -510,6 +510,14 @@ coselmarControllers.controller("QuestionCtrl", ['$scope', '$route', '$routeParam }); }; + $scope.openCloseQuestionSession = function(){ + if (!$scope.question.closingDocuments) { + $scope.question.closingDocuments = []; + } + + $scope.closeSession = true; + }; + $scope.reopenQuestion = function(){ $scope.question.status = "IN_PROGRESS"; questionsService.saveQuestion($scope.question, function() { diff --git a/coselmar-ui/src/main/webapp/views/questions/question.html b/coselmar-ui/src/main/webapp/views/questions/question.html index 3093209..7f49861 100644 --- a/coselmar-ui/src/main/webapp/views/questions/question.html +++ b/coselmar-ui/src/main/webapp/views/questions/question.html @@ -2,22 +2,23 @@ <div class="page-header" style="margin: 0"> <h2> {{question.title}} - <a class="btn btn-action btn-edit pull-right" ng-click="edit()" ng-if="editMode != true && currentUser.role == 'SUPERVISOR'"> + <a class="btn btn-action btn-edit pull-right" ng-click="edit()" ng-if="editSession != true && currentUser.role == 'SUPERVISOR'"> <span class="fa fa-edit" aria-hidden="true"></span>Edit </a> </h2> </div> - <div style="padding-bottom: 50px" ng-if="editMode == false && question.isRestricted"> + <!-- Main part : View or edit --> + <div style="padding-bottom: 50px" ng-if="editSession == false && question.isRestricted"> <div ng-include="src='views/questions/viewRestrictedQuestion.html'"></div> </div> - <div style="padding-bottom: 50px" ng-if="editMode == false && !question.isRestricted"> + <div style="padding-bottom: 50px" ng-if="editSession == false && !question.isRestricted"> <div ng-include="src='views/questions/viewquestion.html'"></div> <div ng-include="src='views/questions/newDocumentsPart.html'" ng-if="isCurrentParticipant"></div> </div> - <div style="padding-bottom: 50px" ng-if="editMode == true"> + <div style="padding-bottom: 50px" ng-if="editSession == true"> <form name="questionForm" class="form-horizontal" role="form"> <div ng-include="src='views/questions/editquestion.html'"></div> <div class="form-group" style="padding-left: 200px"><a class="btn btn-action btn-success" ng-click="saveQuestion(true)"> @@ -26,18 +27,23 @@ </form> </div> + <!-- bottom part : close and action --> <div class="text-center" ng-if="question.closingDate"> Closed on {{question.closingDate | date:'medium' }}. </div> - <div class="text-center" ng-if="question.closingDate && currentUser.role == 'SUPERVISOR' && editMode == false"> + <div ng-include="src='views/questions/closeQuestion.html'" + ng-if="currentUser.role == 'SUPERVISOR' && closeSession"> + </div> + + <div class="text-center" ng-if="question.closingDate && currentUser.role == 'SUPERVISOR' && editSession == false"> <a class="btn btn-action btn-success" ng-click="reopenQuestion()"> <span class="fa fa-check-square-o" aria-hidden="true"></span>Reopen </a> </div> - <div class="text-center" ng-if="!question.closingDate && currentUser.role == 'SUPERVISOR' && editMode == false"> - <a class="btn btn-action btn-success" ng-click="closeQuestion()"> + <div class="text-center" ng-if="!question.closingDate && currentUser.role == 'SUPERVISOR' && editSession == false && !closeSession"> + <a class="btn btn-action btn-success" ng-click="openCloseQuestionSession()"> <span class="fa fa-check-square-o" aria-hidden="true"></span>Close </a> - @@ -50,7 +56,7 @@ </a> </div> - <div class="text-center" ng-if="!question.closingDate && isCurrentParticipant && editMode == false && question.newRelatedDocuments.length > 0"> + <div class="text-center" ng-if="!question.closingDate && isCurrentParticipant && editSession == false && question.newRelatedDocuments.length > 0"> <a class="btn btn-action btn-success" ng-click="validateNewDocuments()"> <span class="fa fa-check-square-o" aria-hidden="true"></span>Validate new documents </a> diff --git a/coselmar-ui/src/main/webapp/views/questions/viewRestrictedQuestion.html b/coselmar-ui/src/main/webapp/views/questions/viewRestrictedQuestion.html index f48f801..adf827e 100644 --- a/coselmar-ui/src/main/webapp/views/questions/viewRestrictedQuestion.html +++ b/coselmar-ui/src/main/webapp/views/questions/viewRestrictedQuestion.html @@ -3,8 +3,6 @@ Cette question n'est pas disponible à la consultation. - </div> - <!-- TODO ymartel 20141208 : manage parents and children <div class="form-group col-md-12"> <div class="col-md-6">TODO Parents</div> diff --git a/coselmar-ui/src/main/webapp/views/questions/viewquestion.html b/coselmar-ui/src/main/webapp/views/questions/viewquestion.html index 69e088c..94adbc6 100644 --- a/coselmar-ui/src/main/webapp/views/questions/viewquestion.html +++ b/coselmar-ui/src/main/webapp/views/questions/viewquestion.html @@ -141,6 +141,43 @@ </div> + <div class="form-group col-md-12" + ng-if="question.closingDate && question.conclusion"> + <div class="col-md-12" > + <dl> + <dt>Conclusion</dt> + <dd>{{question.conclusion}}</dd> + </dl> + </div> + </div> + + <div class="form-group col-md-12" + ng-if="question.closingDate && question.closingDocuments + && question.closingDocuments.length > 0"> + + <dl> + <dt>Conclusion Documents</dt> + + <dd> + <table class="table table-bordered table-condensed"> + <tr> + <th>Name</th> + <th>Owner</th> + <th>Keywords</th> + <th>Deposit Date</th> + </tr> + <tr ng-repeat="document in question.closingDocuments"> + <td><a href="#/documents/{{document.id}}" target="_blank">{{document.name}}</a></td> + <td>{{document.ownerName}}</td> + <td><span ng-repeat="keyword in document.keywords">{{keyword}}, </span></td> + <td>{{document.depositDate | date:'mediumDate'}}</td> + </tr> + </table> + </dd> + </dl> + + </div> + <!-- TODO ymartel 20141208 : manage parents and children <div class="form-group col-md-12"> <div class="col-md-6">TODO Parents</div> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.