Pagination Component:
Create a new Lightning Component Pagination.cmp
.
<!--Pagination.cmp--> <aura:component implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" controller='PaginationController' access="global" > <!-- Attribute Declration For Pagination --> <aura:attribute name="ContactData" type="Object"/> <aura:attribute name="columns" type="List"/> <aura:attribute name="isSending" type="boolean" /> <!-- Attribute Declration For Pagination --> <aura:attribute name="PaginationList" type="Contact"/> <aura:attribute name="startPage" type="Integer" /> <aura:attribute name="endPage" type="Integer"/> <aura:attribute name="totalRecords" type="Integer"/> <aura:attribute name="pageSize" type="Integer" default="10"/> <!-- Attribute Declration For Pagination End--> <aura:handler name="init" value="{! this }" action="{! c.doInit }"/> <!-- Spinner Start, show the loading screen while Client side controller(JS) is communicating with Server Side(APEX) controller --> <aura:if isTrue="{!v.isSending}"> <div class="slds-spinner_container"> <div class="slds-spinner--brand slds-spinner slds-spinner--large" role="alert"> <span class="slds-assistive-text">Loading</span> <div class="slds-spinner__dot-a"></div> <div class="slds-spinner__dot-b"></div> </div> </div> </aura:if> <!-- Spinner End --> <div class="slds-page-header"> <div class="slds-media"> <div class="slds-media__figure"> <span class="slds-icon_container slds-icon-standard-opportunity" title="Description of icon when needed"> </span> </div> </div> </div> <div class="slds-m-top_medium" > <lightning:datatable data="{! v.PaginationList }" class="slds-m-top_medium" columns="{! v.columns }" keyField="id" onrowselection="{! c.getSelectedName }"/> <br/> <lightning:buttonGroup > <lightning:button label="Previous" disabled="{!v.startPage == 0}" onclick="{!c.previous}" variant="brand" iconName='utility:back'/> <lightning:button label="Next" disabled="{!v.endPage >= v.totalRecords}" onclick="{!c.next}" variant="brand" iconName='utility:forward' iconPosition='right'/> </lightning:buttonGroup> </div> </aura:component>
Pagination JavaScript Controller:
Now create below JavaScript PaginationController.js
controller for above Pagination.cmp
component.
({ doInit: function (component, event, helper) { // Set the columns of the Table component.set('v.isSending',true); component.set('v.columns', [ {label: 'Name', fieldName: 'Name', type: 'text', sortable : true}, {label: 'Email', fieldName: 'Email', type: 'email', sortable : true}, {label: 'Phone', fieldName: 'Phone', type: 'phone', sortable : true}]); helper.doFetchContact(component); }, getSelectedName: function (component, event) { var selectedRows = event.getParam('selectedRows'); // Display that fieldName of the selected rows for (var i = 0; i < selectedRows.length; i++){ alert("You selected: " + selectedRows[i].Name); } }, next: function (component, event, helper) { helper.next(component, event); }, previous: function (component, event, helper) { helper.previous(component, event); } })
Pagination JavaScript Controller Helper:
Now create below JavaScript PaginationHelper.js
helper for above PaginationController.js
component.
({ /* * Initially this Method will be called and will fetch the records from the Salesforce Org * Then we will hold all the records into the attribute of Lightning Component */ doFetchContact : function(component) { var action = component.get('c.getContacts'); action.setCallback(this, function(response){ var state = response.getState(); if(state === 'SUCCESS' && component.isValid()){ var pageSize = component.get("v.pageSize"); // hold all the records into an attribute named "ContactData" component.set('v.ContactData', response.getReturnValue()); // get size of all the records and then hold into an attribute "totalRecords" component.set("v.totalRecords", component.get("v.ContactData").length); // set star as 0 component.set("v.startPage",0); component.set("v.endPage",pageSize-1); var PaginationList = []; for(var i=0; i< pageSize; i++){ if(component.get("v.ContactData").length> i) PaginationList.push(response.getReturnValue()[i]); } component.set('v.PaginationList', PaginationList); component.set('v.isSending',false); }else{ alert('ERROR'); } }); $A.enqueueAction(action); }, /* * Method will be called when use clicks on next button and performs the * calculation to show the next set of records */ next : function(component, event){ var sObjectList = component.get("v.ContactData"); var end = component.get("v.endPage"); var start = component.get("v.startPage"); var pageSize = component.get("v.pageSize"); var Paginationlist = []; var counter = 0; for(var i=end+1; i<end+pageSize+1; i++){ if(sObjectList.length > i){ Paginationlist.push(sObjectList[i]); } counter ++ ; } start = start + counter; end = end + counter; component.set("v.startPage",start); component.set("v.endPage",end); component.set('v.PaginationList', Paginationlist); }, /* * Method will be called when use clicks on previous button and performs the * calculation to show the previous set of records */ previous : function(component, event){ var sObjectList = component.get("v.ContactData"); var end = component.get("v.endPage"); var start = component.get("v.startPage"); var pageSize = component.get("v.pageSize"); var Paginationlist = []; var counter = 0; for(var i= start-pageSize; i < start ; i++){ if(i > -1){ Paginationlist.push(sObjectList[i]); counter ++; }else{ start++; } } start = start - counter; end = end - counter; component.set("v.startPage",start); component.set("v.endPage",end); component.set('v.PaginationList', Paginationlist); } })
Pagination Apex Controller:
Create below apex controller to use it in Pagination.cmp
component.
public class PaginationController { @AuraEnabled public static List<Contact> getContacts(){ List<Contact> contactList = new List<Contact>(); contactList = [SELECT Id, Name, Email, Phone From Contact LIMIT 50]; return contactList; } }
Pagination App:
<!--PaginationApp.app--> <aura:application extends="force:slds"> <c:Pagination /> </aura:application>