VF Page
<apex:page sidebar="false" standardStylesheets="false" cache="false" standardController="Account" recordSetVar="accounts" lightningStylesheets="true">
<button id="upload-button" onclick="window.print();" style="margin-left: 50%;" Class="slds-button">Print</button>
<apex:includeLightning />
<div id="lightning" ></div>
<script>
$Lightning.use("c:ListView", function() {
$Lightning.createComponent("c:ListViewComponent",
{ label : "" },
"lightning",
function(cmp) {
});
});
</script>
</apex:page>
Controller class
public with sharing class ListViewController {
// Method to get all list view option available for the Account object
@AuraEnabled
public static List<SelectOption> getListViews(){
SelectOption lstView=new SelectOption ('--None--','--None--');
List<SelectOption> listviews = new List<SelectOption>();
listviews.add(lstView);
for(ListView lstObj : [SELECT Id, Name FROM ListView WHERE SobjectType = 'Account' order by name ASC]){
listviews.add(new SelectOption (lstObj.id,lstObj.name));
}
return listviews;
}
// Method to get the Account records based on the selected list view
@AuraEnabled
public static DynamicTableMapping getFilteredAccounts(String filterId){
list<string> headervalue =new list<string>();
HttpRequest req = new HttpRequest();
String baseUrl = URL.getSalesforceBaseUrl().toExternalForm();
String endPoinURL = baseUrl+'/services/data/v32.0/sobjects/Account/listviews/'+filterId+'/describe';
req.setEndpoint(endPoinURL);
req.setMethod('GET');
req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionId());
Http http = new Http();
HTTPResponse response = http.send(req);
Map<String, Object> tokenResponse = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
String query = (String) tokenResponse.get('query');
system.debug('query--->'+query);
for(string s:query.split(',')){
s=s.trim();
if(s.startsWith('SELECT')){
headervalue.add((s.removeStart('SELECT')).trim());
}else if(!s.startsWith('SYSTEMMODSTAMP') && !s.equalsIgnoreCase('SYSTEMMODSTAMP FROM ACCOUNT ORDER BY NAME ASC NULLS FIRST') && !s.contains('ASC')){
headervalue.add(s.trim());
}
}
List<ObjectValueMap> AccountList = new List<ObjectValueMap>();
for(Account accountObj : database.query(query)){
Map<String, Schema.SObjectField> objectFields = Account.getSObjectType().getDescribe().fields.getMap();
list<FieldValues> fieldValue=new list<FieldValues>();
for(string s:headervalue){
Schema.DescribeFieldResult dr;
if (objectFields.containsKey(s))
dr = objectFields.get(s).getDescribe();
if(null!=dr)
fieldValue.add(new FieldValues(string.valueof(null==accountObj.get(dr.getName())?'':accountObj.get(dr.getName()))));
else
fieldValue.add(new FieldValues(string.valueof('')));
}
AccountList.add(new ObjectValueMap(accountObj,fieldValue));
}
return new DynamicTableMapping(headervalue,AccountList);
}
}
Lightning component
<aura:component controller="ListViewController" implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" access="global" >
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
<aura:attribute name="AccountListViewList" type="SelectOption[]"/>
<aura:attribute name="AccountList" type="DynamicTableMapping"/>
<aura:attribute name="fieldList" type="string[]"/>
<ui:inputSelect class="slds-select slds-size_small" aura:id="selectedViewId" label="Account View" change="{!c.getFilteredAccount}">
<aura:iteration items="{!v.AccountListViewList}" var="listview">
<ui:inputSelectOption text="{!listview.value}" label="{!listview.label}"/>
</aura:iteration>
</ui:inputSelect>
<br/><br/>
<table class="slds-table slds-table_bordered slds-table_cell-buffer">
<thead>
<tr class="slds-text-title_caps">
<aura:iteration items="{!v.fieldList}" var="item">
<th scope="col">
<div class="slds-truncate" title="{!item}">{!item}</div>
</th>
</aura:iteration>
</tr>
</thead>
<tbody>
<aura:iteration items="{!v.AccountList}" var="item" indexVar="index">
<tr>
<aura:iteration items="{!item.values}" var="item1">
<td>
{!item1.value}
</td></aura:iteration>
</tr>
</aura:iteration>
</tbody>
</table>
</aura:component>
Component controller JS
({
doInit : function(component, event, helper){
var action = component.get("c.getListViews");
action.setCallback(this, function(response){
var state = response.getState();
if (state === "SUCCESS") {
component.set("v.AccountListViewList",response.getReturnValue());
}
});
$A.enqueueAction(action);
},
getFilteredAccount : function (component, event, helper) {
var selected = component.find("selectedViewId").get("v.value");
var action = component.get("c.getFilteredAccounts");
action.setParams({filterId : selected});
action.setCallback(this, function(response){
var state = response.getState();
if (state === "SUCCESS") {
component.set("v.AccountList",response.getReturnValue().value);
component.set("v.fieldList",response.getReturnValue().headervalues);
}
});
$A.enqueueAction(action);
},
})
Helper classes
You can modify this code any other object you wish to implement.Create listview button with the VF page.public class DynamicTableMapping {
@AuraEnabled
public list<string> headervalues{get;set;}
@AuraEnabled
public list<ObjectValueMap> value{get;set;}
public DynamicTableMapping(list<string> headervalues,list<ObjectValueMap> value){
this.headervalues=headervalues;
this.value=value;
}
}
--- Value map class--
public class ObjectValueMap {
@AuraEnabled
public account account{get;set;}
@AuraEnabled
public list<fieldValues> values{get;set;}
public ObjectValueMap(account acc,list<fieldValues> values){
this.account=acc;
this.values=values;
}
}
-- Field values class--
public class FieldValues {
@auraenabled
public object value{get;set;}
public FieldValues(object value){
this.value=value;
}
}
