<ul class="flowchart">
<li>*collapse*Element 01 (level 01)</li>
<ul>
<li>Child 01 of Element 01 (level 02)</li>
</ul>
<li>Element 02 (level 01)</li>
<ul>
<li>Child 01 of Element 02 (level 02)</li>
<ul>
<li>Child of Element 02 (level 03)</li>
<ul>
<li>Child of Element 02 (level 04)</li>
</ul>
</ul>
<li>Child 02 of Element 02 (level 02)</li>
</ul>
<li>Element 03 (level 01)</li>
</ul>
html, body {}

.flowchart{width: 500px;margin:0 auto 15px;}
.flowchart .longer{
/* 	border-left:1px solid #C5C5C5; */
	padding-left: 15%;
	margin-left: -15px /*!important*/;
	display:none;
}
.flowchart .short{
	padding-left: 15%;
	margin-left: -15px /*!important*/;
	display:none;
}
.flowchart p, .flowchart a, .flowchart li, .flowchart span{color:#fff !important;*color:#000;text-align:left;text-decoration: none;text-decoration: none !important;border-bottom:none !important;}
.flowchart ul{list-style:none;margin: 0;padding: 0;}
.flowchart ul li{margin-top: 10px;}
.flowchart ul li p{margin:0;padding: 5px;padding-left: 30px;background: #f47321;}
.flowchart ul li ul li p{background: #A8B2BB;}
.flowchart ul ul{margin-left: 70px;}
.flowchart ul ul li{
	border-left:1px solid #C5C5C5;
	margin: 0 0 0 -15px;
	padding: 8px 0 0 15px;
}
.flowchart ul ul li:after{
	content: "-";
	color: #fff;
	float: left;
	margin-left: -16px;
	margin-top: -21px;
	border-left: 1px solid #C5C5C5;
	border-bottom: 1px solid #C5C5C5;
	padding-right: 10px;
}
.flowchart ul ul li p{background:#7686c2;}
.flowchart ul ul ul{margin-left: 15%;}
.flowchart .short ul ul ul ul ul ul ul ul, .flowchart .longer ul ul ul ul ul ul ul ul{padding-left: 40px;}

/** COMPARE LATER WITH MENUBOX OF SIDENAV **/
.flowchart .menuBox{
cursor: pointer;
width: 18px;
float: left;
height: 22px;
margin-left: 6px; /* IE8 and below */
margin-top:3px\9;
}
.flowchart .unfoldArrow{
	width: 18px;
	float: left;
	height: 22px;
	margin-left: 6px;
	background: url(/images/sidebarMenu/downMenu-arrow-white.gif) no-repeat 9px 4px;
}
.flowchart .finalLink{
background-image: url(/images/sidebarMenu/menu-arrow-white.gif);
background-repeat: no-repeat;
background-position:9px 4px;
}
.flowchart .firstLevel{
background-color:#f47321;
}
.flowchart .secondLevel{
background-color:#7686c2;
}
.flowchart .thirstLevel{
background-color:#98a2d2;
}
.flowchart span {
margin-top: -2px;
display: list-item;
-webkit-box-shadow: 0 10px 0 1px #fff, 0 16px 0 1px #fff, 0 22px 0 1px #fff;
box-shadow: 0 10px 0 1px #fff, 0 16px 0 1px #fff, 0 22px 0 1px #fff;
	
background:url(/images/sidebarMenu/menu_icon_for_IE.gif) no-repeat\9; /* IE8 and below */
margin-top: 3px\9; /* IE8 and below */
height:16px\9; /* IE8 and below */
}
.flowchart .clicked{
	margin-left: 9px;
	width: 1px;
	-webkit-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    -moz-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    -o-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    -ms-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    transition: width 0.2s ease-out, margin-left 0.2s ease-out;
	
	margin-left: 8px\9; /* IE8 and below */
	width: 4px\9; /* IE8 and below */
}
.flowchart .notclicked{
	width: 16px;
	-webkit-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    -moz-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    -o-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    -ms-transition: width 0.2s ease-out, margin-left 0.2s ease-out;
    transition: width 0.2s ease-out, margin-left 0.2s ease-out;
	
	width:20px\9; /* IE8 and below */
	height:16px\9; /* IE8 and below */
}
/*
	THIS CODE WILL HELP (IT'S NECESSARY) TO CREATE THE "FLOWCHART VIEW" STYLE
	ON THE LIST WITH "FLOWCHART" STYLE SELECTED.
*/
$(document).ready(function(){

	// THIS FUNCTION ALLOW IE TO DEAL WITH "GET ELEMENTS BY CLASS NAME"
	function getElementsByClassName(node, classname) {
		var a = [];
		var re = new RegExp('(^| )'+classname+'( |$)');
		var els = node.getElementsByTagName("*");
		for(var i=0,j=els.length; i<j; i++)
			if(re.test(els[i].className))a.push(els[i]);
		return a;
	}

	// this variable will just check if we are on a template with a flowchart inside.
	var flowcharts = getElementsByClassName(document.body,'flowchart');  // no document
	
	// IN CASE THERE IS A FLOWCHART LIST, THE FUN WILL START
	if($(flowcharts).html() != undefined){
	// FIRSTLY IT'S COUNTED HOW MANY FLOWCHART ARE THERE
	for(var m = 0; m < flowcharts.length; m++){
			var tempFlowchart = flowcharts[m];
	        var collapseOption = ''; // THIS VARIABLE WILL BE USED AS A SETTING TO FOLD OR NOT THE FLOWCHART
			
			// UMBRACO RETURN THE TEXT INSIDE "LI" WITHOUT "P", SO WE NEED TO GET ALL OF THEM AND MAKE IT PROPERLY
			var paragraphsList = tempFlowchart.getElementsByTagName('li');
			for(var i = 0; i < paragraphsList.length; i++){
				var tempParagraph = paragraphsList[i];
                
				// NEXT CONDITION WILL LOOK FOR THE SETTING TO FOLD OR UNFOLD THE FLOWCHART
                if(collapseOption === ''){
				// IF THE WORD COLLAPSE IS IN THE FIRST PARAGRAPH BETWEEN '*' ...
                var settingsRemoved = $(tempParagraph).html(),
					settings = settingsRemoved.split('*');
				// ...WE TAKE IT OUT FROM THE TEXT, AND SAVE IT FOR LATER IN A VARIABLE
                collapseOption = settings[1];
				// THE ORIGINAL HTML IS OVERWRITTEN WITH THE NEW ONE, WITHOUT "COLLAPSE" ON IT
                $(tempParagraph).html(settings[2]);
                }
				
				// THIS FUNCTION WILL CUT OUT ANY TEXT BETWEEN [ AND ], AND IT WILL BE ADDED AS "TITLE" TO THE PARAGRAPH
				var html = $(tempParagraph).html(),
                    lText = html.split('['),
					rText = html.split(']');
					
				if (typeof rText[0] === "undefined")
					{rText[0] = ""}  
				if (typeof rText[1] === "undefined")
					{rText[1] = ""}  
				if (typeof lText[0] === "undefined")
					{lText[0] = ""} 
				if (typeof lText[1] === "undefined")
					{lText[1] = ""}
					
				var titleText = lText[1].split(']');
				$(tempParagraph).attr({ title: titleText[0] });
				$(tempParagraph).html(lText[0]+rText[1]);
                
				var finalParagraph = $(tempParagraph).html();
                
                // IF THERE IS NOT CHILDS, IN WON'T HAVE FOLDED MENU ICON
                if($(tempParagraph).next('ul').text() == ''){
					$(tempParagraph).text('');
					if($(tempParagraph).parent().prop("class") === 'flowchart'){
						$(tempParagraph).append("<p class='finalLink firstLevel'>"+ finalParagraph +"</p>");
					}else if($(tempParagraph).parent().parent().prop("class") === 'flowchart'){
						$(tempParagraph).append("<p class='finalLink secondLevel'>"+ finalParagraph +"</p>");
					}else{
						$(tempParagraph).append("<p class='finalLink thirstLevel'>"+ finalParagraph +"</p>");
					}
				}else // IT WILL HAVE FOLDED MENU ICON IF THERE IS CHILDS
                {
                    $(tempParagraph).text('');
                    if(collapseOption =="collapse"){
                        $(tempParagraph).append("<div class='menuBox'><span class='notclicked'></span></div><p>"+ finalParagraph +"</p>");
                    }else{
                        $(tempParagraph).append("<div class='unfoldArrow'></div><p>"+ finalParagraph +"</p>");
                    }
                }
			};
			
			// WITH THE NEXT CLASSES WE WILL ADD A LINE AT LEFT SIDE IN CASE THERE IS MORE SECTIONS IN THE SAME LEVEL
			var list = tempFlowchart.getElementsByTagName('ul');
			for(var i = 0; i < list.length; i++){
				var temp = list[i];
                if($(temp).next('li').text() != ''){
					// LONGER WILL ADD THE LINE
				   $(temp).addClass('longer');
                }else{
					// SHORT WON'T ADD THE LINE
                    $(temp).addClass('short');
                }
			}
			
				// CREATE A NEW DIV WITH A CLASS CALLED "FLOWCHART"
			$(tempFlowchart).before("<div class='flowchart flowchartSerial_" + (m+1) + "'></div>");
				// SAVE THE CONTENT OF OUR NEW DIV
			var flowChartDiv = $('div.flowchartSerial_'+ (m+1));
			$(flowChartDiv).append($(tempFlowchart));
			
			// IF 'COLLAPSE' WAS WRITTEN AT THE BEGINNIG OF THE FLOWCHART, IT WILL BE COLLAPSED
            if(collapseOption == "collapse"){
				$(flowChartDiv).children('ul').children('ul').addClass('opened');
				$(flowChartDiv).children('ul').children('ul').slideToggle(350);
				$(flowChartDiv).children('ul').children('li').children('.menuBox').children('span').toggleClass("clicked");
				$(flowChartDiv).children('ul').children('li').children('.menuBox').children('span').toggleClass("notclicked");
                flowchartSlideTest(flowChartDiv);
			// OTHERWISE, IT WILL BE NO COLLAPSED
            }else{
				// THE CLASSES LONGER AND SHORT HAVE A DISPLAY:NONE PROPERTY
				// SO THIS WILL OVERWRITE THAT PROPERTIES AND WILL EXPAND ALL
				$(flowChartDiv).find('.longer').show();
				$(flowChartDiv).find('.short').show();
            }
		}
    }
});

function flowchartSlideTest(variable){

$(variable).find('.menuBox').click(function(event){
    var div = $(this).parent('li').next('ul');
    
    if($(div).html() != undefined){
        var open = $(variable).children('ul').children('ul').find('.opened');
		// IF WE OPENED ANOTHER SECTION BEFORE, IT WILL BE CLOSED BEFORE OPENING THE NEW ONE
        if($(open).html() != $(div).html()){
            if(!$(this).parent().parent().hasClass('opened')){
                $(open).each(function() {
                $(this).toggleClass("opened");
                $(this).slideToggle(350);
                $(this).prev('li').children().children().toggleClass("clicked");
                $(this).prev('li').children().children().toggleClass("notclicked");
            });
            }
        }
        
        $(div).each(function(i) {
            $(div).slideToggle(350);
            $(div).toggleClass("opened");
        });
        
        $(this).children().toggleClass("clicked");
        $(this).children().toggleClass("notclicked");
    };

$(variable).children('ul').children('ul').removeClass('opened');
});
};

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js