package hu.sch.web.kp.valuation; import hu.sch.domain.enums.ValuationPeriod; import hu.sch.domain.enums.ValuationStatus; import hu.sch.domain.user.User; import hu.sch.domain.*; import hu.sch.services.ValuationManagerLocal; import hu.sch.web.kp.KorokPage; import hu.sch.web.kp.group.GroupHierarchy; import hu.sch.web.kp.valuation.message.ValuationMessages; import hu.sch.web.kp.valuation.request.entrant.EntrantRequests; import hu.sch.web.kp.valuation.request.point.PointRequests; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.apache.wicket.RestartResponseException; import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValueConversionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A körvezetők ezen lap segítségével adhatnak be értékeléseket a köreikhez. * * @author hege * @author messo */ public class Valuations extends KorokPage { @Inject ValuationManagerLocal valuationManager; private static Logger log = LoggerFactory.getLogger(Valuations.class); private static final String HEADER_TEXT = "Értékelések"; private final Group group; public Valuations() { setHeaderLabelText(HEADER_TEXT); setTitleText(HEADER_TEXT); group = null; init(); } public Valuations(PageParameters params) { try { Long groupId = params.get("id").toLong(); group = groupManager.findGroupById(groupId); } catch (StringValueConversionException svce) { getSession().error("Érvénytelen paraméter!"); throw new RestartResponseException(getApplication().getHomePage()); } if (!isUserGroupLeader(group)) { log.warn("Paraméterátírásos próbálkozás! " + getUser().getId()); getSession().error("Nincs jogod a művelethez! A próbálkozásod naplózásra került!"); throw new RestartResponseException(getApplication().getHomePage()); } setHeaderLabelText(HEADER_TEXT); init(); } private void init() { User user = userManager.findUserById(getSession().getUserId(), true); if (user == null || !isUserGroupLeaderInSomeGroup()) { getSession().error(getLocalizer().getString("err.NincsJog", this)); throw new RestartResponseException(GroupHierarchy.class); } user.sortMemberships(); final List<Membership> ms = user.getMemberships(); final List<Group> groups = new ArrayList<Group>(); //TODO simplify this for (Membership m : ms) { if (isUserGroupLeader(m.getGroup())) { groups.add(m.getGroup()); } } // megkeresem mire nem adott még le értékelést vagy belépőigényt az aktuális félévben final Map<Group, Valuation> valuationsForGroup = new HashMap<Group, Valuation>(); Semester semester = systemManager.getSzemeszter(); ValuationPeriod valuationPeriod = systemManager.getErtekelesIdoszak(); for (Membership m : ms) { Group cs = m.getGroup(); Valuation ert = valuationManager.findLatestValuation(cs, semester); if ((ert == null || ert.getPointStatus() == ValuationStatus.NINCS || ert.getEntrantStatus() == ValuationStatus.NINCS) && isUserGroupLeader(cs) && valuationPeriod == ValuationPeriod.ERTEKELESLEADAS) { // kelleni fog majd az értékelés objektum a táblázatnál, ezért // mentsük el egy Mapben. valuationsForGroup.put(cs, ert); } } // ha van olyan csoport, ahol van dolga a körvezetőnek, akkor azt mutassuk // meg egy szép kis táblázatban if (!valuationsForGroup.isEmpty()) { add(new WarningPanel("warningPanel", valuationsForGroup)); } else { add(new EmptyPanel("warningPanel")); } add(new DropDownChoice<Group>("groups", new PropertyModel<Group>(this, "group"), groups, new ChoiceRenderer<Group>("name")) { @Override protected boolean wantOnSelectionChangedNotifications() { return true; } @Override protected void onSelectionChanged(final Group selected) { if(selected == null){ return; } setResponsePage(Valuations.class, new PageParameters().add("id", selected.getId())); } }); // ha van kiválasztva csoport, akkor mehet a panel, különben ne jelenítsünk // meg üres táblázatot if (group != null) { add(new ValuationListPanel("listPanel")); } else { add(new EmptyPanel("listPanel")); } } private class ValuationListPanel extends Panel { public ValuationListPanel(String id) { super(id); setTitleText(HEADER_TEXT + " - " + group.getName()); Label groupName = new Label("name", group.getName()); add(groupName); final boolean nincsErtekelesLeadas = systemManager.getErtekelesIdoszak() != ValuationPeriod.ERTEKELESLEADAS; WebMarkupContainer table = new WebMarkupContainer("ertekelesektabla"); add(table); List<Valuation> valuationList = valuationManager.findLatestValuationsForGroup(group); table.add(new ListView<Valuation>("valuationList", valuationList) { @Override protected void populateItem(ListItem<Valuation> item) { final Valuation v = item.getModelObject(); item.setModel(new CompoundPropertyModel<Valuation>(v)); Link<ValuationDetails> ert = new BookmarkablePageLink<ValuationDetails>("valuationLink", ValuationDetails.class, new PageParameters().add("id", v.getId())); ert.add(new Label("semester")); item.add(ert); item.add(ValuationMessages.getLink("messagesLink", v)); item.add(new BookmarkablePageLink("pointLink", PointRequests.class, new PageParameters().add("vid", v.getId())).add(new Label("pointStatus"))); item.add(new BookmarkablePageLink("entrantLink", EntrantRequests.class, new PageParameters().add("vid", v.getId())).add(new Label("entrantStatus"))); item.add(DateLabel.forDatePattern("lastModified", "yyyy.MM.dd. kk:mm")); item.add(DateLabel.forDatePattern("lastConsidered", "yyyy.MM.dd. kk:mm")); } }); Link<NewValuation> newValuation = new BookmarkablePageLink<NewValuation>("newValuation", NewValuation.class, new PageParameters().add("id", group.getId())); add(newValuation); if (valuationList.isEmpty() || !valuationManager.isErtekelesLeadhato(group)) { newValuation.setVisible(false); } } } private class WarningPanel extends Panel { public WarningPanel(String id, final Map<Group, Valuation> left) { super(id); add(new ListView<Group>("warningList", new ArrayList<Group>(left.keySet())) { @Override protected void populateItem(ListItem<Group> item) { final Group group = item.getModelObject(); final Valuation val = left.get(group); item.add(new Label("warningGroupName", group.getName())); item.add(new Link("warningLink") { @Override protected void onBeforeRender() { super.onBeforeRender(); // a link akkor látható, ha nincs még a körhöz értékelés // vagy, ha nincs pontozás leadva setVisible(val == null || val.getPointStatus() == ValuationStatus.NINCS); } @Override public void onClick() { // group kiválasztása (mert nem feltétlen volt legördülővel...) if (val == null) { // ha egyáltalán nincs még értékelés az adott csoporthoz // és szemeszterhez, akkor először szöveges értékelés kell setResponsePage(NewValuation.class, new PageParameters().add("id", group.getId())); } else { // pontigény leadása a szöveges értékelés mellé setResponsePage(PointRequests.class, new PageParameters().add("vid", val.getId())); } } }); // belépőigénylés kijelzés item.add(new Link("warningEntrantLink") { @Override protected void onBeforeRender() { super.onBeforeRender(); // a link akkor látható, ha nincs még a körhöz értékelés // vagy, ha nincs pontozás leadva setVisible(val == null || val.getEntrantStatus() == ValuationStatus.NINCS); } @Override public void onClick() { // group kiválasztása (mert nem feltétlen volt legördülővel...) if (val == null) { // ha egyáltalán nincs még értékelés az adott csoporthoz // és szemeszterhez, akkor először szöveges értékelés kell setResponsePage(NewValuation.class, new PageParameters().add("id", group.getId())); } else { // belépőigény leadása a szöveges értékelés mellé setResponsePage(EntrantRequests.class, new PageParameters().add("vid", val.getId())); } } }); } }); } } }