package com.constellio.app.modules.rm.ui.pages.containers.edit;
import com.constellio.app.modules.rm.ui.components.container.ContainerFormImpl;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.model.frameworks.validation.ValidationException;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.Field;
import com.vaadin.ui.VerticalLayout;
import static com.constellio.app.ui.i18n.i18n.$;
public class AddEditContainerViewImpl extends BaseViewImpl implements AddEditContainerView {
protected AddEditContainerPresenter presenter;
private VerticalLayout layout;
private ContainerFormImpl form;
private RecordVO container;
public AddEditContainerViewImpl() {
presenter = new AddEditContainerPresenter(this);
}
@Override
public void reloadWithContainer(RecordVO container) {
this.container = container;
ContainerFormImpl newForm = buildForm();
layout.replaceComponent(form, newForm);
form = newForm;
}
@Override
public void setType(String type) {
form.getTypeField().setValue(type);
}
@Override
public RecordVO getUpdatedContainer() {
form.commit();
return container;
}
@Override
protected void initBeforeCreateComponents(ViewChangeEvent event) {
container = presenter.forParams(event.getParameters()).getContainerRecord();
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.cancelRequested();
}
};
}
@Override
protected String getTitle() {
return presenter.isEditMode() ? $("EditContainerViewImpl.editViewTitle"):$("EditContainerViewImpl.addViewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
form = buildForm();
layout = new VerticalLayout(form);
return layout;
}
private ContainerFormImpl buildForm() {
ContainerFormImpl form = newForm();
prepareTypeField(form.getTypeField());
prepareDecommissioningTypeField(form.getDecommissioningTypeField());
prepareAdministrativeUnitField(form.getAdministrativeUnitField());
prepareCapacityField(form.getCapacityField());
return form;
}
private void prepareTypeField(final Field<String> field) {
field.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
presenter.typeSelected(field.getValue());
}
});
}
private void prepareCapacityField(final Field<String> field) {
field.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
String value = (String) event.getProperty().getValue();
container = getUpdatedContainer();
if(value == null) {
container.set(ContainerRecord.CAPACITY, null);
} else if(value.matches("-?\\d+(\\.\\d+)?")) {
container.set(ContainerRecord.CAPACITY, Double.parseDouble(value));
}
form.replaceStorageSpaceField(container, presenter);
}
});
}
private void prepareDecommissioningTypeField(Field<String> field) {
field.setVisible(presenter.canEditDecommissioningType());
}
private void prepareAdministrativeUnitField(Field<String> field) {
field.setVisible(presenter.canEditAdministrativeUnit());
}
private ContainerFormImpl newForm() {
return new ContainerFormImpl(container, presenter) {
@Override
protected void saveButtonClick(RecordVO viewObject)
throws ValidationException {
presenter.saveButtonClicked(viewObject);
}
@Override
protected void cancelButtonClick(RecordVO viewObject) {
presenter.cancelRequested();
}
};
}
public Component buildMultipleModeWindowContent() {
return new VerticalLayout();
}
}