Better comparison control

This commit is contained in:
Ludovic Stephan 2017-03-17 12:33:43 -03:00
parent 9ab2a11432
commit a7de396aa3
3 changed files with 35 additions and 19 deletions

View file

@ -498,8 +498,8 @@ class ArticleCategory extends ModelObject {
* Comparison function between ArticleCategory model instances.
* @see {@link Models.ModelObject.compare|ModelObject.compare}
*/
comparevalue() {
return this.name ;
static compare(a, b) {
return a.name.localeCompare(b.name) ;
}
}
@ -542,8 +542,8 @@ class Article extends ModelObject {
* Comparison function between Article model instances.
* @see {@link Models.ModelObject.compare|ModelObject.compare}
*/
comparevalue() {
return this.name;
static compare(a, b) {
return a.name.localeCompare(b.name);
}
// Take care of 'price' type
@ -565,13 +565,6 @@ class TreeNode {
this.parent = null;
this.children = [];
}
static compare(a, b) {
var a_serial = a.content.comparevalue();
var b_serial = b.content.comparevalue();
return a_serial.localeCompare(b_serial)
}
}
@ -588,6 +581,18 @@ class ModelForest {
*/
static get models() { return {}; }
/**
* Comparison function for nodes
* @abstract
* @param {class} model Model to use for comparison
* @param {Models.TreeNode} a
* @param {Models.TreeNode} b
* @see {@link Models.ModelObject.compare|ModelObject.compare}
*/
static compare(model, a, b) {
return model.compare(a.content, b.content);
}
/**
* Creates empty instance and populates it with data if given
@ -616,6 +621,9 @@ class ModelForest {
var content = new this.constructor.models[data.type](data.content);
var node = new TreeNode(data.type, content);
if (data.child_sort)
node.child_sort = data.child_sort
if (direction <= 0) {
if (data.parent) {
var parent = this.get_or_create(data.parent, -1);
@ -672,8 +680,8 @@ class ModelForest {
var $rendered = node.content.display($(template), options);
$container.append($rendered);
//TODO: better sorting control
node.children.sort(TreeNode.compare);
//dirty
node.children.sort(this.constructor.compare.bind(null, this.constructor.models[node.child_sort]));
for (let child of node.children) {
var $child = this.render_element(child, templates, options);
@ -705,8 +713,7 @@ class ModelForest {
* @param {Object} [options] Options for element render method
*/
display($container, templates, options) {
this.roots.sort(TreeNode.compare);
this.roots.sort(this.constructor.compare.bind(null, this.root_sort));
for (let root of this.roots) {
$container.append(this.render_element(root, templates, options));
}
@ -727,9 +734,9 @@ class ModelForest {
}
/**
* Find instance in data matching given properties.
* @param {class} model
* @param {Object} props Properties to match
* Find instance in tree with given type and id
* @param {string} type
* @param {number} id
*/
find(type, id) {
var result = null;
@ -813,6 +820,15 @@ class ArticleList extends APIModelForest {
static get url_model() {
return Urls['kfet.kpsul.articles_data']();
}
/**
* Provides model to sort root objects
* {@see Models.ModelForest.constructor|ModelForest.constructor}
*/
constructor() {
super();
this.root_sort = ArticleCategory;
}
}

View file

@ -451,7 +451,6 @@ class ArticleManager {
this._$container.on('click', '.article', function() {
var id = $(this).parent().attr('id').split('-')[1];
console.log(id);
var article = that.list.find('article', id);
if (article)
that.validate(article.content);

View file

@ -1362,6 +1362,7 @@ def kpsul_articles_data(request):
'id': article.category.id,
'name': article.category.name,
},
'child_sort': 'article',
}
})
return JsonResponse(articlelist, safe=False)