package org.sigmah.client.ui.view.project.indicator; /* * #%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 com.extjs.gxt.ui.client.Style; import com.extjs.gxt.ui.client.widget.form.ComboBox; import com.extjs.gxt.ui.client.widget.form.Field; import com.extjs.gxt.ui.client.widget.form.Radio; import com.extjs.gxt.ui.client.widget.form.RadioGroup; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import org.sigmah.client.dispatch.DispatchAsync; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.presenter.project.indicator.EditIndicatorPresenter; import org.sigmah.client.ui.res.icon.IconImageBundle; import org.sigmah.client.ui.view.base.AbstractPopupView; import org.sigmah.client.ui.view.pivot.table.PivotGridPanel; import org.sigmah.client.ui.widget.button.Button; import org.sigmah.client.ui.widget.form.DatasourceField; import org.sigmah.client.ui.widget.form.FormPanel; import org.sigmah.client.ui.widget.form.Forms; import org.sigmah.client.ui.widget.form.ValueLabelField; import org.sigmah.client.ui.widget.popup.PopupWidget; import org.sigmah.shared.dto.IndicatorDTO; import org.sigmah.shared.dto.IndicatorGroup; /** * {@link EditIndicatorPresenter}'s view implementation. * * @author Raphaƫl Calabro (rcalabro@ideia.fr) */ public class EditIndicatorView extends AbstractPopupView<PopupWidget> implements EditIndicatorPresenter.View { private static final String RADIO_GROUP_TYPE = "type"; private static final String RADIO_GROUP_QUANTITATIVE_AGGREGATION = "quantitativeAggregation"; private Grid mainContainer; private FormPanel form; private Field<String> codeField; private Field<String> nameField; private ComboBox<IndicatorGroup> indicatorGroupField; private RadioGroup typeField; private Radio typeQuantitativeRadio; private Radio typeQualitativeTypeRadio; private ValueLabelField labelsField; private RadioGroup aggregationField; private Radio aggregationSumRadio; private Radio aggregationAverageTypeRadio; private Field<String> unitsField; private Field<Number> objectiveField; private Field<String> verificationField; private Field<String> descriptionField; private DatasourceField datasourceField; private Button saveButton; private Button cancelButton; @Inject private PivotGridPanel pivotGridPanel; private Widget pivotLabel; // Required by DatasourceField @Inject private DispatchAsync dispatchAsync; /** * Builds the view. */ public EditIndicatorView() { super(new PopupWidget(true), 800); } /** * {@inheritDoc} */ @Override public void initialize() { form = Forms.panel(130); // Code field. codeField = Forms.text(I18N.CONSTANTS.indicatorCode(), true, 30); // Name field. nameField = Forms.text(I18N.CONSTANTS.name(), true, 1024); // Indicator group field. indicatorGroupField = Forms.combobox(I18N.CONSTANTS.group(), false, IndicatorGroup.ID, IndicatorGroup.NAME); // Type field. typeQuantitativeRadio = Forms.radio(I18N.CONSTANTS.quantitative()); typeQualitativeTypeRadio = Forms.radio(I18N.CONSTANTS.qualitative()); typeField = Forms.radioGroup(I18N.CONSTANTS.type(), RADIO_GROUP_TYPE, Style.Orientation.HORIZONTAL, typeQuantitativeRadio, typeQualitativeTypeRadio); // Possible values field. labelsField = new ValueLabelField(); labelsField.setFieldLabel(I18N.CONSTANTS.possibleValues()); // Aggregation field. aggregationSumRadio = Forms.radio(I18N.CONSTANTS.sum()); aggregationAverageTypeRadio = Forms.radio(I18N.CONSTANTS.average()); aggregationField = Forms.radioGroup(I18N.CONSTANTS.aggregationMethod(), RADIO_GROUP_QUANTITATIVE_AGGREGATION, Style.Orientation.HORIZONTAL, aggregationSumRadio, aggregationAverageTypeRadio); // Units field. unitsField = Forms.text(I18N.CONSTANTS.units(), true, 15); // Objective field. objectiveField = Forms.number(I18N.CONSTANTS.targetValue(), false); // Verification field. verificationField = Forms.textarea(I18N.CONSTANTS.sourceOfVerification(), false); // Description field. descriptionField = Forms.textarea(I18N.CONSTANTS.indicatorComments(), false); // Datasource field. datasourceField = new DatasourceField(dispatchAsync); datasourceField.setFieldLabel(I18N.CONSTANTS.datasources()); // Save button. saveButton = Forms.button(I18N.CONSTANTS.save(), IconImageBundle.ICONS.save()); // Cancel button. cancelButton = Forms.button(I18N.CONSTANTS.cancel(), IconImageBundle.ICONS.cancel()); // Building form. form.add(codeField); form.add(nameField); form.add(indicatorGroupField); form.add(typeField); form.add(labelsField); form.add(aggregationField); form.add(unitsField); form.add(objectiveField); form.add(verificationField); form.add(descriptionField); form.add(datasourceField); // Value editor. pivotGridPanel.setHeaderVisible(false); pivotGridPanel.setHeight("380px"); pivotLabel = Forms.header(I18N.CONSTANTS.value()); // Building tabs mainContainer = new Grid(2, 2); mainContainer.setWidth("100%"); mainContainer.getElement().getStyle().setTableLayout(com.google.gwt.dom.client.Style.TableLayout.FIXED); mainContainer.getColumnFormatter().getElement(0).getStyle().setProperty("width", "50%"); mainContainer.getColumnFormatter().getElement(1).getStyle().setProperty("width", "50%"); mainContainer.getRowFormatter().setVerticalAlign(1, HasVerticalAlignment.ALIGN_TOP); mainContainer.setWidget(0, 0, Forms.header("Definition")); mainContainer.setWidget(0, 1, pivotLabel); mainContainer.setWidget(1, 0, form); mainContainer.setWidget(1, 1, pivotGridPanel); getPopup().addButton(cancelButton); getPopup().addButton(saveButton); initPopup(mainContainer); } @Override public void loadIndicator(Integer projectId, IndicatorDTO indicator) { codeField.setValue(indicator != null ? indicator.getCode() : null); nameField.setValue(indicator != null ? indicator.getName() : null); // Indicator group field is directly loaded by the presenter. selectTypeAndAggregation(indicator != null ? indicator.getAggregation() : IndicatorDTO.AGGREGATE_SUM); labelsField.setValue(indicator != null ? indicator.getLabels() : null); unitsField.setValue(indicator != null ? indicator.getUnits() : null); objectiveField.setValue(indicator != null ? indicator.getObjective() : null); verificationField.setValue(indicator != null ? indicator.getSourceOfVerification() : null); descriptionField.setValue(indicator != null ? indicator.getDescription() : null); datasourceField.load(projectId, indicator); } @Override public void setDataEntryVisible(boolean visible) { pivotLabel.setVisible(visible); pivotGridPanel.setVisible(visible); if(!visible) { mainContainer.getColumnFormatter().getElement(0).getStyle().setProperty("width", "100%"); mainContainer.getColumnFormatter().getElement(1).getStyle().setProperty("width", "0%"); } else { mainContainer.getColumnFormatter().getElement(0).getStyle().setProperty("width", "50%"); mainContainer.getColumnFormatter().getElement(1).getStyle().setProperty("width", "50%"); } // TODO: Resize the popup size to 400 or 800 depending of "visible". } @Override public FormPanel getForm() { return form; } @Override public Field<String> getCodeField() { return codeField; } @Override public Field<String> getNameField() { return nameField; } @Override public ComboBox<IndicatorGroup> getIndicatorGroupField() { return indicatorGroupField; } @Override public RadioGroup getTypeField() { return typeField; } @Override public Radio getTypeQuantitativeRadio() { return typeQuantitativeRadio; } @Override public Radio getTypeQualitativeTypeRadio() { return typeQualitativeTypeRadio; } @Override public ValueLabelField getLabelsField() { return labelsField; } @Override public RadioGroup getAggregationField() { return aggregationField; } @Override public Radio getAggregationSumRadio() { return aggregationSumRadio; } @Override public Radio getAggregationAverageTypeRadio() { return aggregationAverageTypeRadio; } @Override public Field<String> getUnitsField() { return unitsField; } @Override public Field<Number> getObjectiveField() { return objectiveField; } @Override public Field<String> getVerificationField() { return verificationField; } @Override public Field<String> getDescriptionField() { return descriptionField; } @Override public DatasourceField getDatasourceField() { return datasourceField; } @Override public Button getSaveButton() { return saveButton; } @Override public Button getCancelButton() { return cancelButton; } @Override public PivotGridPanel getPivotGridPanel() { return pivotGridPanel; } // --------------------------------------------------------------------------------------------------------------- // // UTILITY METHODS. // // --------------------------------------------------------------------------------------------------------------- private void selectTypeAndAggregation(int aggregationType) { switch(aggregationType) { case IndicatorDTO.AGGREGATE_MULTINOMIAL: typeField.setValue(typeQualitativeTypeRadio); break; case IndicatorDTO.AGGREGATE_AVG: typeField.setValue(typeQuantitativeRadio); aggregationField.setValue(aggregationAverageTypeRadio); break; case IndicatorDTO.AGGREGATE_SUM: typeField.setValue(typeQuantitativeRadio); aggregationField.setValue(aggregationSumRadio); break; } } }