npm i md-data-table


Angular data table complete implementation of google material design based on Angular Material components.

by Istvan Fodor

2.2.0 (see all)License:MITTypeScript:Not Found
npm i md-data-table

Live demo

Angular material table. Complete implementation of google material design based on angular material components. This component is optimized for speed, and it's faster then other similar implementations, since it generates a native html table, and browsers are optimized for tables.

Angular2 and Angular2 Material version of this plugin is under development. If you want to be notified for the first release, please star the project here: md-data-table2

Usage statistics


Build Status Code Climate Test Coverage Dependency Status Codacy Badge


  1. bower install md-data-table or npm install md-data-table or download the source.
  2. Make sure the mdDataTable (notice the camelCase typing) lib is loaded. It's served in three different files: md-data-table-style.css, md-data-table.js, md-data-table-templates.js
  3. Add mdDataTable as a dependency of your app.

Load it from CDN (with example of version 1.8.0)

UI&UX driven by google data table

Table of contents


Table attributes

  • selectable-rows
  • virtual-repeat
  • delete-row-callback
  • selected-row-callback
  • animate-sort-icon
  • ripple-effect
  • ! title-overflow-handler
  • table-card
  • paginated-rows
  • alternate-headers
  • mdt-row
  • mdt-row-paginator
  • mdt-row-paginator-error-message
  • mdt-row-paginator-no-results-message
  • mdt-trigger-request
  • mdt-translations
  • mdt-loading-indicator

Column attributes (mdt-column)

  • align-rule
  • column-definition
  • column-filter
  • exclude-from-column-selector
  • hide-column-by-default

Row attributes (mdt-row)

  • table-row-id

Cell attributes (mdt-cell)

  • ! inline-menu
  • editable-field
  • html-content

Custom cell content (mdt-custom-cell)

  • column-key


In its simplest form, a data table contains a top row of column names, and rows for data.

A selected table row

Table attributes

Global attributes for the table

selectable-rowsBooleanoptional, checkboxes accompany each row if need to select or manipulate data
virtual-repeatBooleanoptional, when set, virtual scrolling will be applied to the table. You must set a fixed height to the .md-virtual-repeat-container class in order to make it work properly. Since virtual scrolling is working with fixed height.
delete-row-callbackFunctionoptional, callback function when deleting rows. The callback will be called with the array of the deleted row ids. Don't forget to specify table-row-id for mdt-row. If you do, it will return the deleted rows data.
selected-row-callbackFunctionoptional, callback function when selecting rows. The callback will be called with the array of the selected row ids. Don't forget to specify table-row-id for mdt-row. If you do, it will return the selected rows data.

alt tag

animate-sort-iconBooleanoptional, if enabled, sort icon will be animated on change
ripple-effectBooleanoptional, if enabled, ripple effect will be applied on the column names when clicked

Table with an ascending sorted column

title-overflow-handlerStringoptional, Sometimes, column names don’t fit in a container in between columns. There are two options to handle this
(default) truncateColumnNames-Shorten the column name and display it in full on hover
useHorizontalScrollingOnTable-Display the full column name and enable horizontal scrolling in the table container

Long column names truncated with an ellipse Hovering over a truncated column name

table-cardObjectoptional, tables can be embedded within a card, with table navigation and data manipulation tools available at the top and bottom.
titleStringThe title of the table card
actionIconsBooleanCard action icons (header and footer)
visibleBooleanThe visibility of the table card
columnSelectorBooleanenables the column selection for the table (you can disable certain columns from the list selection, using exclude-from-column-selector, see the related docs)

Table card with header and footer

paginated-rowsObjectoptional, if set, then basic pagination will applied to the bottom of the table.
isEnabledBooleanOptional, if provided then basic pagination will applied to the bottom of the table
rowsPerPageValuesArrayOptional, if provided then it will apply the rows per page values from the given arguments. Example: [5,10,20]

Table card with header and footer

alternate-headersStringoptional, some table cards may require headers with actions instead of titles. Two possible approaches to this are to display persistent actions, or a contextual header that activates when items are selected
persistentActions-Shows persistent action buttons in header
contextual-Shows contextual content depending on what has been selected

persistent and contextual headers

mdt-rowObjectoptional, makes possible to provide row data by passing the information through this attribute. Makes it possible to listen on data changes.
dataArrayrequired, The input data
table-row-class-nameFunctionoptional, callback that defines the classname of a row.
column-keysArrayrequired, property names of the passed data array. Makes it possible to configure which property should go in which column.
mdt-translationsObjectoptional, makes it possible to provide a custom translated texts in the table.
rowsPerPageStringWhen you need to select the amount of rows visible on the page, this label appears next to the dropdown
largeEditDialog.saveButtonLabelStringWhen edit mode is on, in the modal you can click on a button which has the 'Save' label.
largeEditDialog.cancelButtonLabelStringWhen edit mode is on, in the modal you can click on a button which has the : 'Cancel' label.
mdt-loading-indicatorObjectoptional, if set then loading indicator can be customised.
colorStringPassing a css compatible format as a color will set the color for the loading indicator (e.g.: 'red' or '#008bd2', '#000')

Html support is available for mdt-row, see more: Custom cell content (mdt-custom-cell)

Example usage for mdt-row attribute:

    table-card="{title: Nutrition, actionIcons: true}"
        'data': filteredItems,
        'table-row-id-key': 'id',
        'column-keys': ['name', 'calories', 'fat', 'carbs', 'protein', 'sodium', 'calcium', 'iron']

        <mdt-column>Dessert (100g serving)</mdt-column>
        <mdt-column sortable-rows-default>Fat (g)</mdt-column>
        <mdt-column>Carbs (g)</mdt-column>
        <mdt-column>Protein (g)</mdt-column>

    <!-- notice we didn't provide mdt-row here -->
mdt-row-paginatorFunctionoptional, makes possible to provide a callback function which returns a promise, providing the data for the table. Has two parameters: page and pageSize (an optional parameter is options as a third parameter, which can have columnFilter property when column-filter is used or columnSort when you turn on column sorting feature
mdt-row-paginator-error-messageStringoptional, overrides default error mesasge when promise gets rejected by the paginator function.
mdt-row-paginator-no-results-messageStringoptional, overrides default 'no results' message when there are no results in the table.
mdt-trigger-requestfunction(loadPageCallback)optional, if mdt-row-paginator set, provides a callback function for manually triggering an ajax request. Can be useful when you want to populate the results in the table manually. (e.g.: having a search field in your page which then can trigger a new request in the table to show the results based on that filter.

Example usage for mdt-row-paginator attribute:

    paginated-rows="{isEnabled: true, rowsPerPageValues: [5,10,20,100]}"
    mdt-row-paginator="paginatorCallback(page, pageSize, options)"
    mdt-row-paginator-error-message="Error happened during loading nutritions."
        'table-row-id-key': 'fields.item_id',
        'column-keys': [

        <mdt-column align-rule="left">Dessert (100g serving)</mdt-column>
        <mdt-column align-rule="right">Calories</mdt-column>
        <mdt-column align-rule="right">Fat (g)</mdt-column>
        <mdt-column align-rule="right">Carbs (g)</mdt-column>
        <mdt-column align-rule="right">Protein (g)</mdt-column>
        <mdt-column align-rule="right">Sodium (mg)</mdt-column>
        <mdt-column align-rule="right">Calcium (%)</mdt-column>
        <mdt-column align-rule="right">Iron (%)</mdt-column>

Column attributes

mdt-column attributes

align-ruleStringif provided, align the text to the needed direction for the entire column (note, that it aligns the data that belongs to the column)
(default) leftleft-align content
rightright-align content
column-definitionStringif provided, display a tooltip on hover. If sorting is enabled, display a light sort icon upon hover, which indicates that the column is sortable.

Column definition on hover

sortable-rows-default-When column-sort is applied to the table, it marks the column as the default sorting column
column-sortcomparatorin case of object, specifying a 'comparator' property which is a function for sorting the column data's. As every compare function, it gets two parameters and return with the compared result (-1,1,0)
column-filterObjectif provided, user can activate column filter feature on the selected column.
valuesProviderCallbackFunctionrequired, function which provides the values into the column filter. It must return with a promise which resolves an array of strings/objects.
valuesTransformerCallbackFunctionoptional, function which transforms the provided objects into strings to be able to show it visually in the column filter.
placeholderTextTextoptional, placeholder which will show up as a default text (available only for chips and dropdown filter types
filterTypeTextoptional, defines the type of the filter you want to use. Available options are: chips, checkbox, dropdown. If you don't specify it, the default will be chips
exclude-from-column-selectorBooleanoptional, excludes the column from the column selection feature
hide-column-by-defaultBooleanoptional, make column unselected by default in the column selection panel

When filters are applied to the columns, a third parameter will be applied to the mdt-row-paginator callback function.

Data-Row attributes

mdt-row attributes


Custom cell content

mdt-custom-cell attributes

If you are using mdt-row attribute to load your data (which is only way of you are dealing with ajax contents), you can now have custom content for each cells you defined. Important information:

You can still access your scope variables/functions with accessing clientScope within the mdt-custom-cell directive. The value of the cell can be accessed by accessing value inside the directive. Accessing rowId also possible if you specified it with table-row-id-key.

column-keyStringrequired, specifies the column in the rows.

There is only one scope variable that you can use in your template, and it's called value. Check the example.

Example usage for mdt-custom-cell:

    <mdt-table mdt-row="{'data': filteredItems,
                      'table-row-id-key': 'id',
                      'column-keys': ['name', 'calories', 'fat', 'carbs', 'protein', 'sodium', 'calcium', 'iron']}">
            <mdt-column align-rule="left">Dessert (100g serving)</mdt-column>
            <mdt-column align-rule="right">Calories</mdt-column>
            <mdt-column align-rule="right">Fat (g)</mdt-column>
            <mdt-column align-rule="right">Carbs (g)</mdt-column>
            <mdt-column align-rule="right">Protein (g)</mdt-column>
            <mdt-column align-rule="right">Sodium (mg)</mdt-column>
            <mdt-column align-rule="right">Calcium (%)</mdt-column>
            <mdt-column align-rule="right">Iron (%)</mdt-column>

        <!-- here you have your own, customised cell for every 'protein' column -->
        <mdt-custom-cell column-key="protein">
            <span ng-class="{'red': value > 5, 'green': value <= 5}">{{value}}</span>
            <span ng-click="clientScope.myMethodToExecute()">click here</span>
            <span>This is the row id for this column: {{rowId}}</span>

Data-Cell attributes

mdt-cell attributes

inline-menuArrayif provided, users can select from a predefined list of options. In this scenario, a menu component directly embedded in the table

A table with inline menus An expanded inline menu

editable-fieldStringif provided, provides basic text editing. Include editable fields within a table and denote them using placeholder text(if empty). You can use a simple edit dialog with just a text field, or display a full dialog component on click.
smallEditDialog-A simple, one-field edit dialog on click
largeEditDialog-A complex, flexible edit edit dialog on click
editable-field-titleStringIf set, then it sets the title of the dialog. (only for largeEditDialog)
editable-field-max-lengthNumberif set, then it sets the maximum length of the field.

An editable table cell with placeholder text A simple, one-field edit dialog A complex, flexible edit dialog Icon-based edit affordance

html-contentBooleanWhen the cell content is not a simple value (html content)

Example usage:

    table-card="{title: Nutrition, actionIcons: true}">

        <!-- defining column descriptions, align content to the left -->
            column-definition="The total amount of food energy in the given serving size.">
            Dessert (100g serving)

        <!-- in case of inline menu (INLINE-MENU FEATURE DOES NOT EXIST YET) -->
        <mdt-column inline-menu="[ {iceCream: 'Ice Cream', pastry: 'Pastry', other: 'Other'} ]">Type</mdt-column>

        <!-- inline text editing (EDITABLE-FIELDS FEATURE DOES NOT EXIST YET) -->
        <mdt-column editable-field="textInput">

        <!-- in case of sortable columns, we can set the defaultly sortable column -->
        <mdt-column sortable-rows-default>
            Fat (g)
        <mdt-column>Carbs (g)</mdt-column>
        <mdt-column>Protein (g)</mdt-column>

    <mdt-row ng-repeat="nutrition in nutritionList">
        <mdt-cell>Frozen Joghurt</mdt-cell>




GitHub Stars



6yrs ago








6yrs ago
No alternatives found
No tutorials found
Add a tutorial