package com.constellio.app.ui.pages.management.taxonomy;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.vaadin.dialogs.ConfirmDialog;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.buttons.DeleteButton;
import com.constellio.app.ui.framework.buttons.DisplayButton;
import com.constellio.app.ui.framework.buttons.EditButton;
import com.constellio.app.ui.framework.buttons.SearchButton;
import com.constellio.app.ui.framework.components.breadcrumb.BaseBreadcrumbTrail;
import com.constellio.app.ui.framework.components.fields.BaseTextField;
import com.constellio.app.ui.framework.components.table.RecordVOTable;
import com.constellio.app.ui.framework.containers.ButtonsContainer;
import com.constellio.app.ui.framework.containers.ButtonsContainer.ContainerButton;
import com.constellio.app.ui.framework.containers.RecordVOLazyContainer;
import com.constellio.app.ui.framework.containers.TaxonomyConceptsWithChildrenCountContainer;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.handlers.OnEnterKeyHandler;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.model.entities.schemas.Schemas;
import com.vaadin.data.Container;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
public class TaxonomyManagementSearchViewImpl extends BaseViewImpl implements TaxonomyManagementSearchView {
private VerticalLayout layout;
private HorizontalLayout searchLayout;
private TaxonomyManagementSearchPresenter presenter;
public static final String STYLE_NAME = "display-taxonomy";
private VerticalLayout mainLayout;
public TaxonomyManagementSearchViewImpl() {
this.presenter = new TaxonomyManagementSearchPresenter(this);
}
@Override
protected String getTitle() {
return presenter.getTaxonomy().getTitle();
}
@Override
protected void initBeforeCreateComponents(ViewChangeEvent event) {
super.initBeforeCreateComponents(event);
presenter.forParams(event.getParameters());
}
@Override
protected void afterViewAssembled(ViewChangeEvent event) {
presenter.viewAssembled();
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
mainLayout = new VerticalLayout();
mainLayout.setSizeFull();
mainLayout.setSpacing(true);
buildSearchTaxonomies();
mainLayout.addComponents(searchLayout);
VerticalLayout taxonomyDisplayLayout = new VerticalLayout(buildConceptsTables());
taxonomyDisplayLayout.setSizeFull();
taxonomyDisplayLayout.setSpacing(true);
mainLayout.addComponent(taxonomyDisplayLayout);
return mainLayout;
}
private Component buildConceptsTables() {
layout = new VerticalLayout();
for (final RecordVODataProvider dataProvider : presenter.getDataProviders()) {
Container recordsContainer = new RecordVOLazyContainer(dataProvider);
TaxonomyConceptsWithChildrenCountContainer adaptedContainer = new TaxonomyConceptsWithChildrenCountContainer(
recordsContainer, getCollection(), getSessionContext().getCurrentUser().getUsername(),
presenter.getTaxonomy().getCode(), dataProvider.getSchema().getCode().split("_")[0]) {
@Override
protected Collection<?> getOwnContainerPropertyIds() {
return new ArrayList<>();
}
};
ButtonsContainer buttonsContainer = new ButtonsContainer<>(adaptedContainer, "buttons");
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.displayButtonClicked(entity);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new EditButton() {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.editButtonClicked(entity);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
DeleteButton deleteButton = new DeleteButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.deleteButtonClicked(entity);
}
};
return deleteButton;
}
});
// TODO Implement deleteLogically for taxonomy concepts
recordsContainer = buttonsContainer;
RecordVOTable table = new RecordVOTable($(dataProvider.getSchema().getLabel(), dataProvider.getSchema().getCode()),
recordsContainer);
table.setWidth("100%");
table.setId("childrenTable");
table.setColumnHeader("buttons", "");
table.setColumnHeader("taxonomyChildrenCount", $("TaxonomyManagementView.childrenCount"));
table.setColumnWidth(dataProvider.getSchema().getCode() + "_id", 120);
table.setColumnWidth("buttons", 120);
table.setColumnExpandRatio(dataProvider.getSchema().getCode() + "_" + Schemas.TITLE_CODE, 1.0f);
table.setPageLength(table.getItemIds().size());
setDefaultOrderBy(presenter.getDefaultOrderField(), dataProvider, table);
table.sort();
layout.addComponents(table);
}
return layout;
}
private void setDefaultOrderBy(String localCode, RecordVODataProvider dataProvider, Table table) {
Object[] properties = { dataProvider.getSchema().getMetadata(localCode) };
boolean[] ordering = { true };
table.sort(properties, ordering);
}
private void buildSearchTaxonomies() {
searchLayout = new HorizontalLayout();
final TextField searchField = new BaseTextField();
searchField.setValue(presenter.getQueryExpression());
searchField.focus();
searchField.setNullRepresentation("");
Button searchButton = new SearchButton();
searchButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.searchConcept(searchField.getValue());
}
});
searchLayout.addComponents(searchField, searchButton);
OnEnterKeyHandler onEnterHandler = new OnEnterKeyHandler() {
@Override
public void onEnterKeyPressed() {
presenter.searchConcept(searchField.getValue());
}
};
onEnterHandler.installOn(searchField);
}
@Override
protected List<Button> buildActionMenuButtons(ViewChangeEvent event) {
List<Button> actionMenuButtons = new ArrayList<Button>();
return actionMenuButtons;
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.backButtonClicked();
}
};
}
@Override
public void refreshTable() {
layout.removeAllComponents();
layout.addComponent(buildConceptsTables());
}
@Override
protected BaseBreadcrumbTrail buildBreadcrumbTrail() {
return null;
}
}