Multi-tier dependent picklist sfdc lightning
// **********************************************************************************************************************************
// ********** GetDependentOptions ***************************************************************************************************
// **********************************************************************************************************************************
// Map> GetDependentOptions (String pObjName, String pControllingFieldName, String pDependentFieldName)
// Returns: Map of "pControllingFieldName" picklist values and their corresponding "pDependentFieldName" dependent option values.
// **********************************************************************************************************************************
// Converts a base64 string into a list of integers representing the encoded bytes
public static List B64ToBytes (String sIn) {
Map base64 = new Map{65=>0,66=>1,67=>2,68=>3,69=>4,70=>5,71=>6,72=>7,73=>8,74=>9,75=>10,76=>11,77=>12,78=>13,79=>14,80=>15,81=>16,82=>17,83=>18,84=>19,85=>20,86=>21,87=>22,88=>23,89=>24,90=>25
,97=>26,98=>27,99=>28,100=>29,101=>30,102=>31,103=>32,104=>33,105=>34,106=>35,107=>36,108=>37,109=>38,110=>39,111=>40,112=>41,113=>42,114=>43,115=>44,116=>45,117=>46,118=>47,119=>48,120=>49,121=>50,122=>51
,48=>52,49=>53,50=>54,51=>55,52=>56,53=>57,54=>58,55=>59,56=>60,57=>61,43=>62,47=>63};
List lstOut = new List();
if ( sIn == null || sIn == '' ) return lstOut;
sIn += '='.repeat( 4 - Math.mod( sIn.length(), 4) );
for ( Integer idx=0; idx >> 4) );
if ( base64.get(sIn.charAt(idx+2)) != null ) lstOut.add( ((base64.get(sIn.charAt(idx+1)) & 15)>> 2) );
if ( base64.get(sIn.charAt(idx+3)) != null ) lstOut.add( ((base64.get(sIn.charAt(idx+2)) & 3) BlobToBytes (Blob input) {
return B64ToBytes( EncodingUtil.base64Encode(input) );
}//BlobToBytes
// Converts a base64 string into a list of integers indicating at which position the bits are on
public static List cnvBits (String b64Str) {
List lstOut = new List();
if ( b64Str == null || b64Str == '' ) return lstOut;
List lstBytes = B64ToBytes(b64Str);
Integer i, b, v;
for ( i = 0; i > GetDependentOptions(String pObjName, String pControllingFieldName, String pDependentFieldName) {
Map> mapResults = new Map>();
//verify/get object schema
Schema.SObjectType pType = Schema.getGlobalDescribe().get(pObjName);
if ( pType == null ) return mapResults;
Map objFieldMap = pType.getDescribe().fields.getMap();
//verify field names
if (!objFieldMap.containsKey(pControllingFieldName) || !objFieldMap.containsKey(pDependentFieldName)) return mapResults;
//get the control & dependent values
List ctrl_ple = objFieldMap.get(pControllingFieldName).getDescribe().getPicklistValues();
List dep_ple = objFieldMap.get(pDependentFieldName).getDescribe().getPicklistValues();
//clear heap
objFieldMap = null;
//initialize results mapping
for(Integer pControllingIndex=0; pControllingIndex());
}
//cater for null and empty
mapResults.put('', new List());
mapResults.put(null, new List());
//serialize dep entries
List objDS_Entries = new List();
objDS_Entries = (List)JSON.deserialize(JSON.serialize(dep_ple), List.class);
List validIndexes;
for (Globals.TPicklistEntry objDepPLE : objDS_Entries){
validIndexes = cnvBits(objDepPLE.validFor);
//System.Debug('cnvBits: [' + objDepPLE.label + '] = ' + validIndexes);
for (Integer validIndex : validIndexes){
mapResults.get( ctrl_ple[validIndex-1].getLabel() ).add( objDepPLE.label );
}
}
//clear heap
objDS_Entries = null;
return mapResults;
}//GetDependentOptions
dependent(values) picklist value as a map." />
{!v.body}
({ doInit: function(component, event, helper) { //call the helper function with pass [component, Controller field and Dependent Field] Api name helper.getFields(component, helper); var fieldsAPI = component.get("v.fieldsAPI"); var fieldsLabel = component.get("v.fieldsLabel"); var dependentFieldMap = component.get("v.dependentFieldMap"); var style = component.get("v.style"); var fieldsAPI = component.get("v.fieldsAPI"); // Array of components to create var newComponents = []; for (var i = 0; i >> "+ style); $A.createComponents( newComponents, function(components, status, errorMessage){ if (status === "SUCCESS") { var pageBody = component.get("v.body"); for (var i = 0; i ({ getFields: function(component, helper) { var action = component.get("c.getFieldList"); action.setParams({ 'fieldApiNames': component.get("v.fieldsAPI"), 'fieldLabels': component.get("v.fieldsLabel") }); action.setCallback(this, function(response) { if (response.getState() == "SUCCESS") { component.set("v.fields", response.getReturnValue()); var fields = component.get("v.fields"); helper.fetchPicklistValues(component, fields); } }); $A.enqueueAction(action); }, fetchPicklistValues: function(component, fields) { // call the server side function var objApiNameList = []; var controllingfields = []; var dependentfields = []; for(var i = 0; i >) var StoreResponse = response.getReturnValue(); // once set #StoreResponse to dependentFieldMap attribute var Map = component.get("v.dependentFieldMap"); if(Map == undefined) { component.set("v.dependentFieldMap", StoreResponse); } else if(Map != null && Map.length which is controller picklist values) var listOfkeys = []; // for store all map keys (controller picklist values) var ControllerField = []; // for store controller picklist value to set on ui field. // play a for loop on Return map // and fill the all map key on listOfkeys variable.
for (var controllingfieldname in StoreResponse) { for (var singlekey in StoreResponse[controllingfieldname]) { if(controllingfieldname==controllingfields[0].toLowerCase()) { listOfkeys.push(singlekey); } } }
//set the controller field value for ui:inputSelect if (listOfkeys != undefined && listOfkeys.length > 0) { ControllerField.push({ class: "optionClass", label: "--- None ---", value: "--- None ---" }); }
for (var i = 0; i 0) { dependentFields.push({ class: "optionClass", label: "--- None ---", value: "--- None ---" }); } if (ListOfDependentFields != undefined) { for (var i = 0; i
public class BitSet {
public Map alphaNumCharCodes {get;set;} public Map base64CharCodes {get;set;}
public BitSet() { LoadCharCodes(); }
//Method loads the character codes for all letters public void LoadCharCodes() { AlphaNumCharCodes = new Map{ 'A'=>65,'B'=>66,'C'=>67,'D'=>68,'E'=>69,'F'=>70,'G'=>71,'H'=>72,'I'=>73,'J'=>74, 'K'=>75,'L'=>76,'M'=>77,'N'=>78,'O'=>79,'P'=>80,'Q'=>81,'R'=>82,'S'=>83,'T'=>84, 'U'=>85,'V'=> 86,'W'=>87,'X'=>88,'Y'=>89,'Z'=>90 }; Base64CharCodes = new Map(); //lower case Set pUpperCase = AlphaNumCharCodes.keySet(); for(String pKey : pUpperCase){ //the difference between upper case and lower case is 32 AlphaNumCharCodes.put(pKey.toLowerCase(),AlphaNumCharCodes.get(pKey)+32); //Base 64 alpha starts from 0 (The ascii charcodes started from 65) Base64CharCodes.put(pKey,AlphaNumCharCodes.get(pKey) - 65); Base64CharCodes.put(pKey.toLowerCase(),AlphaNumCharCodes.get(pKey) - (65) + 26); } //numerics for (Integer i=0; i testBits(String pValidFor,List nList){ List results = new List(); List pBytes = new List(); Integer bytesBeingUsed = (pValidFor.length() * 6)/8; Integer pFullValue = 0; if (bytesBeingUsed > bytesBeingUsed); shiftBits = (targetOctet * 8) + bit; tBitVal = ((Integer)(2 > shiftBits; if (tBitVal==1) results.add(n); } return results; }
/* public List testBits(String pValidFor, List nList) { List results = new List(); List pBytes = new List(); Integer bytesBeingUsed = (pValidFor.length() * 6) / 8; Integer pFullValue = 0; if(bytesBeingUsed > bytesBeingUsed); shiftBits = (targetOctet * 8) + bit; tBitVal = ((Integer)(2 > shiftBits; if(tBitVal == 1) { results.add(n); } } System.Debug('>>>>>>>> '+pValidFor+' ------ '+results); return results; } */
// Converts a base64 string into a list of integers representing the encoded bytes public Static List B64ToBytes (String sIn) { Map base64 = new Map{65=>0,66=>1,67=>2,68=>3,69=>4,70=>5,71=>6,72=>7,73=>8,74=>9,75=>10,76=>11,77=>12,78=>13,79=>14,80=>15,81=>16,82=>17,83=>18,84=>19,85=>20,86=>21,87=>22,88=>23,89=>24,90=>25 ,97=>26,98=>27,99=>28,100=>29,101=>30,102=>31,103=>32,104=>33,105=>34,106=>35,107=>36,108=>37,109=>38,110=>39,111=>40,112=>41,113=>42,114=>43,115=>44,116=>45,117=>46,118=>47,119=>48,120=>49,121=>50,122=>51 ,48=>52,49=>53,50=>54,51=>55,52=>56,53=>57,54=>58,55=>59,56=>60,57=>61,43=>62,47=>63};
List lstOut = new List(); if ( sIn == null || sIn == '' ) return lstOut;
sIn += '='.repeat( 4 - Math.mod( sIn.length(), 4) );
for ( Integer idx=0; idx >> 4) ); if ( base64.get(sIn.charAt(idx+2)) != null ) lstOut.add( ((base64.get(sIn.charAt(idx+1)) & 15)>> 2) ); if ( base64.get(sIn.charAt(idx+3)) != null ) lstOut.add( ((base64.get(sIn.charAt(idx+2)) & 3) BlobToBytes (Blob input) { return B64ToBytes( EncodingUtil.base64Encode(input) ); }//BlobToBytes
// Converts a base64 string into a list of integers indicating at which position the bits are on public List cnvBits (String b64Str) { List lstOut = new List(); if ( b64Str == null || b64Str == '' ) return lstOut;
List lstBytes = B64ToBytes(b64Str);
Integer i, b, v; for ( i = 0; i
Apex Class Source
Component Name PicklistFieldController Change Set Name case
API Name PicklistFieldController Change Set Status Closed
Type Apex Class Uploaded On 5/14/2018 5:19 PM


Source


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 public class PicklistFieldController {
@AuraEnabled public static Map>> getDependentOptionsMulti(List objApiNameList, List contrfieldApiNameList, List depfieldApiNameList) { integer i = 0; system.debug('Starting getDependentOptionsMulti'); Map>> MasterobjResults = new Map>>(); Map> parentMapForMultiDependency = new Map> (); for(i = 0; i = i && depfieldApiNameList[i] != null) { dependentField = depfieldApiNameList[i].toLowerCase(); }
//get the String to sobject global map Map> objResults = new Map>(); Map objGlobalMap = Schema.getGlobalDescribe(); if(!Schema.getGlobalDescribe().containsKey(objectName)) { System.debug('OBJNAME NOT FOUND --.> ' + objectName); return null; } Schema.SObjectType objType = Schema.getGlobalDescribe().get(objectName); if(objType == null) { return MasterobjResults;//return objResults; } Bitset bitSetObj = new Bitset(); Map objFieldMap = objType.getDescribe().fields.getMap(); //Check if picklist values exist if(!objFieldMap.containsKey(controllingField) || !objFieldMap.containsKey(dependentField)) { System.debug('FIELD NOT FOUND --.> ' + controllingField + ' OR ' + dependentField); return MasterobjResults;//return objResults; } List contrEntries = objFieldMap.get(controllingField).getDescribe().getPicklistValues(); List depEntries = objFieldMap.get(dependentField).getDescribe().getPicklistValues(); objFieldMap = null; List controllingIndexes = new List(); for(Integer contrIndex = 0; contrIndex ()); controllingIndexes.add(contrIndex); //need to add if logic for multi-level dependent picklists } List objEntries = new List(); List objJsonEntries = new List(); for(Integer dependentIndex = 0; dependentIndex )JSON.deserialize(JSON.serialize(objEntries), List.class); List indexes = new list(); parentMapForMultiDependency = null; //reset to recalculate for(PicklistEntryWrapper objJson : objJsonEntries) { if(objJson.validFor == null || objJson.validFor == '') { continue; } try { //indexes = bitSetObj.testBits(objJson.validFor,controllingIndexes); indexes = bitSetObj.cnvBits(objJson.validFor); system.debug('success. objJson: ' + objJson + ', objJson.validFor: ' + objJson.validFor + ', controllingIndexes: ' + controllingIndexes + ',indexes: '+indexes); /* for(integer index : indexes) { if(parentMapForMultiDependency.containskey(index)) { parentMapForMultiDependency.get(index).add(objJson.label); } else { parentMapForMultiDependency.put(index,new set{objJson.label}); } } */ } catch(Exception ex) { system.debug('error with: ' + objJson + ' and ' + objJson.validFor + ' and ' + controllingIndexes + ', ex.getMessage(): ' +ex.getMessage()); } for(Integer idx : indexes) { String contrLabel = contrEntries[idx-1].getLabel(); objResults.get(contrLabel).add(objJson.label); } } bitSetObj = null; objEntries = null; objJsonEntries = null; system.debug('objResults--->' + objResults); MasterobjResults.put(controllingField,objResults); //return objResults; }
return MasterobjResults; }
@AuraEnabled public static Map> getDependentOptionsImpl(String objApiName, String contrfieldApiName, String depfieldApiName) { system.debug('getDependentOptionsImpl'); system.debug(objApiName + '##' + contrfieldApiName + '###' + depfieldApiName); String objectName = objApiName.toLowerCase(); String controllingField = contrfieldApiName.toLowerCase(); String dependentField; if(depfieldApiName != null) { dependentField = depfieldApiName.toLowerCase(); } Map> objResults = new Map>(); //get the String to sobject global map Map objGlobalMap = Schema.getGlobalDescribe(); if(!Schema.getGlobalDescribe().containsKey(objectName)) { System.debug('OBJNAME NOT FOUND --.> ' + objectName); return null; } Schema.SObjectType objType = Schema.getGlobalDescribe().get(objectName); if(objType == null) { return objResults; } Bitset bitSetObj = new Bitset(); Map objFieldMap = objType.getDescribe().fields.getMap(); //Check if picklist values exist if(!objFieldMap.containsKey(controllingField) || !objFieldMap.containsKey(dependentField)) { System.debug('FIELD NOT FOUND --.> ' + controllingField + ' OR ' + dependentField); return objResults; } List contrEntries = objFieldMap.get(controllingField).getDescribe().getPicklistValues(); List depEntries = objFieldMap.get(dependentField).getDescribe().getPicklistValues(); objFieldMap = null; List controllingIndexes = new List(); for(Integer contrIndex = 0; contrIndex ()); controllingIndexes.add(contrIndex); } List objEntries = new List(); List objJsonEntries = new List(); for(Integer dependentIndex = 0; dependentIndex )JSON.deserialize(JSON.serialize(objEntries), List.class); List indexes; for(PicklistEntryWrapper objJson : objJsonEntries) { if(objJson.validFor == null || objJson.validFor == '') { continue; } try { //indexes = bitSetObj.testBits(objJson.validFor,controllingIndexes); indexes= bitSetObj.cnvBits(objJson.validFor); //system.debug('success with: ' + objJson + ' and ' + objJson.validFor + ' and ' + controllingIndexes); } catch(Exception ex) { system.debug('error with: ' + objJson + ' and ' + objJson.validFor + ' and ' + controllingIndexes); } for(Integer idx : indexes) { String contrLabel = contrEntries[idx-1].getLabel(); //String contrLabel = contrEntries[idx].getLabel(); //old bit formula objResults.get(contrLabel).add(objJson.label); } } objEntries = null; objJsonEntries = null; system.debug('objResults--->' + objResults); return objResults; }
@AuraEnabled public static List getFieldList(String[] fieldApiNames, String[] fieldLabels) { List fields = new List(); Integer cnt = 0; for(String str : fieldLabels) { if(cnt+1