package org.sigmah.client.ui.view.admin.models; /* * #%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.allen_sauer.gwt.log.client.Log; import com.google.gwt.dom.client.Style.TableLayout; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.inject.Singleton; import com.extjs.gxt.ui.client.data.BaseModelData; 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.Text; import com.extjs.gxt.ui.client.widget.form.*; import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnData; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Set; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.presenter.admin.models.EditFlexibleElementAdminPresenter; import org.sigmah.client.ui.res.icon.IconImageBundle; import org.sigmah.client.ui.view.base.AbstractPopupView; import org.sigmah.client.ui.widget.HasGrid; import org.sigmah.client.ui.widget.button.Button; import org.sigmah.client.ui.widget.button.ClickableLabel; import org.sigmah.client.ui.widget.form.ClearableField; import org.sigmah.client.ui.widget.form.FormPanel; import org.sigmah.client.ui.widget.form.Forms; import org.sigmah.client.ui.widget.form.ListComboBox; import org.sigmah.client.ui.widget.form.TextButtonField; import org.sigmah.client.ui.widget.popup.PopupWidget; import org.sigmah.client.util.ClientUtils; import org.sigmah.client.util.ColumnProviders; import org.sigmah.client.util.EnumModel; import org.sigmah.client.util.TypeModel; import org.sigmah.shared.dto.ContactModelDTO; import org.sigmah.shared.dto.PhaseModelDTO; import org.sigmah.shared.dto.base.EntityDTO; import org.sigmah.shared.dto.category.CategoryTypeDTO; import org.sigmah.shared.dto.element.BudgetSubFieldDTO; import org.sigmah.shared.dto.element.FlexibleElementDTO; import org.sigmah.shared.dto.layout.LayoutGroupDTO; import org.sigmah.shared.dto.profile.PrivacyGroupDTO; import org.sigmah.shared.dto.referential.ContactModelType; import org.sigmah.shared.dto.referential.DefaultContactFlexibleElementType; import org.sigmah.shared.dto.referential.DefaultFlexibleElementType; import org.sigmah.shared.dto.referential.ElementTypeEnum; import org.sigmah.shared.dto.referential.LogicalElementType; import org.sigmah.shared.dto.referential.TextAreaType; import org.sigmah.shared.dto.report.ReportModelDTO; /** * {@link EditFlexibleElementAdminPresenter}'s view implementation. * * @author Denis Colliot (dcolliot@ideia.fr) (v2.0) */ @Singleton public class EditFlexibleElementAdminView extends AbstractPopupView<PopupWidget> implements EditFlexibleElementAdminPresenter.View { // CSS style names. private static final String STYLE_FORM_HINT = "form-hint"; private static final String STYLE_FORM_ITEM = "x-form-item"; // -- // Common properties form components. // -- private FormPanel commonForm; private HtmlEditor nameField; private LabelField nameReadOnlyField; private ComboBox<TypeModel> typeField; private ComboBox<BaseModelData> containerField; private ComboBox<LayoutGroupDTO> layoutGroupField; private NumberField orderField; private CheckBox mandatoryField; private ComboBox<PrivacyGroupDTO> privacyGroupField; private CheckBox amendableField; private CheckBox exportableField; // -- // Specific properties form components. // -- private FormPanel specificForm; private CheckBox bannerField; private SimpleComboBox<Integer> bannerPositionField; private Set<Field<?>> textAreaFields; private NumberField lengthField; private TextField<String> codeField; private CheckBox decimalField; private NumberField minLimitField; private NumberField maxLimitField; private DateField minDateField; private DateField maxDateField; private ComboBox<ReportModelDTO> reportModelField; private CheckBox multipleChoicesField; private CheckBox qualityLinkField; private ComboBox<CategoryTypeDTO> categoryTypeField; private TextButtonField customChoiceAddField; private FlowPanel customChoicesPanel; private AdapterField customChoicesField; // -- // Budget specific fields. // -- private FlexTable budgetFields; private FlexTable ratioFlexTable; private ComboBox<FlexibleElementDTO> budgetSubFieldSpentCombo; private ComboBox<FlexibleElementDTO> budgetSubFieldPlannedCombo; private ListStore<FlexibleElementDTO> budgetSubFieldSpentStore; private ListStore<FlexibleElementDTO> budgetSubFieldPlannedStore; private ComboBox<BudgetSubFieldDTO> upBudgetSubFieldCombo; private ComboBox<BudgetSubFieldDTO> downBudgetSubFieldCombo; private ListStore<BudgetSubFieldDTO> upBudgetSubFieldStore; private ListStore<BudgetSubFieldDTO> downBudgetSubFieldStore; private Anchor anchorAddSubField; // -- // Computation specific fields. // -- private TextField<String> formulaField; private com.extjs.gxt.ui.client.widget.Label formulaHintLabel; private com.extjs.gxt.ui.client.widget.Label codeGridHeaderLabel; private com.extjs.gxt.ui.client.widget.grid.Grid<FlexibleElementDTO> codeGrid; private HasGrid.GridEventHandler<FlexibleElementDTO> codeGridEventHandler; // -- // Contact list specific fields. // -- private ComboBox<EnumModel<ContactModelType>> contactTypeField; private ClearableField<EnumModel<ContactModelType>> contactTypeClearableField; private ListComboBox<ContactModelDTO> contactModelsField; private AdapterField contactModelsContainer; private TextField<Number> contactNumberLimit; private CheckBox contactIsMember; // -- // Other components. // -- private Button saveButton; /** * Popup's initialization. */ public EditFlexibleElementAdminView() { super(new PopupWidget(true), 900); } /** * {@inheritDoc} */ @Override public void initialize() { // -- // Common properties form components. // -- nameField = new HtmlEditor(); nameField.hide(); nameField.setEnableAlignments(false); nameField.setEnableLinks(false); nameField.setEnableFont(false); nameField.setEnableLists(false); nameField.setEnableColors(false); nameField.setSourceEditMode(false); nameField.setHeight(75); nameField.setBorders(true); nameField.setFieldLabel(I18N.CONSTANTS.adminFlexibleName()); nameReadOnlyField = Forms.label(I18N.CONSTANTS.adminFlexibleName()); typeField = Forms.combobox(I18N.CONSTANTS.adminFlexibleType(), true, EnumModel.VALUE_FIELD, EnumModel.DISPLAY_FIELD); typeField.setEmptyText(I18N.CONSTANTS.adminFlexibleType()); // The value property should match OrgUnitDetails, ProjectDetails and PhaseModel 'name' property. containerField = Forms.combobox(I18N.CONSTANTS.adminFlexibleContainer(), true, EntityDTO.ID, PhaseModelDTO.NAME); containerField.setEmptyText(I18N.CONSTANTS.adminFlexibleContainerChoice()); containerField.setFireChangeEventOnSetValue(true); layoutGroupField = Forms.combobox(I18N.CONSTANTS.adminFlexibleGroup(), true, LayoutGroupDTO.ID, LayoutGroupDTO.TITLE); orderField = Forms.number(I18N.CONSTANTS.adminFlexibleOrder(), true); mandatoryField = Forms.checkbox("", null, I18N.CONSTANTS.adminFlexibleCompulsory(), false); privacyGroupField = Forms.combobox(I18N.CONSTANTS.adminPrivacyGroups(), false, PrivacyGroupDTO.ID, PrivacyGroupDTO.TITLE); privacyGroupField.setEmptyText(I18N.CONSTANTS.adminPrivacyGroupChoice()); amendableField = Forms.checkbox("", null, IconImageBundle.ICONS.DNABrownGreen().getHTML()+I18N.CONSTANTS.partOfProjectCore(), false); exportableField = Forms.checkbox("", null, I18N.CONSTANTS.adminFlexibleExportable(), false); // Form initialization. commonForm = Forms.panel(130); commonForm.add(nameField); commonForm.add(nameReadOnlyField); commonForm.add(typeField); commonForm.add(containerField); commonForm.add(layoutGroupField); commonForm.add(orderField); commonForm.add(mandatoryField); commonForm.add(new ClearableField<PrivacyGroupDTO>(privacyGroupField)); commonForm.add(amendableField); commonForm.add(exportableField); // -- // Specific properties form components. // -- textAreaFields = new HashSet<Field<?>>(); // No label for the moment as it depends on the model type bannerField = Forms.checkbox("", null, "", false); bannerField.setFireChangeEventOnSetValue(true); // No label for the moment as it depends on the model type bannerPositionField = Forms.simpleCombobox("", false); bannerPositionField.disable(); lengthField = Forms.number(I18N.CONSTANTS.adminFlexibleLength(), false); codeField = Forms.text(I18N.CONSTANTS.adminFlexibleCode(), false); decimalField = Forms.checkbox("", null, I18N.CONSTANTS.adminFlexibleDecimal(), false); minLimitField = Forms.number(I18N.CONSTANTS.adminFlexibleMinLimit(), false); maxLimitField = Forms.number(I18N.CONSTANTS.adminFlexibleMaxLimit(), false); minDateField = Forms.date(I18N.CONSTANTS.adminFlexible_form_minDate(), false); maxDateField = Forms.date(I18N.CONSTANTS.adminFlexible_form_maxDate(), false); textAreaFields.add(lengthField); textAreaFields.add(codeField); textAreaFields.add(decimalField); textAreaFields.add(minLimitField); textAreaFields.add(maxLimitField); textAreaFields.add(minDateField); textAreaFields.add(maxDateField); reportModelField = Forms.combobox(I18N.CONSTANTS.adminReportName(), true, ReportModelDTO.ID, ReportModelDTO.NAME); multipleChoicesField = Forms.checkbox("", null, I18N.CONSTANTS.adminFlexibleMultipleQ(), false); qualityLinkField = Forms.checkbox("", null, I18N.CONSTANTS.adminFlexibleLinkedToQuality(), false); categoryTypeField = Forms.combobox(I18N.CONSTANTS.adminFlexibleLinkedCategory(), false, CategoryTypeDTO.ID, CategoryTypeDTO.LABEL); categoryTypeField.setFireChangeEventOnSetValue(true); customChoiceAddField = new TextButtonField(I18N.CONSTANTS.adminFlexibleQChoices()); customChoicesPanel = new FlowPanel(); customChoicesField = Forms.adapter(null, customChoicesPanel); formulaField = Forms.text(I18N.CONSTANTS.adminFlexibleComputationFormula(), false); formulaHintLabel = new com.extjs.gxt.ui.client.widget.Label(I18N.CONSTANTS.adminFlexibleComputationFormulaHint()); formulaHintLabel.addStyleName(STYLE_FORM_HINT); // -- // specific properties for budget field // -- budgetFields = new FlexTable(); budgetFields.setVisible(false); budgetFields.setCellSpacing(5); budgetFields.setCellPadding(5); budgetFields.addStyleName("budget-sub-fields-table"); Text subFieldTitle = new Text(I18N.CONSTANTS.adminBudgetSubField()); subFieldTitle.addStyleName("budget-sub-fields-title"); budgetFields.setWidget(0, 0, subFieldTitle); budgetFields.getFlexCellFormatter().setColSpan(0, 0, 3); anchorAddSubField = new Anchor(); anchorAddSubField.setHTML(IconImageBundle.ICONS.add().getHTML() + I18N.CONSTANTS.adminAddBudgetSubField()); anchorAddSubField.setVisible(false); ratioFlexTable = new FlexTable(); budgetSubFieldSpentStore = new ListStore<FlexibleElementDTO>(); budgetSubFieldPlannedStore = new ListStore<FlexibleElementDTO>(); budgetSubFieldSpentCombo = Forms.combobox(I18N.CONSTANTS.flexibleElementBudgetDistributionRatio(), true, FlexibleElementDTO.ID, FlexibleElementDTO.LABEL, budgetSubFieldSpentStore); budgetSubFieldPlannedCombo = Forms.combobox(I18N.CONSTANTS.projectPlannedBudget(), true, FlexibleElementDTO.ID, FlexibleElementDTO.LABEL, budgetSubFieldPlannedStore); upBudgetSubFieldCombo = new ComboBox<BudgetSubFieldDTO>(); upBudgetSubFieldCombo.setDisplayField("label"); downBudgetSubFieldCombo = new ComboBox<BudgetSubFieldDTO>(); downBudgetSubFieldCombo.setDisplayField("label"); upBudgetSubFieldStore = new ListStore<BudgetSubFieldDTO>(); downBudgetSubFieldStore = new ListStore<BudgetSubFieldDTO>(); upBudgetSubFieldCombo.setStore(upBudgetSubFieldStore); downBudgetSubFieldCombo.setStore(downBudgetSubFieldStore); upBudgetSubFieldCombo.setTriggerAction(TriggerAction.ALL); upBudgetSubFieldCombo.setEditable(false); downBudgetSubFieldCombo.setTriggerAction(TriggerAction.ALL); downBudgetSubFieldCombo.setEditable(false); ratioFlexTable.setWidget(0, 0, new Text(I18N.CONSTANTS.adminBudgetRatio() + ":")); ratioFlexTable.setWidget(0, 1, upBudgetSubFieldCombo); ratioFlexTable.setWidget(0, 2, new Text("/")); ratioFlexTable.setWidget(0, 3, downBudgetSubFieldCombo); ratioFlexTable.setVisible(false); // -- // Grid of available codes fo computation field. // -- codeGrid = new com.extjs.gxt.ui.client.widget.grid.Grid<FlexibleElementDTO>(new ListStore<FlexibleElementDTO>(), createCodeGridColumnModel()); codeGrid.setAutoHeight(false); codeGrid.setAutoExpandColumn(FlexibleElementDTO.CODE); codeGrid.setHeight(200); codeGridHeaderLabel = new com.extjs.gxt.ui.client.widget.Label(I18N.CONSTANTS.adminFlexibleComputationCodeGridHeader()); codeGridHeaderLabel.addStyleName(STYLE_FORM_ITEM); // -- // Specific fields for contact list fields // -- contactTypeField = Forms.combobox(I18N.CONSTANTS.adminFlexibleElementContactListTypeFilter(), false, EnumModel.VALUE_FIELD, EnumModel.DISPLAY_FIELD); contactTypeClearableField = new ClearableField<EnumModel<ContactModelType>>(contactTypeField); contactModelsField = new ListComboBox<ContactModelDTO>(ContactModelDTO.ID, ContactModelDTO.NAME); contactModelsField.initComponent(); contactModelsContainer = Forms.adapter(I18N.CONSTANTS.adminFlexibleElementContactListModelFilter(), contactModelsField); contactNumberLimit = Forms.number(I18N.CONSTANTS.adminFlexibleElementContactListLimit(), false, false, false); contactIsMember = Forms.checkbox("", null, I18N.CONSTANTS.adminFlexibleElementContactListIsMember(), false); // Form initialization. specificForm = Forms.panel(150); specificForm.add(bannerField); specificForm.add(bannerPositionField); specificForm.add(formulaField); specificForm.add(formulaHintLabel); specificForm.add(codeField); specificForm.add(lengthField); specificForm.add(decimalField); specificForm.add(minLimitField); specificForm.add(maxLimitField); specificForm.add(minDateField); specificForm.add(maxDateField); specificForm.add(reportModelField); specificForm.add(multipleChoicesField); specificForm.add(qualityLinkField); specificForm.add(categoryTypeField); specificForm.add(customChoiceAddField); specificForm.add(customChoicesField); specificForm.add(codeGridHeaderLabel); specificForm.add(codeGrid); specificForm.add(contactNumberLimit); specificForm.add(contactTypeClearableField); specificForm.add(contactIsMember); specificForm.add(contactModelsContainer); specificForm.add(budgetFields); specificForm.add(anchorAddSubField); specificForm.add(ratioFlexTable); specificForm.add(budgetSubFieldSpentCombo); specificForm.add(budgetSubFieldPlannedCombo); // -- // Other components. // -- saveButton = Forms.button(I18N.CONSTANTS.save(), IconImageBundle.ICONS.save()); // To apply the form button wrapping styles. final FormPanel buttonFormPanel = Forms.panel(); buttonFormPanel.addButton(saveButton); // -- // Global popup initialization. // -- final Grid mainContainer = new Grid(3, 2); mainContainer.setWidth("100%"); mainContainer.getElement().getStyle().setTableLayout(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(I18N.CONSTANTS.adminFlexible_form_header_common())); mainContainer.setWidget(0, 1, Forms.header(I18N.CONSTANTS.adminFlexible_form_header_specific())); mainContainer.setWidget(1, 0, commonForm); mainContainer.setWidget(1, 1, specificForm); mainContainer.setWidget(2, 1, buttonFormPanel); initPopup(mainContainer); } @Override public void onViewRevealed() { specificForm.layout(); } /** * {@inheritDoc} */ @Override public Button getSaveButton() { return saveButton; } /** * {@inheritDoc} */ @Override public FormPanel getCommonForm() { return commonForm; } /** * {@inheritDoc} */ @Override public Field<String> getNameField() { return nameField; } /** * {@inheritDoc} */ @Override public Field<Object> getNameReadOnlyField() { return nameReadOnlyField; } /** * {@inheritDoc} */ @Override public ComboBox<TypeModel> getTypeField() { return typeField; } /** * {@inheritDoc} */ @Override public ComboBox<BaseModelData> getContainerField() { return containerField; } /** * {@inheritDoc} */ @Override public ComboBox<LayoutGroupDTO> getLayoutGroupField() { return layoutGroupField; } /** * {@inheritDoc} */ @Override public Field<Number> getOrderField() { return orderField; } /** * {@inheritDoc} */ @Override public Field<Boolean> getMandatoryField() { return mandatoryField; } /** * {@inheritDoc} */ @Override public ComboBox<PrivacyGroupDTO> getPrivacyGroupField() { return privacyGroupField; } /** * {@inheritDoc} */ @Override public Field<Boolean> getAmendableField() { return amendableField; } /** * {@inheritDoc} */ @Override public Field<Boolean> getExportableField() { return exportableField; } /** * {@inheritDoc} */ @Override public FormPanel getSpecificForm() { return specificForm; } /** * {@inheritDoc} */ @Override public Field<Boolean> getBannerField() { return bannerField; } /** * {@inheritDoc} */ @Override public SimpleComboBox<Integer> getBannerPositionField() { return bannerPositionField; } /** * {@inheritDoc} */ @Override public Field<String> getCodeField() { return codeField; } /** * {@inheritDoc} */ @Override public Field<Number> getLengthField() { return lengthField; } /** * {@inheritDoc} */ @Override public Field<Boolean> getDecimalField() { return decimalField; } /** * {@inheritDoc} */ @Override public Field<Number> getMinLimitField() { return minLimitField; } /** * {@inheritDoc} */ @Override public Field<Number> getMaxLimitField() { return maxLimitField; } /** * {@inheritDoc} */ @Override public Field<Date> getMinDateField() { return minDateField; } /** * {@inheritDoc} */ @Override public Field<Date> getMaxDateField() { return maxDateField; } /** * {@inheritDoc} */ @Override public ComboBox<ReportModelDTO> getReportModelField() { return reportModelField; } /** * {@inheritDoc} */ @Override public Field<Boolean> getMultipleChoicesField() { return multipleChoicesField; } /** * {@inheritDoc} */ @Override public Field<Boolean> getQualityLinkField() { return qualityLinkField; } /** * {@inheritDoc} */ @Override public ComboBox<CategoryTypeDTO> getCategoryTypeField() { return categoryTypeField; } /** * {@inheritDoc} */ @Override public Field<String> getCustomChoiceField() { return customChoiceAddField.getTextField(0); } /** * {@inheritDoc} */ @Override public Button getCustomChoiceAddButton() { return customChoiceAddField.getButton(); } /** * {@inheritDoc} */ @Override public FlexTable getBudgetFields() { return budgetFields; } /** * {@inheritDoc} */ @Override public FlexTable getRatioFlexTable() { return ratioFlexTable; } /** * {@inheritDoc} */ @Override public ComboBox<FlexibleElementDTO> getBudgetSubFieldSpentCombo(){ return budgetSubFieldSpentCombo; } /** * {@inheritDoc} */ @Override public ComboBox<FlexibleElementDTO> getBudgetSubFieldPlannedCombo(){ return budgetSubFieldPlannedCombo; } /** * {@inheritDoc} */ @Override public ComboBox<BudgetSubFieldDTO> getUpBudgetSubFieldCombo() { return upBudgetSubFieldCombo; } /** * {@inheritDoc} */ @Override public ComboBox<BudgetSubFieldDTO> getDownBudgetSubFieldCombo() { return downBudgetSubFieldCombo; } /** * {@inheritDoc} */ @Override public ListStore<BudgetSubFieldDTO> getUpBudgetSubFieldStore() { return upBudgetSubFieldStore; } /** * {@inheritDoc} */ @Override public ListStore<FlexibleElementDTO> getBudgetSubFieldPlannedStore() { return budgetSubFieldPlannedStore; } /** * {@inheritDoc} */ @Override public ListStore<FlexibleElementDTO> getBudgetSubFieldSpentStore() { return budgetSubFieldSpentStore; } /** * {@inheritDoc} */ @Override public ListStore<BudgetSubFieldDTO> getDownBudgetSubFieldStore() { return downBudgetSubFieldStore; } /** * {@inheritDoc} */ @Override public Anchor getAnchorAddSubField() { return anchorAddSubField; } /** * {@inheritDoc} */ @Override public TextField<String> getFormulaField() { return formulaField; } @Override public ComboBox<EnumModel<ContactModelType>> getContactListTypeFilter() { return contactTypeField; } @Override public ListComboBox<ContactModelDTO> getContactListModelsFilter() { return contactModelsField; } @Override public TextField<Number> getContactListLimit() { return contactNumberLimit; } @Override public CheckBox getContactIsMember() { return contactIsMember; } /** * {@inheritDoc} */ @Override public com.extjs.gxt.ui.client.widget.grid.Grid<FlexibleElementDTO> getGrid() { return codeGrid; } /** * {@inheritDoc} */ @Override public ListStore<FlexibleElementDTO> getStore() { return codeGrid.getStore(); } /** * {@inheritDoc} */ @Override public void setGridEventHandler(GridEventHandler<FlexibleElementDTO> handler) { this.codeGridEventHandler = handler; } /** * {@inheritDoc} */ @Override public void clear() { commonForm.clearAll(); specificForm.clearAll(); customChoicesPanel.clear(); } @Override public void clearBudgetFields() { int i = this.getBudgetFields().getRowCount(); i--; while (i >= 1) { this.getBudgetFields().removeRow(i); i--; } } /** * {@inheritDoc} */ @Override public void addCustomChoice(final String value, final ClickHandler deleteHandler) { final ClickableLabel customChoiceLabel = new ClickableLabel(value); customChoiceLabel.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { if (deleteHandler != null) { deleteHandler.onClick(event); } customChoiceLabel.removeFromParent(); } }); customChoicesPanel.add(customChoiceLabel); } /** * {@inheritDoc} */ @Override public void addUndeletableCustomChoice(final String value, boolean checked, final Listener<FieldEvent> disableHandler) { final ClickableLabel customChoiceLabel = new ClickableLabel(value); final Grid grid = (Grid) customChoiceLabel.getWidget(); final CheckBox checkBox = new CheckBox(); checkBox.setValue(checked); grid.setWidget(0, 0, checkBox); if(disableHandler != null) { checkBox.addListener(Events.Change, disableHandler); } customChoicesPanel.add(customChoiceLabel); } /** * {@inheritDoc} */ @Override public void setCustomChoiceAddFieldEnabled(boolean enabled) { getCustomChoiceField().clear(); customChoiceAddField.setEnabled(enabled); } /** * {@inheritDoc} */ @Override public void setSpecificFieldsVisibility(final LogicalElementType type) { hideFields(specificForm.getFields()); codeGrid.hide(); formulaHintLabel.hide(); codeGridHeaderLabel.hide(); final ElementTypeEnum elementType = type.toElementTypeEnum(); if (elementType == null) { return; } switch (elementType) { case COMPUTATION: codeField.show(); formulaField.show(); formulaHintLabel.show(); minLimitField.show(); maxLimitField.show(); codeGridHeaderLabel.show(); codeGrid.show(); break; case DEFAULT: bannerField.show(); bannerPositionField.show(); if (type == DefaultFlexibleElementType.BUDGET) { budgetFields.setVisible(true); anchorAddSubField.setVisible(true); ratioFlexTable.setVisible(true); }else if (type == DefaultFlexibleElementType.BUDGET_RATIO) { budgetSubFieldSpentCombo.setVisible(true); budgetSubFieldPlannedCombo.setVisible(true); } break; case DEFAULT_CONTACT: bannerField.show(); if (type != DefaultContactFlexibleElementType.PHOTO) { bannerPositionField.show(); } break; case FILES_LIST: maxLimitField.show(); break; case QUESTION: multipleChoicesField.show(); categoryTypeField.show(); customChoiceAddField.show(); customChoicesField.show(); break; case REPORT: case REPORT_LIST: reportModelField.show(); reportModelField.setAllowBlank(false); break; case TEXT_AREA: setTextAreaSpecificFieldsVisibility(elementType.toTextAreaType()); break; case CONTACT_LIST: contactNumberLimit.show(); contactTypeClearableField.show(); contactModelsContainer.show(); break; default: break; } } /** * {@inheritDoc} */ @Override public void setTextAreaSpecificFieldsVisibility(final TextAreaType textAreaType) { hideFields(textAreaFields); if (textAreaType == null) { return; } switch (textAreaType) { case PARAGRAPH: case TEXT: lengthField.show(); break; case NUMBER: codeField.show(); decimalField.show(); minLimitField.show(); maxLimitField.show(); break; case DATE: minDateField.show(); maxDateField.show(); break; default: break; } } // --------------------------------------------------------------------------------------------------------------- // // UTILITY METHODS. // // --------------------------------------------------------------------------------------------------------------- /** * Hides properly the given {@code fields}.<br> * The fields are also cleared and are no longer mandatory. * * @param fields * The fields to hide. */ private static void hideFields(final Collection<Field<?>> fields) { if (ClientUtils.isEmpty(fields)) { return; } for (final Field<?> field : fields) { field.hide(); field.clear(); field.clearInvalid(); if (field instanceof TextField) { ((TextField<?>) field).setAllowBlank(true); // No longer mandatory. } } } /** * Creates the column model for the code grid. * * @return The column model for the code grid. */ private ColumnModel createCodeGridColumnModel() { // Field label column. final ColumnConfig labelColumnConfig = new ColumnConfig(FlexibleElementDTO.LABEL, I18N.CONSTANTS.adminFlexibleName(), 150); labelColumnConfig.setRenderer(new GridCellRenderer<FlexibleElementDTO>() { @Override public Object render(FlexibleElementDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, com.extjs.gxt.ui.client.widget.grid.Grid grid) { return model.getFormattedLabel(); } }); // Field code column (link) final ColumnConfig codeColumnConfig = new ColumnConfig(FlexibleElementDTO.CODE, I18N.CONSTANTS.adminFlexibleCode(), 100); codeColumnConfig.setRenderer(new GridCellRenderer<FlexibleElementDTO>() { @Override public Object render(final FlexibleElementDTO model, final String property, final ColumnData config, final int rowIndex, final int colIndex, final ListStore<FlexibleElementDTO> store, final com.extjs.gxt.ui.client.widget.grid.Grid<FlexibleElementDTO> grid) { String code = model.getCode(); if (code == null || code.trim().isEmpty()) { code = "/"; } return ColumnProviders.renderLink(code, new ClickHandler() { @Override public void onClick(final ClickEvent event) { codeGridEventHandler.onRowClickEvent(model); } }); } }); // Container column. final ColumnConfig containerColumnConfig = new ColumnConfig(FlexibleElementDTO.CONTAINER, I18N.CONSTANTS.adminFlexibleContainer(), 75); containerColumnConfig.setRenderer(new GridCellRenderer<FlexibleElementDTO>() { @Override public Object render(FlexibleElementDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, com.extjs.gxt.ui.client.widget.grid.Grid grid) { final BaseModelData container = model.getContainerModel(); return ColumnProviders.renderText(container.get(PhaseModelDTO.NAME)); } }); // Group column. final ColumnConfig groupColumnConfig = new ColumnConfig(FlexibleElementDTO.GROUP, I18N.CONSTANTS.adminFlexibleGroup(), 75); groupColumnConfig.setRenderer(new GridCellRenderer<FlexibleElementDTO>() { @Override public Object render(FlexibleElementDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, com.extjs.gxt.ui.client.widget.grid.Grid grid) { return model.getGroup().getTitle(); } }); return new ColumnModel(Arrays.asList( labelColumnConfig, codeColumnConfig, containerColumnConfig, groupColumnConfig)); } }