package com.constellio.app.ui.framework.components.fields.upload;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.List;
import java.util.Map;
import com.constellio.app.ui.entities.ContentVersionVO;
import com.constellio.app.ui.framework.components.content.DownloadContentVersionLink;
import com.constellio.app.ui.framework.components.converters.TempFileUploadToContentVersionVOConverter;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.util.NestedMethodProperty;
import com.vaadin.ui.Component;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
public class ContentVersionUploadField extends BaseUploadField {
private boolean majorVersionFieldVisible = true;
public ContentVersionUploadField() {
this(false);
}
public ContentVersionUploadField(boolean multiValue) {
setConverter(new TempFileUploadToContentVersionVOConverter());
setMultiValue(multiValue);
}
@Override
protected Object getItemId(TempFileUpload tempFileUpload) {
return getConverter().convertToModel(tempFileUpload, ContentVersionVO.class, getLocale());
}
@Override
protected Component newItemCaption(Object itemId) {
ContentVersionVO contentVersionVO = (ContentVersionVO) itemId;
return new ContentVersionCaption(contentVersionVO);
}
protected boolean isMajorVersionField(ContentVersionVO contentVersionVO) {
return majorVersionFieldVisible && contentVersionVO.getHash() == null;
}
public final boolean isMajorVersionFieldVisible() {
return majorVersionFieldVisible;
}
public final void setMajorVersionFieldVisible(boolean visible) {
this.majorVersionFieldVisible = visible;
Map<Object, Component> itemCaptions = getItemCaptions();
for (Object itemId : itemCaptions.keySet()) {
ContentVersionVO contentVersionVO = (ContentVersionVO) itemId;
Component itemCaption = itemCaptions.get(itemId);
ContentVersionCaption contentVersionCaption = (ContentVersionCaption) itemCaption;
contentVersionCaption.setMajorVersionFieldVisible(isMajorVersionField(contentVersionVO));
}
}
@Override
protected void deleteTempFile(Object itemId) {
// Nothing to do, will be deleted by the linked TempUploadFile
ContentVersionVO contentVersionVO = (ContentVersionVO) itemId;
contentVersionVO.getInputStreamProvider().deleteTemp();
}
@SuppressWarnings("unchecked")
@Override
public void validate()
throws InvalidValueException {
super.validate();
Object convertedValue = getConvertedValue();
if (convertedValue instanceof List) {
List<ContentVersionVO> convertedList = (List<ContentVersionVO>) convertedValue;
for (ContentVersionVO contentVersionVO : convertedList) {
validate(contentVersionVO);
}
} else if (convertedValue != null) {
validate((ContentVersionVO) convertedValue);
}
}
private void validate(ContentVersionVO contentVersionVO) throws InvalidValueException {
if (isMajorVersionField(contentVersionVO) && contentVersionVO.getHash() == null && contentVersionVO.isMajorVersion() == null) {
throw new InvalidValueException($("ContentVersionUploadField.majorVersion"));
}
}
class ContentVersionCaption extends VerticalLayout {
private Component captionComponent;
private OptionGroup majorVersionField;
private ContentVersionCaption(ContentVersionVO contentVersionVO) {
setSpacing(true);
captionComponent = new DownloadContentVersionLink(contentVersionVO);
majorVersionField = new OptionGroup();
majorVersionField.setVisible(isMajorVersionField(contentVersionVO));
majorVersionField.addStyleName(ValoTheme.OPTIONGROUP_HORIZONTAL);
majorVersionField.addItem(true);
majorVersionField.addItem(false);
majorVersionField.setItemCaption(true, $("yes"));
majorVersionField.setItemCaption(false, $("no"));
majorVersionField.setCaption($("ContentVersionUploadField.majorVersion"));
majorVersionField.setRequired(true);
majorVersionField.setImmediate(true);
majorVersionField.setPropertyDataSource(new NestedMethodProperty<Boolean>(contentVersionVO, "majorVersion"));
addComponent(captionComponent);
addComponent(majorVersionField);
}
private void setMajorVersionFieldVisible(boolean visible) {
majorVersionField.setVisible(visible);
majorVersionField.setRequired(visible);
}
}
}