Aug 30, 2016

Dynamic nth Level Hierarchy in Salesforce

This blog is somewhat related to my previous post but with bit easy implementation and more generic. We have encountered this implementation multiple time so thought of sharing it with all.

Ever thought of replicating this feature in any of your custom object?


Now the only complication is, in case of self lookup you don't know the end node and where your loop should stop (to think about the logic). So hope I will make it easy for you.

*Note : My blog code formatter is not working properly, so please check the spaces before using the code.

Step 1 : Create an apex class called HierarchyController, as shown below and save it.

public with sharing class DynamicHierarchyForBlogController 
{
 public String objectApiName {get;set;}
 public String fieldApiName {get;set;}
 public String nameField {get;set;}
 public String currentsObjectId {get;set;}
 public String topParentId {get;set;}
 public String jsonMapsObjectString {get;set;}
 private String jsonString;
 private Map> sObjectIdMap ;
 private Map selectedsObjectMap ;
 private Map allsObjectMap;

 public DynamicHierarchyForBlogController() 
 {
  currentsObjectId = Apexpages.currentPage().getParameters().get('id');
     sObjectIdMap = new Map>();
  selectedsObjectMap = new Map();
  allsObjectMap = new Map();
 }
 
 public String getjsonMapString()
 {
  retrieveInfo();
  return jsonString;
 }
 
 public void retrieveInfo()
 {
  String dynamicQuery = 'SELECT ID ,' + fieldApiName + ' , ' + nameField + ' FROM ' + objectApiName + ' ORDER BY ' + fieldApiName + '  LIMIT 50000';
  for(sObject obj: Database.query(dynamicQuery))
  {
   allsObjectMap.put(obj.id,obj);
  }

  if(currentsObjectId != null)
  {
   String dQuery = 'SELECT ID FROM ' + objectApiName + ' WHERE id =\'' + currentsObjectId +'\'';
   List objList = Database.query(dQuery);
   currentsObjectId = objList[0].Id;
   retrieveTopParent(currentsObjectId);
   retrieveAllChildRecords(new Set{topParentId});
   for(String str : sObjectIdMap.keySet())
   {
    selectedsObjectMap.put(str,allsObjectMap.get(str));
   }
   jsonString = JSON.serialize(sObjectIdMap);
   jsonMapsObjectString = JSON.serialize(selectedsObjectMap);
  }
 }

 public void retrieveTopParent(String sObjectId)
 {
  if(allsObjectMap.keySet().contains(sObjectId) && allsObjectMap.get(sObjectId).get(fieldApiName) != null)
  {
   topParentId = String.valueOf(allsObjectMap.get(sObjectId).get(fieldApiName));
   retrieveTopParent(topParentId);
  }
 }

 public void retrieveAllChildRecords(Set sObjectIdSet)
 {
  if(sObjectIdSet.size() > 0)
  { 
   Set allChildsIdSet = new Set();
   for(String str : sObjectIdSet)
   {
    Set childsObjectIdSet = new Set();
    for(sObject obj : allsObjectMap.values())
    {
     if(obj.get(fieldApiName) != null && String.valueOf(obj.get(fieldApiName)) == str)
     {
      childsObjectIdSet.add(obj.Id);
      allChildsIdSet.add(obj.Id);
     }
    }
    sObjectIdMap.put(str,childsObjectIdSet);
   }
   retrieveAllChildRecords(allChildsIdSet);
  }
 }
}

Step 2 : Now create a component called Hierarchy, as shown below and save it.

<apex:component controller="DynamicHierarchyForBlogController">
 
 <apex:attribute name="objectName" description="Name of Object." type="String" required="true" assignTo="{!objectApiName}"/>
 <apex:attribute name="FieldName" description="Name of the field of the object." type="String" required="true" assignTo="{!fieldApiName}"/>
 <apex:attribute name="RepersenterField" description="Name field of the object." type="String" required="true" assignTo="{!nameField}"/>
 <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
 
 <div id="parentDiv"></div>
 
    <style>
     #parentDiv ul:first-child
     {
      padding: 0;
     }
     #parentDiv li
     {
      list-style: none;
      padding: 10px 5px 0 5px;
      position: relative;
     }
  #parentDiv li span 
  {
      -moz-border-radius: 5px;
      -webkit-border-radius: 5px;
      /*border: 1px solid #999;*/
      border-radius: 5px;
      display: inline-block;
      padding: 3px 8px;
      cursor: pointer;
  }
  .selectedRecord
  {
   font-weight:bold; 
   color:blue;
  }
    </style>
    <script>
      var accountMap = JSON.parse('{!jsonMapString}');
      var accountValueMap = JSON.parse('{!jsonMapsobjectString}');
      var cClass = '';
  if("{!topParentId}".indexOf('{!$CurrentPage.parameters.id}') != -1)
   cClass = 'selectedRecord';
  var ul = '<ul><li id="{!topParentId}"  ><span class="' + cClass + '"  onclick="toggleChilds(\'' + '{!topParentId}' + '\',event)" ><b id="i{!topParentId}" class="minus" style="font-size: 1.5em;" >-</b>&nbsp;' +  accountValueMap['{!topParentId}'].{!RepersenterField} + '</span></li></ul>'  ;
  $(ul).appendTo("#parentDiv");
  appendUl('{!topParentId}','{!topParentId}');
      function appendUl(key)
      {
       $.each( accountMap[key], function( index, value ) 
       {
      var dclass = '';
      if(value.indexOf('{!$CurrentPage.parameters.id}') != -1)
       dclass = 'selectedRecord';
      var ul = '<ul class="' + key + '"><li id="' + value + '" ><span class="' + dclass + '" onclick="toggleChilds(\'' + value + '\',event)" ><b id="i' + value + '" class="minus" style="font-size: 1.5em;" >-</b>&nbsp;' + accountValueMap[value].{!RepersenterField} + "</span></li></ul>"  ;
      $(ul).appendTo("#" + key);
      if(value)
       appendUl(value);
   });
      }
      function toggleChilds(key,event)
      {
       $('.'+key).toggle('slow');
       $('#i'+key).toggleClass('minus');
       $('#i'+key).toggleClass('plus');
       if($('#i'+key).hasClass("minus")) 
        $('#i'+key).html("-");
         if($('#i'+key).hasClass("plus")) 
             $('#i'+key).html("+");
       event.stopPropagation();
      }
    </script>
</apex:component>

Step 3 : Now create a visualforce page, as shown below.

<apex:page standardcontroller="Account" showHeader="true" sidebar="true">
 <apex:pageblock title="Hierarchy">
  <c:DynamicHierarchyForBlog objectName="Account" FieldName="ParentId" RepersenterField="Name"/>
 </apex:pageblock>
</apex:page>
Open the page in the browser and pass a valid account id and the output will be a collapsible hierarchy as shown below.



This can plot the hierarchy of nth level and of any object. Post as comment if you have any questions.

Happy Coding!!

64 comments:

  1. Replies
    1. IEEE Final Year projects Project Centers in India are consistently sought after. Final Year Students Projects take a shot at them to improve their aptitudes, while specialists like the enjoyment in interfering with innovation. For experts, it's an alternate ball game through and through. Smaller than expected IEEE Final Year project centers ground for all fragments of CSE & IT engineers hoping to assemble. Final Year Projects for CSE It gives you tips and rules that is progressively critical to consider while choosing any final year project point.

      JavaScript Online Training in India

      JavaScript Training in India

      The Angular Training covers a wide range of topics including Components, Angular Directives, Angular Services, Pipes, security fundamentals, Routing, and Angular programmability. The new Angular TRaining will lay the foundation you need to specialise in Single Page Application developer. Angular Training

      Delete
  2. Very informative blog and very useful article thank you for sharing with us , keep posting learn more about salesforce training,salesforce online training

    ReplyDelete
  3. This is very informative blog and useful article thank you for sharing with us keep posting more details aboutsalesforce training in bangalore,salesforce online training

    ReplyDelete
  4. This is very informative blog and nice article , I really like your technique of writing a blog. I book marked it to my bookmark site list and will be checking back in the near future.Salesforce training, salesforce online training

    ReplyDelete
  5. Nice information about dynamic nth Level hierarchy My sincere thanks for sharing this post and please continue to share this kind of post
    Salesfoce Training in Chennai

    ReplyDelete
  6. Thanks for sharing this. This is really a very informative blog. Nice information regarding salesforce implementation services .This is very helpful for those who want to become a saleforce developer. Keep Posting.

    ReplyDelete
  7. Nice blog..! I really loved reading through this article... Thanks for sharing such an amazing post with us and keep blogging...
    ios app development course
    iphone app training course in bangalore

    ReplyDelete
  8. Nice blog..! I really loved reading through this article... Thanks for sharing such an amazing post with us and keep blogging...
    sap consulting services in usa

    ReplyDelete
  9. Are you looking for Best Cloud Computing training in Delhi. DIAC offering best online Salesforce training , CRM training, Salesforce Lightning - Admin developer training. Free Demo Class. Call now 9310096831.

    ReplyDelete
  10. Are you looking for Best Cloud Computing training in Delhi. DIAC offering best online Salesforce training , CRM training, Salesforce Lightning - Admin developer training. Free Demo Class. Call now 9310096831.

    ReplyDelete
  11. I really enjoy the blog.Much thanks again. Really Great salesforce Online course

    ReplyDelete

  12. Awesome blog. It was very informative. I would like to appreciate you. Keep updated like this best sap simple finance online training institute in hyderabad

    ReplyDelete
  13. myTectra Placement Portal is a Web based portal brings Potentials Employers and myTectra Candidates on a common platform for placement assistance

    ReplyDelete
  14. Hey Nice Blog!! Thanks For Sharing!!!Wonderful blog & good post.Its really helpful for me, waiting for a more new post. Keep Blogging!
    advanced java training in coimbatore
    best java training in coimbatore

    ReplyDelete
  15. All the latest updates from the PythonAutomationminds team. Python Automationminds lets you program in Python, in your browser. No need to install any software, just start coding straight away. There's a fully-functional web-based console and a programmer's text-editor
    Phyton training in Chennai

    ReplyDelete
  16. Nice article i was really impressed by seeing this article, it was very interesting and it is very useful for me.

    dgreatwallofchina
    Article submission sites

    ReplyDelete
  17. Having an assignment due tomorrow and understand you can’t do it yourself? But you’re afraid of delegating your paper to some scam services as well? Why not check https://scamfighter.net/review/essayedge.com right now?

    ReplyDelete
  18. Very nice your post and tips sharing thanks forceguru
    http://www.seotraininginchennai.co.in/Seotrainginchennai

    ReplyDelete
  19. Very nice your post and tips sharing thanks forceguru
    SEO Training in Chennai

    ReplyDelete
  20. Good blog informative
    Sanjary Academy provides excellent training for Piping design course. Best Piping Design Training Institute in Hyderabad, Telangana. We have offer professional Engineering Course like Piping Design Course,QA / QC Course,document Controller course,pressure Vessel Design Course, Welding Inspector Course, Quality Management Course, #Safety officer course.
    Piping Design Course in India­

    ReplyDelete
  21. This is an extremely abundant benefit for everyone ... thank you for providing such valuable varieties of data. I am currently a daily reader of your blogs. thank you the most for the fantastic assortment, keep writing.

    DedicatedHosting4u.com

    ReplyDelete
  22. Nice Post
    Sanjary kids is the best playschool, preschool in Hyderabad, India. Start your play school,preschool in Hyderabad with sanjary kids. Sanjary kids provides programs like Play group,Nursery,Junior KG,Serior KG,and Teacher Training Program.
    play school in hyderabad, India
    Preschool in hyderabad, India
    Preschool teacher training course in hyderabad, India
    pre and primary teacher training course in hyderabad,India
    early childhood teacher training course in hyderabad, India

    ReplyDelete
  23. Good Information
    "Yaaron media is one of the rapidly growing digital marketing company in Hyderabad,india.Grow your business or brand name with best online, digital marketing companies in ameerpet, Hyderabad. Our Services digitalmarketing, SEO, SEM, SMO, SMM, e-mail marketing, webdesigning & development, mobile appilcation.
    "
    Best web designing companies in Hyderabad
    Best web designing & development companies in Hyderabad
    Best web development companies in Hyderabad

    ReplyDelete
  24. Thank you for sharing .The data that you provided in the blog is informative and effective.salesforce admin training in bangalore

    ReplyDelete
  25. This is most informative and also this post most user friendly and super navigation to all posts. Thank you so much for giving this information to me.salesforce developer training in bangalore



    ReplyDelete
  26. If you are stuck with your Management assignment then in this case you can opt for our Management Assignment. we provide the bestOnline home work.We also provideLeadership Assignment Help for students across the globe. for more information contact us +16692714848.

    ReplyDelete
  27. The blog was absolutely fantastic! Lot of great information which can be helpful in some or the other way. Keep updating the blog, looking forward for more contents. 123movies

    ReplyDelete




  28. Thanks for provide great informatic and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you once agian


    birth certificate in ghaziabad

    birth certificate in delhi

    birth certificate in gurgaon

    birth certificate in bangalore


    birth certificate correction

    birth certificate online

    birth certificate in noida

    birth certificate in india

    birth certificate apply online

    ReplyDelete
  29. Hi, please share the apex class code again.. i am getting errors.

    ReplyDelete
  30. I read this post your post so nice and very informative post thanks for sharing this post
    Study app for e learning

    ReplyDelete
  31. Thanks for sharing such amazing content which is very helpful for us. Please keep sharing like this. Also check for Introduction to Salesforce or many more.

    ReplyDelete
  32. Very useful article for a java programming assignment help services, they can easily enhance their skills in coding and hacking with this kind of information.

    ReplyDelete
  33. This post is so interactive and informative.keep updating more information...
    Java Certificate
    Java Learning Course

    ReplyDelete
  34. Great blog!!! The information was more useful for us... Thanks for sharing with us...
    Python Training in Chennai
    Python Online Training
    Python Training in Coimbatore

    ReplyDelete
  35. More impressive blog!!! Thanks for shared with us.... waiting for you upcoming data.
    Why software testing is important
    Why testing is important

    ReplyDelete

  36. This blog contains lot of information about the topic, thanks for this blog.
    Components of Spreadsheet
    In excel function

    ReplyDelete
  37. Are you worried for timely completion of your assignment? Are you unable to do your assignment perfectly so that you can show excellent performance ? If so, please take advantages of our cheap and best assignment writing services.
    We are no 1 assignment writing service provider in the world and especially in Australia. Please connect with us: Phone: +61-2 9191 7405, E-mail: sales@no1assignmenthelp.com, Website: assignment help, Office: 25 Robert St, Melbourne VIC 3207, Australia

    ReplyDelete
  38. Come up with a great learning experience ofAzure Training in Chennai, from Infycle Technologies, the best software training institute in Chennai. Get up with other technical courses like Data Science, Selenium Automation Testing, Mobile App Development, Cyber Security, Big Data, Full Stack Development with a great learning experience and outstanding placements in top IT firms. For best offers with learning, reach us on +91-7504633633, +91-7502633633

    ReplyDelete

  39. Thank you, This was the best and most interesting course. please continue to share your thoughts.

    RPA Training in Chennai
    RPA Training Online
    RPA Training In Bangalore

    ReplyDelete
  40. Europe Biodiesel Market Report and Forecast 2022-2027’, gives an in-depth analysis of the Europe Biodiesel Market, assessing the market based on its segments like feedstocks, types, technologies, applications, and major regions. The report tracks the latest trends in the industry and studies their impact on the overall market. It also assesses the market dynamics, covering the key demand and price indicators, along with analyzing the market based on the SWOT and Porter’s Five Forces models. The limited supply can be associated with factors like the advent of COVID-19 pandemic, which led to disruptions in supply chain and hampered imports and exports. Furthermore, Argentina is considered as one of the major suppliers of soybean in Europe but due to changes in production and consumption patterns of soybean, the market witnessed a decline.



    If you wish to see more reports check here: Asia Pacific Vaccine Market, Micro Inverter Market, Albumin Market, Middle East and Africa Cybersecurity Market, Rice Seeds Market, Vegetable Concentrates Market, Learning Management System Market, States Flooring Market, Sports and Energy Drinks Market, Brazil Healthcare, Sterilisation Services Market, Media Monitoring Tools Market

    ReplyDelete
  41. Do you want to know about Matthew Patrick Net Worth, early life, biography, age, and relationship status?

    ReplyDelete
  42. You have really stickiest my fancy after surfing your useful content and I have come to the conclusion that you are a professional. I love your post and same time love your kind publication. Thank you so much for sharing. maryam abacha american university form out

    ReplyDelete