1. Create a util class (FieldSetExample) which is responsible to return list of fields (label, api and type) available under field set of an object passed as parameters by a method.
public class FieldSetExample { /** * This method is responsible to return list of fields (label, api and type) avaliable * under field set of an object passed as parameters. * */ public static List<FieldSetProperties> getFieldFromFieldSet(String objApi, String fieldSetName){ List<FieldSetProperties> lstOfWrapper = new List<FieldSetProperties>(); Schema.SObjectType sObjType = Schema.getGlobalDescribe().get(objApi); Schema.DescribeSObjectResult desSObjRslt = sObjType.getDescribe(); Schema.FieldSet fieldSetIns = desSObjRslt.FieldSets.getMap().get(fieldSetName); for( Schema.FieldSetMember fieldSetMember : fieldSetIns.getFields() ){ FieldSetProperties wrapperIns = new FieldSetProperties(); wrapperIns.label = String.valueOf(fieldSetMember.getLabel()); wrapperIns.fieldName = String.valueOf(fieldSetMember.getFieldPath()); wrapperIns.type = String.valueOf(fieldSetMember.getType()).toLowerCase(); lstOfWrapper.add(wrapperIns); } return lstOfWrapper; } /** * Wrapper class to hold fieds properties like label, field api and field type. * */ public class FieldSetProperties{ @AuraEnabled public String label; @AuraEnabled public String fieldName; @AuraEnabled public String type; } }
2. Create a server side controller class (DataTableExampleController) for the lightning component (dataTableExample) used to display records using data table.
public class DataTableExampleController { @AuraEnabled public static DataTableDetails getDataTableDetails(String objApi, String fieldSetName){ DataTableDetails dataTableDtls = new DataTableDetails(); List<FieldSetExample.FieldSetProperties> lstOfFieldSetProperties = FieldSetExample.getFieldFromFieldSet(objApi, fieldSetName); if(lstOfFieldSetProperties != null && lstOfFieldSetProperties.size() > 0){ String strQuery = 'SELECT '; for(FieldSetExample.FieldSetProperties inst : lstOfFieldSetProperties){ dataTableDtls.lstOfFieldLabels.add(inst); strQuery = strQuery + inst.fieldName + ','; } if(!strQuery.equalsIgnoreCase('SELECT ')) strQuery = strQuery + 'Id FROM ' + objApi; dataTableDtls.lstOfSObjs = Database.query(strQuery); } return dataTableDtls; } public class DataTableDetails{ @AuraEnabled public List<sObject> lstOfSObjs = new List<sObject>(); @AuraEnabled public List<FieldSetExample.FieldSetProperties> lstOfFieldLabels = new List<FieldSetExample.FieldSetProperties>(); } }
3. Create the lightning component (dataTableExample.cmp).
<aura:component controller="DataTableExampleController"> <aura:attribute name="lstOfRecords" type="Object"/> <aura:attribute name="columnsHeader" type="List"/> <aura:handler name="init" value="{!this}" action="{!c.doInit}"/> <lightning:datatable data="{!v.lstOfRecords}" columns="{!v.columnsHeader}" keyField="Id" hideCheckboxColumn="true"/> </aura:component>
4. dataTableExampleController.js
({ doInit : function(component, event, helper) { helper.getDataTableRespone(component, event); } })
5. dataTableExampleHelper.js
({ getDataTableRespone : function(component, event) { var action = component.get("c.getDataTableDetails"); action.setParams({ objApi : 'YOUR OBJECT API', fieldSetName : 'YOUR FIELD SET NAME' }); action.setCallback(this, function(response){ var state = response.getState(); if(state === 'SUCCESS'){ //console.log('::::::::::::: SUCCESS :::::::::::::'+JSON.stringify(response.getReturnValue().lstOfFieldLabels)); component.set("v.columnsHeader", response.getReturnValue().lstOfFieldLabels); component.set("v.lstOfRecords", response.getReturnValue().lstOfSObjs); }else if (state === 'ERROR'){ console.log('::::::::::::: ERROR :::::::::::::'); } }); $A.enqueueAction(action); } })
6. Call the above component from an application (dataTableExampleApp.app)
<aura:application extends="force:slds"> <c:dataTableExample /> </aura:application>