package com.constellio.app.ui.pages.management.facet;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.List;
import org.vaadin.maddon.ListContainer;
import com.constellio.app.modules.rm.ui.components.facet.FacetFieldFactory;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.components.fields.enumWithSmallCode.EnumWithSmallCodeOptionGroup;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.app.ui.pages.management.facet.AddEditFacetConfigurationPresenter.AvailableFacetFieldMetadata;
import com.constellio.app.ui.pages.management.facet.fields.FacetConfigurationForm;
import com.constellio.app.ui.pages.management.facet.fields.FacetConfigurationFormImpl;
import com.constellio.model.entities.records.wrappers.Facet;
import com.constellio.model.entities.records.wrappers.structure.FacetType;
import com.constellio.model.frameworks.validation.ValidationException;
import com.vaadin.data.Buffered.SourceException;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.Field;
import com.vaadin.ui.Table;
public class AddEditFacetConfigurationViewImpl extends BaseViewImpl implements AddEditFacetConfigurationView {
private AddEditFacetConfigurationPresenter presenter;
private String dataFieldCode;
private EnumWithSmallCodeOptionGroup facetType;
private boolean edit;
ComboBox dataFieldCombo;
private FacetConfigurationFormImpl form;
public AddEditFacetConfigurationViewImpl() {
presenter = new AddEditFacetConfigurationPresenter(this);
}
@Override
protected String getTitle() {
return $("AddEditFacetConfigurationView.viewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
form = newForm();
return form;
}
@Override
protected void initBeforeCreateComponents(ViewChangeEvent event) {
edit = !event.getParameters().isEmpty();
presenter.forParams(event.getParameters(), edit);
}
@Override
public FacetConfigurationForm getForm() {
return form;
}
private FacetConfigurationFormImpl newForm() {
dataFieldCode = presenter.getRecordVO().get(Facet.FIELD_DATA_STORE_CODE);
dataFieldCombo = new ComboBox($("AddEditFacetConfiguration.fieldDatastoreCode"));
dataFieldCombo.setContainerDataSource(new ListContainer<>(String.class));
dataFieldCombo.setValue(dataFieldCode);
for (AvailableFacetFieldMetadata metadata : presenter.getAvailableDataStoreCodes()) {
dataFieldCombo.addItem(metadata.getCode());
dataFieldCombo.setItemCaption(metadata.getCode(), metadata.getLabel());
}
dataFieldCombo.setEnabled(presenter.isDataStoreCodeNeeded());
dataFieldCombo.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
dataFieldCode = (String) event.getProperty().getValue();
if (dataFieldCode != null && !dataFieldCode.equals(presenter.getDataFieldCode())) {
presenter.reloadForm(dataFieldCode);
}
}
});
facetType = new EnumWithSmallCodeOptionGroup<>(FacetType.class);
facetType.setCaption($("AddEditFacetConfiguration.facetType"));
facetType.setEnabled(!edit);
facetType.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
FacetType type = (FacetType) event.getProperty().getValue();
if (presenter.getFacetType() != null && !presenter.getFacetType().equals(facetType.getValue())) {
presenter.setFacetType(type);
if (!presenter.isDataStoreCodeNeeded()) {
dataFieldCombo.setEnabled(false);
if (!edit) {
dataFieldCombo.setValue(null);
}
} else {
dataFieldCombo.setEnabled(true);
}
presenter.reloadForm(dataFieldCode);
}
}
});
form = new FacetConfigurationFormImpl(presenter.getRecordVO(),
new FacetFieldFactory(dataFieldCombo, facetType, presenter)) {
@Override
protected void saveButtonClick(RecordVO viewObject)
throws ValidationException {
if (presenter.getFacetType() == FacetType.FIELD) {
if (getCustomField(Facet.FIELD_VALUES_LABEL) != null) {
getCustomField(Facet.FIELD_VALUES_LABEL).saveValues();
}
} else if (presenter.getFacetType() == FacetType.QUERY) {
if (getCustomField(Facet.LIST_QUERIES) != null) {
getCustomField(Facet.LIST_QUERIES).saveValues();
}
}
presenter.saveButtonClicked(viewObject);
}
@Override
protected void cancelButtonClick(RecordVO viewObject) {
presenter.cancelButtonClicked();
}
@Override
public void reload() {
replaceComponent(this, newForm());
}
@Override
public void commit() {
for (Field<?> field : fieldGroup.getFields()) {
try {
field.commit();
} catch (SourceException | InvalidValueException e) {
}
}
}
};
return form;
}
public void displayInvalidQuery(List<Integer> invalids) {
Table valuesList = getForm().getCustomField(Facet.LIST_QUERIES).getValueListTable();
valuesList.setCellStyleGenerator(new FacetConfigurationValueCellStyleGenerator(invalids));
valuesList.refreshRowCache();
showErrorMessage($("AddEditFacetConfiguration.error.InvalidQuery"));
}
}