mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 16:37:23 +00:00
list_render: Move sort functions to module scope.
Moving these to module scope makes it a little easier to round out our test coverage, plus it's a bit less clutter in the widget code.
This commit is contained in:
@@ -541,3 +541,25 @@ run_test('errors', () => {
|
|||||||
});
|
});
|
||||||
blueslip.reset();
|
blueslip.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
run_test('sort helpers', () => {
|
||||||
|
/*
|
||||||
|
We mostly test our sorting helpers using the
|
||||||
|
actual widget, but this test gets us a bit
|
||||||
|
more line coverage.
|
||||||
|
*/
|
||||||
|
const alice2 = {name: 'alice', id: 2};
|
||||||
|
const alice10 = {name: 'alice', id: 10};
|
||||||
|
const bob2 = {name: 'bob', id: 2};
|
||||||
|
const bob10 = {name: 'bob', id: 10};
|
||||||
|
|
||||||
|
const alpha_cmp = list_render.alphabetic_sort('name');
|
||||||
|
const num_cmp = list_render.numeric_sort('id');
|
||||||
|
|
||||||
|
assert.equal(alpha_cmp(alice2, alice10), 0);
|
||||||
|
assert.equal(alpha_cmp(alice2, bob2), -1);
|
||||||
|
assert.equal(alpha_cmp(bob2, alice10), 1);
|
||||||
|
assert.equal(num_cmp(alice2, bob2), 0);
|
||||||
|
assert.equal(num_cmp(alice2, bob10), -1);
|
||||||
|
assert.equal(num_cmp(alice10, bob2), 1);
|
||||||
|
});
|
||||||
|
|||||||
@@ -25,6 +25,34 @@ exports.filter = (value, list, opts) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.alphabetic_sort = (prop) => {
|
||||||
|
return function (a, b) {
|
||||||
|
// The conversion to uppercase helps make the sorting case insensitive.
|
||||||
|
const str1 = a[prop].toUpperCase();
|
||||||
|
const str2 = b[prop].toUpperCase();
|
||||||
|
|
||||||
|
if (str1 === str2) {
|
||||||
|
return 0;
|
||||||
|
} else if (str1 > str2) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.numeric_sort = (prop) => {
|
||||||
|
return function (a, b) {
|
||||||
|
if (parseFloat(a[prop]) > parseFloat(b[prop])) {
|
||||||
|
return 1;
|
||||||
|
} else if (parseFloat(a[prop]) === parseFloat(b[prop])) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
exports.valid_filter_opts = (opts) => {
|
exports.valid_filter_opts = (opts) => {
|
||||||
if (!opts.filter) {
|
if (!opts.filter) {
|
||||||
return true;
|
return true;
|
||||||
@@ -67,7 +95,10 @@ exports.create = function ($container, list, opts) {
|
|||||||
const meta = {
|
const meta = {
|
||||||
sorting_function: null,
|
sorting_function: null,
|
||||||
sorting_functions: new Map(),
|
sorting_functions: new Map(),
|
||||||
generic_sorting_functions: new Map(),
|
generic_sorting_functions: {
|
||||||
|
alphabetic: exports.alphabetic_sort,
|
||||||
|
numeric: exports.numeric_sort,
|
||||||
|
},
|
||||||
offset: 0,
|
offset: 0,
|
||||||
list: list,
|
list: list,
|
||||||
filtered_list: list,
|
filtered_list: list,
|
||||||
@@ -156,19 +187,13 @@ exports.create = function ($container, list, opts) {
|
|||||||
} else if (typeof sorting_function === "string") {
|
} else if (typeof sorting_function === "string") {
|
||||||
if (typeof prop === "string") {
|
if (typeof prop === "string") {
|
||||||
/* eslint-disable max-len */
|
/* eslint-disable max-len */
|
||||||
meta.sorting_function = meta.generic_sorting_functions.get(sorting_function)(prop);
|
meta.sorting_function = meta.generic_sorting_functions[sorting_function](prop);
|
||||||
} else {
|
} else {
|
||||||
meta.sorting_function = meta.sorting_functions.get(sorting_function);
|
meta.sorting_function = meta.sorting_functions.get(sorting_function);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// generic sorting functions are ones that will use a specified prop
|
|
||||||
// and perform a sort on it with the given sorting function.
|
|
||||||
widget.add_generic_sort_function = function (name, sorting_function) {
|
|
||||||
meta.generic_sorting_functions.set(name, sorting_function);
|
|
||||||
};
|
|
||||||
|
|
||||||
widget.set_up_event_handlers = function () {
|
widget.set_up_event_handlers = function () {
|
||||||
meta.scroll_container = scroll_util.get_list_scrolling_container($container);
|
meta.scroll_container = scroll_util.get_list_scrolling_container($container);
|
||||||
|
|
||||||
@@ -235,35 +260,6 @@ exports.create = function ($container, list, opts) {
|
|||||||
widget.hard_redraw();
|
widget.hard_redraw();
|
||||||
};
|
};
|
||||||
|
|
||||||
// add built-in generic sort functions.
|
|
||||||
widget.add_generic_sort_function("alphabetic", function (prop) {
|
|
||||||
return function (a, b) {
|
|
||||||
// The conversion to uppercase helps make the sorting case insensitive.
|
|
||||||
const str1 = a[prop].toUpperCase();
|
|
||||||
const str2 = b[prop].toUpperCase();
|
|
||||||
|
|
||||||
if (str1 === str2) {
|
|
||||||
return 0;
|
|
||||||
} else if (str1 > str2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
widget.add_generic_sort_function("numeric", function (prop) {
|
|
||||||
return function (a, b) {
|
|
||||||
if (parseFloat(a[prop]) > parseFloat(b[prop])) {
|
|
||||||
return 1;
|
|
||||||
} else if (parseFloat(a[prop]) === parseFloat(b[prop])) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
widget.set_up_event_handlers();
|
widget.set_up_event_handlers();
|
||||||
|
|
||||||
if (opts.sort_fields) {
|
if (opts.sort_fields) {
|
||||||
|
|||||||
Reference in New Issue
Block a user