Ionic 5 data table with ionic grid, angular material and ngx-datatable with live demo and source code (git repo), you will get everything in this post.
In this tutorial we are going to learn following things,
We can create a basic table with an ionic grid. As we know grid means combination of columns and rows which can help us to create a data table.
<ion-header [translucent]="true">
<ion-toolbar [class]="tableHeader">
<ion-title>
Ionic Grid
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Tab 1</ion-title>
</ion-toolbar>
</ion-header>
<ion-list>
<ion-list-header lines="inset">
<ion-label class="ion-text-bold">Change Table Header</ion-label>
</ion-list-header>
<ion-item>
<ion-button (click)="changeTableHeader('dark')" color="dark">Dark</ion-button>
<ion-button (click)="changeTableHeader('blue')" color="primary">Blue</ion-button>
<ion-button (click)="changeTableHeader('red')" color="danger">Red</ion-button>
</ion-item>
<ion-list-header>
<ion-label class="ion-text-bold">Change Table Theme</ion-label>
</ion-list-header>
<ion-item>
<ion-select (ionChange)="changeTableTheme($event)" value="ion-border">
<ion-select-option value="ion-border" selected>Basic Table</ion-select-option>
<ion-select-option value="bootstrap-table">Bootstrap Table</ion-select-option>
</ion-select>
</ion-item>
</ion-list>
<ion-grid [class]="tableTheme">
<ion-row [class]="tableHeader">
<ion-col class="ion-text-bold"> Name </ion-col>
<ion-col class="ion-text-bold"> Gender </ion-col>
<ion-col class="ion-text-bold"> Company </ion-col>
</ion-row>
<ion-row *ngFor="let item of records">
<ion-col>{{ item?.name }}</ion-col>
<ion-col>{{ item?.gender }}</ion-col>
<ion-col>{{ item?.company }}</ion-col>
</ion-row>
</ion-grid>
</ion-content> We are using demo data from the following api.
https://swimlane.github.io/ngx-datatable/assets/data/company.json We have created a dynamic table header and table theme. So, You can change the table header colors and table main theme in the given demo.
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-tab1',
templateUrl: 'tab1.page.html',
styleUrls: ['tab1.page.scss']
})
export class Tab1Page implements OnInit {
records: any;
tableHeader: string = 'header-dark';
tableTheme: string = 'ion-border';
constructor() {}
ngOnInit() {
fetch('https://swimlane.github.io/ngx-datatable/assets/data/company.json').then(res => res.json())
.then(json => {
console.log(json);
this.records = json;
});
}
changeTableHeader( color: string ) {
this.tableHeader = 'header-'+color;
}
changeTableTheme( event: any ) {
console.log(event);
this.tableTheme = event.target.value;
}
}
We have created some css for table styling as below,
.ion-text-bold {
font-weight: bold;
}
.ion-border ion-row:first-child {
border: 1px solid;
}
.ion-border ion-row:not(:first-child) {
border-bottom: 1px solid;
border-left: 1px solid;
border-right: 1px solid;
}
.ion-border ion-row ion-col:not(:last-child) {
border-right: 1px solid;
}
.bootstrap-table ion-row:nth-child(2n) {
background: #d7d7d7;
border-top: 1px solid #b3afaf;
border-bottom: 1px solid #b3afaf;
}
.bootstrap-table ion-row {
border-left: 1px solid #b3afaf;
border-right: 1px solid #b3afaf;
}
.header-blue {
background: #0000ff;
--background: #0000ff;
color: white;
}
.header-red {
background: #b80303;
--background: #b80303;
color: white;
}
.header-dark {
background: #080808;
--background: #080808;
color: white;
} Our second tab is the angular material table. You can check the official documentation of angular material table.
It has following features,
It’s an amazing datatable, which is easy to integrate and it has enough features that are usually required by the datatable purpose.
Run the following command to install the angular material to your existing project.
ng add @angular/material Now we can import the required component to our ionic page. For example, we have used MatPaginator, MatTableDataSource, and MatSort to build this angular material data table.
The following process is required to use any angular material component.
We have imported the MatTableModule, MatPaginatorModule, MatSortModule, MatInputModule file to the tab2.module.ts.
import { IonicModule } from '@ionic/angular';
import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Tab2Page } from './tab2.page';
import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
import { Tab2PageRoutingModule } from './tab2-routing.module';
import {MatTableModule} from '@angular/material/table';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatSortModule } from '@angular/material/sort';
import {MatInputModule} from '@angular/material/input';
@NgModule({
imports: [
IonicModule,
CommonModule,
FormsModule,
ExploreContainerComponentModule,
Tab2PageRoutingModule,
MatTableModule,
MatPaginatorModule,
MatSortModule,
MatInputModule,
],
declarations: [Tab2Page]
})
export class Tab2PageModule {}
Then we could use material components in our page file tab2.page.ts.
import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatTableDataSource } from '@angular/material/table';
import {MatSort} from '@angular/material/sort';
@Component({
selector: 'app-tab2',
templateUrl: 'tab2.page.html',
styleUrls: ['tab2.page.scss']
})
export class Tab2Page implements AfterViewInit, OnInit {
displayedColumns: string[] = ['name', 'gender', 'company'];
records = new MatTableDataSource;
length: number = 0;
pageSize = 5;
pageSizeOptions: number[] = [5, 10, 25, 100];
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
constructor() {}
ngOnInit() {
}
ngAfterViewInit() {
fetch('https://swimlane.github.io/ngx-datatable/assets/data/company.json').then(res => res.json())
.then(json => {
this.records.data = json;
this.length = this.records.data.length;
this.records.paginator = this.paginator;
this.records.sort = this.sort;
});
}
applyFilter(event: Event) {
const filterValue = (event.target as HTMLInputElement).value;
this.records.filter = filterValue.trim().toLowerCase();
if (this.records.paginator) {
this.records.paginator.firstPage();
}
}
}
The ngx-datatable package is also very useful for developing ionic tables with the same features as explained in the above angular material example.
Run the following npm command to install the ngx-datatable package.
npm i @swimlane/ngx-datatable --save Now, import the NgxDatatableModule to your module file, in our case it is tab3.module.ts.
import { IonicModule } from '@ionic/angular';
import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Tab3Page } from './tab3.page';
import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
import { Tab3PageRoutingModule } from './tab3-routing.module';
import { NgxDatatableModule } from '@swimlane/ngx-datatable';
@NgModule({
imports: [
IonicModule,
CommonModule,
FormsModule,
ExploreContainerComponentModule,
RouterModule.forChild([{ path: '', component: Tab3Page }]),
Tab3PageRoutingModule,
NgxDatatableModule
],
declarations: [Tab3Page]
})
export class Tab3PageModule {}
Then we can import and use ColumnMode, DatatableComponent to our page file which is tab3.page.ts.
import { Component, OnInit, ViewChild } from '@angular/core';
import { ColumnMode, DatatableComponent } from '@swimlane/ngx-datatable';
@Component({
selector: 'app-tab3',
templateUrl: 'tab3.page.html',
styleUrls: ['tab3.page.scss']
})
export class Tab3Page implements OnInit {
rows = [];
temp = [];
columns = [{ prop: 'name' }, { name: 'Company' }, { name: 'Gender' }];
@ViewChild(DatatableComponent) table: DatatableComponent;
ColumnMode = ColumnMode;
tableTheme: string = 'material';
constructor() {}
ngOnInit() {
fetch('https://swimlane.github.io/ngx-datatable/assets/data/company.json')
.then(res => res.json())
.then(json => {
this.temp = [...json];
this.rows = json;
});
}
updateFilter(event) {
console.log(this.table);
const val = event.target.value.toLowerCase();
// filter our data
const temp = this.temp.filter(function (d) {
return (d.name.toLowerCase().indexOf(val) !== -1 ||
d.gender.toLowerCase().indexOf(val) !== -1 ||
d.company.toLowerCase().indexOf(val) !== -1) || !val;
});
// update the rows
this.rows = temp;
// Whenever the filter changes, always go back to the first page
this.table.offset = 0;
}
changeTableTheme( event : any ) {
this.tableTheme = event.target.value;
}
}
We will also need the styling of ngx-datatable and for that we need to import ngx-datatable package’s css files to our global.scss file.
@import "~@swimlane/ngx-datatable/index.css"; @import "~@swimlane/ngx-datatable/assets/app.css"; @import "~@swimlane/ngx-datatable/themes/dark.css"; @import "~@swimlane/ngx-datatable/themes/bootstrap.css"; @import "~@swimlane/ngx-datatable/themes/material.css"; @import "~@swimlane/ngx-datatable/assets/icons.css";
After all of this, everything seemed perfect but one thing was wrong, that was table width and it was coming from the package css files.
So, let’s override that css in our style.scss file
/* ngx-datatable */.ngx-datatable,
.info {
text-align: left;
width: 95%;
margin: 0 auto;
} More Ionic Tutorial: Ionic 5 Shopping cart app with product listing, cart, product filtering, searching, sorting etc.
Hope you find this tutorial useful.
See you in the next learning journey.
Today we are going to learn about managing multiple PHP versions on ubuntu with xampp.…
Let's understand about how to use coding to improve your website's SEO. In today’s computerized…
Let's understand the most important linux commands for web developers. Linux, as an open-source and…
Today we are going to discuss top 75+ Laravel interview questions asked by top MNCs.Laravel,…
Today we will discuss about the Mailtrap integration with laravel 10 .Sending and receiving emails…
Today we are going to integrate FCM (Firebase Cloud Messaging) push notifications with ionic application.Firebase…