@rxap/tree
Version:
This package provides a tree component and data source for Angular applications. It includes features such as searching, filtering, and displaying hierarchical data. The package also offers directives for customizing the content of tree nodes.
2,062 lines • 85.1 kB
HTML
<!doctype html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>angular-tree</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="../images/favicon.ico">
<link rel="stylesheet" href="../styles/style.css">
<link rel="stylesheet" href="../styles/dark.css">
</head>
<body>
<script>
// Blocking script to avoid flickering dark mode
// Dark mode toggle button
var useDark = window.matchMedia('(prefers-color-scheme: dark)');
var darkModeState = useDark.matches;
var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
var $darkModeToggles = document.querySelectorAll('.dark-mode-switch');
var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state');
function checkToggle(check) {
for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
$darkModeToggleSwitchers[i].checked = check;
}
}
function toggleDarkMode(state) {
if (window.localStorage) {
localStorage.setItem('compodoc_darkmode-state', state);
}
checkToggle(state);
const hasClass = document.body.classList.contains('dark');
if (state) {
for (var i = 0; i < $darkModeToggles.length; i++) {
$darkModeToggles[i].classList.add('dark');
}
if (!hasClass) {
document.body.classList.add('dark');
}
} else {
for (var i = 0; i < $darkModeToggles.length; i++) {
$darkModeToggles[i].classList.remove('dark');
}
if (hasClass) {
document.body.classList.remove('dark');
}
}
}
useDark.addEventListener('change', function (evt) {
toggleDarkMode(evt.matches);
});
if (darkModeStateLocal) {
darkModeState = darkModeStateLocal === 'true';
}
toggleDarkMode(darkModeState);
</script>
<div class="navbar navbar-default navbar-fixed-top d-md-none p-0">
<div class="d-flex">
<a href="../" class="navbar-brand">angular-tree</a>
<button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
</div>
</div>
<div class="xs-menu menu" id="mobile-menu">
<div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu>
</div>
<div class="container-fluid main">
<div class="row main">
<div class="d-none d-md-block menu">
<compodoc-menu mode="normal"></compodoc-menu>
</div>
<!-- START CONTENT -->
<div class="content component">
<div class="content-data">
<ol class="breadcrumb">
<li class="breadcrumb-item">Components</li>
<li class="breadcrumb-item"
>
TreeComponent</li>
</ol>
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a href="#info" class="nav-link active"
role="tab" id="info-tab" data-bs-toggle="tab" data-link="info">Info</a>
</li>
<li class="nav-item">
<a href="#source" class="nav-link"
role="tab" id="source-tab" data-bs-toggle="tab" data-link="source">Source</a>
</li>
<li class="nav-item">
<a href="#templateData" class="nav-link"
role="tab" id="templateData-tab" data-bs-toggle="tab" data-link="template">Template</a>
</li>
<li class="nav-item">
<a href="#styleData" class="nav-link"
role="tab" id="styleData-tab" data-bs-toggle="tab" data-link="style">Styles</a>
</li>
<li class="nav-item">
<a href="#tree" class="nav-link"
role="tab" id="tree-tab" data-bs-toggle="tab" data-link="dom-tree">DOM Tree</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade active in" id="info"><p class="comment">
<h3>File</h3>
</p>
<p class="comment">
<code>src/lib/tree.component.ts</code>
</p>
<p class="comment">
<h3>Implements</h3>
</p>
<p class="comment">
<code>OnInit</code>
<code>AfterContentInit</code>
</p>
<section data-compodoc="block-metadata">
<h3>Metadata</h3>
<table class="table table-sm table-hover metadata">
<tbody>
<tr>
<td class="col-md-3">changeDetection</td>
<td class="col-md-9"><code>ChangeDetectionStrategy.OnPush</code></td>
</tr>
<tr>
<td class="col-md-3">selector</td>
<td class="col-md-9"><code>rxap-tree</code></td>
</tr>
<tr>
<td class="col-md-3">imports</td>
<td class="col-md-9">
<code>NgStyle</code>
<code>NgIf</code>
<code>MatProgressBarModule</code>
<code>MatTreeModule</code>
<code>MatIconModule</code>
<code>IconDirective</code>
<code>MatCheckboxModule</code>
<code>MatButtonModule</code>
<code>ContenteditableDirective</code>
<code>MatProgressSpinnerModule</code>
<code>MatDividerModule</code>
<code>PortalModule</code>
<code>AsyncPipe</code>
<code>NgClass</code>
<code>NgForOf</code>
</td>
</tr>
<tr>
<td class="col-md-3">styleUrls</td>
<td class="col-md-9"><code>./tree.component.scss</code></td>
</tr>
<tr>
<td class="col-md-3">templateUrl</td>
<td class="col-md-9"><code>./tree.component.html</code></td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-index">
<h3 id="index">Index</h3>
<table class="table table-sm table-bordered index-table">
<tbody>
<tr>
<td class="col-md-4">
<h6><b>Properties</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier">Optional</span>
<a href="#content" >content</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#getLevel" >getLevel</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#hasChild" >hasChild</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#isExpandable" >isExpandable</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#portal" >portal</a>
</li>
<li>
<span class="modifier"></span>
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier">Readonly</span>
<a href="#searchForm" >searchForm</a>
</li>
<li>
<span class="modifier">Public</span>
<span class="modifier">Readonly</span>
<a href="#showTreeNavigation" >showTreeNavigation</a>
</li>
<li>
<span class="modifier"></span>
<span class="modifier">Public</span>
<a href="#treeContainer" >treeContainer</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#treeControl" >treeControl</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Methods</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Public</span>
<a href="#onContentEditableChange" >onContentEditableChange</a>
</li>
<li>
<a href="#onMousedown" >onMousedown</a>
</li>
<li>
<span class="modifier"></span>
<a href="#onMousemove" >onMousemove</a>
</li>
<li>
<span class="modifier"></span>
<a href="#onMouseup" >onMouseup</a>
</li>
<li>
<span class="modifier"></span>
<span class="modifier">Public</span>
<a href="#openDetails" >openDetails</a>
</li>
<li>
<a href="#toggleTreeNavigation" >toggleTreeNavigation</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Inputs</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#contentEditableMethod" >contentEditableMethod</a>
</li>
<li>
<a href="#dataSource" >dataSource</a>
</li>
<li>
<a href="#dividerOffset" >dividerOffset</a>
</li>
<li>
<a href="#getIcon" >getIcon</a>
</li>
<li>
<a href="#getStyle" >getStyle</a>
</li>
<li>
<a href="#getType" >getType</a>
</li>
<li>
<a href="#hasDetails" >hasDetails</a>
</li>
<li>
<a href="#hideLeafIcon" >hideLeafIcon</a>
</li>
<li>
<a href="#id" >id</a>
</li>
<li>
<a href="#multiple" >multiple</a>
</li>
<li>
<a href="#toDisplay" >toDisplay</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Outputs</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#details" >details</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>HostListeners</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#mousemove" >mousemove</a>
</li>
<li>
<a href="#mouseup" >mouseup</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Accessors</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#nodeDisplayEditable" >nodeDisplayEditable</a>
</li>
<li>
<a href="#cacheId" >cacheId</a>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-constructor">
<h3 id="constructor">Constructor</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(viewContainerRef: ViewContainerRef, cdr: ChangeDetectorRef, contentEditableMethod: Method<any | string | null> | null, renderer: Renderer2, elementRef: ElementRef<HTMLElement>, searchForm: <a href="../injectables/SearchForm.html" target="_self">SearchForm | null</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="136" class="link-to-prism">src/lib/tree.component.ts:136</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div>
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>viewContainerRef</td>
<td>
<code>ViewContainerRef</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>cdr</td>
<td>
<code>ChangeDetectorRef</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>contentEditableMethod</td>
<td>
<code>Method<any | string | null> | null</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>renderer</td>
<td>
<code>Renderer2</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>elementRef</td>
<td>
<code>ElementRef<HTMLElement></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>searchForm</td>
<td>
<code><a href="../injectables/SearchForm.html" target="_self" >SearchForm | null</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-inputs">
<h3 id="inputs">Inputs</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="contentEditableMethod"></a>
<b>contentEditableMethod</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>Method<any | string | null> | null</code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="96" class="link-to-prism">src/lib/tree.component.ts:96</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="dataSource"></a>
<b>dataSource</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../injectables/TreeDataSource.html" target="_self" >TreeDataSource<Data></a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Required : </i> <b>true</b>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="94" class="link-to-prism">src/lib/tree.component.ts:94</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="dividerOffset"></a>
<b>dividerOffset</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>'256px'</code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="118" class="link-to-prism">src/lib/tree.component.ts:118</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getIcon"></a>
<b>getIcon</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>NodeGetIconFunction<any></code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="100" class="link-to-prism">src/lib/tree.component.ts:100</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getStyle"></a>
<b>getStyle</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>NodeGetStyleFunction<any></code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="104" class="link-to-prism">src/lib/tree.component.ts:104</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getType"></a>
<b>getType</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>NodeGetTypeFunction<any></code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="102" class="link-to-prism">src/lib/tree.component.ts:102</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="hasDetails"></a>
<b>hasDetails</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>NodeHasDetailsFunction<any></code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="108" class="link-to-prism">src/lib/tree.component.ts:108</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="hideLeafIcon"></a>
<b>hideLeafIcon</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>false</code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="112" class="link-to-prism">src/lib/tree.component.ts:112</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="id"></a>
<b>id</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="114" class="link-to-prism">src/lib/tree.component.ts:114</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="multiple"></a>
<b>multiple</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>false</code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="106" class="link-to-prism">src/lib/tree.component.ts:106</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="toDisplay"></a>
<b>toDisplay</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>NodeToDisplayFunction<any></code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="98" class="link-to-prism">src/lib/tree.component.ts:98</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-outputs">
<h3 id="outputs">Outputs</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="details"></a>
<b>details</b>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>EventEmitter</code>
</td>
</tr>
<tr>
<td class="col-md-2" colspan="2">
<div class="io-line">Defined in <a href="" data-line="116" class="link-to-prism">src/lib/tree.component.ts:116</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-methods">
<h3>HostListeners</h3> <table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="mousemove"></a>
<span class="name">
<span ><b>mousemove</b></span>
<a href="#mousemove"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Arguments : </i><code>'$event' </code>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>mousemove($event: MouseEvent)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="235"
class="link-to-prism">src/lib/tree.component.ts:235</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="mouseup"></a>
<span class="name">
<span ><b>mouseup</b></span>
<a href="#mouseup"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>mouseup()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="230"
class="link-to-prism">src/lib/tree.component.ts:230</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-methods">
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="onContentEditableChange"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>onContentEditableChange</b></span>
<a href="#onContentEditableChange"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>onContentEditableChange(value: string | null, node: Node<Data>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="220"
class="link-to-prism">src/lib/tree.component.ts:220</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>value</td>
<td>
<code>string | null</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>node</td>
<td>
<code>Node<Data></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="onMousedown"></a>
<span class="name">
<span ><b>onMousedown</b></span>
<a href="#onMousedown"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>onMousedown()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="225"
class="link-to-prism">src/lib/tree.component.ts:225</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="onMousemove"></a>
<span class="name">
<span class="modifier"></span>
<span ><b>onMousemove</b></span>
<a href="#onMousemove"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>onMousemove($event: MouseEvent)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>@HostListener('mousemove', ['$event'])<br /></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="235"
class="link-to-prism">src/lib/tree.component.ts:235</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>$event</td>
<td>
<code>MouseEvent</code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="onMouseup"></a>
<span class="name">
<span class="modifier"></span>
<span ><b>onMouseup</b></span>
<a href="#onMouseup"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>onMouseup()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>@HostListener('mouseup')<br /></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="230"
class="link-to-prism">src/lib/tree.component.ts:230</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="openDetails"></a>
<span class="name">
<span class="modifier"></span>
<span class="modifier">Public</span>
<span ><b>openDetails</b></span>
<a href="#openDetails"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>openDetails(node: Node<Data>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>@DebounceCall(100)<br /></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="205"
class="link-to-prism">src/lib/tree.component.ts:205</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>node</td>
<td>
<code>Node<Data></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="toggleTreeNavigation"></a>
<span class="name">
<span ><b>toggleTreeNavigation</b></span>
<a href="#toggleTreeNavigation"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>toggleTreeNavigation()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="249"
class="link-to-prism">src/lib/tree.component.ts:249</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-properties">
<h3 id="inputs">
Properties
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="content"></a>
<span class="name">
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier">Optional</span>
<span ><b>content</b></span>
<a href="#content"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../directives/TreeContentDirective.html" target="_self" >TreeContentDirective</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>
@ContentChild(TreeContentDirective, {static: true})<br />
</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="110" class="link-to-prism">src/lib/tree.component.ts:110</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getLevel"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>getLevel</b></span>
<a href="#getLevel"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>() => {...}</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="164" class="link-to-prism">src/lib/tree.component.ts:164</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="hasChild"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>hasChild</b></span>
<a href="#hasChild"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>() => {...}</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="168" class="link-to-prism">src/lib/tree.component.ts:168</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="isExpandable"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>isExpandable</b></span>
<a href="#isExpandable"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>() => {...}</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="166" class="link-to-prism">src/lib/tree.component.ts:166</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="portal"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>portal</b></span>
<a href="#portal"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>TemplatePortal | null</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>null</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="119" class="link-to-prism">src/lib/tree.component.ts:119</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="searchForm"></a>
<span class="name">
<span class="modifier"></span>
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier">Readonly</span>
<span ><b>searchForm</b></span>
<a href="#searchForm"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../injectables/SearchForm.html" target="_self" >SearchForm | null</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>
@Optional()<br />@Inject(RXAP_FORM_DEFINITION)<br />
</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="150" class="link-to-prism">src/lib/tree.component.ts:150</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="showTreeNavigation"></a>
<span class="name">
<span class="modifier">Public</span>
<span class="modifier">Readonly</span>
<span ><b>showTreeNavigation</b></span>
<a href="#showTreeNavigation"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>signal(true)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="123" class="link-to-prism">src/lib/tree.component.ts:123</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="treeContainer"></a>
<span class="name">
<span class="modifier"></span>
<span class="modifier">Public</span>
<span ><b>treeContainer</b></span>
<a href="#treeContainer"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>ElementRef</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>
@ViewChild('treeContainer', {static: true})<br />
</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="121" class="link-to-prism">src/lib/tree.component.ts:121</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="treeControl"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>treeControl</b></span>
<a href="#treeControl"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>FlatTreeControl<Node<Data>></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="92" class="link-to-prism">src/lib/tree.component.ts:92</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-accessors">
<h3 id="accessors">
Accessors
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="nodeDisplayEditable"></a>
<span class="name"><b>nodeDisplayEditable</b><a href="#nodeDisplayEditable"><span class="icon ion-ios-link"></span></a></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="accessor"><b>get</b><code>nodeDisplayEditable()</code></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="156" class="link-to-prism">src/lib/tree.component.ts:156</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="cacheId"></a>
<span class="name"><b>cacheId</b><a href="#cacheId"><span class="icon ion-ios-link"></span></a></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="accessor"><b>get</b><code>cacheId()</code></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="160" class="link-to-prism">src/lib/tree.component.ts:160</a></div>
</td>
</tr>
</tbody>
</table>
</section>
</div>
<div class="tab-pane fade tab-source-code" id="source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {
PortalModule,
TemplatePortal,
} from '@angular/cdk/portal';
import { FlatTreeControl } from '@angular/cdk/tree';
import {
AsyncPipe,
NgClass,
NgForOf,
NgIf,
NgStyle,
} from '@angular/common';
import {
AfterContentInit,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ContentChild,
ElementRef,
EventEmitter,
HostListener,
Inject,
Input,
isDevMode,
OnInit,
Optional,
Output,
Renderer2,
signal,
ViewChild,
ViewContainerRef,
} from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDividerModule } from '@angular/material/divider';
import { MatIconModule } from '@angular/material/icon';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatTreeModule } from '@angular/material/tree';
import { ContenteditableDirective } from '@rxap/contenteditable';
import {
Node,
NodeGetIconFunction,
NodeGetStyleFunction,
NodeGetTypeFunction,
NodeHasDetailsFunction,
NodeToDisplayFunction,
} from '@rxap/data-structure-tree';
import { RXAP_FORM_DEFINITION } from '@rxap/forms';
import { IconDirective } from '@rxap/material-directives/icon';
import { Method } from '@rxap/pattern';
import {
DebounceCall,
WithChildren,
WithIdentifier,
} from '@rxap/utilities';
import {
map,
startWith,
tap,
} from 'rxjs/operators';
import { SearchForm } from './search.form';
import { RXAP_TREE_CONTENT_EDITABLE_METHOD } from './tokens';
import { TreeContentDirective } from './tree-content.directive';
import { TreeDataSource } from './tree.data-source';
@Component({
selector: 'rxap-tree',
templateUrl: './tree.component.html',
styleUrls: ['./tree.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
NgStyle,
NgIf,
MatProgressBarModule,
MatTreeModule,
MatIconModule,
IconDirective,
MatCheckboxModule,
MatButtonModule,
ContenteditableDirective,
MatProgressSpinnerModule,
MatDividerModule,
PortalModule,
AsyncPipe,
NgClass,
NgForOf,
]
})
export class TreeComponent<Data extends WithIdentifier & WithChildren = any>
implements OnInit, AfterContentInit {
public treeControl: FlatTreeControl<Node<Data>>;
@Input({required: true})
public dataSource!: TreeDataSource<Data>;
@Input()
public contentEditableMethod?: Method<any, string | null> | null;
@Input()
public toDisplay?: NodeToDisplayFunction<any>;
@Input()
public getIcon?: NodeGetIconFunction<any>;
@Input()
public getType?: NodeGetTypeFunction<any>;
@Input()
public getStyle?: NodeGetStyleFunction<any>;
@Input()
public multiple = false;
@Input()
public hasDetails?: NodeHasDetailsFunction<any>;
@ContentChild(TreeContentDirective, {static: true})
public content?: TreeContentDirective;
@Input()
public hideLeafIcon = false;
@Input()
public id?: string;
@Output()
public details = new EventEmitter();
@Input()
public dividerOffset = '256px';
public portal: TemplatePortal | null = null;
@ViewChild('treeContainer', {static: true})
public treeContainer!: ElementRef;
public readonly showTreeNavigation = signal(true);
/**
* Indicates that the divider is moved with mouse down
* @private
*/
private _moveDivider = false;
/**
* Holds the current tree container width.
* If null the move divider feature was not yet used and the initial
* container width is not calculated
* @private
*/
private _treeContainerWidth: number | null = null;
constructor(
@Inject(ViewContainerRef)
private readonly viewContainerRef: ViewContainerRef,
@Inject(ChangeDetectorRef)
private readonly cdr: ChangeDetectorRef,
@Optional()
@Inject(RXAP_TREE_CONTENT_EDITABLE_METHOD)
contentEditableMethod: Method<any, string | null> | null,
private readonly renderer: Renderer2,
private readonly elementRef: ElementRef<HTMLElement>,
@Optional()
@Inject(RXAP_FORM_DEFINITION)
public readonly searchForm: SearchForm | null,
) {
this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
this.contentEditableMethod = contentEditableMethod;
}
public get nodeDisplayEditable(): boolean {
return !!this.contentEditableMethod;
}
public get cacheId() {
return [ 'rxap', 'tree', this.id ].join('/');
}
public getLevel = (node: Node<Data>) => node.depth;
public isExpandable = (node: Node<Data>) => node.hasChildren;
public hasChild = (_: number, nodeData: Node<Data>) => nodeData.hasChildren;
public ngOnInit() {
this.dataSource.searchForm = this.searchForm;
this.dataSource.setTreeControl(this.treeControl);
this.dataSource.setToDisplay(this.toDisplay);
this.dataSource.setGetIcon(this.getIcon);
this.dataSource.setHasDetails(this.hasDetails);
this.dataSource.setGetStyle(this.getStyle);
this.dataSource.setGetType(this.getType);
this.multiple = this.dataSource.metadata.selectMultiple ?? this.multiple;
if (this.dataSource.selected.hasValue()) {
this.dataSource.selected.selected.forEach((node) =>
this.openDetails(node),
);
}
const cachedOffset = localStorage.getItem(this.cacheId);
if (cachedOffset && cachedOffset.match(/^(\d+\.)?\d+px$/)) {
this.setDividerOffset(cachedOffset);
} else if (isDevMode()) {
console.log('Divider offset cache is not available or invalid: ' + cachedOffset);
}
}
public ngAfterContentInit(): void {
this.dataSource.selected.changed
.pipe(
map(($event) => $event.source.selected),
startWith(this.dataSource.selected.selected),
tap((selected) => selected.forEach((node) => this.openDetails(node))),
)
.subscribe();
}
@DebounceCall(100)
public openDetails(node: Node<Data>): void {
if (this.content) {
this.portal = new TemplatePortal<any>(
this.content.template,
this.viewContainerRef,
{
$implicit: node.item,
node,
},
);
this.cdr.markForCheck();
}
this.details.emit(node.item);
}
public onContentEditableChange(value: string | null, node: Node<Data>) {
return this.contentEditableMethod?.call(value, node.item, node);
}
onMousedown() {
this._moveDivider = true;
}
@HostListener('mouseup')
onMouseup() {
this._moveDivider = false;
}
@HostListener('mousemove', [ '$event' ])
onMousemove($event: MouseEvent) {
if (this._moveDivider) {
if (!this._treeContainerWidth) {
this._treeContainerWidth = this.treeContainer.nativeElement.clientWidth as number;
}
const rect = this.elementRef.nativeElement.getBoundingClientRect();
this._treeContainerWidth = Math.min(Math.max($event.clientX - (
rect.left + 12
), 128), rect.right - rect.left - 128);
const offset = this._treeContainerWidth + 'px';
this.setDividerOffset(offset);
}
}
toggleTreeNavigation() {
this.showTreeNavigation.update((value) => !value);
}
private setDividerOffset(offset: string) {
this.dividerOffset = offset;
this.renderer.setStyle(this.treeContainer.nativeElement, 'max-width', offset);
this.renderer.setStyle(this.treeContainer.nativeElement, 'min-width', offset);
this.renderer.setStyle(this.treeContainer.nativeElement, 'flex-basis', offset);
localStorage.setItem(this.cacheId, offset);
}
}
</code></pre>
</div>
<div class="tab-pane fade " id="templateData">
<pre class="line-numbers"><code class="language-html"><div class="grow flex flex-col gap-2 justify-start items-start">
<button (click)="toggleTreeNavigation()" class="!justify-start" mat-button type="button">
<span class="flex flex-row justify-start items-center gap-6">
<ng-template [ngIf]="showTreeNavigation()">
<mat-icon>arrow_back</mat-icon>
<span i18n>Hide tree navigation</span>
</ng-template>
<ng-template [ngIf]="!showTreeNavigation()">
<mat-icon>arrow_forward</mat-icon>
<span i18n>Show tree navigation</span>
</ng-template>
</span>
</button>
<div class="flex flex-row grow w-full">
<div #treeContainer [ngClass]="{ 'hidden': !showTreeNavigation() }"
[ngStyle]="{ maxWidth: dividerOffset, minWidth: dividerOffset, flexBasis: dividerOffset }"
class="w-fit grow-0 overflow-y-auto">
<mat-progress-bar *ngIf="!dataSource || (dataSource.loading$ | async)" mode="indeterminate"></mat-progress-bar>
<ng-content select="[searchHeader]"></ng-content>
<mat-tree *ngIf="dataSource; else loading" [dataSource]="dataSource" [treeControl]="treeControl">
<!-- Node without children -->
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding>
<div class="flex flex-row justify-start items-center gap-2">
<mat-icon [ngClass]="{ 'hidden': hideLeafIcon }">subdirectory_arrow_right</mat-icon>
<ng-container *ngIf="node.icon?.length">
<mat-icon *ngFor="let icon of node.icon" [rxapIcon]="$any(icon)"></mat-icon>
</ng-container>
<ng-template [ngIf]="multiple">
<mat-checkbox
(change)="node.toggleSelect()"
[checked]="node.selected"
[disabled]="!node.hasDetails"
[ngStyle]="node.style"
class="grow-0 truncate">
{{ node.display }}
</mat-checkbox>
</ng-template>
<ng-template [ngIf]="!multiple">
<button
(click)="node.select()"
[color]="node.selected ? 'primary' : undefined"
[disabled]="!node.hasDetails"
[ngStyle]="node.style"
class="grow-0 truncate"
mat-button
type="button"
>
{{ node.display }}
</button>
</ng-template>
</div>
</mat-tree-node>
<!-- Node with children -->
<mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding>
<button [attr.aria-label]="'toggle ' + node.filename" mat-icon-button matTreeNodeToggle type="button">
<mat-icon class="mat-icon-rtl-mirror">
{{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}
</mat-icon>
</button>
<div class="flex flex-row justify-start items-center gap-2">
<ng-container *ngIf="node.icon?.length else withoutIcon">
<mat-icon *ngFor="let icon of node.icon" [rxapIcon]="$any(icon)"></mat-icon>
</ng-container>
<ng-template #withoutIcon>
<div></div>
</ng-template>
<ng-template [ngIfElse]="withoutDetails" [ngIf]="node.hasDetails">
<button
(click)="node.select()"
[color]="node.selected ? 'primary' : undefined"
[ngStyle]="node.style"
class="grow-0 truncate"
mat-button
type="button"
>
{{ node.display }}
</button>
</ng-template>
<ng-template #withoutDetails>
<span
(change)="onContentEditableChange($event, node)"
[disabled]="!nodeDisplayEditable"
[ngStyle]="node.style"
class="grow-0 truncate"
rxapContenteditable>
{{ node.display }}
</span>
</ng-template>
<mat-progress-spinner
*ngIf="node.isLoading$ | async"
[diameter]="16"
class="grow-0 pl-4"
mode="indeterminate"
></mat-progress-spinner>
</div>
</mat-tree-node>
</mat-tree>
</div>
<div (mousedown)="onMousedown()" *ngIf="showTreeNavigation()"
class="divider cursor-ew-resize px-3 grow-0">
<mat-divider [vertical]="true" class="h-full"></mat-divider>
</div>
<div class="grow">
<ng-container *ngIf="portal">
<ng-template [cdkPortalOutlet]="portal"></ng-template>
</ng-container>
<ng-content></ng-content>
</div>
</div>
</div>
<ng-template #loading>Load data source</ng-template>
</code></pre>
</div>
<div class="tab-pane fade " id="styleData">
<p class="comment">
<code>./tree.component.scss</code>
</p>
<pre class="line-numbers"><code class="language-scss"></code></pre>
</div>
<div class="tab-pane fade " id="tree">
<div id="tree-container"></div>
<div class="tree-legend">
<div class="title">
<b>Legend</b>
</div>
<div>
<div class="color htmlelement"></div><span>Html element</span>
</div>
<div>
<div class="color component"></div><span>Component</span>
</div>
<div>
<div class="color directive"></div><span>Html element with directive</span>
</div>
</div>
</div>
</div>
<script src="../js/libs/vis.min.js"></script>
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><div class="grow flex flex-col gap-2 justify-start items-start"> <button (click)="toggleTreeNavigation()" class="!justify-start" mat-button type="button"> <span class="flex flex-row justify-start items-center gap-6"> <ng-template [ngIf]="showTreeNavigation()"> <mat-icon>arrow_back</mat-icon> <span i18n>Hide tree navigation</span> </ng-template> <ng-template [ngIf]="!showTreeNavigation()"> <mat-icon>arrow_forward</mat-icon> <span i18n>Show tree navigation</span> </ng-template> </span> </button> <div class="flex flex-row grow w-full"> <div #treeContainer [ngClass]="{ \'hidden\': !showTreeNavigation() }" [ngStyle]="{ maxWidth: dividerOffset, minWidth: dividerOffset, flexBasis: dividerOffset }" class="w-fit grow-0 overflow-y-auto"> <mat-progress-bar *ngIf="!dataSource || (dataSource.loading$ | async)" mode="indeterminate"></mat-progress-bar> <ng-content select="[searchHeader]"></ng-content> <mat-tree *ngIf="dataSource; else loading" [dataSource]="dataSource" [treeControl]="treeControl"> <!-- Node without children --> <mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding> <div class="flex flex-row justify-start items-center gap-2"> <mat-icon [ngClass]="{ \'hidden\': hideLeafIcon }">subdirectory_arrow_right</mat-icon> <ng-container *ngIf="node.icon?.length"> <mat-icon *ngFor="let icon of node.icon" [rxapIcon]="$any(icon)"></mat-icon> </ng-container> <ng-template [ngIf]="multiple"> <mat-checkbox (change)="node.toggleSelect()" [checked]="node.selected" [disabled]="!node.hasDetails" [ngStyle]="node.style" class="grow-0 truncate"> {{ node.display }} </mat-checkbox> </ng-template> <ng-template [ngIf]="!multiple"> <button (click)="node.select()" [color]="node.selected ? \'primary\' : undefined" [disabled]="!node.hasDetails" [ngStyle]="node.style" class="grow-0 truncate" mat-button type="button" > {{ node.display }} </button> </ng-template> </div> </mat-tree-node> <!-- Node with children --> <mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding> <button [attr.aria-label]="\'toggle \' + node.filename" mat-icon-button matTreeNodeToggle type="button"> <mat-icon class="mat-icon-rtl-mirror"> {{ treeControl.isExpanded(node) ? \'expand_more\' : \'chevron_right\' }} </mat-icon> </button> <div class="flex flex-row justify-start items-center gap-2"> <ng-container *ngIf="node.icon?.length else withoutIcon"> <mat-icon *ngFor="let icon of node.icon" [rxapIcon]="$any(icon)"></mat-icon> </ng-container> <ng-template #withoutIcon> <div></div> </ng-template> <ng-template [ngIfElse]="withoutDetails" [ngIf]="node.hasDetails"> <button (click)="node.select()" [color]="node.selected ? \'primary\' : undefined" [ngStyle]="node.style" class="grow-0 truncate" mat-button type="button" > {{ node.display }} </button> </ng-template> <ng-template #withoutDetails> <span (change)="onContentEditableChange($event, node)" [disabled]="!nodeDisplayEditable" [ngStyle]="node.style" class="grow-0 truncate" rxapContenteditable> {{ node.display }} </span> </ng-template> <mat-progress-spinner *ngIf="node.isLoading$ | async" [diameter]="16" class="grow-0 pl-4" mode="indeterminate" ></mat-progress-spinner> </div> </mat-tree-node> </mat-tree> </div> <div (mousedown)="onMousedown()" *ngIf="showTreeNavigation()" class="divider cursor-ew-resize px-3 grow-0"> <mat-divider [vertical]="true" class="h-full"></mat-divider> </div> <div class="grow"> <ng-container *ngIf="portal"> <ng-template [cdkPortalOutlet]="portal"></ng-template> </ng-container> <ng-content></ng-content> </div> </div></div><ng-template #loading>Load data source</ng-template></div>'
var COMPONENTS = [{'name': 'TreeComponent', 'selector': 'rxap-tree'}];
var DIRECTIVES = [{'name': 'TreeContentDirective', 'selector': 'ng-template[rxapTreeContent]'}];
var ACTUAL_COMPONENT = {'name': 'TreeComponent'};
</script>
<script src="../js/tree.js"></script>
</div><div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
<!-- END CONTENT -->
</div>
</div>
<label class="dark-mode-switch">
<input type="checkbox">
<span class="slider">
<svg class="slider-icon" viewBox="0 0 24 24" fill="none" height="20" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" width="20" xmlns="http://www.w3.org/2000/svg">
<path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"></path>
</svg>
</span>
</label>
<script>
var COMPODOC_CURRENT_PAGE_DEPTH = 1;
var COMPODOC_CURRENT_PAGE_CONTEXT = 'component';
var COMPODOC_CURRENT_PAGE_URL = 'TreeComponent.html';
var MAX_SEARCH_RESULTS = 15;
</script>
<script>
$darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
checkToggle(darkModeState);
if ($darkModeToggleSwitchers.length > 0) {
for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
$darkModeToggleSwitchers[i].addEventListener('change', function (event) {
darkModeState = !darkModeState;
toggleDarkMode(darkModeState);
});
}
}
</script>
<script src="../js/libs/custom-elements.min.js"></script>
<script src="../js/libs/lit-html.js"></script>
<script src="../js/menu-wc.js" defer></script>
<script nomodule src="../js/menu-wc_es5.js" defer></script>
<script src="../js/libs/bootstrap-native.js"></script>
<script src="../js/libs/es6-shim.min.js"></script>
<script src="../js/libs/EventDispatcher.js"></script>
<script src="../js/libs/promise.min.js"></script>
<script src="../js/libs/zepto.min.js"></script>
<script src="../js/compodoc.js"></script>
<script src="../js/tabs.js"></script>
<script src="../js/menu.js"></script>
<script src="../js/libs/clipboard.min.js"></script>
<script src="../js/libs/prism.js"></script>
<script src="../js/sourceCode.js"></script>
<script src="../js/search/search.js"></script>
<script src="../js/search/lunr.min.js"></script>
<script src="../js/search/search-lunr.js"></script>
<script src="../js/search/search_index.js"></script>
<script src="../js/lazy-load-graphs.js"></script>
</body>
</html>