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>
|