From eb198b74b0969a33153b72021b50beb106d6916f Mon Sep 17 00:00:00 2001 From: Athou Date: Sun, 19 May 2013 16:24:56 +0200 Subject: [PATCH] bookmarklet for next unread item --- .../frontend/CommaFeedApplication.java | 4 +- .../pages/NextUnreadRedirectPage.java | 68 +++++++++++++++++++ src/main/resources/i18n/en.properties | 4 ++ src/main/webapp/js/controllers.js | 12 +++- src/main/webapp/js/main.js | 7 +- src/main/webapp/sass/app.scss | 3 +- src/main/webapp/sass/components/_help.scss | 5 ++ src/main/webapp/templates/feeds.help.html | 18 +++-- 8 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java create mode 100644 src/main/webapp/sass/components/_help.scss diff --git a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java index 0933de94..d3668d4f 100644 --- a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java @@ -43,7 +43,7 @@ import com.commafeed.frontend.pages.GoogleImportCallbackPage; import com.commafeed.frontend.pages.GoogleImportRedirectPage; import com.commafeed.frontend.pages.HomePage; import com.commafeed.frontend.pages.LogoutPage; -import com.commafeed.frontend.pages.TestRssPage; +import com.commafeed.frontend.pages.NextUnreadRedirectPage; import com.commafeed.frontend.pages.WelcomePage; import com.commafeed.frontend.utils.exception.DisplayExceptionPage; @@ -72,7 +72,7 @@ public class CommaFeedApplication extends AuthenticatedWebApplication { mountPage(GoogleImportCallbackPage.PAGE_PATH, GoogleImportCallbackPage.class); - mountPage("testfeed", TestRssPage.class); + mountPage("next", NextUnreadRedirectPage.class); setupInjection(); setupSecurity(); diff --git a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java new file mode 100644 index 00000000..7a59f0b8 --- /dev/null +++ b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java @@ -0,0 +1,68 @@ +package com.commafeed.frontend.pages; + +import java.util.List; + +import javax.inject.Inject; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.request.flow.RedirectToUrlException; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +import com.commafeed.backend.dao.FeedCategoryDAO; +import com.commafeed.backend.dao.FeedEntryStatusDAO; +import com.commafeed.backend.model.FeedCategory; +import com.commafeed.backend.model.FeedEntryStatus; +import com.commafeed.backend.model.User; +import com.commafeed.backend.model.UserRole.Role; +import com.commafeed.backend.model.UserSettings.ReadingOrder; +import com.commafeed.frontend.CommaFeedSession; +import com.commafeed.frontend.SecurityCheck; +import com.commafeed.frontend.rest.resources.CategoryREST; +import com.google.common.collect.Iterables; + +@SuppressWarnings("serial") +@SecurityCheck(Role.USER) +public class NextUnreadRedirectPage extends WebPage { + + public static final String PARAM_CATEGORYID = "category"; + + @Inject + FeedCategoryDAO feedCategoryDAO; + + @Inject + FeedEntryStatusDAO feedEntryStatusDAO; + + public NextUnreadRedirectPage(PageParameters params) { + String categoryId = params.get(PARAM_CATEGORYID).toString(); + User user = CommaFeedSession.get().getUser(); + + List statuses = null; + if (StringUtils.isBlank(categoryId) + || CategoryREST.ALL.equals(categoryId)) { + statuses = feedEntryStatusDAO.findAll(user, true, 0, 1, + ReadingOrder.desc, false); + } else { + FeedCategory category = feedCategoryDAO.findById(user, + Long.valueOf(categoryId)); + if (category != null) { + List children = feedCategoryDAO + .findAllChildrenCategories(user, category); + statuses = feedEntryStatusDAO.findByCategories(children, user, + true, 0, 1, ReadingOrder.desc, false); + } + } + + if (CollectionUtils.isEmpty(statuses)) { + setResponsePage(HomePage.class); + } else { + FeedEntryStatus status = Iterables.getFirst(statuses, null); + String url = status.getEntry().getUrl(); + status.setRead(true); + feedEntryStatusDAO.update(status); + throw new RedirectToUrlException(url); + } + } + +} diff --git a/src/main/resources/i18n/en.properties b/src/main/resources/i18n/en.properties index 03d362f7..2d1a7a59 100644 --- a/src/main/resources/i18n/en.properties +++ b/src/main/resources/i18n/en.properties @@ -3,6 +3,8 @@ global.cancel=Cancel global.delete=Delete global.required=Required global.download=Download +global.link=Link +global.bookmark=Bookmark tree.subscribe=Subscribe tree.import=Import @@ -87,6 +89,8 @@ about.goodies=Goodies about.goodies.subscribe_url=Subscribe URL about.goodies.chrome_extension=Chrome extension about.goodies.firefox_extension=Firefox extension +about.goodies.subscribe_bookmarklet=Add subscription bookmarklet (click) +about.goodies.next_unread_bookmarklet=Next unread item bookmarklet (drag to bookmark bar) about.translation=Translation about.translation.message=We need your help to translate CommaFeed. about.translation.link=See how to contribute with translations. diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index dd90b6d4..b635265f 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -936,6 +936,16 @@ function($scope, $location, $state, AdminSettingsService) { }; }]); +module.controller('HelpController', [ '$scope', 'CategoryService', + 'AnalyticsService', +function($scope, CategoryService, AnalyticsService) { + + AnalyticsService.track(); + $scope.CategoryService = CategoryService; + $scope.categoryId = 'all'; + +} ]); + module.controller('FooterController', [ '$scope', function($scope) { var baseUrl = window.location.href.substring(0, window.location.href.lastIndexOf('#')); @@ -943,4 +953,4 @@ module.controller('FooterController', [ '$scope', function($scope) { $scope.subToMeUrl = baseUrl + 'rest/feed/subscribe?url={feed}'; $scope.subToMeName = hostname.indexOf('www.commafeed.com') !== -1 ? 'CommaFeed' : 'CommaFeed (' + hostname + ')'; -} ]); \ No newline at end of file +}]); \ No newline at end of file diff --git a/src/main/webapp/js/main.js b/src/main/webapp/js/main.js index 80c393d7..cfd8395b 100644 --- a/src/main/webapp/js/main.js +++ b/src/main/webapp/js/main.js @@ -30,11 +30,6 @@ app.config([ '$routeProvider', '$stateProvider', '$urlRouterProvider', '$httpPro $httpProvider.responseInterceptors.push(interceptor); - - var trackCtrl = [ 'AnalyticsService', function(AnalyticsService) { - AnalyticsService.track(); - } ]; - $stateProvider.state('feeds', { 'abstract' : true, url : '/feeds', @@ -63,7 +58,7 @@ app.config([ '$routeProvider', '$stateProvider', '$urlRouterProvider', '$httpPro $stateProvider.state('feeds.help', { url : '/help', templateUrl : 'templates/feeds.help.html', - controller : trackCtrl + controller : 'HelpController' }); $stateProvider.state('feeds.settings', { url : '/settings', diff --git a/src/main/webapp/sass/app.scss b/src/main/webapp/sass/app.scss index 7e04670b..c0bf1e38 100644 --- a/src/main/webapp/sass/app.scss +++ b/src/main/webapp/sass/app.scss @@ -5,4 +5,5 @@ @import "components/admin-panel"; @import "components/toolbar"; @import "components/entry-list"; -@import "components/subscription-list"; \ No newline at end of file +@import "components/subscription-list"; +@import "components/help"; \ No newline at end of file diff --git a/src/main/webapp/sass/components/_help.scss b/src/main/webapp/sass/components/_help.scss new file mode 100644 index 00000000..90964c6d --- /dev/null +++ b/src/main/webapp/sass/components/_help.scss @@ -0,0 +1,5 @@ +.help .category-select { + margin: 0; + padding: 0; + height: auto; +} \ No newline at end of file diff --git a/src/main/webapp/templates/feeds.help.html b/src/main/webapp/templates/feeds.help.html index 31cbee5f..2279173f 100644 --- a/src/main/webapp/templates/feeds.help.html +++ b/src/main/webapp/templates/feeds.help.html @@ -1,4 +1,4 @@ -
+

${toolbar.about}

@@ -21,15 +21,25 @@

${about.goodies}

-

- ${about.goodies.subscribe_url}: rest/feed/subscribe?url=FEED_URL_HERE -

${about.goodies.chrome_extension}

${about.goodies.firefox_extension}

+

+ ${about.goodies.subscribe_url}: rest/feed/subscribe?url=FEED_URL_HERE +

+

+ ${about.goodies.subscribe_bookmarklet}: SubToMe +

+

+ ${about.goodies.next_unread_bookmarklet}: ${subscribe.category} + + ${global.link} +

${about.translation}