diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-11 20:56:23 +0200 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-11 20:56:23 +0200 |
commit | b06fc20ddbadbc7522cd23a83a20975f43889890 (patch) | |
tree | 252ddf454899920771466aa7d5b6376461c386e9 | |
parent | ce6b20c59e1140867f2353361d3524e3baeb4580 (diff) |
allow users to discard folder and feed errors
-rw-r--r-- | js/app/controllers/feedcontroller.coffee | 2 | ||||
-rw-r--r-- | js/app/services/bl/feedbl.coffee | 6 | ||||
-rw-r--r-- | js/app/services/bl/folderbl.coffee | 4 | ||||
-rw-r--r-- | js/app/services/models/feedmodel.coffee | 20 | ||||
-rw-r--r-- | js/app/services/models/foldermodel.coffee | 22 | ||||
-rw-r--r-- | js/public/app.js | 91 | ||||
-rw-r--r-- | js/tests/services/bl/feedblSpec.coffee | 8 | ||||
-rw-r--r-- | js/tests/services/bl/folderblSpec.coffee | 12 | ||||
-rw-r--r-- | templates/part.listfeed.php | 11 | ||||
-rw-r--r-- | templates/part.listfolder.php | 14 |
10 files changed, 177 insertions, 13 deletions
diff --git a/js/app/controllers/feedcontroller.coffee b/js/app/controllers/feedcontroller.coffee index 5299ead03..27432e33f 100644 --- a/js/app/controllers/feedcontroller.coffee +++ b/js/app/controllers/feedcontroller.coffee @@ -68,6 +68,7 @@ angular.module('News').factory '_FeedController', @_$scope.feedExistsError = true else @_$scope.feedEmptyError = true + @_isAddingFeed = false @_$scope.addFolder = (folderName) => @@ -92,6 +93,7 @@ angular.module('News').factory '_FeedController', @_$scope.folderExistsError = true else @_$scope.folderEmptyError = true + @_isAddingFolder = false @_$scope.$on 'moveFeedToFolder', (scope, data) => diff --git a/js/app/services/bl/feedbl.coffee b/js/app/services/bl/feedbl.coffee index ef4fbac1c..6ab3c54e5 100644 --- a/js/app/services/bl/feedbl.coffee +++ b/js/app/services/bl/feedbl.coffee @@ -156,7 +156,11 @@ NewLoading, _ExistsError) -> else onSuccess(response.data) - @_persistence.createFeed url, parentId, success + @_persistence.createFeed(url, parentId, success) + + + markErrorRead: (urlHash) -> + @_feedModel.removeByUrlHash(urlHash) return new FeedBl(ShowAll, FeedModel, Persistence, ActiveFeed, FeedType, diff --git a/js/app/services/bl/folderbl.coffee b/js/app/services/bl/folderbl.coffee index 20f545e43..1084dd5b7 100644 --- a/js/app/services/bl/folderbl.coffee +++ b/js/app/services/bl/folderbl.coffee @@ -108,6 +108,10 @@ ItemModel, ShowAll, _ExistsError)-> @_persistence.createFolder folderName, 0, success + markErrorRead: (folderName) -> + @_folderModel.removeByName(folderName) + + return new FolderBl(FolderModel, FeedBl, ShowAll, ActiveFeed, Persistence, FeedType, ItemModel) diff --git a/js/app/services/models/feedmodel.coffee b/js/app/services/models/feedmodel.coffee index 5c4473b3a..405ea2651 100644 --- a/js/app/services/models/feedmodel.coffee +++ b/js/app/services/models/feedmodel.coffee @@ -144,5 +144,25 @@ angular.module('News').factory '_FeedModel', return @get(query) + removeByUrlHash: (urlHash, clearCache=true) -> + ### + Remove an entry by id + ### + + # remove from data map + for key, value of @_dataMap + if @_dataMap[key].urlHash == urlHash + delete @_dataMap[key] + break + + for entry, counter in @_data + if entry.urlHash == urlHash + @_data.splice(counter, 1) + delete @_urlHash[urlHash] + + if clearCache + @_invalidateCache() + break + return FeedModel ]
\ No newline at end of file diff --git a/js/app/services/models/foldermodel.coffee b/js/app/services/models/foldermodel.coffee index eb1059fc8..5dad0bdae 100644 --- a/js/app/services/models/foldermodel.coffee +++ b/js/app/services/models/foldermodel.coffee @@ -116,5 +116,27 @@ angular.module('News').factory '_FolderModel', return folderName.trim().toLowerCase() + removeByName: (name, clearCache=true) -> + ### + Remove an entry by id + ### + name = name.toLowerCase() + + # remove from data map + for key, value of @_dataMap + if @_dataMap[key].name == name + delete @_dataMap[key] + break + + for entry, counter in @_data + if entry.name == name + @_data.splice(counter, 1) + delete @_nameCache[name] + + if clearCache + @_invalidateCache() + break + + return FolderModel ]
\ No newline at end of file diff --git a/js/public/app.js b/js/public/app.js index e9a35087a..994624a6f 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -306,10 +306,11 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. } catch (_error) { error = _error; if (error instanceof _ExistsError) { - return _this._$scope.feedExistsError = true; + _this._$scope.feedExistsError = true; } else { - return _this._$scope.feedEmptyError = true; + _this._$scope.feedEmptyError = true; } + return _this._isAddingFeed = false; } }; this._$scope.addFolder = function(folderName) { @@ -329,10 +330,11 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. } catch (_error) { error = _error; if (error instanceof _ExistsError) { - return _this._$scope.folderExistsError = true; + _this._$scope.folderExistsError = true; } else { - return _this._$scope.folderEmptyError = true; + _this._$scope.folderEmptyError = true; } + return _this._isAddingFolder = false; } }; this._$scope.$on('moveFeedToFolder', function(scope, data) { @@ -772,6 +774,10 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return this._persistence.createFeed(url, parentId, success); }; + FeedBl.prototype.markErrorRead = function(urlHash) { + return this._feedModel.removeByUrlHash(urlHash); + }; + return FeedBl; })(_Bl); @@ -922,6 +928,10 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return this._persistence.createFolder(folderName, 0, success); }; + FolderBl.prototype.markErrorRead = function(folderName) { + return this._folderModel.removeByName(folderName); + }; + return FolderBl; })(_Bl); @@ -1455,6 +1465,42 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return this.get(query); }; + FeedModel.prototype.removeByUrlHash = function(urlHash, clearCache) { + var counter, entry, key, value, _i, _len, _ref, _ref1, _results; + + if (clearCache == null) { + clearCache = true; + } + /* + Remove an entry by id + */ + + _ref = this._dataMap; + for (key in _ref) { + value = _ref[key]; + if (this._dataMap[key].urlHash === urlHash) { + delete this._dataMap[key]; + break; + } + } + _ref1 = this._data; + _results = []; + for (counter = _i = 0, _len = _ref1.length; _i < _len; counter = ++_i) { + entry = _ref1[counter]; + if (entry.urlHash === urlHash) { + this._data.splice(counter, 1); + delete this._urlHash[urlHash]; + if (clearCache) { + this._invalidateCache(); + } + break; + } else { + _results.push(void 0); + } + } + return _results; + }; + return FeedModel; })(_Model); @@ -1583,6 +1629,43 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return folderName.trim().toLowerCase(); }; + FolderModel.prototype.removeByName = function(name, clearCache) { + var counter, entry, key, value, _i, _len, _ref, _ref1, _results; + + if (clearCache == null) { + clearCache = true; + } + /* + Remove an entry by id + */ + + name = name.toLowerCase(); + _ref = this._dataMap; + for (key in _ref) { + value = _ref[key]; + if (this._dataMap[key].name === name) { + delete this._dataMap[key]; + break; + } + } + _ref1 = this._data; + _results = []; + for (counter = _i = 0, _len = _ref1.length; _i < _len; counter = ++_i) { + entry = _ref1[counter]; + if (entry.name === name) { + this._data.splice(counter, 1); + delete this._nameCache[name]; + if (clearCache) { + this._invalidateCache(); + } + break; + } else { + _results.push(void 0); + } + } + return _results; + }; + return FolderModel; })(_Model); diff --git a/js/tests/services/bl/feedblSpec.coffee b/js/tests/services/bl/feedblSpec.coffee index 40441f1b8..01ed7c18d 100644 --- a/js/tests/services/bl/feedblSpec.coffee +++ b/js/tests/services/bl/feedblSpec.coffee @@ -312,3 +312,11 @@ describe 'FeedBl', -> @response.msg) + it 'should mark a feed error as read by removing it', => + @FeedModel.add({id: 3, urlHash: 'john'}) + + @FeedBl.markErrorRead('john') + + expect(@FeedModel.size()).toBe(0) + expect(@FeedModel.getByUrlHash('john')).toBe(undefined) + diff --git a/js/tests/services/bl/folderblSpec.coffee b/js/tests/services/bl/folderblSpec.coffee index 189626604..6fd35f73e 100644 --- a/js/tests/services/bl/folderblSpec.coffee +++ b/js/tests/services/bl/folderblSpec.coffee @@ -192,4 +192,14 @@ describe 'FolderBl', -> expect(onSuccess).not.toHaveBeenCalled() expect(onFailure).toHaveBeenCalled() - expect(@FolderModel.getByName('johns').error).toBe(@response.msg)
\ No newline at end of file + expect(@FolderModel.getByName('johns').error).toBe(@response.msg) + + + it 'should mark a folder error as read by removing it', => + @FolderModel.add({id: 3, name: 'john'}) + + @FolderBl.markErrorRead('John') + + expect(@FolderModel.size()).toBe(0) + expect(@FolderModel.getByName('john')).toBe(undefined) + diff --git a/templates/part.listfeed.php b/templates/part.listfeed.php index 1c08a4ae4..4008ca8af 100644 --- a/templates/part.listfeed.php +++ b/templates/part.listfeed.php @@ -26,21 +26,26 @@ {{ feed.title }} </a> - <span class="utils" ng-hide="feed.error"> + <span class="utils"> <span class="unread-counter"> {{ feedBl.getUnreadCount(feed.id) }} </span> <button class="svg action mark-read-icon" - ng-show="feedBl.getUnreadCount(feed.id) > 0" + ng-show="feedBl.getUnreadCount(feed.id) > 0 && feed.id" ng-click="feedBl.markFeedRead(feed.id)" title="<?php p($l->t('Mark all read')); ?>"></button> <button ng-click="feedBl.delete(feed.id)" class="svg action delete-icon" - title="<?php p($l->t('Delete feed')); ?>"></button> + title="<?php p($l->t('Delete feed')); ?>" + ng-show="feed.id"></button> + <button class="svg action mark-read-icon" + ng-click="feedBl.markErrorRead(feed.urlHash)" + title="<?php p($l->t('Discard')); ?>" + ng-show="feed.error"></button> </span> <div class="message" ng-show="feed.error">{{ feed.error }}</div> diff --git a/templates/part.listfolder.php b/templates/part.listfolder.php index e8141021f..c4d7b0b8b 100644 --- a/templates/part.listfolder.php +++ b/templates/part.listfolder.php @@ -23,10 +23,10 @@ {{ folder.name }} </a> - <span class="utils" ng-hide="folder.error"> + <span class="utils"> <button ng-click="folderBl.delete(folder.id)" - ng-hide="folderBl.hasFeeds(folder.id)" + ng-hide="folderBl.hasFeeds(folder.id) || !folder.id" class="svg action delete-icon" title="<?php p($l->t('Delete folder')); ?>"></button> @@ -35,10 +35,16 @@ </span> <button class="svg action mark-read-icon" - ng-show="folderBl.getUnreadCount(feedType.Feed, feed.id) > 0" + ng-show="folderBl.getUnreadCount(feedType.Feed, feed.id) > 0 && + folder.id" ng-click="folderBl.markFolderRead(folder.id)" title="<?php p($l->t('Mark all read')); ?>"></button> - + + <button class="svg action mark-read-icon" + ng-click="folderBl.markErrorRead(folder.name)" + title="<?php p($l->t('Discard')); ?>" + ng-show="folder.error"></button> + <!-- <button class="svg action edit-icon" ng-click="renameFolder(folder.id)" title="<?php p($l->t('Rename folder')); ?>"></button> |