package org.orienteer.core.component.command;
import java.util.Collection;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.util.string.Strings;
import org.orienteer.core.component.BootstrapType;
import org.orienteer.core.component.FAIconType;
import org.orienteer.core.component.command.modal.SelectDialogPanel;
import org.orienteer.core.component.table.OrienteerDataTable;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OProperty;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
/**
* {@link Command} to select (establish new link to a document) some {@link ODocument}
*/
public class SelectODocumentCommand extends AbstractModalWindowCommand<ODocument>
{
private IModel<ODocument> documentModel;
private IModel<OProperty> propertyModel;
public SelectODocumentCommand(OrienteerDataTable<ODocument, ?> table, IModel<ODocument> documentModel, IModel<OProperty> propertyModel)
{
super(new ResourceModel("command.select"), table);
setBootstrapType(BootstrapType.SUCCESS);
setIcon(FAIconType.hand_o_right);
this.documentModel = documentModel;
this.propertyModel = propertyModel;
}
@Override
protected void initializeContent(ModalWindow modal) {
modal.setTitle(new ResourceModel("command.select.modal.title"));
boolean multiValue = propertyModel.getObject().getType().isMultiValue();
modal.setContent(new SelectDialogPanel(modal.getContentId(), modal, new PropertyModel<OClass>(propertyModel, "linkedClass"), multiValue) {
@Override
protected boolean onSelect(AjaxRequestTarget target, List<ODocument> objects, boolean selectMore) {
if(objects==null || objects.isEmpty()) return true;
OType oType = propertyModel.getObject().getType();
if(!oType.isMultiValue() && objects.size()>1)
{
String message = getLocalizer().getString("alert.onlyoneshouldbeselected", this).replace("\"", "\\\"");
target.appendJavaScript("alert(\""+message+"\")");
return false;
}
if(oType.isMultiValue())
{
ODocument doc = documentModel.getObject();
OProperty property = propertyModel.getObject();
Collection<ODocument> links = doc.field(property.getName());
if(links!=null)
{
links.addAll(objects);
}
else
{
doc.field(property.getName(), objects);
}
doc.save();
}
else
{
ODocument doc = documentModel.getObject();
OProperty property = propertyModel.getObject();
doc.field(property.getName(), objects.get(0));
doc.save();
return true;
}
if (!selectMore) {
sendActionPerformed();
}
return true;
}
});
modal.setCloseButtonCallback(new ModalWindow.CloseButtonCallback() {
@Override
public boolean onCloseButtonClicked(AjaxRequestTarget target) {
sendActionPerformed();
return true;
}
});
}
}