Angular Splitter Component

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.

1. Installation

The easiest way to get started with jQWidgets UI for Angular is to use the Angular CLI Tool. To scaffold your project structure, follow its installation instructions.

npm install -g @angular/cli
ng new jqwidgets-project
cd jqwidgets-project

Install jQWidgets

jQWidgets Angular UI comes packaged with Angular CLI schematics to make creating Angular applications easier. Schematics are included with both @angular/cdk and jqwidgets-ng. Once you install the npm packages, they will be available through the Angular CLI.

Angular CLI supports the addition of packages through the ng add command. The ng add command provides faster and more user-friendly package installation. To install the jQWidgets UI for Angular package, use ng add and add the name of the NPM package:

ng add jqwidgets-ng

Alternatively, you can use the standard installation (Manual Setup)

jQWidgets UI for Angular is distributed as jqwidgets-ng NPM package

  1. Download and install the package.
    npm install jqwidgets-ng
  2. Adding CSS reference

    The following CSS file is available in ../node_modules/jqwidgets-ng/ package folder. This can be referenced in [src/styles.css] using following code.

    @import 'jqwidgets-ng/jqwidgets/styles/jqx.base.css';

    Another way to achieve the same is to edit the angular.json file and in the styles add the style.

    "styles": [
    	"node_modules/jqwidgets-ng/jqwidgets/styles/jqx.base.css"
    ]
    

2. Add the HTML for jQWidgets component in src/app/app.component.html

app.component.html


<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>	

3. Setup Component Logic

app.component.ts


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: {},
  };
}

Summary

jQWidgets UI for Angular provides an easy way to integrate robust UI components into your Angular project. By using either the ng add command or manual setup, you can quickly get started. Once the setup is complete, you can add the desired jQWidgets components and configure them in your Angular components to match your application requirements.

Splitter API

API Reference of the jQWidgets Splitter component for Angular: Splitter API