Imagine you’re tasked with developing a Lightning component that exhibits records for a specific object. The selection of this object is facilitated through a dynamically generated picklist when the component is integrated into the Lightning page via the App Builder.
Create DesignComponentExample.cmp
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,force:lightningQuickAction" controller="DesignQueryUtils" access="global" > <aura:attribute name="objectName" type="String" default=""/> <aura:attribute name="title" type="String" default=""/> <aura:attribute name="description" type="String" default=""/> <aura:attribute name="recordsList" type="Object" /> <aura:attribute name="columns" type="list" /> <aura:handler name="init" value="{!this}" action="{!c.loadRecords}"/> <!-- Data Table here--> <div style="height:300px"> <b>{!v.title}</b> <lightning:datatable keyField="id" data="{! v.recordsList }" columns="{! v.columns }" hideCheckboxColumn="true"/> <div> {!v.description} </div> </div> </aura:component>
Generate DesignComponentExampleController.js.
({ loadRecords : function(component, event, helper) { component.set('v.columns', [ {label: 'Name', fieldName: 'Name', type: 'text'}, ]); var objName=component.get('v.objectName'); console.log(objName); var action=component.get("c.retrieveDetails"); action.setParams({ "sObjectName":objName }); action.setCallback(this,function(response){ var records = response.getReturnValue(); console.log(records); component.set("v.recordsList",records); }); $A.enqueueAction(action); } })
Develop DesignQueryUtils.apxc.
public class DesignQueryUtils { //To fetch records dynamically @AuraEnabled public static List<sObject> retrieveDetails(String sObjectName){ List<sObject> sObjectList = new List<sObject>(); String query ='SELECT Id,Name FROM '+ sObjectName +' LIMIT 10'; system.debug('query'+query); sObjectList = Database.query(query); return sObjectList; } }
Generate CustomDynamicPicklist.apxc.
global class CustomDynamicPicklist extends VisualEditor.DynamicPickList{ // dynamic picklist creator global override VisualEditor.DataRow getDefaultValue(){ VisualEditor.DataRow defaultValue = new VisualEditor.DataRow('account', 'Account'); return defaultValue; } global override VisualEditor.DynamicPickListRows getValues() { VisualEditor.DynamicPickListRows pickList = new VisualEditor.DynamicPickListRows(); List<VisualEditor.DataRow> dataRowsList = new List<VisualEditor.DataRow>(); for(Schema.sobjectType sobjectTypeName:schema.getGlobalDescribe().values()){ VisualEditor.DataRow rowObj = new VisualEditor.DataRow(sobjectTypeName.getDescribe().getLabel(),sobjectTypeName.getDescribe().getName()); dataRowsList.add(rowObj); } pickList.addAllRows(dataRowsList); return pickList; } }
Finally, within the design resource, we incorporate the Apex class.
Generate the DesignComponentExample.design design resource.
<design:component> <design:attribute name="title" label="Enter title here"/> <design:attribute name="description" label="Enter description here"/> <design:attribute name="objectName" label="specify object name" datasource="apex://CustomDynamicPickList"/> </design:component>
The output looks like :
Dynamic picklist