diff --git a/sonferenz-db/src/main/java/de/bitnoise/sonferenz/model/ConferenceState.java b/sonferenz-db/src/main/java/de/bitnoise/sonferenz/model/ConferenceState.java index 12a66ba..7e27b78 100644 --- a/sonferenz-db/src/main/java/de/bitnoise/sonferenz/model/ConferenceState.java +++ b/sonferenz-db/src/main/java/de/bitnoise/sonferenz/model/ConferenceState.java @@ -2,5 +2,5 @@ public enum ConferenceState { - CREATED, PLANNING, VOTING, PLANNED, RUNNING, FINISHED; + CREATED, CALL4PAPERS, VOTING, VOTED, PLANNED, RUNNING, FINISHED; } diff --git a/sonferenz-db/src/main/java/de/bitnoise/sonferenz/repo/VoteRepository.java b/sonferenz-db/src/main/java/de/bitnoise/sonferenz/repo/VoteRepository.java index 6e33c8c..32cb838 100644 --- a/sonferenz-db/src/main/java/de/bitnoise/sonferenz/repo/VoteRepository.java +++ b/sonferenz-db/src/main/java/de/bitnoise/sonferenz/repo/VoteRepository.java @@ -3,6 +3,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import de.bitnoise.sonferenz.model.TalkModel; @@ -18,4 +19,7 @@ public interface VoteRepository extends JpaRepository @Query("select v from VoteModel v where v.user = ?1 and v.rateing > ?2") List findByUserAndRateing(UserModel user, int rateing); + + List findByUser(UserModel user); + } diff --git a/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/VoteService.java b/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/VoteService.java index ce8f89d..c7e4af9 100644 --- a/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/VoteService.java +++ b/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/VoteService.java @@ -4,6 +4,7 @@ import de.bitnoise.sonferenz.model.TalkModel; import de.bitnoise.sonferenz.model.UserModel; +import de.bitnoise.sonferenz.model.VoteModel; public interface VoteService { @@ -12,4 +13,8 @@ public interface VoteService boolean vote(TalkModel talk, UserModel user, int increment); + List getMyVotes(); + + void saveMyVotes(List votes); + } diff --git a/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/impl/VoteService2Impl.java b/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/impl/VoteService2Impl.java index aeb5b3a..dcddd48 100644 --- a/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/impl/VoteService2Impl.java +++ b/sonferenz-service/src/main/java/de/bitnoise/sonferenz/service/v2/services/impl/VoteService2Impl.java @@ -7,13 +7,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import de.bitnoise.sonferenz.model.ConferenceModel; import de.bitnoise.sonferenz.model.TalkModel; import de.bitnoise.sonferenz.model.UserModel; import de.bitnoise.sonferenz.model.VoteModel; import de.bitnoise.sonferenz.repo.TalkRepository; import de.bitnoise.sonferenz.repo.VoteRepository; +import de.bitnoise.sonferenz.service.v2.services.AuthenticationService; import de.bitnoise.sonferenz.service.v2.services.VoteService; @Service @@ -25,8 +25,11 @@ public class VoteService2Impl implements VoteService @Autowired VoteRepository voteRepo; + @Autowired + AuthenticationService auth; + @Override - @Transactional + @Transactional public void removeAllVotestForTalk(List talks) { if (talks == null) @@ -47,7 +50,7 @@ public void removeAllVotestForTalk(List talks) } @Override - @Transactional + @Transactional public boolean vote(TalkModel talk, UserModel user, int increment) { ConferenceModel conference = talk.getConference(); @@ -114,15 +117,41 @@ private List getAllAttendingTalks(ConferenceModel conference, UserModel user, int minState) { List rest = voteRepo.findByUserAndRateing(user, minState); - for(VoteModel v : rest) { + for (VoteModel v : rest) + { TalkModel t = v.getTalk(); Hibernate.initialize(v); - if(t!=null) { - Hibernate.initialize (t.getVotes() ); + if (t != null) + { + Hibernate.initialize(t.getVotes()); } } return rest; } - + @Override + @Transactional + public List getMyVotes() + { + UserModel user = auth.getCurrentUser(); + if (user == null) + { + throw new IllegalStateException("No User logged in"); + } + List votes = voteRepo.findByUser(user); + Hibernate.initialize(votes); + return votes; + } + + @Override + @Transactional + public void saveMyVotes(List votes) + { + UserModel user = auth.getCurrentUser(); + voteRepo.deleteInBatch( voteRepo.findByUser(user) ); + for(VoteModel vote : votes) { + voteRepo.saveAndFlush(vote); + } + } + } diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/ConfigMainNavigation.java b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/ConfigMainNavigation.java index 53d3a93..310eee2 100644 --- a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/ConfigMainNavigation.java +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/ConfigMainNavigation.java @@ -53,11 +53,11 @@ public static List getPages() new IsActiveConference() )); */ - ret.add(new PageNavCallback(VotingOverviewPage.class, "Voting", - new VisibleOnRights(Right.Vote.canVote), - new IsActiveConference(), - new OnStateVoting() - )); +// ret.add(new PageNavCallback(VotingOverviewPage.class, "Voting", +// new VisibleOnRights(Right.Vote.canVote), +// new IsActiveConference(), +// new OnStateVoting() +// )); ret.add(new PageNavCallback(CalculateOverviewPage.class, "Calculate", new VisibleOnRights(Right.Admin.ViewCalculation), new IsActiveConference(), diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/lvl1/FirstLevelBar.java b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/lvl1/FirstLevelBar.java index a774723..2282508 100644 --- a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/lvl1/FirstLevelBar.java +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/lvl1/FirstLevelBar.java @@ -4,41 +4,57 @@ import org.apache.wicket.markup.repeater.RepeatingView; import de.bitnoise.sonferenz.KonferenzSession; +import de.bitnoise.sonferenz.web.component.state.OnStateCallForPapers; +import de.bitnoise.sonferenz.web.component.state.OnStateVoting; import de.bitnoise.sonferenz.web.pages.paper.TalksOverviewPage; import de.bitnoise.sonferenz.web.pages.statics.ConferencePage; import de.bitnoise.sonferenz.web.pages.statics.ContactPage; import de.bitnoise.sonferenz.web.pages.statics.InfoPage; import de.bitnoise.sonferenz.web.pages.statics.RegisterPage; +import de.bitnoise.sonferenz.web.pages.voting.VotingOverviewPage; import de.bitnoise.sonferenz.web.pages.whish.WhishOverviewPage; -public class FirstLevelBar extends Panel { - - public FirstLevelBar(String id) { - super(id); - } - - @Override - protected void onInitialize() { - super.onInitialize(); - RepeatingView items = new RepeatingView("repeater"); - - if (!KonferenzSession.noUserLoggedIn()) { - items.add(new MenuButton("info", items.newChildId(), InfoPage.class)); - items.add(new MenuButton("whishes", items.newChildId(), WhishOverviewPage.class)); - items.add(new MenuButton("talks", items.newChildId(), TalksOverviewPage.class)); - /* - items.add(new MenuButton("archive", items.newChildId(), ReviewPage.class)); - items.add(new MenuButton("program", items.newChildId(), ConferencePage.class)); - items.add(new MenuButton("agenda", items.newChildId(), AgendaPage.class)); - */ - } - else - { - items.add(new MenuButton("conference", items.newChildId(), ConferencePage.class)); - items.add(new MenuButton("register", items.newChildId(), RegisterPage.class)); - } - - items.add(new MenuButton("contact", items.newChildId(), ContactPage.class)); - add(items); - } +public class FirstLevelBar extends Panel +{ + + public FirstLevelBar(String id) + { + super(id); + } + + @Override + protected void onInitialize() + { + super.onInitialize(); + RepeatingView items = new RepeatingView("repeater"); + + if (!KonferenzSession.noUserLoggedIn()) + { + + items.add(new MenuButton("info", items.newChildId(), InfoPage.class)); + if (new OnStateVoting().canBeDisplayed()) + { + items.add(new MenuButton("voting", items.newChildId(),VotingOverviewPage.class)); + } + if (new OnStateCallForPapers().canBeDisplayed()) + { + items.add(new MenuButton("whishes", items.newChildId(),WhishOverviewPage.class)); + items.add(new MenuButton("talks", items.newChildId(),TalksOverviewPage.class)); + } + /* + * items.add(new MenuButton("archive", items.newChildId(), + * ReviewPage.class)); items.add(new MenuButton("program", + * items.newChildId(), ConferencePage.class)); items.add(new + * MenuButton("agenda", items.newChildId(), AgendaPage.class)); + */ + } + else + { + items.add(new MenuButton("conference", items.newChildId(),ConferencePage.class)); + items.add(new MenuButton("register", items.newChildId(),RegisterPage.class)); + } + + items.add(new MenuButton("contact", items.newChildId(), ContactPage.class)); + add(items); + } } diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/state/OnStateCallForPapers.java b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/state/OnStateCallForPapers.java new file mode 100644 index 0000000..2fbc0f9 --- /dev/null +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/component/state/OnStateCallForPapers.java @@ -0,0 +1,28 @@ +package de.bitnoise.sonferenz.web.component.state; + +import org.apache.wicket.injection.web.InjectorHolder; +import org.apache.wicket.spring.injection.annot.SpringBean; + +import de.bitnoise.sonferenz.facade.UiFacade; +import de.bitnoise.sonferenz.model.ConferenceModel; +import de.bitnoise.sonferenz.model.ConferenceState; +import de.bitnoise.sonferenz.web.component.navigation.VisibleChoice; + +public class OnStateCallForPapers implements VisibleChoice +{ + + @SpringBean + transient UiFacade facade; + + public boolean canBeDisplayed() + { + InjectorHolder.getInjector().inject(this); + ConferenceModel active = facade.getActiveConference(); + if (active == null) + { + return false; + } + return ConferenceState.CALL4PAPERS.equals(active.getState()); + } + +} diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/KonferenzPage.html b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/KonferenzPage.html index b9fe175..02dfc68 100644 --- a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/KonferenzPage.html +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/KonferenzPage.html @@ -16,14 +16,6 @@ el.className = el.className.replace(/( repaint)+$/, ''); }, 0); } -$(function() { - /* webkit bugfix https://bugs.webkit.org/show_bug.cgi?id=53166 */ - if ($.browser.webkit) { - window.addEventListener('resize', function() { - webkitRepaint(document.body); - }, false); - }WA -}); diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.html b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.html index 25fb6d2..ab297c2 100644 --- a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.html +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.html @@ -1,11 +1,22 @@ + +

+ Bringe die Vorträge via drag'n'drop in die Reihenfolge die du bevorzugen würdest.
+ Am besten bringst du am besten die obersten 10 Vorträge in Reihe. ( 6 besuchbare Vorträge plus 4 Ersatz Vorträge ) +

+
-
-  x  [name] +
+   + Meine Vortragsliste : +
+
+   [title]
+
- save + save
diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.java b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.java index e9887b7..1a145f0 100644 --- a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.java +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/ListVotesPanel2.java @@ -1,6 +1,11 @@ package de.bitnoise.sonferenz.web.pages.voting; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxFallbackLink; @@ -12,6 +17,16 @@ import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; +import org.apache.wicket.spring.injection.annot.SpringBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; + +import de.bitnoise.sonferenz.KonferenzSession; +import de.bitnoise.sonferenz.facade.UiFacade; +import de.bitnoise.sonferenz.model.TalkModel; +import de.bitnoise.sonferenz.model.UserModel; +import de.bitnoise.sonferenz.model.VoteModel; +import de.bitnoise.sonferenz.service.v2.services.VoteService; import wicketdnd.DragSource; import wicketdnd.DropTarget; @@ -21,125 +36,187 @@ import wicketdnd.Transfer; import wicketdnd.theme.WindowsTheme; -public class ListVotesPanel2 extends Panel { - - - public ListVotesPanel2(String id) { - super(id); - } - - @Override - protected void onInitialize() { - super.onInitialize(); - - add(CSSPackageResource.getHeaderContribution(new WindowsTheme())); - final WebMarkupContainer list =new WebMarkupContainer("voting"); - final VoteList foos = new VoteList(); - foos .add("Rainer 1"); - foos .add("Rainer 3"); - foos .add("Rainer 2"); - ListView items = new ListView("items", foos) { - @Override - protected ListItem newItem(int index) { - ListItem item = super.newItem(index); - item.setOutputMarkupId(true); - return item; - } - - @Override - protected void populateItem(ListItem item) { - item.add(new Label("name", Model.of(item.getModel().getObject()))); - } - }; - - list.add(items); - - list.add(new DragSource(Operation.MOVE) - { - - @Override - public void onAfterDrop(AjaxRequestTarget target, Transfer transfer) - { - if (transfer.getOperation() == Operation.MOVE) - { - foos.remove(transfer.getData()); - - target.addComponent(list); - } - } - }.drag("div.item").initiate("span.initiate")); - - DropTarget dropTarget = new DropTarget(Operation.MOVE) - { - @Override - public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject { - if (location.getComponent() == list) - { - foos.add(operate(transfer)); - } - else - { - String foo = location.getModelObject(); - switch (location.getAnchor()) - { - case TOP : - case LEFT : - foos.addBefore(operate(transfer), foo); - break; - case BOTTOM : - case RIGHT : - foos.addAfter(operate(transfer), foo); - break; - default : - transfer.reject(); - } - - target.addComponent(list); - } - } - }.dropTopAndBottom("div.item"); - - list.add(dropTarget); - add(list); - AjaxFallbackLink save = new AjaxFallbackLink("save",Model.of("Save changes")){ - @Override - public void onClick(AjaxRequestTarget target) { - onSave(target); - }}; - add(save); - } - - protected void onSave(AjaxRequestTarget target) { - - } - - class VoteList extends ArrayList { - public void addBefore(String drag, String drop) - { -// drag.remove(); - add(indexOf(drop), drag); - } - - public void addAfter(String drag, String drop) - { -// drag.remove(); - add(indexOf(drop) + 1, drag); - } - } - - protected String operate(Transfer transfer) - { - String foo = transfer.getData(); - return foo; -// switch (transfer.getOperation()) -// { -// case MOVE : -// case COPY : -// return foo.copy(); -// case LINK : -// return foo.link(); -// default : -// throw new IllegalArgumentException(); -// } - } +public class ListVotesPanel2 extends Panel +{ + + @SpringBean + VoteService votes; + + @SpringBean + UiFacade facade; + + private VoteList currentVoteListe; + + private AjaxFallbackLink save; + + public ListVotesPanel2(String id) + { + super(id); + } + + @Override + protected void onInitialize() + { + super.onInitialize(); + + add(CSSPackageResource.getHeaderContribution(new WindowsTheme())); + final WebMarkupContainer list = new WebMarkupContainer("voting"); + currentVoteListe = buildVoteList(); + ListView items = new ListView("items", currentVoteListe) + { + @Override + protected ListItem newItem(int index) + { + ListItem item = super.newItem(index); + item.setOutputMarkupId(true); + return item; + } + + @Override + protected void populateItem(ListItem item) + { + VoteItem object = item.getModel().getObject(); + item.add(new Label("title", Model.of(object.getTalk().getTitle()))); + } + }; + + list.add(items); + + list.add(new DragSource(Operation.MOVE) + { + + @Override + public void onAfterDrop(AjaxRequestTarget target, Transfer transfer) + { + if (transfer.getOperation() == Operation.MOVE) + { + target.addComponent(list); + } + } + }.drag("div.item").initiate("span.initiate")); + + DropTarget dropTarget = new DropTarget(Operation.MOVE) + { + @Override + public void onDrop(AjaxRequestTarget target, Transfer transfer, + Location location) throws Reject + { + save.setEnabled(true); + VoteItem x = transfer.getData(); + if (location.getComponent() == list) + { + // foos.add(x); + } + else + { + VoteItem foo = location.getModelObject(); + switch (location.getAnchor()) + { + case TOP: + case LEFT: + currentVoteListe.addBefore(x, foo); + break; + case BOTTOM: + case RIGHT: + currentVoteListe.addAfter(x, foo); + break; + default: + transfer.reject(); + } + + target.addComponent(list); + target.addComponent(save); + } + } + }.dropTopAndBottom("div.item"); + + list.add(dropTarget); + add(list); + save = new AjaxFallbackLink("save", + Model.of("Save changes")) + { + @Override + public void onClick(AjaxRequestTarget target) + { + onSave(target); + } + }; + add(save); + save.setOutputMarkupId(true); + save.setEnabled(false); + } + + public VoteList buildVoteList() + { + Map votesPerTalk = getMyCurrentVotestPerTalk(); + List talks = getAllTalks(); + + final VoteList foos = new VoteList(); + for (TalkModel talk : talks) + { + Integer rating = getRatingForTalk(votesPerTalk, talk); + foos.add(new VoteItem(rating, talk)); + } + + Collections.sort(foos, new Comparator() + { + @Override + public int compare(VoteItem o1, VoteItem o2) + { + return o1.getRateing().compareTo(o2.getRateing()); + } + }); + return foos; + } + + public int getRatingForTalk(Map votesPerTalk, + TalkModel talk) + { + VoteModel myVote = votesPerTalk.get(talk.getId()); + if (myVote == null) + { + return Integer.MAX_VALUE; + } + if (myVote.getRateing() == null) + { + return Integer.MAX_VALUE; + } + return myVote.getRateing(); + } + + public List getAllTalks() + { + Page pages = facade.getVotableTalks(new PageRequest(0, 9999)); + List talks = pages.getContent(); + return talks; + } + + public Map getMyCurrentVotestPerTalk() + { + List my = votes.getMyVotes(); + Map votesPerTalk = new HashMap(); + for (VoteModel v : my) + { + votesPerTalk.put(v.getTalk().getId(), v); + } + return votesPerTalk; + } + + protected void onSave(AjaxRequestTarget target) + { + UserModel user = KonferenzSession.get().getCurrentUser(); + int i = 1; + List neueVotes = new ArrayList(); + for (VoteItem f : currentVoteListe) + { + VoteModel vote = new VoteModel(); + vote.setRateing(i++); + vote.setTalk(f.getTalk()); + vote.setUser(user); + neueVotes.add(vote); + } + votes.saveMyVotes(neueVotes); + save.setEnabled(false); + target.addComponent(save); + } } diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/VoteItem.java b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/VoteItem.java new file mode 100644 index 0000000..a7cd15a --- /dev/null +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/VoteItem.java @@ -0,0 +1,29 @@ +package de.bitnoise.sonferenz.web.pages.voting; + +import java.io.Serializable; + +import de.bitnoise.sonferenz.model.TalkModel; + +class VoteItem implements Serializable +{ + + TalkModel _talk; + + Integer _position; + + public VoteItem(Integer rating, TalkModel talk) + { + _position=rating; + _talk = talk; + } + + public Integer getRateing() + { + return _position; + } + + public TalkModel getTalk() + { + return _talk; + } +} \ No newline at end of file diff --git a/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/VoteList.java b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/VoteList.java new file mode 100644 index 0000000..d810c7f --- /dev/null +++ b/sonferenz-web/src/main/java/de/bitnoise/sonferenz/web/pages/voting/VoteList.java @@ -0,0 +1,29 @@ +package de.bitnoise.sonferenz.web.pages.voting; + +import java.util.ArrayList; +import java.util.Collections; + + +public class VoteList extends ArrayList { + public void addBefore(VoteItem drag, VoteItem drop) + { + int from= indexOf(drag); + int to = indexOf(drop); + remove(from); + if(from