# DataTable component Displays data as a table with customizable columns and presentation. ![DataTable demo](../docassets/images/datatable-demo.png) See it live: [DataTable Quickstart](https://embed.plnkr.co/80qr4YFBeHjLMdAV0F6l/) - [Basic usage](#basic-usage) * [Properties](#properties) * [Events](#events) - [Details](#details) * [Customizing columns](#customizing-columns) * [DataTable DOM Events](#datatable-dom-events) * [Custom Empty content template](#custom-empty-content-template) * [Loading content template](#loading-content-template) * [Events](#events-1) + [rowClick event](#rowclick-event) + [rowDblClick event](#rowdblclick-event) + [showRowContextMenu event](#showrowcontextmenu-event) + [showRowActionsMenu event](#showrowactionsmenu-event) + [executeRowAction event](#executerowaction-event) * [Data sources](#data-sources) + [Generate schema](#generate-schema) ## Basic usage **app.component.html** ```html ``` **app.component.ts** ```ts import { ObjectDataTableAdapter } from 'ng2-alfresco-datatable'; @Component({...}) export class DataTableDemo { data: ObjectDataTableAdapter; constructor() { this.data = new ObjectDataTableAdapter( // data [ {id: 1, name: 'Name 1'}, {id: 2, name: 'Name 2'} ], // schema [ { type: 'text', key: 'id', title: 'Id', sortable: true }, { type: 'text', key: 'name', title: 'Name', cssClass: 'full-width', sortable: true } ] ); } } ``` You can also use HTML-based schema declaration like shown below: ```html ``` ```ts import { ObjectDataTableAdapter } from 'ng2-alfresco-datatable'; @Component({...}) export class DataTableDemo { data: ObjectDataTableAdapter; constructor() { this.data = new ObjectDataTableAdapter( // data [ { id: 1, name: 'Name 1', createdBy : { name: 'user'}, createdOn: 123, icon: 'http://example.com/img.png' }, { id: 2, name: 'Name 2', createdBy : { name: 'user 2'}, createdOn: 123, icon: 'http://example.com/img.png' } ] ); } } ``` ### Properties | Name | Type | Default | Description | | --- | --- | --- | --- | | selectionMode | string | 'single' | Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | | rowStyle | string | | The inline style to apply to every row, see [NgStyle](https://angular.io/docs/ts/latest/api/common/index/NgStyle-directive.html) docs for more details and usage examples | | rowStyleClass | string | | The CSS class to apply to every row | | data | DataTableAdapter | instance of **ObjectDataTableAdapter** | data source | | rows | Object[] | [] | The rows that the datatable should show | | multiselect | boolean | false | Toggles multiple row selection, renders checkboxes at the beginning of each row | | actions | boolean | false | Toggles data actions column | | actionsPosition | string (left\|right) | right | Position of the actions dropdown menu. | | fallbackThumbnail | string | | Fallback image for row where thumbnail is missing| | contextMenu | boolean | false | Toggles custom context menu for the component | | allowDropFiles | boolean | false | Toggle file drop support for rows (see **ng2-alfresco-core/UploadDirective** for more details) | | loading | boolean | false | Flag that indicates if the datatable is in loading state and needs to show the loading template. Read the documentation above to see how to configure a loading template | | showHeader | boolean | true | Toggles header visibility | | selection | DataRow[] | [] | Contains selected rows | ### Events | Name | Description | --- | --- | | [rowClick](#rowclick-event) | Emitted when user clicks the row | | [rowDblClick](#rowdblclick-event) | Emitted when user double-clicks the row | | [showRowContextMenu](#showrowcontextmenu-event) | Emitted before context menu is displayed for a row | | [showRowActionsMenu](#showrowactionsmenu-event) | Emitted before actions menu is displayed for a row | | [executeRowAction](#executerowaction-event) | Emitted when row action is executed by user | ## Details ### Customizing columns You can define custom HTML templates for columns and also add tooltips, automatic column title translation and other features. See the DataColumn component page for more information. ### DataTable DOM Events Below are the DOM events raised by DataTable component. These events bubble up the component tree and can be handled by any parent component. | Name | Description | | --- | --- | | row-click | Raised when user clicks a row | | row-dblclick | Raised when user double-clicks a row | | row-select | Raised after user selects a row | | row-unselect | Raised after user unselects a row | For example: ```html ``` ```ts onRowClick(event) { console.log(event); } ``` ![](../docassets/images/datatable-dom-events.png) ### Custom Empty content template You can add a template that will be shown when there are no results in your datatable: ```html

Sorry, no content

``` You can use the empty list component if you want to show the default ADF empty template. You can use any HTML layout or Angular component as a content of the empty template section by using the special `, , ` elements: ```html "'My custom Header'" "'My custom body'" "'My custom footer'" "'HTML Layout'" ``` | Name | Type | Default | Description | --- | --- | --- | --- | | emptyListImageUrl | String | empty_doc_lib.svg | The default image used as background | | emptyMsg | String | This list is empty | The default title message | | dragDropMsg | String | Drag and drop | The default drag and drop message | | additionalMsg | String | Drag and drop | The default additional message | ![](../docassets/images/adf-empty-list.png) ### Loading content template You can add a template that will be shown during the loading of your data: ```html ``` ```js isLoading(): boolean { //your custom logic to identify if you are in a loading state } ``` Note: the `` and `` can be used together ### Events #### rowClick event Emitted when user clicks a row. Event properties: ```ts sender: any // DataTable instance value: DataRow, // row clicked event: Event // original HTML DOM event ``` Handler example: ```ts onRowClicked(event: DataRowEvent) { console.log(event.value); } ``` This event is cancellable, you can use `event.preventDefault()` to prevent default behaviour. #### rowDblClick event Emitted when user double-clicks a row. Event properties: ```ts sender: any // DataTable instance value: DataRow, // row clicked event: Event // original HTML DOM event ``` Handler example: ```ts onRowDblClicked(event: DataRowEvent) { console.log(event.value); } ``` This event is cancellable, you can use `event.preventDefault()` to prevent default behaviour. #### showRowContextMenu event Emitted before context menu is displayed for a row. Note that DataTable itself does not populate context menu items, you can provide all necessary content via handler. Event properties: ```ts value: { row: DataRow, col: DataColumn, actions: [] } ``` Handler example: ```ts onShowRowContextMenu(event: DataCellEvent) { event.value.actions = [ { ... }, { ... } ] } ``` This event is cancellable, you can use `event.preventDefault()` to prevent default behaviour. DataTable will automatically render provided menu items. See the [ContextMenu](https://www.npmjs.com/package/ng2-alfresco-core) documentation for more details on context actions format and behaviour. #### showRowActionsMenu event Emitted before actions menu is displayed for a row. Requires `actions` property to be set to `true`. Event properties: ```ts value: { row: DataRow, action: any } ``` Note that DataTable itself does not populate action menu items, you can provide all necessary content via handler. This event is cancellable, you can use `event.preventDefault()` to prevent default behaviour. #### executeRowAction event Emitted when a row action is executed by the user. Usually accompanies `showRowActionsMenu` event. DataTable itself does not execute actions but provides support for external integration. If there were actions provided with `showRowActionsMenu` event then `executeRowAction` will be automatically executed when user clicks corresponding menu item. ```html ``` ```ts import { DataCellEvent, DataRowActionEvent } from 'ng2-alfresco-datatable'; onShowRowActionsMenu(event: DataCellEvent) { let myAction = { title: 'Hello' // your custom metadata needed for onExecuteRowAction }; event.value.actions = [ myAction ]; } onExecuteRowAction(event: DataRowActionEvent) { let args = event.value; console.log(args.row); console.log(args.action); window.alert(`My custom action: ${args.action.title}`); } ``` ![](../docassets/images/datatable-actions-ui.png) ![](../docassets/images/datatable-actions-console.png) Developers are allowed to use any payloads as row actions. The only requirement for the objects is having `title` property. Once corresponding action is clicked in the dropdown menu DataTable invokes `executeRowAction` event where you can handle the process, inspect the action payload and all custom properties defined earlier, and do corresponding actions. ### Data sources DataTable component gets data by means of data adapter. It is possible having data retrieved from different kinds of sources by implementing a custom `DataTableAdapter` using the following interfaces: ```ts interface DataTableAdapter { selectedRow: DataRow; getRows(): Array; setRows(rows: Array): void; getColumns(): Array; setColumns(columns: Array): void; getValue(row: DataRow, col: DataColumn): any; getSorting(): DataSorting; setSorting(sorting: DataSorting): void; sort(key?: string, direction?: string): void; } interface DataRow { isSelected: boolean; isDropTarget?: boolean; hasValue(key: string): boolean; getValue(key: string): any; cssClass?: string; } interface DataColumn { key: string; type: string; // text|image|date format?: string; sortable?: boolean; title?: string; srTitle?: string; cssClass?: string; template?: TemplateRef; } ``` DataTable provides [ObjectDataTableAdapter](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-alfresco-datatable/src/data/object-datatable-adapter.ts) out-of-the-box. This is a simple data adapter implementation that binds to object arrays and turns object fields into columns: ```ts let data = new ObjectDataTableAdapter( // data [ { id: 1, name: 'Name 1' }, { id: 2, name: 'Name 2' } ], // schema [ { type: 'text', key: 'id', title: 'Id', sortable: true }, { type: 'text', key: 'name', title: 'Name', sortable: true } ] ); ``` #### Generate schema It is possible to auto generate your schema if you have only the data row ```ts let data = [ { id: 2, name: 'abs' }, { id: 1, name: 'xyz' } ]; let schema = ObjectDataTableAdapter.generateSchema(data); /*Auto generated schema value: [ { type: 'text', key: 'id', title: 'Id', sortable: false }, { type: 'text', key: 'name', title: 'Name', sortable: false } ] */ ```