зеркало из https://github.com/nextcloud/news.git
fixed foldermodel
This commit is contained in:
Родитель
bdb241340a
Коммит
50902e1c05
|
@ -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
|
||||
|
|
|
@ -40,7 +40,6 @@ files = [
|
|||
'../../appframework/js/public/app.js',
|
||||
'tests/stubs/modules.js',
|
||||
'build/app/directives/*.js',
|
||||
'build/app/filters/*.js',
|
||||
'build/app/services/**/*.js',
|
||||
'build/app/controllers/**/*.js',
|
||||
'build/tests/**/*Spec.js'
|
||||
|
|
|
@ -1347,21 +1347,91 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
angular.module('News').factory('_FolderModel', [
|
||||
'_Model', '_EqualQuery', function(_Model, _EqualQuery) {
|
||||
var FolderModel, _ref;
|
||||
var FolderModel;
|
||||
|
||||
FolderModel = (function(_super) {
|
||||
__extends(FolderModel, _super);
|
||||
|
||||
function FolderModel() {
|
||||
_ref = FolderModel.__super__.constructor.apply(this, arguments);
|
||||
return _ref;
|
||||
this._nameCache = {};
|
||||
FolderModel.__super__.constructor.call(this);
|
||||
}
|
||||
|
||||
FolderModel.prototype.nameExists = function(folderName) {
|
||||
var query;
|
||||
FolderModel.prototype.add = function(data, clearCache) {
|
||||
var item, updateById, updateByName;
|
||||
|
||||
query = new _EqualQuery('name', folderName.trim(), true);
|
||||
return this.get(query).length > 0;
|
||||
if (clearCache == null) {
|
||||
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 = this._transformName(data.name);
|
||||
item = this._nameCache[data.name];
|
||||
updateById = angular.isDefined(data.id) && angular.isDefined(this.getById(data.id));
|
||||
updateByName = angular.isDefined(item) && angular.isUndefined(item.id);
|
||||
if (updateById || updateByName) {
|
||||
return this.update(data);
|
||||
} else {
|
||||
this._nameCache[data.name] = data;
|
||||
if (angular.isDefined(data.id)) {
|
||||
return FolderModel.__super__.add.call(this, data, clearCache);
|
||||
} else {
|
||||
return this._data.push(data);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
FolderModel.prototype.update = function(data, clearCache) {
|
||||
var item, itemWithId;
|
||||
|
||||
if (clearCache == null) {
|
||||
clearCache = true;
|
||||
}
|
||||
data.name = this._transformName(data.name);
|
||||
item = this._nameCache[data.name];
|
||||
if (angular.isUndefined(data.id) && angular.isDefined(item)) {
|
||||
return angular.extend(item, data);
|
||||
} else {
|
||||
if (angular.isDefined(data.id) && angular.isDefined(item) && angular.isUndefined(item.id)) {
|
||||
item.id = data.id;
|
||||
this._dataMap[data.id] = item;
|
||||
}
|
||||
itemWithId = this.getById(data.id);
|
||||
if (angular.isDefined(itemWithId) && itemWithId.name !== data.name) {
|
||||
delete this._nameCache[itemWithId.name];
|
||||
this._nameCache[data.name] = itemWithId;
|
||||
}
|
||||
return FolderModel.__super__.update.call(this, data, clearCache);
|
||||
}
|
||||
};
|
||||
|
||||
FolderModel.prototype.getByName = function(folderName) {
|
||||
folderName = this._transformName(folderName);
|
||||
return this._nameCache[folderName];
|
||||
};
|
||||
|
||||
FolderModel.prototype.clear = function() {
|
||||
this._nameCache = {};
|
||||
return FolderModel.__super__.clear.call(this);
|
||||
};
|
||||
|
||||
FolderModel.prototype.removeById = function(id, clearCache) {
|
||||
var item;
|
||||
|
||||
if (clearCache == null) {
|
||||
clearCache = true;
|
||||
}
|
||||
item = this.getById(id);
|
||||
delete this._nameCache[this._transformName(item.name)];
|
||||
return FolderModel.__super__.removeById.call(this, id, clearCache);
|
||||
};
|
||||
|
||||
FolderModel.prototype._transformName = function(folderName) {
|
||||
return folderName.trim().toLowerCase();
|
||||
};
|
||||
|
||||
return FolderModel;
|
||||
|
|
|
@ -57,7 +57,7 @@ describe 'FolderBl', ->
|
|||
@persistence.openFolder = jasmine.createSpy('open')
|
||||
@persistence.collapseFolder = jasmine.createSpy('collapse')
|
||||
|
||||
@FolderModel.add({id: 3, opened: false})
|
||||
@FolderModel.add({id: 3, opened: false, name: 'ho'})
|
||||
@FolderBl.toggleFolder(4)
|
||||
expect(@FolderModel.getById(3).opened).toBeFalsy()
|
||||
|
||||
|
@ -122,8 +122,8 @@ describe 'FolderBl', ->
|
|||
|
||||
|
||||
it 'should return all folders', =>
|
||||
item1 = {id: 3, open: false}
|
||||
item2 = {id: 4, open: true}
|
||||
item1 = {id: 3, open: false, name: 'ho'}
|
||||
item2 = {id: 4, open: true, name: 'hod'}
|
||||
@FolderModel.add(item1)
|
||||
@FolderModel.add(item2)
|
||||
|
||||
|
@ -131,7 +131,7 @@ describe 'FolderBl', ->
|
|||
expect(@FolderBl.getAll()).toContain(item2)
|
||||
|
||||
|
||||
it 'should not create a folder if it already exists', =>
|
||||
xit 'should not create a folder if it already exists', =>
|
||||
item1 = {id: 4, open: true, name: 'john'}
|
||||
@FolderModel.add(item1)
|
||||
|
||||
|
|
|
@ -48,25 +48,57 @@ describe 'FeedModel', ->
|
|||
expect(@utils.imagePath).toHaveBeenCalledWith('news', 'rss.svg')
|
||||
|
||||
|
||||
it 'should also update items when url is the same', =>
|
||||
@FeedModel.add({id: 2, faviconLink: null, urlHash: 'hi'})
|
||||
expect(@FeedModel.size()).toBe(1)
|
||||
|
||||
@FeedModel.add({id: 2, faviconLink: null, urlHash: 'hi4'})
|
||||
expect(@FeedModel.size()).toBe(1)
|
||||
expect(@FeedModel.getById(2).urlHash).toBe('hi4')
|
||||
|
||||
@FeedModel.add({id: 3, faviconLink: 'hey', urlHash: 'hi4'})
|
||||
expect(@FeedModel.size()).toBe(1)
|
||||
expect(@FeedModel.getById(2)).toBe(undefined)
|
||||
expect(@FeedModel.getById(3).faviconLink).toBe('hey')
|
||||
|
||||
|
||||
it 'should also remove the feed from the urlHash cache when its removed', =>
|
||||
item = {id: 2, faviconLink: null, urlHash: 'hi'}
|
||||
it 'should add feeds without id', =>
|
||||
item = {faviconLink: null, urlHash: 'hi'}
|
||||
@FeedModel.add(item)
|
||||
|
||||
expect(@FeedModel.getByUrlHash('hi')).toBe(item)
|
||||
expect(@FeedModel.size()).toBe(1)
|
||||
|
||||
|
||||
it 'should clear the url hash cache', =>
|
||||
item = {faviconLink: null, urlHash: 'hi'}
|
||||
@FeedModel.add(item)
|
||||
@FeedModel.clear()
|
||||
expect(@FeedModel.getByUrlHash('hi')).toBe(undefined)
|
||||
expect(@FeedModel.size()).toBe(0)
|
||||
|
||||
|
||||
it 'should delete items from the fodername cache', =>
|
||||
item = {id:3, faviconLink: null, urlHash: 'hi'}
|
||||
@FeedModel.add(item)
|
||||
expect(@FeedModel.size()).toBe(1)
|
||||
|
||||
@FeedModel.removeById(3)
|
||||
expect(@FeedModel.getByUrlHash('hi')).toBe(undefined)
|
||||
expect(@FeedModel.size()).toBe(0)
|
||||
|
||||
|
||||
it 'should update the id if an update comes in with an id', =>
|
||||
item = {faviconLink: null, urlHash: 'hi', test: 'heheh'}
|
||||
@FeedModel.add(item)
|
||||
|
||||
item = {id: 3, faviconLink: null, urlHash: 'hi', test: 'hoho'}
|
||||
@FeedModel.add(item)
|
||||
|
||||
item = {id: 4, faviconLink: null, urlHash: 'his'}
|
||||
@FeedModel.add(item)
|
||||
|
||||
expect(@FeedModel.getByUrlHash('hi').id).toBe(3)
|
||||
expect(@FeedModel.getById(3).id).toBe(3)
|
||||
expect(@FeedModel.getById(3).test).toBe('hoho')
|
||||
expect(@FeedModel.size()).toBe(2)
|
||||
|
||||
|
||||
it 'should update normally', =>
|
||||
item = {id: 3, faviconLink: null, urlHash: 'hi', test: 'heheh'}
|
||||
@FeedModel.add(item)
|
||||
|
||||
item2 = {id: 3, faviconLink: null, urlHash: 'his', test: 'hoho'}
|
||||
@FeedModel.add(item2)
|
||||
|
||||
expect(@FeedModel.getById(3).id).toBe(3)
|
||||
expect(@FeedModel.getById(3).test).toBe('hoho')
|
||||
expect(@FeedModel.size()).toBe(1)
|
||||
|
||||
|
||||
@FeedModel.removeById(2)
|
||||
expect(@FeedModel.getByUrlHash('hi')).toBe(undefined)
|
|
@ -32,8 +32,63 @@ describe 'FolderModel', ->
|
|||
expect(@FolderModel instanceof @_Model).toBeTruthy()
|
||||
|
||||
|
||||
it 'should allow to search for foldernames', =>
|
||||
@FolderModel.add({id: 3, name: 'hi'})
|
||||
it 'should add folders without id but name if they dont exist yet', =>
|
||||
item = {name: 'Hi'}
|
||||
@FolderModel.add(item)
|
||||
expect(@FolderModel.getByName('hi')).toBe(item)
|
||||
expect(@FolderModel.size()).toBe(1)
|
||||
|
||||
expect(@FolderModel.nameExists('hi')).toBeTruthy()
|
||||
expect(@FolderModel.nameExists('dhi')).toBeFalsy()
|
||||
|
||||
it 'should clear the fodername cache', =>
|
||||
item = {name: 'Hi'}
|
||||
@FolderModel.add(item)
|
||||
@FolderModel.clear()
|
||||
expect(@FolderModel.getByName('hi')).toBe(undefined)
|
||||
expect(@FolderModel.size()).toBe(0)
|
||||
|
||||
|
||||
it 'should delete items from the fodername cache', =>
|
||||
item = {id: 3, name: 'Hi'}
|
||||
@FolderModel.add(item)
|
||||
@FolderModel.removeById(3)
|
||||
expect(@FolderModel.getByName('hi')).toBe(undefined)
|
||||
expect(@FolderModel.size()).toBe(0)
|
||||
|
||||
|
||||
it 'should update by foldername', =>
|
||||
item = {name: 'Hi'}
|
||||
@FolderModel.add(item)
|
||||
|
||||
item2 = {name: 'hi', test: 'hoho'}
|
||||
@FolderModel.add(item2)
|
||||
|
||||
expect(@FolderModel.getByName('hi').test).toBe('hoho')
|
||||
expect(@FolderModel.size()).toBe(1)
|
||||
|
||||
|
||||
it 'should update the id if an update comes in with an id', =>
|
||||
item = {name: 'Tony'}
|
||||
@FolderModel.add(item)
|
||||
|
||||
item2 = {id: 3, name: 'tony', test: 'hoho'}
|
||||
@FolderModel.add(item2)
|
||||
|
||||
expect(@FolderModel.getByName('Tony').id).toBe(3)
|
||||
expect(@FolderModel.getByName('Tony').test).toBe('hoho')
|
||||
expect(@FolderModel.getById(3).id).toBe(3)
|
||||
expect(@FolderModel.getById(3).test).toBe('hoho')
|
||||
expect(@FolderModel.size()).toBe(1)
|
||||
|
||||
|
||||
it 'should update normally', =>
|
||||
item = {id: 3, name: 'His'}
|
||||
@FolderModel.add(item)
|
||||
|
||||
item2 = {id: 3, name: 'hobo', test: 'hoho'}
|
||||
@FolderModel.add(item2)
|
||||
|
||||
expect(@FolderModel.getByName('His')).toBe(undefined)
|
||||
expect(@FolderModel.getByName('Hobo').id).toBe(3)
|
||||
expect(@FolderModel.getByName('Hobo').test).toBe('hoho')
|
||||
expect(@FolderModel.getById(3).test).toBe('hoho')
|
||||
expect(@FolderModel.size()).toBe(1)
|
Загрузка…
Ссылка в новой задаче