package com.constellio.app.modules.rm.ui.components.container;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.modules.rm.ui.components.container.fields.ContainerStorageSpaceLookupField;
import com.constellio.app.modules.rm.ui.pages.containers.edit.AddEditContainerPresenter;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.buttons.WindowButton;
import com.constellio.app.ui.framework.components.BaseForm;
import com.constellio.app.ui.framework.components.RecordFieldFactory;
import com.constellio.app.ui.framework.components.RecordForm;
import com.constellio.app.ui.framework.components.fields.number.BaseIntegerField;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.Field;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.VerticalLayout;
/**
* Created by Constellio on 2017-01-11.
*/
public abstract class ContainerFormImpl extends RecordForm implements ContainerForm {
public ContainerFormImpl(RecordVO record, final AddEditContainerPresenter presenter) {
this(record, new ContainerFieldFactory((String) record.get(ContainerRecord.TYPE), (Double) record.get(ContainerRecord.CAPACITY), presenter));
if(presenter.isMultipleMode()) {
WindowButton newSaveButton = new WindowButton(saveButton.getCaption(), saveButton.getCaption()) {
@Override
public void buttonClick(ClickEvent event) {
super.buttonClick(event);
}
@Override
protected Component buildWindowContent() {
VerticalLayout mainLayout = new VerticalLayout();
mainLayout.setSpacing(true);
final BaseIntegerField integerField = new BaseIntegerField($("AddEditContainerView.numberOfContainer"));
integerField.setRequired(true);
HorizontalLayout buttonLayout = new HorizontalLayout();
buttonLayout.setSpacing(true);
Button newLayoutSaveButton = new Button(saveButton.getCaption());
newLayoutSaveButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
int numberOfContainer = integerField.getValue() != null && integerField.getValue().matches("^\\d+$") ? Integer.parseInt(integerField.getValue()) : 0;
presenter.setNumberOfContainer(numberOfContainer);
callTrySave();
getWindow().close();
}
});
Button newLayoutCancelButton = new Button(cancelButton.getCaption());
newLayoutCancelButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
getWindow().close();
}
});
buttonLayout.addComponents(newLayoutCancelButton, newLayoutSaveButton);
mainLayout.addComponents(integerField, buttonLayout);
return mainLayout;
}
};
buttonsLayout.replaceComponent(saveButton, newSaveButton);
}
}
private ContainerFormImpl(final RecordVO recordVO, RecordFieldFactory formFieldFactory) {
super(recordVO, buildFields(recordVO, formFieldFactory), formFieldFactory);
}
private static List<FieldAndPropertyId> buildFields(RecordVO recordVO, RecordFieldFactory formFieldFactory) {
List<FieldAndPropertyId> fieldsAndPropertyIds = new ArrayList<FieldAndPropertyId>();
for (MetadataVO metadataVO : recordVO.getFormMetadatas()) {
Field<?> field = formFieldFactory.build(recordVO, metadataVO);
if (field != null) {
field.addStyleName(STYLE_FIELD);
field.addStyleName(STYLE_FIELD + "-" + metadataVO.getCode());
fieldsAndPropertyIds.add(new FieldAndPropertyId(field, metadataVO));
}
}
return fieldsAndPropertyIds;
}
private ContainerStorageSpaceLookupField storageSpaceField;
private VerticalLayout storageSpaceLayout;
@Override
protected void addFieldToLayout(Field<?> field, VerticalLayout fieldLayout) {
super.addFieldToLayout(field, fieldLayout);
if (field instanceof ContainerStorageSpaceLookupField) {
storageSpaceField = (ContainerStorageSpaceLookupField) field;
storageSpaceLayout = fieldLayout;
}
}
public void replaceStorageSpaceField(RecordVO containerVo, AddEditContainerPresenter presenter) {
ContainerStorageSpaceLookupField newField = ((ContainerFieldFactory) getFormFieldFactory())
.rebuildContainerStorageSpaceLookupField(containerVo, presenter);
newField.setPropertyDataSource(storageSpaceField.getPropertyDataSource());
newField.addStyleName(BaseForm.STYLE_FIELD);
newField.addStyleName(STYLE_FIELD);
MetadataVO metadata = containerVo.getMetadata(ContainerRecord.STORAGE_SPACE);
newField.addStyleName(STYLE_FIELD + "-" + metadata.getCode());
storageSpaceLayout.replaceComponent(storageSpaceField, newField);
fields.remove(storageSpaceField);
fieldGroup.unbind(storageSpaceField);
storageSpaceField = newField;
fields.add(storageSpaceField);
fieldGroup.bind(storageSpaceField, metadata);
}
@SuppressWarnings("unchecked")
public Field<String> getTypeField() {
return (Field<String>) getField(ContainerRecord.TYPE);
}
@SuppressWarnings("unchecked")
public Field<String> getCapacityField() {
return (Field<String>) getField(ContainerRecord.CAPACITY);
}
@SuppressWarnings("unchecked")
public Field<String> getDecommissioningTypeField() {
return (Field<String>) getField(ContainerRecord.DECOMMISSIONING_TYPE);
}
@SuppressWarnings("unchecked")
public Field<String> getAdministrativeUnitField() {
return (Field<String>) getField(ContainerRecord.ADMINISTRATIVE_UNIT);
}
}