diff options
-rw-r--r-- | js/app/services/bl/itembl.coffee | 53 | ||||
-rw-r--r-- | js/app/services/bl/starredbl.coffee | 7 | ||||
-rw-r--r-- | js/app/services/persistence.coffee | 1 | ||||
-rw-r--r-- | js/public/app.js | 85 | ||||
-rw-r--r-- | js/tests/services/bl/itemblSpec.coffee | 109 | ||||
-rw-r--r-- | js/tests/services/bl/starredblSpec.coffee | 6 | ||||
-rw-r--r-- | templates/part.showall.php | 4 |
7 files changed, 245 insertions, 20 deletions
diff --git a/js/app/services/bl/itembl.coffee b/js/app/services/bl/itembl.coffee index 8c718d653..fb9f04623 100644 --- a/js/app/services/bl/itembl.coffee +++ b/js/app/services/bl/itembl.coffee @@ -22,12 +22,13 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. angular.module('News').factory 'ItemBl', -['ItemModel', 'Persistence', 'ActiveFeed', 'FeedType', -(ItemModel, Persistence, ActiveFeed, FeedType) -> +['ItemModel', 'FeedModel', 'Persistence', 'ActiveFeed', 'FeedType', 'StarredBl', +(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, StarredBl) -> class ItemBl - constructor: (@_itemModel, @_persistence, @_activeFeed, @_feedType) -> + constructor: (@_itemModel, @_feedModel, @_persistence, @_activeFeed, + @_feedType, @_starredBl) -> getAll: -> return @_itemModel.getAll() @@ -38,21 +39,65 @@ angular.module('News').factory 'ItemBl', isKeptUnread: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) and angular.isDefined(item.keptUnread) + return item.keptUnread + return false toggleKeepUnread: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) and not item.keptUnread + item.keptUnread = true + if item.isRead() + @setUnread(itemId) + else + item.keptUnread = false toggleStarred: (itemId) -> + item = @_itemModel.getById(itemId) + if item.isStarred() + item.setUnstarred() + @_starredBl.decreaseCount() + @_persistence.unstarItem(item.feedId, item.guidHash) + else + item.setStarred() + @_starredBl.increaseCount() + @_persistence.starItem(item.feedId, item.guidHash) setRead: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) + item.setRead() + @_persistence.readItem(itemId) + + + setUnread: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) + item.setUnread() + @_persistence.unreadItem(itemId) getFeedTitle: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) + feed = @_feedModel.getById(item.feedId) + if angular.isDefined(feed) + return feed.title + + + loadNext: -> + + + + loadNew: -> - return new ItemBl(ItemModel, Persistence, ActiveFeed, FeedType) + return new ItemBl(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, + StarredBl) ]
\ No newline at end of file diff --git a/js/app/services/bl/starredbl.coffee b/js/app/services/bl/starredbl.coffee index 0b1d45500..176973e04 100644 --- a/js/app/services/bl/starredbl.coffee +++ b/js/app/services/bl/starredbl.coffee @@ -42,6 +42,13 @@ angular.module('News').factory 'StarredBl', return @_starredCount.getStarredCount() + increaseCount: -> + @_starredCount.setStarredCount(@_starredCount.getStarredCount() + 1) + + + decreaseCount: -> + @_starredCount.setStarredCount(@_starredCount.getStarredCount() - 1) + return new StarredBl(StarredCount, FeedType, Persistence, ActiveFeed, ItemModel) ] diff --git a/js/app/services/persistence.coffee b/js/app/services/persistence.coffee index 41aa13722..2231a5b79 100644 --- a/js/app/services/persistence.coffee +++ b/js/app/services/persistence.coffee @@ -93,7 +93,6 @@ angular.module('News').factory '_Persistence', -> @_request.post 'news_items_star', params - unstarItem: (feedId, guidHash) -> ### Unstars an item diff --git a/js/public/app.js b/js/public/app.js index 718c89a02..c567e8fee 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -805,15 +805,17 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. (function() { angular.module('News').factory('ItemBl', [ - 'ItemModel', 'Persistence', 'ActiveFeed', 'FeedType', function(ItemModel, Persistence, ActiveFeed, FeedType) { + 'ItemModel', 'FeedModel', 'Persistence', 'ActiveFeed', 'FeedType', 'StarredBl', function(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, StarredBl) { var ItemBl; ItemBl = (function() { - function ItemBl(_itemModel, _persistence, _activeFeed, _feedType) { + function ItemBl(_itemModel, _feedModel, _persistence, _activeFeed, _feedType, _starredBl) { this._itemModel = _itemModel; + this._feedModel = _feedModel; this._persistence = _persistence; this._activeFeed = _activeFeed; this._feedType = _feedType; + this._starredBl = _starredBl; } ItemBl.prototype.getAll = function() { @@ -824,20 +826,79 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return this._activeFeed.getType() !== this._feedType.Feed; }; - ItemBl.prototype.isKeptUnread = function(itemId) {}; + ItemBl.prototype.isKeptUnread = function(itemId) { + var item; + item = this._itemModel.getById(itemId); + if (angular.isDefined(item) && angular.isDefined(item.keptUnread)) { + return item.keptUnread; + } + return false; + }; - ItemBl.prototype.toggleKeepUnread = function(itemId) {}; + ItemBl.prototype.toggleKeepUnread = function(itemId) { + var item; + item = this._itemModel.getById(itemId); + if (angular.isDefined(item) && !item.keptUnread) { + item.keptUnread = true; + if (item.isRead()) { + return this.setUnread(itemId); + } + } else { + return item.keptUnread = false; + } + }; - ItemBl.prototype.toggleStarred = function(itemId) {}; + ItemBl.prototype.toggleStarred = function(itemId) { + var item; + item = this._itemModel.getById(itemId); + if (item.isStarred()) { + item.setUnstarred(); + this._starredBl.decreaseCount(); + return this._persistence.unstarItem(item.feedId, item.guidHash); + } else { + item.setStarred(); + this._starredBl.increaseCount(); + return this._persistence.starItem(item.feedId, item.guidHash); + } + }; - ItemBl.prototype.setRead = function(itemId) {}; + ItemBl.prototype.setRead = function(itemId) { + var item; + item = this._itemModel.getById(itemId); + if (angular.isDefined(item)) { + item.setRead(); + return this._persistence.readItem(itemId); + } + }; + + ItemBl.prototype.setUnread = function(itemId) { + var item; + item = this._itemModel.getById(itemId); + if (angular.isDefined(item)) { + item.setUnread(); + return this._persistence.unreadItem(itemId); + } + }; + + ItemBl.prototype.getFeedTitle = function(itemId) { + var feed, item; + item = this._itemModel.getById(itemId); + if (angular.isDefined(item)) { + feed = this._feedModel.getById(item.feedId); + if (angular.isDefined(feed)) { + return feed.title; + } + } + }; - ItemBl.prototype.getFeedTitle = function(itemId) {}; + ItemBl.prototype.loadNext = function() {}; + + ItemBl.prototype.loadNew = function() {}; return ItemBl; })(); - return new ItemBl(ItemModel, Persistence, ActiveFeed, FeedType); + return new ItemBl(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, StarredBl); } ]); @@ -895,6 +956,14 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return this._starredCount.getStarredCount(); }; + StarredBl.prototype.increaseCount = function() { + return this._starredCount.setStarredCount(this._starredCount.getStarredCount() + 1); + }; + + StarredBl.prototype.decreaseCount = function() { + return this._starredCount.setStarredCount(this._starredCount.getStarredCount() - 1); + }; + return StarredBl; })(_Bl); diff --git a/js/tests/services/bl/itemblSpec.coffee b/js/tests/services/bl/itemblSpec.coffee index ff2bbd80a..01b02bfb2 100644 --- a/js/tests/services/bl/itemblSpec.coffee +++ b/js/tests/services/bl/itemblSpec.coffee @@ -28,13 +28,10 @@ describe 'ItemBl', -> beforeEach => angular.module('News').factory 'Persistence', => - @setFeedReadSpy = jasmine.createSpy('setFeedRead') - @persistence = { - - } + @persistence = {} beforeEach inject (@ItemModel, @ItemBl, @StatusFlag, @ActiveFeed - @FeedType) => + @FeedType, @FeedModel, @StarredBl) => it 'should return all items', => @@ -69,3 +66,105 @@ describe 'ItemBl', -> @ActiveFeed.handle({type: @FeedType.Feed, id: 0}) expect(@ItemBl.noFeedActive()).toBe(false) + + it 'should return the correct feed title', => + item1 = {id: 5, title: 'hi', unreadCount:134, urlHash: 'a3', folderId: 3} + @FeedModel.add(item1) + + item2 = {id: 2, feedId: 5, guidHash: 'a3'} + @ItemModel.add(item2) + + expect(@ItemBl.getFeedTitle(2)).toBe('hi') + + + it 'should set an item unstarred', => + @persistence.unstarItem = jasmine.createSpy('star item') + + item2 = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item2) + item2.setStarred() + + @ItemBl.toggleStarred(2) + + expect(item2.isStarred()).toBe(false) + expect(@StarredBl.getUnreadCount()).toBe(-1) + expect(@persistence.unstarItem).toHaveBeenCalledWith(5, 'a3') + + + it 'should set an item starred', => + @persistence.starItem = jasmine.createSpy('unstar item') + + item2 = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item2) + item2.setUnstarred() + + @ItemBl.toggleStarred(2) + + expect(item2.isStarred()).toBe(true) + expect(@StarredBl.getUnreadCount()).toBe(1) + expect(@persistence.starItem).toHaveBeenCalledWith(5, 'a3') + + + it 'should set an item read', => + @persistence.readItem = jasmine.createSpy('read item') + + item = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item) + item.setUnread() + + @ItemBl.setRead(2) + + expect(item.isRead()).toBe(true) + expect(@persistence.readItem).toHaveBeenCalledWith(2) + + + it 'should return false when item kept unread does not exist', => + expect(@ItemBl.isKeptUnread(2)).toBe(false) + + + it 'should return false if an item is not kept unread', => + item = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item) + + expect(@ItemBl.isKeptUnread(2)).toBe(false) + + + it 'should toggle an item as kept unread', => + @persistence.unreadItem = jasmine.createSpy('unread item') + + item = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item) + + expect(@ItemBl.isKeptUnread(2)).toBe(false) + + @ItemBl.toggleKeepUnread(2) + expect(@ItemBl.isKeptUnread(2)).toBe(true) + + @ItemBl.toggleKeepUnread(2) + expect(@ItemBl.isKeptUnread(2)).toBe(false) + + + it 'should set an item as unread', => + @persistence.unreadItem = jasmine.createSpy('unread item') + + item = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item) + item.setRead() + + @ItemBl.setUnread(2) + + expect(item.isRead()).toBe(false) + expect(@persistence.unreadItem).toHaveBeenCalledWith(2) + + + it 'should set item as unread if kept unread is toggled and it is read', => + @persistence.unreadItem = jasmine.createSpy('unread item') + + item = {id: 2, feedId: 5, guidHash: 'a3', status: 0} + @ItemModel.add(item) + item.setRead() + + @ItemBl.toggleKeepUnread(2) + + expect(item.isRead()).toBe(false) + expect(@persistence.unreadItem).toHaveBeenCalledWith(2) diff --git a/js/tests/services/bl/starredblSpec.coffee b/js/tests/services/bl/starredblSpec.coffee index 5f4ec7a4f..6115dcf5f 100644 --- a/js/tests/services/bl/starredblSpec.coffee +++ b/js/tests/services/bl/starredblSpec.coffee @@ -52,3 +52,9 @@ describe 'StarredBl', -> expect(@StarredBl.getUnreadCount()).toBe(144) + it 'should increase the starred count', => + expect(@StarredBl.increaseCount()).toBe(1) + + + it 'should decrease the starred count', => + expect(@StarredBl.decreaseCount()).toBe(-1)
\ No newline at end of file diff --git a/templates/part.showall.php b/templates/part.showall.php index a99e821ee..404950986 100644 --- a/templates/part.showall.php +++ b/templates/part.showall.php @@ -1,7 +1,7 @@ -<li ui-if="!feedBl.isShowAll() && subscriptionsBl.isVisible(0)" class="show-all"> +<li ui-if="!feedBl.isShowAll() && feedBl.getNumberOfFeeds() > 0" class="show-all"> <a ng-click="feedBl.setShowAll(true)" href="#"><?php p($l->t('Show all')); ?></a> </li> -<li ui-if="feedBl.isShowAll() && subscriptionsBl.isVisible(0)" class="show-all"> +<li ui-if="feedBl.isShowAll() && feedBl.getNumberOfFeeds() > 0" class="show-all"> <a ng-click="feedBl.setShowAll(false)" href="#"><?php p($l->t('Show only unread')); ?></a> </li> |