package de.onyxbits.tradetrax.pages.edit;
import java.util.List;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.alerts.Duration;
import org.apache.tapestry5.alerts.Severity;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.beaneditor.Validate;
import org.apache.tapestry5.corelib.components.EventLink;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.TextField;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import de.onyxbits.tradetrax.entities.Stock;
import de.onyxbits.tradetrax.entities.Variant;
import de.onyxbits.tradetrax.pages.Index;
import de.onyxbits.tradetrax.pages.tools.LabelManager;
import de.onyxbits.tradetrax.services.EventLogger;
@Import(library = "context:js/mousetrap.min.js")
public class VariantEditor {
@Property
private long variantId;
@Property
@Validate("required")
private String name;
@Property
private String status;
@Component(id = "nameField")
private TextField nameField;
@Component(id = "editForm")
private Form form;
@Inject
private Session session;
@Inject
private EventLogger eventLogger;
@Inject
private AlertManager alertManager;
@Inject
private Messages messages;
private boolean eventDelete;
@InjectPage
private Index index;
@Component(id="show")
private EventLink show;
@Inject
private JavaScriptSupport javaScriptSupport;
protected Object onShow() {
Variant v = (Variant) session.get(Variant.class, variantId);
if (v != null) {
index.withNoFilters().withFilterVariant(v.getLabel());
}
return index;
}
protected void onActivate(Long variantId) {
this.variantId = variantId;
}
protected void setupRender() {
Variant v = (Variant) session.get(Variant.class, variantId);
if (v != null) {
name = v.getLabel();
status = messages.format("status-count",
session.createCriteria(Stock.class).add(Restrictions.eq("variant.id", this.variantId))
.setProjection(Projections.rowCount()).uniqueResult());
}
}
protected Long onPassivate() {
return variantId;
}
public void onSelectedFromDelete() {
eventDelete=true;
}
public void onSelectedFromSave() {
eventDelete=false;
}
@CommitAfter
public Object onSuccess() {
if (eventDelete) {
doDelete();
}
else {
doSave();
}
return LabelManager.class;
}
protected void doSave() {
try {
Variant variant = (Variant) session.get(Variant.class, variantId);
String s = variant.getLabel();
variant.setLabel(name);
session.update(variant);
alertManager.alert(Duration.UNTIL_DISMISSED, Severity.INFO, messages.format("renamed",s,name));
eventLogger.rename(s,name);
}
catch (Exception e) {
alertManager.alert(Duration.SINGLE, Severity.ERROR, messages.format("exception",e.getMessage()));
}
}
protected void doDelete() {
try {
Variant bye = (Variant)session.get(Variant.class, variantId);
@SuppressWarnings("unchecked")
List<Stock> lst = session.createCriteria(Stock.class).add(Restrictions.eq("variant", bye)).list();
for (Stock s : lst) {
s.setVariant(null);
session.update(s);
}
session.delete(bye);
eventLogger.deleted(bye.getLabel());
}
catch (Exception e) {
// Only two ways of getting here: trying to delete something that no
// longer exists or never existed in the first place. No need to tell the
// user that throwing away something non-existant failed.
}
}
public void afterRender() {
javaScriptSupport
.addScript("Mousetrap.prototype.stopCallback = function(e, element) {return false;};");
javaScriptSupport.addScript("Mousetrap.bind('esc', function() {window.history.back(); return false;});");
}
}