summaryrefslogtreecommitdiffstats
path: root/coffee/controllers/feedcontroller.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'coffee/controllers/feedcontroller.coffee')
-rw-r--r--coffee/controllers/feedcontroller.coffee223
1 files changed, 223 insertions, 0 deletions
diff --git a/coffee/controllers/feedcontroller.coffee b/coffee/controllers/feedcontroller.coffee
new file mode 100644
index 000000000..a54f4451d
--- /dev/null
+++ b/coffee/controllers/feedcontroller.coffee
@@ -0,0 +1,223 @@
+###
+# ownCloud - News app
+#
+# @author Bernhard Posselt
+# Copyright (c) 2012 - Bernhard Posselt <nukeawhale@gmail.com>
+#
+# This file is licensed under the Affero General Public License version 3 or later.
+# See the COPYING-README file
+#
+###
+
+angular.module('News').factory '_FeedController', ['Controller', (Controller) ->
+
+ class FeedController extends Controller
+
+ constructor: (@$scope, @feedModel, @folderModel, @feedType, @activeFeed,
+ @persistence, @starredCount, @showAll, @itemModel,
+ @garbageRegistry, @$rootScope, @loading, @config) ->
+
+ @showSubscriptions = true
+
+ @$scope.feeds = @feedModel.getItems()
+ @$scope.folders = @folderModel.getItems()
+ @$scope.feedType = @feedType
+
+ @$scope.toggleFolder = (folderId) =>
+ folder = @folderModel.getItemById(folderId)
+ folder.open = !folder.open
+ @persistence.collapseFolder(folder.id, folder.open)
+
+
+ @$scope.isFeedActive = (type, id) =>
+ if type == @activeFeed.type && id == @activeFeed.id
+ return true
+ else
+ return false
+
+
+ @$scope.loadFeed = (type, id) =>
+ @loadFeed(type, id)
+
+
+ @$scope.getUnreadCount = (type, id) =>
+ count = @getUnreadCount(type, id)
+ if count > 999
+ return "999+"
+ else
+ return count
+
+
+ @$scope.renameFolder = ->
+ alert 'not implemented yet, needs better solution'
+
+
+ @$scope.triggerHideRead = =>
+ @triggerHideRead()
+
+
+ @$scope.isShown = (type, id) =>
+ switch type
+ when @feedType.Subscriptions then return @showSubscriptions
+ when @feedType.Starred then return @starredCount.count > 0
+
+
+ @$scope.delete = (type, id) =>
+ switch type
+ when @feedType.Folder
+ @folderModel.removeById(id)
+ @persistence.deleteFolder(id)
+
+ when @feedType.Feed
+ @feedModel.removeById(id)
+ @persistence.deleteFeed(id)
+
+
+ @$scope.markAllRead = (type, id) =>
+ switch type
+ when @feedType.Feed
+ for itemId, item of @itemModel.getItemsByTypeAndId(type, id)
+ item.isRead = true
+ feed = @feedModel.getItemById(id)
+ feed.unreadCount = 0
+ mostRecentItemId = @itemModel.getHighestId(type, id)
+ @persistence.setAllItemsRead(feed.id, mostRecentItemId)
+
+ when @feedType.Folder
+ for itemId, item of @itemModel.getItemsByTypeAndId(type, id)
+ item.isRead = true
+ for feedId in @itemModel.getFeedsOfFolderId(id)
+ feed = @feedModel.getItemById(feedId)
+ feed.unreadCount = 0
+ mostRecentItemId = @itemModel.getHighestId(type, feedId)
+ @persistence.setAllItemsRead(feedId, mostRecentItemId)
+
+ when @feedType.Subscriptions
+ for itemId, item of @itemModel.getItemsByTypeAndId(type, id)
+ item.isRead = true
+ for feed in @feedModel.getItems()
+ feed.unreadCount = 0
+ mostRecentItemId = @itemModel.getHighestId(type, feed.id)
+ @persistence.setAllItemsRead(feed.id, mostRecentItemId)
+
+ @$scope.$on 'triggerHideRead', =>
+ @itemModel.clearCache()
+ @triggerHideRead()
+ @loadFeed(activeFeed.type, activeFeed.id)
+
+ @$scope.$on 'loadFeed', (scope, params) =>
+ @loadFeed(params.type, params.id)
+
+ @$scope.$on 'moveFeedToFolder', (scope, params) =>
+ @moveFeedToFolder(params.feedId, params.folderId)
+
+ setInterval =>
+ @updateFeeds()
+ , @config.FeedUpdateInterval
+
+
+
+ updateFeeds: ->
+ for feed in @feedModel.getItems()
+ @persistence.updateFeed(feed.id)
+
+
+ moveFeedToFolder: (feedId, folderId) ->
+ feed = @feedModel.getItemById(feedId)
+ if feed.folderId != folderId
+ feed.folderId = folderId
+ @feedModel.markAccessed()
+ @persistence.moveFeedToFolder(feedId, folderId)
+
+
+ loadFeed: (type, id) ->
+ # to not go crazy with autopaging, clear the caches if we switch the
+ # type of the feed. if the caches only contain seperate feeds, the
+ # cache and autopage logic works fine. if the feed contains more than
+ # one
+ if type != @activeFeed.type or id != @activeFeed.id
+ if not (type == @feedType.Feed && @activeFeed.type == @feedType.Feed)
+ @itemModel.clearCache()
+
+ @activeFeed.id = id
+ @activeFeed.type = type
+ @$scope.triggerHideRead()
+ @persistence.loadFeed(type, id,
+ @itemModel.getHighestId(type, id),
+ @itemModel.getHighestTimestamp(type, id), @config.initialLoadedItemsNr)
+
+
+ triggerHideRead: () ->
+ preventParentFolder = 0
+
+ # feeds
+ for feed in @feedModel.getItems()
+ if @showAll.showAll == false && @getUnreadCount(@feedType.Feed, feed.id) == 0
+
+ # we dont hide the selected feed and folder. But we also dont hide
+ # the parent folder of the selcted feed
+ if @activeFeed.type == @feedType.Feed && @activeFeed.id == feed.id
+ feed.show = true
+ preventParentFolder = feed.folderId
+ else
+ feed.show = false
+ else
+ feed.show = true
+
+ # folders
+ for folder in @folderModel.getItems()
+ if @showAll.showAll == false && @getUnreadCount(@feedType.Folder, folder.id) == 0
+ # prevent hiding when childfeed is active
+ if (@activeFeed.type == @feedType.Folder && @activeFeed.id == folder.id) || preventParentFolder == folder.id
+ folder.show = true
+ else
+ folder.show = false
+ else
+ folder.show = true
+
+ # subscriptions
+ if @showAll.showAll == false && @getUnreadCount(@feedType.Subscriptions, 0) == 0
+ if @activeFeed.type == @feedType.Subscriptions
+ @showSubscriptions = true
+ else
+ @showSubscriptions = false
+ else
+ @showSubscriptions = true
+
+ # starred
+ if @showAll.showAll == false && @getUnreadCount(@feedType.Starred, 0) == 0
+ if @activeFeed.type == @feedType.Starred
+ @showStarred = true
+ else
+ @showStarred = false
+ else
+ @showStarred = true
+
+ @garbageRegistry.clear()
+
+
+
+ getUnreadCount: (type, id) ->
+ switch type
+ when @feedType.Feed
+ return @feedModel.getItemById(id).unreadCount
+
+ when @feedType.Folder
+ counter = 0
+ for feed in @feedModel.getItems()
+ if feed.folderId == id
+ counter += feed.unreadCount
+ return counter
+
+ when @feedType.Starred
+ return @starredCount.count
+
+ when @feedType.Subscriptions
+ counter = 0
+ for feed in @feedModel.getItems()
+ counter += feed.unreadCount
+ return counter
+
+
+ return FeedController
+] \ No newline at end of file