branch develop updated (242180a -> c1bb341)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git from 242180a Fix du service JS d'admin new 901212e refs-40 #7867 ajout d'une liste de liens dans les questions, parties service new f4d6b41 refs-40 #7867 revue pour avoir des objets {url, name} pour les liens plutot que juste des urls en String new 408c5cd fixes #7867 add links management in project page new c1bb341 Merge branch 'feature/7867-list-links-in-project' into develop The 4 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit c1bb341d83e425ea570dd38f20ca1c638e0e28de Merge: 242180a 408c5cd Author: Yannick Martel <martel@©odelutin.com> Date: Thu Jan 7 16:49:30 2016 +0100 Merge branch 'feature/7867-list-links-in-project' into develop commit 408c5cd151ff1198dd2987bdcf8538d9377f51fe Author: Yannick Martel <martel@©odelutin.com> Date: Thu Jan 7 16:49:23 2016 +0100 fixes #7867 add links management in project page commit f4d6b4112f25986a0a89bcc75c3a3d6a026964e7 Author: Yannick Martel <martel@©odelutin.com> Date: Thu Jan 7 10:47:13 2016 +0100 refs-40 #7867 revue pour avoir des objets {url, name} pour les liens plutot que juste des urls en String commit 901212ed2f45c9b8e52aad41d6300d8ba3a20c6c Author: Yannick Martel <martel@©odelutin.com> Date: Wed Jan 6 16:10:04 2016 +0100 refs-40 #7867 ajout d'une liste de liens dans les questions, parties service Summary of changes: coselmar-persistence/pom.xml | 5 ++ .../V1_2_0_1__7867_add_list_links_in_projects.sql | 34 +++++++++ .../src/main/xmi/coselmar-model.zargo | Bin 10470 -> 10955 bytes .../java/fr/ifremer/coselmar/beans/LinkBean.java | 39 +++++++++++ .../fr/ifremer/coselmar/beans/QuestionBean.java | 17 +++++ .../coselmar/converter/BeanEntityConverter.java | 26 +++++++ .../services/CoselmarRestApplicationListener.java | 4 +- .../coselmar/services/v1/QuestionsWebService.java | 55 +++++++++++++++ coselmar-ui/src/main/webapp/i18n/en.js | 10 +++ coselmar-ui/src/main/webapp/i18n/fr.js | 10 +++ .../src/main/webapp/js/coselmar-controllers.js | 69 +++++++++++++++++- .../src/main/webapp/views/links/modalLinkEdit.html | 78 +++++++++++++++++++++ .../main/webapp/views/questions/editquestion.html | 42 ++++++++++- .../main/webapp/views/questions/viewquestion.html | 16 +++++ pom.xml | 5 ++ 15 files changed, 406 insertions(+), 4 deletions(-) create mode 100644 coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql create mode 100644 coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/LinkBean.java create mode 100644 coselmar-ui/src/main/webapp/views/links/modalLinkEdit.html -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 901212ed2f45c9b8e52aad41d6300d8ba3a20c6c Author: Yannick Martel <martel@©odelutin.com> Date: Wed Jan 6 16:10:04 2016 +0100 refs-40 #7867 ajout d'une liste de liens dans les questions, parties service --- coselmar-persistence/pom.xml | 5 ++++ .../V1_2_0_1__7867_add_list_links_in_projects.sql | 26 +++++++++++++++++++++ .../src/main/xmi/coselmar-model.zargo | Bin 10470 -> 10461 bytes .../fr/ifremer/coselmar/beans/QuestionBean.java | 10 ++++++++ .../coselmar/converter/BeanEntityConverter.java | 17 ++++++++++++++ pom.xml | 5 ++++ 6 files changed, 63 insertions(+) diff --git a/coselmar-persistence/pom.xml b/coselmar-persistence/pom.xml index fd7e59a..82fa6eb 100644 --- a/coselmar-persistence/pom.xml +++ b/coselmar-persistence/pom.xml @@ -77,6 +77,11 @@ </dependency> <dependency> + <groupId>org.nuiton.topia</groupId> + <artifactId>topia-service-flyway</artifactId> + </dependency> + + <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> diff --git a/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql b/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql new file mode 100644 index 0000000..272840e --- /dev/null +++ b/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql @@ -0,0 +1,26 @@ +--- +-- #%L +-- Coselmar :: Persistence +-- %% +-- Copyright (C) 2014 - 2016 Ifremer, Code Lutin +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as +-- published by the Free Software Foundation, either version 3 of the +-- License, or (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public +-- License along with this program. If not, see +-- <http://www.gnu.org/licenses/gpl-3.0.html>. +-- #L% +--- + +CREATE TABLE question_links( + OWNER VARCHAR(255) NOT NULL REFERENCES QUESTION(TOPIAID), + LINKS VARCHAR(255) +); \ 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 5b57c85..2f02026 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 98d84b6..368ca55 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 @@ -82,6 +82,8 @@ public class QuestionBean implements Serializable { protected Set<DocumentBean> closingDocuments; + protected Set<String> links; + public String getId() { return id; @@ -306,4 +308,12 @@ public class QuestionBean implements Serializable { } this.closingDocuments.add(closingDocument); } + + public Set<String> getLinks() { + return links; + } + + public void setLinks(Set<String> links) { + this.links = links; + } } //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 e7ca0b2..ce70bca 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 @@ -223,6 +223,12 @@ public class BeanEntityConverter { } result.setRestricted(question.isUnavailable()); + + Collection<String> links = question.getLinks(); + if (links != null && !links.isEmpty()) { + result.setLinks(Sets.newHashSet(links)); + } + return result; } @@ -267,6 +273,12 @@ public class BeanEntityConverter { } result.setRestricted(question.isUnavailable()); + + Collection<String> links = question.getLinks(); + if (links != null && !links.isEmpty()) { + result.setLinks(Sets.newHashSet(links)); + } + return result; } @@ -377,6 +389,11 @@ public class BeanEntityConverter { question.setUnavailable(BooleanUtils.toBoolean(questionBean.getIsRestricted())); + Set<String> links = questionBean.getLinks(); + if (links != null && !links.isEmpty()) { + question.setLinks(Sets.newHashSet(links)); + } + return question; } diff --git a/pom.xml b/pom.xml index 3b8d330..8e90dc5 100644 --- a/pom.xml +++ b/pom.xml @@ -217,6 +217,11 @@ <version>${topiaVersion}</version> </dependency> <dependency> + <groupId>org.nuiton.topia</groupId> + <artifactId>topia-service-flyway</artifactId> + <version>${topiaVersion}</version> + </dependency> + <dependency> <groupId>org.nuiton</groupId> <artifactId>nuiton-utils</artifactId> <version>${nuitonUtilsVersion}</version> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 f4d6b4112f25986a0a89bcc75c3a3d6a026964e7 Author: Yannick Martel <martel@©odelutin.com> Date: Thu Jan 7 10:47:13 2016 +0100 refs-40 #7867 revue pour avoir des objets {url, name} pour les liens plutot que juste des urls en String --- .../V1_2_0_1__7867_add_list_links_in_projects.sql | 14 ++++++-- .../src/main/xmi/coselmar-model.zargo | Bin 10461 -> 10967 bytes .../java/fr/ifremer/coselmar/beans/LinkBean.java | 39 +++++++++++++++++++++ .../fr/ifremer/coselmar/beans/QuestionBean.java | 13 +++++-- .../coselmar/converter/BeanEntityConverter.java | 27 +++++++++----- .../coselmar/services/v1/QuestionsWebService.java | 37 +++++++++++++++++++ coselmar-ui/src/main/webapp/i18n/en.js | 1 + coselmar-ui/src/main/webapp/i18n/fr.js | 1 + 8 files changed, 117 insertions(+), 15 deletions(-) diff --git a/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql b/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql index 272840e..e4c4b7c 100644 --- a/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql +++ b/coselmar-persistence/src/main/resources/db/migration/V1_2_0_1__7867_add_list_links_in_projects.sql @@ -20,7 +20,15 @@ -- #L% --- -CREATE TABLE question_links( - OWNER VARCHAR(255) NOT NULL REFERENCES QUESTION(TOPIAID), - LINKS VARCHAR(255) +CREATE TABLE link ( + topiaId character varying(255) PRIMARY KEY, + topiaVersion bigint NOT NULL, + topiaCreateDate timestamp without time zone NOT NULL, + url VARCHAR(255), + name VARCHAR(255) +); + +CREATE TABLE links_question( + question VARCHAR(255) NOT NULL REFERENCES QUESTION(TOPIAID), + links VARCHAR(255) NOT NULL REFERENCES LINK(TOPIAID) ); \ 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 2f02026..38acbde 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/LinkBean.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/LinkBean.java new file mode 100644 index 0000000..a6075e7 --- /dev/null +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/LinkBean.java @@ -0,0 +1,39 @@ +package fr.ifremer.coselmar.beans; + +import java.io.Serializable; + +/** + * @author ymartel (martel@codelutin.com) + */ +public class LinkBean implements Serializable { + + protected String id; + + protected String name; + + protected String url; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} 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 368ca55..037d51b 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 @@ -82,7 +82,7 @@ public class QuestionBean implements Serializable { protected Set<DocumentBean> closingDocuments; - protected Set<String> links; + protected Set<LinkBean> links; public String getId() { @@ -309,11 +309,18 @@ public class QuestionBean implements Serializable { this.closingDocuments.add(closingDocument); } - public Set<String> getLinks() { + public Set<LinkBean> getLinks() { return links; } - public void setLinks(Set<String> links) { + public void setLinks(Set<LinkBean> links) { this.links = links; } + + public void addLink(LinkBean linkBean) { + if (this.links == null) { + this.links = new HashSet<>(); + } + this.links.add(linkBean); + } } //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 ce70bca..0f31eaa 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 @@ -33,6 +33,7 @@ import java.util.Set; import com.google.common.collect.Sets; import com.google.common.primitives.Booleans; import fr.ifremer.coselmar.beans.DocumentBean; +import fr.ifremer.coselmar.beans.LinkBean; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.UserBean; import fr.ifremer.coselmar.persistence.entity.CoselmarUser; @@ -41,6 +42,7 @@ import fr.ifremer.coselmar.persistence.entity.CoselmarUserImpl; import fr.ifremer.coselmar.persistence.entity.CoselmarUserRole; import fr.ifremer.coselmar.persistence.entity.Document; import fr.ifremer.coselmar.persistence.entity.DocumentImpl; +import fr.ifremer.coselmar.persistence.entity.Link; import fr.ifremer.coselmar.persistence.entity.Privacy; import fr.ifremer.coselmar.persistence.entity.Question; import fr.ifremer.coselmar.persistence.entity.QuestionImpl; @@ -224,9 +226,15 @@ public class BeanEntityConverter { result.setRestricted(question.isUnavailable()); - Collection<String> links = question.getLinks(); + Collection<Link> links = question.getLinks(); if (links != null && !links.isEmpty()) { - result.setLinks(Sets.newHashSet(links)); + for (Link link : links) { + LinkBean linkBean = new LinkBean(); + linkBean.setId(idFactory.getRandomPart(link.getTopiaId())); + linkBean.setName(link.getName()); + linkBean.setUrl(link.getUrl()); + result.addLink(linkBean); + } } return result; @@ -274,9 +282,15 @@ public class BeanEntityConverter { result.setRestricted(question.isUnavailable()); - Collection<String> links = question.getLinks(); + Collection<Link> links = question.getLinks(); if (links != null && !links.isEmpty()) { - result.setLinks(Sets.newHashSet(links)); + for (Link link : links) { + LinkBean linkBean = new LinkBean(); + linkBean.setId(idFactory.getRandomPart(link.getTopiaId())); + linkBean.setName(link.getName()); + linkBean.setUrl(link.getUrl()); + result.addLink(linkBean); + } } return result; @@ -389,11 +403,6 @@ public class BeanEntityConverter { question.setUnavailable(BooleanUtils.toBoolean(questionBean.getIsRestricted())); - Set<String> links = questionBean.getLinks(); - if (links != null && !links.isEmpty()) { - question.setLinks(Sets.newHashSet(links)); - } - return question; } 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 d264076..8305152 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 @@ -37,6 +37,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import fr.ifremer.coselmar.beans.DocumentBean; +import fr.ifremer.coselmar.beans.LinkBean; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.QuestionExportModel; import fr.ifremer.coselmar.beans.QuestionSearchBean; @@ -49,6 +50,8 @@ import fr.ifremer.coselmar.persistence.entity.CoselmarUser; import fr.ifremer.coselmar.persistence.entity.CoselmarUserGroup; import fr.ifremer.coselmar.persistence.entity.CoselmarUserRole; import fr.ifremer.coselmar.persistence.entity.Document; +import fr.ifremer.coselmar.persistence.entity.Link; +import fr.ifremer.coselmar.persistence.entity.LinkImpl; import fr.ifremer.coselmar.persistence.entity.Privacy; import fr.ifremer.coselmar.persistence.entity.Question; import fr.ifremer.coselmar.persistence.entity.Status; @@ -217,6 +220,23 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { questionEntity.addAllRelatedDocuments(documents); } + // Links + Set<LinkBean> links = question.getLinks(); + if (links != null && !links.isEmpty()) { + for (LinkBean link : links) { + Link linkEntity = null; + String linkId = link.getId(); + if (StringUtils.isNotBlank(linkId)) { + linkEntity = getPersistenceContext().getLinkDao().forTopiaIdEquals(getFullIdFromShort(Link.class, linkId)).findFirstOrNull(); + } + if (linkEntity == null) { + linkEntity = new LinkImpl(); + } + linkEntity.setName(link.getName()); + linkEntity.setUrl(link.getUrl()); + } + } + commit(); QuestionBean result = BeanEntityConverter.toBean(getPersistenceContext().getTopiaIdFactory(), questionEntity); @@ -759,6 +779,23 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { questionEntity.addAllClosingDocuments(closingDocuments); } + // Links + Set<LinkBean> links = question.getLinks(); + if (links != null && !links.isEmpty()) { + for (LinkBean link : links) { + Link linkEntity = null; + String linkId = link.getId(); + if (StringUtils.isNotBlank(linkId)) { + linkEntity = getPersistenceContext().getLinkDao().forTopiaIdEquals(getFullIdFromShort(Link.class, linkId)).findFirstOrNull(); + } + if (linkEntity == null) { + linkEntity = new LinkImpl(); + } + linkEntity.setName(link.getName()); + linkEntity.setUrl(link.getUrl()); + } + } + commit(); QuestionBean result = BeanEntityConverter.toBean(getPersistenceContext().getTopiaIdFactory(), questionEntity); diff --git a/coselmar-ui/src/main/webapp/i18n/en.js b/coselmar-ui/src/main/webapp/i18n/en.js index cde94dd..e94e64e 100644 --- a/coselmar-ui/src/main/webapp/i18n/en.js +++ b/coselmar-ui/src/main/webapp/i18n/en.js @@ -158,6 +158,7 @@ var translateEN = { "question.metadata.parentsPhrase" : "Produced or inspired by", "question.metadata.childrenPhrase" : "Has produced or inspired", "question.metadata.participants" : "Participants", +"question.metadata.links" : "To get more", "question.metadata.submitBefore" : "Submit before", "question.metadata.submitAfter" : "Submit after", diff --git a/coselmar-ui/src/main/webapp/i18n/fr.js b/coselmar-ui/src/main/webapp/i18n/fr.js index 8a344c6..d242934 100644 --- a/coselmar-ui/src/main/webapp/i18n/fr.js +++ b/coselmar-ui/src/main/webapp/i18n/fr.js @@ -158,6 +158,7 @@ var translateFR = { "question.metadata.parentsPhrase" : "Provoqué ou inspiré par", "question.metadata.childrenPhrase" : "A provoqué ou inspiré", "question.metadata.participants" : "Participants", +"question.metadata.links" : "Pour aller plus loin", "question.metadata.submitBefore" : "Soumis avant le", "question.metadata.submitAfter" : "Soumis après le", -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 408c5cd151ff1198dd2987bdcf8538d9377f51fe Author: Yannick Martel <martel@©odelutin.com> Date: Thu Jan 7 16:49:23 2016 +0100 fixes #7867 add links management in project page --- .../src/main/xmi/coselmar-model.zargo | Bin 10967 -> 10955 bytes .../services/CoselmarRestApplicationListener.java | 4 +- .../coselmar/services/v1/QuestionsWebService.java | 22 +++++- coselmar-ui/src/main/webapp/i18n/en.js | 11 ++- coselmar-ui/src/main/webapp/i18n/fr.js | 11 ++- .../src/main/webapp/js/coselmar-controllers.js | 69 +++++++++++++++++- .../src/main/webapp/views/links/modalLinkEdit.html | 78 +++++++++++++++++++++ .../main/webapp/views/questions/editquestion.html | 42 ++++++++++- .../main/webapp/views/questions/viewquestion.html | 16 +++++ 9 files changed, 245 insertions(+), 8 deletions(-) diff --git a/coselmar-persistence/src/main/xmi/coselmar-model.zargo b/coselmar-persistence/src/main/xmi/coselmar-model.zargo index 38acbde..1f35409 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/services/CoselmarRestApplicationListener.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java index d0df76f..7c02356 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java @@ -30,6 +30,7 @@ import java.util.Set; import com.google.common.collect.Sets; import fr.ifremer.coselmar.beans.DocumentBean; import fr.ifremer.coselmar.beans.DocumentSearchBean; +import fr.ifremer.coselmar.beans.LinkBean; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.QuestionSearchBean; import fr.ifremer.coselmar.beans.QuestionSearchExample; @@ -56,7 +57,8 @@ public class CoselmarRestApplicationListener implements WebMotionServerListener UserSearchBean.class, QuestionSearchBean.class, DocumentSearchBean.class, - QuestionSearchExample.class + QuestionSearchExample.class, + LinkBean.class ); @Override 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 8305152..b390f49 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 @@ -227,13 +227,21 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { Link linkEntity = null; String linkId = link.getId(); if (StringUtils.isNotBlank(linkId)) { - linkEntity = getPersistenceContext().getLinkDao().forTopiaIdEquals(getFullIdFromShort(Link.class, linkId)).findFirstOrNull(); + linkEntity = getPersistenceContext().getLinkDao().forTopiaIdEquals(getFullIdFromShort(Link.class, linkId)).findUniqueOrNull(); } if (linkEntity == null) { linkEntity = new LinkImpl(); } linkEntity.setName(link.getName()); linkEntity.setUrl(link.getUrl()); + + if (StringUtils.isNotBlank(linkEntity.getTopiaId())) { + getPersistenceContext().getLinkDao().update(linkEntity); + } else { + getPersistenceContext().getLinkDao().create(linkEntity); + } + + questionEntity.addLinks(linkEntity); } } @@ -781,18 +789,28 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { // Links Set<LinkBean> links = question.getLinks(); + questionEntity.clearLinks(); if (links != null && !links.isEmpty()) { for (LinkBean link : links) { Link linkEntity = null; String linkId = link.getId(); if (StringUtils.isNotBlank(linkId)) { - linkEntity = getPersistenceContext().getLinkDao().forTopiaIdEquals(getFullIdFromShort(Link.class, linkId)).findFirstOrNull(); + String linkFullId = getFullIdFromShort(Link.class, linkId); + linkEntity = getPersistenceContext().getLinkDao().forTopiaIdEquals(linkFullId).findUniqueOrNull(); } if (linkEntity == null) { linkEntity = new LinkImpl(); } linkEntity.setName(link.getName()); linkEntity.setUrl(link.getUrl()); + + if (StringUtils.isNotBlank(linkEntity.getTopiaId())) { + getPersistenceContext().getLinkDao().update(linkEntity); + } else { + getPersistenceContext().getLinkDao().create(linkEntity); + } + + questionEntity.addLinks(linkEntity); } } diff --git a/coselmar-ui/src/main/webapp/i18n/en.js b/coselmar-ui/src/main/webapp/i18n/en.js index e94e64e..9a6126a 100644 --- a/coselmar-ui/src/main/webapp/i18n/en.js +++ b/coselmar-ui/src/main/webapp/i18n/en.js @@ -158,7 +158,8 @@ var translateEN = { "question.metadata.parentsPhrase" : "Produced or inspired by", "question.metadata.childrenPhrase" : "Has produced or inspired", "question.metadata.participants" : "Participants", -"question.metadata.links" : "To get more", +"question.metadata.links" : "Associated Links", +"question.metadata.links.display" : "Go further", "question.metadata.submitBefore" : "Submit before", "question.metadata.submitAfter" : "Submit after", @@ -201,6 +202,14 @@ var translateEN = { "question.message.info.themes" : "Themes enable to classify project and make search easier. Each input theme should be validated with button \"Add\".", "question.message.info.contributors" : "Contributors are experts who have been experts on the project before.", +// Links + +"link.metadata.url" : "URL", +"link.metadata.name" : "Display name", + +"link.create.title" : "Add a link", +"link.update.title" : "Update link", + //Users part "user.list.title" : "All users", diff --git a/coselmar-ui/src/main/webapp/i18n/fr.js b/coselmar-ui/src/main/webapp/i18n/fr.js index d242934..c88beb9 100644 --- a/coselmar-ui/src/main/webapp/i18n/fr.js +++ b/coselmar-ui/src/main/webapp/i18n/fr.js @@ -158,7 +158,8 @@ var translateFR = { "question.metadata.parentsPhrase" : "Provoqué ou inspiré par", "question.metadata.childrenPhrase" : "A provoqué ou inspiré", "question.metadata.participants" : "Participants", -"question.metadata.links" : "Pour aller plus loin", +"question.metadata.links" : "Liens associés", +"question.metadata.links.display" : "Pour aller plus loin", "question.metadata.submitBefore" : "Soumis avant le", "question.metadata.submitAfter" : "Soumis après le", @@ -201,6 +202,14 @@ var translateFR = { "question.message.info.themes" : "Les thèmes permettent de classifier le projet et faciliter sa recherche. Chaque thème saisi doit être validé avec le bouton \"Ajouter\".", "question.message.info.contributors" : "Les contributeurs sont des experts ayant été affectés au projet et qui ne le sont plus.", +// Links + +"link.metadata.url" : "Adresse web", +"link.metadata.name" : "Nom", + +"link.create.title" : "Ajouter un lien", +"link.update.title" : "Mettre à jour le lien", + //Users part "user.list.title" : "Liste des utilisateurs", diff --git a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js index 5ef7151..16fb2e7 100644 --- a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js +++ b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js @@ -1023,7 +1023,8 @@ coselmarControllers.controller("QuestionCtrl", ['$scope', '$route', '$routeParam $scope.question = {'privacy' : 'PUBLIC', 'themes' : [], 'participants' : [], 'externalExperts' : [], - 'clients' : [], 'relatedDocuments': [], 'newRelatedDocuments' : [] }; + 'clients' : [], 'relatedDocuments': [], 'newRelatedDocuments' : [], + 'links' : []}; $scope.existing = {'types' : [], 'themes' : []}; // Preload exiting types and themes @@ -1154,6 +1155,10 @@ coselmarControllers.controller("QuestionCtrl", ['$scope', '$route', '$routeParam bindUsers($scope.question.supervisors, $scope.supervisorsIndex); } + if(!question.links) { + $scope.question.links = []; + } + }, errorService.defaultFailOnCall); }; @@ -1409,6 +1414,46 @@ coselmarControllers.controller("QuestionCtrl", ['$scope', '$route', '$routeParam return isClient; }; + $scope.modalEditLink = function (link) { + + var modalInstance = $uibModal.open({ + templateUrl: 'views/links/modalLinkEdit.html', + controller: 'ModalEditLinkCtrl', + size: 'lg', + resolve : { + currentLink : function() { + if (angular.isDefined(link)) { + return link; + } else { + return { name : "", url: ""}; + } + } + } + }); + + modalInstance.result.then(function (link) { + console.log("result is"); + console.log(link); + var already = false; + for (var i = 0; i < $scope.question.links.length; i++) { + if ($scope.question.links[i].id == link.id) { + already = true; + $scope.question.links[i] = link; + } + } + if (!already) { + $scope.question.links.push(link); + } + }); + }; + + $scope.removeLink = function(link) { + var position = $scope.question.links.indexOf(link); + if (link && position != -1) { + $scope.question.links.splice(link, 1); + } + }; + }]); coselmarControllers.controller('ModalSearchDocumentsCtrl', function ($scope, $uibModalInstance, documentService, errorService) { @@ -1531,6 +1576,28 @@ coselmarControllers.controller('ModalCreateDocumentsCtrl', function ($scope, $ui }); +coselmarControllers.controller('ModalEditLinkCtrl', function ($scope, $uibModalInstance, currentLink) { + + $scope.link = currentLink; + console.log(currentLink); + $scope.invalidUrl = false; + + $scope.create = function () { + + if ($scope.link.url === "") { + $scope.invalidUrl = true; + } else { + $uibModalInstance.close($scope.link); + } + + }; + + $scope.cancel = function () { + $uibModalInstance.dismiss('cancel'); + }; + +}); + ///////////////////////////////////////////////// /////////// Referential Part ////////////////// diff --git a/coselmar-ui/src/main/webapp/views/links/modalLinkEdit.html b/coselmar-ui/src/main/webapp/views/links/modalLinkEdit.html new file mode 100644 index 0000000..8760f8f --- /dev/null +++ b/coselmar-ui/src/main/webapp/views/links/modalLinkEdit.html @@ -0,0 +1,78 @@ +<!-- + #%L + Coselmar :: UI + $Id:$ + $HeadURL:$ + %% + Copyright (C) 2014 Ifremer, Code Lutin + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> +<div xmlns="http://www.w3.org/1999/html"> + <div class="modal-title"> + <h2 class="paddingLeft20" ng-if="link.id">{{ 'link.update.title' | translate }}</h2> + <h2 class="paddingLeft20" ng-if="!link.id">{{ 'link.create.title' | translate }}</h2> + <span translate="common.message.mandatoryFieldsInfo" class="marginLeft20"></span> + </div> + + <form class="form-horizontal" name="linkForm" role="form" ng-submit="create()"> + + <div class="modal-body"> + + <div class="form-group row"> + + <div class="" + ng-class="{'has-error' : linkForm.linkUrl.$invalid && !linkForm.linkUrl.$pristine}"> + <label class="col-md-4 control-label" for="linkUrl"> + {{ 'link.metadata.url' | translate }} * + </label> + + <div class="col-md-8"> + <input type="text" class="form-control" id="linkUrl" + placeholder="Link Name" + ng-model="link.url" required /> + + <p ng-show="linkForm.linkUrl.$invalid && !linkForm.linkUrl.$pristine" + class="help-block">{{ 'link.message.requiredUrl' | translate }}</p> + </div> + </div> + </div> + + <div class="form-group row"> + <div class=""> + <label class="col-md-4 control-label" for="name"> + {{ 'link.metadata.name' | translate }} + </label> + + <div class="col-md-8"> + <input type="text" class="form-control" id="name" + placeholder="Name" + ng-model="link.name"/> + </div> + </div> + + </div> + </div> + + <div class="modal-footer"> + <button class="btn btn-action btn-disable" ng-click="cancel()">{{ 'common.button.cancel' | translate }}</button> + <input type="submit" value="{{ 'common.button.validate' | translate}}" class="btn btn-action btn-success float-right" + ng-disabled="linkForm.$invalid" /> + </div> + + </form> + +</div> \ No newline at end of file diff --git a/coselmar-ui/src/main/webapp/views/questions/editquestion.html b/coselmar-ui/src/main/webapp/views/questions/editquestion.html index 1621f49..a035b03 100644 --- a/coselmar-ui/src/main/webapp/views/questions/editquestion.html +++ b/coselmar-ui/src/main/webapp/views/questions/editquestion.html @@ -256,7 +256,7 @@ </ui-select-match> <ui-select-choices - repeat="expert in users.participants track by expert.id | propsFilter: {name: $select.search, firstName: $select.search, organization: $select.search}" + repeat="expert in ( users.participants | propsFilter: {name: $select.search, firstName: $select.search, organization: $select.search} ) track by expert.id " refresh="refreshExperts($select.search)" refresh-delay="500"> {{expert.firstName}} {{expert.name}} ({{expert.organization}}) @@ -329,7 +329,7 @@ </ui-select-match> <ui-select-choices - repeat="expert in users.supervisors track by expert.id | propsFilter: {name: $select.search, firstName: $select.search, organization: $select.search}" + repeat="expert in ( users.supervisors | propsFilter: {name: $select.search, firstName: $select.search, organization: $select.search} ) track by expert.id" refresh="refreshSupervisors($select.search)" refresh-delay="500"> {{expert.firstName}} {{expert.name}} ({{expert.organization}}) @@ -344,3 +344,41 @@ <!-- End Line with External Experts and Supervisor --> + <!-- Line with Related Links --> + + <div class="form-group" > + + + <label class="col-md-2 control-label">{{ 'question.metadata.links' | translate }}</label> + + <div class="col-md-10"> + <table class="table table-bordered table-condensed"> + <thead> + <tr> + <th>{{ 'link.metadata.name' | translate }}</th> + <th>{{ 'link.metadata.url' | translate }}</th> + <th> + <a class="btn fa fa-plus" title="Add new link" + ng-click="modalEditLink()"/> + </th> + </tr> + </thead> + <tbody> + <tr ng-repeat="link in question.links"> + <td>{{link.name}}</a></td> + <td>{{link.url}}</td> + <td> + <a class="btn fa fa-minus" title="Remove link" + ng-click="removeLink(link)"/> + <a class="btn fa fa-pencil" title="Edit link" + ng-click="modalEditLink(link)"/> + </td> + </tr> + </tbody> + </table> + </div> + + </div> + + <!-- End Line with Related Links --> + diff --git a/coselmar-ui/src/main/webapp/views/questions/viewquestion.html b/coselmar-ui/src/main/webapp/views/questions/viewquestion.html index d376fb0..5c2aaec 100644 --- a/coselmar-ui/src/main/webapp/views/questions/viewquestion.html +++ b/coselmar-ui/src/main/webapp/views/questions/viewquestion.html @@ -126,7 +126,23 @@ </table> </dd> </dl> + + <dl ng-if="question.links && question.links.length > 0"> + <dt>{{ 'question.metadata.links.display' | translate }}</dt> + <dd> + <ul> + <li ng-repeat="link in question.links"> + <a href="{{link.url}}" target="_blank"> + <span ng-if="link.name && link.name.length > 0">{{link.name}}</span> + <span ng-if="!link.name || link.name.length === ''">{{link.url}}</span> + </a> + </li> + </ul> + </dd> + </dl> + </div> + <div class="form-group col-md-4 aside"> <div> <dl> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 c1bb341d83e425ea570dd38f20ca1c638e0e28de Merge: 242180a 408c5cd Author: Yannick Martel <martel@©odelutin.com> Date: Thu Jan 7 16:49:30 2016 +0100 Merge branch 'feature/7867-list-links-in-project' into develop coselmar-persistence/pom.xml | 5 ++ .../V1_2_0_1__7867_add_list_links_in_projects.sql | 34 +++++++++ .../src/main/xmi/coselmar-model.zargo | Bin 10470 -> 10955 bytes .../java/fr/ifremer/coselmar/beans/LinkBean.java | 39 +++++++++++ .../fr/ifremer/coselmar/beans/QuestionBean.java | 17 +++++ .../coselmar/converter/BeanEntityConverter.java | 26 +++++++ .../services/CoselmarRestApplicationListener.java | 4 +- .../coselmar/services/v1/QuestionsWebService.java | 55 +++++++++++++++ coselmar-ui/src/main/webapp/i18n/en.js | 10 +++ coselmar-ui/src/main/webapp/i18n/fr.js | 10 +++ .../src/main/webapp/js/coselmar-controllers.js | 69 +++++++++++++++++- .../src/main/webapp/views/links/modalLinkEdit.html | 78 +++++++++++++++++++++ .../main/webapp/views/questions/editquestion.html | 42 ++++++++++- .../main/webapp/views/questions/viewquestion.html | 16 +++++ pom.xml | 5 ++ 15 files changed, 406 insertions(+), 4 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm