The Splitter component for Angular represents a moveable split bar(s) that divides a container's display area into two or more resizable and collapsible panels.
npm install -g @angular/cli ng new jqwidgets-project cd jqwidgets-project
ng add jqwidgets-ng
jQWidgets UI for Angular is distributed as jqwidgets-ng NPM package
npm install jqwidgets-ng
@import 'jqwidgets-ng/jqwidgets/styles/jqx.base.css';
"styles": [ "node_modules/jqwidgets-ng/jqwidgets/styles/jqx.base.css" ]
<jqxSplitter [theme]="'fluent'" [width]="getWidth()" [height]="600"
[panels]="[{ size: 200, min: 100 }, { min: 200, size: 400 }]">
<div>
<jqxExpander [theme]="'fluent'" style="border: none;" #feedExpander
[width]="'100%'" [height]="'100%'"
[toggleMode]="'none'" [showArrow]="false">
<div class="jqx-hideborder">
Feeds
</div>
<div class="jqx-hideborder jqx-hidescrollbars">
<jqxTree [theme]="'fluent'" #treeReference (onSelect)="onTreeSelect($event)"
[width]="'100%'" [height]="'100%'">
<ul>
<li item-expanded="true" id="t1">
<img src="https://www.jqwidgets.com/angular/images/contactsIcon.png" /><span item-title="true">News and Blogs</span>
<ul>
<li>
<img src="https://www.jqwidgets.com/angular/images/favorites.png" /><span item-title="true">Favorites</span>
<ul>
<li>
<img src="https://www.jqwidgets.com/angular/images/folder.png" /><span item-title="true">ScienceDaily</span>
</li>
</ul>
</li>
<li>
<img src="https://www.jqwidgets.com/angular/images/folder.png" /><span item-title="true">Geek.com</span>
</li>
<li>
<img src="https://www.jqwidgets.com/angular/images/folder.png" /><span item-title="true">CNN.com</span>
</li>
</ul>
</li>
</ul>
</jqxTree>
</div>
</jqxExpander>
</div>
<div>
<jqxSplitter [theme]="'fluent'" #horizontalSplitter [width]="'100%'" [height]="'100%'" [orientation]="'horizontal'"
[panels]="[{ size: 400, min: 100, collapsible: false },{ min: 100, collapsible: true }]">
<div class="feed-item-list-container" id="feedUpperPanel">
<jqxExpander [theme]="'fluent'" class="jqx-hideborder" #feedListExpander
[width]="'100%'" [height]="'100%'"
[toggleMode]="'none'" [showArrow]="false">
<div class="jqx-hideborder" id="feedHeader">
</div>
<div class="jqx-hideborder jqx-hidescrollbars">
<jqxListBox [theme]="'fluent'" #listBoxReference class="jqx-hideborder" (onSelect)="onListBoxSelect($event)"
[width]="'100%'" [height]="'100%'" [source]="['1']">
</jqxListBox>
</div>
</jqxExpander>
</div>
<div id="feedContentArea">
<jqxExpander [theme]="'fluent'" class="jqx-hideborder" #feedContentExpander
[width]="'100%'" [height]="'100%'"
[toggleMode]="'none'" [showArrow]="false">
<div class="jqx-hideborder" id="feedItemHeader">
</div>
<div class="jqx-hideborder jqx-hidescrollbars">
<jqxPanel [theme]="'fluent'" #panelReference class="jqx-hideborder"
[width]="'100%'" [height]="'100%'">
Select a news item to see it"s content
</jqxPanel>
</div>
</jqxExpander>
</div>
</jqxSplitter>
</div>
</jqxSplitter>
import { Component, ViewChild, AfterViewInit, ElementRef } from '@angular/core';
import { map } from 'rxjs/operators';
import {
jqxExpanderModule,
jqxExpanderComponent,
} from 'jqwidgets-ng/jqxexpander';
import { jqxPanelComponent, jqxPanelModule } from 'jqwidgets-ng/jqxpanel';
import { jqxListBoxModule, jqxListBoxComponent } from 'jqwidgets-ng/jqxlistbox';
import { jqxTreeModule, jqxTreeComponent } from 'jqwidgets-ng/jqxtree';
import {
jqxSplitterModule,
jqxSplitterComponent,
} from 'jqwidgets-ng/jqxsplitter';
@Component({
selector: 'app-root',
imports: [
jqxSplitterModule,
jqxTreeModule,
jqxListBoxModule,
jqxPanelModule,
jqxExpanderModule,
],
standalone: true,
templateUrl: './app.component.html',
})
export class AppComponent implements AfterViewInit {
@ViewChild('feedContentExpander') feedContentExpander: jqxExpanderComponent;
@ViewChild('feedListExpander') feedListExpander: jqxExpanderComponent;
@ViewChild('listBoxReference') myListBox: jqxListBoxComponent;
@ViewChild('panelReference') myPanel: jqxPanelComponent;
@ViewChild('treeReference') myTree: jqxTreeComponent;
getWidth(): any {
if (document.body.offsetWidth < 850) {
return '90%';
}
return 850;
}
constructor() {}
ngAfterViewInit(): void {
this.getFeed('sciencedaily');
}
onTreeSelect(event: any): void {
let item = this.myTree.getItem(event.args.element);
this.getFeed(this.config['feeds'][item.label]);
}
onListBoxSelect(event: any): void {
this.loadContent(event.args.index);
}
selectFirst(): void {
this.myListBox.selectIndex(0);
this.loadContent(0);
}
getFeed(feed: any): void {
this.config['currentFeed'] = feed;
if (feed !== undefined) {
feed = this.config['dataDir'] + '/' + feed + '.' + this.config['format'];
this.loadFeed(feed);
}
}
loadFeed(feed: any, callback?: any): void {}
displayFeedHeader(header: string): void {
this.feedListExpander.setHeaderContent(header);
}
displayFeedList(items: any): void {
let headers = this.getHeaders(items);
this.myListBox.source(headers);
}
getHeaders(items: any): any {
let headers = [],
header;
for (let i = 0; i < items.length; i += 1) {
header = items[i].title;
headers.push(header);
}
return headers;
}
loadContent(index: number): void {
let item = this.config['currentFeedContent'][index];
if (item != null) {
this.myPanel.clearcontent();
this.myPanel.prepend(
'<div style="padding: 1px;"><span>' + item.description + '</span></div>'
);
this.addContentHeaderData(item);
this.config['selectedIndex'] = index;
}
}
addContentHeaderData(item: any): void {
let link = document.createElement('a');
link.style.whiteSpace = 'nowrap';
link.style.marginLeft = '15px';
link.target = '_blank';
let text = document.createTextNode('Source');
link.appendChild(text);
let date = document.createElement('div');
date.style.whiteSpace = 'nowrap';
date.style.marginLeft = '30px';
date.appendChild(document.createTextNode(item.pubDate));
let container = <HTMLElement>document.createElement('table');
container.style.height = '100%';
let element1 = <HTMLElement>document.createElement('tr');
container.appendChild(element1);
container.appendChild(document.createElement('td'));
container.appendChild(document.createElement('td'));
link.href = item.link;
(<HTMLElement>document.getElementById('feedItemHeader')).innerHTML = null;
(<HTMLElement>document.getElementById('feedItemHeader')).appendChild(
container
);
container.getElementsByTagName('td')[0].appendChild(link);
container.querySelector('td:last-child').appendChild(date);
this.feedContentExpander.setHeaderContent(container.outerHTML);
}
config: any = {
feeds: {
'CNN.com': 'cnn',
'Geek.com': 'geek',
ScienceDaily: 'sciencedaily',
},
format: 'txt',
dataDir: '../assets',
feedTree: <HTMLElement>document.getElementsByTagName('angularTree')[0],
feedItemHeader: <HTMLElement>document.getElementById('feedItemHeader'),
feedUpperPanel: <HTMLElement>document.getElementById('feedUpperPanel'),
feedHeader: <HTMLElement>document.getElementById('feedHeader'),
feedContentArea: <HTMLElement>document.getElementById('feedContentArea'),
selectedIndex: -1,
currentFeed: '',
currentFeedContent: {},
};
}