package com.constellio.app.ui.framework.components.content;
import com.constellio.app.ui.entities.ContentVersionVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.components.BaseForm;
import com.constellio.app.ui.framework.components.BaseForm.FieldAndPropertyId;
import com.constellio.app.ui.framework.components.BaseWindow;
import com.constellio.app.ui.framework.components.fields.upload.ContentVersionUploadField;
import com.constellio.model.frameworks.validation.ValidationException;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Validator;
import com.vaadin.data.util.NestedMethodProperty;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.ui.*;
import com.vaadin.ui.themes.ValoTheme;
import java.util.*;
import static com.constellio.app.ui.i18n.i18n.$;
public class UpdateContentVersionWindowImpl extends BaseWindow implements UpdateContentVersionWindow, DropHandler {
private boolean checkingIn;
private String nullValue = new String();
private ContentVersionVO newVersionVO;
private Object majorVersion;
private Property<ContentVersionVO> contentVersionProperty = new NestedMethodProperty<ContentVersionVO>(this, "contentVersion");
private Property<Object> majorVersionProperty = new NestedMethodProperty<Object>(this, "majorVersion");
private VerticalLayout mainLayout;
private BaseForm<RecordVO> uploadForm;
private Label errorLabel;
private ContentVersionUploadField uploadField;
private OptionGroup majorVersionField;
private UpdateContentVersionPresenter presenter;
public UpdateContentVersionWindowImpl(Map<RecordVO, MetadataVO> records) {
setModal(true);
setWidth("70%");
setZIndex(null);
mainLayout = new VerticalLayout();
mainLayout.setSpacing(true);
mainLayout.setWidth("100%");
String title = $("UpdateContentVersionWindow.newVersionTitle");
setCaption(title);
errorLabel = new Label();
errorLabel.addStyleName("error-label");
errorLabel.setVisible(false);
uploadField = new ContentVersionUploadField(false) {
@Override
protected boolean isMajorVersionField(ContentVersionVO contentVersionVO) {
return false;
}
};
uploadField.setCaption($("UpdateContentVersionWindow.uploadField"));
uploadField.setImmediate(true);
uploadField.addValidator(new Validator() {
@Override
public void validate(Object value)
throws InvalidValueException {
if (getContentVersion() == null && getMajorVersion() instanceof Boolean) {
throw new InvalidValueException($("UpdateContentVersionWindow.validate.noVersionIfContentVersionUploaded"));
}
}
});
majorVersionField = new OptionGroup();
majorVersionField.addStyleName(ValoTheme.OPTIONGROUP_HORIZONTAL);
majorVersionField.setCaption($("UpdateContentVersionWindow.version"));
majorVersionField.setRequired(true);
majorVersionField.setImmediate(true);
List<FieldAndPropertyId> fieldsAndPropertyIds = new ArrayList<FieldAndPropertyId>();
fieldsAndPropertyIds.add(new FieldAndPropertyId(uploadField, "contentVersion"));
fieldsAndPropertyIds.add(new FieldAndPropertyId(majorVersionField, "majorVersion"));
if (records.keySet().iterator().hasNext()) {
uploadForm = new BaseForm<RecordVO>(records.keySet().iterator().next(), fieldsAndPropertyIds) {
@Override
protected Item newItem(RecordVO viewObject) {
return new Item() {
@SuppressWarnings("rawtypes")
@Override
public Property getItemProperty(Object id) {
Property property;
if ("contentVersion".equals(id)) {
property = contentVersionProperty;
} else if ("majorVersion".equals(id)) {
property = majorVersionProperty;
} else {
property = null;
}
return property;
}
@Override
public Collection<?> getItemPropertyIds() {
return Arrays.asList("contentVersion", "majorVersion");
}
@SuppressWarnings("rawtypes")
@Override
public boolean addItemProperty(Object id, Property property)
throws UnsupportedOperationException {
throw new UnsupportedOperationException("Read-only item");
}
@Override
public boolean removeItemProperty(Object id)
throws UnsupportedOperationException {
throw new UnsupportedOperationException("Read-only item");
}
};
}
@Override
protected void saveButtonClick(RecordVO viewObject)
throws ValidationException {
Boolean bMajorVersion;
if (nullValue.equals(majorVersion)) {
bMajorVersion = null;
} else {
bMajorVersion = (Boolean) majorVersion;
}
newVersionVO = (ContentVersionVO) uploadField.getValue();
presenter.contentVersionSaved(newVersionVO, bMajorVersion);
close();
}
@Override
protected void cancelButtonClick(RecordVO viewObject) {
close();
}
};
}
uploadForm.setSizeFull();
mainLayout.addComponents(errorLabel, uploadForm);
DragAndDropWrapper dragAndDropWrapper = new DragAndDropWrapper(mainLayout);
dragAndDropWrapper.setSizeFull();
setContent(dragAndDropWrapper);
dragAndDropWrapper.setDropHandler(uploadField);
presenter = new UpdateContentVersionPresenter(this, records);
}
@Override
public void attach() {
super.attach();
errorLabel.setVisible(false);
presenter.windowAttached(checkingIn);
}
public final ContentVersionVO getContentVersion() {
return newVersionVO;
}
public final void setContentVersion(ContentVersionVO newVersionVO) {
this.newVersionVO = newVersionVO;
}
public final Object getMajorVersion() {
return majorVersion;
}
public final void setMajorVersion(Object majorVersion) {
this.majorVersion = majorVersion;
}
@Override
public void drop(DragAndDropEvent event) {
uploadField.drop(event);
}
@Override
public AcceptCriterion getAcceptCriterion() {
return uploadField.getAcceptCriterion();
}
@Override
public void showErrorMessage(String key, Object...args) {
errorLabel.setVisible(true);
errorLabel.setValue($(key, args));
}
@Override
public boolean isFormVisible() {
return uploadField.isVisible();
}
@Override
public void setFormVisible(boolean visible) {
uploadField.setVisible(visible);
uploadField.setVisible(visible);
}
@Override
public void setUploadFieldVisible(boolean visible) {
uploadField.setVisible(visible);
uploadField.setRequired(visible);
}
private void initMajorVersionFieldOptions() {
majorVersionField.removeAllItems();
majorVersionField.addItem(false);
majorVersionField.addItem(true);
}
@Override
public void addMajorMinorSameOptions() {
initMajorVersionFieldOptions();
majorVersionField.addItem(nullValue);
majorVersionField.setItemCaption(true, $("UpdateContentVersionWindow.options.newMajorVersion"));
majorVersionField.setItemCaption(false, $("UpdateContentVersionWindow.options.newMinorVersion"));
majorVersionField.setItemCaption(nullValue, $("UpdateContentVersionWindow.options.sameVersion"));
}
@Override
public void addMajorMinorOptions() {
initMajorVersionFieldOptions();
majorVersionField.setItemCaption(true, $("UpdateContentVersionWindow.options.majorVersion"));
majorVersionField.setItemCaption(false, $("UpdateContentVersionWindow.options.minorVersion"));
}
public void open(boolean checkingIn) {
this.checkingIn = checkingIn;
String updatedTitle;
if (checkingIn) {
setHeight("200px");
updatedTitle = $("UpdateContentVersionWindow.checkInTitle");
} else {
setHeight("300px");
updatedTitle = $("UpdateContentVersionWindow.newVersionTitle");
}
setCaption(updatedTitle);
UI.getCurrent().addWindow(this);
}
@Override
public void close() {
if (newVersionVO != null && newVersionVO.getInputStreamProvider() != null) {
newVersionVO.getInputStreamProvider().deleteTemp();
}
super.close();
}
}