https://github.com/i-cell-mobilsoft-open-source/icell-data-table
Data Table Component
https://github.com/i-cell-mobilsoft-open-source/icell-data-table
angular datatables table typescript
Last synced: about 1 year ago
JSON representation
Data Table Component
- Host: GitHub
- URL: https://github.com/i-cell-mobilsoft-open-source/icell-data-table
- Owner: i-Cell-Mobilsoft-Open-Source
- License: mit
- Created: 2020-10-14T07:11:38.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2024-10-01T07:53:42.000Z (over 1 year ago)
- Last Synced: 2024-10-01T11:53:46.286Z (over 1 year ago)
- Topics: angular, datatables, table, typescript
- Language: TypeScript
- Homepage:
- Size: 4.58 MB
- Stars: 7
- Watchers: 12
- Forks: 0
- Open Issues: 24
-
Metadata Files:
- Readme: README.adoc
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
:source-highlighter: highlightjs
:highlightjs-languages: javascript, xml, css, bash, typescript
:icons: font
# ICELL-DATA-TABLE
image:https://img.shields.io/github/license/i-Cell-Mobilsoft-Open-Source/icell-data-table[link="https://github.com/i-Cell-Mobilsoft-Open-Source/icell-data-table/blob/main/LICENSE", License] image:https://img.shields.io/npm/v/@i-cell/data-table[link="https://www.npmjs.com/package/@i-cell/data-table", npm] image:https://img.shields.io/npm/dt/@i-cell/data-table[npm] image:https://github.com/i-Cell-Mobilsoft-Open-Source/icell-data-table/workflows/CI/badge.svg[Build]
## Installation
[source, bash, subs="verbatim,quotes"]
----
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
IMPORTANT: The table uses `materialdesignicons` svg icon, you will need to download the latest `mdi.svg` from https://materialdesignicons.com/api/download/angularmaterial/38EF63D0-4744-11E4-B3CF-842B2B6CFE1B[here]. Place the downloaded svg inside the `assets/` folder of your application.
NOTE: 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.
[source, typescript, subs="verbatim,quotes"]
----
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 | `string` | ❌ | | Path to field that should be rendered.
| orderName | `string` | ✔️ | | Custom ordering parameter.
| valueFormatter | `function` | ✔️ | | Callback to transform the cell's data.
| valueGetter | `function` | ✔️ | | Callback to transform the row model.
| label | `string` |✔️ | '' | Column label; can be a localization key.
| hideable | `boolean` | ✔️ | false | Defines if the column is hideable.
| visible | `boolean` | ✔️ | true | Defines if the column is visible. If used with hideable, the column will be in the column menu unchecked.
| actionColumn | `boolean` | ✔️ | | Defines if the column is for actions.
| sortable | `boolean` | ✔️ | true | Defines if the column should be sortable.
| sticky | `boolean` | ✔️ | | Defines if the column should be sticky at the begining of the table.
| stickyEnd | `boolean` | ✔️ | | Defines if the column should be sticky at the end of the table.
| template | `string` | ✔️ | `'labelTemplate'` | Defines how the cell should be rendered.
If `componentTemplate` is used you must define the `component` property as well.
| component | any | ✔️ | | Defines what component to use to render the cell.
Use with `template = 'componentTemplate'`.
| componentOptions | ComponentOptions | ✔️ | | Provide input, output bindings for the component rendered in the cell.
Use with `template = 'componentTemplate'`.
| parent | any | ✔️ | | Defines what component to use to render the cell.
Use with `template = 'componentTemplate'`.
| identifier | boolean | ✔️ | | Defines if the cell should render as header for a11y reasons.
| columnClasses | boolean | ✔️ | | Defines custom `CSS` class for the column it self.
| cellClasses | boolean | ✔️ | | Defines custom `CSS` class for the column cells.
| sortButtonAriaLabel | string | ✔️ | | Custom aria label for sort button.
|===
[NOTE]
====
The `template` field can have the following values:
* `'labelTemplate'`
* `'labelBoldTemplate'`
* `'numericTemplate'`
* `'iconTemplate'`
* `'componentTemplate'`
====
[source, javascript]
.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();`
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`)
[source, xml]
.some.html
----
----
==== Table functions
You can call the following functions directly after selecting the table with `@ViewChild(DataTableComponent, { static: true })`:
* `expandAll()` : Opens up all details, if provided
* `collapseAll()`: 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
[source, javascript]
.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
);
...
----
[source, javascript]
.some.client-side-datasource.ts
----
...
this.data = new MatTableDataSource([]);
...
----
=== Localization
For translation we utilize `@ngx-translate`.
* `ICELL_DATA_TABLE.SORT_BUTTON_LABEL` used for localizing
** uses 2 input properties:
*** `id` represents the columns locale_key
*** `direction`:
**** `ICELL_DATA_TABLE.SORT_NONE` used if no sort is set
**** `ICELL_DATA_TABLE.SORT_ASC` used if sort is ascending
**** `ICELL_DATA_TABLE.SORT_DESC` used if sort is descending
[source, json]
----
{
...
"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
https://stackblitz.com/edit/icell-datatable-demo-angular11[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.
[source, bash]
----
# 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-.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.