How to build a tree for the records which has self lookup?
Here I am taking a custom object called Category__c and created a self-lookup to it with the field FKParentCategory__c.
Controller:
public without sharing class categoryTreeController {
List<Category__c> parentrecord;
Map<Id, List<Category__c>> categoryMap{get;set;}
public string treeJSON{get;set;}
public string treeJSON2{get;set;}
private string whereClause;
public integer count{get;set;}
public categoryTreeController ()
{
treeJSON='[';
count=0;
whereClause='';
string pageName=ApexPages.currentPage().getParameters().get('pageName');
if(pageName=='clientPage'){
whereClause=' Display_for_end_users=true;
}else if(pageName=='' || pageName==null){
whereClause= ' AvailableForAll__c = TRUE';
}
parentrecord=Database.query('select id, name from Category__c where FKParentCategory__c=null and '+ whereClause+
' ORDER BY name');
categoryMap= getcategoryMap();
for(Category__c serviceDeskRec: parentrecord){
if(categoryMap.containsKey(serviceDeskRec.Id))
{
buildTreeJSON(serviceDeskRec, true);
}
}
treeJSON= treeJSON.substring(0, treeJSON.lastIndexOf(','));
treeJSON+=']';
}
public Map<Id, List<Category__c>> getcategoryMap()
{
Map<Id, List<Category__c>> categoryMap=new Map<Id, List<Category__c>>();
string query='select id,name, (select name, id from Categories__r where '+whereClause+' order by name) from Category__c where '+
whereClause +' order by name';
for(Category__c CategoryRec:database.query(query))
{
if( CategoryRec.Categories__r!=NULL)
count=count+CategoryRec.Categories__r.size();
categoryMap.put(CategoryRec.Id, CategoryRec.Categories__r!=null?(List<Category__c>)CategoryRec.Categories__r:NULL);
}
return categoryMap;
}
public string buildTreeJSON(Category__c record, boolean parentRec)
{
Boolean hasChild= categoryMap.get(record.id)==null?false:true;
if(parentRec)
treeJSON= treeJSON+'{"id":"'+ record.Id +'","parent":' + '"#"' + ',"text": '+'"'+record.Name+ '"},';
if(categoryMap.get(record.id)!=NULL)
{
for(Category__c cats :categoryMap.get(record.id)){
treeJSON= treeJSON+'{"id":"'+ cats.Id +'","parent":' + '"'+ record.Id+'"' + ',"text": '+'"'+cats.Name+ '"},';
buildTreeJSON(cats,false);
}
}
return treeJSON;
}
}
-----------------------------------------------------------------------------------
Visualforce Page:
<apex:page id="thePage" controller="categoryTreeController" showHeader="false">
<apex:stylesheet value="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/>
<apex:form >
<div id="jstree"></div>
</apex:form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
<script>
var j$=jQuery.noConflict();
j$(function () { j$('#jstree').jstree( {
"core":{
"data":{!treeJSON}
}
});
j$('#jstree').on('changed.jstree', function (e, data) {
var i, j;
for(i = 0, j = data.selected.length; i < j; i++) {
if(data.instance.is_parent(data.selected[i])==false)
{
stampCategoryVals(data.instance.get_node(data.selected[i]).id, data.instance.get_node(data.selected[i]).text);
}
}
})
});
function stampCategoryVals(categoryId, categoryName)
{
var winMain=window.opener;
if(null==winMain){
winMain=window.parent.opener;
}
winMain.closeCategoryLookupPopup(categoryId,categoryName);
winMain.categoryToggle();
}
</script>
</apex:page>
Here I am taking a custom object called Category__c and created a self-lookup to it with the field FKParentCategory__c.
Controller:
public without sharing class categoryTreeController {
List<Category__c> parentrecord;
Map<Id, List<Category__c>> categoryMap{get;set;}
public string treeJSON{get;set;}
public string treeJSON2{get;set;}
private string whereClause;
public integer count{get;set;}
public categoryTreeController ()
{
treeJSON='[';
count=0;
whereClause='';
string pageName=ApexPages.currentPage().getParameters().get('pageName');
if(pageName=='clientPage'){
whereClause=' Display_for_end_users=true;
}else if(pageName=='' || pageName==null){
whereClause= ' AvailableForAll__c = TRUE';
}
parentrecord=Database.query('select id, name from Category__c where FKParentCategory__c=null and '+ whereClause+
' ORDER BY name');
categoryMap= getcategoryMap();
for(Category__c serviceDeskRec: parentrecord){
if(categoryMap.containsKey(serviceDeskRec.Id))
{
buildTreeJSON(serviceDeskRec, true);
}
}
treeJSON= treeJSON.substring(0, treeJSON.lastIndexOf(','));
treeJSON+=']';
}
public Map<Id, List<Category__c>> getcategoryMap()
{
Map<Id, List<Category__c>> categoryMap=new Map<Id, List<Category__c>>();
string query='select id,name, (select name, id from Categories__r where '+whereClause+' order by name) from Category__c where '+
whereClause +' order by name';
for(Category__c CategoryRec:database.query(query))
{
if( CategoryRec.Categories__r!=NULL)
count=count+CategoryRec.Categories__r.size();
categoryMap.put(CategoryRec.Id, CategoryRec.Categories__r!=null?(List<Category__c>)CategoryRec.Categories__r:NULL);
}
return categoryMap;
}
public string buildTreeJSON(Category__c record, boolean parentRec)
{
Boolean hasChild= categoryMap.get(record.id)==null?false:true;
if(parentRec)
treeJSON= treeJSON+'{"id":"'+ record.Id +'","parent":' + '"#"' + ',"text": '+'"'+record.Name+ '"},';
if(categoryMap.get(record.id)!=NULL)
{
for(Category__c cats :categoryMap.get(record.id)){
treeJSON= treeJSON+'{"id":"'+ cats.Id +'","parent":' + '"'+ record.Id+'"' + ',"text": '+'"'+cats.Name+ '"},';
buildTreeJSON(cats,false);
}
}
return treeJSON;
}
}
-----------------------------------------------------------------------------------
Visualforce Page:
<apex:page id="thePage" controller="categoryTreeController" showHeader="false">
<apex:stylesheet value="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/>
<apex:form >
<div id="jstree"></div>
</apex:form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
<script>
var j$=jQuery.noConflict();
j$(function () { j$('#jstree').jstree( {
"core":{
"data":{!treeJSON}
}
});
j$('#jstree').on('changed.jstree', function (e, data) {
var i, j;
for(i = 0, j = data.selected.length; i < j; i++) {
if(data.instance.is_parent(data.selected[i])==false)
{
stampCategoryVals(data.instance.get_node(data.selected[i]).id, data.instance.get_node(data.selected[i]).text);
}
}
})
});
function stampCategoryVals(categoryId, categoryName)
{
var winMain=window.opener;
if(null==winMain){
winMain=window.parent.opener;
}
winMain.closeCategoryLookupPopup(categoryId,categoryName);
winMain.categoryToggle();
}
</script>
</apex:page>
Comments
Post a Comment