package org.sigmah.client.ui.presenter.orgunit; /* * #%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 org.sigmah.client.dispatch.CommandResultHandler; import org.sigmah.client.i18n.I18N; import org.sigmah.client.inject.Injector; import org.sigmah.client.page.PageRequest; import org.sigmah.client.ui.presenter.base.AbstractPresenter; import org.sigmah.client.ui.presenter.base.HasSubPresenter; import org.sigmah.client.ui.view.base.HasSubView; import org.sigmah.client.ui.view.orgunit.OrgUnitView; import org.sigmah.client.ui.widget.SubMenuItem; import org.sigmah.client.ui.widget.SubMenuWidget; import org.sigmah.client.ui.widget.SubMenuWidget.SubMenuListener; import org.sigmah.shared.command.GetValue; import org.sigmah.shared.command.result.ValueResult; import org.sigmah.shared.dto.OrgUnitBannerDTO; import org.sigmah.shared.dto.element.BudgetElementDTO; import org.sigmah.shared.dto.element.DefaultFlexibleElementDTO; import org.sigmah.shared.dto.element.FlexibleElementDTO; import org.sigmah.shared.dto.layout.LayoutConstraintDTO; import org.sigmah.shared.dto.layout.LayoutDTO; import org.sigmah.shared.dto.layout.LayoutGroupDTO; import org.sigmah.shared.dto.orgunit.OrgUnitDTO; import com.allen_sauer.gwt.log.client.Log; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.form.LabelField; import com.extjs.gxt.ui.client.widget.layout.FormLayout; import com.google.gwt.user.client.ui.HTMLTable; import com.google.gwt.user.client.ui.Widget; import com.google.inject.ImplementedBy; import com.google.inject.Inject; import com.google.inject.Singleton; import org.sigmah.client.page.Page; import org.sigmah.shared.dto.referential.GlobalPermissionEnum; /** * <p> * <b>UI parent</b> presenter which manages the {@link OrgUnitView}. * </p> * <p> * Does not respond to a page token. Manages sub-presenters. * </p> * * @author Denis Colliot (dcolliot@ideia.fr) */ @Singleton public class OrgUnitPresenter extends AbstractPresenter<OrgUnitPresenter.View> implements HasSubPresenter<OrgUnitPresenter.View> { /** * Description of the view managed by this presenter. */ @ImplementedBy(OrgUnitView.class) public static interface View extends HasSubView { /** * Returns the sub-menu widget. * * @return The sub-menu widget. */ SubMenuWidget getSubMenuWidget(); // -- // ORG UNIT BANNER. // -- /** * Sets the OrgUnit view title. * * @param orgUnitName * The OrgUnit name. */ void setOrgUnitTitle(String orgUnitName); ContentPanel getOrgUnitBannerPanel(); void setOrgUnitBanner(final Widget bannerWidget); HTMLTable buildBannerTable(final int rows, final int cols); } /** * The current OrgUnit. */ private OrgUnitDTO orgUnit; /** * Presenters's initialization. * * @param view * Presenter's view interface. * @param injector * Injected client injector. */ @Inject public OrgUnitPresenter(final View view, final Injector injector) { super(view, injector); } /** * {@inheritDoc} */ @Override public void onBind() { // SubMenu listener. view.getSubMenuWidget().addListener(new SubMenuListener() { @Override public void onSubMenuClick(final SubMenuItem menuItem) { final PageRequest currentPageRequest = injector.getPageManager().getCurrentPageRequest(false); eventBus.navigateRequest(menuItem.getRequest().addAllParameters(currentPageRequest.getParameters(true))); } }); view.getSubMenuWidget().setRequiredPermissions(Page.ORGUNIT_CALENDAR, GlobalPermissionEnum.VIEW_ORG_UNIT_AGENDA); } /** * {@inheritDoc} */ @Override public void onSubPresenterRequest(final PageRequest subPageRequest) { // Updates sub-menu widget. view.getSubMenuWidget().initializeMenu(subPageRequest.getPage(), auth()); // Updates parent view elements. refreshBanner(orgUnit); } /** * Returns the current loaded OrgUnit. * * @return The current loaded OrgUnit instance. */ public OrgUnitDTO getCurrentOrgUnit() { return orgUnit; } /** * Sets the current OrgUnit. * * @param orgUnit * The OrgUnit instance. */ public void setCurrentOrgUnit(final OrgUnitDTO orgUnit) { this.orgUnit = orgUnit; } /** * Refresh header orgUnit dashboard panel. * * @param orgUnit * The {@link OrgUnitDTO} instance. */ private void refreshBanner(final OrgUnitDTO orgUnit) { view.setOrgUnitTitle(orgUnit.getOrgUnitModel().getTitle() + ' ' + orgUnit.getName() + " (" + orgUnit.getFullName() + ")"); // Banner data. final OrgUnitBannerDTO banner = orgUnit.getOrgUnitModel().getBanner(); final LayoutDTO layout = banner.getLayout(); final Widget bannerWidget; if (banner != null && layout != null && layout.getGroups() != null && !layout.getGroups().isEmpty()) { // -- // Layout banner. // -- // For visibility constraints, the banner accept a maximum of 2 rows and 4 columns. final int rows = layout.getRowsCount() > 2 ? 2 : layout.getRowsCount(); final int cols = layout.getColumnsCount() > 4 ? 4 : layout.getColumnsCount(); final HTMLTable gridLayout = view.buildBannerTable(rows, cols); bannerWidget = gridLayout; for (final LayoutGroupDTO groupLayout : layout.getGroups()) { // Checks group bounds. if (groupLayout.getRow() + 1 > rows || groupLayout.getColumn() + 1 > cols) { continue; } final ContentPanel groupPanel = new ContentPanel(); groupPanel.setLayout(new FormLayout()); groupPanel.setTopComponent(null); groupPanel.setHeaderVisible(false); gridLayout.setWidget(groupLayout.getRow(), groupLayout.getColumn(), groupPanel); if (groupLayout.getConstraints() == null) { continue; } for (final LayoutConstraintDTO constraint : groupLayout.getConstraints()) { final FlexibleElementDTO element = constraint.getFlexibleElementDTO(); // Only default elements are allowed. if (!(element instanceof DefaultFlexibleElementDTO)) { continue; } // Builds the graphic component final DefaultFlexibleElementDTO defaultElement = (DefaultFlexibleElementDTO) element; defaultElement.setService(dispatch); defaultElement.setAuthenticationProvider(injector.getAuthenticationProvider()); defaultElement.setCache(injector.getClientCache()); defaultElement.setCurrentContainerDTO(orgUnit); dispatch.execute(new GetValue(orgUnit.getId(), defaultElement.getId(), defaultElement.getEntityName(), null), new CommandResultHandler<ValueResult>() { @Override public void onCommandFailure(final Throwable throwable) { if (Log.isErrorEnabled()) { Log.error("Error, element value not loaded.", throwable); } throw new RuntimeException(throwable); } @Override public void onCommandSuccess(final ValueResult valueResult) { if (Log.isDebugEnabled()) { Log.debug("Element value(s) object : " + valueResult); } final Component component; if (defaultElement instanceof BudgetElementDTO) { component = defaultElement.getElementComponentInBanner(valueResult); } else { component = defaultElement.getElementComponentInBanner(null); } if (component != null) { groupPanel.add(component); } groupPanel.layout(); } }); // Only one element per cell. break; } } } else { // -- // Default banner. // -- view.getOrgUnitBannerPanel().setLayout(new FormLayout()); final LabelField codeField = new LabelField(); codeField.setReadOnly(true); codeField.setFieldLabel(I18N.CONSTANTS.projectName()); codeField.setLabelSeparator(I18N.CONSTANTS.form_label_separator()); codeField.setValue(orgUnit.getName()); bannerWidget = codeField; } view.setOrgUnitBanner(bannerWidget); view.getOrgUnitBannerPanel().layout(); } }