Create a Conga Composer List View Button (Lightning Experience)
How to create a Conga Composer List View Button (Lightning Experience).
Integration Method
You can integrate Composer within Salesforce Lightning using the following steps:
From Step 1, your Apex Class should look like this:
public class OpportunityCMController {
private final static String urlFieldName = 'Conductor__c';
private String partnerServerUrl;
private ApexPages.StandardSetController controller;
private List<String> opportunityIds = new List<Id>();
public String CMUrl {get; private set;}
public OpportunityCMController(ApexPages.StandardSetController controller) {
this.controller = controller;
for (Opportunity opportunity : (List<Opportunity>)controller.getSelected()){
opportunityIds.add(opportunity.Id);
}
partnerServerUrl = 'https://'+ApexPages.currentPage().getHeaders().get('Host')+'/services/Soap/u/26.0/'+UserInfo.getOrganizationId();
}
public PageReference prepareCMUrl() {
CMUrl = 'https://composer.congamerge.com' +
'?SessionId=' + UserInfo.getSessionID() +
'&ServerUrl=' + partnerServerUrl +
'&Id=' + UserInfo.getUserId() +
'&QueryId=[Opps]a0346000009N2DH?pv0=' + '\''+ String.join(new List<String>(opportunityIds),'\'|\'')+'\'';
return null;
}
}
And now the Visualforce Page should look like this:
<apex:page standardController="Opportunity" extensions="OpportunityCMController" recordSetVar="opportunities" action="{!prepareCMUrl}">
<apex:outputPanel id="script">
<script type="text/javascript">
window.open("{!CMUrl}","_blank","width=640,height=480");
window.history.back();
</script>
</apex:outputPanel>
</apex:page>
The Test Apex Class (if deploying in Production) should look like this:
/**
* @description Test Class for the OpportunityCMController Class
*/
@isTest
public with sharing class OpportunityCMControllerTest {
/**
* @description setup - test data setup method
*/
@testSetup
public static void setup(){
List<Account> testAccounts = new List<Account>();
List<Opportunity> testOpps = new List<Opportunity>();
/**** Test Account record creation ****/
/**** Fields shown here are required for a Salesforce Developer Org ****/
/**** Requires updates for any required fields you may have ****/
Account a = new Account();
a.Name = 'ABC Company, Inc.';
a.BillingState = 'CO';
a.NumberOfLocations__c = 1;
testAccounts.add(a);
Account acct = new Account();
acct.BillingState = 'OR';
acct.NumberOfLocations__c = 2;
acct.Name = 'XYZ Company, Inc.';
testAccounts.add(acct);
/**** end test account records ****/
/**** Test Opportuinity record creation ****/
/**** Fields shown here are required for a Salesforce Developer Org ****/
/**** Requires updates for any required fields you may have ****/
Opportunity opp1 = new Opportunity();
opp1.Name = 'Test Opp 1';
opp1.CloseDate = Date.newInstance(2020, 01, 01);
opp1.StageName = 'Negotiating';
opp1.Amount = 1;
opp1.AccountId = a.Id;
testOpps.add(opp1);
Opportunity opp2 = new Opportunity();
opp2.Name = 'Test Opp 21';
opp2.CloseDate = Date.newInstance(2020, 02, 02);
opp2.StageName = 'Negotiating';
opp2.Amount = 2;
opp2.AccountId = a.Id;
testOpps.add(opp2);
/**** end test Opportuinity records ****/
/**** Insert the Test Records ****/
insert testAccounts;
insert testOpps;
}
/**
* @description testMethod1 - Test Happy Path of code
*/
public static testMethod void testMethod1() {
List<sObject> opps = (List<Opportunity>)[Select ID From Opportunity LIMIT 2];
System.debug('********************* opps: ' + opps);
ApexPages.StandardSetController ssc = new ApexPages.StandardSetController(opps);
ssc.setSelected(opps);
OpportunityCMController ocmc = new OpportunityCMController(ssc);
ocmc.prepareCMUrl();
/**** Actually run the test ****/
/**** 100% coverage based upon "OpportunityCMController" Class provided on Conga's Support Site ****/
Test.startTest();
PageReference pr = ocmc.prepareCMUrl();
Test.stopTest();
}
}
Sample Query Dataset referenced in the Apex Class controlled:
select name, amount, stagename from opportunity
where id IN ({pv0})
