I have built the following Angular app that shows a hierarchy:
And I am trying to insert a text box on top of this hierarchy. To filter the data at the bottom. Have tried a couple of examples with filters but have not had much luck so far.
What I want to do is utilize angular binding when the user starts typing to the text box, dynamically expand and collapse the hierarchy and highlight the matches.
Looking for some advise on what is the best way to tackle this. Note the hierarchy can get big and have around 3000 records.
angular.module('HelloWorldApp', [])
.controller('HelloWorldController', function($scope) {
$scope.mp6Root = [];
$scope.mp6Data = [];
var data = [
{
"cls": "L2-013551",
"clsNm": "FASHION DOLLS",
"subCt": "L3-001793",
"subCtNm": "FASHION DOLLS AND ACCESSORIES",
"ct": "L4-000429",
"ctNm": "DOLLS GAMES PUZZLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006472",
"clsNm": "FASHION DOLL WITH ACCS",
"subCt": "L3-001793",
"subCtNm": "FASHION DOLLS AND ACCESSORIES",
"ct": "L4-000429",
"ctNm": "DOLLS GAMES PUZZLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-014668",
"clsNm": "ACTIVITIES",
"subCt": "L3-001793",
"subCtNm": "FASHION DOLLS AND ACCESSORIES",
"ct": "L4-000429",
"ctNm": "DOLLS GAMES PUZZLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-014667",
"clsNm": "STORAGE",
"subCt": "L3-001793",
"subCtNm": "FASHION DOLLS AND ACCESSORIES",
"ct": "L4-000429",
"ctNm": "DOLLS GAMES PUZZLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-014675",
"clsNm": "FASHION DOLL PLAYSET",
"subCt": "L3-001793",
"subCtNm": "FASHION DOLLS AND ACCESSORIES",
"ct": "L4-000429",
"ctNm": "DOLLS GAMES PUZZLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006476",
"clsNm": "ROLE PLAY FASHION AND TOY",
"subCt": "L3-001793",
"subCtNm": "FASHION DOLLS AND ACCESSORIES",
"ct": "L4-000429",
"ctNm": "DOLLS GAMES PUZZLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-014677",
"clsNm": "CORE PS FIGURE W PLAYSET",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006508",
"clsNm": "CORE PS MUSICAL INSTRUMENT",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-014788",
"clsNm": "WAGONS TOYS",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006536",
"clsNm": "RIDING TOYS FOOT TO FLOOR",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-014678",
"clsNm": "CORE PS PUZZLE",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006506",
"clsNm": "CORE PS FIGURE PLAYSET",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006509",
"clsNm": "CORE PS OTHER TOYS",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006511",
"clsNm": "CORE PS TALKING SOUND",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006507",
"clsNm": "CORE PS LEARNING TOY",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006510",
"clsNm": "CORE PS ROLEPLAY",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006512",
"clsNm": "CORE PS VEHICLES",
"subCt": "L3-001798",
"subCtNm": "CORE PRESCHOOL TOYS",
"ct": "L4-000428",
"ctNm": "PRESCHOOL",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006585",
"clsNm": "DIECAST MED LG SCALE VEHICLES",
"subCt": "L3-001818",
"subCtNm": "DIECAST AND PLAYSETS",
"ct": "L4-000425",
"ctNm": "ACT FIGS CONSTRUCTION VEHICLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006587",
"clsNm": "DIECAST PLAYSETS",
"subCt": "L3-001818",
"subCtNm": "DIECAST AND PLAYSETS",
"ct": "L4-000425",
"ctNm": "ACT FIGS CONSTRUCTION VEHICLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006586",
"clsNm": "DIECAST MINI VEHICLES",
"subCt": "L3-001818",
"subCtNm": "DIECAST AND PLAYSETS",
"ct": "L4-000425",
"ctNm": "ACT FIGS CONSTRUCTION VEHICLES",
"seg": "L5-000031",
"segNm": "TOYS",
"area": "L6-000004",
"areaNm": "HARDLINES"
},
{
"cls": "L2-006798",
"clsNm": "VACUUMS UPRIGHT BAGLESS",
"subCt": "L3-001851",
"subCtNm": "FLOOR CLEANING",
"ct": "L4-000449",
"ctNm": "HOME ELECTRICS",
"seg": "L5-000054",
"segNm": "HARD HOME",
"area": "L6-000012",
"areaNm": "IN AND OUTDOOR HOME"
},
{
"cls": "L2-006795",
"clsNm": "VACUUMS HAND",
"subCt": "L3-001851",
"subCtNm": "FLOOR CLEANING",
"ct": "L4-000449",
"ctNm": "HOME ELECTRICS",
"seg": "L5-000054",
"segNm": "HARD HOME",
"area": "L6-000012",
"areaNm": "IN AND OUTDOOR HOME"
},
{
"cls": "L2-006791",
"clsNm": "FLOOR DEEP CLEANER CHEMICALS",
"subCt": "L3-001851",
"subCtNm": "FLOOR CLEANING",
"ct": "L4-000449",
"ctNm": "HOME ELECTRICS",
"seg": "L5-000054",
"segNm": "HARD HOME",
"area": "L6-000012",
"areaNm": "IN AND OUTDOOR HOME"
},
{
"cls": "L2-006796",
"clsNm": "VACUUMS STICK",
"subCt": "L3-001851",
"subCtNm": "FLOOR CLEANING",
"ct": "L4-000449",
"ctNm": "HOME ELECTRICS",
"seg": "L5-000054",
"segNm": "HARD HOME",
"area": "L6-000012",
"areaNm": "IN AND OUTDOOR HOME"
},
{
"cls": "L2-012895",
"clsNm": "FLOOR STEAM MOPS",
"subCt": "L3-001851",
"subCtNm": "FLOOR CLEANING",
"ct": "L4-000449",
"ctNm": "HOME ELECTRICS",
"seg": "L5-000054",
"segNm": "HARD HOME",
"area": "L6-000012",
"areaNm": "IN AND OUTDOOR HOME"
}]
;
$scope.loadMP6DataToMemory = function(data) {
angular.forEach(data, function (value, key) {
if ($.inArray(value.area, $scope.mp6Root) === -1) {
$scope.mp6Root.push(value.area);
}
addToMap(value.cls, value.clsNm, "");
addToMap(value.subCt, value.subCtNm, value.cls);
addToMap(value.ct, value.ctNm, value.subCt);
addToMap(value.seg, value.segNm, value.ct);
addToMap(value.area, value.areaNm, value.seg);
});
}
addToMap = function (pKey, pName, pChild) {
if (!$scope.mp6Data[pKey]) {
cSet = [];
$scope.mp6Data[pKey] = { name: pName, children: cSet };
} else {
if ($.inArray(pChild, $scope.mp6Data[pKey].children) === -1) {
$scope.mp6Data[pKey].children.push(pChild);
}
}
}
$scope.ExpandMP6 = function (pKey) {
if (pKey) {
mp = $scope.mp6Data[pKey];
return {
name: mp.name,
children: mp.children,
visible: false
}
}
}
$scope.loadMP6DataToMemory(data);
$scope.l5visible = false;
$scope.l4visible = false;
$scope.l3visible = false;
$scope.l2visible = false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div class="container" ng-app="HelloWorldApp" ng-controller="HelloWorldController">
<div class="md-grid">
<ul class="md-list">
<li class="md-list-item-text" ng:repeat="l6 in mp6Root" ng-click="l5visible = !l5visible; $event.stopPropagation();">
L6 {{ExpandMP6(l6).name}}
<ul class="md-list" ng-show="l5visible">
<li class="md-list-item-text" ng:repeat="l5 in ExpandMP6(l6).children" ng-click="l4visible = !l4visible; $event.stopPropagation();">
L5 {{ExpandMP6(l5).name}}
<ul class="md-list" ng-show="l4visible">
<li class="md-list-item-text" ng:repeat="l4 in ExpandMP6(l5).children" ng-click="l3visible = !l3visible; $event.stopPropagation();">
L4 {{ExpandMP6(l4).name}}
<ul class="md-list" ng-show="l3visible">
<li class="md-list-item-text" ng:repeat="l3 in ExpandMP6(l4).children" ng-click="l2visible = !l2visible; $event.stopPropagation();">
L3 {{ExpandMP6(l3).name}}
<ul class="md-list" ng-show="l2visible">
<li class="md-list-item-text" ng:repeat="l2 in ExpandMP6(l3).children">
L2 {{ExpandMP6(l2).name}}
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
Edit: This is the filter I was thinking of but does not seem to adapt on the way ive structured the html: how to filter the data from text box in angularjs
If HTML structure needs to be changed i'm open to suggestions.