package org.orienteer.core.component.command.modal;
import com.google.inject.Inject;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.record.impl.ODocument;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
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.TabsPanel;
import org.orienteer.core.component.command.AbstractCheckBoxEnabledCommand;
import org.orienteer.core.component.property.DisplayMode;
import org.orienteer.core.component.table.OrienteerDataTable;
import org.orienteer.core.component.table.component.GenericTablePanel;
import org.orienteer.core.service.IOClassIntrospector;
import org.orienteer.core.web.SearchPage;
import ru.ydn.wicket.wicketorientdb.OrientDbWebSession;
import ru.ydn.wicket.wicketorientdb.model.OClassModel;
import ru.ydn.wicket.wicketorientdb.model.OQueryDataProvider;
import java.util.List;
/**
* Modal window for selecting an {@link ODocument}
*/
public abstract class SelectDialogPanel extends GenericPanel<String>
{
@Inject
private IOClassIntrospector oClassIntrospector;
private ModalWindow modal;
private boolean isMultiValue;
private boolean canChangeClass;
private WebMarkupContainer resultsContainer;
private IModel<OClass> selectedClassModel;
private TextField<String> queryField;
public SelectDialogPanel(String id, final ModalWindow modal, IModel<OClass> initialClass, boolean isMultiValue)
{
this(id, modal, initialClass.getObject(), initialClass.getObject()==null, isMultiValue);
}
public SelectDialogPanel(String id, final ModalWindow modal, OClass initialClass, boolean canChangeClass, boolean isMultiValue)
{
super(id, Model.of(""));
this.modal = modal;
this.isMultiValue = isMultiValue;
this.modal.setMinimalHeight(400);
this.canChangeClass = canChangeClass || initialClass==null;
this.selectedClassModel = new OClassModel(initialClass!=null?initialClass: getClasses().get(0));
Form<String> form = new Form<String>("form", getModel());
queryField = new TextField<String>("query", getModel(), String.class);
queryField.setOutputMarkupId(true);
form.add(queryField);
AjaxButton searchButton = new AjaxButton("search") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
super.onSubmit(target, form);
target.add(resultsContainer);
}
};
form.add(searchButton);
form.setDefaultButton(searchButton);
form.add(new TabsPanel<OClass>("tabs", selectedClassModel, new PropertyModel<List<OClass>>(this, "classes"))
{
@Override
public void onTabClick(AjaxRequestTarget target) {
prepareResults();
target.add(resultsContainer);
}
}.setVisible(canChangeClass));
resultsContainer = new WebMarkupContainer("resultsContainer")
{
{
setOutputMarkupPlaceholderTag(true);
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!Strings.isEmpty(SelectDialogPanel.this.getModelObject()));
}
};
prepareResults();
form.add(resultsContainer);
add(form);
}
public List<OClass> getClasses()
{
return SearchPage.CLASSES_ORDERING.sortedCopy(OrientDbWebSession.get().getDatabase().getMetadata().getSchema().getClasses());
}
private void prepareResults()
{
prepareResults(selectedClassModel.getObject());
}
private void prepareResults(OClass oClass)
{
OQueryDataProvider<ODocument> provider = oClassIntrospector.getDataProviderForGenericSearch(oClass, getModel());
oClassIntrospector.defineDefaultSorting(provider, oClass);
GenericTablePanel<ODocument> tablePanel
= new GenericTablePanel<ODocument>("results", oClassIntrospector.getColumnsFor(oClass, true, DisplayMode.VIEW.asModel()), provider, 20);
OrienteerDataTable<ODocument, String> table = tablePanel.getDataTable();
table.addCommand(new AbstractCheckBoxEnabledCommand<ODocument>(new ResourceModel("command.select"), table)
{
{
setBootstrapType(BootstrapType.SUCCESS);
setIcon(FAIconType.hand_o_right);
setAutoNotify(false);
}
@Override
protected void performMultiAction(AjaxRequestTarget target, List<ODocument> objects) {
if(onSelect(target, objects, false)) modal.close(target);
}
});
if (isMultiValue) {
table.addCommand(new AbstractCheckBoxEnabledCommand<ODocument>(new ResourceModel("command.selectAndSearchMode"), table) {
{
setBootstrapType(BootstrapType.SUCCESS);
setIcon(FAIconType.hand_o_right);
setAutoNotify(false);
}
@Override
protected void performMultiAction(AjaxRequestTarget target, List<ODocument> objects) {
if (onSelect(target, objects, true)) {
resetSelection();
target.add(getTable());
target.focusComponent(queryField);
target.appendJavaScript("$('#"+queryField.getMarkupId()+"').select()");
}
}
});
}
resultsContainer.addOrReplace(tablePanel);
}
protected abstract boolean onSelect(AjaxRequestTarget target, List<ODocument> objects, boolean selectMore);
}