package com.constellio.app.ui.pages.trash;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.ui.framework.buttons.BaseButton;
import com.constellio.app.ui.framework.containers.SchemaTypeVOLazyContainer;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.ColumnHeaderMode;
import com.vaadin.ui.VerticalLayout;
public class TrashViewImpl extends BaseViewImpl implements TrashView {
private final TrashPresenter presenter;
private ComboBox typeSelectionDropDown;
private Label recordsToDeleteMessage;
private Button restoreSelectionButton, deleteSelectionButton;
private Component logicallyDeletedRecordsTable;
private VerticalLayout vLayout;
public TrashViewImpl() {
presenter = new TrashPresenter(this);
}
@Override
protected String getTitle() {
return $("TrashView.viewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
vLayout = new VerticalLayout();
this.typeSelectionDropDown = buildTypeSelectionComponent();
vLayout.addComponent(this.typeSelectionDropDown);
this.recordsToDeleteMessage = buildRecordsToDeleteMessage();
vLayout.addComponent(this.recordsToDeleteMessage);
logicallyDeletedRecordsTable = buildTrashTable();
vLayout.addComponent(logicallyDeletedRecordsTable);
return vLayout;
}
private Label buildRecordsToDeleteMessage() {
Label message = new Label(
"<p style=\"color:red\">" + $("TrashView.recordsToDeleteMessage", presenter.getLogicallyDeletedRecordsCount())
+ "</p>",
ContentMode.HTML);
return message;
}
private ComboBox buildTypeSelectionComponent() {
ComboBox typeSelection = new ComboBox($("TrashView.typeSelection"));
Container typeContainer = new SchemaTypeVOLazyContainer(presenter.getSchemaTypes());
typeSelection.setContainerDataSource(typeContainer);
typeSelection.setItemCaptionPropertyId("label");
typeSelection.setNullSelectionAllowed(false);
typeSelection.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
presenter.clearSelectedRecords();
disableActionButtons();
rebuildTrashTable();
}
});
return typeSelection;
}
private void rebuildTrashTable() {
Component newTable = buildTrashTable();
vLayout.replaceComponent(this.logicallyDeletedRecordsTable, newTable);
this.logicallyDeletedRecordsTable = newTable;
}
private void disableActionButtons() {
this.restoreSelectionButton.setEnabled(false);
this.deleteSelectionButton.setEnabled(false);
}
@Override
protected List<Button> buildActionMenuButtons(ViewChangeEvent event) {
List<Button> buttons = super.buildActionMenuButtons(event);
buttons.add(buildRestoreSelectionButton());
buttons.add(buildDeleteSelectionButton());
return buttons;
}
private Button buildDeleteSelectionButton() {
deleteSelectionButton = new BaseButton($("TrashView.deleteSelection")) {
@Override
protected void buttonClick(ClickEvent event) {
Set<String> notDeleted = presenter.deleteSelection();
replaceDeletedRecordsTypeAndCountComponents();
rebuildTrashTable();
enableOrDisableActionButtons();
if (!notDeleted.isEmpty()) {
showMessage($("TrashView.deleteNotPossibleForRecords") + ":<br>" + StringUtils.join(notDeleted, "<br>"));
}
}
};
deleteSelectionButton.setEnabled(presenter.atLeastOneRecordSelected());
return deleteSelectionButton;
}
private Button buildRestoreSelectionButton() {
restoreSelectionButton = new BaseButton($("TrashView.restoreSelection")) {
@Override
protected void buttonClick(ClickEvent event) {
List<String> notRestored = presenter.restoreSelection();
replaceDeletedRecordsTypeAndCountComponents();
rebuildTrashTable();
enableOrDisableActionButtons();
if (!notRestored.isEmpty()) {
showMessage($("TrashView.restoreNotPossibleForRecords") + ":<br>" + StringUtils.join(notRestored, "<br>"));
}
}
};
restoreSelectionButton.setEnabled(presenter.atLeastOneRecordSelected());
return restoreSelectionButton;
}
private void rebuildRecordsToDeleteMessage() {
Label newMessage = buildRecordsToDeleteMessage();
vLayout.replaceComponent(this.recordsToDeleteMessage, newMessage);
this.recordsToDeleteMessage = newMessage;
}
@Override
public String getSelectedType() {
Item selection = typeSelectionDropDown.getItem(typeSelectionDropDown.getValue());
if (selection != null) {
return (String) selection.getItemProperty("code").getValue();
} else {
return null;
}
}
private Component buildTrashTable() {
if (StringUtils.isBlank(getSelectedType())) {
Table emptyTable = new Table();
emptyTable.setColumnHeaderMode(ColumnHeaderMode.HIDDEN);
emptyTable.setVisible(false);
return emptyTable;
}
Component trashRecords = new TrashRecordsTable(presenter.getTrashRecords(), presenter);
//trashRecords.header
return trashRecords;
}
@Override
public void enableOrDisableActionButtons() {
boolean atLeastOneRecordSelected = presenter.atLeastOneRecordSelected();
this.restoreSelectionButton.setEnabled(atLeastOneRecordSelected);
this.deleteSelectionButton.setEnabled(atLeastOneRecordSelected);
}
private void replaceDeletedRecordsTypeAndCountComponents() {
ComboBox newType = buildTypeSelectionComponent();
vLayout.replaceComponent(this.typeSelectionDropDown, newType);
this.typeSelectionDropDown = newType;
Label newMessage = buildRecordsToDeleteMessage();
vLayout.replaceComponent(this.recordsToDeleteMessage, newMessage);
this.recordsToDeleteMessage = newMessage;
}
}