Added support for unlike feature

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/news-feed@94597 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Massimiliano Assante 2014-04-08 21:40:13 +00:00
parent 77258468d4
commit aedf4cb81c
9 changed files with 141 additions and 20 deletions

View File

@ -1,7 +1,8 @@
<ReleaseNotes>
<Changeset component="org.gcube.portlets.user.NewsFeed.1-6-4"
date="2014-04-03">
date="2014-04-08">
<Change>Implemented the automatic scroll back in time for feeds (in VRE scope)</Change>
<Change>Added possibility to unlike alread liked posts</Change>
<Change>Fixed double notifications for post owner who commented his post</Change>
<Change>Fixed double notifications for post owner who liked his post</Change>
<Change>Fixed user referral problem when post was deleted </Change>

View File

@ -29,6 +29,8 @@ public interface NewsService extends RemoteService {
boolean like(String feedid, String feedText, String feedOwnerId);
boolean unlike(String feedid, String feedText, String feedOwnerId);
boolean deleteComment(String commentid, String feedid);
boolean deleteFeed(String feedid);

View File

@ -50,5 +50,8 @@ public interface NewsServiceAsync {
void getMoreFeeds(int from, int quantity,
AsyncCallback<MoreFeedsBean> callback);
void unlike(String feedid, String feedText, String feedOwnerId,
AsyncCallback<Boolean> callback);
}

View File

@ -0,0 +1,36 @@
package org.gcube.portlets.user.newsfeed.client.event;
import org.gcube.portlets.user.newsfeed.client.templates.TweetTemplate;
import com.google.gwt.event.shared.GwtEvent;
public class UnLikeEvent extends GwtEvent<UnLikeEventHandler> {
public static Type<UnLikeEventHandler> TYPE = new Type<UnLikeEventHandler>();
private TweetTemplate owner;
private final String feedid;
public UnLikeEvent(TweetTemplate owner, String feedid) {
this.feedid = feedid;
this.owner = owner;
}
public String getFeedId() {
return feedid;
}
public TweetTemplate getOwner() {
return owner;
}
@Override
public Type<UnLikeEventHandler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(UnLikeEventHandler handler) {
handler.onUnLike(this);
}
}

View File

@ -0,0 +1,7 @@
package org.gcube.portlets.user.newsfeed.client.event;
import com.google.gwt.event.shared.EventHandler;
public interface UnLikeEventHandler extends EventHandler {
void onUnLike(UnLikeEvent event);
}

View File

@ -35,6 +35,8 @@ import org.gcube.portlets.user.newsfeed.client.event.ShowMoreUpdatesEvent;
import org.gcube.portlets.user.newsfeed.client.event.ShowMoreUpdatesEventHandler;
import org.gcube.portlets.user.newsfeed.client.event.ShowNewUpdatesEvent;
import org.gcube.portlets.user.newsfeed.client.event.ShowNewUpdatesEventHandler;
import org.gcube.portlets.user.newsfeed.client.event.UnLikeEvent;
import org.gcube.portlets.user.newsfeed.client.event.UnLikeEventHandler;
import org.gcube.portlets.user.newsfeed.client.templates.FilterPanel;
import org.gcube.portlets.user.newsfeed.client.templates.NewFeedsAvailable;
import org.gcube.portlets.user.newsfeed.client.templates.ShowMoreFeeds;
@ -42,6 +44,7 @@ import org.gcube.portlets.user.newsfeed.client.templates.SingleComment;
import org.gcube.portlets.user.newsfeed.client.templates.TweetTemplate;
import org.gcube.portlets.user.newsfeed.shared.EnhancedFeed;
import org.gcube.portlets.user.newsfeed.shared.MoreFeedsBean;
import org.gcube.portlets.user.newsfeed.shared.NewsConstants;
import org.gcube.portlets.user.newsfeed.shared.UserSettings;
import org.gcube.portlets.widgets.sessionchecker.client.CheckSession;
import org.gcube.portlets.widgets.userselection.client.UserSelectionDialog;
@ -114,7 +117,6 @@ public class NewsFeedPanel extends Composite {
private boolean isFirstTweet = false;
private static final int feedsNoPerCategory = 10;
private Image loadingImage;
private UserInfo myUserInfo;
@ -153,6 +155,13 @@ public class NewsFeedPanel extends Composite {
doAddLike( event.getOwner(), event.getFeedId());
}
});
eventBus.addHandler(UnLikeEvent.TYPE, new UnLikeEventHandler() {
@Override
public void onUnLike(UnLikeEvent event) {
doUnLike(event.getOwner(), event.getFeedId());
}
});
eventBus.addHandler(AddCommentEvent.TYPE, new AddCommentEventHandler() {
@Override
@ -378,7 +387,7 @@ public class NewsFeedPanel extends Composite {
* is open at infra level the first tab stops checking for updates
*/
if (result.getCurrentScope().compareTo(currentScope) == 0) {
newsService.getAllUpdateUserFeeds(feedsNoPerCategory, new AsyncCallback<ArrayList<EnhancedFeed>>() {
newsService.getAllUpdateUserFeeds(NewsConstants.FEEDS_NO_PER_CATEGORY, new AsyncCallback<ArrayList<EnhancedFeed>>() {
@Override
public void onSuccess(ArrayList<EnhancedFeed> feeds) {
if (feeds != null && allUpdates.size() > 0) {
@ -493,7 +502,7 @@ public class NewsFeedPanel extends Composite {
*/
public void showAllUpdatesFeeds() {
showLoader();
newsService.getAllUpdateUserFeeds(feedsNoPerCategory, new AsyncCallback<ArrayList<EnhancedFeed>>() {
newsService.getAllUpdateUserFeeds(NewsConstants.FEEDS_NO_PER_CATEGORY, new AsyncCallback<ArrayList<EnhancedFeed>>() {
@Override
public void onSuccess(ArrayList<EnhancedFeed> feeds) {
newsPanel.clear();
@ -522,9 +531,9 @@ public class NewsFeedPanel extends Composite {
if (feeds.size() < 5) {
newsPanel.add(new Image(spacer));
}
//if you are showing more than feedsNoPerCategory*3-1 feeds there is probably more
if (feeds.size() >= feedsNoPerCategory*3-1 && (!isInfrastructure)) {
GWT.log("Show MORE " + feedsNoPerCategory);
//if you are showing more than feedsMaxPerCategory-1 feeds there is probably more
if (feeds.size() >= NewsConstants.FEEDS_MAX_PER_CATEGORY-1 && (!isInfrastructure)) {
GWT.log("Show MORE " + NewsConstants.FEEDS_NO_PER_CATEGORY);
showMoreUpdatesPanel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER);
showMoreWidget = new ShowMoreFeeds(eventBus);
showMoreUpdatesPanel.add(showMoreWidget);
@ -757,6 +766,16 @@ public class NewsFeedPanel extends Composite {
public void onSuccess(Boolean result) { }
});
}
protected void doUnLike(TweetTemplate owner, String feedId) {
newsService.unlike(feedId, owner.getMyFeedText(), owner.getMyFeedUserId(), new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {}
@Override
public void onSuccess(Boolean result) { }
});
}
private void doShowSessionExpired() {
GWT.runAsync(UserSelectionDialog.class, new RunAsyncCallback() {

View File

@ -16,6 +16,7 @@ import org.gcube.portlets.user.newsfeed.client.event.DeleteFeedEvent;
import org.gcube.portlets.user.newsfeed.client.event.OpenFeedEvent;
import org.gcube.portlets.user.newsfeed.client.event.SeeCommentsEvent;
import org.gcube.portlets.user.newsfeed.client.event.SeeLikesEvent;
import org.gcube.portlets.user.newsfeed.client.event.UnLikeEvent;
import org.gcube.portlets.user.newsfeed.client.panels.NewsFeedPanel;
import org.gcube.portlets.user.newsfeed.shared.EnhancedFeed;
import org.gcube.portlets.widgets.wsmail.client.forms.MailForm;
@ -137,14 +138,9 @@ public class TweetTemplate extends Composite {
openImage.setStyleName("openImage");
openImage.setTitle("Open this feed separately");
//show if the user has already liked this
if (myFeed.isLiked()) {
likeArea.setHTML(NewsFeedPanel.LIKED_LABEL);
}
else
likeArea.setHTML("<a>" + NewsFeedPanel.LIKE_LABEL + "</a>");
//show if the user has already liked this or not
setFavoritedUI(myFeed.isLiked());
commentArea.setHTML("<a>" + NewsFeedPanel.COMMENT_LABEL + "</a>");
String feedText = feed.getDescription();
@ -277,10 +273,21 @@ public class TweetTemplate extends Composite {
seeMore.setHTML("");
}
private void setFavoritedUI(boolean favorited) {
if (favorited) {
likeArea.setHTML("<a style=\"color:#6E8CCC;\">" + NewsFeedPanel.LIKED_LABEL + "</a>");
likeArea.setTitle("Unfavorite this");
}
else {
likeArea.setHTML("<a>" + NewsFeedPanel.LIKE_LABEL + "</a>");
}
}
@UiHandler("likeArea")
void onLikeClick(ClickEvent e) {
//if is not liked
if (!likeArea.getText().equals(NewsFeedPanel.LIKED_LABEL)) {
try {
int cur = Integer.parseInt(myFeed.getFeed().getLikesNo());
@ -295,11 +302,26 @@ public class TweetTemplate extends Composite {
likesNo.setHTML(""+cur);
}
eventBus.fireEvent(new AddLikeEvent(this, myFeed.getFeed().getKey()));
likeArea.setHTML(NewsFeedPanel.LIKED_LABEL);
setFavoritedUI(true);
}
catch (NumberFormatException ex) {
likeArea.setHTML("Error on the server");
}
} else {
//it is liked
int cur = Integer.parseInt(myFeed.getFeed().getLikesNo());
cur--;
if (cur == 0) {
myFeed.getFeed().setLikesNo("0");
likesNo.setHTML("");
likesNo.removeStyleName("likes-number");
likesNo.setTitle("");
} else {
myFeed.getFeed().setLikesNo(""+cur);
likesNo.setHTML(""+cur);
}
eventBus.fireEvent(new UnLikeEvent(this, myFeed.getFeed().getKey()));
setFavoritedUI(false);
}
}

View File

@ -33,10 +33,12 @@ import org.gcube.portal.databook.shared.UserInfo;
import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException;
import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException;
import org.gcube.portal.databook.shared.ex.FeedTypeNotFoundException;
import org.gcube.portal.databook.shared.ex.LikeIDNotFoundException;
import org.gcube.portal.databook.shared.ex.PrivacyLevelTypeNotFoundException;
import org.gcube.portlets.user.newsfeed.client.NewsService;
import org.gcube.portlets.user.newsfeed.shared.EnhancedFeed;
import org.gcube.portlets.user.newsfeed.shared.MoreFeedsBean;
import org.gcube.portlets.user.newsfeed.shared.NewsConstants;
import org.gcube.portlets.user.newsfeed.shared.UserSettings;
import org.gcube.vomanagement.usermanagement.GroupManager;
import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager;
@ -223,7 +225,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
else {
String vreid = getASLSession().getScopeName();
_log.trace("News Feed in VRE, Reading feeds for VRE: " + vreid);
ArrayList<Feed> OrganizationFeeds = (ArrayList<Feed>) store.getRecentFeedsByVRE(vreid, (feedsNoPerCategory*3));
ArrayList<Feed> OrganizationFeeds = (ArrayList<Feed>) store.getRecentFeedsByVRE(vreid, (NewsConstants.FEEDS_MAX_PER_CATEGORY));
for (Feed feed : OrganizationFeeds) {
feedsMap.put(feed.getKey(), feed);
}
@ -270,13 +272,13 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
String userName = getASLSession().getUsername();
try {
if (! withinPortal) {
return getEclipseResult(userName, 10, true);
return getEclipseResult(userName, NewsConstants.FEEDS_NO_PER_CATEGORY, true);
}
else {
//UserFriends Feeds
ArrayList<String> userFriendsIds = (ArrayList<String>)store.getFriends(userName);
for (String userid : userFriendsIds) {
for (Feed feed : store.getRecentFeedsByUser(userid, 10)) {
for (Feed feed : store.getRecentFeedsByUser(userid, NewsConstants.FEEDS_NO_PER_CATEGORY)) {
feedsMap.put(feed.getKey(), feed);
}
}
@ -463,6 +465,25 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
}
return likeCommitResult;
}
@Override
public boolean unlike(String feedid, String feedText, String feedOwnerId) {
UserInfo user = getUserSettings().getUserInfo();
try {
for (Like like : store.getAllLikesByFeed(feedid)) {
if (like.getUserid().compareTo(user.getUsername()) == 0) {
_log.trace("Trying unlike of " + feedText + " for " + user.getFullName());
store.unlike(user.getUsername(), like.getKey(), feedid);
return true;
}
}
} catch (FeedIDNotFoundException | PrivacyLevelTypeNotFoundException | FeedTypeNotFoundException | ColumnNameNotFoundException | LikeIDNotFoundException e) {
_log.error("Either Feed or Like not Found " + e.getMessage());
e.printStackTrace();
return false;
}
return false;
}
/**
* @param feedid the id of the commented feed
* @param commentText the comment text

View File

@ -0,0 +1,10 @@
package org.gcube.portlets.user.newsfeed.shared;
public class NewsConstants {
/**
* Feeds Number to who per VRE/Category
*/
public static final int FEEDS_NO_PER_CATEGORY = 10;
public static final int FEEDS_MAX_PER_CATEGORY = 30;
}