summaryrefslogtreecommitdiffstats
path: root/js/app/services
diff options
context:
space:
mode:
authorBernhard Posselt <nukeawhale@gmail.com>2013-04-11 11:20:46 +0200
committerBernhard Posselt <nukeawhale@gmail.com>2013-04-11 11:21:02 +0200
commit50902e1c0550de481fe655c5d560d57da0fe3e12 (patch)
tree71faf19efd09ffd2f1eec35c9fef56a5701e87ba /js/app/services
parentbdb241340a653b4a3e34c830394e8ffece7df814 (diff)
fixed foldermodel
Diffstat (limited to 'js/app/services')
-rw-r--r--js/app/services/models/foldermodel.coffee89
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