Category Archives: Salesforce

Lightning Icons in Visualforce Page

Salesforce provides 5 different kind of Icons (Standart, Custom, Utility, Doctype, Action) which can be used in Lightning component and Visualforce page. Find SLDS Icons here.

Example:
Instead of uploading the Lightning Design System as a static resource, we can include apex:slds inside the head tag of Visualforce page to use Lightning Design System stylesheets in the page.

Visualforce Page:

<apex:page showHeader="false" standardStylesheets="false" sidebar="false" docType="html-5.0" >
    
    <head>
        <apex:slds/> 
    </head>
    
    <body class="slds-scope">
        <div class="slds-m-around--xx-large">
            <article class="slds-card">
                <div class="slds-card__body">
                    <table class="slds-table slds-table_bordered">
                        <thead>
                            <tr class="slds-text-heading--label">
                                <th scope="col">NAME</th>
                                <th scope="col">CATEGORIES</th>
                                <th scope="col">ICON</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td scope="row">Account</td>
                                <td scope="row">Standard</td>
                                <td scope="row">
                                    <span class="slds-icon_container slds-icon-standard-account" >
                                        <svg aria-hidden="true" class="slds-icon slds-icon--small">
                                            <use xmlns:xlink="http://www.w3.org/2000/xlink" 
                                                 xlink:href="/apexpages/slds/latest/assets/icons/standard-sprite/svg/symbols.svg#account">
                                            </use>
                                        </svg>
                                        <span class="slds-assistive-text">Account</span>
                                    </span>
                                </td>
                            </tr>
                            <tr>
                                <td scope="row">Custom1</td>
                                <td scope="row">Custom</td>
                                <td scope="row">
                                    <span class="slds-icon_container slds-icon-custom-custom1" >
                                        <svg aria-hidden="true" class="slds-icon slds-icon--small">
                                            <use xmlns:xlink="http://www.w3.org/2000/xlink" 
                                                 xlink:href="/apexpages/slds/latest/assets/icons/custom-sprite/svg/symbols.svg#custom1">
                                            </use>
                                        </svg>
                                        <span class="slds-assistive-text">Custom1</span>
                                    </span>
                                </td>
                            </tr>
                            <tr>
                                <td scope="row">Email</td>
                                <td scope="row">Utility</td>
                                <td scope="row">
                                    
                                    <span class="slds-icon_container slds-icon-utility-email" >
                                        <svg aria-hidden="true" class="slds-icon slds-icon-text-default">
                                            <use xmlns:xlink="http://www.w3.org/1999/xlink" 
                                                 xlink:href="/apexpages/slds/latest/assets/icons/utility-sprite/svg/symbols.svg#email">
                                            </use>
                                        </svg>
                                        <span class="slds-assistive-text">Email</span>
                                    </span>
                                    
                                </td>
                            </tr>
                            <tr>
                                <td scope="row">Priority</td>
                                <td scope="row">Action</td>
                                <td scope="row">
                                    <span class="slds-icon_container slds-icon-action-priority" >
                                        <svg aria-hidden="true" class="slds-icon  slds-icon--x-small">
                                            <use xmlns:xlink="http://www.w3.org/1999/xlink" 
                                                 xlink:href="/apexpages/slds/latest/assets/icons/action-sprite/svg/symbols.svg#priority">
                                            </use>
                                        </svg>
                                        <span class="slds-assistive-text">Priority</span>
                                    </span>
                                    
                                </td>
                            </tr>
                            <tr>
                                <td scope="row">CSV</td>
                                <td scope="row">Doctype</td>
                                <td scope="row">
                                    <span class="slds-icon_container slds-icon-doctype-csv" >
                                        <svg aria-hidden="true" class="slds-icon ">
                                            <use xmlns:xlink="http://www.w3.org/1999/xlink" 
                                                 xlink:href="/apexpages/slds/latest/assets/icons/doctype-sprite/svg/symbols.svg#csv">
                                            </use>
                                        </svg>
                                        <span class="slds-assistive-text">CSV</span>
                                    </span>
                                    
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </article>
        </div>
    </body>
</apex:page>

Output:

Invoke Batch Apex From Another Batch Apex

Only in batch class finish method, We can call another batch class. If you will call another batch class from batch class execute and start method, then Salesforce will throw below runtime error.

 
System.AsyncException: Database.executeBatch cannot be called from a batch start, batch execute, or future method.

Here in below example there are two batch classes “Batch1” and “Batch2“.
I want to execute “Batch2” after finish the “Batch1“.
So, I’m calling “Batch2” class in “Batch1” finish method.

Batch1:

global class Batch1 implements Database.Batchable<Sobject>{

	//Method to get the data to be proceesed  
	global database.Querylocator Start(Database.BatchableContext bc){
		String query = 'Select Id, Name From Account Limit 1000';
		return Database.getQueryLocator(query);
	}


	//Method to execute the batch
	global void execute(Database.BatchableContext bc, Sobject[] scope){
		for(Sobject s : scope){ 
		Account a = (Account)s;
			// TO DO
			// add your logic 
		}
	}

	//Method to be called after the excute
	global void finish(Database.BatchableContext bc){
		//Add your start code for the other batch job here
		Database.executeBatch(new Batch2());
	}
}

Batch2:

global class Batch2 implements Database.Batchable<Sobject>{

	//Method to get the data to be proceesed  
	global database.Querylocator start(Database.BatchableContext bc){
		string query = 'Select Id, Name From Contact Limit 1000';
		return Database.getQueryLocator(query);
	}


	//Method to execute the batch
	global void execute(Database.BatchableContext bc, Sobject[] scope){
		for(Sobject s : scope){ 
		Contact c = (Contact)s;
			// TO DO
			// add your logic 
		}
	}

	//Method to be called after the excute
	global void finish(Database.BatchableContext bc){

	}
}

Salesforce Named Credentials

  • Salesforce introduced Named Credentials in the Spring’15 release.
  • Named credential specifies the URL of a callout endpoint and its required authentication parameters in one definition.
  • No need to handle Remote site settings of the Named credential callout URL.
  • Named credentials separate the URL from the authentication, making it easier to make changes to both the endpoint URL and authentication if needed.
  • It supports Basic Password authentication and OAuth 2.0 authentication protocols.
  • You can configured Named credentials to use an org-wide named principal or to use per-user authentication so that users can manage their own credentials.

Apex HTTP Callout Without Named Credential:

String username = 'username';
String password = 'password';
String endpoint = 'https://testapi.com';

Http http = new Http();
HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setEndpoint(endpoint);

//Add basic authentication header to the callout
Blob headerValue = Blob.valueOf(username + ':' + password); 
String authHeader = 'BASIC ' + EncodingUtil.base64Encode(headerValue); 
req.setHeader('Authorization', authHeader);

HttpResponse response = http.send(req);
System.debug('response-' + response);

Example:
Setup | Quick Find – Search Named Credentials | New Named Credential

Create Named Credential as per your requirement:

Apex HTTP Callout With Named Credential:

Http http = new Http();
HttpRequest req = new HttpRequest();

req.setEndpoint('callout:Sample_API/some_path');
req.setMethod('POST');

HTTPResponse response = http.send(req);
System.debug('response-' + response);

Marquee Text In Salesforce Lightning Component

Lightning Component (Sample.cmp):

<!--Sample.cmp--> 
<aura:component implements="flexipage:availableForAllPageTypes">
    <div class="marquee">
        <p>
            <a title="Welcome to Biswajeet Samal's Blog" href="http://biswajeetsamal.com/blog" target="_blank">Welcome to Biswajeet Samal's Blog</a>
        </p>
    </div>
</aura:component>

Lightning Component Style (Sample.css):

.marquee.THIS {
    width: 100%;
    line-height: 50px;
    color: white;
    white-space: nowrap;
    overflow: hidden;
    box-sizing: border-box;
    background-color: red;
}

.marquee.THIS p {
    display: inline-block;
    padding-left: 100%;
    animation: marquee 20s linear infinite;
    font-size:30px;
}

@keyframes marquee {
    0%   { transform: translate(0, 0); }
    100% { transform: translate(-100%, 0); }
}

Output:

Custom Validation For Lightning Field Value in Lightning

Component :

<aura:component>    
    <div class="slds-m-around--xx-large">
        <div class="slds-form--stacked">
            <div class="slds-form-element">  
                <div class="slds-form-element__control">
                    <ui:inputNumber aura:id="inputAge" label="Enter your age" class="slds-input"/>
                </div>
            </div>
            <div class="slds-m-around--medium">
                <button class="slds-button slds-button--brand" onclick="{!c.validateAge}">Validate Age</button>
            </div>
        </div>
    </div>  
</aura:component>

Component JS Controller :

({
    validateAge : function(component, event, helper) {
        var inputAge = component.find('inputAge');
        var ageValue = inputAge.get('v.value');
        if(parseInt(ageValue) < 18){
            inputAge.set("v.errors", [{message:"Age should be more than 18...!!"}]);
            return;
        }
    }
})

Output :