blob: fa8bef8a3784fed53b0b5b1bc0646efc2a1b992f [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var misc = require('utils/misc');
var App = require('app');
/**
* Wrapper View for all sort components. Layout template and common actions are located inside of it.
* Logic specific for sort fields
* located in inner view - <code>fieldView</code>.
*
* @type {*}
*/
var wrapperView = Em.View.extend({
tagName: 'tr',
/**
* Load sort statuses from local storage
* Works only after finish filtering in the parent View
*/
loadSortStatuses: function() {
var statuses = App.db.getSortingStatuses(this.get('controller.name'));
if (!this.get('parentView.filteringComplete')) return;
if (statuses) {
var childViews = this.get('childViews');
var self = this;
statuses.forEach(function(st) {
if (st.status != 'sorting') {
var sortOrder = false;
if(st.status == 'sorting_desc') {
sortOrder = true;
}
self.sort(childViews.findProperty('name', st.name), sortOrder);
childViews.findProperty('name', st.name).set('status', (sortOrder)?'sorting_desc':'sorting_asc');
}
else {
childViews.findProperty('name', st.name).set('status', st.status);
}
});
}
this.get('parentView').showProperPage();
}.observes('parentView.filteringComplete'),
/**
* Save sort statuses to local storage
* Works only after finish filtering in the parent View
*/
saveSortStatuses: function() {
if (!this.get('parentView.filteringComplete')) return;
var statuses = [];
this.get('childViews').forEach(function(childView) {
statuses.push({
name: childView.get('name'),
status: childView.get('status')
});
});
App.db.setSortingStatuses(this.get('controller.name'), statuses);
}.observes('childViews.@each.status'),
/**
* sort content by property
* @param property
* @param order: true - DESC, false - ASC
*/
sort: function(property, order){
var content = this.get('content').toArray();
var sortFunc = this.getSortFunc(property, order);
this.resetSort();
content.sort(sortFunc);
this.set('content', content);
},
/**
* reset all sorts fields
*/
resetSort: function(){
this.get('childViews').setEach('status', 'sorting');
},
/**
* determines sort function depending on the type of sort field
* @param property
* @param order
* @return {*}
*/
getSortFunc: function(property, order){
var func;
switch (property.get('type')){
case 'ip':
func = function (a, b) {
var a = misc.ipToInt(a.get(property.get('name')));
var b = misc.ipToInt(b.get(property.get('name')));
if(order){
return b - a;
} else {
return a - b;
}
};
break;
case 'number':
func = function (a, b) {
var a = parseFloat(a.get(property.get('name')));
var b = parseFloat(b.get(property.get('name')));
if(order){
return b - a;
} else {
return a - b;
}
}
break;
default:
func = function(a,b){
if(order){
if (a.get(property.get('name')) > b.get(property.get('name')))
return -1;
if (a.get(property.get('name')) < b.get(property.get('name')))
return 1;
return 0;
} else {
if (a.get(property.get('name')) < b.get(property.get('name')))
return -1;
if (a.get(property.get('name')) > b.get(property.get('name')))
return 1;
return 0;
}
}
}
return func;
}
});
/**
* particular view that contain sort field properties:
* name - name of property in content table
* type(optional) - specific type to sort
* displayName - label to display
* @type {*}
*/
var fieldView = Em.View.extend({
template:Em.Handlebars.compile('{{view.displayName}}'),
classNameBindings: ['status'],
tagName: 'th',
name: null,
displayName: null,
status: 'sorting',
type: null,
/**
* callback that run sorting and define order of sorting
* @param event
*/
click: function(event){
if(this.get('status') === 'sorting_desc'){
this.get('parentView').sort(this, false);
this.set('status', 'sorting_asc');
}
else {
this.get('parentView').sort(this, true);
this.set('status', 'sorting_desc');
}
}
});
/**
* Result object, which will be accessible outside
* @type {Object}
*/
module.exports = {
wrapperView: wrapperView,
fieldView: fieldView
};