package com.constellio.app.modules.rm.ui.pages.retentionRule;
import com.constellio.app.modules.rm.model.CopyRetentionRule;
import com.constellio.app.modules.rm.model.enums.RetentionRuleScope;
import com.constellio.app.modules.rm.ui.components.retentionRule.DocumentCopyRetentionRuleTable;
import com.constellio.app.modules.rm.ui.components.retentionRule.DocumentDefaultCopyRetentionRuleTable;
import com.constellio.app.modules.rm.ui.components.retentionRule.FolderCopyRetentionRuleTable;
import com.constellio.app.modules.rm.ui.components.retentionRule.ListAddRemoveRetentionRuleDocumentTypeField;
import com.constellio.app.modules.rm.ui.entities.RetentionRuleVO;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.components.RecordFieldFactory;
import com.constellio.app.ui.framework.components.RecordForm;
import com.constellio.app.ui.framework.components.fields.enumWithSmallCode.EnumWithSmallCodeComboBox;
import com.constellio.app.ui.framework.components.fields.list.ListAddRemoveRecordLookupField;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.app.ui.util.ComponentTreeUtils;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.Field;
import java.util.List;
import static com.constellio.app.ui.i18n.i18n.$;
public class AddEditRetentionRuleViewImpl extends BaseViewImpl implements AddEditRetentionRuleView {
private final AddEditRetentionRulePresenter presenter;
private RetentionRuleVO rule;
private RetentionRuleForm form;
private Boolean delayedDisposalTypeVisibleForDocumentTypes;
public AddEditRetentionRuleViewImpl() {
presenter = new AddEditRetentionRulePresenter(this);
}
@Override
protected void initBeforeCreateComponents(ViewChangeEvent event) {
presenter.forParams(event.getParameters());
}
@Override
public void setRetentionRule(RetentionRuleVO retentionRuleVO) {
this.rule = retentionRuleVO;
}
@Override
protected String getTitle() {
return $(presenter.isAddView() ? "AddEditRetentionRuleView.addViewTitle" : "AddEditRetentionRuleView.editViewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
this.form = initForm();
return form;
}
@Override
protected void afterViewAssembled(ViewChangeEvent event) {
presenter.viewAssembled();
}
@Override
public void reloadForm() {
RetentionRuleForm newForm = initForm();
replaceComponent(this.form, newForm);
this.form = newForm;
}
@Override
protected boolean isFullWidthIfActionMenuAbsent() {
return true;
}
private RetentionRuleForm initForm() {
RetentionRuleForm form = new RetentionRuleForm(rule);
if (delayedDisposalTypeVisibleForDocumentTypes != null) {
setDisposalTypeVisibleForDocumentTypes(delayedDisposalTypeVisibleForDocumentTypes);
}
return form;
}
@Override
public void setDisposalTypeVisibleForDocumentTypes(boolean visible) {
if (form != null) {
ListAddRemoveRetentionRuleDocumentTypeField documentTypesField = form.getDocumentTypesField();
if (documentTypesField != null) {
documentTypesField.setDisposalTypeVisible(visible);
}
} else {
delayedDisposalTypeVisibleForDocumentTypes = visible;
}
}
private class RetentionRuleForm extends RecordForm {
public RetentionRuleForm(RecordVO record) {
super(record, new RetentionRuleFieldFactory());
}
@Override
protected void saveButtonClick(RecordVO record) {
presenter.saveButtonClicked();
}
@Override
protected void cancelButtonClick(RecordVO viewObject) {
presenter.cancelButtonClicked();
}
public ListAddRemoveRetentionRuleDocumentTypeField getDocumentTypesField() {
return ComponentTreeUtils.getFirstChild(this, ListAddRemoveRetentionRuleDocumentTypeField.class);
}
}
private class RetentionRuleFieldFactory extends RecordFieldFactory {
private DocumentDefaultCopyRetentionRuleTable documentDefaultCopyRetentionRuleTable;
private void initDocumentDefaultCopyRetentionRuleTable(RecordVO recordVO) {
if (documentDefaultCopyRetentionRuleTable == null) {
documentDefaultCopyRetentionRuleTable = new DocumentDefaultCopyRetentionRuleTable((RetentionRuleVO) recordVO,
true, presenter) {
@Override
protected List<MetadataVO> getDateMetadataVOs() {
return presenter.getDateMetadataVOs(null);
}
};
}
}
@Override
public Field<?> build(RecordVO recordVO, MetadataVO metadataVO) {
Field<?> field;
switch (metadataVO.getLocalCode()) {
case RetentionRule.COPY_RETENTION_RULES:
if (presenter.isFoldersCopyRetentionRulesVisible()) {
field = new FolderCopyRetentionRuleTable((RetentionRuleVO) recordVO, true, presenter) {
@Override
protected void onDisposalTypeChange(CopyRetentionRule copyRetentionRule) {
presenter.disposalTypeChanged(copyRetentionRule);
}
@Override
protected List<MetadataVO> getDateMetadataVOs(String documentTypeId) {
return presenter.getFolderMetadataVOs();
}
};
postBuild(field, recordVO, metadataVO);
} else {
field = null;
}
break;
case RetentionRule.DOCUMENT_COPY_RETENTION_RULES:
if (presenter.isDocumentsCopyRetentionRulesVisible()) {
field = new DocumentCopyRetentionRuleTable((RetentionRuleVO) recordVO, true, presenter) {
@Override
protected List<MetadataVO> getDateMetadataVOs(String documentTypeId) {
return presenter.getDateMetadataVOs(documentTypeId);
}
};
postBuild(field, recordVO, metadataVO);
} else {
field = null;
}
break;
case RetentionRule.PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE:
if (presenter.isDefaultDocumentsCopyRetentionRulesVisible()) {
initDocumentDefaultCopyRetentionRuleTable(recordVO);
field = documentDefaultCopyRetentionRuleTable.getPrincipalCopyRetentionRuleField();
postBuild(field, recordVO, metadataVO);
} else {
field = null;
}
break;
case RetentionRule.SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE:
if (presenter.isDefaultDocumentsCopyRetentionRulesVisible()) {
initDocumentDefaultCopyRetentionRuleTable(recordVO);
field = documentDefaultCopyRetentionRuleTable.getSecondaryCopyRetentionRuleField();
postBuild(field, recordVO, metadataVO);
field.setVisible(false);
} else {
field = null;
}
break;
case RetentionRule.DOCUMENT_TYPES_DETAILS:
field = presenter.shouldDisplayDocumentTypeDetails() ? new ListAddRemoveRetentionRuleDocumentTypeField() : null;
if (field != null) {
postBuild(field, recordVO, metadataVO);
}
break;
case RetentionRuleVO.CATEGORIES:
field = buildCategoriesField(recordVO, metadataVO);
postBuild(field, recordVO, metadataVO);
break;
case RetentionRuleVO.UNIFORM_SUBDIVISIONS:
field = buildCategoriesField(recordVO, metadataVO);
postBuild(field, recordVO, metadataVO);
field.setVisible(presenter.areSubdivisionUniformEnabled());
field.setEnabled(presenter.areSubdivisionUniformEnabled());
break;
case RetentionRule.SCOPE:
if (presenter.isScopeVisible()) {
field = new EnumWithSmallCodeComboBox<>(RetentionRuleScope.class);
field.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
RetentionRuleScope scope = (RetentionRuleScope) event.getProperty().getValue();
presenter.scopeChanged(scope);
}
});
postBuild(field, recordVO, metadataVO);
} else {
field = null;
}
break;
default:
field = super.build(recordVO, metadataVO);
break;
}
return field;
}
private Field<?> buildCategoriesField(RecordVO recordVO, MetadataVO metadataVO) {
ListAddRemoveRecordLookupField field = (ListAddRemoveRecordLookupField) super.build(recordVO, metadataVO);
if (field != null) {
field.setIgnoreLinkability(true);
}
return field;
}
}
}