1
0
mirror of https://github.com/chylex/Nextcloud-News.git synced 2024-11-24 22:42:46 +01:00
Nextcloud-News/js/controller/NavigationController.js
Marco Nassabain 04cf2672c3 🎨 Adapt front-end to match new implementation
- remove share-specific code since new solution uses dummy feeds

Signed-off-by: Marco Nassabain <marco.nassabain@hotmail.com>
2021-04-08 23:17:31 +02:00

420 lines
12 KiB
JavaScript

/**
* 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);
};
});