Change traverse and find behavior

This commit is contained in:
Ludovic Stephan 2017-04-05 12:00:39 -03:00
parent 1761c5f1bd
commit 508e7ec23f
2 changed files with 68 additions and 35 deletions

View file

@ -596,7 +596,7 @@ class ModelForest {
get_or_create(data, direction) {
var model = this.constructor.models[data.modelname];
var existing = this.find(data.modelname, data.content.id);
var existing = this.find_node(data.modelname, data.content.id);
if (existing) {
return existing;
}
@ -704,12 +704,40 @@ class ModelForest {
return $container;
}
traverse(callback) {
/**
* Find if node already exists in given tree
* @param {Models.TreeNode}
*/
find_node(modelname, id) {
var result = null;
function recurse(node) {
callback(node) ;
if (node.modelname === modelname && node.content.id === id)
result = node;
for (let child of node.children)
callback(child);
recurse(child);
}
for (let root of this.roots)
recurse(root);
return result;
}
/**
* Performs for each node (in a DFS order) the callback function
* on node.content and node.parent.content, if node has given modelname.
* @param {string} modelname
* @param {function} callback
*/
traverse(modelname, callback) {
function recurse(node) {
if (node.modelname === modelname)
callback(node.content, node.parent && node.parent.content || null) ;
for (let child of node.children)
recurse(child);
}
for (let root of this.roots)
@ -718,20 +746,20 @@ class ModelForest {
/**
* Find instance in tree with given type and id
* @param {string} type
* @param {string} modelname
* @param {number} id
*/
find(type, id) {
find(modelname, id) {
var result = null;
function callback(node) {
if (node.modelname === type && node.content.id == id)
result = node ;
function callback(content) {
if (content.id == id)
result = content ;
}
this.traverse(callback);
this.traverse(modelname, callback);
return result;
}
}

View file

@ -456,7 +456,7 @@ class ArticleManager {
}
get_article(id) {
return this.list.find('article', id).content;
return this.list.find('article', id);
}
update_data(data) {
@ -498,7 +498,7 @@ class ArticleManager {
var id = $(this).parent().attr('id').split('-')[1];
var article = that.list.find('article', id);
if (article)
that.validate(article.content);
that.validate(article);
});
this._$nb.on('keydown', function(e) {
@ -575,25 +575,23 @@ class ArticleAutocomplete {
var lower = prefix.toLowerCase() ;
var that = this ;
article_list.traverse(function(node) {
if (node.modelname === 'article' &&
node.content.name.toLowerCase()
.startsWith(lower)) {
that.matching['article'].push(node.content);
if (that.matching['category'].indexOf(node.parent.content) == -1)
that.matching['category'].push(node.parent.content);
article_list.traverse('article', function(article, category) {
if (article.name.toLowerCase().startsWith(lower)) {
that.matching.push(article);
if (that.active_categories.indexOf(category) == -1)
that.active_categories.push(category);
}
});
if (this.matching['article'].length == 1) {
if (this.matching.length == 1) {
if (!backspace) {
this.manager.validate(this.matching['article'][0]) ;
this.manager.validate(this.matching[0]) ;
this.showAll() ;
} else {
this.manager.unset();
this.updateDisplay();
}
} else if (this.matching['article'].length > 1) {
} else if (this.matching.length > 1) {
this.manager.unset();
this.updateDisplay() ;
if (!backspace)
@ -604,19 +602,23 @@ class ArticleAutocomplete {
updateDisplay() {
var that = this;
this.manager.list.traverse(function(node) {
if (that.matching[node.modelname].indexOf(node.content) != -1) {
that._$container.find('#'+node.modelname+'-'+node.content.id)
.show();
this.manager.list.traverse('article', function(article, category) {
if (that.matching.indexOf(article) != -1) {
that._$container.find('#article-'+article.id).show();
} else {
that._$container.find('#'+node.modelname+'-'+node.content.id)
.hide();
that._$container.find('#article-'+article.id).hide();
}
if (that.active_categories.indexOf(category) != -1) {
that._$container.find('#category-'+category.id).show();
} else {
that._$container.find('#category-'+category.id).hide();
}
});
}
updatePrefix() {
var lower = this.matching['article'].map(function (article) {
var lower = this.matching.map(function (article) {
return article.name.toLowerCase() ;
});
@ -631,14 +633,17 @@ class ArticleAutocomplete {
showAll() {
var that = this;
this.resetMatch();
this.manager.list.traverse(function(node) {
that.matching[node.modelname].push(node.content);
this.manager.list.traverse('article', function(article) {
that.matching.push(article);
});
this.manager.list.traverse('category', function(category) {
that.active_categories.push(category);
});
this.updateDisplay();
}
resetMatch() {
this.matching = {'article' : [],
'category': []};
this.matching = [];
this.active_categories = [];
}
}