package org.sigmah.client.ui.presenter.admin.models.importer; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import java.util.List; import org.sigmah.client.i18n.I18N; import org.sigmah.client.inject.Injector; import org.sigmah.client.page.Page; import org.sigmah.client.page.PageRequest; import org.sigmah.client.page.RequestParameter; import org.sigmah.client.ui.presenter.base.AbstractPagePresenter; import org.sigmah.client.ui.view.admin.models.importer.AddMatchingRuleImportationShemeModelsAdminView; import org.sigmah.client.ui.view.base.ViewPopupInterface; import org.sigmah.shared.dto.base.EntityDTO; import org.sigmah.shared.dto.element.BudgetElementDTO; import org.sigmah.shared.dto.element.FlexibleElementDTO; import org.sigmah.shared.dto.importation.ImportationSchemeModelDTO; import org.sigmah.shared.dto.importation.VariableDTO; import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.FieldEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.Text; import com.extjs.gxt.ui.client.widget.form.CheckBox; import com.extjs.gxt.ui.client.widget.form.ComboBox; import com.extjs.gxt.ui.client.widget.form.Field; import com.google.gwt.user.client.ui.FlexTable; import com.google.inject.ImplementedBy; import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.ArrayList; import java.util.HashMap; import org.sigmah.client.dispatch.CommandResultHandler; import org.sigmah.client.event.UpdateEvent; import org.sigmah.client.ui.notif.N10N; import org.sigmah.client.ui.widget.button.Button; import org.sigmah.client.ui.widget.form.ClearableField; import org.sigmah.client.util.AdminUtil; import org.sigmah.shared.command.CreateEntity; import org.sigmah.shared.command.result.CreateResult; import org.sigmah.shared.dto.element.BudgetSubFieldDTO; import org.sigmah.shared.dto.element.DefaultFlexibleElementDTO; import org.sigmah.shared.dto.element.MessageElementDTO; import org.sigmah.shared.dto.importation.VariableBudgetSubFieldDTO; import org.sigmah.shared.dto.referential.BudgetSubFieldType; /** * Popup to add or edit a matching rule on a link between an importation scheme * and a project model/org unit model. * * @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr) * @author Raphaƫl Calabro (rcalabro@ideia.fr) */ @Singleton public class AddMatchingRuleImportationShemeModelsAdminPresenter extends AbstractPagePresenter<AddMatchingRuleImportationShemeModelsAdminPresenter.View> { private EntityDTO<Integer> currentModel; private ImportationSchemeModelDTO currentImportationScheme; /** * Description of the view managed by this presenter. */ @ImplementedBy(AddMatchingRuleImportationShemeModelsAdminView.class) public static interface View extends ViewPopupInterface { ComboBox<VariableDTO> getVariablesCombo(); ComboBox<FlexibleElementDTO> getFlexibleElementsCombo(); CheckBox getIsKeyCheckBox(); Text getIdKeyText(); Button getSubmitButton(); FlexTable getBudgetSubFlexTable(); void clearForm(); ListStore<FlexibleElementDTO> getFlexibleElementStore(); ListStore<VariableDTO> getVariableStore(); ContentPanel getMainPanel(); boolean isValid(); } @Inject protected AddMatchingRuleImportationShemeModelsAdminPresenter(View view, Injector injector) { super(view, injector); } @Override public Page getPage() { return Page.ADMIN_ADD_IMPORTATION_SCHEME_MODEL_MATCHING_RULE; } @Override public void onBind() { // On Select Combo Champs (case budget) view.getFlexibleElementsCombo().addListener(Events.Select, new Listener<FieldEvent>() { @Override public void handleEvent(FieldEvent event) { final boolean selectionIsBudget = view.getFlexibleElementsCombo().getValue() instanceof BudgetElementDTO; view.getBudgetSubFlexTable().setVisible(selectionIsBudget); view.getVariablesCombo().setVisible(!selectionIsBudget); view.getVariablesCombo().setAllowBlank(selectionIsBudget); } }); // Save Matching rule view.getSubmitButton().addListener(Events.OnClick, new Listener<BaseEvent>() { @Override public void handleEvent(BaseEvent be) { if(!view.isValid()) { return; } final boolean forKey = view.getIsKeyCheckBox().getValue(); if(forKey && view.getFlexibleElementsCombo().getValue() == null) { N10N.error(I18N.CONSTANTS.adminImportKeyIdentification(), I18N.CONSTANTS.adminImportKeyIdentificationMessage()); } else { createVariableFlexibleElement(forKey); } } }); } @Override public void onPageRequest(PageRequest request) { currentModel = request.getData(RequestParameter.MODEL); currentImportationScheme = request.getData(RequestParameter.IMPORTATION_SCHEME_MODEL); final Boolean forKey = request.getData(RequestParameter.FOR_KEY); view.clearForm(); initForm(); setKeyVisible(forKey != null && forKey); setPageTitle(I18N.CONSTANTS.adminAddKeyVariableFlexibleElementHeading()); } /** * Load importation Scheme Model Variable And model fields */ private void initForm() { // INIT CHAMPS final List<FlexibleElementDTO> allElements; if (currentImportationScheme.getProjectModelDTO() != null) { allElements = currentImportationScheme.getProjectModelDTO().getAllElements(); } else if(currentImportationScheme.getOrgUnitModelDTO() != null) { allElements = currentImportationScheme.getOrgUnitModelDTO().getAllElements(); } else { throw new IllegalArgumentException("Current importation scheme is not linked to a project model nor to an org unit model."); } view.getFlexibleElementStore().removeAll(); for(final FlexibleElementDTO flexibleElement : allElements) { if(flexibleElement.getConstraint().getParentLayoutGroup().getHasIterations()) { continue; } else if(flexibleElement instanceof DefaultFlexibleElementDTO) { final DefaultFlexibleElementDTO defaultFlexibleElement = (DefaultFlexibleElementDTO)flexibleElement; defaultFlexibleElement.setLabel(defaultFlexibleElement.getFormattedLabel()); view.getFlexibleElementStore().add(defaultFlexibleElement); if(flexibleElement instanceof BudgetElementDTO) { initializeBudgetFlexTable((BudgetElementDTO) flexibleElement, currentImportationScheme.getImportationSchemeDTO().getVariables()); } } else if(!(flexibleElement instanceof MessageElementDTO)) { view.getFlexibleElementStore().add(flexibleElement); } } view.getFlexibleElementStore().commitChanges(); // Variable view.getVariableStore().add(currentImportationScheme.getImportationSchemeDTO().getVariables()); view.getVariableStore().commitChanges(); } /** * Fill the budget editor with the fields defined in the given budget element. * * @param budgetElement Budget element to read. * @param variables List of variables in the current importation scheme. */ private void initializeBudgetFlexTable(BudgetElementDTO budgetElement, List<VariableDTO> variables) { // Clear the table. view.getBudgetSubFlexTable().clear(); view.getBudgetSubFlexTable().removeAllRows(); // Add a new row for each budget sub field. final List<BudgetSubFieldDTO> subFields = budgetElement.getBudgetSubFields(); final int size = subFields.size(); for(int y = 0; y < size; y++) { final BudgetSubFieldDTO subField = subFields.get(y); // Label. final String label = subField.getType() != null ? BudgetSubFieldType.getName(subField.getType()) : subField.getLabel(); // Variable store. final ListStore<VariableDTO> variableStore = new ListStore<VariableDTO>(); variableStore.add(variables); // Variable combo box. final ComboBox<VariableDTO> variablesComboBox = new ComboBox<VariableDTO>(); variablesComboBox.setStore(variableStore); variablesComboBox.setDisplayField("name"); variablesComboBox.setTriggerAction(ComboBox.TriggerAction.ALL); variablesComboBox.setData("budgetSubFieldId", subField.getId()); // Creating the row. view.getBudgetSubFlexTable().setText(y, 0, label); view.getBudgetSubFlexTable().setWidget(y, 1, new ClearableField(variablesComboBox)); } } private void setKeyVisible(boolean visible) { view.getIdKeyText().setVisible(visible); view.getIsKeyCheckBox().setValue(visible); view.getIsKeyCheckBox().setVisible(visible); } private void createVariableFlexibleElement(boolean forKey) { final HashMap<String, Object> properties = new HashMap<String, Object>(); final FlexibleElementDTO flexibleElement = view.getFlexibleElementsCombo().getValue(); properties.put(AdminUtil.ADMIN_IMPORTATION_SCHEME_MODEL, currentImportationScheme); properties.put(AdminUtil.PROP_FX_FLEXIBLE_ELEMENT, flexibleElement); if(flexibleElement instanceof BudgetElementDTO) { final ArrayList<VariableBudgetSubFieldDTO> subFields = new ArrayList<VariableBudgetSubFieldDTO>(); final int size = view.getBudgetSubFlexTable().getRowCount(); for(int y = 0; y < size; y++) { final ClearableField<VariableDTO> field = (ClearableField<VariableDTO>) view.getBudgetSubFlexTable().getWidget(y, 1); final Field<VariableDTO> budgetSubFieldComboBox = field.getField(); final Integer budgetSubFieldId = budgetSubFieldComboBox.getData("budgetSubFieldId"); if(budgetSubFieldComboBox.getValue() != null && budgetSubFieldId != null) { final VariableBudgetSubFieldDTO variableBudgetSubField = new VariableBudgetSubFieldDTO(); variableBudgetSubField.setBudgetSubFieldDTO(new BudgetSubFieldDTO(budgetSubFieldId)); variableBudgetSubField.setVariableDTO(budgetSubFieldComboBox.getValue()); subFields.add(variableBudgetSubField); } } properties.put(AdminUtil.PROP_VAR_FLE_BUDGETSUBFIELDS, subFields); } properties.put(AdminUtil.PROP_VAR_VARIABLE, view.getVariablesCombo().getValue()); properties.put(AdminUtil.PROP_VAR_FLE_ID_KEY, forKey); dispatch.execute(new CreateEntity(ImportationSchemeModelDTO.ENTITY_NAME, properties), new CommandResultHandler<CreateResult>() { @Override protected void onCommandSuccess(CreateResult result) { eventBus.fireEvent(new UpdateEvent(UpdateEvent.IMPORTATION_MATCHING_RULE_UPDATE, result.getEntity())); hideView(); } }, view.getSubmitButton()); } }