/*
* Copyright (c) 2009-2012 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.common.widgets.activity;
import java.util.List;
import org.eurekastreams.server.action.request.profile.GetCurrentUserFollowingStatusRequest;
import org.eurekastreams.server.action.request.profile.SetFollowingStatusRequest;
import org.eurekastreams.server.action.request.stream.GetFeaturedStreamsPageRequest;
import org.eurekastreams.server.action.request.stream.StreamPopularHashTagsRequest;
import org.eurekastreams.server.domain.DailyUsageSummary;
import org.eurekastreams.server.domain.EntityType;
import org.eurekastreams.server.domain.Follower;
import org.eurekastreams.server.domain.PagedSet;
import org.eurekastreams.server.domain.dto.FeaturedStreamDTO;
import org.eurekastreams.server.domain.stream.StreamScope.ScopeType;
import org.eurekastreams.server.search.modelview.DomainGroupModelView;
import org.eurekastreams.server.search.modelview.PersonModelView;
import org.eurekastreams.server.search.modelview.PersonModelView.Role;
import org.eurekastreams.server.search.modelview.UsageMetricSummaryDTO;
import org.eurekastreams.server.service.actions.requests.UsageMetricStreamSummaryRequest;
import org.eurekastreams.web.client.events.EventBus;
import org.eurekastreams.web.client.events.GotStreamPopularHashTagsEvent;
import org.eurekastreams.web.client.events.Observer;
import org.eurekastreams.web.client.events.PagerResponseEvent;
import org.eurekastreams.web.client.events.ShowNotificationEvent;
import org.eurekastreams.web.client.events.data.AddedFeaturedStreamResponseEvent;
import org.eurekastreams.web.client.events.data.DeletedFeaturedStreamResponse;
import org.eurekastreams.web.client.events.data.DeletedRequestForGroupMembershipResponseEvent;
import org.eurekastreams.web.client.events.data.GotFeaturedStreamsPageResponseEvent;
import org.eurekastreams.web.client.events.data.GotGroupModelViewInformationResponseEvent;
import org.eurekastreams.web.client.events.data.GotPersonFollowerStatusResponseEvent;
import org.eurekastreams.web.client.events.data.GotPersonalInformationResponseEvent;
import org.eurekastreams.web.client.events.data.GotStreamResponseEvent;
import org.eurekastreams.web.client.events.data.GotUsageMetricSummaryEvent;
import org.eurekastreams.web.client.events.data.InsertedGroupMemberResponseEvent;
import org.eurekastreams.web.client.model.BaseActivitySubscriptionModel;
import org.eurekastreams.web.client.model.BaseModel;
import org.eurekastreams.web.client.model.CurrentUserPersonFollowingStatusModel;
import org.eurekastreams.web.client.model.Deletable;
import org.eurekastreams.web.client.model.FeaturedStreamModel;
import org.eurekastreams.web.client.model.GroupActivitySubscriptionModel;
import org.eurekastreams.web.client.model.GroupMembersModel;
import org.eurekastreams.web.client.model.Insertable;
import org.eurekastreams.web.client.model.PersonActivitySubscriptionModel;
import org.eurekastreams.web.client.model.PersonFollowersModel;
import org.eurekastreams.web.client.model.PopularHashTagsModel;
import org.eurekastreams.web.client.model.UsageMetricModel;
import org.eurekastreams.web.client.ui.Session;
import org.eurekastreams.web.client.ui.common.animation.ExpandCollapseAnimation;
import org.eurekastreams.web.client.ui.common.avatar.AvatarWidget.Size;
import org.eurekastreams.web.client.ui.common.charts.StreamAnalyticsChart;
import org.eurekastreams.web.client.ui.common.dialog.Dialog;
import org.eurekastreams.web.client.ui.common.notifier.Notification;
import org.eurekastreams.web.client.ui.common.pager.CoordinatorsPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.FollowerPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.FollowingPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.GroupMembershipRequestPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.PagerComposite;
import org.eurekastreams.web.client.ui.common.stream.FeatureDialogContent;
import org.eurekastreams.web.client.ui.common.stream.FollowDialogContent;
import org.eurekastreams.web.client.ui.common.stream.renderers.AvatarRenderer;
import org.eurekastreams.web.client.ui.common.stream.transformers.StreamSearchLinkBuilder;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.InlineHyperlink;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
/**
* Post box.
*/
public class StreamDetailsComposite extends Composite
{
/**
* Binder for building UI.
*/
private static LocalUiBinder binder = GWT.create(LocalUiBinder.class);
/**
* CSS resource.
*/
interface StreamDetailsStyle extends CssResource
{
/**
* Condensed Stream view.
*
* @return Condensed Stream view.
*/
String condensedStream();
/**
* Active option.
*
* @return active option style.
*/
String activeOption();
/**
* Everyone avatar.
*
* @return everyone avatar.
*/
String everyoneAvatar();
/**
* Following avatar.
*
* @return following avatar.
*/
String followingAvatar();
/**
* Private avatar.
*
* @return Private avatar.
*/
String privateAvatar();
/**
* Hide details button.
*
* @return hide details button.
*/
String hideDetails();
/**
* Featured item header link style.
*
* @return Featured item header link style.
*/
String headerFeatured();
/**
* Empty detail style.
*
* @return Empty detail style.
*/
String emptyDetailStyle();
/** @return Style for the group contact info link (website URL). */
@ClassName("group-contact-info")
String groupContactInfo();
}
/**
* CSS style.
*/
@UiField
StreamDetailsStyle style;
/**
*
* Binder for building UI.
*/
interface LocalUiBinder extends UiBinder<Widget, StreamDetailsComposite>
{
}
/**
* Default constructor.
*/
public StreamDetailsComposite()
{
initWidget(binder.createAndBindUi(this));
buildPage();
}
/**
* Empty chart.
*/
@UiField
DivElement chartEmpty;
/**
* UI element for stream about panel.
*/
@UiField
HTMLPanel streamAbout;
/**
* UI element for stream details.
*/
@UiField
DivElement streamDetailsContainer;
/**
* UI element for chart.
*/
@UiField
HTMLPanel analyticsChartContainer;
/**
* UI element for about link.
*/
@UiField
Label aboutLink;
/**
* UI element for followers link.
*/
@UiField
Label followersLink;
/**
* UI element for following link.
*/
@UiField
Label followingLink;
/**
* UI element for featuring a stream.
*/
@UiField
Label featureLink;
/**
* UI element for admin link.
*/
@UiField
Label adminLink;
/**
* UI element for coordinators link.
*/
@UiField
Label coordinatorsLink;
/**
* Contact info title.
*/
@UiField
Element contactInfoTitle;
/**
* UI element for toggling details.
*/
@UiField
Anchor toggleDetails;
/**
* UI element for configure link.
*/
@UiField
Anchor configureLink;
/**
* UI element for follower count.
*/
@UiField
SpanElement followerCount;
/**
* UI element for following count.
*/
@UiField
SpanElement followingCount;
/**
* UI element for stream name.
*/
@UiField
DivElement streamName;
/**
* UI element for stream meta info.
*/
@UiField
DivElement streamMeta;
/**
* UI element for stream avatar.
*/
@UiField
HTMLPanel streamAvatar;
/**
* UI element for condensed stream avatar.
*/
@UiField
HTMLPanel condensedAvatar;
/**
* UI element for stream description.
*/
@UiField
DivElement contactInfo;
/**
* UI element for stream description.
*/
@UiField
DivElement streamDescription;
/**
* UI element for stream interests.
*/
@UiField
DivElement streamInterests;
/**
* UI element for follow link.
*/
@UiField
Label followLink;
/**
* UI element for stream hash tags.
*/
@UiField
FlowPanel streamHashtags;
/**
* UI element for stream followers.
*/
@UiField
PagerComposite streamFollowers;
/**
* UI element for stream following.
*/
@UiField
PagerComposite streamFollowing;
/**
* UI element for stream coordinators.
*/
@UiField
PagerComposite streamCoordinators;
/**
* UI element admin tab content.
*/
@UiField
PagerComposite adminContent;
/**
* Show following link.
*/
@UiField
Label showFollowing;
/**
* Show followers link.
*/
@UiField
Label showFollowers;
/**
* Chart.
*/
@UiField
StreamAnalyticsChart chart;
/**
* Average viewers.
*/
@UiField
SpanElement avgViewers;
/**
* Average views.
*/
@UiField
SpanElement avgViews;
/**
* Average contributors.
*/
@UiField
SpanElement avgContributors;
/**
* Stream info container.
*/
@UiField
DivElement streamInfoContainer;
/**
* Average messages.
*/
@UiField
SpanElement avgMessages;
/**
* Average comments.
*/
@UiField
SpanElement avgComments;
/**
* Total contributors.
*/
@UiField
SpanElement totalContributors;
/**
* Total activities.
*/
@UiField
SpanElement totalActivities;
/**
* Total activities.
*/
@UiField
SpanElement totalComments;
/**
* Current status.
*/
private Follower.FollowerStatus status;
/**
* Expand animation duration.
*/
private static final int EXPAND_ANIMATION_DURATION = 500;
/**
* Content padding for details.
*/
private static final int CONTENT_PADDING = 0;
/**
* Number of days to gather metrics for.
*/
private static final Integer NUM_DAYS_FOR_METRICS = 30;
/**
* Avatar Renderer.
*/
private final AvatarRenderer avatarRenderer = new AvatarRenderer();
/**
* The helper to build hyperlinks to stream search.
*/
private final StreamSearchLinkBuilder streamSearchLinkBuilder = new StreamSearchLinkBuilder();
/**
* Expand/Collapse animation.
*/
private ExpandCollapseAnimation detailsContainerAnimation;
/**
* Last following handler.
*/
private HandlerRegistration lastHandler;
/**
* Last feature handler.
*/
private HandlerRegistration lastFeatureHandler;
/**
* Model used to set following status.
*/
private BaseModel followModel;
/**
* Stream request.
*/
private String streamReq;
/**
* Stream ID.
*/
private Long streamId;
/**
* Stream is featured.
*/
private boolean inFeatured;
/**
* FeaturedStreamDTO object representing current person/group.
*/
private FeaturedStreamDTO currentFeaturedStreamDTO;
/**
* Featured streams.
*/
private PagedSet<FeaturedStreamDTO> featuredStreams;
/**
* Custom Avatars.
*/
public enum CustomAvatar
{
/**
* Everyone avatar.
*/
EVERYONE,
/**
* Following avatar.
*/
FOLLOWING,
/**
* Custom stream avatar.
*/
CUSTOM
};
/**
* Build page.
*/
private void buildPage()
{
// Default style. Prevent flashing.
streamName.setInnerText("");
addStyleName(style.condensedStream());
followLink.setVisible(false);
featureLink.setVisible(Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN));
detailsContainerAnimation = new ExpandCollapseAnimation(streamDetailsContainer, EXPAND_ANIMATION_DURATION);
streamAvatar.add(avatarRenderer.render(0L, null, EntityType.PERSON, Size.Normal));
streamFollowers.init(new FollowerPagerUiStrategy());
streamFollowing.init(new FollowingPagerUiStrategy());
adminContent.init(new GroupMembershipRequestPagerUiStrategy());
streamCoordinators.init(new CoordinatorsPagerUiStrategy());
streamFollowers.setVisible(false);
streamFollowing.setVisible(false);
configureLink.setVisible(false);
adminLink.setVisible(false);
coordinatorsLink.setVisible(false);
showFollowing.setVisible(false);
followingCount.getStyle().setDisplay(Display.NONE);
followingLink.setVisible(false);
adminContent.setVisible(false);
followersLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openFollower();
}
});
followingLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openFollowing();
}
});
coordinatorsLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openCoordinators();
}
});
adminLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openAdmin();
}
});
showFollowers.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openFollower();
}
});
showFollowing.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openFollowing();
}
});
aboutLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
openAbout();
}
});
toggleDetails.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
if (detailsContainerAnimation.isExpanded())
{
toggleDetails.removeStyleName(style.hideDetails());
detailsContainerAnimation.collapse();
}
else
{
openAbout();
}
}
});
addEvents();
}
/**
* Add events.
*/
private void addEvents()
{
EventBus.getInstance().addObserver(GotStreamPopularHashTagsEvent.class,
new Observer<GotStreamPopularHashTagsEvent>()
{
public void update(final GotStreamPopularHashTagsEvent event)
{
// Note: using widgets since IE will lose all history when navigating using a simple anchor
streamHashtags.clear();
boolean empty = true;
for (String tag : event.getPopularHashTags())
{
if (empty)
{
empty = false;
}
else
{
streamHashtags.add(new InlineLabel(" "));
}
streamHashtags.add(new InlineHyperlink(tag, streamSearchLinkBuilder
.buildHashtagSearchLink(tag, null).substring(1)));
}
if (empty)
{
streamHashtags.add(new InlineLabel("No popular hashtags."));
streamHashtags.addStyleName(style.emptyDetailStyle());
}
else
{
streamHashtags.removeStyleName(style.emptyDetailStyle());
}
}
});
EventBus.getInstance().addObserver(PagerResponseEvent.class, new Observer<PagerResponseEvent>()
{
public void update(final PagerResponseEvent event)
{
detailsContainerAnimation.expandWithPadding(CONTENT_PADDING);
}
});
EventBus.getInstance().addObserver(GotUsageMetricSummaryEvent.class,
new Observer<GotUsageMetricSummaryEvent>()
{
public void update(final GotUsageMetricSummaryEvent event)
{
UsageMetricSummaryDTO data = event.getResponse();
List<DailyUsageSummary> stats = data.getDailyStatistics();
chart.setVisible(stats != null && stats.size() > 0);
chartEmpty.getStyle().setDisplay(chart.isVisible() ? Display.NONE : Display.BLOCK);
if (stats != null)
{
for (int i = 0; i < stats.size(); i++)
{
if (null == stats.get(i))
{
chart.addPoint(i, 0.0);
}
else
{
chart.addPoint(i, stats.get(i).getStreamViewCount());
}
}
}
avgComments.setInnerText(NumberFormat.getDecimalFormat().format(
data.getAverageDailyCommentPerActivityCount()));
avgContributors.setInnerText(NumberFormat.getDecimalFormat().format(
data.getAverageDailyStreamContributorCount()));
avgMessages.setInnerText(NumberFormat.getDecimalFormat().format(
data.getAverageDailyMessageCount()));
avgViewers.setInnerText(//
NumberFormat.getDecimalFormat().format(data.getAverageDailyStreamViewerCount()));
avgViews.setInnerText(NumberFormat.getDecimalFormat().format(
data.getAverageDailyStreamViewCount()));
totalContributors.setInnerText(""
+ NumberFormat.getDecimalFormat().format(data.getTotalContributorCount()));
totalActivities.setInnerText(NumberFormat.getDecimalFormat().format(
data.getTotalActivityCount()));
totalComments.setInnerText(NumberFormat.getDecimalFormat().format(data.getTotalCommentCount()));
chart.update();
}
});
EventBus.getInstance().addObserver(GotFeaturedStreamsPageResponseEvent.class,
new Observer<GotFeaturedStreamsPageResponseEvent>()
{
public void update(final GotFeaturedStreamsPageResponseEvent response)
{
featuredStreams = response.getResponse();
updateFeatureLink(currentFeaturedStreamDTO);
}
});
EventBus.getInstance().addObserver(GotPersonalInformationResponseEvent.class,
new Observer<GotPersonalInformationResponseEvent>()
{
public void update(final GotPersonalInformationResponseEvent event)
{
gotPerson(event.getResponse());
}
});
EventBus.getInstance().addObserver(GotGroupModelViewInformationResponseEvent.class,
new Observer<GotGroupModelViewInformationResponseEvent>()
{
public void update(final GotGroupModelViewInformationResponseEvent event)
{
gotGroup(event.getResponse());
}
});
EventBus.getInstance().addObserver(GotStreamResponseEvent.class, new Observer<GotStreamResponseEvent>()
{
public void update(final GotStreamResponseEvent event)
{
streamReq = event.getJsonRequest();
}
});
EventBus.getInstance().addObserver(DeletedRequestForGroupMembershipResponseEvent.class,
new Observer<DeletedRequestForGroupMembershipResponseEvent>()
{
public void update(final DeletedRequestForGroupMembershipResponseEvent event)
{
openAdmin();
}
}, true);
EventBus.getInstance().addObserver(InsertedGroupMemberResponseEvent.class,
new Observer<InsertedGroupMemberResponseEvent>()
{
public void update(final InsertedGroupMemberResponseEvent event)
{
openAdmin();
}
}, true);
EventBus.getInstance().addObserver(AddedFeaturedStreamResponseEvent.class,
new Observer<AddedFeaturedStreamResponseEvent>()
{
public void update(final AddedFeaturedStreamResponseEvent event)
{
if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
{
FeaturedStreamModel.getInstance().fetch(
new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
}
}
});
EventBus.getInstance().addObserver(DeletedFeaturedStreamResponse.class,
new Observer<DeletedFeaturedStreamResponse>()
{
public void update(final DeletedFeaturedStreamResponse event)
{
if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
{
FeaturedStreamModel.getInstance().fetch(
new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
}
}
});
}
/**
* Set the stream title and avatar.
*
* @param inStreamTitle
* the title.
* @param avatar
* the avatar.
*/
public void setStreamTitle(final String inStreamTitle, final CustomAvatar avatar)
{
Session.getInstance().setPageTitle(inStreamTitle);
setStreamName(inStreamTitle);
switch (avatar)
{
case EVERYONE:
condensedAvatar.addStyleName(style.followingAvatar());
break;
case FOLLOWING:
condensedAvatar.addStyleName(style.everyoneAvatar());
break;
case CUSTOM:
break;
default:
break;
}
}
/**
* Initialize the view.
*/
public void init()
{
chart.clearPoints();
chart.update();
// Collapse right away if open.
streamDetailsContainer.getStyle().setHeight(0.0, Unit.PX);
toggleDetails.removeStyleName(style.hideDetails());
condensedAvatar.removeStyleName(style.everyoneAvatar());
condensedAvatar.removeStyleName(style.followingAvatar());
condensedAvatar.removeStyleName(style.privateAvatar());
}
/**
* Set Condensed mode.
*
* @param isCondensed
* condensed mode.
*/
public void setCondensedMode(final boolean isCondensed)
{
if (isCondensed)
{
addStyleName(style.condensedStream());
}
else
{
removeStyleName(style.condensedStream());
}
}
/**
* Sets the displayed stream name (in a way that the elided style will update properly).
*
* @param name
* New name.
*/
private void setStreamName(final String name)
{
streamName.removeFromParent();
streamName.setInnerText(name);
streamName.setTitle(name);
streamInfoContainer.insertFirst(streamName);
}
/**
* Go the group.
*
* @param group
* the group.
*/
private void gotGroup(final DomainGroupModelView group)
{
showFollowing.setVisible(false);
followingCount.getStyle().setDisplay(Display.NONE);
followingLink.setVisible(false);
coordinatorsLink.setVisible(true);
Session.getInstance().setPageTitle(group.getName());
setStreamName(group.getName());
if (group.isRestricted())
{
condensedAvatar.addStyleName(style.privateAvatar());
addStyleName(style.condensedStream());
}
else
{
streamId = group.getStreamId();
boolean isCoordinator = false;
for (PersonModelView coordinator : group.getCoordinators())
{
if (coordinator.getAccountId().equals(Session.getInstance().getCurrentPerson().getAccountId()))
{
isCoordinator = true;
break;
}
}
if (isCoordinator || Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
{
if (!group.isPublic())
{
adminLink.setVisible(true);
String detailTabValue = Session.getInstance().getParameterValue("detailtab");
if ((detailTabValue != null) && detailTabValue.compareToIgnoreCase("admin") == 0)
{
openAdmin();
}
}
configureLink.setVisible(true);
configureLink.setHref("#groupsettings/" + group.getShortName());
}
else
{
configureLink.setVisible(false);
}
contactInfoTitle.setInnerText("Website");
String groupUrl = group.getUrl();
if (groupUrl == null || groupUrl.isEmpty())
{
contactInfo.setInnerHTML("No contact information entered.");
contactInfo.addClassName(style.emptyDetailStyle());
}
else
{
// insert wbr tags to help IE break line somewhere nice.
String displayUrl = groupUrl.replaceAll("([/?&=]+)", "$1<wbr />");
contactInfo.setInnerHTML("<a href=\"" + groupUrl + "\">" + displayUrl + "</a>");
contactInfo.removeClassName(style.emptyDetailStyle());
contactInfo.addClassName(style.groupContactInfo());
}
updateFollowLink(group.getShortName(), EntityType.GROUP);
FeaturedStreamDTO featuredStreamDTO = new FeaturedStreamDTO();
featuredStreamDTO.setDescription(group.getDescription());
featuredStreamDTO.setStreamId(group.getStreamId());
featuredStreamDTO.setStreamType(ScopeType.GROUP);
featuredStreamDTO.setDisplayName(group.getDisplayName());
currentFeaturedStreamDTO = featuredStreamDTO;
if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
{
FeaturedStreamModel.getInstance().fetch(new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
}
streamMeta.setInnerText("");
streamAvatar.clear();
streamAvatar.add(avatarRenderer.render(group.getEntityId(), group.getAvatarId(), EntityType.GROUP,
Size.Normal));
followerCount.setInnerText(Integer.toString(group.getFollowersCount()));
streamDescription.setInnerText(group.getDescription());
if (group.getDescription() == null || group.getDescription().length() == 0)
{
streamDescription.setInnerHTML("No group description entered.");
streamDescription.addClassName(style.emptyDetailStyle());
}
else
{
streamDescription.removeClassName(style.emptyDetailStyle());
}
String interestString = "";
for (String interest : group.getCapabilities())
{
interestString += "<a href='#search?query=" + interest + "'>" + interest + "</a> ";
}
streamInterests.setInnerHTML(interestString);
if (interestString.length() == 0)
{
streamInterests.setInnerHTML("No interested entered.");
streamInterests.addClassName(style.emptyDetailStyle());
}
else
{
streamInterests.removeClassName(style.emptyDetailStyle());
}
PopularHashTagsModel.getInstance().fetch(
new StreamPopularHashTagsRequest(ScopeType.GROUP, group.getShortName()), true);
UsageMetricModel.getInstance().fetch(
new UsageMetricStreamSummaryRequest(NUM_DAYS_FOR_METRICS, group.getStreamId()), true);
}
}
/**
* Update the feature link.
*
* @param featuredStreamDTO
* the stream.
*/
public void updateFeatureLink(final FeaturedStreamDTO featuredStreamDTO)
{
if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
{
inFeatured = false;
featureLink.removeStyleName(style.headerFeatured());
for (FeaturedStreamDTO featured : featuredStreams.getPagedSet())
{
if (featured.getStreamId().longValue() == streamId.longValue())
{
inFeatured = true;
featuredStreamDTO.setId(featured.getId());
featureLink.addStyleName(style.headerFeatured());
break;
}
}
if (lastFeatureHandler != null)
{
lastFeatureHandler.removeHandler();
}
lastFeatureHandler = featureLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
if (inFeatured)
{
FeaturedStreamModel.getInstance().delete(featuredStreamDTO.getId());
EventBus.getInstance().notifyObservers(
new ShowNotificationEvent(new Notification(
"Stream has been removed from the featured streams list.")));
}
else
{
Dialog.showCentered(new FeatureDialogContent(featuredStreamDTO));
}
}
});
}
}
/**
* Update the following element.
*
* @param entityId
* the id of the entity.
* @param type
* the type.
*/
public void updateFollowLink(final String entityId, final EntityType type)
{
if (!entityId.equals(Session.getInstance().getCurrentPerson().getAccountId()))
{
followModel = GroupMembersModel.getInstance();
final BaseActivitySubscriptionModel subscribeModel = EntityType.PERSON.equals(type) ? // \n
PersonActivitySubscriptionModel.getInstance()
: GroupActivitySubscriptionModel.getInstance();
if (type.equals(EntityType.PERSON))
{
followModel = PersonFollowersModel.getInstance();
}
if (lastHandler != null)
{
lastHandler.removeHandler();
}
lastHandler = followLink.addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
SetFollowingStatusRequest request;
switch (status)
{
case FOLLOWING:
request = new SetFollowingStatusRequest(Session.getInstance().getCurrentPerson()
.getAccountId(), entityId, type, false, Follower.FollowerStatus.NOTFOLLOWING);
((Deletable<SetFollowingStatusRequest>) followModel).delete(request);
onFollowerStatusChanged(Follower.FollowerStatus.NOTFOLLOWING);
break;
case NOTFOLLOWING:
request = new SetFollowingStatusRequest(Session.getInstance().getCurrentPerson()
.getAccountId(), entityId, type, false, Follower.FollowerStatus.FOLLOWING);
((Insertable<SetFollowingStatusRequest>) followModel).insert(request);
Dialog.showCentered(new FollowDialogContent(streamName.getInnerText(), streamReq, streamId,
type, subscribeModel, entityId));
onFollowerStatusChanged(Follower.FollowerStatus.FOLLOWING);
break;
default:
// do nothing.
break;
}
}
});
Session.getInstance()
.getEventBus()
.addObserver(GotPersonFollowerStatusResponseEvent.class,
new Observer<GotPersonFollowerStatusResponseEvent>()
{
public void update(final GotPersonFollowerStatusResponseEvent event)
{
onFollowerStatusChanged(event.getResponse());
}
});
CurrentUserPersonFollowingStatusModel.getInstance().fetch(
new GetCurrentUserFollowingStatusRequest(entityId, type), true);
}
else
{
followLink.setVisible(false);
}
}
/**
* Open the about panel.
*/
private void openAbout()
{
toggleDetails.addStyleName(style.hideDetails());
aboutLink.addStyleName(style.activeOption());
followingLink.removeStyleName(style.activeOption());
followersLink.removeStyleName(style.activeOption());
adminLink.removeStyleName(style.activeOption());
streamFollowing.setVisible(false);
streamAbout.setVisible(true);
streamFollowers.setVisible(false);
adminContent.setVisible(false);
streamCoordinators.setVisible(false);
coordinatorsLink.removeStyleName(style.activeOption());
detailsContainerAnimation.expandWithPadding(CONTENT_PADDING);
}
/**
* Open the following panel.
*/
private void openFollowing()
{
toggleDetails.addStyleName(style.hideDetails());
aboutLink.removeStyleName(style.activeOption());
followingLink.addStyleName(style.activeOption());
followersLink.removeStyleName(style.activeOption());
adminLink.removeStyleName(style.activeOption());
streamFollowers.setVisible(false);
streamAbout.setVisible(false);
streamFollowing.setVisible(true);
adminContent.setVisible(false);
streamCoordinators.setVisible(false);
coordinatorsLink.removeStyleName(style.activeOption());
streamFollowing.load();
}
/**
* Open the followers panel.
*/
private void openFollower()
{
toggleDetails.addStyleName(style.hideDetails());
aboutLink.removeStyleName(style.activeOption());
followingLink.removeStyleName(style.activeOption());
followersLink.addStyleName(style.activeOption());
adminLink.removeStyleName(style.activeOption());
streamFollowing.setVisible(false);
streamAbout.setVisible(false);
streamFollowers.setVisible(true);
adminContent.setVisible(false);
streamCoordinators.setVisible(false);
coordinatorsLink.removeStyleName(style.activeOption());
streamFollowers.load();
}
/**
* Open the coordinators panel.
*/
private void openCoordinators()
{
toggleDetails.addStyleName(style.hideDetails());
aboutLink.removeStyleName(style.activeOption());
followingLink.removeStyleName(style.activeOption());
followersLink.removeStyleName(style.activeOption());
adminLink.removeStyleName(style.activeOption());
streamFollowing.setVisible(false);
streamAbout.setVisible(false);
streamFollowers.setVisible(false);
adminContent.setVisible(false);
streamCoordinators.setVisible(true);
coordinatorsLink.addStyleName(style.activeOption());
streamCoordinators.load();
}
/**
* Open the Admin panel.
*/
private void openAdmin()
{
toggleDetails.addStyleName(style.hideDetails());
aboutLink.removeStyleName(style.activeOption());
followingLink.removeStyleName(style.activeOption());
followersLink.removeStyleName(style.activeOption());
coordinatorsLink.removeStyleName(style.activeOption());
adminLink.addStyleName(style.activeOption());
streamFollowing.setVisible(false);
streamAbout.setVisible(false);
streamFollowers.setVisible(false);
streamCoordinators.setVisible(false);
adminContent.setVisible(true);
adminContent.load();
}
/**
* When the following status changes.
*
* @param inStatus
* status.
*/
private void onFollowerStatusChanged(final Follower.FollowerStatus inStatus)
{
followLink.setVisible(true);
status = inStatus;
switch (inStatus)
{
case FOLLOWING:
followLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().unFollowLink());
break;
case NOTFOLLOWING:
followLink.removeStyleName(StaticResourceBundle.INSTANCE.coreCss().unFollowLink());
break;
default:
break;
}
}
/**
* Got the person.
*
* @param person
* the person.
*/
private void gotPerson(final PersonModelView person)
{
showFollowing.setVisible(true);
followingCount.getStyle().setDisplay(Display.INLINE);
followingLink.setVisible(true);
adminLink.setVisible(false);
coordinatorsLink.setVisible(false);
streamId = person.getStreamId();
Session.getInstance().setPageTitle(person.getDisplayName());
if (person.getAccountId().equals(Session.getInstance().getCurrentPerson().getAccountId()))
{
configureLink.setVisible(true);
configureLink.setHref("#personalsettings/" + person.getAccountId());
}
else
{
configureLink.setVisible(false);
}
updateFollowLink(person.getAccountId(), EntityType.PERSON);
FeaturedStreamDTO featuredStreamDTO = new FeaturedStreamDTO();
featuredStreamDTO.setDescription(person.getDescription());
featuredStreamDTO.setStreamId(person.getStreamId());
featuredStreamDTO.setStreamType(ScopeType.PERSON);
featuredStreamDTO.setDisplayName(person.getDisplayName());
currentFeaturedStreamDTO = featuredStreamDTO;
if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
{
FeaturedStreamModel.getInstance().fetch(new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
}
setStreamName(person.getDisplayName());
streamMeta.setInnerText(person.getTitle());
streamAvatar.clear();
streamAvatar.add(avatarRenderer.render(person.getEntityId(), person.getAvatarId(), EntityType.PERSON,
Size.Normal));
followerCount.setInnerText(Integer.toString(person.getFollowersCount()));
followingCount.setInnerText(Integer.toString(person.getFollowingCount() + person.getGroupsCount()));
streamDescription.setInnerText(person.getJobDescription());
if (person.getJobDescription() == null || person.getJobDescription().length() == 0)
{
streamDescription.setInnerText("No job description entered.");
streamDescription.addClassName(style.emptyDetailStyle());
}
else
{
streamDescription.removeClassName(style.emptyDetailStyle());
}
String interestString = "";
for (String interest : person.getInterests())
{
interestString += "<a href='#search?query=" + interest + "'>" + interest + "</a> ";
}
streamInterests.setInnerHTML(interestString);
if (interestString.length() == 0)
{
streamInterests.setInnerHTML("No interests entered.");
streamInterests.addClassName(style.emptyDetailStyle());
}
else
{
streamInterests.removeClassName(style.emptyDetailStyle());
}
contactInfoTitle.setInnerText("Contact Information");
String contact = "";
String email = person.getEmail();
if (email != null)
{
contact = "<a href=\"mailto:" + email + "\">" + email + "</a>";
}
if (person.getWorkPhone() != null)
{
if (email != null)
{
contact += "<br />";
}
contact += person.getWorkPhone();
}
contactInfo.setInnerHTML(contact);
if (contact.length() == 0)
{
contactInfo.setInnerHTML("No contact information entered.");
contactInfo.addClassName(style.emptyDetailStyle());
}
else
{
contactInfo.removeClassName(style.emptyDetailStyle());
}
PopularHashTagsModel.getInstance().fetch(
new StreamPopularHashTagsRequest(ScopeType.PERSON, person.getAccountId()), true);
UsageMetricModel.getInstance().fetch(
new UsageMetricStreamSummaryRequest(NUM_DAYS_FOR_METRICS, person.getStreamId()), true);
}
}