| /** |
| * 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'); |
| |
| /** |
| * 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', |
| /** |
| * 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; |
| 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 |
| }; |