Retrieve dependent picklists values

PHOTO EMBED

Mon Feb 10 2025 13:05:55 GMT+0000 (Coordinated Universal Time)

Saved by @macie3k #apex #salesforce

public with sharing class DependentPicklistController {

    public static Map<String, DependentPicklistWrapper> getDependentPicklistValuesFiltered(String dependentField, List<String> keys) {
        Map<String, DependentPicklistWrapper> dependentPicklistValues = getDependentPicklistValues(dependentField);

        for (String currentKey : dependentPicklistValues.keySet()) {
            if (!keys.contains(currentKey)) {
                dependentPicklistValues.remove(currentKey);
            }
        }

        return dependentPicklistValues;
    }

    public static Map<String, DependentPicklistWrapper> getDependentPicklistValues(String dependentPickListField) {
        List<String> splitString = dependentPickListField.split('\\.');
        Schema.SobjectField dependentField = Schema.getGlobalDescribe().get(splitString[0]).getDescribe().fields.getMap().get(splitString[1]);
        Map<String, DependentPicklistWrapper> dependentPicklistValues = new Map<String, DependentPicklistWrapper>();
        Schema.DescribeFieldResult dependentFieldResult = dependentField.getDescribe();
        Schema.sObjectField controllerField = dependentFieldResult.getController();

        Schema.DescribeFieldResult controllerFieldResult = controllerField.getDescribe();
        List<Schema.PicklistEntry> controllerValues = (controllerFieldResult.getType() == Schema.DisplayType.Boolean ? null : controllerFieldResult.getPicklistValues());

        String base64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

        for (Schema.PicklistEntry entry : dependentFieldResult.getPicklistValues()) {
            if (entry.isActive() && String.isNotEmpty(String.valueOf(((Map<String, Object>) JSON.deserializeUntyped(JSON.serialize(entry))).get('validFor')))) {
                List<String> base64chars = String.valueOf(((Map<String, Object>) JSON.deserializeUntyped(JSON.serialize(entry))).get('validFor')).split('');
                for (Integer i = 0; i < (controllerValues != null ? controllerValues.size() : 2); i++) {
                    Schema.PicklistEntry controllerValue = (Schema.PicklistEntry) (controllerValues == null
                        ? (Object) (i == 1)
                        : (Object) (controllerValues[i].isActive() ? controllerValues[i] : null));

                    Integer bitIndex = i / 6;
                    if (bitIndex > base64chars.size() - 1) {
                        break;
                    }
                    Integer bitShift = 5 - Math.mod(i, 6);
                    if (controllerValue == null || (base64map.indexOf(base64chars[bitIndex]) & (1 << bitShift)) == 0) {
                        continue;
                    }
                    String apiName = controllerValue.getValue();
                    if (!dependentPicklistValues.containsKey(apiName)) {
                        dependentPicklistValues.put(apiName, new DependentPicklistWrapper(new LabelValueWrapper(controllerValue.getLabel(), apiName)));
                    }
                    dependentPicklistValues.get(apiName).addPicklistEntry(new LabelValueWrapper(entry.getLabel(), entry.getValue()));
                }
            }
        }
        return dependentPicklistValues;
    }

    public class LabelValueWrapper {
        @AuraEnabled
        public String label { get; set; }
        @AuraEnabled
        public String value { get; set; }

        public LabelValueWrapper(String label, String value) {
            this.label = label;
            this.value = value;
        }
    }

    public class DependentPicklistWrapper {
        @AuraEnabled
        public List<LabelValueWrapper> dependentPicklist;
        @AuraEnabled
        public LabelValueWrapper entry;

        public DependentPicklistWrapper(LabelValueWrapper entry) {
            this.dependentPicklist = new List<LabelValueWrapper>();
            this.entry = entry;
        }

        public void addPicklistEntry(LabelValueWrapper picklistEntry) {
            this.dependentPicklist.add(picklistEntry);
        }
    }
}
content_copyCOPY