package com.constellio.app.ui.pages.management.schemas.metadata; import static com.constellio.app.ui.i18n.i18n.$; import java.util.List; import java.util.Map; import com.constellio.app.entities.schemasDisplay.enums.MetadataDisplayType; import com.constellio.app.entities.schemasDisplay.enums.MetadataInputType; import com.constellio.app.ui.entities.FormMetadataVO; import com.constellio.app.ui.entities.MetadataVO; import com.constellio.app.ui.framework.components.MetadataFieldFactory; import com.constellio.app.ui.framework.components.fields.BaseTextField; import com.constellio.app.ui.framework.components.fields.MultilingualTextField; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.app.ui.params.ParamUtils; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; import com.vaadin.data.Buffered.SourceException; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.data.fieldgroup.PropertyId; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; import com.vaadin.ui.Field; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.VerticalLayout; public class AddEditMetadataViewImpl extends BaseViewImpl implements AddEditMetadataView { final AddEditMetadataPresenter presenter; @PropertyId("localcode") private BaseTextField localcodeField; @PropertyId("labels") private MultilingualTextField labelsField; @PropertyId("valueType") private ComboBox valueType; @PropertyId("multivalue") private CheckBox multivalueType; @PropertyId("input") private ComboBox inputType; @PropertyId("displayType") private ComboBox displayType; @PropertyId("reference") private ComboBox refType; @PropertyId("required") private CheckBox requiredField; @PropertyId("searchable") private CheckBox searchableField; @PropertyId("sortable") private CheckBox sortableField; @PropertyId("highlight") private CheckBox highlight; @PropertyId("autocomplete") private CheckBox autocomplete; @PropertyId("advancedSearch") private CheckBox advancedSearchField; @PropertyId("enabled") private CheckBox enabledField; @PropertyId("metadataGroup") private OptionGroup metadataGroup; @PropertyId("defaultValue") private Field<?> defaultValueField; @PropertyId("inputMask") private BaseTextField inputMask; @PropertyId("duplicable") private CheckBox duplicableField; private MetadataForm metadataForm; private FormMetadataVO formMetadataVO; VerticalLayout viewLayout; public AddEditMetadataViewImpl() { this.presenter = new AddEditMetadataPresenter(this); } @Override protected String getTitle() { return $("AddEditMetadataView.viewTitle"); } @Override protected Component buildMainComponent(ViewChangeEvent event) { Map<String, String> params = ParamUtils.getParamsMap(event.getParameters()); presenter.setSchemaCode(params.get("schemaCode")); presenter.setParameters(params); presenter.setMetadataCode(params.get("metadataCode")); viewLayout = new VerticalLayout(); viewLayout.setSizeFull(); viewLayout.addComponents(buildTables()); return viewLayout; } private Component buildTables() { formMetadataVO = presenter.getFormMetadataVO(); final boolean editMode = formMetadataVO != null; final boolean inherited; if (!editMode) { formMetadataVO = new FormMetadataVO(getSessionContext()); inherited = false; } else { inherited = presenter.isInherited(formMetadataVO.getCode()); } return newForm(editMode, inherited); } private void metadataValueTypeChanged(MetadataValueType value, Boolean multivalue, boolean inherited, boolean editMode) { if (value != null) { if (multivalue == null) { multivalue = false; } if (value == MetadataValueType.STRING || value == MetadataValueType.TEXT) { searchableField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { if (!searchableField.getValue()) { advancedSearchField.setValue(false); } advancedSearchField.setEnabled(searchableField.getValue()); } }); advancedSearchField.setEnabled(searchableField.getValue()); if (!searchableField.getValue()) { advancedSearchField.setValue(false); } } inputType.setEnabled(false); inputType.removeAllItems(); inputType.setEnabled(true); List<MetadataInputType> types = MetadataInputType.getAvailableMetadataInputTypesFor(value, multivalue); if (types.isEmpty()) { inputType.setEnabled(false); inputType.setRequired(false); } for (MetadataInputType type : types) { inputType.addItem(type); inputType.setItemCaption(type, $(MetadataInputType.getCaptionFor(type))); } inputType.setValue(null); displayType.setEnabled(false); displayType.removeAllItems(); displayType.setEnabled(true); List<MetadataDisplayType> displayTypes = MetadataDisplayType .getAvailableMetadataDisplayTypesFor(value, formMetadataVO.getInput()); for (MetadataDisplayType type : displayTypes) { displayType.addItem(type); displayType.setItemCaption(type, $(MetadataDisplayType.getCaptionFor(type))); } if (displayTypes.size() < 2) { displayType.setEnabled(false); displayType.setVisible(false); displayType.setValue(displayType.getItemIds().iterator().next()); } else { displayType.setEnabled(true); displayType.setVisible(true); } if (!inherited) { this.enableCorrectFields(value, inherited, editMode); } inputMask.setEnabled(MetadataValueType.STRING.equals(value)); this.setValueFields(value); } } private void enableCorrectFields(MetadataValueType value, boolean inherited, boolean editMode) { refType.setEnabled(false); refType.setRequired(false); searchableField.setEnabled(false); sortableField.setEnabled(true); switch (value) { case BOOLEAN: if (multivalueType.getValue()) { multivalueType.setValue(false); } multivalueType.setEnabled(false); sortableField.setEnabled(false); break; case TEXT: multivalueType.setEnabled(true); sortableField.setEnabled(false); searchableField.setEnabled(!inherited); break; case CONTENT: multivalueType.setEnabled(true); sortableField.setEnabled(false); searchableField.setEnabled(!inherited); break; case DATE: multivalueType.setEnabled(true); break; case DATE_TIME: multivalueType.setEnabled(true); break; case INTEGER: multivalueType.setEnabled(true); searchableField.setEnabled(!inherited); break; case REFERENCE: multivalueType.setEnabled(true); sortableField.setEnabled(false); refType.setEnabled(true); refType.setRequired(!editMode); break; case STRING: multivalueType.setEnabled(true); searchableField.setEnabled(!inherited); break; case NUMBER: multivalueType.setEnabled(true); searchableField.setEnabled(!inherited); break; case STRUCTURE: multivalueType.setEnabled(true); break; } } private void setValueFields(MetadataValueType value) { refType.setValue(null); searchableField.setValue(false); switch (value) { case BOOLEAN: sortableField.setValue(false); case TEXT: sortableField.setValue(false); case CONTENT: sortableField.setValue(false); case REFERENCE: sortableField.setValue(false); break; case DATE: break; case DATE_TIME: break; case INTEGER: break; case STRING: break; case NUMBER: break; case STRUCTURE: break; } } private MetadataForm newForm(final boolean editMode, final boolean inherited) { localcodeField = new BaseTextField($("AddEditMetadataView.localcode")); localcodeField.setId("localcode"); localcodeField.addStyleName("localcode"); localcodeField.setEnabled(!editMode); localcodeField.setRequired(true); //$("AddEditMetadataView.title") labelsField = new MultilingualTextField(true); // labelsField.setRequired(true); labelsField.setId("labels"); labelsField.addStyleName("labels"); valueType = new ComboBox(); valueType.setCaption($("AddEditMetadataView.type")); valueType.setRequired(true); valueType.setId("valueType"); valueType.addStyleName("valueType"); valueType.setEnabled(!editMode); valueType.setReadOnly(editMode); valueType.setNullSelectionAllowed(false); valueType.addItem(MetadataValueType.BOOLEAN); valueType.setItemCaption(MetadataValueType.BOOLEAN, $("AddEditMetadataView.type.boolean")); valueType.addItem(MetadataValueType.TEXT); valueType.setItemCaption(MetadataValueType.TEXT, $("AddEditMetadataView.type.text")); valueType.addItem(MetadataValueType.CONTENT); valueType.setItemCaption(MetadataValueType.CONTENT, $("AddEditMetadataView.type.content")); valueType.addItem(MetadataValueType.DATE); valueType.setItemCaption(MetadataValueType.DATE, $("AddEditMetadataView.type.date")); valueType.addItem(MetadataValueType.DATE_TIME); valueType.setItemCaption(MetadataValueType.DATE_TIME, $("AddEditMetadataView.type.datetime")); valueType.addItem(MetadataValueType.REFERENCE); valueType.setItemCaption(MetadataValueType.REFERENCE, $("AddEditMetadataView.type.reference")); valueType.addItem(MetadataValueType.STRING); valueType.setItemCaption(MetadataValueType.STRING, $("AddEditMetadataView.type.string")); valueType.addItem(MetadataValueType.NUMBER); valueType.setItemCaption(MetadataValueType.NUMBER, $("AddEditMetadataView.type.number")); valueType.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { metadataValueTypeChanged((MetadataValueType) event.getProperty().getValue(), multivalueType.getValue(), inherited, editMode); } }); refType = new ComboBox(); refType.setCaption($("AddEditMetadataView.reftype")); refType.setRequired(false); refType.setId("reference"); refType.addStyleName("reference"); refType.setEnabled(false); for (String code : presenter.getMetadataTypesCode()) { refType.addItems(code); refType.setItemCaption(code, presenter.getMetadataTypesCaption(code)); } refType.setNullSelectionAllowed(false); refType.setPageLength(refType.size()); refType.setReadOnly(editMode); inputType = new ComboBox(); inputType.setCaption($("AddEditMetadataView.entry")); inputType.setRequired(true); inputType.setId("entry"); inputType.addStyleName("entry"); inputType.setEnabled(false); inputType.setNullSelectionAllowed(false); displayType = new ComboBox(); displayType.setCaption($("AddEditMetadataView.displayType")); displayType.setRequired(true); displayType.setId("displayType"); displayType.addStyleName("displayType"); displayType.setEnabled(false); displayType.setNullSelectionAllowed(false); metadataGroup = new OptionGroup($("AddEditMetadataView.metadataGroup"), presenter.getMetadataGroupList()); metadataGroup.setRequired(true); metadataGroup.setId("metadataGroup"); metadataGroup.addStyleName("metadataGroup"); metadataGroup.setCaption(presenter.getLabel()); for (String itemCode : presenter.getMetadataGroupList()) { metadataGroup.setItemCaption(itemCode, presenter.getGroupLabel(itemCode)); } multivalueType = new CheckBox(); multivalueType.setCaption($("AddEditMetadataView.multivalue")); multivalueType.setRequired(false); multivalueType.setId("multivalue"); multivalueType.addStyleName("multivalue"); multivalueType.setEnabled(!editMode); multivalueType.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { metadataValueTypeChanged((MetadataValueType) valueType.getValue(), (Boolean) event.getProperty().getValue(), inherited, editMode); } }); multivalueType.setReadOnly(editMode); requiredField = new CheckBox(); requiredField.setCaption($("AddEditMetadataView.required")); requiredField.setRequired(false); requiredField.setId("required"); requiredField.addStyleName("required"); requiredField.setEnabled(presenter.isMetadataRequiredStatusModifiable() || presenter.isFolderMediumTypes()); enabledField = new CheckBox(); enabledField.setCaption($("AddEditMetadataView.enabled")); enabledField.setRequired(false); enabledField.setId("enabled"); enabledField.addStyleName("enabled"); enabledField.setEnabled(presenter.isMetadataEnableStatusModifiable()); sortableField = new CheckBox(); sortableField.setCaption($("AddEditMetadataView.sortable")); sortableField.setRequired(false); sortableField.setId("sortable"); sortableField.addStyleName("sortable"); sortableField.setEnabled(!inherited); advancedSearchField = new CheckBox(); advancedSearchField.setCaption($("AddEditMetadataView.advanced")); advancedSearchField.setRequired(false); advancedSearchField.setId("advancedSearch"); advancedSearchField.addStyleName("advancedSearch"); advancedSearchField.setEnabled(!inherited); searchableField = new CheckBox(); searchableField.setCaption($("AddEditMetadataView.searchable")); searchableField.setRequired(false); searchableField.setId("searchable"); searchableField.addStyleName("searchable"); searchableField.setEnabled(!inherited); highlight = new CheckBox(); highlight.setCaption($("AddEditMetadataView.highlight")); highlight.setRequired(false); highlight.setId("highlight"); highlight.addStyleName("highlight"); highlight.setEnabled(!inherited); autocomplete = new CheckBox(); autocomplete.setCaption($("AddEditMetadataView.autocomplete")); autocomplete.setRequired(false); autocomplete.setId("autocomplete"); autocomplete.addStyleName("autocomplete"); autocomplete.setEnabled(!inherited); duplicableField = new CheckBox(); duplicableField.setCaption($("AddEditMetadataView.duplicable")); duplicableField.setRequired(false); duplicableField.setId("duplicable"); duplicableField.addStyleName("duplicable"); duplicableField.setEnabled(true); MetadataFieldFactory factory = new MetadataFieldFactory(); MetadataVO defaultValueMetadataVO = presenter.getDefaultValueMetadataVO(formMetadataVO); Field<?> previousDefaultValueField = defaultValueField; if (defaultValueMetadataVO != null && presenter.isDefaultValuePossible(formMetadataVO)) { try { defaultValueField = factory.build(defaultValueMetadataVO); } catch (Exception e) { e.printStackTrace(); defaultValueField = null; } } if (defaultValueField == null) { defaultValueField = new BaseTextField(); defaultValueField.setEnabled(false); } defaultValueField.setCaption($("AddEditMetadataView.defaultValue")); defaultValueField.setId("defaultValue"); if (previousDefaultValueField != null) { if (defaultValueField == null) { formMetadataVO.setDefaultValue(null); } else { //if (!previousDefaultValueField.getClass().equals(defaultValueField.getClass())) { formMetadataVO.setDefaultValue(null); } } defaultValueField.setRequired(false); inputMask = new BaseTextField($("AddEditMetadataView.inputMask")); inputMask.setEnabled(false); metadataForm = new MetadataForm(formMetadataVO, this, localcodeField, labelsField, valueType, multivalueType, inputType, inputMask, metadataGroup, refType, requiredField, enabledField, searchableField, sortableField, advancedSearchField, highlight, autocomplete, defaultValueField, duplicableField, displayType) {//, displayedHorizontallyField) { @Override public void reload() { metadataForm = newForm(editMode, inherited); viewLayout.replaceComponent(this, metadataForm); } @Override public void commit() { labelsField.commit(); for (Field<?> field : fieldGroup.getFields()) { try { field.commit(); } catch (SourceException | InvalidValueException e) { } } } @Override protected void saveButtonClick(FormMetadataVO viewObject) { try { labelsField.validateFields(); } catch (InvalidValueException e) { showErrorMessage(e.getMessage()); return; } presenter.preSaveButtonClicked(formMetadataVO, editMode); } @Override protected void cancelButtonClick(FormMetadataVO viewObject) { presenter.cancelButtonClicked(); } }; inputType.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.inputTypeValueChanged(formMetadataVO); } }); valueType.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.valueTypeValueChanged(); } }); multivalueType.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.multivalueValueChanged(formMetadataVO); } }); refType.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.refTypeValueChanged(); } }); if (presenter.isMetadataSystemReserved()) { disableFieldsForSystemReservedMetadatas(); } return metadataForm; } @Override public void reloadForm() { metadataForm.commit(); metadataForm.reload(); } //TODO Move in presenter public void disableFieldsForSystemReservedMetadatas() { localcodeField.setEnabled(false); valueType.setEnabled(false); refType.setEnabled(false); inputType.setEnabled(false); multivalueType.setEnabled(false); enabledField.setEnabled(false); highlight.setEnabled(false); autocomplete.setEnabled(false); duplicableField.setEnabled(false); inputMask.setEnabled(false); defaultValueField.setEnabled(false); if (!formMetadataVO.getLocalcode().equals(Schemas.LEGACY_ID.getLocalCode())) { requiredField.setEnabled(false); searchableField.setEnabled(false); advancedSearchField.setEnabled(false); } } }