package com.constellio.app.ui.pages.management.labels;
import com.constellio.app.modules.rm.services.reports.ReportUtils;
import com.constellio.app.modules.rm.ui.components.document.fields.CustomDocumentField;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.PrintableLabel;
import com.constellio.app.ui.entities.LabelVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.components.MetadataFieldFactory;
import com.constellio.app.ui.framework.components.RecordFieldFactory;
import com.constellio.app.ui.framework.components.RecordForm;
import com.constellio.app.ui.framework.components.fields.BaseComboBox;
import com.constellio.app.ui.i18n.i18n;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.records.Record;
import com.constellio.model.frameworks.validation.ValidationException;
import com.vaadin.data.Buffered;
import com.vaadin.data.Property;
import com.vaadin.data.Validator;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.ui.*;
import org.apache.commons.lang.StringUtils;
import java.util.List;
import java.util.Map;
import static com.constellio.app.ui.i18n.i18n.$;
/**
* Created by Nicolas D'Amours & Charles Blanchette on 2017-01-20.
*/
public class AddEditLabelViewImpl extends BaseViewImpl implements AddEditLabelView {
private List<LabelVO> listLabel;
private TabSheet tabSheet;
private AddEditLabelPresenter presenter = new AddEditLabelPresenter(this);
private Component folderDisplay, containerDisplay;
private VerticalLayout mainLayout;
private ReportUtils ru;
private Button addLabelButton;
private LabelFormImpl recordForm;
private RecordVO recordVO;
@Override
public void setLabels(List<LabelVO> list) {
}
@Override
public void addLabels(LabelVO... items) {
}
public void setRecord(RecordVO recordVO) {
this.recordVO = recordVO;
}
@Override
protected void initBeforeCreateComponents(ViewChangeListener.ViewChangeEvent event) {
if (StringUtils.isNotEmpty(event.getParameters())) {
Map<String, String> paramsMap = ParamUtils.getParamsMap(event.getParameters());
recordVO = presenter.getRecordVO(paramsMap.get("id"), RecordVO.VIEW_MODE.FORM);
}
}
@Override
protected Component buildMainComponent(ViewChangeListener.ViewChangeEvent event) {
return newForm();
}
private LabelFormImpl newForm() {
if (this.recordVO == null) {
Record r = presenter.newRecord();
RecordToVOBuilder voBuilder = new RecordToVOBuilder();
this.recordVO = voBuilder.build(r, RecordVO.VIEW_MODE.FORM, getSessionContext());
}
recordForm = new LabelFormImpl(recordVO, new LabelRecordFieldFactory()) {
@Override
protected void saveButtonClick(RecordVO viewObject)
throws ValidationException {
try {
presenter.saveButtonClicked(recordVO);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void cancelButtonClick(RecordVO viewObject) {
presenter.cancelButtonClicked();
}
@Override
public void reload() {
recordForm = newForm();
AddEditLabelViewImpl.this.replaceComponent(this, recordForm);
}
@Override
public void commit() {
for (Field<?> field : fieldGroup.getFields()) {
try {
field.commit();
} catch (Buffered.SourceException | Validator.InvalidValueException e) {
}
}
}
};
for (final Field<?> field : recordForm.getFields()) {
if (field instanceof CustomDocumentField) {
field.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
presenter.customFieldValueChanged((CustomDocumentField<?>) field);
}
});
}
}
return recordForm;
}
@Override
protected String getTitle() {
String title = recordVO == null ? "AddLabelView.title" : "EditLabelView.title";
return $(title);
}
private void prepareTypeField(final Field<String> field) {
field.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
presenter.typeSelected(field.getValue());
}
});
}
class LabelForm extends RecordForm {
public LabelForm(RecordVO record) {
super(record);
}
@SuppressWarnings("unchecked")
public Field<String> getTypeField() {
return (Field<String>) getField(PrintableLabel.TYPE_LABEL);
}
@Override
protected void saveButtonClick(RecordVO viewObject) throws ValidationException {
}
@Override
protected void cancelButtonClick(RecordVO viewObject) {
}
}
class LabelRecordFieldFactory extends RecordFieldFactory {
@Override
public Field<?> build(RecordVO recordVO, MetadataVO metadataVO) {
return metadataVO.getCode().equals(PrintableLabel.SCHEMA_NAME + "_" + PrintableLabel.TYPE_LABEL) ? createComboBox(metadataVO) : new MetadataFieldFactory().build(metadataVO);
}
public ComboBox createComboBox(MetadataVO metadataVO) {
ComboBox monComboBox = new BaseComboBox();
Object valeur1 = Folder.SCHEMA_TYPE;
Object valeur2 = ContainerRecord.SCHEMA_TYPE;
monComboBox.addItems(valeur1, valeur2);
monComboBox.setItemCaption(valeur1, $("AddEditTaxonomyView.classifiedObject.folder"));
monComboBox.setItemCaption(valeur2, $("DecommissioningListView.folderDetails.container"));
monComboBox.setTextInputAllowed(false);
monComboBox.setCaption(metadataVO.getLabel(i18n.getLocale()));
return monComboBox;
}
}
}