| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-toolbar-Paging'>/**</span> * As the number of records increases, the time required for the browser to render them increases. Paging is used to * reduce the amount of data exchanged with the client. Note: if there are more records/rows than can be viewed in the * available screen area, vertical scrollbars will be added. * * Paging is typically handled on the server side (see exception below). The client sends parameters to the server side, * which the server needs to interpret and then respond with the appropriate data. * * Ext.toolbar.Paging is a specialized toolbar that is bound to a {@link Ext.data.Store} and provides automatic * paging control. This Component {@link Ext.data.Store#method-load load}s blocks of data into the {@link #store} by passing * parameters used for paging criteria. * * {@img Ext.toolbar.Paging/Ext.toolbar.Paging.png Ext.toolbar.Paging component} * * Paging Toolbar is typically used as one of the Grid's toolbars: * *     @example *     var itemsPerPage = 2;   // set the number of items you want per page * *     var store = Ext.create('Ext.data.Store', { *         id:'simpsonsStore', *         autoLoad: false, *         fields:['name', 'email', 'phone'], *         pageSize: itemsPerPage, // items per page *         proxy: { *             type: 'ajax', *             url: 'pagingstore.js',  // url that will load data with respect to start and limit params *             reader: { *                 type: 'json', *                 root: 'items', *                 totalProperty: 'total' *             } *         } *     }); * *     // specify segment of data you want to load using params *     store.load({ *         params:{ *             start:0, *             limit: itemsPerPage *         } *     }); * *     Ext.create('Ext.grid.Panel', { *         title: 'Simpsons', *         store: store, *         columns: [ *             { header: 'Name',  dataIndex: 'name' }, *             { header: 'Email', dataIndex: 'email', flex: 1 }, *             { header: 'Phone', dataIndex: 'phone' } *         ], *         width: 400, *         height: 125, *         dockedItems: [{ *             xtype: 'pagingtoolbar', *             store: store,   // same store GridPanel is using *             dock: 'bottom', *             displayInfo: true *         }], *         renderTo: Ext.getBody() *     }); * * To use paging, you need to set a pageSize configuration on the Store, and pass the paging requirements to * the server when the store is first loaded. * *     store.load({ *         params: { *             // specify params for the first page load if using paging *             start: 0, *             limit: myPageSize, *             // other params *             foo:   'bar' *         } *     }); * * If using {@link Ext.data.Store#autoLoad store's autoLoad} configuration: * *     var myStore = Ext.create('Ext.data.Store', { *         {@link Ext.data.Store#autoLoad autoLoad}: {start: 0, limit: 25}, *         ... *     }); * * The packet sent back from the server would have this form: * *     { *         "success": true, *         "results": 2000, *         "rows": [ // ***Note:** this must be an Array *             { "id":  1, "name": "Bill", "occupation": "Gardener" }, *             { "id":  2, "name":  "Ben", "occupation": "Horticulturalist" }, *             ... *             { "id": 25, "name":  "Sue", "occupation": "Botanist" } *         ] *     } * * ## Paging with Local Data * * Paging can also be accomplished with local data using extensions: * *   - [Ext.ux.data.PagingStore][1] *   - Paging Memory Proxy (examples/ux/PagingMemoryProxy.js) * *    [1]: http://sencha.com/forum/showthread.php?t=71532 */Ext.define('Ext.toolbar.Paging', {    extend: 'Ext.toolbar.Toolbar',    alias: 'widget.pagingtoolbar',    alternateClassName: 'Ext.PagingToolbar',    requires: ['Ext.toolbar.TextItem', 'Ext.form.field.Number'],    mixins: {        bindable: 'Ext.util.Bindable'        },<span id='Ext-toolbar-Paging-cfg-store'>    /**</span>     * @cfg {Ext.data.Store} store (required)     * The {@link Ext.data.Store} the paging toolbar should use as its data source.     */<span id='Ext-toolbar-Paging-cfg-displayInfo'>    /**</span>     * @cfg {Boolean} displayInfo     * true to display the displayMsg     */    displayInfo: false,<span id='Ext-toolbar-Paging-cfg-prependButtons'>    /**</span>     * @cfg {Boolean} prependButtons     * true to insert any configured items _before_ the paging buttons.     */    prependButtons: false,    //<locale><span id='Ext-toolbar-Paging-cfg-displayMsg'>    /**</span>     * @cfg {String} displayMsg     * The paging status message to display. Note that this string is     * formatted using the braced numbers {0}-{2} as tokens that are replaced by the values for start, end and total     * respectively. These tokens should be preserved when overriding this string if showing those values is desired.     */    displayMsg : 'Displaying {0} - {1} of {2}',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-emptyMsg'>    /**</span>     * @cfg {String} emptyMsg     * The message to display when no records are found.     */    emptyMsg : 'No data to display',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-beforePageText'>    /**</span>     * @cfg {String} beforePageText     * The text displayed before the input item.     */    beforePageText : 'Page',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-afterPageText'>    /**</span>     * @cfg {String} afterPageText     * Customizable piece of the default paging text. Note that this string is formatted using     * {0} as a token that is replaced by the number of total pages. This token should be preserved when overriding this     * string if showing the total page count is desired.     */    afterPageText : 'of {0}',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-firstText'>    /**</span>     * @cfg {String} firstText     * The quicktip text displayed for the first page button.     * **Note**: quick tips must be initialized for the quicktip to show.     */    firstText : 'First Page',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-prevText'>    /**</span>     * @cfg {String} prevText     * The quicktip text displayed for the previous page button.     * **Note**: quick tips must be initialized for the quicktip to show.     */    prevText : 'Previous Page',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-nextText'>    /**</span>     * @cfg {String} nextText     * The quicktip text displayed for the next page button.     * **Note**: quick tips must be initialized for the quicktip to show.     */    nextText : 'Next Page',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-lastText'>    /**</span>     * @cfg {String} lastText     * The quicktip text displayed for the last page button.     * **Note**: quick tips must be initialized for the quicktip to show.     */    lastText : 'Last Page',    //</locale>    //<locale><span id='Ext-toolbar-Paging-cfg-refreshText'>    /**</span>     * @cfg {String} refreshText     * The quicktip text displayed for the Refresh button.     * **Note**: quick tips must be initialized for the quicktip to show.     */    refreshText : 'Refresh',    //</locale><span id='Ext-toolbar-Paging-cfg-inputItemWidth'>    /**</span>     * @cfg {Number} inputItemWidth     * The width in pixels of the input field used to display and change the current page number.     */    inputItemWidth : 30,<span id='Ext-toolbar-Paging-method-getPagingItems'>    /**</span>     * Gets the standard paging items in the toolbar     * @private     */    getPagingItems: function() {        var me = this;        return [{            itemId: 'first',            tooltip: me.firstText,            overflowText: me.firstText,            iconCls: Ext.baseCSSPrefix + 'tbar-page-first',            disabled: true,            handler: me.moveFirst,            scope: me        },{            itemId: 'prev',            tooltip: me.prevText,            overflowText: me.prevText,            iconCls: Ext.baseCSSPrefix + 'tbar-page-prev',            disabled: true,            handler: me.movePrevious,            scope: me        },        '-',        me.beforePageText,        {            xtype: 'numberfield',            itemId: 'inputItem',            name: 'inputItem',            cls: Ext.baseCSSPrefix + 'tbar-page-number',            allowDecimals: false,            minValue: 1,            hideTrigger: true,            enableKeyEvents: true,            keyNavEnabled: false,            selectOnFocus: true,            submitValue: false,            // mark it as not a field so the form will not catch it when getting fields            isFormField: false,            width: me.inputItemWidth,            margins: '-1 2 3 2',            listeners: {                scope: me,                keydown: me.onPagingKeyDown,                blur: me.onPagingBlur            }        },{            xtype: 'tbtext',            itemId: 'afterTextItem',            text: Ext.String.format(me.afterPageText, 1)        },        '-',        {            itemId: 'next',            tooltip: me.nextText,            overflowText: me.nextText,            iconCls: Ext.baseCSSPrefix + 'tbar-page-next',            disabled: true,            handler: me.moveNext,            scope: me        },{            itemId: 'last',            tooltip: me.lastText,            overflowText: me.lastText,            iconCls: Ext.baseCSSPrefix + 'tbar-page-last',            disabled: true,            handler: me.moveLast,            scope: me        },        '-',        {            itemId: 'refresh',            tooltip: me.refreshText,            overflowText: me.refreshText,            iconCls: Ext.baseCSSPrefix + 'tbar-loading',            handler: me.doRefresh,            scope: me        }];    },    initComponent : function(){        var me = this,            pagingItems = me.getPagingItems(),            userItems   = me.items || me.buttons || [];        if (me.prependButtons) {            me.items = userItems.concat(pagingItems);        } else {            me.items = pagingItems.concat(userItems);        }        delete me.buttons;        if (me.displayInfo) {            me.items.push('->');            me.items.push({xtype: 'tbtext', itemId: 'displayItem'});        }        me.callParent();        me.addEvents(<span id='Ext-toolbar-Paging-event-change'>            /**</span>             * @event change             * Fires after the active page has been changed.             * @param {Ext.toolbar.Paging} this             * @param {Object} pageData An object that has these properties:             *             * - `total` : Number             *             *   The total number of records in the dataset as returned by the server             *             * - `currentPage` : Number             *             *   The current page number             *             * - `pageCount` : Number             *             *   The total number of pages (calculated from the total number of records in the dataset as returned by the             *   server and the current {@link Ext.data.Store#pageSize pageSize})             *             * - `toRecord` : Number             *             *   The starting record index for the current page             *             * - `fromRecord` : Number             *             *   The ending record index for the current page             */            'change',<span id='Ext-toolbar-Paging-event-beforechange'>            /**</span>             * @event beforechange             * Fires just before the active page is changed. Return false to prevent the active page from being changed.             * @param {Ext.toolbar.Paging} this             * @param {Number} page The page number that will be loaded on change             */            'beforechange'        );        me.on('beforerender', me.onLoad, me, {single: true});        me.bindStore(me.store || 'ext-empty-store', true);    },    // private    updateInfo : function(){        var me = this,            displayItem = me.child('#displayItem'),            store = me.store,            pageData = me.getPageData(),            count, msg;        if (displayItem) {            count = store.getCount();            if (count === 0) {                msg = me.emptyMsg;            } else {                msg = Ext.String.format(                    me.displayMsg,                    pageData.fromRecord,                    pageData.toRecord,                    pageData.total                );            }            displayItem.setText(msg);        }    },    // private    onLoad : function(){        var me = this,            pageData,            currPage,            pageCount,            afterText,            count,            isEmpty;        count = me.store.getCount();        isEmpty = count === 0;        if (!isEmpty) {            pageData = me.getPageData();            currPage = pageData.currentPage;            pageCount = pageData.pageCount;            afterText = Ext.String.format(me.afterPageText, isNaN(pageCount) ? 1 : pageCount);        } else {            currPage = 0;            pageCount = 0;            afterText = Ext.String.format(me.afterPageText, 0);        }        Ext.suspendLayouts();        me.child('#afterTextItem').setText(afterText);        me.child('#inputItem').setDisabled(isEmpty).setValue(currPage);        me.child('#first').setDisabled(currPage === 1 || isEmpty);        me.child('#prev').setDisabled(currPage === 1  || isEmpty);        me.child('#next').setDisabled(currPage === pageCount  || isEmpty);        me.child('#last').setDisabled(currPage === pageCount  || isEmpty);        me.child('#refresh').enable();        me.updateInfo();        Ext.resumeLayouts(true);        if (me.rendered) {            me.fireEvent('change', me, pageData);        }    },    // private    getPageData : function(){        var store = this.store,            totalCount = store.getTotalCount();        return {            total : totalCount,            currentPage : store.currentPage,            pageCount: Math.ceil(totalCount / store.pageSize),            fromRecord: ((store.currentPage - 1) * store.pageSize) + 1,            toRecord: Math.min(store.currentPage * store.pageSize, totalCount)        };    },    // private    onLoadError : function(){        if (!this.rendered) {            return;        }        this.child('#refresh').enable();    },    // private    readPageFromInput : function(pageData){        var v = this.child('#inputItem').getValue(),            pageNum = parseInt(v, 10);        if (!v || isNaN(pageNum)) {            this.child('#inputItem').setValue(pageData.currentPage);            return false;        }        return pageNum;    },    onPagingFocus : function(){        this.child('#inputItem').select();    },    //private    onPagingBlur : function(e){        var curPage = this.getPageData().currentPage;        this.child('#inputItem').setValue(curPage);    },    // private    onPagingKeyDown : function(field, e){        var me = this,            k = e.getKey(),            pageData = me.getPageData(),            increment = e.shiftKey ? 10 : 1,            pageNum;        if (k == e.RETURN) {            e.stopEvent();            pageNum = me.readPageFromInput(pageData);            if (pageNum !== false) {                pageNum = Math.min(Math.max(1, pageNum), pageData.pageCount);                if(me.fireEvent('beforechange', me, pageNum) !== false){                    me.store.loadPage(pageNum);                }            }        } else if (k == e.HOME || k == e.END) {            e.stopEvent();            pageNum = k == e.HOME ? 1 : pageData.pageCount;            field.setValue(pageNum);        } else if (k == e.UP || k == e.PAGE_UP || k == e.DOWN || k == e.PAGE_DOWN) {            e.stopEvent();            pageNum = me.readPageFromInput(pageData);            if (pageNum) {                if (k == e.DOWN || k == e.PAGE_DOWN) {                    increment *= -1;                }                pageNum += increment;                if (pageNum >= 1 && pageNum <= pageData.pageCount) {                    field.setValue(pageNum);                }            }        }    },    // private    beforeLoad : function(){        if(this.rendered && this.refresh){            this.refresh.disable();        }    },<span id='Ext-toolbar-Paging-method-moveFirst'>    /**</span>     * Move to the first page, has the same effect as clicking the 'first' button.     */    moveFirst : function(){        if (this.fireEvent('beforechange', this, 1) !== false){            this.store.loadPage(1);        }    },<span id='Ext-toolbar-Paging-method-movePrevious'>    /**</span>     * Move to the previous page, has the same effect as clicking the 'previous' button.     */    movePrevious : function(){        var me = this,            prev = me.store.currentPage - 1;        if (prev > 0) {            if (me.fireEvent('beforechange', me, prev) !== false) {                me.store.previousPage();            }        }    },<span id='Ext-toolbar-Paging-method-moveNext'>    /**</span>     * Move to the next page, has the same effect as clicking the 'next' button.     */    moveNext : function(){        var me = this,            total = me.getPageData().pageCount,            next = me.store.currentPage + 1;        if (next <= total) {            if (me.fireEvent('beforechange', me, next) !== false) {                me.store.nextPage();            }        }    },<span id='Ext-toolbar-Paging-method-moveLast'>    /**</span>     * Move to the last page, has the same effect as clicking the 'last' button.     */    moveLast : function(){        var me = this,            last = me.getPageData().pageCount;        if (me.fireEvent('beforechange', me, last) !== false) {            me.store.loadPage(last);        }    },<span id='Ext-toolbar-Paging-method-doRefresh'>    /**</span>     * Refresh the current page, has the same effect as clicking the 'refresh' button.     */    doRefresh : function(){        var me = this,            current = me.store.currentPage;        if (me.fireEvent('beforechange', me, current) !== false) {            me.store.loadPage(current);        }    },        getStoreListeners: function() {        return {            beforeload: this.beforeLoad,            load: this.onLoad,            exception: this.onLoadError        };    },<span id='Ext-toolbar-Paging-method-unbind'>    /**</span>     * Unbinds the paging toolbar from the specified {@link Ext.data.Store} **(deprecated)**     * @param {Ext.data.Store} store The data store to unbind     */    unbind : function(store){        this.bindStore(null);    },<span id='Ext-toolbar-Paging-method-bind'>    /**</span>     * Binds the paging toolbar to the specified {@link Ext.data.Store} **(deprecated)**     * @param {Ext.data.Store} store The data store to bind     */    bind : function(store){        this.bindStore(store);    },    // private    onDestroy : function(){        this.unbind();        this.callParent();    }});</pre></body></html>
 |