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 java.util.ArrayList; 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.reports.ReportMenuSelectionListener; import org.sigmah.client.ui.presenter.reports.ReportsPresenter; import org.sigmah.client.ui.view.base.ViewInterface; import org.sigmah.client.ui.view.orgunit.OrgUnitReportsView; import org.sigmah.client.util.ClientUtils; import org.sigmah.shared.command.GetProjectDocuments; import org.sigmah.shared.command.GetProjectDocuments.FilesListElement; import org.sigmah.shared.dto.element.FilesListElementDTO; import org.sigmah.shared.dto.element.ReportElementDTO; import org.sigmah.shared.dto.element.ReportListElementDTO; import org.sigmah.shared.dto.orgunit.OrgUnitDTO.LocalizedElement; import com.extjs.gxt.ui.client.widget.menu.Menu; import com.extjs.gxt.ui.client.widget.menu.MenuItem; import com.google.inject.ImplementedBy; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; /** * OrgUnit Reports Presenter.<br> * Most part of its logic is delegated to the {@link ReportsPresenter}. * * @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr) (v2.0) * @author Denis Colliot (dcolliot@ideia.fr) (v2.0) */ @Singleton public class OrgUnitReportsPresenter extends AbstractOrgUnitPresenter<OrgUnitReportsPresenter.View> { /** * Presenter's view interface. */ @ImplementedBy(OrgUnitReportsView.class) public static interface View extends AbstractOrgUnitPresenter.View { /** * Provides the reports presenter's view.<br> * Should be called before view initialization. * * @param view * The view. */ // Should be executed before view initialization. void provideReportsView(ViewInterface view); } /** * The reports presenter. */ private final ReportsPresenter reportsPresenter; @Inject public OrgUnitReportsPresenter(View view, Injector injector, Provider<ReportsPresenter> reportsPresenterProvider) { super(view, injector); reportsPresenter = reportsPresenterProvider.get(); view.provideReportsView(reportsPresenter.getView()); } /** * {@inheritDoc} */ @Override public Page getPage() { return Page.ORGUNIT_REPORTS; } /** * {@inheritDoc} */ @Override public void onBind() { reportsPresenter.initialize(); } /** * {@inheritDoc} */ @Override public void onPageRequest(final PageRequest request) { // -- // Provides phase name to the reports presenter. // -- reportsPresenter.setPhaseName(null); // Organizational Units don't have phase element. // -- // Loads current project related documents (files & reports). // -- final List<FilesListElement> filesLists = new ArrayList<GetProjectDocuments.FilesListElement>(); for (final LocalizedElement element : getOrgUnit().getLocalizedElements(FilesListElementDTO.class)) { filesLists.add(new FilesListElement(element.getElement().getId(), I18N.CONSTANTS.projectDetails(), element.getElement().getLabel())); } reportsPresenter.loadProjectDocuments(getOrgUnit().getId(), filesLists); // -- // Loads received report id. // -- reportsPresenter.loadReport(request.getParameterInteger(RequestParameter.REPORT_ID)); // -- // Creates attach file menu. // -- reportsPresenter.setAttachFileButtonMenu(createAttachFileMenu()); // -- // Creates create report menu. // -- reportsPresenter.setCreateReportButtonMenu(createCreateReportMenu()); } /** * {@inheritDoc} */ @Override protected boolean hasValueChanged() { return reportsPresenter.hasValueChanged(); } /** * {@inheritDoc} */ @Override protected void onLeavingOk() { reportsPresenter.disableAutoSaveTimer(); } // --------------------------------------------------------------------------------------------------------------- // // UTILITY METHODS. // // --------------------------------------------------------------------------------------------------------------- /** * Creates the <em>attach file</em> menu. * * @return The menu. */ private Menu createAttachFileMenu() { // Retrieves all the files list elements in the current project. final List<LocalizedElement> filesListElements = getOrgUnit().getLocalizedElements(FilesListElementDTO.class); return createMenu(filesListElements, false); } /** * Creates the <em>create report</em> menu. * * @return The menu. */ private Menu createCreateReportMenu() { // Retrieves all the report and report list elements in the current project. final List<LocalizedElement> reportElements = getOrgUnit().getLocalizedElements(ReportElementDTO.class); final List<LocalizedElement> reportsListElements = getOrgUnit().getLocalizedElements(ReportListElementDTO.class); return createMenu(ClientUtils.concat(reportElements, reportsListElements), true); } /** * Creates the menu for the given {@code elements}. * * @param elements * The localized elements. * @param createReportMenu * {@code true} to build a <em>create report</em> menu, {@code false} to build an <em>attach file</em> menu. * @return The menu for the given {@code elements}. */ private Menu createMenu(final List<LocalizedElement> elements, final boolean createReportMenu) { final Menu menu = new Menu(); menu.setEnabled(false); if (elements == null) { return menu; } // For each files list. for (final LocalizedElement element : elements) { boolean itemEnabled = false; // Builds the corresponding menu item. final MenuItem item = new MenuItem(I18N.CONSTANTS.projectDetails() + " | " + element.getElement().getLabel()); // If the phase is the details page. item.addSelectionListener(new ReportMenuSelectionListener(eventBus, getOrgUnit().getId(), I18N.CONSTANTS.projectDetails(), element.getElement(), createReportMenu)); item.setTitle(I18N.CONSTANTS.flexibleElementFilesListAddErrorPhaseInactive()); itemEnabled = true; if (itemEnabled) { reportsPresenter.setMenuItemEnabled(item, getOrgUnit().getId(), element.getElement(), createReportMenu); menu.setEnabled(true); } menu.add(item); } return menu; } }