import { LightningElement, api, track } from "lwc"; import getAccountsPaginated from "@salesforce/apex/PaginatedListControllerLwc.getAccountsPaginated"; import { ShowToastEvent } from 'lightning/platformShowToastEvent'; import { reduceErrors } from 'c/ldsUtils'; import ACCOUNT_NAME_FIELD from "@salesforce/schema/Account.Name"; import ACCOUNT_TYPE_FIELD from "@salesforce/schema/Account.Type"; import ACCOUNT_PHONE_FIELD from "@salesforce/schema/Account.Type"; import ACCOUNT_EMPLOYEES_FIELD from "@salesforce/schema/Account.NumberOfEmployees"; const COLUMNS = [ { label: "Account Name", fieldName: ACCOUNT_NAME_FIELD.fieldApiName, type: "text", sortable: "true" }, { label: "Type", fieldName: ACCOUNT_TYPE_FIELD.fieldApiName, type: "text" }, { label: "Phone", fieldName: ACCOUNT_PHONE_FIELD.fieldApiName, type: "phone" }, { label: "Employees", fieldName: ACCOUNT_EMPLOYEES_FIELD.fieldApiName, type: "Number" } ]; export default class PaginatedList extends LightningElement { columns = COLUMNS; @track sortBy = "Name"; @track sortDirection = "asc"; @track pageSize = 10; error; records; currentPageToken = 0; nextPageToken = this.pageSize; @track loader = false; @track pageNumber = 1; @track paginationVisibility = false; @track totalPages = 1; @api pageSizeOptions = [10, 25, 50, 75, 100]; connectedCallback() { this.getAccounts(); } getAccounts() { this.loader = true; getAccountsPaginated({ pageSize: this.pageSize, pageToken: this.currentPageToken, sortField: this.sortBy, sortOrder: this.sortDirection }) .then((result) => { this.loader = false; if (result) { this.records = result.records; this.nextPageToken = result.nextPageToken; this.totalRecords = result.totalRecords; this.recordStart = result.recordStart; this.recordEnd = result.recordEnd; this.totalPages = Math.ceil(result.totalRecords / this.pageSize); this.paginationVisibility = this.totalPages > 1 ? true : false; } }) .catch((error) => { this.loader = false; this.error = error; this.currentPageToken = 0; const evt = new ShowToastEvent({ title: 'Error', message: reduceErrors(error).join(', '), variant: 'error' }); this.dispatchEvent(evt); }); } doSorting(event) { console.log("Sort"); this.sortBy = event.detail.fieldName; this.sortDirection = event.detail.sortDirection; this.currentPageToken = 0; this.getAccounts(); } handlePrevious() { this.currentPageToken = Number(this.currentPageToken) - Number(this.pageSize); this.getAccounts(); } handleNext() { this.currentPageToken = Number(this.currentPageToken) + Number(this.pageSize); this.getAccounts(); } handleFirst() { this.currentPageToken = 0; this.getAccounts(); } handleLast() { this.currentPageToken = this.totalPages > 1? (this.totalPages-1)* this.pageSize:0; this.getAccounts(); } handlePageschange(event) { console.log(event.detail); this.pageSize = event.detail; this.currentPageToken = 0; this.getAccounts(); } get previousButtonDisabled() { return this.currentPageToken === 0; } get nextButtonDisabled() { return this.nextPageToken === undefined; } }