package com.constellio.app.modules.rm.ui.pages.retentionRule;
import static com.constellio.app.ui.i18n.i18n.$;
import org.vaadin.dialogs.ConfirmDialog;
import com.constellio.app.modules.rm.ui.components.retentionRule.ExportRetentionRulesLink;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.buttons.AddButton;
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.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.data.RecordVODataProvider;
import com.constellio.app.ui.handlers.OnEnterKeyHandler;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.vaadin.data.Container;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Alignment;
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 ListRetentionRulesViewImpl extends BaseViewImpl implements ListRetentionRulesView {
public static final String STYLE_NAME = "list-retention-rules";
private HorizontalLayout searchTextAndSearchButtonLayout;
private HorizontalLayout searchLayout;
private final ListRetentionRulesPresenter presenter;
private RecordVODataProvider dataProvider;
private ExportRetentionRulesLink exportRetentionRulesLink;
public ListRetentionRulesViewImpl() {
presenter = new ListRetentionRulesPresenter(this);
}
@Override
protected void initBeforeCreateComponents(ViewChangeEvent event) {
presenter.viewAssembled();
}
@Override
public void setDataProvider(RecordVODataProvider dataProvider) {
this.dataProvider = dataProvider;
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.backButtonClicked();
}
};
}
@Override
protected String getTitle() {
return $("ListRetentionRulesView.viewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
Button add = new AddButton() {
@Override
protected void buttonClick(ClickEvent event) {
presenter.addButtonClicked();
}
};
exportRetentionRulesLink = new ExportRetentionRulesLink($("ListRetentionRulesView.exportRetentionRules"));
RecordVOTable table = new RecordVOTable($("ListRetentionRulesView.tableTitle", dataProvider.size()), buildContainer());
table.setColumnHeader(ButtonsContainer.DEFAULT_BUTTONS_PROPERTY_ID, "");
table.setColumnWidth(ButtonsContainer.DEFAULT_BUTTONS_PROPERTY_ID, 120);
table.setSizeFull();
table.setPageLength(Math.min(15, dataProvider.size()));
setDefaultOrderBy(presenter.getDefaultOrderField(), dataProvider, table);
table.sort();
buildSearch();
searchTextAndSearchButtonLayout = new HorizontalLayout();
searchTextAndSearchButtonLayout.setWidth("100%");
searchTextAndSearchButtonLayout.addComponents(searchLayout);
searchTextAndSearchButtonLayout.addComponents(searchLayout, exportRetentionRulesLink);
searchTextAndSearchButtonLayout.setComponentAlignment(exportRetentionRulesLink, Alignment.TOP_RIGHT);
searchTextAndSearchButtonLayout.setSpacing(true);
VerticalLayout mainLayout = new VerticalLayout();
mainLayout.addComponents(searchTextAndSearchButtonLayout, add, table);
mainLayout.setComponentAlignment(add, Alignment.TOP_RIGHT);
mainLayout.setExpandRatio(table, 1);
mainLayout.setSpacing(true);
mainLayout.setSizeFull();
return mainLayout;
}
private void setDefaultOrderBy(String localCode, RecordVODataProvider dataProvider, Table table) {
Object[] properties = { dataProvider.getSchema().getMetadata(localCode) };
boolean[] ordering = { true };
table.sort(properties, ordering);
}
private Container buildContainer() {
final ButtonsContainer<RecordVOLazyContainer> rules = new ButtonsContainer<>(new RecordVOLazyContainer(dataProvider));
rules.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
RecordVO recordVO = rules.getNestedContainer().getRecordVO((int) itemId);
presenter.displayButtonClicked(recordVO);
}
};
}
});
rules.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new EditButton() {
@Override
protected void buttonClick(ClickEvent event) {
RecordVO recordVO = rules.getNestedContainer().getRecordVO((int) itemId);
presenter.editButtonClicked(recordVO);
}
};
}
});
rules.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
DeleteButton deleteButton = new DeleteButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
RecordVO recordVO = rules.getNestedContainer().getRecordVO((int) itemId);
presenter.deleteButtonClicked(recordVO);
}
};
return deleteButton;
}
});
return rules;
}
private void buildSearch() {
searchLayout = new HorizontalLayout();
searchLayout.setSpacing(true);
final TextField searchField = new BaseTextField();
searchField.focus();
searchField.setNullRepresentation("");
Button searchButton = new SearchButton();
searchButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.search(searchField.getValue());
}
});
searchLayout.addComponents(searchField, searchButton);
OnEnterKeyHandler onEnterHandler = new OnEnterKeyHandler() {
@Override
public void onEnterKeyPressed() {
presenter.search(searchField.getValue());
}
};
onEnterHandler.installOn(searchField);
}
@Override
protected boolean isFullWidthIfActionMenuAbsent() {
return true;
}
}