diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-11 11:20:46 +0200 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-11 11:21:02 +0200 |
commit | 50902e1c0550de481fe655c5d560d57da0fe3e12 (patch) | |
tree | 71faf19efd09ffd2f1eec35c9fef56a5701e87ba /js/app/services | |
parent | bdb241340a653b4a3e34c830394e8ffece7df814 (diff) |
fixed foldermodel
Diffstat (limited to 'js/app/services')
-rw-r--r-- | js/app/services/models/foldermodel.coffee | 89 |
1 files changed, 86 insertions, 3 deletions
diff --git a/js/app/services/models/foldermodel.coffee b/js/app/services/models/foldermodel.coffee index 56997e603..647ec790f 100644 --- a/js/app/services/models/foldermodel.coffee +++ b/js/app/services/models/foldermodel.coffee @@ -25,10 +25,93 @@ angular.module('News').factory '_FolderModel', class FolderModel extends _Model + constructor: -> + @_nameCache = {} + super() - nameExists: (folderName) -> - query = new _EqualQuery('name', folderName.trim(), true) - return @get(query).length > 0 + + add: (data, clearCache=true) -> + ### + We want to add a folder on the client side before + we have an id from the server. Once the server returns + an id, we have to update the existing item without id + ### + data.name = @_transformName(data.name) + + item = @_nameCache[data.name] + + # update in the following cases: + # * the id is defined and the item exists + # * the id is not defined and the name exists in the cache + updateById = angular.isDefined(data.id) and + angular.isDefined(@getById(data.id)) + + updateByName = angular.isDefined(item) and + angular.isUndefined(item.id) + + if updateById or updateByName + @update(data) + else + # if the item is not yet in the name cache it must be added + @_nameCache[data.name] = data + + # in case there is an id it can go through the normal add method + if angular.isDefined(data.id) + super(data, clearCache) + + # if there is no id we just want it to appear in the list + else + @_data.push(data) + + + update: (data, clearCache=true) -> + # only when the id on the updated item does not exist we wish + # to update by name, otherwise we always update by id + data.name = @_transformName(data.name) + + item = @_nameCache[data.name] + # update by name + if angular.isUndefined(data.id) and angular.isDefined(item) + angular.extend(item, data) + + else + # this case happens when there exists an element with the same + # name but it has no id yet + if angular.isDefined(data.id) and + angular.isDefined(item) and + angular.isUndefined(item.id) + item.id = data.id + @_dataMap[data.id] = item + + # if an update comes in and we update because of the id + # we need to fix the name cache if the name was changed + itemWithId = @getById(data.id) + if angular.isDefined(itemWithId) and itemWithId.name != data.name + delete @_nameCache[itemWithId.name] + @_nameCache[data.name] = itemWithId + + super(data, clearCache) + + + + getByName: (folderName) -> + folderName = @_transformName(folderName) + return @_nameCache[folderName] + + + clear: -> + @_nameCache = {} + super() + + + removeById: (id, clearCache=true) -> + item = @getById(id) + delete @_nameCache[@_transformName(item.name)] + super(id, clearCache) + + + _transformName: (folderName) -> + return folderName.trim().toLowerCase() return FolderModel |