diff options
-rw-r--r-- | js/app/controllers/feedcontroller.coffee | 71 | ||||
-rw-r--r-- | js/app/services/services.coffee | 3 | ||||
-rw-r--r-- | js/public/app.js | 78 | ||||
-rw-r--r-- | js/tests/controllers/feedcontrollerSpec.coffee | 71 |
4 files changed, 221 insertions, 2 deletions
diff --git a/js/app/controllers/feedcontroller.coffee b/js/app/controllers/feedcontroller.coffee index 2feec2a1c..fea2cb46d 100644 --- a/js/app/controllers/feedcontroller.coffee +++ b/js/app/controllers/feedcontroller.coffee @@ -29,6 +29,9 @@ angular.module('News').factory '_FeedController', -> @_showAll, @_feedType, @_starredCount, @_persistence, @_itemModel) -> + @_isAddingFolder = false + @_isAddingFeed = false + # bind internal stuff to scope @$scope.feeds = @_feedModel.getAll() @$scope.folders = @_folderModel.getAll() @@ -64,6 +67,74 @@ angular.module('News').factory '_FeedController', -> @$scope.setShowAll = (showAll) => @setShowAll(showAll) + @$scope.addFeed = (feedUrl, parentFolderId) => + ### + @$scope.feedEmptyError = false + @$scope.feedExistsError = false + @$scope.feedError = false + + if angular.isUndefined(feedUrl) or feedUrl.trim() == '' + @$scope.feedEmptyError = true + else + feedUrl = feedUrl.trim() + for feed in @feedModel.getItems() + if feedUrl == feed.feedUrl # FIXME: can we really compare this + @$scope.feedExistsError = true + + if not (@$scope.feedEmptyError or @$scope.feedExistsError) + if angular.isUndefined(parentFolderId) + folderId = 0 + else + folderId = folder.id + @$scope.adding = true + onSuccess = => + @$scope.feedUrl = '' + @$scope.adding = false + onError = => + @$scope.feedError = true + @$scope.adding = false + @persistence.createFeed(url, folderId, onSuccess, onError) + ### + + @$scope.addFolder = (folderName) => + @$scope.folderEmptyError = false + @$scope.folderExistsError = false + + if angular.isUndefined(folderName) or folderName.trim() == '' + @$scope.folderEmptyError = true + else + folderName = folderName.trim() + for folder in @_folderModel.getAll() + if folderName.toLowerCase() == folder.name.toLowerCase() + @$scope.folderExistsError = true + + if not (@$scope.folderEmptyError or @$scope.folderExistsError) + @_isAddingFolder = true + @_persistence.createFolder folderName, 0, => + @$scope.folderName = '' + @_isAddingFolder = false + + + @$scope.isAddingFolder = => + return @_isAddingFolder + + @$scope.isAddingFeed = => + return @_isAddingFeed + + @$scope.toggleFolder = (folderId) => + @toggleFolder(folderId) + + + toggleFolder: (folderId) -> + folder = @_folderModel.getById(folderId) + + if angular.isDefined(folder) + folder.open = !folder.open + if folder.open + @_persistence.openFolder(folder.id) + else + @_persistence.collapseFolder(folder.id) + isFeedActive: (type, id) -> return type == @_active.getType() and id = @_active.getId() diff --git a/js/app/services/services.coffee b/js/app/services/services.coffee index dac4206a9..cf1389fa7 100644 --- a/js/app/services/services.coffee +++ b/js/app/services/services.coffee @@ -59,7 +59,8 @@ angular.module('News').factory 'FeedModel', ['_FeedModel', 'Utils', return new _FeedModel(Utils) ] -angular.module('News').factory 'FolderModel', ['_FolderModel', (_FolderModel) -> +angular.module('News').factory 'FolderModel', +['_FolderModel', (_FolderModel) -> return new _FolderModel() ] diff --git a/js/public/app.js b/js/public/app.js index 375b02554..aced192d8 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -151,6 +151,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. this._starredCount = _starredCount; this._persistence = _persistence; this._itemModel = _itemModel; + this._isAddingFolder = false; + this._isAddingFeed = false; this.$scope.feeds = this._feedModel.getAll(); this.$scope.folders = this._folderModel.getAll(); this.$scope.feedType = this._feedType; @@ -184,8 +186,84 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. this.$scope.setShowAll = function(showAll) { return _this.setShowAll(showAll); }; + this.$scope.addFeed = function(feedUrl, parentFolderId) { + /* + @$scope.feedEmptyError = false + @$scope.feedExistsError = false + @$scope.feedError = false + + if angular.isUndefined(feedUrl) or feedUrl.trim() == '' + @$scope.feedEmptyError = true + else + feedUrl = feedUrl.trim() + for feed in @feedModel.getItems() + if feedUrl == feed.feedUrl # FIXME: can we really compare this + @$scope.feedExistsError = true + + if not (@$scope.feedEmptyError or @$scope.feedExistsError) + if angular.isUndefined(parentFolderId) + folderId = 0 + else + folderId = folder.id + @$scope.adding = true + onSuccess = => + @$scope.feedUrl = '' + @$scope.adding = false + onError = => + @$scope.feedError = true + @$scope.adding = false + @persistence.createFeed(url, folderId, onSuccess, onError) + */ + + }; + this.$scope.addFolder = function(folderName) { + var folder, _i, _len, _ref; + _this.$scope.folderEmptyError = false; + _this.$scope.folderExistsError = false; + if (angular.isUndefined(folderName) || folderName.trim() === '') { + _this.$scope.folderEmptyError = true; + } else { + folderName = folderName.trim(); + _ref = _this._folderModel.getAll(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + folder = _ref[_i]; + if (folderName.toLowerCase() === folder.name.toLowerCase()) { + _this.$scope.folderExistsError = true; + } + } + } + if (!(_this.$scope.folderEmptyError || _this.$scope.folderExistsError)) { + _this._isAddingFolder = true; + return _this._persistence.createFolder(folderName, 0, function() { + _this.$scope.folderName = ''; + return _this._isAddingFolder = false; + }); + } + }; + this.$scope.isAddingFolder = function() { + return _this._isAddingFolder; + }; + this.$scope.isAddingFeed = function() { + return _this._isAddingFeed; + }; + this.$scope.toggleFolder = function(folderId) { + return _this.toggleFolder(folderId); + }; } + FeedController.prototype.toggleFolder = function(folderId) { + var folder; + folder = this._folderModel.getById(folderId); + if (angular.isDefined(folder)) { + folder.open = !folder.open; + if (folder.open) { + return this._persistence.openFolder(folder.id); + } else { + return this._persistence.collapseFolder(folder.id); + } + } + }; + FeedController.prototype.isFeedActive = function(type, id) { return type === this._active.getType() && (id = this._active.getId()); }; diff --git a/js/tests/controllers/feedcontrollerSpec.coffee b/js/tests/controllers/feedcontrollerSpec.coffee index df3917ea8..1a019a74e 100644 --- a/js/tests/controllers/feedcontrollerSpec.coffee +++ b/js/tests/controllers/feedcontrollerSpec.coffee @@ -263,4 +263,73 @@ describe '_FeedController', -> expect(@FeedModel.getById(3).unreadCount).toBe(0) expect(@FeedModel.getById(1).unreadCount).toBe(0) - expect(@FeedModel.getById(5).unreadCount).toBe(0)
\ No newline at end of file + expect(@FeedModel.getById(5).unreadCount).toBe(0) + + + it 'should toggle folder', => + @persistence.openFolder = jasmine.createSpy('open') + @persistence.collapseFolder = jasmine.createSpy('collapse') + + @FolderModel.add({id: 3, open: false}) + @scope.toggleFolder(4) + expect(@FolderModel.getById(3).open).toBeFalsy() + + @scope.toggleFolder(3) + expect(@FolderModel.getById(3).open).toBeTruthy() + expect(@persistence.openFolder).toHaveBeenCalledWith(3) + + @scope.toggleFolder(3) + expect(@FolderModel.getById(3).open).toBeFalsy() + expect(@persistence.collapseFolder).toHaveBeenCalledWith(3) + + + it 'isAddingFolder should return false in the beginning', => + expect(@scope.isAddingFolder()).toBeFalsy() + + + it 'isAddingFeed should return false in the beginning', => + expect(@scope.isAddingFeed()).toBeFalsy() + + + it 'should not add folders that have no name', => + @persistence.createFolder = jasmine.createSpy('create') + @scope.addFolder(' ') + + expect(@scope.folderEmptyError).toBeTruthy() + expect(@persistence.createFolder).not.toHaveBeenCalled() + + + it 'should not add folders that already exist client side', => + @FolderModel.add({id: 3, name: 'ola'}) + @persistence.createFolder = jasmine.createSpy('create') + @scope.addFolder(' Ola') + + expect(@scope.folderExistsError).toBeTruthy() + expect(@persistence.createFolder).not.toHaveBeenCalled() + + + it 'should set isAddingFolder to true if there were no problems', => + @persistence.createFolder = jasmine.createSpy('create') + @scope.addFolder(' Ola') + expect(@scope.isAddingFolder()).toBeTruthy() + + + it 'should create a create new folder request if everything was ok', => + @persistence.createFolder = jasmine.createSpy('create') + @scope.addFolder(' Ola') + expect(@persistence.createFolder).toHaveBeenCalled() + expect(@persistence.createFolder.argsForCall[0][0]).toBe('Ola') + expect(@persistence.createFolder.argsForCall[0][1]).toBe(0) + + + it 'should should reset the foldername on and set isAddingFolder to false',=> + + @persistence.createFolder = + jasmine.createSpy('create').andCallFake (arg1, arg2, func) => + func() + @scope.addFolder(' Ola') + + expect(@scope.folderName).toBe('') + expect(@scope.isAddingFolder()).toBeFalsy() + + |