/*
* Copyright (c) 2010-2011 Lockheed Martin Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.eurekastreams.web.client.ui.pages.settings;
import java.util.HashMap;
import org.eurekastreams.server.action.request.profile.GetPendingGroupsRequest;
import org.eurekastreams.server.action.request.stream.GetFlaggedActivitiesRequest;
import org.eurekastreams.server.search.modelview.PersonModelView.Role;
import org.eurekastreams.web.client.events.EventBus;
import org.eurekastreams.web.client.events.Observer;
import org.eurekastreams.web.client.events.ShowNotificationEvent;
import org.eurekastreams.web.client.events.SwitchToFilterOnPagedFilterPanelEvent;
import org.eurekastreams.web.client.events.UpdateHistoryEvent;
import org.eurekastreams.web.client.events.data.DeletedActivityResponseEvent;
import org.eurekastreams.web.client.events.data.GotFlaggedActivitiesResponseEvent;
import org.eurekastreams.web.client.events.data.GotPendingGroupsResponseEvent;
import org.eurekastreams.web.client.events.data.UpdatedActivityFlagResponseEvent;
import org.eurekastreams.web.client.events.data.UpdatedReviewPendingGroupResponseEvent;
import org.eurekastreams.web.client.history.CreateUrlRequest;
import org.eurekastreams.web.client.model.FlaggedActivityModel;
import org.eurekastreams.web.client.model.PendingGroupsModel;
import org.eurekastreams.web.client.ui.Session;
import org.eurekastreams.web.client.ui.common.Pager;
import org.eurekastreams.web.client.ui.common.notifier.Notification;
import org.eurekastreams.web.client.ui.common.pagedlist.PagedListPanel;
import org.eurekastreams.web.client.ui.common.pagedlist.PendingGroupRenderer;
import org.eurekastreams.web.client.ui.common.pagedlist.SingleColumnPagedListRenderer;
import org.eurekastreams.web.client.ui.common.stream.renderers.ShowRecipient;
import org.eurekastreams.web.client.ui.common.stream.renderers.StreamMessageItemRenderer;
import org.eurekastreams.web.client.ui.common.tabs.SimpleTab;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;
import org.eurekastreams.web.client.utility.BaseActivityLinkBuilder;
import org.eurekastreams.web.client.utility.InContextActivityLinkBuilder;
/**
* Tab for the pending group requests and flagged activities.
*/
public class PendingGroupsAndFlaggedActivitiesPanelComposite extends SimpleTab
{
/** Number of flagged activities (for use on the admin tab label). */
private int flaggedActivityCount = 0;
/** Number of pending groups (for use on the admin tab label). */
private int pendingGroupCount = 0;
/**
* Constructor.
*
* @param inIdentifier
* the identifier
*/
public PendingGroupsAndFlaggedActivitiesPanelComposite(final String inIdentifier)
{
super(inIdentifier);
super.setParamsToClear(PagedListPanel.URL_PARAM_LIST_ID, PagedListPanel.URL_PARAM_FILTER,
PagedListPanel.URL_PARAM_SORT, Pager.URL_PARAM_START_INDEX, Pager.URL_PARAM_END_INDEX);
PagedListPanel panel = buildPanel();
setContents(panel);
}
/**
* Builds the admin tab.
*
* @return The tab.
*/
private PagedListPanel buildPanel()
{
final EventBus eventBus = Session.getInstance().getEventBus();
final String flaggedActivitiesFilterName = "Flagged Activities";
final String pendingGroupsFilterName = "Group Requests";
// set up the tab itself
final PagedListPanel adminTabContent = new PagedListPanel("pending", new SingleColumnPagedListRenderer(),
"tab", "Pending");
adminTabContent.addStyleName(StaticResourceBundle.INSTANCE.coreCss().pendingTabContent());
// wire up the data retrieval events
eventBus.addObserver(GotFlaggedActivitiesResponseEvent.class, new Observer<GotFlaggedActivitiesResponseEvent>()
{
public void update(final GotFlaggedActivitiesResponseEvent event)
{
if (flaggedActivitiesFilterName.equals(adminTabContent.getCurrentFilter()))
{
adminTabContent.render(event.getResponse(), "No flagged activities.");
}
flaggedActivityCount = event.getResponse().getTotal();
adminTabContent.setFilterTitle(flaggedActivitiesFilterName, "Flagged Activities ("
+ flaggedActivityCount + ")");
setTitle("Pending (" + (flaggedActivityCount + pendingGroupCount) + ")");
}
});
eventBus.addObserver(GotPendingGroupsResponseEvent.class, new Observer<GotPendingGroupsResponseEvent>()
{
public void update(final GotPendingGroupsResponseEvent event)
{
if (pendingGroupsFilterName.equals(adminTabContent.getCurrentFilter()))
{
adminTabContent.render(event.getResponse(), "No pending group requests.");
}
pendingGroupCount = event.getResponse().getTotal();
adminTabContent.setFilterTitle(pendingGroupsFilterName, "Group Requests (" + pendingGroupCount + ")");
setTitle("Pending (" + (flaggedActivityCount + pendingGroupCount) + ")");
}
});
// request the data to get the counts
// We need the counts for both of the lists, but at most one list will perform an initial data load, we need to
// force the load. (Only the list which is visible will load; if the tab is inactive then there are zero
// visible lists.)
FlaggedActivityModel.getInstance().fetch(new GetFlaggedActivitiesRequest(0, 1), false);
PendingGroupsModel.getInstance().fetch(new GetPendingGroupsRequest(0, 1), false);
// wire up events to refresh the list when something is removed
eventBus.addObserver(UpdatedActivityFlagResponseEvent.class, new Observer<UpdatedActivityFlagResponseEvent>()
{
public void update(final UpdatedActivityFlagResponseEvent ev)
{
eventBus.notifyObservers(new ShowNotificationEvent(new Notification(
"The flagged activity has been allowed")));
adminTabContent.reload();
}
});
eventBus.addObserver(UpdatedReviewPendingGroupResponseEvent.class,
new Observer<UpdatedReviewPendingGroupResponseEvent>()
{
public void update(final UpdatedReviewPendingGroupResponseEvent ev)
{
adminTabContent.reload();
}
});
eventBus.addObserver(DeletedActivityResponseEvent.class, new Observer<DeletedActivityResponseEvent>()
{
public void update(final DeletedActivityResponseEvent ev)
{
adminTabContent.reload();
}
});
// prepare the StaticResourceBundle.INSTANCE.coreCss().filters()
// flagged content StaticResourceBundle.INSTANCE.coreCss().filter()
StreamMessageItemRenderer flaggedRenderer = new StreamMessageItemRenderer(ShowRecipient.YES);
flaggedRenderer.setShowManageFlagged(true);
flaggedRenderer.setShowComment(true);
BaseActivityLinkBuilder activityLinkBuilder = new InContextActivityLinkBuilder();
activityLinkBuilder.addExtraParameter("manageFlagged", "true");
flaggedRenderer.setActivityLinkBuilder(activityLinkBuilder);
adminTabContent.addSet(flaggedActivitiesFilterName, FlaggedActivityModel.getInstance(), flaggedRenderer,
new GetFlaggedActivitiesRequest(0, 0));
// pending groups StaticResourceBundle.INSTANCE.coreCss().filter()
adminTabContent.addSet(pendingGroupsFilterName, PendingGroupsModel.getInstance(), new PendingGroupRenderer(),
new GetPendingGroupsRequest(0, 0));
return adminTabContent;
}
/**
* Switches to the admin tab and filters thereon if URL parameters dictate.
*/
private void switchToAdminTabFilterIfRequested()
{
if (!Session.getInstance().getCurrentPerson().getRoles().contains(Role.SYSTEM_ADMIN))
{
return;
}
if ("Pending".equals(Session.getInstance().getParameterValue("tab")))
{
String adminFilter = Session.getInstance().getParameterValue("adminFilter");
if (adminFilter != null)
{
// remove parameter from the URL. Since changing filters does not keep it updated, we
// don't want to be on a different filter with this still in the URL.
HashMap<String, String> params = new HashMap<String, String>();
params.put("adminFilter", null);
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(params, false)));
Session.getInstance().getEventBus().notifyObservers(
new SwitchToFilterOnPagedFilterPanelEvent("admin", adminFilter, "", true));
}
}
}
}