summaryrefslogtreecommitdiffstats
path: root/js-old/controller/NavigationController.js
diff options
context:
space:
mode:
Diffstat (limited to 'js-old/controller/NavigationController.js')
-rw-r--r--js-old/controller/NavigationController.js419
1 files changed, 419 insertions, 0 deletions
diff --git a/js-old/controller/NavigationController.js b/js-old/controller/NavigationController.js
new file mode 100644
index 000000000..68a46900e
--- /dev/null
+++ b/js-old/controller/NavigationController.js
@@ -0,0 +1,419 @@
+/**
+ * Nextcloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @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 = {};
+ this.youtubeDetectorRegex = new RegExp(/youtube\.[a-z\.]{2,}\/(user|channel)\/(.*?)(\/|\?|$)/);
+
+ 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.markCurrentRead = function () {
+ var id = getRouteId();
+ var type = $route.current.$$route.type;
+
+ if(isNaN(id)) {
+ this.markRead();
+ } else if(type === FEED_TYPE.FOLDER) {
+ this.markFolderRead(id);
+ } else if(type === FEED_TYPE.FEED) {
+ this.markFeedRead(id);
+ }
+ };
+
+ 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.isUnreadActive = function () {
+ return $route.current &&
+ $route.current.$$route.type === FEED_TYPE.UNREAD;
+ };
+
+ 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;
+
+ /**
+ * Transform youtube channel and user URL into their RSS feed
+ * (09/01/2020): Youtube feed url work as `https://www.youtube.com/feeds/videos.xml?user=<username>`
+ */
+ var regResult = this.youtubeDetectorRegex.exec(feed.url);
+ /**
+ * At this point:
+ * regResult[0] contain the match
+ * regResult[1] contain the type of youtube entity (channel or user)
+ * regResult[2] contain either the username or the channel id
+ */
+ if (regResult && regResult[0] && regResult[1] && regResult[2]) {
+ feed.url = 'https://www.youtube.com/feeds/videos.xml?';
+ feed.url += (regResult[1] === 'user') ? 'user=' : 'channel_id=';
+ feed.url += regResult[2];
+ }
+
+ var autoDiscover = feed.autoDiscover ? true : false;
+ FeedResource.create(feed.url, existingFolder.id, undefined, feed.user, feed.password, autoDiscover)
+ .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 = '';
+ feed.autoDiscover = true;
+ 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();
+ });
+
+ $rootScope.localeComparator = function(v1, v2) {
+ if (v1.type === 'string' && v2.type === 'string') {
+ return v1.value.localeCompare(v2.value);
+ }
+
+ return (v1.value === v2.value) ? 0 : ((v1.value < v2.value) ? -1 : 1);
+ };
+});