package com.constellio.app.ui.pages.search; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.model.labelTemplate.LabelTemplate; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.StorageSpace; import com.constellio.app.ui.application.ConstellioUI; import com.constellio.app.ui.framework.buttons.BaseButton; import com.constellio.app.ui.framework.buttons.LabelsButton; import com.constellio.app.ui.framework.buttons.WindowButton; import com.constellio.app.ui.framework.components.ReportSelector; import com.constellio.app.ui.framework.components.ReportViewer.DownloadStreamResource; import com.constellio.app.ui.framework.components.SearchResultSimpleTable; import com.constellio.app.ui.framework.components.SearchResultTable; 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.RecordVOLazyContainer; import com.constellio.app.ui.pages.base.ConstellioHeader; import com.constellio.app.ui.pages.search.batchProcessing.BatchProcessingButton; import com.constellio.app.ui.pages.search.batchProcessing.BatchProcessingModifyingOneMetadataButton; import com.constellio.app.ui.pages.search.batchProcessing.BatchProcessingView; import com.constellio.app.ui.pages.search.criteria.Criterion; import com.constellio.data.utils.Factory; import com.constellio.model.entities.enums.BatchProcessingMode; import com.vaadin.event.ItemClickEvent; import com.vaadin.server.Page; import com.vaadin.server.Resource; import com.vaadin.server.StreamResource; import com.vaadin.ui.*; import com.vaadin.ui.themes.ValoTheme; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.entities.enums.BatchProcessingMode.ALL_METADATA_OF_SCHEMA; import static com.constellio.model.entities.enums.BatchProcessingMode.ONE_METADATA; public class AdvancedSearchViewImpl extends SearchViewImpl<AdvancedSearchPresenter> implements AdvancedSearchView, BatchProcessingView { public static final String BATCH_PROCESS_BUTTONSTYLE = "searchBatchProcessButton"; public static final String LABELS_BUTTONSTYLE = "searchLabelsButton"; private final ConstellioHeader header; private WindowButton batchProcessingButton; public AdvancedSearchViewImpl() { presenter = new AdvancedSearchPresenter(this); presenter.resetFacetAndOrder(); header = ConstellioUI.getCurrent().getHeader(); } @Override public List<Criterion> getSearchCriteria() { return header.getAdvancedSearchCriteria(); } @Override public void setSearchCriteria(List<Criterion> criteria) { header.setAdvancedSearchCriteria(criteria); } @SuppressWarnings("deprecation") @Override public void downloadBatchProcessingResults(final InputStream stream) { Resource resource = new DownloadStreamResource(new StreamResource.StreamSource() { @Override public InputStream getStream() { return stream; } }, "results.xls"); Page.getCurrent().open(resource, null, false); } @Override public void closeBatchProcessingWindow() { batchProcessingButton.getWindow().close(); } @Override public String getSchemaType() { return header.getAdvancedSearchSchemaType(); } @Override public void setSchemaType(String schemaTypeCode) { header.selectAdvancedSearchSchemaType(schemaTypeCode); } @Override public String getSearchExpression() { return header.getSearchExpression(); } @Override protected Component buildSearchUI() { return new VerticalLayout(); } @Override protected Component buildSummary(SearchResultTable results) { // TODO: Create an extension for this String schemaType = getSchemaType(); List<Component> selectionActions = new ArrayList<>(); batchProcessingButton = newBatchProcessingButton(); batchProcessingButton.addStyleName(ValoTheme.BUTTON_LINK); batchProcessingButton.addStyleName(BATCH_PROCESS_BUTTONSTYLE); if(ContainerRecord.SCHEMA_TYPE.equals(schemaType)) { batchProcessingButton.setVisible(presenter.getUser().has(RMPermissionsTo.MANAGE_CONTAINERS).globally()); } else if(StorageSpace.SCHEMA_TYPE.equals(schemaType)) { batchProcessingButton.setVisible(presenter.getUser().has(RMPermissionsTo.MANAGE_STORAGE_SPACES).globally()); } selectionActions.add(batchProcessingButton); if (schemaType.equals(Folder.SCHEMA_TYPE) || schemaType.equals(ContainerRecord.SCHEMA_TYPE)) { Factory<List<LabelTemplate>> customLabelTemplatesFactory = new Factory<List<LabelTemplate>>() { @Override public List<LabelTemplate> get() { return presenter.getCustomTemplates(); } }; Factory<List<LabelTemplate>> defaultLabelTemplatesFactory = new Factory<List<LabelTemplate>>() { @Override public List<LabelTemplate> get() { return presenter.getDefaultTemplates(); } }; final LabelsButton labelsButton = new LabelsButton($("SearchView.labels"), $("SearchView.printLabels"), customLabelTemplatesFactory, defaultLabelTemplatesFactory, getConstellioFactories().getAppLayerFactory(), getSessionContext().getCurrentCollection(), schemaType, getSelectedRecordIds(), getSessionContext().getCurrentUser().getUsername()); labelsButton.addStyleName(ValoTheme.BUTTON_LINK); labelsButton.addStyleName(LABELS_BUTTONSTYLE); labelsButton.addClickListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { labelsButton.setIds(getSelectedRecordIds()); } }); selectionActions.add(labelsButton); } if (schemaType.equals(Document.SCHEMA_TYPE)) { Component zipButton = new Link($("ReportViewer.download", "(zip)"), new DownloadStreamResource(presenter.getZippedContents(), presenter.getZippedContentsFilename())); zipButton.addStyleName(ValoTheme.BUTTON_LINK); selectionActions.add(zipButton); } if (schemaType.equals(Folder.SCHEMA_TYPE) || schemaType.equals(Document.SCHEMA_TYPE) || schemaType.equals(ContainerRecord.SCHEMA_TYPE)) { if (presenter.hasCurrentUserPermissionToUseCart()) { Button addToCart = buildAddToCartButton(); selectionActions.add(addToCart); } } Button switchViewMode = buildSwitchViewMode(); // TODO Build SelectAllButton properly for table mode // List<Component> actions = Arrays.asList( // buildSelectAllButton(), buildSavedSearchButton(), (Component) new ReportSelector(presenter)); List<Component> actions = Arrays.asList( buildSelectAllButton(), buildAddToSelectionButton(), buildSavedSearchButton(), (Component) new ReportSelector(presenter),switchViewMode); return results.createSummary(actions, selectionActions); } private String getSwitchViewModeCaption() { String caption; if (presenter.getResultsViewMode().equals(SearchResultsViewMode.DETAILED)) { caption = $("AdvancedSearchView.switchToTable"); } else { caption = $("AdvancedSearchView.switchToList"); } return caption; } private Button buildSwitchViewMode() { final Button switchViewModeButton = new Button(getSwitchViewModeCaption()); switchViewModeButton.addClickListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { if (presenter.getResultsViewMode().equals(SearchResultsViewMode.DETAILED)) { presenter.switchToTableView(); } else if(presenter.getResultsViewMode().equals(SearchResultsViewMode.TABLE)) { presenter.switchToDetailedView(); } switchViewModeButton.setCaption(getSwitchViewModeCaption()); } }); switchViewModeButton.addStyleName(ValoTheme.BUTTON_LINK); return switchViewModeButton; } @Override protected SearchResultTable buildResultTable() { if (presenter.getResultsViewMode().equals(SearchResultsViewMode.TABLE)) { return buildSimpleResultsTable(); } else { return buildDetailedResultsTable(); } } private SearchResultTable buildSimpleResultsTable() { final RecordVOLazyContainer container = new RecordVOLazyContainer(presenter.getSearchResultsAsRecordVOs()); SearchResultSimpleTable table = new SearchResultSimpleTable(container, presenter); table.setWidth("100%"); return table; } private WindowButton buildAddToCartButton() { WindowButton windowButton = new WindowButton($("SearchView.addToCart"), $("SearchView.selectCart")) { @Override protected Component buildWindowContent() { VerticalLayout layout = new VerticalLayout(); HorizontalLayout newCartLayout = new HorizontalLayout(); newCartLayout.setSpacing(true); newCartLayout.addComponent(new Label($("CartView.newCart"))); final BaseTextField newCartTitleField; newCartLayout.addComponent(newCartTitleField = new BaseTextField()); BaseButton saveButton; newCartLayout.addComponent(saveButton = new BaseButton($("save")) { @Override protected void buttonClick(ClickEvent event) { presenter.createNewCartAndAddToItRequested(newCartTitleField.getValue()); getWindow().close(); } }); saveButton.addStyleName(ValoTheme.BUTTON_PRIMARY); TabSheet tabSheet = new TabSheet(); final RecordVOLazyContainer ownedCartsContainer = new RecordVOLazyContainer(presenter.getOwnedCartsDataProvider()); RecordVOTable ownedCartsTable = new RecordVOTable($("CartView.ownedCarts"), ownedCartsContainer); ownedCartsTable.addItemClickListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { presenter.addToCartRequested(getSelectedRecordIds(), ownedCartsContainer.getRecordVO((int) event.getItemId())); getWindow().close(); } }); final RecordVOLazyContainer sharedCartsContainer = new RecordVOLazyContainer(presenter.getSharedCartsDataProvider()); RecordVOTable sharedCartsTable = new RecordVOTable($("CartView.sharedCarts"), sharedCartsContainer); sharedCartsTable.addItemClickListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { presenter.addToCartRequested(getSelectedRecordIds(), sharedCartsContainer.getRecordVO((int) event.getItemId())); getWindow().close(); } }); ownedCartsTable.setPageLength(Math.min(15, ownedCartsContainer.size())); ownedCartsTable.setWidth("100%"); sharedCartsTable.setPageLength(Math.min(15, ownedCartsContainer.size())); sharedCartsTable.setWidth("100%"); tabSheet.addTab(ownedCartsTable); tabSheet.addTab(sharedCartsTable); layout.addComponents(newCartLayout,tabSheet); return layout; } }; windowButton.addStyleName(ValoTheme.BUTTON_LINK); return windowButton; } private WindowButton newBatchProcessingButton() { BatchProcessingMode mode = presenter.getBatchProcessingMode(); if (mode.equals(ALL_METADATA_OF_SCHEMA)) { return new BatchProcessingButton(presenter, this); } else if (mode.equals(ONE_METADATA)) { return new BatchProcessingModifyingOneMetadataButton(presenter, this); } else { throw new RuntimeException("Unsupported mode " + mode); } } @Override public Boolean computeStatistics() { return presenter.computeStatistics(); } @Override protected String getTitle() { return $("searchResults"); } }