package com.constellio.app.ui.pages.profile; import com.constellio.app.modules.rm.model.enums.DefaultTabInFolderDisplay; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.ui.application.ConstellioUI; import com.constellio.app.ui.entities.ContentVersionVO; import com.constellio.app.ui.entities.TaxonomyVO; import com.constellio.app.ui.framework.components.BaseForm; import com.constellio.app.ui.framework.components.converters.TempFileUploadToContentVersionVOConverter; import com.constellio.app.ui.framework.components.fields.ListOptionGroup; import com.constellio.app.ui.framework.components.fields.enumWithSmallCode.EnumWithSmallCodeOptionGroup; import com.constellio.app.ui.framework.components.fields.lookup.LookupRecordField; import com.constellio.app.ui.framework.components.fields.upload.BaseUploadField; 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.data.Validator; import com.vaadin.data.fieldgroup.PropertyId; import com.vaadin.data.validator.EmailValidator; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.StreamResource; import com.vaadin.server.StreamResource.StreamSource; import com.vaadin.ui.*; import org.apache.commons.lang.StringUtils; import java.io.InputStream; import static com.constellio.app.ui.i18n.i18n.$; public class ModifyProfileViewImpl extends BaseViewImpl implements ModifyProfileView { public static final String UPDATE_PICTURE_STREAM_SOURCE = "ModifyProfileViewImpl-UpdatePictureStreamSource"; private ProfileVO profileVO; private VerticalLayout mainLayout; private Panel panel; private StreamResource imageResource; private Embedded image; private BaseForm<ProfileVO> form; @PropertyId("username") private TextField usernameField; @PropertyId("image") private BaseUploadField imageField; @PropertyId("firstName") private TextField firstNameField; @PropertyId("lastName") private TextField lastNameField; @PropertyId("email") private TextField emailField; @PropertyId("personalEmails") private TextArea personalEmailsField; @PropertyId("phone") private TextField phoneField; @PropertyId("fax") private TextField faxField; @PropertyId("address") private TextField addressField; @PropertyId("jobTitle") private TextField jobTitleField; @PropertyId("password") private PasswordField passwordField; @PropertyId("confirmPassword") private PasswordField confirmPasswordField; @PropertyId("oldPassword") private PasswordField oldPasswordField; @PropertyId("loginLanguageCode") private ComboBox loginLanguageCodeField; @PropertyId("startTab") private OptionGroup startTabField; @PropertyId("defaultTabInFolderDisplay") private EnumWithSmallCodeOptionGroup<DefaultTabInFolderDisplay> defaultTabInFolderDisplay; @PropertyId("defaultTaxonomy") private ListOptionGroup taxonomyField; @PropertyId("defaultAdministrativeUnit") private Field defaultAdministrativeUnitField; @PropertyId("agentManuallyDisabled") private CheckBox agentManuallyDisabledField; private boolean agentManuallyDisabledVisible; ModifyProfilePresenter presenter; public ModifyProfileViewImpl() { this.presenter = new ModifyProfilePresenter(this); } @Override protected void initBeforeCreateComponents(ViewChangeEvent event) { String parameters = event.getParameters(); presenter.setParameters(parameters); String username = getSessionContext().getCurrentUser().getUsername(); presenter.setUsername(username); profileVO = presenter.getProfileVO(username); } @Override protected String getTitle() { return $("ModifyProfileView.viewTitle"); } @Override protected Component buildMainComponent(final ViewChangeEvent event) { mainLayout = new VerticalLayout(); mainLayout.setSizeFull(); mainLayout.setSpacing(true); usernameField = new TextField(); usernameField.setCaption($("ModifyProfileView.username")); usernameField.setRequired(true); usernameField.setNullRepresentation(""); usernameField.setId("username"); usernameField.addStyleName("username"); usernameField.setVisible(true); usernameField.setEnabled(false); imageResource = new StreamResource(readSourceStream(), presenter.getUsername() + ".png"); image = new Embedded("", imageResource); panel = new Panel("", image); panel.setWidth("150"); panel.setHeight("150"); setupImageSize(image); imageField = new BaseUploadField(); imageField.setId("image"); imageField.addStyleName("image"); imageField.setCaption($("ModifyProfileView.image")); imageField.setUploadButtonCaption($("ModifyProfileView.upload")); imageField.setMultiValue(false); imageField.setConverter(new TempFileUploadToContentVersionVOConverter()); imageField.addValidator(new Validator() { @Override public void validate(Object value) throws InvalidValueException { if (value != null) { ContentVersionVO contentVersionVO = (ContentVersionVO) value; if (!contentVersionVO.getMimeType().contains("image")) { throw new InvalidValueException($("invalid image")); } } } }); imageField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { ContentVersionVO contentVersionVO = (ContentVersionVO) imageField.getValue(); if (contentVersionVO != null) { updatePicture(new StreamSource() { @Override public InputStream getStream() { ContentVersionVO contentVersionVO = (ContentVersionVO) imageField.getValue(); return contentVersionVO.getInputStreamProvider().getInputStream(UPDATE_PICTURE_STREAM_SOURCE); } }); } } }); imageField.setEnabled(presenter.canModify()); firstNameField = new TextField(); firstNameField.setCaption($("ModifyProfileView.firstName")); firstNameField.setRequired(!presenter.isLDAPAuthentication()); firstNameField.setNullRepresentation(""); firstNameField.setId("firstName"); firstNameField.addStyleName("firstName"); firstNameField.setEnabled(presenter.canModify()); lastNameField = new TextField(); lastNameField.setCaption($("ModifyProfileView.lastName")); lastNameField.setRequired(!presenter.isLDAPAuthentication()); lastNameField.setNullRepresentation(""); lastNameField.setId("lastName"); lastNameField.addStyleName("lastName"); lastNameField.setEnabled(presenter.canModify()); emailField = new TextField(); emailField.setCaption($("ModifyProfileView.email")); emailField.setRequired(!presenter.isLDAPAuthentication()); emailField.setNullRepresentation(""); emailField.setId("email"); emailField.addStyleName("email"); emailField.addValidator(new EmailValidator($("ModifyProfileView.invalidEmail"))); emailField.setEnabled(presenter.canModify()); personalEmailsField = new TextArea(); personalEmailsField.setCaption($("ModifyProfileView.personalEmails")); personalEmailsField.setRequired(false); personalEmailsField.setNullRepresentation(""); personalEmailsField.setId("personalEmails"); personalEmailsField.addStyleName("email"); personalEmailsField.addValidator(new Validator() { private Validator emailValidator = new EmailValidator($("ModifyProfileView.invalidEmail")); @Override public void validate(Object value) throws InvalidValueException { if (value != null) { for (final String email : ((String) value).split("\n")) { emailValidator.validate(email); } } } }); phoneField = new TextField(); phoneField.setCaption($("ModifyProfileView.phone")); phoneField.setRequired(false); phoneField.setNullRepresentation(""); phoneField.setId("phone"); phoneField.addStyleName("phone"); phoneField.setEnabled(presenter.canModify()); faxField = new TextField(); faxField.setCaption($("UserCredentialView.fax")); faxField.setRequired(false); faxField.setNullRepresentation(""); faxField.setId("phone"); faxField.addStyleName("phone"); faxField.setEnabled(presenter.canModify()); jobTitleField = new TextField(); jobTitleField.setCaption($("UserCredentialView.jobTitle")); jobTitleField.setRequired(false); jobTitleField.setNullRepresentation(""); jobTitleField.setId("phone"); jobTitleField.addStyleName("phone"); jobTitleField.setEnabled(presenter.canModify()); addressField = new TextField(); addressField.setCaption($("ModifyProfileView.address")); addressField.setRequired(false); addressField.setNullRepresentation(""); addressField.setId("phone"); addressField.addStyleName("phone"); addressField.setEnabled(presenter.canModify()); passwordField = new PasswordField(); passwordField.setCaption($("ModifyProfileView.password")); passwordField.setNullRepresentation(""); passwordField.setId("password"); passwordField.addStyleName("password"); passwordField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { if (passwordField.getValue() != null && StringUtils.isNotBlank(passwordField.getValue())) { confirmPasswordField.setRequired(true); oldPasswordField.setRequired(true); } else { passwordField.setValue(null); confirmPasswordField.setRequired(false); oldPasswordField.setRequired(false); } } }); passwordField.setEnabled(presenter.canModifyPassword()); confirmPasswordField = new PasswordField(); confirmPasswordField.setCaption($("ModifyProfileView.confirmPassword")); confirmPasswordField.setNullRepresentation(""); confirmPasswordField.setId("confirmPassword"); confirmPasswordField.addStyleName("confirmPassword"); Validator passwordFieldsValidator = new Validator() { @Override public void validate(Object value) throws InvalidValueException { if (passwordField.getValue() != null && !passwordField.getValue().equals(confirmPasswordField.getValue())) { confirmPasswordField.focus(); throw new InvalidValueException($("ModifyProfileView.passwordsFieldsMustBeEquals")); } } }; confirmPasswordField.addValidator(passwordFieldsValidator); confirmPasswordField.setEnabled(presenter.canModifyPassword()); oldPasswordField = new PasswordField(); oldPasswordField.setCaption($("ModifyProfileView.oldPassword")); oldPasswordField.setNullRepresentation(""); oldPasswordField.setId("oldPassword"); oldPasswordField.addStyleName("oldPassword"); oldPasswordField.setEnabled(presenter.canModifyPassword()); loginLanguageCodeField = new ComboBox($("ModifyProfileView.loginLanguageCode")); loginLanguageCodeField.setId("loginLanguageCode"); loginLanguageCodeField.setRequired(true); loginLanguageCodeField.setNullSelectionAllowed(false); for(String code : presenter.getCurrentCollectionLanguagesCodes()){ loginLanguageCodeField.addItem(code); loginLanguageCodeField.setItemCaption(code, $("Language." + code)); } loginLanguageCodeField.setEnabled(true); startTabField = new OptionGroup($("ModifyProfileView.startTab")); startTabField.setId("startTab"); for (String tab : presenter.getAvailableHomepageTabs()) { startTabField.addItem(tab); startTabField.setItemCaption(tab, $("HomeView.tab." + tab)); } defaultTabInFolderDisplay = new EnumWithSmallCodeOptionGroup<DefaultTabInFolderDisplay>(DefaultTabInFolderDisplay.class); defaultTabInFolderDisplay.setCaption($("ModifyProfileView.defaultTabInFolderDisplay")); defaultTabInFolderDisplay.setId("defaultTabInFolderDisplay"); defaultTabInFolderDisplay.setItemCaption(DefaultTabInFolderDisplay.CONTENT, $("defaultTabInFolderDisplay." + DefaultTabInFolderDisplay.CONTENT)); defaultTabInFolderDisplay.setItemCaption(DefaultTabInFolderDisplay.METADATA, $("defaultTabInFolderDisplay." + DefaultTabInFolderDisplay.METADATA)); taxonomyField = new ListOptionGroup($("ModifyProfileView.defaultTaxonomy")); taxonomyField.addStyleName("defaultTaxonomy"); taxonomyField.setId("defaultTaxonomy"); taxonomyField.setMultiSelect(false); taxonomyField.setRequired(false); for (TaxonomyVO value : presenter.getEnabledTaxonomies()) { taxonomyField.addItem(value.getCode()); taxonomyField.setItemCaption(value.getCode(), value.getTitle()); } if(presenter.isRMModuleActivated()) { defaultAdministrativeUnitField = new LookupRecordField(AdministrativeUnit.SCHEMA_TYPE, true); defaultAdministrativeUnitField.setCaption($("ModifyProfileView.defaultAdministrativeUnit")); } else { defaultAdministrativeUnitField = new TextField(); defaultAdministrativeUnitField.setVisible(false); defaultAdministrativeUnitField.setEnabled(false); } agentManuallyDisabledField = new CheckBox($("ModifyProfileView.agentManuallyDisabled")); agentManuallyDisabledField.setId("agentManuallyDisabled"); agentManuallyDisabledField.addStyleName("agentManuallyDisabled"); agentManuallyDisabledField.setVisible(agentManuallyDisabledVisible); form = new BaseForm<ProfileVO>(profileVO, this, imageField, usernameField, firstNameField, lastNameField, emailField, personalEmailsField, phoneField, faxField, jobTitleField, addressField, passwordField, confirmPasswordField, oldPasswordField, loginLanguageCodeField, startTabField, defaultTabInFolderDisplay, taxonomyField, defaultAdministrativeUnitField, agentManuallyDisabledField) { @Override protected void saveButtonClick(ProfileVO profileVO) throws ValidationException { presenter.saveButtonClicked(profileVO); } @Override protected void cancelButtonClick(ProfileVO profileVO) { presenter.cancelButtonClicked(); } }; mainLayout.addComponents(panel, form); return mainLayout; } private void setupImageSize(Embedded image) { image.setHeight("148"); image.setWidth("148"); } private void updatePicture(StreamSource streamSource) { imageResource.setStreamSource(streamSource); Embedded newImage = new Embedded("", imageResource); setupImageSize(newImage); panel.setContent(newImage); image = newImage; } private StreamSource readSourceStream() { return new StreamSource() { @Override public InputStream getStream() { return presenter.newUserPhotoInputStream(); } }; } @Override public void updateUI() { ConstellioUI.getCurrent().updateContent(); } @Override public void setAgentManuallyDisabledVisible(boolean visible) { this.agentManuallyDisabledVisible = visible; } }