Hello Everyone, In this tutorial, I am going to provide a step-by-step procedure to create a custom Lightning component that helps you to search for records in the database. It’s a search tool that uses SOSL to query data from the database and return the result in form of a sObject list that we show in Lightning component using lightning:datatable tag.
After completing this tutorial you'll able to:
- Create a global search lightning component.
- Show records on UI using lightning:datatable tag.
So let's start,
Global Search Lightning Component
Login to your Salesforce Org. and open developer console.
Step1: Go to File>New>Apex Class and Create an Apex controller called GlobalSearchHandler. Replace following code in apex controller.
GlobalSearchHandler.apxc
Step2: Go to File>New>Lightning Component and create a Lightning Component called GlobalSearchComponent. Replace the following markup in the Lightning Component.
GlobalSearchComponent.cmp
GlobalSearchComponentController.js
GlobalSearchHandler.apxc
public class GlobalSearchHandler{ @AuraEnabled(cacheable=true) public static List<List<sObject>> getSearchRecords(String searchKey){ List<List<sObject>> searchResult = [FIND :searchKey IN ALL FIELDS RETURNING Account (Id, Name, AccountNumber, Website), Contact(Id, Name, Email, MobilePhone), Opportunity(Id, Name, StageName, CloseDate), Lead(Id, Name, Email, Company)]; return searchResult; } }
Step2: Go to File>New>Lightning Component and create a Lightning Component called GlobalSearchComponent. Replace the following markup in the Lightning Component.
GlobalSearchComponent.cmp
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId" access="global" controller="GlobalSearchHandler"> <aura:handler name="init" value="{!this}" action="{!c.doInit}"/> <aura:handler event="aura:waiting" action="{!c.showSpinner}"/> <aura:handler event="aura:doneWaiting" action="{!c.hideSpinner}"/> <aura:attribute name="showSearchResults" type="Boolean" default="false"/> <aura:attribute name="searchKey" type="String"/> <aura:attribute name="accountList" type="List" default="Account[]"/> <aura:attribute name="accountColumns" type="List"/> <aura:attribute name="contactList" type="List" default="Contact[]"/> <aura:attribute name="contactColumns" type="List"/> <aura:attribute name="oppList" type="List" default="Opportunity[]"/> <aura:attribute name="oppColumns" type="List"/> <aura:attribute name="leadList" type="List" default="Lead[]"/> <aura:attribute name="leadColumns" type="List"/> <aura:attribute name="Spinner" type="boolean" default="false"/> <!--loading spinner start... style=Brand Medium (blue dots)--> <aura:if isTrue="{!v.Spinner}"> <div aura:id="spinnerId" class="slds-spinner_container"> <div class="slds-spinner--brand slds-spinner slds-spinner--large slds-is-relative" 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> <!-- Loading spinner end--> <lightning:layout multipleRows="true"> <lightning:layoutItem padding="around-small" size="6"> <lightning:input name="searchKey" placeholder="Enter Search Key" value="{!v.searchKey}"/> </lightning:layoutItem> <lightning:layoutItem padding="around-small" size="3"> <lightning:button variant="brand" label="Search" title="Search" onclick="{!c.search}" class="SearchButton"/> </lightning:layoutItem> </lightning:layout> <aura:if isTrue="{!v.showSearchResults}"> <lightning:layout multipleRows="true"> <lightning:layoutItem padding="around-small" size="12"> <span style="font-size:16px;font-weight:bold">Account</span> <lightning:datatable keyField="id" data="{!v.accountList}" columns="{!v.accountColumns}" hideCheckboxColumn="true"/> </lightning:layoutItem> <lightning:layoutItem padding="around-small" size="12"> <span style="font-size:16px;font-weight:bold">Contact</span> <lightning:datatable keyField="id" data="{!v.contactList}" columns="{!v.contactColumns}" hideCheckboxColumn="true"/> </lightning:layoutItem> <lightning:layoutItem padding="around-small" size="12"> <span style="font-size:16px;font-weight:bold">Opportunity</span> <lightning:datatable keyField="id" data="{!v.oppList}" columns="{!v.oppColumns}" hideCheckboxColumn="true"/> </lightning:layoutItem> <lightning:layoutItem padding="around-small" size="12"> <span style="font-size:16px;font-weight:bold">Lead</span> <lightning:datatable keyField="id" data="{!v.leadList}" columns="{!v.leadColumns}" hideCheckboxColumn="true"/> </lightning:layoutItem> </lightning:layout> </aura:if> </aura:component>
GlobalSearchComponentController.js
({ doInit: function (component, event, helper){ component.set('v.accountColumns', [ {label: 'Name', fieldName: 'Name', type: 'text'}, {label: 'Account Number', fieldName: 'AccountNumber', type: 'text'}, {label: 'Website', fieldName: 'Website', type: 'url', typeAttributes: { target: '_self'}} ]); component.set('v.contactColumns', [ {label: 'Name', fieldName: 'Name', type: 'text'}, {label: 'Email', fieldName: 'Email', type: 'email'}, {label: 'Mobile', fieldName: 'MobilePhone', type: 'phone'}, ]); component.set('v.oppColumns', [ {label: 'Name', fieldName: 'Name', type: 'text'}, {label: 'Stage Name', fieldName: 'StageName', type: 'text'}, {label: 'Close Date', fieldName: 'CloseDate', type: 'date'} ]); component.set('v.leadColumns', [ {label: 'Name', fieldName: 'Name', type: 'text'}, {label: 'Company', fieldName: 'Company', type: 'text'}, {label: 'Email', fieldName: 'Email', type: 'email'} ]); }, search : function(component, event, helper) { helper.getSearchResultsFromHandler(component,helper); component.set("v.showSearchResults",true); }, // this function automatic call by aura:waiting event showSpinner: function(component, event, helper) { // make Spinner attribute true for display loading spinner component.set("v.Spinner", true); }, // this function automatic call by aura:doneWaiting event hideSpinner : function(component,event,helper){ // make Spinner attribute to false for hide loading spinner component.set("v.Spinner", false); } })GlobalSearchComponentHelper.js
({ getSearchResultsFromHandler : function(component,helper){ var action = component.get("c.getSearchRecords"); action.setParams({ searchKey : component.get("v.searchKey") }); // callback that is executed after the server-side action returns action.setCallback(this, function(response) { var state = response.getState(); if (state === "SUCCESS") { var result = response.getReturnValue(); // SOSL will always return the list in the order they were queried component.set("v.accountList",result[0]); component.set("v.contactList",result[1]); component.set("v.oppList",result[2]); component.set("v.leadList",result[3]); } else if (state === "INCOMPLETE") { // do something } else if (state === "ERROR") { var errors = response.getError(); if (errors) { if (errors[0] && errors[0].message) { console.log("Error message: " +errors[0].message); } } else { console.log("Unknown error"); } } }); $A.enqueueAction(action); }, })GlobalSearchComponent.css
.THIS .SearchButton{ margin-top: 18px; } .THIS.slds-spinner_container { z-index: 10000; position: fixed; }Step3: Go to File>New>Lightning Application and create a Lightning Application called Preview. Replace the following markup in the Lightning Application.
<aura:application extends="force:slds"> <c:GlobalSearchComponent/> </aura:application>After that click on Preview button from Right Side Pallete
Output:
See also:
- Set default value in Picklist in Lightning Component
- Lightning Design System in Salesforce
- Interfaces in Lightning Component
Conclusion:
Hope you like this tutorial, for any query or suggestions please feel free to comment.
Thank you.
5 Comments
Thank you !!!!!!
ReplyDeleteNice article...
ReplyDeleteThanks a lot
DeleteThis is great! I'm a newbie just learning and I can't figure out how to make the search results clickable using typeAttributes - any suggestions
ReplyDeletePlease go through to following link, you will find solution for your problem.
Deletehttps://salesforcescool.blogspot.com/2021/06/link-record-id-in-column-in-lightning.html
Post a Comment