Angular UI Components Documentation

Angular Pivot Grid Component

The Pivot Grid component for Angular is a lightweight and powerful data visualization widget.
It allows visualization of multi-dimensional and hierarchical data structures.

It also ships with a Pivot Table Designer widget. The Pivot Table Designer allows you to visually configure the pivot columns, rows, aggregated values and multiple different settings. You can also configure pivot rows and columns text alignment settings and various text formatting options on the pivot cells.

Before you start with the Pivot Grid widget, you should be familiar with pivot tables and understand when to use regular data grids to display table data, and when to switch to the pivot grid and pivot tables. The following article is a good entry-level introduction to pivot tables: Wikipedia: Pivot table

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


<jqxPivotGrid #pivotGrid1
        [width]="getWidth()" 
        [height]="400"
        [source]="pivotDataSource"
        [treeStyleRows] = "true"
        [autoResize] = "false"
        [multipleSelectionEnabled] = "true"
        (onPivotitemexpanding)="eventHandler1($event)"
        (onPivotitemcollapsing)="eventHandler1($event)"
        (onPivotitemexpanded)="eventHandler1($event)"
        (onPivotitemcollapsed)="eventHandler1($event)"
        (onPivotitemselectionchanged)="eventHandler1($event)" 
        (onSortchanging)="eventHandler1($event)" 
        (onSortchanged)="eventHandler1($event)" 
        (onSortremoving)="eventHandler1($event)" 
        (onSortremoved)="eventHandler1($event)"	 
	 
        (onPivotitemmouseup)="eventHandler2($event)"	 
        (onPivotitemmousedown)="eventHandler2($event)"	 
        (onPivotitemclick)="eventHandler2($event)"	 
        (onPivotitemdblclick)="eventHandler2($event)"	 
	 
        (onPivotcellmouseup)="eventHandler3($event)"	 
        (onPivotcellmousedown)="eventHandler3($event)"	 
        (onPivotcellclick)="eventHandler3($event)"	 
        (onPivotcelldblclick)="eventHandler3($event)"	 
	 >
</jqxPivotGrid>
<br />
<jqxTextArea [theme]="'fluent'" #eventsLog
        [width]="getWidth()" 
        [height]="100"
	 >
</jqxTextArea>
<br />
<jqxButton [theme]="'fluent'" [width]="90" (onClick)="onClearLog()">Clear Log</jqxButton>

	

3. Setup Component Logic

app.component.ts


import { Component, AfterContentInit, ViewChild, AfterViewInit } from '@angular/core';

import { jqxTextAreaComponent, jqxTextAreaModule } from 'jqwidgets-ng/jqxtextarea';
import { jqxButtonComponent, jqxButtonModule } from 'jqwidgets-ng/jqxbuttons';

import { jqxWindowComponent, jqxWindowModule } from 'jqwidgets-ng/jqxwindow';
import { jqxDataTableComponent, jqxDataTableModule } from 'jqwidgets-ng/jqxdatatable';

import { jqxPivotDesignerComponent } from 'jqwidgets-ng/jqxpivotgrid';
import { jqxPivotGridModule, jqxPivotGridComponent } from 'jqwidgets-ng/jqxpivotgrid';

@Component({
	selector: 'app-root',
	imports: [jqxPivotGridModule, jqxTextAreaModule, jqxButtonModule, jqxWindowModule, jqxDataTableModule],
	standalone: true,
	templateUrl: './app.component.html',
	styleUrls: ['./app.component.css']
})

export class AppComponent {
   @ViewChild('pivotGrid1') pivotGrid1: jqxPivotGridComponent;
   @ViewChild('eventsLog') eventsLog: jqxTextAreaComponent;

   constructor() {
      this.pivotDataSource = this.createPivotDataSource();
   }

   getWidth(): any {
      if (document.body.offsetWidth < 850) {
         return '90%';
      }

      return 850;
   }

   ngAfterViewInit(): void {
   }

   pivotDataSource: null;

   createPivotDataSource(): any {
      // prepare sample data
      let data = new Array();

      let firstNames =
         [
            "Andrew", "Nancy", "Shelley", "Regina", "Yoshi", "Antoni", "Mayumi", "Ian", "Peter", "Lars", "Petra", "Martin", "Sven", "Elio", "Beate", "Cheryl", "Michael", "Guylene"
         ];

      let lastNames =
         [
            "Fuller", "Davolio", "Burke", "Murphy", "Nagase", "Saavedra", "Ohno", "Devling", "Wilson", "Peterson", "Winkler", "Bein", "Petersen", "Rossi", "Vileid", "Saylor", "Bjorn", "Nodier"
         ];

      let productNames =
         [
            "Black Tea", "Green Tea", "Caffe Espresso"
         ];

      let priceValues =
         [
            "2.25", "1.5", "3.0", "3.3", "4.5", "3.6", "3.8", "2.5", "5.0", "1.75", "3.25", "4.0"
         ];

      for (let i = 0; i < 500; i++) {
         let row = {};
         let productindex = Math.floor(Math.random() * productNames.length);
         let price = parseFloat(priceValues[productindex]);
         let quantity = 1 + Math.round(Math.random() * 10);

         row["firstname"] = firstNames[Math.floor(Math.random() * firstNames.length)];
         row["lastname"] = lastNames[Math.floor(Math.random() * lastNames.length)];
         row["productname"] = productNames[productindex];
         row["price"] = price;
         row["quantity"] = quantity;
         row["total"] = price * quantity;

         data[i] = row;
      }

      // create a data source and data adapter
      let source =
      {
         localdata: data,
         datatype: "array",
         datafields:
            [
               { name: 'firstname', type: 'string' },
               { name: 'lastname', type: 'string' },
               { name: 'productname', type: 'string' },
               { name: 'quantity', type: 'number' },
               { name: 'price', type: 'number' },
               { name: 'total', type: 'number' }
            ]
      };

      let dataAdapter = new jqx.dataAdapter(source);
      dataAdapter.dataBind();

      // create a pivot data source from the dataAdapter
      let pivotDataSource = new jqx.pivot(
         dataAdapter,
         {
            pivotValuesOnRows: false,
            totals: { rows: { subtotals: true, grandtotals: true }, columns: { subtotals: false, grandtotals: true } },
            rows: [{ dataField: 'firstname' }, { dataField: 'lastname' }],
            columns: [{ dataField: 'productname' }],
            values: [
               { dataField: 'price', 'function': 'sum', text: 'sum', formatSettings: { prefix: '$', decimalPlaces: 2 } },
               { dataField: 'price', 'function': 'count', text: 'count' },
               { dataField: 'price', 'function': 'average', text: 'average', formatSettings: { prefix: '$', decimalPlaces: 2 } }
            ]
         }
      );

      return pivotDataSource;
   }

   eventHandler1(event: any): void {
      var args = event.args;
      var t = new Date();
      var timeString = t.getHours() + ":" + t.getMinutes() + ":" + t.getSeconds() + ":" + t.getMilliseconds();

      var eventData = 'Time: ' + timeString + ' Event: ' + event.type + ', pivotItem: ' + args.pivotItem.text;
      if (event.type == 'itemselectionchanged')
         eventData += ', Selected: ' + args.selected;

      eventData += "\r\n";
      this.eventsLog.val(eventData + this.eventsLog.val());
   }

   eventHandler2(event: any): void {
      var t = new Date();
      var timeString = t.getHours() + ":" + t.getMinutes() + ":" + t.getSeconds() + ":" + t.getMilliseconds();

      var eventData = 'Time: ' + timeString + ' Event: ' + event.type + ', pivotItem: ' + event.args.pivotItem.text + ', mousebutton: ' + event.args.mousebutton;

      eventData += "\r\n";
      this.eventsLog.val(eventData + this.eventsLog.val());
   }

   eventHandler3(event: any): void {
      var t = new Date();
      var timeString = t.getHours() + ":" + t.getMinutes() + ":" + t.getSeconds() + ":" + t.getMilliseconds();

      var eventData = 'Time: ' + timeString + ' Event: ' + event.type + ', pivot row: ' + event.args.pivotRow.text + ', pivot column: ' + event.args.pivotColumn.text + ', mousebutton: ' + event.args.mousebutton;

      eventData += "\r\n";
      this.eventsLog.val(eventData + this.eventsLog.val());
   }

   onClearLog(): void {
      this.eventsLog.val("");
   }
}

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.

PivotGrid API

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