package com.constellio.app.ui.pages.search.batchProcessing;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.framework.buttons.BaseButton;
import com.constellio.app.ui.framework.buttons.WindowButton;
import com.constellio.app.ui.framework.components.MetadataFieldFactory;
import com.constellio.app.ui.pages.search.AdvancedSearchPresenter;
import com.constellio.app.ui.pages.search.AdvancedSearchView;
import com.vaadin.data.Property;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.ui.*;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.themes.ValoTheme;
import static com.constellio.app.ui.i18n.i18n.$;
public class BatchProcessingModifyingOneMetadataButton extends WindowButton {
private MetadataFieldFactory factory;
private HorizontalLayout valueArea;
private ComboBox metadata;
private Field value;
private Button process;
private AdvancedSearchPresenter presenter;
private final AdvancedSearchView view;
public BatchProcessingModifyingOneMetadataButton(AdvancedSearchPresenter presenter, AdvancedSearchView view) {
super($("AdvancedSearchView.batchProcessing"), $("AdvancedSearchView.batchProcessing"));
this.presenter = presenter;
factory = new MetadataFieldFactory();
this.view = view;
}
@Override
protected Component buildWindowContent() {
Component windowContent;
if (!presenter.hasWriteAccessOnAllRecords()) {
windowContent = new Label($("AdvancedSearchView.requireWriteAccess"));
} else if (presenter.isSearchResultsSelectionForm()) {
windowContent = buildSearchResultsSelectionForm();
} else {
windowContent = buildBatchProcessingForm();
}
return windowContent;
}
private Component buildSearchResultsSelectionForm() {
getWindow().setHeight("220px");
VerticalLayout layout = new VerticalLayout(buildMetadataComponent(), valueArea, process);
Panel panel = new Panel();
layout = new VerticalLayout();
layout.setSizeFull();
layout.setSpacing(true);
Label questionLabel = new Label($("AdvancedSearch.batchProcessingRecordSelection"));
BaseButton allSearchResultsButton = new BaseButton($("AdvancedSearchView.allSearchResults")) {
@Override
protected void buttonClick(ClickEvent event) {
presenter.allSearchResultsButtonClicked();
getWindow().setContent(buildBatchProcessingForm());
getWindow().setHeight(BatchProcessingModifyingOneMetadataButton.this.getConfiguration().getHeight());
getWindow().center();
}
};
BaseButton selectedSearchResultsButton = new BaseButton($("AdvancedSearchView.selectedSearchResults")) {
@Override
protected void buttonClick(ClickEvent event) {
presenter.selectedSearchResultsButtonClicked();
getWindow().setContent(buildBatchProcessingForm());
getWindow().setHeight(BatchProcessingModifyingOneMetadataButton.this.getConfiguration().getHeight());
getWindow().center();
}
};
layout.addComponents(questionLabel, allSearchResultsButton, selectedSearchResultsButton);
panel.setContent(layout);
panel.setSizeFull();
return panel;
}
private Component buildBatchProcessingForm() {
Label label = new Label($("AdvancedSearchView.batchProcessValue"));
value = null;
valueArea = new HorizontalLayout(label);
valueArea.setSpacing(true);
process = new Button($("AdvancedSearchView.batchProcessStart"), new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
MetadataVO metadataVO = (MetadataVO) metadata.getValue();
presenter.batchEditRequested(view.getSelectedRecordIds(), metadataVO.getCode(),
((AbstractField) value).getConvertedValue());
getWindow().close();
view.showMessage($("AdvancedSearchView.batchProcessConfirm"));
}
});
process.addStyleName(ValoTheme.BUTTON_PRIMARY);
VerticalLayout layout = new VerticalLayout(buildMetadataComponent(), valueArea, process);
layout.setComponentAlignment(process, Alignment.MIDDLE_RIGHT);
layout.setSpacing(true);
return layout;
}
private Component buildMetadataComponent() {
Label label = new Label($("AdvancedSearchView.batchProcessField"));
metadata = new ComboBox();
metadata.setItemCaptionMode(AbstractSelect.ItemCaptionMode.EXPLICIT);
metadata.setNullSelectionAllowed(false);
for (MetadataVO metadata : presenter.getMetadataAllowedInBatchEdit()) {
this.metadata.addItem(metadata);
this.metadata.setItemCaption(metadata, metadata.getLabel());
}
metadata.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (value != null) {
valueArea.removeComponent(value);
}
value = buildValueField();
valueArea.addComponent(value);
}
});
HorizontalLayout layout = new HorizontalLayout(label, metadata);
layout.setSpacing(true);
return layout;
}
private Field buildValueField() {
final Field field = factory.build((MetadataVO) metadata.getValue());
field.setCaption(null);
field.setWidthUndefined();
field.setPropertyDataSource(new ObjectProperty<>(null, Object.class));
return field;
}
}