/** * Nextcloud - News * * This file is licensed under the Affero General Public License version 3 or * later. See the COPYING file. * * @author Bernhard Posselt * @copyright Bernhard Posselt 2014 */ app.controller('NavigationController', function ($route, FEED_TYPE, FeedResource, FolderResource, ItemResource, SettingsResource, Publisher, $rootScope, $location, $q) { 'use strict'; this.feedError = ''; this.showNewFolder = false; this.renamingFolder = false; this.addingFeed = false; this.addingFolder = false; this.folderError = ''; this.renameError = ''; this.feed = {}; var getRouteId = function () { return parseInt($route.current.params.id, 10); }; this.getLanguageCode = function () { return SettingsResource.get('language'); }; this.getFeeds = function () { return FeedResource.getAll(); }; this.getFolders = function () { return FolderResource.getAll(); }; this.markFolderRead = function (folderId) { FeedResource.markFolderRead(folderId); FeedResource.getByFolderId(folderId).forEach(function (feed) { ItemResource.markFeedRead(feed.id); }); }; this.markFeedRead = function (feedId) { ItemResource.markFeedRead(feedId); FeedResource.markFeedRead(feedId); }; this.markRead = function () { ItemResource.markRead(); FeedResource.markRead(); }; this.isShowAll = function () { return SettingsResource.get('showAll'); }; this.getFeedsOfFolder = function (folderId) { return FeedResource.getByFolderId(folderId); }; this.getUnreadCount = function () { return FeedResource.getUnreadCount(); }; this.isUnread = function () { return this.getUnreadCount() > 0; }; this.getFeedUnreadCount = function (feedId) { var feed = FeedResource.getById(feedId); if (feed !== undefined) { return feed.unreadCount; } else { return 0; } }; this.isFeedUnread = function (feedId) { return this.getFeedUnreadCount(feedId) > 0; }; this.getFolderUnreadCount = function (folderId) { return FeedResource.getFolderUnreadCount(folderId); }; this.isFolderUnread = function (folderId) { return this.getFolderUnreadCount(folderId) > 0; }; this.getStarredCount = function () { return ItemResource.getStarredCount(); }; this.isStarredUnread = function () { return this.getStarredCount() > 0; }; this.toggleFolder = function (folderName) { FolderResource.toggleOpen(folderName); }; this.hasFeeds = function (folderId) { return FeedResource.getFolderUnreadCount(folderId) !== undefined; }; this.subFeedActive = function (folderId) { var type = $route.current.$$route.type; if (type === FEED_TYPE.FEED) { var feed = FeedResource.getById(getRouteId()); if (feed !== undefined && feed.folderId === folderId) { return true; } } return false; }; this.isSubscriptionsActive = function () { return $route.current && $route.current.$$route.type === FEED_TYPE.SUBSCRIPTIONS; }; this.isStarredActive = function () { return $route.current && $route.current.$$route.type === FEED_TYPE.STARRED; }; this.isExploreActive = function () { return $route.current && $route.current.$$route.type === FEED_TYPE.EXPLORE; }; this.isFolderActive = function (folderId) { return $route.current && $route.current.$$route.type === FEED_TYPE.FOLDER && getRouteId() === folderId; }; this.isFeedActive = function (feedId) { return $route.current && $route.current.$$route.type === FEED_TYPE.FEED && getRouteId() === feedId; }; this.folderNameExists = function (folderName) { folderName = folderName || ''; return FolderResource.get(folderName.trim()) !== undefined; }; this.feedUrlExists = function (url) { url = url || ''; url = url.trim(); return FeedResource.get(url) !== undefined || FeedResource.get('http://' + url) !== undefined; }; this.createFeed = function (feed) { var self = this; this.showNewFolder = false; this.addingFeed = true; var newFolder = feed.newFolder; var existingFolder = feed.existingFolder || {id: 0}; // we dont need to create a new folder if (newFolder === undefined || newFolder === '') { // this is set to display the feed in any folder, even if the folder // is closed or has no unread articles existingFolder.getsFeed = true; FeedResource.create(feed.url, existingFolder.id, undefined, feed.user, feed.password).then(function (data) { Publisher.publishAll(data); // set folder as default $location.path('/items/feeds/' + data.feeds[0].id + '/'); }).finally(function () { existingFolder.getsFeed = undefined; feed.url = ''; feed.user = ''; feed.password = ''; self.addingFeed = false; }); } else { // create folder first and then the feed FolderResource.create(newFolder).then(function (data) { Publisher.publishAll(data); // set the created folder on scope so its preselected for the // next addition feed.existingFolder = FolderResource.get(data.folders[0].name); feed.newFolder = undefined; self.createFeed(feed); }); } }; this.createFolder = function (folder) { var self = this; this.addingFolder = true; FolderResource.create(folder.name).then(function (data) { Publisher.publishAll(data); }).finally(function () { self.addingFolder = false; folder.name = ''; }); }; this.moveFeed = function (feedId, folderId) { var reload = false; var feed = FeedResource.getById(feedId); if (feed.folderId === folderId) { return; } if (this.isFolderActive(feed.folderId) || this.isFolderActive(folderId)) { reload = true; } FeedResource.move(feedId, folderId); if (reload) { $route.reload(); } }; this.renameFeed = function (feed) { FeedResource.patch(feed.id, {title: feed.title}); feed.editing = false; }; this.renameFolder = function (folder, name) { folder.renameError = ''; this.renamingFolder = true; var self = this; if (folder.name === name) { folder.renameError = ''; folder.editing = false; this.renamingFolder = false; } else { FolderResource.rename(folder.name, name).then(function () { folder.renameError = ''; folder.editing = false; }, function (message) { folder.renameError = message; }).finally(function () { self.renamingFolder = false; }); } }; this.reversiblyDeleteFeed = function (feed) { FeedResource.reversiblyDelete(feed.id).finally(function () { $route.reload(); }); }; this.undoDeleteFeed = function (feed) { FeedResource.undoDelete(feed.id).finally(function () { $route.reload(); }); }; this.deleteFeed = function (feed) { FeedResource.delete(feed.url); }; this.reversiblyDeleteFolder = function (folder) { $q.all( FeedResource.reversiblyDeleteFolder(folder.id), FolderResource.reversiblyDelete(folder.name) ).finally(function () { $route.reload(); }); }; this.undoDeleteFolder = function (folder) { $q.all( FeedResource.undoDeleteFolder(folder.id), FolderResource.undoDelete(folder.name) ).finally(function () { $route.reload(); }); }; this.deleteFolder = function (folder) { FeedResource.deleteFolder(folder.id); FolderResource.delete(folder.name); }; this.setOrdering = function (feed, ordering) { FeedResource.patch(feed.id, {ordering: ordering}); $route.reload(); }; this.togglePinned = function (feedId) { var feed = FeedResource.getById(feedId); if (feed) { return FeedResource.patch(feedId, {pinned: !feed.pinned}); } }; this.setUpdateMode = function (feedId, updateMode) { return FeedResource.patch(feedId, {updateMode: updateMode}); }; this.toggleFullText = function (feed) { $rootScope.$broadcast('$routeChangeStart'); FeedResource.toggleFullText(feed.id).finally(function () { $rootScope.$broadcast('$routeChangeSuccess'); $route.reload(); }); }; this.search = function (value) { if (value === '') { $location.search('search', null); } else { $location.search('search', value); } }; var self = this; $rootScope.$on('moveFeedToFolder', function (scope, data) { self.moveFeed(data.feedId, data.folderId); }); // based on the route we want to preselect a folder in the add new feed // drop down var setSelectedFolderForRoute = function () { var type; if ($route.current) { type = $route.current.$$route.type; } var folderId = 0; if (type === FEED_TYPE.FOLDER) { folderId = getRouteId(); } else if (type === FEED_TYPE.FEED) { var feed = FeedResource.getById(getRouteId()); if (feed) { folderId = feed.folderId; } } var folder; if (folderId !== 0) { folder = FolderResource.getById(folderId); } self.feed.existingFolder = folder; }; $rootScope.$on('$routeChangeSuccess', function () { setSelectedFolderForRoute(); }); });