package com.constellio.app.ui.pages.setup; import static com.constellio.app.ui.i18n.i18n.$; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.constellio.app.ui.framework.components.BaseForm; import com.constellio.app.ui.framework.components.fields.BasePasswordField; import com.constellio.app.ui.framework.components.fields.BaseTextField; import com.constellio.app.ui.framework.components.fields.ListOptionGroup; import com.constellio.app.ui.framework.components.fields.upload.BaseUploadField; import com.constellio.app.ui.framework.components.fields.upload.TempFileUpload; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.app.ui.pages.base.LogoUtils; import com.constellio.model.frameworks.validation.ValidationException; import com.constellio.model.services.factories.ModelLayerFactory; import com.vaadin.data.fieldgroup.PropertyId; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.ExternalResource; import com.vaadin.server.ThemeResource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.Field; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Link; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.PasswordField; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; public class ConstellioSetupViewImpl extends BaseViewImpl implements ConstellioSetupView { private ConstellioSetupBean bean = new ConstellioSetupBean(); // private String setupLocaleCode; private List<String> localeCodes = new ArrayList<>(); private List<String> moduleIds = new ArrayList<>(); // private boolean loadSaveState; private VerticalLayout mainLayout; private CssLayout labelsLayout; private VerticalLayout preSetupButtonsLayout; private VerticalLayout formLayout; private Label welcomeLabel; @PropertyId("modules") private OptionGroup modulesField; @PropertyId("languages") private OptionGroup languagesField; @PropertyId("collectionTitle") private TextField collectionTitleField; @PropertyId("collectionCode") private TextField collectionCodeField; @PropertyId("adminPassword") private PasswordField adminPasswordField; @PropertyId("demoData") private CheckBox demoDataField; @PropertyId("saveState") private BaseUploadField saveStateField; private BaseForm<ConstellioSetupBean> form; private ConstellioSetupPresenter presenter; public ConstellioSetupViewImpl() { this.presenter = new ConstellioSetupPresenter(this); setSizeFull(); mainLayout = new VerticalLayout(); mainLayout.addStyleName("setup-panel"); mainLayout.setSizeUndefined(); mainLayout.setSpacing(true); buildLabels(); buildPreSetupButtons(); addComponent(mainLayout); mainLayout.addComponents(labelsLayout, preSetupButtonsLayout); setComponentAlignment(mainLayout, Alignment.MIDDLE_CENTER); } private void buildLabels() { labelsLayout = new CssLayout(); labelsLayout.addStyleName("labels"); HorizontalLayout hLayout = new HorizontalLayout(); hLayout.setSpacing(true); hLayout.setSizeFull(); welcomeLabel = new Label($("ConstellioSetupView.welcome")); welcomeLabel.setSizeUndefined(); welcomeLabel.addStyleName(ValoTheme.LABEL_H2); welcomeLabel.addStyleName(ValoTheme.LABEL_COLORED); hLayout.addComponent(welcomeLabel); String linkTarget = presenter.getLogoTarget(); Link logo = new Link(null, new ExternalResource(linkTarget)); ModelLayerFactory modelLayerFactory = getConstellioFactories().getModelLayerFactory(); logo.setIcon(LogoUtils.getLogoResource(modelLayerFactory)); logo.addStyleName("setup-logo"); logo.setSizeUndefined(); hLayout.addComponent(logo); labelsLayout.addComponent(hLayout); hLayout.setComponentAlignment(logo, Alignment.TOP_RIGHT); } @Override public void setLocaleCodes(List<String> localeCodes) { this.localeCodes = localeCodes; } @Override public void setModuleIds(List<String> moduleIds) { this.moduleIds = moduleIds; } private void buildPreSetupButtons() { preSetupButtonsLayout = new VerticalLayout(); preSetupButtonsLayout.setSpacing(true); for (final String localeCode : localeCodes) { Button languageButton = new Button($("ConstellioSetupView.setup." + localeCode)); languageButton.addStyleName(ValoTheme.BUTTON_PRIMARY); languageButton.setIcon(new ThemeResource("images/icons/language/" + localeCode + ".png")); languageButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.languageButtonClicked(localeCode); } }); preSetupButtonsLayout.addComponent(languageButton); } Button loadSaveStateButton = new Button($("ConstellioSetupView.setup.loadSaveState")); loadSaveStateButton.addStyleName(ValoTheme.BUTTON_PRIMARY); loadSaveStateButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.loadSaveStateButtonClicked(); } }); } @Override public void reloadForm() { if (formLayout != null) { mainLayout.removeComponent(formLayout); } buildFields(); mainLayout.addComponent(formLayout); } private void buildFields() { formLayout = new VerticalLayout(); formLayout.setSpacing(true); Field<?>[] formFields; if (!presenter.isLoadSaveState()) { languagesField = new ListOptionGroup($("ConstellioSetupView.languages")); languagesField.setMultiSelect(true); languagesField.setRequired(true); String setupLocaleCode = presenter.getSetupLocaleCode(); for (String languageCode : this.localeCodes) { languagesField.addItem(languageCode); languagesField.setItemEnabled(languageCode, !setupLocaleCode.equals(languageCode)); languagesField.setItemCaption(languageCode, $("Language." + languageCode)); } bean.setLanguages(Arrays.asList(setupLocaleCode)); modulesField = new ListOptionGroup($("ConstellioSetupView.modules")); modulesField.setMultiSelect(true); modulesField.setRequired(true); for (String moduleId : moduleIds) { String moduleName = $("ConstellioSetupView.module." + moduleId); modulesField.addItem(moduleId); modulesField.setItemCaption(moduleId, moduleName); } collectionTitleField = new BaseTextField($("ConstellioSetupView.collectionTitle")); collectionCodeField = new BaseTextField($("ConstellioSetupView.collectionCode")); collectionCodeField.setRequired(true); adminPasswordField = new BasePasswordField($("ConstellioSetupView.adminPassword")); demoDataField = new CheckBox($("ConstellioSetupView.demoData")); formFields = new Field[] { languagesField, modulesField, collectionCodeField, collectionTitleField, adminPasswordField, demoDataField }; } else { saveStateField = new BaseUploadField(); saveStateField.setCaption($("ConstellioSetupView.saveState")); formFields = new Field[] { saveStateField }; } form = new BaseForm<ConstellioSetupBean>(bean, this, formFields) { @Override protected void saveButtonClick(ConstellioSetupBean viewObject) throws ValidationException { new Thread() { @Override public void run() { if (!presenter.isLoadSaveState()) { List<String> modules = bean.getModules(); List<String> languages = bean.getLanguages(); String collectionTitle = bean.getCollectionTitle(); String collectionCode = bean.getCollectionCode(); String adminPassword = bean.getAdminPassword(); boolean demoData = bean.isDemoData(); try { presenter.saveRequested(languages, modules, collectionTitle, collectionCode, adminPassword, demoData); } catch (ConstellioSetupPresenterException constellioSetupPresenterException) { showMessage(constellioSetupPresenterException.getMessage()); } } else { TempFileUpload saveState = bean.getSaveState(); File saveStateFile = saveState.getTempFile(); try { presenter.loadSaveStateRequested(saveStateFile); } catch (ConstellioSetupPresenterException constellioSetupPresenterException) { showErrorMessage(constellioSetupPresenterException.getMessage()); } finally { saveState.delete(); } } } }.start(); } @Override protected void cancelButtonClick(ConstellioSetupBean viewObject) { } }; formLayout.addComponents(form); } @Override public void showMessage(final String message) { UI.getCurrent().access(new Runnable() { @Override public void run() { ConstellioSetupViewImpl.super.showMessage(message); } }); } @Override public void showErrorMessage(final String errorMessage) { UI.getCurrent().access(new Runnable() { @Override public void run() { ConstellioSetupViewImpl.super.showErrorMessage(errorMessage); } }); } @Override public void updateUI() { UI.getCurrent().access(new Runnable() { @Override public void run() { ConstellioSetupViewImpl.super.updateUI(); } }); } @Override protected Component buildMainComponent(ViewChangeEvent event) { return mainLayout; } public static class ConstellioSetupBean implements Serializable { private List<String> modules = new ArrayList<>(); private List<String> languages = new ArrayList<>(); private String collectionCode; private String collectionTitle; private String adminPassword; private boolean demoData = true; private TempFileUpload saveState; public final List<String> getModules() { return modules; } public final void setModules(List<String> modules) { this.modules = modules; } public final String getCollectionCode() { return collectionCode; } public final void setCollectionCode(String collectionCode) { this.collectionCode = collectionCode; } public final String getCollectionTitle() { return collectionTitle; } public final void setCollectionTitle(String collectionTitle) { this.collectionTitle = collectionTitle; } public final String getAdminPassword() { return adminPassword; } public final void setAdminPassword(String adminPassword) { this.adminPassword = adminPassword; } public final TempFileUpload getSaveState() { return saveState; } public final void setSaveState(TempFileUpload saveState) { this.saveState = saveState; } public List<String> getLanguages() { return languages; } public void setLanguages(List<String> languages) { this.languages = languages; } public boolean isDemoData() { return demoData; } public void setDemoData(boolean demoData) { this.demoData = demoData; } } }