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) { get_or_create(data, direction) {
var model = this.constructor.models[data.modelname]; 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) { if (existing) {
return existing; return existing;
} }
@ -704,12 +704,40 @@ class ModelForest {
return $container; 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) { function recurse(node) {
callback(node) ; if (node.modelname === modelname && node.content.id === id)
result = node;
for (let child of node.children) 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) for (let root of this.roots)
@ -718,20 +746,20 @@ class ModelForest {
/** /**
* Find instance in tree with given type and id * Find instance in tree with given type and id
* @param {string} type * @param {string} modelname
* @param {number} id * @param {number} id
*/ */
find(type, id) { find(modelname, id) {
var result = null; var result = null;
function callback(node) {
if (node.modelname === type && node.content.id == id) function callback(content) {
result = node ; if (content.id == id)
result = content ;
} }
this.traverse(callback); this.traverse(modelname, callback);
return result ;
return result;
} }
} }

View file

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