Installation
npm i @i-cell/data-table
Requirements
The table supports Angular v13.1.3 currently.
In order to use the table, you need to install these dependencies:
| Package | Command to install | Current version |
|---|---|---|
| Angular material * | npm i @angular/material |
13.1.3 |
| Angular CDK | npm i @angular/cdk |
13.1.3 |
| ngx-translate | npm i ngx-translate |
14.0.0 |
| ngx-webstorage | npm i ngx-webstorage |
9.0.0 |
*if you need to add Angular Material to an existing project, make sure
to load the required material palettes in your styles.scss for the
Material theme as well. For example:
@import '~@angular/material/theming';
@include mat-core();
$candy-app-primary: mat-palette($mat-deep-purple);
$candy-app-accent: mat-palette($mat-pink, A200, A100, A400);
$candy-app-warn: mat-palette($mat-red);
$candy-app-theme: mat-light-theme(
$candy-app-primary,
$candy-app-accent,
$candy-app-warn
);
@include angular-material-theme($candy-app-theme);
Usage
Configuration
The table uses materialdesignicons svg icon, you will need to download
the latest mdi.svg from
here.
Place the downloaded svg inside the assets/ folder of your
application.
If you structure your assets/ folder in a specific way, you have the
option to set the path of the svg, while you import the module.
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { DataTableModule } from '@icell/widget-data-table';
import { MatTableModule } from '@angular/material/table';
import { TranslateModule } from '@ngx-translate/core';
import { NgxWebstorageModule } from 'ngx-webstorage';
...
const pathToSvg: string = 'assets/path-to-svg/mdi.svg';
@NgModule({
...
imports: [
...
BrowserAnimationsModule
DataTableModule.forRoot(pathToSvg),
MatTableModule,
TranslateModule.forRoot(),
NgxWebstorageModule.forRoot(),
...
],
...
})
export class Module {
...
}
General
Column settings
| Property | Type | Optional | Default | Description |
|---|---|---|---|---|
field |
|
Path to field that should be rendered. |
||
orderName |
|
Custom ordering parameter. |
||
valueFormatter |
|
Callback to transform the cell’s data. |
||
valueGetter |
|
Callback to transform the row model. |
||
label |
|
'' |
Column label; can be a localization key. |
|
hideable |
|
false |
Defines if the column is hideable. |
|
visible |
|
true |
Defines if the column is visible. If used with hideable, the column will be in the column menu unchecked. |
|
actionColumn |
|
Defines if the column is for actions. |
||
sortable |
|
true |
Defines if the column should be sortable. |
|
sticky |
|
Defines if the column should be sticky at the begining of the table. |
||
stickyEnd |
|
Defines if the column should be sticky at the end of the table. |
||
template |
|
|
Defines how the cell should be rendered. If |
|
component |
any |
Defines what component to use to render the cell. Use with |
||
componentOptions |
ComponentOptions |
Provide input, output bindings for the component rendered in the cell. Use with |
||
parent |
any |
Defines what component to use to render the cell. Use with |
||
identifier |
boolean |
Defines if the cell should render as header for a11y reasons. |
||
columnClasses |
boolean |
Defines custom |
||
cellClasses |
boolean |
Defines custom |
||
sortButtonAriaLabel |
string |
Custom aria label for sort button. |
The template field can have the following values:
'labelTemplate''labelBoldTemplate''numericTemplate''iconTemplate''componentTemplate'
some.ts.
...
this.columnSettings: DataTableColumnDefinition[] = [
{
field: 'atomicNumber',
label: 'position',
sortable: true,
hideable: true,
visible: true,
columnClass: 'table__atomic-numbers_bold',
},
{
field: 'type',
label: 'Item type',
valueFormatter: (type) => ('ITEM_TYPES.' + type)
sortable: true,
hideable: true,
visible: true,
},
{
label: 'name',
sortable: true,
template: 'labelBoldTemplate',
hideable: true,
visible: true,
identifier: true,
},
{
label: 'weight',
valueGetter: (item) => (item.type === 'NET' ? item.netWeight : item.grossWeight)
template: 'numericTemplate',
sortable: true,
hideable: true,
visible: true,
},
{
field: 'symbol',
label: 'symbol',
sortable: true,
hideable: true,
visible: true,
},
{
field: 'actions',
label: 'actions',
sortable: false,
hideable: false,
visible: true,
stickyEnd: true,
template: 'componentTemplate',
component: RowActionComponent,
componentOptions: {
inputs: {
// In RowActionComponent: `@Input() icon: string;`
icon: 'details'
},
outputs: {
// In RowActionComponent: `@Output() clicked = new EventEmitter<RowDataType>();`
clicked: (rowData: RowDataType) => {
// Do something
}
}
}
},
];
...
Table settings
| Attribute | Binding | Type | Optional | Default | Description |
|---|---|---|---|---|---|
| name | @Input |
string |
'' |
Name of the table. | |
| caption | @Input |
string |
'' |
Caption of the table. | |
| dataSource | @Input |
any[] | ServerSideDataSource | MatTableDataSource |
[] |
DataSource. | |
| columnSettings | @Input |
DataTableColumnDefinition[] |
Column settings. | ||
| detailTemplate | @Input |
ngTemplateRef |
#defaultTemplate |
Custom user defined detail view | |
| showDetails | @Input |
boolean |
false |
Flag indicating to render with detail rows. | |
| hasNoRowsToShowOverlayNoBelow | @Input |
boolean |
false |
Flag indicating to render no data row in the table or below the table. | |
| useSelection | @Input |
boolean |
false |
Flag to render with checkboxes for multiselect rows. | |
| hideSelectParameter | @Input |
string |
Parameter name, a row[hideSelectParameter] value will hide / enable the select checkbox on the given row, if used with useSelection. | ||
| color | @Input |
ThemePalette |
primary |
Use this palette for mat elements. | |
| showColumnMenu | @Input |
boolean |
false |
Flag to render column menu. | |
| hasSorting | @Input |
boolean |
false |
Flag to enable sorting. | |
| fixedHeader | @Input |
boolean |
false |
Flag to have sticky header. | |
| hasExtColMenu | @Input |
boolean |
false |
Flag to use external column menu. | |
| detailClosedIcon | @Input |
string |
chevron-right |
Icon to use for closed details. | |
| detailOpenIcon | @Input |
string |
chevron-down |
Icon to use for opened details. | |
| sortingNoSort | @Input |
string |
sort |
Icon to use for no sort active. | |
| sortingAsc | @Input |
string |
sort-ascending |
Icon to use for sort ascending. | |
| sortingDesc | @Input |
string |
sort-descending |
Icon to use for sort descending. | |
| rowClass | @Input |
function |
() ⇒ '' |
Dynamically set per-row CSS class. | |
| evenRowClass | @Input |
string |
Dynamically set even row CSS class. | ||
| oddRowClass | @Input |
string |
Dynamically set odd row CSS class. | ||
| headerClass | @Input |
srting |
Defines the class used by thead > tr. |
||
| detailStickyColumns | @Input |
boolean |
If set true the detail row will reflect the same sticky column structure. | ||
| rowClick | @Output |
RowClickEvent |
Emitted row click event. | ||
| cellClick | @Output |
CellClickEvent |
Emitted cell click event. | ||
| rowKeyDown | @Output |
RowKeyDownEvent |
Emitted row onkeydown event. | ||
| columnSelectionChange | @Output |
ColumnSelectionEvent |
Emitted column selection event. |
Important: since Ivy, the order of the properties matter. Try to set up
flags first, and more complex parameters later. (e.g. showDetails
before dataSource)
some.html.
<ic-data-table
[name]="'table'"
[columnSettings]="columnSettings"
[detailTemplate]="detailTemplate"
[showDetails]="showDetails"
[useSelection]="useSelection"
[showColumnMenu]="showColumnMenu"
[hasSorting]="hasSorting"
[fixedHeader]="fixedHeader"
[dataSource]="dataSource"
(rowClick)="rowClick($event)"
(cellClick)="cellClick($event)"
(columnSelectionChange)="columnSelectionChange($event)"
></ic-data-table>
Table functions
You can call the following functions directly after selecting the table
with @ViewChild(DataTableComponent, { static: true }):
expandAll(): Opens up all details, if providedcollapseAll(): Closes every opened detail view
Custom Sorting
The table contains a built-in, custom, MatSort-based sorting for client-
and serverside as well. It’s plugged in onto the datasource of the
table (which you can provide). If you wish to overwrite it (for
instance, use your own DataSource and a query-based sorting), you can
use the following code to modify or remove the default sorting
mechanism:
this.yourCustomDatasource.sortData = (data: any[], sort: MatSort) => {
console.log("sort information: ", sort);
// implement your sort logic here
};
DataSource configuration
some.server-side-datasource.ts.
...
this.data = new ServerSideDataSource(
this.getStaticData.bind(this),
'list',
this.paginationParams,
this.table.sort,
this.table.rowSelection,
this.paginatorIntl,
this.cdRef,
this.withDetail,
false
);
...
some.client-side-datasource.ts.
...
this.data = new MatTableDataSource([]);
...
Localization
For translation we utilize @ngx-translate.
ICELL_DATA_TABLE.SORT_BUTTON_LABELused for localizinguses 2 input properties:
idrepresents the columns locale_keydirection:ICELL_DATA_TABLE.SORT_NONEused if no sort is setICELL_DATA_TABLE.SORT_ASCused if sort is ascendingICELL_DATA_TABLE.SORT_DESCused if sort is descending
{
...
"ICELL_DATA_TABLE": {
"SORT_BUTTON_LABEL": "Change sorting for {{id}}, {{direction}}.",
"SORT_NONE": "no sorting",
"SORT_ASC": "sorting ascending",
"SORT_DESC": "sorting descending",
"NOROWSTOSHOW": "No data present.",
"EMPTY_CELL": "-"
}
...
}
Examples
Live StackBlitz example
StackBlitz reference implementation can be found here.
Run example project
Delete the one line (//registry.npmjs.org/:_authToken=${NPM_TOKEN})
from .npmrc file in your project, if you want to build on a local
environment.
# Build and pack a local version
npm run pack
# Switch directories
cd ./examples/icell-data-table-example/
# Edit the package.json to have the proper path to the tgz
# "@i-cell/data-table": "file:../../i-cell-data-table-<version>.tgz",
# Install dependencies
npm i
# Start up the example
npm start
If no issues emerge the application should up and running, so you can start to experiment.