diff --git a/distro/changelog.xml b/distro/changelog.xml index 2c2367b..aacb4d0 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -1,7 +1,8 @@ + date="2014-04-08"> Implemented the automatic scroll back in time for feeds (in VRE scope) + Added possibility to unlike alread liked posts Fixed double notifications for post owner who commented his post Fixed double notifications for post owner who liked his post Fixed user referral problem when post was deleted diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java index 8a6e2a5..4832046 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java @@ -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); diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java index 3dd3d9e..6169d46 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java @@ -50,5 +50,8 @@ public interface NewsServiceAsync { void getMoreFeeds(int from, int quantity, AsyncCallback callback); + + void unlike(String feedid, String feedText, String feedOwnerId, + AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/event/UnLikeEvent.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/UnLikeEvent.java new file mode 100644 index 0000000..28f8c78 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/UnLikeEvent.java @@ -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 { + public static Type TYPE = new Type(); + 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 getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(UnLikeEventHandler handler) { + handler.onUnLike(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/event/UnLikeEventHandler.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/UnLikeEventHandler.java new file mode 100644 index 0000000..58cd263 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/UnLikeEventHandler.java @@ -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); + } diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java index 8d3295a..5929c0a 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java @@ -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>() { + newsService.getAllUpdateUserFeeds(NewsConstants.FEEDS_NO_PER_CATEGORY, new AsyncCallback>() { @Override public void onSuccess(ArrayList 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>() { + newsService.getAllUpdateUserFeeds(NewsConstants.FEEDS_NO_PER_CATEGORY, new AsyncCallback>() { @Override public void onSuccess(ArrayList 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() { + @Override + public void onFailure(Throwable caught) {} + @Override + public void onSuccess(Boolean result) { } + }); + + } private void doShowSessionExpired() { GWT.runAsync(UserSelectionDialog.class, new RunAsyncCallback() { diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java index 6c118fc..5b14233 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java @@ -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("" + NewsFeedPanel.LIKE_LABEL + ""); - + //show if the user has already liked this or not + setFavoritedUI(myFeed.isLiked()); + commentArea.setHTML("" + NewsFeedPanel.COMMENT_LABEL + ""); String feedText = feed.getDescription(); @@ -277,10 +273,21 @@ public class TweetTemplate extends Composite { seeMore.setHTML(""); } - + private void setFavoritedUI(boolean favorited) { + if (favorited) { + likeArea.setHTML("" + NewsFeedPanel.LIKED_LABEL + ""); + likeArea.setTitle("Unfavorite this"); + } + else { + likeArea.setHTML("" + NewsFeedPanel.LIKE_LABEL + ""); + } + } + + @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); } } diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java b/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java index 65a0b86..fae7ebf 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java @@ -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 OrganizationFeeds = (ArrayList) store.getRecentFeedsByVRE(vreid, (feedsNoPerCategory*3)); + ArrayList OrganizationFeeds = (ArrayList) 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 userFriendsIds = (ArrayList)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 diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/shared/NewsConstants.java b/src/main/java/org/gcube/portlets/user/newsfeed/shared/NewsConstants.java new file mode 100644 index 0000000..993dfa5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/shared/NewsConstants.java @@ -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; +}