From 50902e1c0550de481fe655c5d560d57da0fe3e12 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Thu, 11 Apr 2013 11:20:46 +0200 Subject: fixed foldermodel --- js/app/services/models/foldermodel.coffee | 89 +++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 3 deletions(-) (limited to 'js/app/services') 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 -- cgit v1.2.3