package com.constellio.app.ui.framework.components; import com.constellio.app.ui.entities.MetadataVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.framework.items.RecordVOItem; import com.constellio.model.frameworks.validation.ValidationError; import com.constellio.model.frameworks.validation.ValidationErrors; import com.vaadin.data.Item; import com.vaadin.ui.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import static com.constellio.app.ui.i18n.i18n.$; @SuppressWarnings("serial") public abstract class RecordForm extends BaseForm<RecordVO> { public static final String STYLE_FIELD = "metadata-field"; private RecordFieldFactory formFieldFactory; public RecordForm(RecordVO record) { this(record, new MetadataFieldFactory()); } public RecordForm(final RecordVO recordVO, MetadataFieldFactory metadataFieldFactory) { this(recordVO, new RecordFieldFactory(metadataFieldFactory)); } public RecordForm(final RecordVO recordVO, List<FieldAndPropertyId> fieldsAndPropertyIds, RecordFieldFactory formFieldFactory) { super(recordVO, fieldsAndPropertyIds); this.formFieldFactory = formFieldFactory; } public RecordForm(final RecordVO recordVO, RecordFieldFactory formFieldFactory) { super(recordVO, buildFields(recordVO, formFieldFactory)); this.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; } protected RecordFieldFactory getFormFieldFactory() { return formFieldFactory; } @Override protected Item newItem(RecordVO viewObject) { return new RecordVOItem(viewObject); } protected List<MetadataVO> getMetadataList() { return getViewObject().getMetadatas(); } public Field<?> getField(String metadataCode) { MetadataVO metadata = getViewObject().getMetadataOrNull(metadataCode); return metadata != null ? getField(metadata) : null; } protected Field<?> getField(MetadataVO metadata) { Field<?> match = null; for (Field<?> field : fields) { Object propertyId = fieldGroup.getPropertyId(field); if (metadata.isSameLocalCode(propertyId)) { match = field; break; } } return match; } @Override protected String getTabCaption(Field<?> field, Object propertyId) { String tabCaption; if (propertyId instanceof MetadataVO) { MetadataVO metadataVO = (MetadataVO) propertyId; tabCaption = metadataVO.getMetadataGroup(); } else { tabCaption = null; } return tabCaption; } @Override protected void showBackendValidationException(ValidationErrors validationErrors) { Set<String> globalErrorMessages = new HashSet<String>(); Field<?> firstFieldWithError = null; for (ValidationError validationError : validationErrors.getValidationErrors()) { String errorMessage = $(validationError); Object metadataCode = validationError.getParameters() .get(com.constellio.model.frameworks.validation.Validator.METADATA_CODE); if (metadataCode != null) { MetadataVO metadata = viewObject.getMetadataOrNull((String)metadataCode); if (metadata != null) { Field<?> field = getField(metadata); if (field != null) { // We add this validator so that an error message appears next to the field field.addValidator(new BackendValidator(errorMessage)); if (firstFieldWithError == null) { firstFieldWithError = field; } } globalErrorMessages.add(errorMessage); } else { globalErrorMessages.add(errorMessage); } } else { globalErrorMessages.add(errorMessage); } } if (!globalErrorMessages.isEmpty()) { StringBuilder globalErrorMessagesSB = new StringBuilder(); for (String globalErrorMessage : globalErrorMessages) { if (globalErrorMessagesSB.length() != 0) { globalErrorMessagesSB.append("<br />"); } globalErrorMessagesSB.append(globalErrorMessage); } showErrorMessage(globalErrorMessagesSB.toString()); } else if (firstFieldWithError != null) { firstFieldWithError.focus(); } } }