mirror of https://github.com/rancher/ui.git
73 lines
1.8 KiB
JavaScript
73 lines
1.8 KiB
JavaScript
/**
|
|
* Sortable - provides sorting functionality to a data set
|
|
* @mixin mixins/sortable
|
|
* @property {object} sortableContent - content to sort. i.e. model data
|
|
* @property {object} sorts - fields to sort via object of arrays. Arrays can contain weighted properties to sort on
|
|
* i.e {id: ['id', 'name', 'time']}
|
|
* @property {string} sortBy - default sort field
|
|
* @property {boolean} descending - default sort order
|
|
* @property {object} actions - contains the action handeler for changing sorts
|
|
*
|
|
* @function currentSort - returns the current sort
|
|
* @function arranged - returns the sorted data, you should use this as your data to display
|
|
*/
|
|
import Ember from 'ember';
|
|
|
|
export default Ember.Mixin.create({
|
|
sortableContent: Ember.computed.alias('model'),
|
|
sorts: null,
|
|
sortBy: null,
|
|
descending: false,
|
|
|
|
actions: {
|
|
changeSort: function(name) {
|
|
if ( this.get('sortBy') === name )
|
|
{
|
|
this.set('descending', !this.get('descending'));
|
|
}
|
|
else
|
|
{
|
|
this.setProperties({
|
|
descending: false,
|
|
sortBy: name
|
|
});
|
|
}
|
|
}
|
|
},
|
|
|
|
currentSort: function() {
|
|
var sorts = this.get('sorts');
|
|
if ( sorts )
|
|
{
|
|
var sort = sorts[this.get('sortBy')];
|
|
if ( sort )
|
|
{
|
|
return sort;
|
|
}
|
|
}
|
|
}.property('sortBy','sorts.@each.{name}'),
|
|
|
|
arranged: function(){
|
|
var content = this.get('sortableContent')||[];
|
|
var currentSort = this.get('currentSort');
|
|
var out;
|
|
if ( currentSort )
|
|
{
|
|
out = content.sortBy.apply(content, currentSort);
|
|
}
|
|
else
|
|
{
|
|
out = content.slice();
|
|
}
|
|
|
|
if ( this.get('descending') )
|
|
{
|
|
return out.reverse();
|
|
}
|
|
else
|
|
{
|
|
return out;
|
|
}
|
|
}.property('sortableContent.[]','currentSort','descending'),
|
|
});
|