app/scripts/controllers/grid/grid.js (170 lines of code) (raw):

App.GridPagingMixin = Ember.Mixin.create({ pagesCountProperty : 'pages', pageNumberProperty : 'currentPage', pageNumber : 1, pagesCount : 1, currentPage : 1, rowCount : 10, hasNextPage : false, hasPreviousPage : false, didRowsChanged : function() { this.set('hasNextPage', this.get('pageNumber') + 1 <= this.get('pagesCount')); this.set('hasPreviousPage', this.get('pageNumber') - 1 > 0 ); }.observes('rows', 'pagesCount', 'pageNumber') }); App.Grid = Ember.ArrayController.extend(App.GridPagingMixin, { // json root property root : '', rows: [], columns : [], toolbar : {}, columnConfigVisible : false, selectAll: function(key, value) { if (!Ember.isNone(value) && this.rows) { this.rows.setEach('isSelected', value); return value; } else { return this.rows && this.rows.isEvery('isSelected', true); } }.property('rows.@each.isSelected'), isMultiselect : true, getData : function(properties, callback) { }, actions : { loadData : function(properties) { var controller = this; this.getData(properties, function(json, textStatus) { controller.set('rows', json[controller.root]); controller.set('pagesCount', json[controller.pagesCountProperty] ? json[controller.pagesCountProperty] : 1); controller.set('pageNumber', json[controller.pageNumberProperty] ? json[controller.pageNumberProperty] : 1); }); }, toolbarButtonClicked : function(action) { var selectedRows = this.get('rows').filter(function(row) { return row.isSelected; }); var controller = this; this.get('toolbar').buttons.forEach(function(button,index) { if(button.action === action) { button.handler(selectedRows, controller); return false; } }); }, sort : function(columnProperty, isSortable) { if(isSortable) { var columns = this.get('columns'); var controller = this; columns.forEach(function(column, index) { if(column.isSortable && column.property === columnProperty) { column.sort(controller); return false; } else { column.sort(controller, 'NONE'); } }); } }, changePage : function(action, pageNumber) { var pageToSet = pageNumber; switch(action) { case 'next_page' : if(this.get('hasNextPage')) { pageToSet = this.get('currentPage') + 1; } break; case 'last_page' : if(this.get('hasNextPage')) { pageToSet = this.get('pagesCount'); } break; case 'previous_page' : if(this.get('hasPreviousPage')) { pageToSet = this.get('currentPage') - 1; } break; case 'first_page': if(this.get('hasPreviousPage')) { pageToSet = 1; } break; } App.Logger.log('action: ' + action + ' pagging button clicked '); App.Logger.log('pageToSet: ' + pageToSet ); if(!Ember.isNone(pageToSet)) { this.set('pageNumber', pageToSet); this.send('loadData', { paging : {page : pageToSet}}); } }, rowSelected : function(index) { }, toggleColumnConfig : function() { this.toggleProperty('columnConfigVisible'); } } }); App.Grid.ToolbarButton = Ember.Object.extend({ title : Ember.I18n.translate("button_camel_case"), action : "test", handler : function(selectedRows, controller) { App.Logger.log('action: ' + this.action + ' selected row: '); App.Logger.log(selectedRows); controller.send("loadData"); } }); App.Grid.Column = Ember.Object.extend({ property: null, sortingOrder: 'NONE', sortingClass : 'sorting-none', didSortingChanged : function() { var sortClass = 'sorting-none'; switch(this.get('sortingOrder')) { case 'NONE': sortClass = 'sorting-none'; break; case 'DESC': sortClass = 'sorting-desc'; break; case 'ASC' : sortClass = 'sorting-asc'; break; } App.Logger.log('sortClass: ' + sortClass ); this.set('sortingClass', sortClass); }.observes('sortingOrder'), isSortable : false, header: function () { if (!this.get('property')) { return ''; } return this.get('property').capitalize(); }.property('property'), display: true, format : function(value) { if(Ember.typeOf(value) === 'array') { return value.join(','); } return value; }, visible: function () { return this.get('display') !== false; }.property('display'), sort : function(controller, mode) { if(mode) { this.set('sortingOrder', mode); } else { var order; switch(this.get('sortingOrder')) { case 'NONE': case 'DESC': order = 'ASC'; break; case 'ASC' : order = 'DESC'; break; } App.Logger.log('sortingOrder: ' + order ); this.set('sortingOrder', order); controller.send('loadData', { sort : {column: this.property, order: order} }); } } }); Ember.Handlebars.helper('gridCell', function(object, column) { var properties = column.property.split('.'); var innerObject = object; for(var i = 0; i < properties.length; i++) { innerObject = innerObject[properties[i]]; } return column.format(innerObject); });