package hu.sch.web.kp.valuation;
import hu.sch.domain.enums.ValuationPeriod;
import hu.sch.domain.enums.ValuationStatus;
import hu.sch.domain.*;
import hu.sch.services.ValuationManagerLocal;
import hu.sch.services.exceptions.valuation.AlreadyModifiedException;
import hu.sch.services.exceptions.valuation.NoExplanationException;
import hu.sch.services.exceptions.valuation.NothingChangedException;
import hu.sch.web.kp.KorokPage;
import hu.sch.web.kp.consider.ConsiderExplainPanel;
import hu.sch.web.kp.consider.ConsiderPage;
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 hu.sch.web.wicket.components.TinyMCEContainer;
import hu.sch.web.wicket.components.customlinks.UserLink;
import hu.sch.web.wicket.components.tables.ValuationTableForGroup;
import java.util.List;
import javax.inject.Inject;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.datetime.markup.html.basic.DateLabel;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValueConversionException;
import wicket.contrib.tinymce.ajax.TinyMceAjaxSubmitModifier;
import wicket.contrib.tinymce.settings.TinyMCESettings;
/**
* Egy csoporthoz tartozó adott félévhez köthető értékelés teljes megtekintése,
* statisztikától, pont- és belépőkérelmektől kezdve az elbírálásig.
*
* @author hege
* @author messo
*/
public class ValuationDetails extends KorokPage {
@Inject
private ValuationManagerLocal valuationManager;
private AjaxFallbackLink<Void> ajaxLinkForValuationText;
public ValuationDetails(PageParameters params) {
Valuation valuation = null;
Long id = null;
try {
id = params.get("id").toLong();
} catch (StringValueConversionException ex) {
}
if (id == null || (valuation = valuationManager.findValuationForDetails(id)) == null) {
getSession().error("Nincs ilyen értékelés!");
throw new RestartResponseException(getApplication().getHomePage());
}
// jogosultság ellenőrzés; akkor láthatja ezt a lapot, ha
// 1. a csoport körvezetője, vagy
// 2. JETI és elbírálási időszak van
if (isUserGroupLeader(valuation.getGroup())
|| (isCurrentUserJETI() && systemManager.getErtekelesIdoszak() == ValuationPeriod.ERTEKELESELBIRALAS)) {
// lássuk a medvét
init(valuation);
} else {
getSession().error(getLocalizer().getString("err.NincsJog", null));
throw new RestartResponseException(getApplication().getHomePage());
}
}
@Override
public void renderHead(IHeaderResponse response) {
//TinyMCE csak akkor működik AJAXszal, ha már az oldal betöltődésekor be
//van töltve a js :(
super.renderHead(response);
response.render(JavaScriptHeaderItem.forReference(TinyMCESettings.javaScriptReference()));
}
private void init(final Valuation valuation) {
if (valuation.isObsolete()) {
Long newestVersionsId = valuationManager.findLatestVersionsId(valuation.getGroup(), valuation.getSemester());
error("Már van <a href=\"" + getRequestCycle().urlFor(ValuationDetails.class, new PageParameters().add("id", newestVersionsId))
+ "\">újabb verzió</a> ennél az értékelésnél. "
+ "Ezt már csak megtekinteni lehet, szerkeszteni nem!");
}
setHeaderLabelText("Leadott értékelés - részletes nézet");
setTitleText(String.format("Értékelések - %s (%s)", valuation.getGroup().getName(), valuation.getSemester()));
setDefaultModel(new CompoundPropertyModel<Valuation>(valuation));
add(new BookmarkablePageLink("history", ValuationHistory.class, new PageParameters().add("gid", valuation.getGroupId()).
add("sid", valuation.getSemester().getId())));
add(ValuationMessages.getLink("messages", valuation));
// Főbb adatok
add(new Label("group.name"));
add(new Label("semester"));
if (valuation.getSender() != null) {
add(new UserLink("sender", valuation.getSender()));
} else {
add(new Label("sender", "Nincs megadva"));
}
add(DateLabel.forDatePattern("lastModified", "yyyy. MM. dd. kk:mm"));
if (valuation.getConsideredBy() != null) {
add(new UserLink("consideredBy", valuation.getConsideredBy()));
} else {
add(new Label("consideredBy", "<i>Még nincs elbírálva</i>").setEscapeModelStrings(false));
}
add(DateLabel.forDatePattern("lastConsidered", "yyyy. MM. dd. kk:mm"));
PageParameters params = new PageParameters().add("vid", valuation.getId());
add(new BookmarkablePageLink("pointRequests", PointRequests.class, params));
add(new BookmarkablePageLink("entrantRequests", EntrantRequests.class, params));
add(new Label("entrantStatus"));
add(new Label("pointStatus"));
// Staisztika
ValuationStatistic stat = valuationManager.getStatisticForValuation(valuation.getId());
add(new Label("stat.averagePont", new Model<Double>(stat.getAveragePoint())));
add(new Label("stat.summaPoint", new Model<Long>(stat.getSummaPoint())));
add(new Label("stat.givenKDO", new Model<Long>(stat.getGivenKDO())));
add(new Label("stat.givenKB", new Model<Long>(stat.getGivenKB())));
add(new Label("stat.givenAB", new Model<Long>(stat.getGivenAB())));
final List<ValuationData> igenylista = valuationManager.findRequestsForValuation(valuation.getId());
add(new ValuationTableForGroup("requests", igenylista, true).getDataTable());
addValuationText(valuation);
addPrinciple(valuation);
// Nem szerkeszthet az értékelés szövegén/pontozási elveken, ha
// 1. már nincsen értékelés leadás
// 2. egy régebbi félévről származik
// 3. ha a pontozást és belépőkérelmeket elfogadták
if (systemManager.getErtekelesIdoszak() != ValuationPeriod.ERTEKELESLEADAS
|| !systemManager.getSzemeszter().equals(valuation.getSemester())
|| (valuation.getPointStatus() == ValuationStatus.ELFOGADVA
&& valuation.getEntrantStatus() == ValuationStatus.ELFOGADVA)
|| valuation.isObsolete()) {
ajaxLinkForValuationText.setVisible(false);
}
// Elbírálás
if (isCurrentUserJETI() && systemManager.getErtekelesIdoszak() == ValuationPeriod.ERTEKELESELBIRALAS
&& !valuation.isObsolete() && systemManager.getSzemeszter().equals(valuation.getSemester())) {
ConsideredValuation cv = new ConsideredValuation(valuation, getUser());
add(new ConsiderExplainPanel("jeti", cv) {
@Override
public void onSubmit(ConsideredValuation cv) {
try {
valuationManager.considerValuation(cv);
getSession().info("Az elbírálás sikeres volt.");
setResponsePage(ConsiderPage.class);
} catch (NoExplanationException ex) {
getSession().error("Minden elutasított értékeléshez kell indoklást mellékelni!");
} catch (NothingChangedException ex) {
getSession().error("Nem változtattál státuszon, ez nem elbírálás!");
} catch (AlreadyModifiedException ex) {
getSession().error("Valaki már módosított az értékelésen!");
setResponsePage(ValuationDetails.class,
new PageParameters().add("id", cv.getValuation().getId()));
}
}
});
} else {
add(new EmptyPanel("jeti"));
}
}
private void addValuationText(final Valuation valuation) {
// TODO -- ehhez generálni egy AjaxEditableMultiLineLabelUsingTinyMCE-t.
final WebMarkupContainer container = new WebMarkupContainer("valuationTextContainer");
container.setOutputMarkupId(true);
add(container);
// Szöveges értékelés
final MultiLineLabel label = new MultiLineLabel("valuationText");
label.setEscapeModelStrings(false);
container.add(label);
final Form<Valuation> form = new Form<Valuation>("valuationTextForm", new CompoundPropertyModel<Valuation>(valuation));
form.setVisible(false);
container.add(form);
form.add(new AjaxButton("saveValuationText", form) {
@Override
protected void onBeforeRender() {
super.onBeforeRender();
add(new TinyMceAjaxSubmitModifier());
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
}
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
final Valuation valuation = (Valuation) form.getModelObject();
try {
Valuation updated = valuationManager.updateValuation(valuation);
if (!updated.getId().equals(valuation.getId())) {
// ha új verziót hoztunk létre, akkor töltsük be a teljesen új
// verziót tartalmazó lapot.
setResponsePage(ValuationDetails.class, new PageParameters().add("id", updated.getId()));
return;
}
} catch (AlreadyModifiedException ex) {
// frissítsük a lapot.
setResponsePage(ValuationDetails.class, new PageParameters().add("id", valuation.getId()));
return;
}
label.setVisible(true);
form.setVisible(false);
if (target != null) {
target.add(container);
}
}
});
container.add(ajaxLinkForValuationText = new AjaxFallbackLink<Void>("modifyValuationText") {
@Override
public void onClick(AjaxRequestTarget target) {
label.setVisible(false);
form.setVisible(true);
if (target != null) {
target.add(container);
}
}
});
// Szöveges értékelése TinyMCE doboza
final TinyMCEContainer tinyMce = new TinyMCEContainer("valuationText2", new PropertyModel<String>(valuation, "valuationText"), true);
form.add(tinyMce);
}
private void addPrinciple(final Valuation valuation) {
// Szöveges értékelés
final MultiLineLabel label = new MultiLineLabel("principle");
label.setEscapeModelStrings(false);
add(label);
}
}