|
@@ -0,0 +1,309 @@
|
|
|
+/**
|
|
|
+ * 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 App = require('app');
|
|
|
+var validator = require('utils/validator');
|
|
|
+
|
|
|
+App.GridFilterObject = Em.Object.extend({
|
|
|
+ checked:false
|
|
|
+});
|
|
|
+
|
|
|
+App.GridFilter = Em.View.extend({
|
|
|
+ tagName:"ul",
|
|
|
+ classNames:['filter'],
|
|
|
+ templateName:require('templates/common/grid/filter'),
|
|
|
+ attributeBindings:['style'],
|
|
|
+ getHeader:function () {
|
|
|
+ return this.get('header')
|
|
|
+ },
|
|
|
+ filters:function () {
|
|
|
+ return this.get('header._filters');
|
|
|
+ }.property('header._filters')
|
|
|
+});
|
|
|
+
|
|
|
+App.GridHeader = Em.View.extend({
|
|
|
+ templateName:require('templates/common/grid/header'),
|
|
|
+ tagName:'th',
|
|
|
+ filterable:true,
|
|
|
+ showFilter:false,
|
|
|
+ getGrid:function () {
|
|
|
+ return this.get('grid');
|
|
|
+ },
|
|
|
+ _filters:[],
|
|
|
+ doFilter:function () {
|
|
|
+ console.log(this.get('grid'));
|
|
|
+ },
|
|
|
+ toggleFilter:function () {
|
|
|
+ this.set('showFilter', 1 - this.get('showFilter'));
|
|
|
+ },
|
|
|
+ applyFilter:function () {
|
|
|
+ console.warn('APPLYING FILTERS');
|
|
|
+
|
|
|
+ var filters = this.get('_filters');
|
|
|
+ var filterValues = [];
|
|
|
+ $.each(filters, function(){
|
|
|
+ if(this.get('checked')) {
|
|
|
+ filterValues.push(this.get('value'));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ var grid = this.get('grid');
|
|
|
+ grid.addFilters(this.get('name'), filterValues);
|
|
|
+ this.set('showFilter', false);
|
|
|
+ },
|
|
|
+ init:function () {
|
|
|
+ this._super();
|
|
|
+ if (!this.get('_filters').length) {
|
|
|
+ this.filterValues();
|
|
|
+ var thisHeader = this;
|
|
|
+ this.set('filter', App.GridFilter.extend({ header:thisHeader }));
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ filterValues:function () {
|
|
|
+ var gridFilters = this.get('grid._filters');
|
|
|
+ if (gridFilters && gridFilters[this.get('name')]) {
|
|
|
+ var filters = this.get('grid._filters')[this.get('name')];
|
|
|
+ // there should be something like filter preparing
|
|
|
+ var newFilters = [];
|
|
|
+ $.each(filters, function (i, v) {
|
|
|
+ newFilters.push(App.GridFilterObject.create({label:v, value:v}));
|
|
|
+ });
|
|
|
+
|
|
|
+ this.set('_filters', newFilters);
|
|
|
+ }
|
|
|
+ }.observes('grid._filters')
|
|
|
+});
|
|
|
+
|
|
|
+App.GridRow = Em.View.extend({
|
|
|
+ tagName:'tr',
|
|
|
+ init:function (options) {
|
|
|
+ var object = this.get('object');
|
|
|
+ var grid = this.get('grid');
|
|
|
+ var fieldNames = grid.get('fieldNames');
|
|
|
+ var template = '';
|
|
|
+
|
|
|
+ if (fieldNames) {
|
|
|
+ $.each(grid.get('fieldNames'), function (i, field) {
|
|
|
+ template += "<td>" + object.get(field) + "</td>";
|
|
|
+ });
|
|
|
+
|
|
|
+ this.set('template', Em.Handlebars.compile(template));
|
|
|
+ }
|
|
|
+ return this._super();
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+App.GridPage = Em.Object.extend({
|
|
|
+ activeClass:function () {
|
|
|
+ return this.get('active') ? "active" : "";
|
|
|
+ }.property('active'),
|
|
|
+ active:function () {
|
|
|
+ return parseInt(this.get('number')) == parseInt(this.get('pager.grid.currentPage'));
|
|
|
+ }.property('pager.grid.currentPage')
|
|
|
+});
|
|
|
+
|
|
|
+App.GridPager = Em.View.extend({
|
|
|
+
|
|
|
+ pages:[],
|
|
|
+ templateName:require('templates/common/grid/pager'),
|
|
|
+ classNames:['pagination'],
|
|
|
+
|
|
|
+ activatePrevPage:function () {
|
|
|
+ var current = this.get('grid.currentPage');
|
|
|
+ if (current > 1) this.set('grid.currentPage', current - 1);
|
|
|
+ },
|
|
|
+ activateNextPage:function () {
|
|
|
+ var current = this.get('grid.currentPage');
|
|
|
+ if (current < this.get('pages').length) this.set('grid.currentPage', current + 1);
|
|
|
+ },
|
|
|
+
|
|
|
+ prevPageDisabled:function () {
|
|
|
+ return this.get('grid.currentPage') > 1 ? false : "disabled";
|
|
|
+ }.property('grid.currentPage'),
|
|
|
+
|
|
|
+ nextPageDisabled:function () {
|
|
|
+ return this.get('grid.currentPage') < this.get('pages').length ? false : "disabled";
|
|
|
+ }.property('grid.currentPage'),
|
|
|
+
|
|
|
+ init:function () {
|
|
|
+ this._super();
|
|
|
+ this.clearPages()
|
|
|
+ this.pushPages();
|
|
|
+ },
|
|
|
+
|
|
|
+ activatePage:function (event) {
|
|
|
+ var page = event.context;
|
|
|
+ this.get('grid').set('currentPage', parseInt(event.context.get('number')));
|
|
|
+ },
|
|
|
+
|
|
|
+ clearPages:function () {
|
|
|
+ this.set('pages', []);
|
|
|
+ },
|
|
|
+
|
|
|
+ pushPages:function () {
|
|
|
+ var thisPager = this;
|
|
|
+ var pages = this.get('grid._pager.pages');
|
|
|
+ $.each(pages, function () {
|
|
|
+ var thisNumber = this;
|
|
|
+ thisPager.get('pages').push(App.GridPage.create({
|
|
|
+ number:thisNumber,
|
|
|
+ pager:thisPager
|
|
|
+ }));
|
|
|
+ })
|
|
|
+ }.observes('grid._pager')
|
|
|
+});
|
|
|
+
|
|
|
+App.Grid = Em.View.extend({
|
|
|
+ _columns:{}, // not used
|
|
|
+ _filters:{}, // prepared filters from data values
|
|
|
+ _pager:{pages:[1, 2, 3, 4, 5]}, // observed by pager to config it
|
|
|
+
|
|
|
+ _collection:{className:false, staticOptions:{}}, // collection config
|
|
|
+ currentPage:1,
|
|
|
+ fieldNames:[],
|
|
|
+ appliedFilters:{},
|
|
|
+ filteredArray:[],
|
|
|
+ columns:[],
|
|
|
+ collection:[],
|
|
|
+ initComleted:false,
|
|
|
+ rows:[],
|
|
|
+ templateName:require('templates/main/admin/audit'),
|
|
|
+
|
|
|
+ init:function () {
|
|
|
+ console.warn(" Grid INIT ");
|
|
|
+ this._super();
|
|
|
+ this.prepareColumns(); // should be the 1
|
|
|
+ this.prepareCollection();
|
|
|
+ this.preparePager();
|
|
|
+ },
|
|
|
+
|
|
|
+ preparePager:function () {
|
|
|
+// this.set('pager', App.GridPager.extend({ grid:this })); ask to hide
|
|
|
+ },
|
|
|
+
|
|
|
+ addFilters: function(field, values){
|
|
|
+ var filters = this.get('appliedFilters');
|
|
|
+ filters[field] = values;
|
|
|
+
|
|
|
+ var collection = this.get('_collection.className');
|
|
|
+ collection = collection.find();
|
|
|
+ arrayCollection = collection.filter(function(data) {
|
|
|
+ var oneFilterFail = false;
|
|
|
+ $.each(filters, function(fieldname, values){
|
|
|
+ if(values.length && values.indexOf(data.get(fieldname)) == -1) {
|
|
|
+ return oneFilterFail = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return !oneFilterFail;
|
|
|
+ });
|
|
|
+
|
|
|
+ this.set('filteredArray', arrayCollection);
|
|
|
+ },
|
|
|
+
|
|
|
+ prepareCollection:function () {
|
|
|
+ if (validator.empty(this.get('_collection.className'))) {
|
|
|
+ throw "_collection.className field is not defined";
|
|
|
+ }
|
|
|
+ var collection = this.get('_collection.className');
|
|
|
+ this.set('collection', collection.find(this.get('_collection.staticOptions')));
|
|
|
+ },
|
|
|
+
|
|
|
+ addColumn:function (options) {
|
|
|
+ options.grid = this;
|
|
|
+ if (validator.empty(options.name)) {
|
|
|
+ throw "define column name";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.get('_columns.' + options.name)) {
|
|
|
+ throw "column with this '" + options.name + "' already exists";
|
|
|
+ }
|
|
|
+
|
|
|
+ var field = App.GridHeader.extend(options);
|
|
|
+ this.columns.push(field);
|
|
|
+
|
|
|
+ if (field.filterable || 1) { // .filterable - field not working :(
|
|
|
+ this.fieldNames.push(options.name);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ clearColumns:function () {
|
|
|
+ this.set('_columns', {});
|
|
|
+ this.set('columns', []);
|
|
|
+ this.set('fieldNames', []);
|
|
|
+ },
|
|
|
+
|
|
|
+ prepareColumns:function () {
|
|
|
+ this.clearColumns();
|
|
|
+ },
|
|
|
+
|
|
|
+ prepareFilters:function () {
|
|
|
+ var thisGrid = this;
|
|
|
+ var collection = this.get('collection');
|
|
|
+ var fieldNames = this.get('fieldNames');
|
|
|
+ var options = {};
|
|
|
+
|
|
|
+ if (collection && collection.content) {
|
|
|
+ collection.forEach(function (object, i) {
|
|
|
+ $.each(fieldNames, function (j, field) {
|
|
|
+ if (!options[field]) {
|
|
|
+ options[field] = [];
|
|
|
+ }
|
|
|
+
|
|
|
+ var filter = object.get(field);
|
|
|
+ if (options[field].indexOf(filter) == -1) {
|
|
|
+ options[field].push(filter);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ })
|
|
|
+
|
|
|
+ thisGrid.set('_filters', options);
|
|
|
+ }
|
|
|
+ }.observes('collection.length'),
|
|
|
+
|
|
|
+
|
|
|
+ clearRows:function () {
|
|
|
+ this.set('rows', [])
|
|
|
+ },
|
|
|
+
|
|
|
+ prepareRows:function () {
|
|
|
+ var collection = this.get('collection');
|
|
|
+ var thisGrid = this;
|
|
|
+ this.clearRows();
|
|
|
+ console.warn("PREPARE ROWS LEN:", collection.get('length'));
|
|
|
+ var i=1;
|
|
|
+
|
|
|
+ if (collection && collection.content) {
|
|
|
+ collection.forEach(function (object, i) {
|
|
|
+ var row = App.GridRow.extend({grid:thisGrid, object:object});
|
|
|
+ thisGrid.rows.push(row);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }.observes('collection.length'),
|
|
|
+
|
|
|
+ filteredRows:function () {
|
|
|
+ var collection = this.get('filteredArray');
|
|
|
+ var thisGrid = this;
|
|
|
+ this.clearRows();
|
|
|
+
|
|
|
+ collection.forEach(function (object) {
|
|
|
+ var row = App.GridRow.extend({grid:thisGrid, object:object});
|
|
|
+ thisGrid.rows.push(row);
|
|
|
+ });
|
|
|
+ }.observes('filteredArray')
|
|
|
+});
|