package com.constellio.app.modules.rm.ui.components.folder.fields;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.modules.rm.ui.builders.RetentionRuleToVOBuilder;
import com.constellio.app.modules.rm.ui.entities.RetentionRuleVO;
import com.constellio.app.modules.rm.wrappers.Category;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.modules.rm.wrappers.UniformSubdivision;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.components.table.BaseTable;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.vaadin.data.Property;
import com.vaadin.data.util.converter.Converter.ConversionException;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomField;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.ColumnGenerator;
public class FolderRetentionRuleFieldImpl extends CustomField<String> implements FolderRetentionRuleField {
private final String collection;
private List<String> options;
private Table table;
private String value;
public FolderRetentionRuleFieldImpl(String collection) {
this.collection = collection;
options = new ArrayList<>();
}
@Override
protected Component initContent() {
table = new BaseTable("FolderRetentionRuleTable");
new Generator().attachedTo(table);
table.setWidth("100%");
return table;
}
@Override
public Class<? extends String> getType() {
return String.class;
}
@Override
public List<String> getOptions() {
return options;
}
@Override
public void setOptions(List<String> options) {
this.options = options;
table.removeAllItems();
RetentionRuleToVOBuilder builder = getBuilder();
for (Record rule : loadRetentionRules(options)) {
table.addItem(builder.build(rule, VIEW_MODE.TABLE, sessionContext()));
}
table.setPageLength(options.size());
}
@Override
public String getFieldValue() {
return value;
}
@Override
public void setValue(String newFieldValue)
throws ReadOnlyException, ConversionException {
value = newFieldValue;
super.setValue(newFieldValue);
table.refreshRowCache();
}
@Override
public void setFieldValue(Object value) {
setValue((String) value);
}
@Override
protected void setInternalValue(String newValue) {
super.setInternalValue(newValue);
this.value = newValue;
}
private List<Record> loadRetentionRules(List<String> options) {
LogicalSearchQuery query = new LogicalSearchQuery(
from(types().getSchemaType(RetentionRule.SCHEMA_TYPE)).where(Schemas.IDENTIFIER).isIn(options))
.sortAsc(Schemas.CODE);
return modelLayerFactory().newSearchServices().search(query);
}
private RetentionRuleToVOBuilder getBuilder() {
return new RetentionRuleToVOBuilder(appLayerFactory(), types().getDefaultSchema(Category.SCHEMA_TYPE),
types().getDefaultSchema(UniformSubdivision.SCHEMA_TYPE));
}
private MetadataSchemaTypes types() {
return modelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection);
}
private AppLayerFactory appLayerFactory() {
return ConstellioFactories.getInstance().getAppLayerFactory();
}
private ModelLayerFactory modelLayerFactory() {
return ConstellioFactories.getInstance().getModelLayerFactory();
}
private SessionContext sessionContext() {
return ConstellioUI.getCurrentSessionContext();
}
private class Generator implements ColumnGenerator {
public static final String SELECTOR = "selector";
public static final String CODE = "code";
public static final String TITLE = "title";
public static final String DESCRIPTION = "description";
public Table attachedTo(Table table) {
table.addGeneratedColumn(SELECTOR, this);
table.setColumnHeader(SELECTOR, "");
table.setColumnWidth(SELECTOR, 50);
table.addGeneratedColumn(CODE, this);
table.setColumnHeader(CODE, $("FolderRetentionRuleField.code"));
table.addGeneratedColumn(TITLE, this);
table.setColumnHeader(TITLE, $("FolderRetentionRuleField.title"));
table.addGeneratedColumn(DESCRIPTION, this);
table.setColumnHeader(DESCRIPTION, $("FolderRetentionRuleField.description"));
table.setColumnExpandRatio(DESCRIPTION, 1);
return table;
}
@Override
public Object generateCell(Table source, Object itemId, Object columnId) {
if (columnId == null) {
return null;
}
RetentionRuleVO rule = (RetentionRuleVO) itemId;
switch ((String) columnId) {
case SELECTOR:
return generateSelectorCell(rule);
case CODE:
return generateCodeCell(rule);
case TITLE:
return generateTitleCell(rule);
case DESCRIPTION:
return generateDescriptionCell(rule);
}
return null;
}
private Object generateSelectorCell(final RetentionRuleVO rule) {
final CheckBox box = new CheckBox();
if (rule.getId().equals(getInternalValue())) {
box.setValue(true);
box.setEnabled(false);
}
box.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (box.getValue()) {
setValue(rule.getId());
}
}
});
return box;
}
private Object generateCodeCell(RetentionRuleVO rule) {
return rule.getCode();
}
private Object generateTitleCell(RetentionRuleVO rule) {
return rule.getTitle();
}
private Object generateDescriptionCell(RetentionRuleVO rule) {
return rule.getDescription();
}
}
}