123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /**
- * @class Ext.ux.GridKeyNav
- * Simple plugin to implement basic keyboard navigation for Ext 2.x grids that have a
- * paging toolbar (required). Adds: Page Down/Page Up/Right Arrow/Left Arrow/Home/End,
- * also adds functionality to the selection model to see if Down is pressed at the last record
- * of a page or Up is pressed at the first record of the page and attempts to move a page
- * in the proper direction.
- */
- Ext.ux.GridKeyNav = function() {}
- Ext.ux.GridKeyNav.prototype = {
- /**
- * @cfg {Boolean} bottomBar
- * Look for the paging toolbar within the grids bbar, set to true to pull from tbar (defaults to true)
- */
- bottomBar: true,
- /**
- * @cfg {Ext.PagingToolbar} toolbar
- * Manually pass in a toolbar instead of pulling from bbar/tbar of the grid (in case it is rendered elsewhere)
- */
- toolbar: null,
- init: function(grid) {
- this.grid = grid;
- this.grid.on({
- render: this.onRender,
- destroy: this.onDestroy,
- scope: this
- });
- },
- onRender : function() {
- this.nav = new Ext.KeyNav(this.grid.getGridEl(),{
- left: this.pagingNav.createDelegate(this,['prev']),
- right: this.pagingNav.createDelegate(this,['next']),
- pageDown: this.pagingNav.createDelegate(this,['next']),
- pageUp: this.pagingNav.createDelegate(this, ['prev']),
- home: this.pagingNav.createDelegate(this,['first']),
- end: this.pagingNav.createDelegate(this,['last'])
- });
- this.pt = this.toolbar||((this.bottomBar)?this.grid.getBottomToolbar():this.grid.getTopToolbar());
- this.sm = this.grid.getSelectionModel();
- this.sm.selectNext = this.sm.selectNext.createInterceptor(this.beforeNext, this);
- this.sm.selectPrevious = this.sm.selectPrevious.createInterceptor(this.beforePrevious, this);
- },
- onDestroy: function() {
- this.nav.disable();
- delete this.nav;
- },
- pagingNav: function(page) {
- if (!this.pt[page].disabled) {
- this.pt.onClick(this.pt[page]);
- if (page === 'last') {
- this.forceSelectLastRow();
- }
- } else {
- // Is all the data on a single page? If so let home/end work
- if (this.pt.pageSize >= this.grid.getStore().data.length) {
- if (page == 'first') {
- this.sm.selectFirstRow();
- } else if (page == 'last') {
- this.sm.selectLastRow();
- }
- }
- }
- },
- beforeNext: function() {
- if (!this.sm.hasNext()) {
- this.pagingNav('next');
- return false;
- }
- },
- beforePrevious: function() {
- if (!this.sm.hasPrevious()) {
- this.pagingNav('prev');
- this.forceSelectLastRow();
- return false;
- }
- },
- forceSelectLastRow: function() {
- this.grid.getStore().on('load', function() {
- this.sm.selectLastRow();
- }, this, {single: true});
- }
- }
|