package com.constellio.app.ui.pages.trash;
import static com.constellio.app.ui.i18n.i18n.$;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.extensions.AppLayerCollectionExtensions;
import com.constellio.app.extensions.records.RecordNavigationExtension;
import com.constellio.app.extensions.records.params.NavigationParams;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.MetadataSchemaTypeToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.framework.data.SchemaTypeVODataProvider;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.trash.TrashServices;
import com.constellio.model.services.trash.TrashServices.RecordsIdsAndTitles;
import com.vaadin.server.Page;
import com.vaadin.ui.Table;
public class TrashPresenter extends BasePresenter<TrashView> {
Boolean allItemsSelected = false;
Boolean allItemsDeselected = false;
Set<String> selectedRecordIds = new HashSet<>();
private RecordVODataProvider dataProvider;
private transient TrashServices trashServices;
public TrashPresenter(TrashView trashView) {
super(trashView);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return user.has(CorePermissions.MANAGE_TRASH).globally();
}
public boolean isRecordSelected(RecordVO recordVO) {
return !allItemsDeselected && (allItemsSelected || selectedRecordIds.contains(recordVO.getId()));
}
public void recordSelectionChanged(RecordVO record, boolean selected) {
allItemsSelected = false;
allItemsDeselected = false;
String recordId = record.getId();
if (!selected && selectedRecordIds.contains(recordId)) {
selectedRecordIds.remove(recordId);
} else if (selected && !selectedRecordIds.contains(recordId)) {
selectedRecordIds.add(recordId);
}
view.enableOrDisableActionButtons();
}
public boolean atLeastOneRecordSelected() {
return !allItemsDeselected && (allItemsSelected || selectedRecordIds.size() != 0);
}
public RecordVODataProvider getTrashRecords() {
MetadataSchema currentDefaultSchema = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(collection)
.getDefaultSchema(view.getSelectedType());
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(currentDefaultSchema, VIEW_MODE.TABLE, asList(Schemas.LOGICALLY_DELETED_ON.getLocalCode()),
view.getSessionContext(), true);
return dataProvider = new RecordVODataProvider(schemaVO, new RecordToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return TrashPresenter.this.getQuery();
}
};
}
private LogicalSearchQuery getQuery() {
return trashServices().getTrashRecordsQueryForType(view.getSelectedType(), getCurrentUser());
}
private TrashServices trashServices() {
if (trashServices == null) {
trashServices = new TrashServices(appLayerFactory.getModelLayerFactory(), collection);
}
return trashServices;
}
public void clearSelectedRecords() {
allItemsSelected = false;
allItemsDeselected = false;
this.selectedRecordIds.clear();
}
public SchemaTypeVODataProvider getSchemaTypes() {
final List<String> codes = new ArrayList<>(
trashServices().getTypesWithLogicallyDeletedRecords(collection, getCurrentUser()));
return new SchemaTypeVODataProvider(new MetadataSchemaTypeToVOBuilder(), appLayerFactory, collection) {
@Override
protected boolean isAccepted(MetadataSchemaType type) {
return codes.contains(type.getCode());
}
};
}
public List<String> restoreSelection() {
Set<String> selection = computeSelection();
if (StringUtils.isBlank(view.getSelectedType()) || selection.isEmpty()) {
return asList();
}
List<String> returnSet = trashServices().restoreSelection(selection, getCurrentUser());
this.selectedRecordIds.clear();
return returnSet;
}
public Set<String> deleteSelection() {
Set<String> selection = computeSelection();
if (StringUtils.isBlank(view.getSelectedType()) || selection.isEmpty()) {
return new HashSet<>();
}
Set<String> notDeleted = trashServices().deleteSelection(selection, getCurrentUser());
this.selectedRecordIds.clear();
return notDeleted;
}
public long getLogicallyDeletedRecordsCount() {
return trashServices().getLogicallyDeletedRecordsCount(collection, getCurrentUser());
}
public Boolean physicalDeleteFailed(RecordVO recordVO) {
Record record = recordServices().getDocumentById(recordVO.getId());
Boolean errorOnPhysicalDelete = record.get(Schemas.ERROR_ON_PHYSICAL_DELETION);
return errorOnPhysicalDelete != null && errorOnPhysicalDelete;
}
public void displayButtonClicked(RecordVO entity) {
AppLayerCollectionExtensions extensions = appLayerFactory.getExtensions().forCollection(collection);
List<RecordNavigationExtension> recordNavigationExtensions = extensions.recordNavigationExtensions.getExtensions();
String schemaTypeCode = SchemaUtils.getSchemaTypeCode(entity.getSchema().getCode());
for (RecordNavigationExtension extension : recordNavigationExtensions) {
if (extension.isViewForSchemaTypeCode(schemaTypeCode)) {
NavigationParams navigationParams = new NavigationParams(ConstellioUI.getCurrent().navigate(), entity,
schemaTypeCode, Page.getCurrent(),
//FIXME
new Table());
extension.navigateToView(navigationParams);
break;
}
}
}
public String getRelatedRecordsMessage(RecordVO recordVO) {
RecordsIdsAndTitles relatedRecordsIdsAndTitles = trashServices().getRelatedRecords(recordVO.getId(), getCurrentUser());
Set<String> relatedRecordIds = relatedRecordsIdsAndTitles.getRecordsIds();
Set<String> relatedRecordTitles = relatedRecordsIdsAndTitles.getRecordsTitles();
if (relatedRecordIds.isEmpty()) {
return $("TrashView.noRelatedRecord");
} else {
return $("TrashView.relatedRecordIds") + "<br>" + StringUtils.join(relatedRecordIds, "<br>")
+ "<br>" + $("TrashView.relatedRecordTitles") + "<br>" + StringUtils.join(relatedRecordTitles, "<br>");
}
}
Set<String> computeSelection() {
Set<String> selection = new HashSet<>();
if (allItemsSelected) {
LogicalSearchQuery query = getQuery();
SearchServices searchServices = searchServices();
selection.addAll(searchServices.searchRecordIds(query));
} else if (!allItemsDeselected) {
selection.addAll(selectedRecordIds);
}
return selection;
}
boolean isAllItemsSelected() {
return allItemsSelected;
}
boolean isAllItemsDeselected() {
return allItemsDeselected;
}
void selectAllClicked() {
allItemsSelected = true;
allItemsDeselected = false;
view.enableOrDisableActionButtons();
}
void deselectAllClicked() {
allItemsSelected = false;
allItemsDeselected = true;
view.enableOrDisableActionButtons();
}
}