public render()

in src/UXClient/Components/Hierarchy/Hierarchy.ts [19:112]


    public render(data: any, options?: any){
        var self = this;
        var targetElement = d3.select(this.renderTarget).classed('tsi-hierarchy', true);
        targetElement.html('');
        this.chartOptions.setOptions(options);
        super.themify(targetElement, this.chartOptions.theme);
        this.withContextMenu = this.chartOptions.withContextMenu;
        this.root = this.buildTree(data);
        this.root.isExpanded = true;
        
        d3.select("html").on("click." + Utils.guid(), () => {
            if (this.clickedNode && d3.event.target != this.clickedNode && this.contextMenu) {
                this.closeContextMenu();
                this.clickedNode = null;
            }
        });
        
        var inputDebounceTimeout;
        var filter = targetElement.append('div').classed('tsi-filterWrapper', true).append('input').attr('placeholder', 'Search...').on('input', function(){
            clearTimeout(inputDebounceTimeout);
            inputDebounceTimeout = setTimeout(() => {
                self.filterText = (<any>this).value.trim();
                if(self.filterText.length == 1)
                    return;  // quick return for small sets
                var splitFilterText = self.filterText.split('/');
                self.root.filter(splitFilterText[0]);
                if(splitFilterText.length > 1){
                    for(var i = 1; i < splitFilterText.length; i++){
                        if(splitFilterText[i].length){
                            var nodesInFilter = self.root.traverse(n => n.selfInFilter);
                            nodesInFilter.forEach(n => {
                                var markedName = n.markedName;
                                n.filter(splitFilterText[i], false)
                                n.markedName = markedName;
                            });
                            nodesInFilter.forEach(n => {
                                if(!n.childrenInFilter)
                                    n.selfInFilter = false;
                            })
                        }
                    }
                }
                list.selectAll('ul').remove();
                list.classed('tsi-expanded', false);
                self.root.childrenInFilter = self.root.childrenInFilter || self.filterText.length == 0;
                if(self.root.childrenInFilter == false)
                    list.append('ul').append('div').text(self.getString('No filter results'))
                else
                    self.expandCollapseList(self.root, list, false);
                list.select('ul').classed('tsi-noPad', true);
            }, 250);
        });

        var navTabs = targetElement.append('div').classed('tsi-navTabWrapper', true);
        var allTab = navTabs.append('div').classed('tsi-navTab tsi-selected', true).text(this.getString('All hierarchies'));
        var selectedTab = navTabs.append('div').classed('tsi-navTab', true).text(this.getString('Selected'));
        
        var list = targetElement.append('div').classed('tsi-hierarchyList', true);
        this.hierarchyList = list;

        allTab.on('click', () => {
            if(!allTab.classed('tsi-selected')){
                allTab.classed('tsi-selected', true)
                selectedTab.classed('tsi-selected', false)
                list.html('').classed('tsi-expanded', false);
                this.expandCollapseList(this.root, list, true);
                list.select('ul').classed('tsi-noPad', true);
                filter.attr('disabled', null);
            }
        });
        selectedTab.on('click', () => {
            if(!selectedTab.classed('tsi-selected')){
                allTab.classed('tsi-selected', false)
                selectedTab.classed('tsi-selected', true)
                list.html('');
                var ul = list.append('ul').classed('tsi-noPad', true);
                var leafs = this.root.traverse(n => n.isSelected);
                leafs.forEach(n => {
                    var li = ul.append('li').classed('tsi-leaf', n.isLeaf).classed('tsi-selected', n.isSelected).on('click', function(){
                        n.isSelected = !n.isSelected;
                        d3.select(this).classed('tsi-selected', n.isSelected);
                        n.click(n)
                        n.colorify(d3.select(this));
                    });
                    li.append('span').text(n.name).classed('tsi-markedName', true);
                    n.colorify(li);
                });
                filter.attr('disabled', true);
            }
        });

        this.expandCollapseList(this.root, list, false);
        list.select('ul').classed('tsi-noPad', true);
    }