branch develop updated (a51dafd -> ad502bb)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git from a51dafd Mise en page du login et de la creation de compte new ad502bb import et export des participants d'un sondage restreint vers une liste de votants The 1 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 ad502bb07ffb45f36bacc4edfab1eb5cb9d8334b Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Mon May 22 14:52:05 2017 +0200 import et export des participants d'un sondage restreint vers une liste de votants Summary of changes: .../entity/VoterListMemberTopiaDao.java | 24 +++++ pollen-persistence/src/main/xmi/pollen.zargo | Bin 24898 -> 24892 bytes .../chorem/pollen/rest/api/v1/FavoriteListApi.java | 7 ++ pollen-rest-api/src/main/resources/mapping | 1 + .../services/service/FavoriteListService.java | 66 ++++++++++++++ .../services/service/VoteCountingService.java | 20 ----- .../pollen/services/service/VoteService.java | 11 ++- pollen-ui-riot-js/package.json | 2 +- pollen-ui-riot-js/src/main/web/i18n.json | 14 ++- .../src/main/web/js/FavoriteListService.js | 4 + .../src/main/web/js/VoterListService.js | 72 ++++++++++++--- .../web/tag/favoriteList/FavoriteLists.tag.html | 3 +- .../src/main/web/tag/poll/Settings.tag.html | 3 +- .../src/main/web/tag/poll/Voters.tag.html | 15 +--- .../src/main/web/tag/popup/Modal.tag.html | 59 ++++++++++++ .../src/main/web/tag/voterList/VoterList.tag.html | 99 ++++++++++++++++++++- .../web/tag/voterList/VoterListMember.tag.html | 8 +- 17 files changed, 348 insertions(+), 60 deletions(-) create mode 100644 pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListMemberTopiaDao.java create mode 100644 pollen-ui-riot-js/src/main/web/tag/popup/Modal.tag.html -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit ad502bb07ffb45f36bacc4edfab1eb5cb9d8334b Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Mon May 22 14:52:05 2017 +0200 import et export des participants d'un sondage restreint vers une liste de votants --- .../entity/VoterListMemberTopiaDao.java | 24 +++++ pollen-persistence/src/main/xmi/pollen.zargo | Bin 24898 -> 24892 bytes .../chorem/pollen/rest/api/v1/FavoriteListApi.java | 7 ++ pollen-rest-api/src/main/resources/mapping | 1 + .../services/service/FavoriteListService.java | 66 ++++++++++++++ .../services/service/VoteCountingService.java | 20 ----- .../pollen/services/service/VoteService.java | 11 ++- pollen-ui-riot-js/package.json | 2 +- pollen-ui-riot-js/src/main/web/i18n.json | 14 ++- .../src/main/web/js/FavoriteListService.js | 4 + .../src/main/web/js/VoterListService.js | 72 ++++++++++++--- .../web/tag/favoriteList/FavoriteLists.tag.html | 3 +- .../src/main/web/tag/poll/Settings.tag.html | 3 +- .../src/main/web/tag/poll/Voters.tag.html | 15 +--- .../src/main/web/tag/popup/Modal.tag.html | 59 ++++++++++++ .../src/main/web/tag/voterList/VoterList.tag.html | 99 ++++++++++++++++++++- .../web/tag/voterList/VoterListMember.tag.html | 8 +- 17 files changed, 348 insertions(+), 60 deletions(-) diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListMemberTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListMemberTopiaDao.java new file mode 100644 index 0000000..1925190 --- /dev/null +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListMemberTopiaDao.java @@ -0,0 +1,24 @@ +package org.chorem.pollen.persistence.entity; + + +public class VoterListMemberTopiaDao extends AbstractVoterListMemberTopiaDao<VoterListMember> { + + @Override + public void delete(VoterListMember entity) { + + // --- Delete vote --- // + VoteTopiaDao voteDao = topiaDaoSupplier + .getDao(Vote.class, VoteTopiaDao.class); + Vote vote = voteDao.forVoterListMemberContains(entity).findUniqueOrNull(); + if (vote != null) { + vote.removeVoterListMember(entity); + } + if (vote.isVoterListMemberEmpty()) { + voteDao.delete(vote); + } + + super.delete(entity); + + } + +} diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 77e9f98..cd77c0c 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java index b156b0b..f1b602b 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java @@ -24,6 +24,7 @@ package org.chorem.pollen.rest.api.v1; import org.chorem.pollen.persistence.entity.ChildFavoriteList; import org.chorem.pollen.persistence.entity.FavoriteList; import org.chorem.pollen.persistence.entity.FavoriteListMember; +import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.services.bean.ChildFavoriteListBean; import org.chorem.pollen.services.bean.FavoriteListBean; import org.chorem.pollen.services.bean.FavoriteListMemberBean; @@ -87,6 +88,12 @@ public class FavoriteListApi extends WebMotionController { } + public FavoriteListBean importFavoriteListMembersFromVoterList(FavoriteListService favoriteListService, PollenEntityId<VoterList> voterListId) throws FavoriteListImportException, InvalidFormException { + + return favoriteListService.importFavoriteListMembersFromVoterList(voterListId.getEntityId()); + + } + public PaginationResultBean<FavoriteListMemberBean> getMembers(FavoriteListService favoriteListService, PollenEntityId<FavoriteList> favoriteListId, PaginationParameterBean paginationParameter) { return favoriteListService.getFavoriteListMembers(favoriteListId.getEntityId(), paginationParameter); diff --git a/pollen-rest-api/src/main/resources/mapping b/pollen-rest-api/src/main/resources/mapping index 6fee0d6..14b9d81 100644 --- a/pollen-rest-api/src/main/resources/mapping +++ b/pollen-rest-api/src/main/resources/mapping @@ -84,6 +84,7 @@ GET /v1/favoriteLists FavoriteListApi. GET /v1/favoriteLists/{favoriteListId} FavoriteListApi.getFavoriteList POST /v1/favoriteLists/{favoriteListId}/importCsv FavoriteListApi.importFavoriteListMembersFromCsv POST /v1/favoriteLists/{favoriteListId}/importLdap FavoriteListApi.importFavoriteListMembersFromLdap +POST /v1/favoriteLists/importVoterList FavoriteListApi.importFavoriteListMembersFromVoterList POST /v1/favoriteLists FavoriteListApi.createFavoriteList PUT,POST /v1/favoriteLists/{favoriteListId} FavoriteListApi.editFavoriteList DELETE /v1/favoriteLists/{favoriteListId} FavoriteListApi.deleteFavoriteList diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java index 159b1aa..8812af9 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java @@ -30,6 +30,8 @@ import org.chorem.pollen.persistence.entity.FavoriteListMember; import org.chorem.pollen.persistence.entity.FavoriteListMemberTopiaDao; import org.chorem.pollen.persistence.entity.FavoriteListTopiaDao; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.VoterList; +import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.bean.ChildFavoriteListBean; import org.chorem.pollen.services.bean.FavoriteListBean; import org.chorem.pollen.services.bean.FavoriteListMemberBean; @@ -328,6 +330,7 @@ public class FavoriteListService extends PollenServiceSupport { // create a new favorite list toSave = favoriteListDao.create(); toSave.setPollenUser(user); + toSave.setOwner(getSecurityContext().getMainPrincipal()); } @@ -669,4 +672,67 @@ public class FavoriteListService extends PollenServiceSupport { return toSave; } + + public FavoriteListBean importFavoriteListMembersFromVoterList(String voterListId) throws InvalidFormException { + VoterList voterList = getVoterListDao().forTopiaIdEquals(voterListId).findUniqueOrNull(); + + checkIsConnected(); + checkNotNull(voterList); + + PollenUser user = getConnectedUser(); + + List<FavoriteList> existingFavoriteLists = getFavoriteLists0(user); + + ErrorMap errors = new ErrorMap(); + + ErrorMap errorMap = checkImportVoterList(voterList, existingFavoriteLists, errors); + errorMap.failIfNotEmpty(); + + FavoriteList favoriteList = importFavoriteListMembersFromVoterList(voterList, user); + + commit(); + return toBean(FavoriteListBean.class, favoriteList); + } + + protected FavoriteList importFavoriteListMembersFromVoterList(VoterList voterList, PollenUser user) { + FavoriteList toSave = getFavoriteListDao().create(); + + toSave.setName(voterList.getName()); + toSave.setPollenUser(user); + toSave.setOwner(getSecurityContext().getMainPrincipal()); + + for (VoterListMember voterListMember : getVoterListMemberDao().forVoterListEquals(voterList).findAll()) { + FavoriteListMember memberToSave = getFavoriteListMemberDao().create(); + memberToSave.setName(voterListMember.getMember().getName()); + memberToSave.setEmail(voterListMember.getMember().getEmail()); + memberToSave.setWeight(voterListMember.getWeight()); + memberToSave.setFavoriteList(toSave); + } + + for (VoterList childVoterList : getVoterListDao().forParentEquals(voterList).findAll()) { + FavoriteList subFavoriteList = importFavoriteListMembersFromVoterList(childVoterList, user); + ChildFavoriteList childFavoriteListToSave = getChildFavoriteListDao().create(); + childFavoriteListToSave.setChild(subFavoriteList); + childFavoriteListToSave.setParent(toSave); + childFavoriteListToSave.setWeight(childVoterList.getWeight()); + } + + getNotificationService().onFavoriteListAdded(user, toSave); + return toSave; + } + + + protected ErrorMap checkImportVoterList(VoterList voterList, List<FavoriteList> existingFavoriteLists, ErrorMap errors) { + String name = voterList.getName(); + boolean nameAlreadyUsed = existingFavoriteLists.stream().filter(fl -> fl.getName().equals(name)).findFirst().isPresent(); + + check(errors, FavoriteList.PROPERTY_NAME, !nameAlreadyUsed, l(getLocale(), "pollen.error.favoriteList.name.already.used") + " (" + name + ")"); + + List<VoterList> childrenVoterLists = getVoterListDao().forParentEquals(voterList).addEquals(VoterList.PROPERTY_POLL, voterList.getPoll()).findAll(); + for (VoterList childVoterList : childrenVoterLists) { + checkImportVoterList(childVoterList, existingFavoriteLists, errors); + } + + return errors; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java index 0023bfa..feac350 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java @@ -44,7 +44,6 @@ import org.chorem.pollen.votecounting.model.SimpleVoter; import org.chorem.pollen.votecounting.model.VoteCountingResult; import org.chorem.pollen.votecounting.model.VoteForChoice; import org.chorem.pollen.votecounting.model.Voter; -import org.chorem.pollen.votecounting.model.VoterBuilder; import java.util.List; import java.util.Map; @@ -236,25 +235,6 @@ public class VoteCountingService extends PollenServiceSupport { } - - protected void fillSimpleVoter(VoterBuilder builder, Vote vote) { - - builder.newVoter(vote.getVoter().getTopiaId(), vote.getWeight()); - - if (!vote.isVoteToChoiceEmpty()) { - - for (VoteToChoice voteToChoice : vote.getVoteToChoice()) { - - builder.addVoteForChoice( - voteToChoice.getChoice().getTopiaId(), - voteToChoice.getVoteValue()); - - } - - } - - } - protected VoteCounting getVoteCounting(Poll poll) { int id = poll.getVoteCountingType(); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java index 442f575..75ddd95 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java @@ -268,10 +268,13 @@ public class VoteService extends PollenServiceSupport { List<VoterListMember> voterListMembers = getVoterListMemberDao().forMemberEquals(principal) .addEquals(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_POLL, poll) .findAll(); - toSave.setVoterListMember(voterListMembers); - // FIXME bavencoff 17/05/2017 ne poids ne devrai plus etre enregistré dans le vote - //toSave.setWeight(voterListMember.getWeight()); - toSave.setVoter(principal); + if (!voterListMembers.isEmpty()) { + toSave.setVoterListMember(voterListMembers); + + // FIXME bavencoff 17/05/2017 ne poids ne devrai plus etre enregistré dans le vote + //toSave.setWeight(voterListMember.getWeight()); + toSave.setVoter(principal); + } } // -- author -- // diff --git a/pollen-ui-riot-js/package.json b/pollen-ui-riot-js/package.json index eccde60..6b71a62 100644 --- a/pollen-ui-riot-js/package.json +++ b/pollen-ui-riot-js/package.json @@ -49,7 +49,7 @@ "object.values": "^1.0.4", "qrcode-generator": "^1.2.0", "remarkable": "^1.7.1", - "riot": "3.3.2", + "riot": "^3.3.2", "riot-route": "^2.5.0" } } diff --git a/pollen-ui-riot-js/src/main/web/i18n.json b/pollen-ui-riot-js/src/main/web/i18n.json index 61c5ba6..777ab40 100644 --- a/pollen-ui-riot-js/src/main/web/i18n.json +++ b/pollen-ui-riot-js/src/main/web/i18n.json @@ -402,11 +402,16 @@ "voterList_weight": "Poids", "voterList_addMember": "Ajouter un participant", "voterList_addVoterList": "Ajouter une sous-liste", + "voterList_exportFavoriteList": "Exporter dans une nouvelle liste de votants", + "voterList_importFavoriteList": "Importer une liste de votants", + "voterList_importFavoriteList_none": "Aucune liste de votants enregistrées", "voterList_delete": "Supprimer la liste", "voterList_member_name": "Nom", "voterList_member_email": "Courriel", "voterList_member_weight": "Poids", - "voterList_member_delete": "Supprimer le participant" + "voterList_member_delete": "Supprimer le participant", + "modal_cancel": "Annuler", + "modal_ok": "Ok" }, "en": { "main_pollen_title": "Pollen - ", @@ -799,10 +804,15 @@ "voterList_weight": "Weight", "voterList_addMember": "Add member", "voterList_addVoterList": "Add sub-list", + "voterList_exportFavoriteList": "Export to new favorite list", + "voterList_importFavoriteList": "Import favorite list", + "voterList_importFavoriteList_none": "None favorite list saved", "voterList_delete": "delete list", "voterList_member_name": "Name", "voterList_member_email": "Email", "voterList_member_weight": "Weight", - "voterList_member_delete": "delete member" + "voterList_member_delete": "delete member", + "modal_cancel": "Annuler", + "modal_ok": "Ok" } } diff --git a/pollen-ui-riot-js/src/main/web/js/FavoriteListService.js b/pollen-ui-riot-js/src/main/web/js/FavoriteListService.js index 04877ec..752a2d4 100644 --- a/pollen-ui-riot-js/src/main/web/js/FavoriteListService.js +++ b/pollen-ui-riot-js/src/main/web/js/FavoriteListService.js @@ -91,6 +91,10 @@ class FavoriteListService extends FetchService { return this.doDelete("/v1/favoriteLists/" + favoriteListId + "/lists/" + childListId); } + importFromVoterList(voterListId) { + return this.form("/v1/favoriteLists/importVoterList", {voterListId: voterListId}); + } + } module.exports = singleton(FavoriteListService); diff --git a/pollen-ui-riot-js/src/main/web/js/VoterListService.js b/pollen-ui-riot-js/src/main/web/js/VoterListService.js index 3eb36cf..8367d41 100644 --- a/pollen-ui-riot-js/src/main/web/js/VoterListService.js +++ b/pollen-ui-riot-js/src/main/web/js/VoterListService.js @@ -1,6 +1,7 @@ let singleton = require("./Singleton"); let FetchService = require("./FetchService"); -let values = require('object.values'); +let values = require("object.values"); +let FavoriteListService = require("./FavoriteListService"); if (!Object.values) { values.shim(); } @@ -17,22 +18,26 @@ class VoterListService extends FetchService { this.voterListMembersToDelete = []; } - _newVoterList(parent) { + _newVoterList(parent, name, weight) { return { id: this.tempPrefix + this.tempId++, parentId: parent && parent.id, subLists: [], members: [], - weight: 1, - loadded: true + name: name, + weight: weight || 1, + loadded: true, + temp: true }; } - _newMember(voterList) { + _newMember(voterList, name, email, weight) { return { id: this.tempPrefix + this.tempId++, voterListId: voterList.id, - weight: 1 + name: name, + email: email, + weight: weight || 1 }; } @@ -78,8 +83,8 @@ class VoterListService extends FetchService { return voterListPromise; } - addVoterList(parent) { - let voterList = this._newVoterList(parent); + addVoterList(parent, name, weight) { + let voterList = this._newVoterList(parent, name, weight); parent.subLists.push(voterList); this.voterListsById[voterList.id] = voterList; return voterList; @@ -90,13 +95,30 @@ class VoterListService extends FetchService { let index = parent.subLists.indexOf(voterList); parent.subLists.splice(index, 1); + voterList.subLists.forEach(subList => { + this._deleteVoterList2(subList); + }); + + voterList.members.forEach(member => { + delete this.voterListMembersById[member.id]; + }); + + delete this.voterListsById[voterList.id]; + if (!voterList.id.startsWith(this.tempPrefix)) { this.voterListsToDelete.push(voterList); } } - addMember(parent) { - let member = this._newMember(parent); + _deleteVoterList2(voterList) { + voterList.subLists.forEach(subList => { + this._deleteVoterList2(subList); + }); + delete this.voterListsById[voterList.id]; + } + + addMember(parent, name, email, weight) { + let member = this._newMember(parent, name, email, weight); parent.members.push(member); this.voterListMembersById[member.id] = member; return member; @@ -106,6 +128,7 @@ class VoterListService extends FetchService { let voterList = this.voterListsById[member.voterListId]; let index = voterList.members.indexOf(member); voterList.members.splice(index, 1); + delete this.voterListMembersById[member.id]; if (!member.id.startsWith(this.tempPrefix)) { this.voterListMembersToDelete.push(member); @@ -151,6 +174,35 @@ class VoterListService extends FetchService { membersToDelete: this.voterListMembersToDelete }); } + + importFavoriteList(voterList, favoriteListId) { + let pagination = { + order: "name", + desc: false, + pageSize: -1, + pageNumber: 0 + }; + let importPromises = []; + importPromises.push(FavoriteListService.members(favoriteListId, pagination).then(result => { + result.elements.forEach(member => {this.addMember(voterList, member.name, member.email, member.weight);}); + return Promise.resolve(); + })); + let paginationChild = { + order: "child.name", + desc: false, + pageSize: -1, + pageNumber: 0 + }; + importPromises.push(FavoriteListService.childrenLists(favoriteListId, paginationChild).then(result => { + let subListImportPromises = []; + result.elements.forEach(childList => { + let subVoterList = this.addVoterList(voterList, childList.child.name, childList.weight); + subListImportPromises.push(this.importFavoriteList(subVoterList, childList.child.id)); + }); + return Promise.all(subListImportPromises); + })); + return Promise.all(importPromises); + } } module.exports = singleton(VoterListService); diff --git a/pollen-ui-riot-js/src/main/web/tag/favoriteList/FavoriteLists.tag.html b/pollen-ui-riot-js/src/main/web/tag/favoriteList/FavoriteLists.tag.html index aa4841e..d33616f 100644 --- a/pollen-ui-riot-js/src/main/web/tag/favoriteList/FavoriteLists.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/favoriteList/FavoriteLists.tag.html @@ -45,6 +45,7 @@ require("./FavoriteListCard.tag.html"); <script type="es6"> this.loaded = false; let session = require("../../js/Session"); + let favoriteListsService = require("../../js/FavoriteListService"); this.installBundle(session, "favoriteList"); this.pagination = { @@ -55,8 +56,6 @@ require("./FavoriteListCard.tag.html"); }; this.favoriteLists = []; - let favoriteListsService = require("../../js/FavoriteListService"); - this.refresh = () => { return favoriteListsService.favoriteLists(this.pagination).then((result) => { this.favoriteLists = result.elements; diff --git a/pollen-ui-riot-js/src/main/web/tag/poll/Settings.tag.html b/pollen-ui-riot-js/src/main/web/tag/poll/Settings.tag.html index fbd7481..8995c17 100644 --- a/pollen-ui-riot-js/src/main/web/tag/poll/Settings.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/poll/Settings.tag.html @@ -387,9 +387,8 @@ }; this.onEndDateChanged = () => { - this.updateDisableNotifyMeBeforePollEnds(); - } + }; this.toggleAnonymousVote = () => { this.form.model.anonymousVoteAllowed = !this.form.model.anonymousVoteAllowed; diff --git a/pollen-ui-riot-js/src/main/web/tag/poll/Voters.tag.html b/pollen-ui-riot-js/src/main/web/tag/poll/Voters.tag.html index 56666c4..7ae9d68 100644 --- a/pollen-ui-riot-js/src/main/web/tag/poll/Voters.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/poll/Voters.tag.html @@ -35,19 +35,6 @@ <option value="RESTRICTED">{__.restrictedPoll}</option> </select> </div> - <div show={votePrivate} class="o-form-element"> - <label class="c-toggle c-toggle--info"> - {__.restrictedPoll_withMe} - <input type="checkbox" - name="withMe" - ref="withMe" - checked={form.model.withMe} - onclick={withMe}> - <div class="c-toggle__track"> - <div class="c-toggle__handle"></div> - </div> - </label> - </div> <div show={!votePrivate}> <div class="o-form-element" if={form.model.alreadyParticipants && form.model.alreadyParticipants.length}> @@ -79,7 +66,7 @@ {__.restrictedPoll_participants} </label> <div class="section-content"> - <VoterList voter-list={this.form.mainVoterList} ref="mainVoterList"/> + <VoterList voter-list={form.mainVoterList} form={opts.form} ref="mainVoterList"/> </div> </div> diff --git a/pollen-ui-riot-js/src/main/web/tag/popup/Modal.tag.html b/pollen-ui-riot-js/src/main/web/tag/popup/Modal.tag.html new file mode 100644 index 0000000..8ad00b8 --- /dev/null +++ b/pollen-ui-riot-js/src/main/web/tag/popup/Modal.tag.html @@ -0,0 +1,59 @@ + +<modal show={openModal}> + <div class="c-overlay"></div> + <div class="o-modal u-highest"> + <div class="c-card c-card--higher"> + <header class="c-card__header"> + <h2 class="c-heading"> + {opts.title} + </h2> + </header> + <div class="c-card__body"> + <yield/> + </div> + <footer class="c-card__footer c-card__footer--block"> + <div class="c-input-group"> + <button type="button" + class="c-button c-button--block c-button--brand" + onclick={cancel}> + {__.cancel} + </button> + <button type="button" + class="c-button c-button--block c-button--info" + onclick={close}> + {__.ok} + </button> + </div> + </footer> + </div> + </div> + + <script type="es6"> + + let session = require("../../js/Session"); + + this.installBundle(session, "modal"); + this.openModal = false; + + this.open = () => { + this.openModal = true; + this.modalPromise = new Promise((resolve, reject) => { + this.modalResolve = resolve; + this.modalReject = reject; + }); + return this.modalPromise; + }; + + this.close = () => { + this.openModal = false; + this.modalResolve(); + }; + + this.cancel = () => { + this.openModal = false; + this.modalReject(); + }; + + </script> + +</modal> diff --git a/pollen-ui-riot-js/src/main/web/tag/voterList/VoterList.tag.html b/pollen-ui-riot-js/src/main/web/tag/voterList/VoterList.tag.html index 2f986cd..de6823a 100644 --- a/pollen-ui-riot-js/src/main/web/tag/voterList/VoterList.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/voterList/VoterList.tag.html @@ -1,4 +1,5 @@ require("./VoterListMember.tag.html"); +require("../popup/Modal.tag.html"); <VoterList> <div class="voter-list-header"> @@ -15,14 +16,17 @@ require("./VoterListMember.tag.html"); type="text" name="name" ref="name" + disabled={opts.form.model.isClosed} value={opts.voterList.name} placeholder={__.name}> </div> - <div class="o-field field-weight"> + <div class="o-field o-field--icon-left field-weight"> + <i class="fa fa-fw fa-balance-scale c-icon" aria-hidden="true"></i> <input class="c-field" type="number" name="weight" ref="weight" + disabled={opts.form.model.isClosed} value={opts.voterList.weight} placeholder={__.weight}> </div> @@ -31,6 +35,8 @@ require("./VoterListMember.tag.html"); <div class="voter-list-actions"> <button class="c-button c-button--success" type="button" + show={!opts.form.model.isClosed} + disabled={opts.form.model.isClosed} onclick={addMember} title={__.addMember}> <i class="fa fa-plus" aria-hidden="true"></i> @@ -38,15 +44,38 @@ require("./VoterListMember.tag.html"); </button> <button class="c-button c-button--success" type="button" + show={!opts.form.model.isClosed} + disabled={opts.form.model.isClosed} onclick={addVoterList} title={__.addVoterList}> <i class="fa fa-plus" aria-hidden="true"></i> <i class="fa fa-users" aria-hidden="true"></i> </button> + <button class="c-button c-button--success" + type="button" + onclick={importFavoriteList} + show={user && !opts.form.model.isClosed} + disabled={!user || opts.form.model.isClosed} + title={__.importFavoriteList}> + <i class="fa fa-arrow-down" aria-hidden="true"></i> + <i class="fa fa-users" aria-hidden="true"></i> + </button> + + <button class="c-button c-button--info" + type="button" + onclick={exportToFavoriteList} + show={user && !opts.voterList.temp} + disabled={!user || opts.voterList.temp} + title={__.exportFavoriteList}> + <i class="fa fa-arrow-up" aria-hidden="true"></i> + <i class="fa fa-users" aria-hidden="true"></i> + </button> + <button class="c-button c-button--error" type="button" - show={opts.voterList.parentId} + show={opts.voterList.parentId && !opts.form.model.isClosed} + disabled={!opts.voterList.parentId || opts.form.model.isClosed} onclick={delete} title={__.delete}> <i class="fa fa-times" aria-hidden="true"></i> @@ -58,17 +87,47 @@ require("./VoterListMember.tag.html"); <div class="voter-list-content" show={expand}> - <VoterList each={voterlist in opts.voterList.subLists} voter-list={voterlist} ref="voterLists"/> - <voterListmember each={member in opts.voterList.members} member={member} ref="voterListMembers"/> + <VoterList each={voterlist in opts.voterList.subLists} voter-list={voterlist} form={parent.opts.form} ref="voterLists"/> + <voterListmember each={member in opts.voterList.members} member={member} form={parent.opts.form} ref="voterListMembers"/> </div> + <modal title={__.importFavoriteList} + ref="importFavoriteListModal"> + <div show={favoriteLists.length === 0}> + {__.importFavoriteList_none} + </div> + <select class="c-field" + show={favoriteLists.length > 0} + ref="selectFavoriteListToImport"> + <option each={favoriteList in parent.favoriteLists} + value={favoriteList.id}> + {favoriteList.name} + </option> + </select> + </modal> + <script type="es6"> let session = require("../../js/Session"); this.installBundle(session, "voterList"); let voterListService = require("../../js/VoterListService"); + let favoriteListsService = require("../../js/FavoriteListService"); + let route = require("riot-route"); + this.favoriteLists = []; this.expand = false; + this.user = session.getUser(); + + this.onUserChange = user => { + this.user = user; + this.update(); + }; + + this.bus.on("user", this.onUserChange); + + this.on("before-unmount", () => { + this.bus.off("user", this.onUserChange); + }); this.toggleExpand = () => { if (this.expand) { @@ -106,6 +165,38 @@ require("./VoterListMember.tag.html"); } }; + this.importFavoriteList = () => { + if (session.getUser()) { + let pagination = { + order: "name", + desc: false, + pageSize: -1, + pageNumber: 0 + }; + favoriteListsService.favoriteLists(pagination).then((result) => { + this.favoriteLists = result.elements; + this.refs.importFavoriteListModal.open().then(() => { + let favoriteListId = this.refs.importFavoriteListModal.refs.selectFavoriteListToImport.value; + voterListService.importFavoriteList(this.opts.voterList, favoriteListId).then(() => { + this.expandWithAdd(false, false); + }); + }, () => {}); + this.update(); + }); + } + }; + + this.exportToFavoriteList = () => { + if (session.getUser() && !this.opts.voterList.temp) { + favoriteListsService.importFromVoterList(this.opts.voterList.id).then((result) => { + route("/favoriteLists/" + result.id); + }, errors => { + this.bus.trigger("error", errors); + this.update(); + }); + } + }; + this.submit = () => { if (this.opts.voterList.parentId) { this.opts.voterList.name = this.refs.name.value; diff --git a/pollen-ui-riot-js/src/main/web/tag/voterList/VoterListMember.tag.html b/pollen-ui-riot-js/src/main/web/tag/voterList/VoterListMember.tag.html index ba772c4..bc76cd1 100644 --- a/pollen-ui-riot-js/src/main/web/tag/voterList/VoterListMember.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/voterList/VoterListMember.tag.html @@ -9,6 +9,7 @@ type="text" name="name" ref="name" + disabled={opts.form.model.isClosed} value={opts.member.name} placeholder={__.name}> </div> @@ -17,14 +18,17 @@ type="email" name="email" ref="email" + disabled={opts.form.model.isClosed} value={opts.member.email} placeholder={__.email}> </div> - <div class="o-field field-weight"> + <div class="o-field o-field--icon-left field-weight"> + <i class="fa fa-fw fa-balance-scale c-icon" aria-hidden="true"></i> <input class="c-field" type="number" name="weight" ref="weight" + disabled={opts.form.model.isClosed} value={opts.member.weight} placeholder={__.weight}> </div> @@ -33,6 +37,8 @@ <div class="voter-list-member-actions"> <button class="c-button c-button--error" type="button" + show={!opts.form.model.isClosed} + disabled={opts.form.model.isClosed} onclick={delete} title={__.delete}> <i class="fa fa-times" aria-hidden="true"></i> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm