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>.