You are browsing documentation for an old version of Tabulator. Consider upgrading your project to Tabulator 6.3
Setup
You can have yourself up and running in a couple of minutes using the steps below:
Include the jQuery and jQuery UI libraries before you load the Tabulator library. you can either download these and load them from your local server or choose from a popular CDN.
You can download the source as a zip fie from here.
CDNJS
To access Tabulator directly from the CDNJS CDN servers, include the following two lines at the start of your project, instead of the locally hosted versions:
There are a number of properties that can be set in a definition object to determine how the column is displayed:
General
title - Required This is the title that will be displayed in the header for this column
field - Required(not required in icon/button columns) this is the key for this column in the data array
visible - (boolean, default - true) determines if the column is visible. (see Column Visibility for more details)
Layout
align - sets the text alignment for this column (left|center|right)
width - sets the width of this column, this can be set in pixels or as a percentage of total table width (if not set the system will determine the best)
minWidth - sets the minimum width of this column, this should be set in pixels (this takes priority over the global option of columnMinWidth)
frozen - freezes the column in place when scrolling (see Frozen Columns for more details)
responsive - an integer to determine when the column should be hidden in responsive mode (see Responsive Layout for more details)
tooltip - sets the on hover tooltip for each cell in this column (see Formatting Data for more details)
cssClass - sets css classes on header and cells in this column. (value should be a string containing space separated class names)
rowHandle - sets the column as a row handle, allowing it to be used to drag movable rows. (see Movable Rows for more details)
Data Manipulation
sorter - determines how to sort data in this column (see Sorting Data for more details)
sorterParams - additional parameters you can pass to the sorter(see Sorting Data for more details)
formatter - set how you would like the data to be formatted (see Formatting Data for more details)
formatterParams - additional parameters you can pass to the formatter(see Formatting Data for more details)
editable - callback to check if the cell is editable (see Manipulating Data for more details)
editor - set the editor to be used when editing the data. (see Manipulating Data for more details)
editorParams - additional parameters you can pass to the editor (see Manipulating Data for more details)
mutator - function for manipulating column values as they are parsed into the table (see Mutators for more details)
mutateType - defines whether mutation should occur on data parsing, cell editing or both (see Mutators for more details)
mutatorParams - additional parameters you can pass to the mutator(see Mutators for more details)
accessor - function to alter column values before they are read out the table using the getData function (see Accessors for more details)
accessorParams - additional parameters you can pass to the accessor(see Accessors for more details)
Cell Events
cellClick - callback for when user clicks on a cell in this column (see Callbacks for more details)
cellDblClick - callback for when user double clicks on a cell in this column (see Callbacks for more details)
cellContext - callback for when user right clicks on a cell in this column (see Callbacks for more details)
Column Headers
headerSort - user can sort by clicking on the header (see Sorting Data for more details)
headerClick - callback for when user clicks on the header for this column (see Callbacks for more details)
headerDblClick - callback for when user double clicks on the header for this column (see Callbacks for more details)
headerContext - callback for when user right clicks on the header for this column (see Callbacks for more details)
tooltipHeader - sets the on hover tooltip for the column header (see Formatting Data for more details)
editableTitle - allows the user to edit the header titles. (see Editable Column Titles for more details)
headerFilter - filtering of columns from elements in the header (see Header Filtering for more details)
HeaderFilterPlaceholder - placeholder text for the header filter (see Header Filtering for more details)
headerFilterParams - additional parameters you can pass to the header filter (see Header Filtering for more details)
Column Grouping
You can group column headers together to create complex multi-row table headers.
To group columns, you need to add a column group object in the column definition array. You must give a column group a title and add the grouped column objects into the columns property of the group.
You can use the columnVertAlign option to set how the text in your column headers should be vertically aligned, this can take one of three string values: "top", "middle", "bottom"
You can nest column groups, so you can create column groups many levels deep.
As well as the required title and columns options, the following options can also be set on a column group:
headerClick - callback for when user clicks on the header for this column group (see Callbacks for more details)
headerDblClick - callback for when user double clicks on the header for this column group (see Callbacks for more details)
headerContext - callback for when user right clicks on the header for this column group (see Callbacks for more details)
Note: any of the click callbacks on the group header will also be triggered by clicking on any of the column headers in the group. To prevent this from happening put a matching binding on the column header and use the e.stopPropagation() function to prevent the group binding from being triggered.
Set Table Data
Tabulator row data is defined as an array of objects, that can either be passed as an array or retrieved as a JSON formatted string via AJAX from a URL.
The data can contain more columns that are defined in the columns options, these will be stored with the rest of the data, but not rendered to screen.
Note: if you have defined any mutator functions in your column definition array, these will be applied to your data as it is being parsed into the table. (see Mutators for more details)
Row Index
A unique index value should be present for each row of data if you want to be able to programmatically alter that data at a later point, this should be either numeric or a string. By default Tabulator will look for this value in the id field for the data. If you wish to use a different field as the index, set this using the index option parameter.
$("#example-table").tabulator({
index:"age", //set the index field to the "age" field.
});
Set data using array
You can pass an array directly to the table using the setData method.
If you wish to retrieve your data from a remote source, pass the URL to the setData method and it will perform the AJAX request for you. The URL can be absolute or relative.
If you wish to pass parameters with your request you can either include them in-line with the url string, or as an optional second parameter to the setData function. In the latter case they should be provided in the form of an object with key/value pairs.
The server will need to return a JSON formatted array of objects.
Advanced Configuration
By default Tabulator will make all ajax requests using the HTTP request type of GET. If you need to use a different request type for any reason, this can be passed as an optional third parameter.
$("#example-table").tabulator("setData","http://www.getmydata.com/now", {}, "POST"); //make a post request
The third parameter can also be used to pass a config object containing any of the options from the standard jQuery ajax configuration object:
var ajaxConfig = {
type:"POST", //set request type to Position
contentType: 'application/json; charset=utf-8', //set specific content type
};
$("#example-table").tabulator("setData","http://www.getmydata.com/now", {}, ajaxConfig); //make ajax request with advanced config options
A full list of the available config options can be found on the jQuery website.
Note: You MUST NOT set any of the following options in the advanced config option as they are set by Tabulator and needed for correct operation of the library:
url
async
dataType
success
error
Repeated Requests
If you always request the same url for your data then you can set it in the ajaxURL, ajaxParams & ajaxConfig options as needed when you create your Tabulator. This will cause the table to immediately load the data from the remote resource as soon as the table is created. These options take the same input options as the first second and third arguments of the setData function.
You can call the setData function to refresh the data at any point
$("#example-table").tabulator("setData");
Ajax Response Alteration
Tabulator expects the response to an ajax request to be a JSON encoded string representing an array of data objects. If you need to pass other data back in your request as well, you can use the ajaxResponse callback to process the returned data before it is passed to the table. The return value of this callback should be an array of row data objects.
$("#example-table").tabulator({
ajaxResponse:function(url, params, response){
//url - the URL of the request
//params - the parameters passed with the request
//response - the JSON object returned in the body of the response.
return response.tableData; //return the tableData property of a response json object
},
});
Ajax Filtering
If you would prefer to filter your data server side rather than in Tabulator, you can use the ajaxFiltering option to send the filter data to the server instead of processing it client side
$("#example-table").tabulator({
ajaxFiltering:true, //send filter data to the server instead of processing locally
});
The parameters used to send the filter data are set in the paginationDataSent option, in the pagination extension.
Only the first filter will be sent if multiple filters are set.
Ajax Sorting
If you would prefer to sort your data server side rather than in Tabulator, you can use the ajaxSorting option to send the sort data to the server instead of processing it client side
$("#example-table").tabulator({
ajaxSorting:true, //send sort data to the server instead of processing locally
});
The parameters used to send the sorter data are set in the paginationDataSent option, in the pagination extension.
Only the first sorter will be sent if multiple sorters are set.
Callbacks
A range of callbacks are available for tracking progress of ajax data loading. See the Ajax Callbacks section for more information.
Server Side Code (PHP)
When using ajax loading, the server should respond with a JSON encoded string representing an array of row objects. An example in PHP can be seen below:
You can create a Tabulator table directly from an HTML table element. You can define the columns in the usual way with the columns option, or you can set them as th elements in the thead of a table.
Any rows of data in the tbody of the table will automatically be converted to tabulator data in displayed in the resulting table.
If you define the width attribute in a table header cell, this will be used to set the width of the column in Tabulator.
Note: Tabulator can only parse simple tables. Tables using multiple header rows, colspan or rowspan attributes will cause the import to fail.
Options Attributes
You can set options parameters directly in the HTML by using tabulator- attributes on the table and th elements, these will then be set as configuration options on the table.
Note: This approach can only be used for text, numeric and boolean options, for callbacks and functions you will need to use the constructor object outlined below.
Complex Options Setup
If you need to set up any column options on the imported table you can declare these in table constructor as you would do for any other table. It is important to note that the title parameter for each column definition must match the text in the table element's header cell exactly for the imported data to link to the correct column.
If you use a column definition array in the Tabulator constructor, the order of columns in this array will take priority over the order of the columns in the table element.
$("#example-table").tabulator({
fitColumns:true, //example option (sets column widths to fill table)
columns:[ //set column definitions for imported table data
{title:"Age", sorter:"number"},
{title:"Height", sorter:"number"},
{title:"Date of Birth", sorter:"date"},
],
});
Mutators & Accessors
Mutators (setters) and Accessors (getters) allow you to manipulate the table data as it enters and leaves your Tabulator, allowing you to convert values for use in your table and then change them again as they leave.
Mutators are used to alter data as it is parsed into Tabulator. For example if you wanted to convert a numeric column into a boolean based on its value, before the data is used to build the table.
You can set mutators on a per column basis using the mutator option in the column definition object.
You can pass an optional additional parameter with mutator, mutatorParams that should contain an object with additional information for configuring the mutator.
{title:"Has Too Many Cars", field:"cars", mutatorParams:{threshold:5}, mutator:function(value, data, type, mutatorParams){
//value - original value of the cell
//data - the data for the row
//type - the type of mutation occurring (data|edit)
//mutatorParams - the mutatorParams object from the column definition
return value > mutatorParams.threshold; //return the new value for the cell data.
},
}
Mutation Type
By default mutators are applied to data when it is parsed into the table with the setData function and when a user edits a cell. If you only want your mutators to be applied in one of these cases, you can use the mutateType option to specify when you want your mutator to be used.
{title:"Has Too Many Cars", field:"cars", mutateType:"data", mutator:tooManyCarsMutator} //mutate only parsed data not cell edits.
mutateType can have one of three values:
data - Only mutate data when using the setData function.
edit - Only mutate data when a user edits a cell.
all - Mutate data on setData and cell edit.
Mutators vs Formatters
An important difference between a mutator and a formatter is that a mutator will alter the data contained in the table, which will then be visible in the data retrieved using the getData function, a formatter will only alter how data is displayed in cells but will not affect the data itself. (see Formatting for more details)
Accessors are used to alter data as it leaves the table through the getData function.
You can set accessors on a per column basis using the accessor option in the column definition object.
You can pass an optional additional parameter with accessor, accessorParams that should contain an object with additional information for configuring the accessor.
The example below shows a usage case that ensures float values in a column are rounded down to integers before you retrieved the data.
{title:"Tax Owed (£)", field:"tax", accessorParams:{}, accessor:function(value, data, accessorParams){
//value - original value of the cell
//data - the data for the row
//accessorParams - the accessorParams object passed from the column definition
return Math.floor(value); //return the new value for the cell data.
},
}
Accessors will only be applied to the data returned by the getData function and will not affect the data used by the table itself.
Tabulator allows you to format your data in a wide variety of ways, so your tables can display information in a more graphical and clear layout.
You can set formatters on a per column basis using the formatter option in the column definition object.
You can pass an optional additional parameter with the formatter, formatterParams that should contain an object with additional information for configuring the formatter.
Tabulator comes with a number of preconfigured formatters including:
plaintext - This is the default formatter for all cells, and simply displays the value of the cell as text.
textarea - shows text with carriage returns intact (great for multiline text)
html - displays un-sanitized html
money - formats a number into currency notation (eg. 1234567.8901 -> 1,234,567.89)
optional formatterParams:
decimal - Symbol to represent the decimal point (default ".")
thousand - Symbol to represent the thousands separator (default ",")
symbol - currency symbol (no default)
symbolAfter - position the symbol after the number (default false)
precision - the number of decimals to display (default is 2), setting this value to false will display however many decimals are provided with the number
email - renders data as an anchor with a mailto: link to the cell value
image - created an img tag with the src attribute set to the cell value
link - renders data as an anchor with a link to the given value
tick - displays a green tick if the value is (true|'true'|'True'|1) and an empty cell if not
tickCross - displays a green tick if the value is (true|'true'|'True'|1) and a red cross if not
color - sets the background colour of the cell to the value. Can be any valid CSS color eg. #ff0000, #f00, rgb(255,0,0), red, rgba(255,0,0,0), hsl(0, 100%, 50%)
star - displays a graphical star rating based on integer values
optional formatterParams:
stars - maximum number of stars to be displayed (default 5)
progress - displays a progress bar that fills the cell from left to right, using values 0-100 as a percentage of width#
optional formatterParams:
min - minimum value for progress bar (default 0)
max - minimum value for progress bar (default 100)
color - colour of progress bar (default #2DC214)
buttonTick - displays a tick icon on each row (for use as a button)
buttonCross - displays a cross icon on each row (for use as a button)
rownum - shows an incrementing row number for each row.
handle - fills the cell with hamburger bars, to be used as a row handle
Note: To guard against code injection, any formatters that are meant to display text (plaintext, textarea, money, email, link) have the data sanitized first to escape any potentially harmful HTML or JavaScript from making into the table, this causes any such data to be displayed as its plain text alternative. If you want the HTML to be displayed correctly use the html formatter, but be aware if your data can be user edited this could allow for malicious script injection.
Note: For a guide to adding your own formatters to this list, have a look at the Extending Tabulator section.
Custom Formatters
As well as the built-in formatters you can define a formatter using a custom formatter function.
The formatter function accepts two arguments, the CellComponent for the cell being formatted and the formatterParams option from the column definition.
The function must return the contents of the cell, either the text value of the cell, valid HTML or a jQuery element.
{title:"Name", field:"name", formatter:function(cell, formatterParams){
//cell - the cell component
//formatterParams - parameters set for the column
return "Mr" + cell.getValue(); //return the contents of the cell;
},
}
Formatters vs Mutators
An important difference between a formatter and a mutator is that a formatter will only alter how data is displayed in cells but will not affect the data itself, while a mutator will alter the data contained in the table, which will then be visible in the data retrieved using the getData function. (see Mutators for more details)
Icon/Button Columns
You can create icon/button columns, by not specifying the field option in the column definition object and creating a custom formatter for the column contents. In the example below we have created a print button on the left of each row.
//custom formatter definition
var printIcon = function(cell, formatterParams){ //plain text value
return "<i class='fa fa-print'></i>";
};
//column definition in the columns array
{formatter:printIcon, width:40, align:"center", cellClick:function(e, cell){alert("Printing row data for: " + cell.getRow().getData().name)}},
Row Formatting
Tabulator also allows you to define a row level formatter using the rowFormatter option. this lets you alter each row of the table based on the data it contains.
The function accepts one argument, the RowComponent for the row being formatted.
The example below changes the background colour of a row to blue if the col value for that row is "blue".
$("#example-table").tabulator({
rowFormatter:function(row){
//row - row component
var data = row.getData();
if(data.col == "blue"){
row.getElement().css({"background-color":"#A6A6DF"});
}
},
});
ToolTips
You can set tooltips to be displayed when the cursor hovers over cells. By default, tooltips are not displayed.
Tooltips can either be set globally using the tooltips options parameter:
Or on a per column basis in the column definition array:
//column definition in the columns array
{formatter:printIcon, width:40, align:"center", tooltip:true},
The tooltip parameter can take three different types of value
boolean - a value of false disables the tooltip, a value of true sets the tooltip of the cell to its value
string - a string that will be displayed for all cells in the matching column/table.
function - a callback function that returns the string for the cell. see below:
The function accepts one argument, the CellComponent for the cell the tooltip is being generated for.
$("#example-table").tabulator({
tooltips:function(cell){
//cell - cell component
//function should return a string for the tooltip of false to hide the tooltip
return cell.getColumn().getField() + " - " + cell.getValue(); //return cells "field - value";
},
});
Note: setting a tooltip value on a column will override the global setting.
Header ToolTips
It is also possible to set tooltips to display on the column headers. This is particularly useful when your columns are too narrow to display full header names.
Header tooltips can either be set globally using the tooltipsHeader options parameter:
Or on a per column basis in the column definition array:
//column definition in the columns array
{title:"name", field:"name", width:40, align:"center", tooltipHeader:true},
The tooltip tooltipHeader can take three different types of value
boolean - a value of false disables the tooltip, a value of true sets the tooltip of the column header to its title value.
string - a string that will be displayed for the tooltip.
function - a callback function that returns the string for the column header. see below:
The function accepts one argument, the ColumnComponent for the column the tooltip is being generated for.
$("#example-table").tabulator({
tooltips:function(column){
//column - column component
//function should return a string for the header tooltip of false to hide the tooltip
return column.getDefinition().title;
},
});
Note: setting a tooltipHeader value on a column will override the global setting.
Tabulator comes with a number of filter comparison types including:
= - Displays only rows with data that is the same as the filter
< - displays rows with a value less than the filter value
<= - displays rows with a value less than or qual to the filter value
> - displays rows with a value greater than the filter value
>= - displays rows with a value greater than or qual to the filter value
!= - displays rows with a value that is not equal to the filter value
like - displays any rows with data that contains the specified string anywhere in the specified field. (case insensitive)
If you wish to apply multiple filters then you can pass an array of filter objects to this function, the data will then have to pass all filters to be displayed in the table.
$("#example-table").tabulator("setFilter", [
{field:"age", type:">", value:52}, //filter by age greater than 52
{field:"height", type:"<", value:142}, //and by height less than 142
]);
Filters will remain in effect until they are cleared, including during setData calls.
Custom Filter Functions
If you want to perform a more complicated filter then you can pass a callback function to the setFilter Method
function customFilter(data){
//data - the data for the row being filtered
return data.name == "bob" && data.height < 3; //must return a boolean, true if it passes the filter.
}
$("#example-table").tabulator("setFilter", customFilter);
Additional Filter Functions
There are a number of additional filter functions that can be called to customise your filtering experience
Add Filter to Existing Filters
If you want to add another filter to the existing filters then you can call the addFilter function:
Is is possible to filter the table data directly from the column headers, by setting the headerFilter parameter in the column definition object for that column.
{title:"Name", field:"name", headerFilter:true} //show header filter matching the cells editor
Setting this parameter to true will cause an editor element matching the columns editor type to be displayed in the header below the column title, and will allow the user to filter data in the table by values in that column. The editor will be chosen using the same rules as the editor parameter, for more information on this see the Manipulating Data section.
Alternatively you can pass a string to this parameter containing any of the standard editors listed in the Manipulating Data section
{title:"Name", field:"name", headerFilter:"input"} //show headerFilter using "input" editor
You can also pass a custom editor function to this parameter in the same way as you would for column editor. For more information see the Manipulating Data section.
You can pass an optional additional parameter with the header filter, headerFilterParams that should contain an object with additional information for configuring the header filter element. This will be passed to the editor in the column header instead of the editorParams property.
{title:"Name", field:"name", headerFilter:"input", headerFilterParams:{initial:"Steve Bobberson"}} //show headerFilter using "input" editor
Note: At present, the progress and star editors are not available as header filters.
Header Filters and Programmatic Filters
Header filters and programatic filters can be set independently allowing you to use a header filter to further restrict the rows shown in an already filtered data set.
Real Time Filtering
If an input element is used as the filter element, then then the table will be filtered in real time as the user types in the input element. To prevent exessive redrawing of the table Tabulator will wait 300 milliseconds after the user has finished typing before triggering the filter, this ensures that the table is not redrawn for every character typed by the user.
Note: If the input has a type attribute value of text it will be automatically changed to search to give the user the option to clear the input text.
Filter Comparison Types
The type of comparison function used on the filter value is dependent on the type of element used for the header filter.
Standard input elements use a case insensitive comparison where even a partial match counts as successful, this allows for the matches to be displayed as the user types.
For all other element types (select boxes, check boxes, input elements of type number) an exact match is needed for the comparison to be successful.
Placeholder Text
The default placeholder text used for input elements can be set using the headerFilterPlaceholder option in the table definition
$("#example-table").tabulator({
headerFilterPlaceholder:"filter data...", //set column header placeholder text
});
To set the placeholder text on a per column basis you can use the headerFilterPlaceholder option in the column's definition object.
$("#example-table").tabulator({
headerFilterPlaceholder:"filter data...", //set column header placeholder text
columns:[
{title:"Name", field:"name", headerFilter:true, headerFilterPlaceholder:"Find a Person..."} //set placeholder text on name column header filter
]
});
Callbacks
A range of callbacks are available for tracking progress of filtering. See the Filter Callbacks section for more information.
Tabulator allows you to sort the data in your table in any way you want.
By default Tabulator will attempt to guess which sorter should be applied to a column based on the data contained in the first row. It can determine sorters for strings, numbers, alphanumeric sequences and booleans, anything else will be treated as a string.
To specify a sorter to be used on a column use the param property in the columns definition object
You can pass an optional additional property with sorter, sorterParams that should contain an object with additional information for configuring the sorter.
Tabulator comes with a number of preconfigured sorters including:
string - sorts column as strings of characters
number - sorts column as numbers (integer or float, will also handle numbers using "," separators)
alphanum - sorts column as alpha numeric code
boolean - sorts column as booleans
date - sorts column as dates
You will need to include the moment.js library to use this sorter
optional sorterParams:
format - the format of the date (default: DD/MM/YYYY)
time - sorts column as time (formatted as hh:mm)
You will need to include the moment.js library to use this sorter
optional sorterParams:
format - the format of the time (default: hh:mm)
Custom Sorters
for advanced sorting can define a custom sorter function in the sorter option:
{title:"Name", field:"name", sorter:function(a, b, aData, bData, column, dir, sorterParams){
//a, b - the two values being compared
//aData, bData - the row objects for the values being compared (useful if you need to access additional fields in the row data for the sort)
//column - the column component for the column being sorted
//dir - the direction of the sort ("asc" or "desc")
//sorterParams - sorterParams object from column definition array
return a - b; //you must return the difference between the two values
},
}
The fifth parameter in this callback is a ColumnComponent for the column being sorted.
Header Sorting
By default all columns in a table are sortable by clicking on the column header, if you want to disable this behaviour, set the headerSort property to false in the column definition array:
When the table is first created it can be setwith an initial set of sorters. These can be set using the initialSort option. This will take the same sorter array as the setSort function. (see Initial Data Sorting for more details)
$("#example-table").tabulator({
initialSort:[
{column:"age", dir:"asc"}, //sort by this first
{column:"height", dir:"desc"}, //then sort by this second
]
});
Trigger Sorting Programmatically
You can trigger sorting using the setSort function
If you wish to sort by multiple columns then you can pass an array of sorting objects to this function, the data will then be sorted in the order of the objects.
$("#example-table").tabulator("setSort", [
{column:"age", dir:"asc"}, //sort by this first
{column:"height", dir:"desc"}, //then sort by this second
]);
Get Current Sorters
If you need to retrieve the details of the currently sorted column at any point you can use the getSort function.
$("#example-table").tabulator("getSort");
This will return an array of sort objects with two properties, column a string of the field name for the sorted column, and dir a string of either "asc" or "desc" indicating the direction of sort.
Tabulator allows you to manipulate the data in the table in a number of different ways
Editable Data
Columns of the table can be set as editable using the editor parameter in the column definition. (see Define Column Headers for more details).
When a user clicks on an editable column the will be able to edit the value for that cell.
By default Tabulator will use an editor that matches the current formatter for that cell. if you wish to specify a specific editor, you can set them per column using the editor option in the column definition. Passing a value of true to this option will result in Tabulator applying the editor that best matches the columns formatter, if present.
You can pass an optional additional parameter with the editor, editorParams that should contain an object with additional information for configuring the editor.
Tabulator comes with a number of preconfigured editors including:
input - editor for plain text.
textarea - editor for multi-line text, allows the row to vertically resize to fit the text as it is entered.
number - editor for numbers with increment and decrement buttons.
tick - editor for tick and tickCross columns.
star - editor for star columns (can use left/right arrow keys and enter for selection as well as mouse).
progress - editor for progress bar columns (can use left/right arrow keys and enter for selection as well as mouse)
Custom Editor
If you need a different type of editor, you can pass a custom editor function to the editor option. This function should take four parameters, a CellComponent for the cell being edited, a function to call when the cell has ben rendered, which can be used to set focus or tidy up the display after the element has become visible, a function to call to pass back the new value, when the user hassuccessfully entered new data in the cell, and a function to call if the user aborts the edit.
var selectEditor = function(cell, onRendered, success, cancel, editorParams){
//cell - the cell component for the editable cell
//onRendered - function to call when the editor has been rendered
//success - function to call to pass thesuccessfully updated value to Tabulator
//cancel - function to call to abort the edit and return to a normal cell
//editorParams - editorParams object set in column definition
//create and style editor
var editor = $("<select><option value=''></option><option value='male'>male</option><option value='female'>female</option></select>");
editor.css({
"padding":"3px",
"width":"100%",
"box-sizing":"border-box",
});
//Set value of editor to the current value of the cell
editor.val(cell.getValue());
//set focus on the select box when the editor is selected (timeout allows for editor to be added to DOM)
onRendered(function(){
editor.focus();
});
//when the value has been set, trigger the cell to update
editor.on("change blur", function(e){
success(editor.val());
});
//return the editor element
return editor;
};
{title:"Gender", field:"gender", editor:selectEditor}}
Optional Editing
There are some circumstances where you may want to block editability of a cell for one reason or another. To meet this need you can use the editable option. This lets you set a callback that is executed before the editor is built, if this callback returns true the editor is added, if it returns false the edit is aborted and the cell remains a non editable cell. The function has one parameter, the CellComponent of the cell about to be edited.
var editCheck = function(cell){
//cell - the cell component for the editable cell
//get row data
var data = cell.getRow().getData();
return data.age > 18; // only allow the name cell to be edited if the age is over 18
}
{title:"Name", field:"name", editor:"string", editable:editCheck}}
Data Mutation if you have defined any mutator functions in your column definition array, these will be applied to your edited value as it is being parsed into the table. (see Mutators for more details)
Updating Data
If you want to update an existing set of data in the table, without completely replacing the data as the setData method would do, you can use the updateData method.
This function takes an array of row objects and will update each row based on its index value. (the index defaults to the "id" parameter, this can be set using the index option in the tabulator constructor). Options without an index will be ignored, as will items with an index that is not already in the table data. The addRow function should be used to add new data to the table.
The function will not replace the rows with the provided data, it will only update any of the provided parameters.
//data before update {id:1, name:"Steve", gender:"male", age:20}
$("#example-table").tabulator("updateData", [{id:1, name:"bob"}]); //update data
//data after update = {id:1, name:"bob", gender:"male", age:20}
Update or Add Data
If the data you are passing to the table contains a mix of existing rows to be updated and new rows to be added then you can call the updateOrAddData function. This will check each row object provided and update the existing row if available, or else create a new row with the data.
Data Mutation if you have defined any mutator functions in your column definition array, these will be applied to the new data before the table is updated. (see Mutators for more details)
Retreiving Data
Retrieve All Data
You can retrieve the data stored in the table using the getData function.
var data = $("#example-table").tabulator("getData");
This will return an array containing the data objects for each row in the table.
By default getData will return an array containing all the data held in the Tabulator. If you only want to access the currently filtered/sorted elements, you can pass a value of true to the first argument of the function.
var data = $("#example-table").tabulator("getData", true); //return currently filtered data
Retrieve Row Data
To retrieve the data of a specific row, you can retrieve the RowComponent with the getRow function, then use the getData function on the component. The first argument is the row you are looking for, it will take any of the standard row component look up options.
var row = $("#example-table").tabulator("getRow", 1); //return row component with index of 1
var rowData = row.getData();
Data Accessors If you have defined any accessors on your columns, then these will be applied to the data before the data is returned from any of the above functions. (see Accessors for more details)
Emptying the Table
You can remove all data from the table using the clearData function:
$("#example-table").tabulator("clearData");
Row Manipulation
There are a number of ways to manipulate individual rows in the table without affecting any other currently rendered rows.
Add Row
You can add a row to the table using the addRow function.
The first argument should be a row data object. If you do not pass data for a column, it will be left empty. To create a blank row (ie for a user to fill in), pass an empty object to the function.
The second argument is optional and determines whether the row is added to the top or bottom of the table. A value of true will add the row to the top of the table, a value of false will add the row to the bottom of the table. If the parameter is not set the row will be placed according to the addRowPos global option.
By default any new rows will be added to the bottom of the table, to change this to the top set the addRowPos option to "top";
If you want to add the row next to an existing row you can pass an optional third argument to the function that will position the new row next to the specified row (above or below based on the value of the second argument). This argument will take any of the standard row component look up options:
$("#example-table").tabulator("addRow", {name:"Billy Bob", age:"12"}, true, 3); //add new row above existing row with index of 3
Data Mutation if you have defined any mutator functions in your column definition array, these will be applied to the new data before the row is added. (see Mutators for more details)
Update Row
You can update any row in the table using the updateRow function.
The first argument is the row you want to update, it will take any of the standard row component look up options.
The second argument should be the updated data object for the row. As with the updateData function, this will not replace the existing row data object, it will only update any of the provided parameters.
Once complete, this function will trigger the rowUpdated and dataEdited events.
This function will return true if the update was successful or false if the requested row could not be found. If the new data matches the existing row data, no update will be performed.
If you already have the RowComponent for the row you wish to update, you can call the update function directly on the component:
row.update({"name":"steve"}); //update the row data for field "name"
Data Mutation if you have defined any mutator functions in your column definition array, these will be applied to the new data before the row is updated. (see Mutators for more details)
Update or Add Row
If you don't know whether a row already exists you can use the updateOrAddRow function. This will check if a row with a matching index exists, if it does it will update it, if not it will add a new row with that data. This takes the same arguments as the updateRow function.
To retrieve the jQuery element of a specific row, you can retrieve the RowComponent with the getRow function, then use the getElement function on the component. The first argument is the row you are looking for, it will take any of the standard row component look up options.
var row = $("#example-table").tabulator("getRow", 1); //return row component with index of 1
var rowElement = row.getElement();
Delete Row
You can delete any row in the table using the deleteRow function. The first argument is the row you want to delete, it will take any of the standard row component look up options.
$("#example-table").tabulator("deleteRow", 15);
If you already have the RowComponent for the row you wish to delete, you can call the delete function directly on the component:
If you set the history option to true, Tabulator will keep track of all user interactions with table data including cell edits, row addition and deletion.
$("#example-table").tabulator({
history:true, //record table history
});
Undo Action
With history enabled you can use the undo function to automatically undo a user action, the more times you call the function, the further up the history log you go.
$("#example-table").tabulator("undo");
If the keybindings extension is installed, this action can also be triggered with the ctrl + z key combination.
Redo Action
With history enabled you can use the redo function to automatically redo user action that has been undone, the more times you call the function, the further up the history log you go. once a user interacts with the table then can no longer redo any further actions until an undo is performed
$("#example-table").tabulator("redo");
If the keybindings extension is installed, this action can also be triggered with the ctrl + y key combination.
Navigation New
When a cell is being edited it is possible to move the editor focus from the current cell to one if its neighbours. There are a number of functions that can be called to move the focus in different directions.
Note: These actions will only work when a cell is editable and has focus.
Note: Navigation commands will only focus on editable cells, that is cells with an editor and if present an editable function that returns true.
Previous Cell
Use the navigatePrev function to shift focus to the next editable cell on the left, if none available move to the right most editable cell on the row above.
$("#example-table").tabulator("navigatePrev");
If the keybindings extension is installed, this action can also be triggered with the shift + tab key combination.
Next Cell
Use the navigateNext function to shift focus to the next editable cell on the right, if none available move to left most editable cell on the row below.
$("#example-table").tabulator("navigateNext");
If the keybindings extension is installed, this action can also be triggered with the tab key combination.
Left Cell
Use the navigateLeft function to shift focus to next editable cell on the left, return false if none available on row.
$("#example-table").tabulator("navigateLeft");
Right Cell
Use the navigateRight function to shift focus to next editable cell on the right, return false if none available on row.
$("#example-table").tabulator("navigateRight");
Up Cell
Use the navigateUp function to shift focus to the same cell in the row above.
$("#example-table").tabulator("navigateUp");
If the keybindings extension is installed, this action can also be triggered with the up arrow key combination.
Down Cell
Use the navigateDown function to shift focus to the same cell in the row below.
$("#example-table").tabulator("navigateDown");
If the keybindings extension is installed, this action can also be triggered with the down arrow key combination.
Navigation from Cell Components
If you have a CellComponent, you can call navigation functions directly on the component. For more details see the CellComponent documentation
Callbacks
A range of callbacks are available for tracking progress of data manipulation. See the Data Callbacks section for more information.
Table Layout Updated
Tabulator has tons of different ways of customizing the layout the table, have a look through the next few sections to see how you can configure your tables to meet your use case.
Fit Columns to Data
By default Tabulator will resize your tables columns to fit the data held in each column, unless you specify a width or minWidth in the column constructor. If the width of all columns exceeds the width of the containing element, a scroll bar will appear.
Fit Columns to Container
As an alternative to the default column fit you can use the fitColumns option to cause tabulato to resize columns so they fit perfectly in the available table width.
If a width is specified on any columns, where possible the columns will be set at this width and other columns will be resized around them. If there is not enough space to fit all the columns in, then all column widths are ignored and they are sized equally.
In this layout style at least one column must not have a width specified so it can be resized to fill any spare space.
To enable this layout mode set the fitColumns option to true in your table constructor object.
$("#example-table").tabulator({
fitColumns:true, // this option takes a boolean value (default = false)
});
Responsive layout will automatically hide/show columns to fit the width of the Tabulator element. This allows for clean rendering of tables on smaller mobile devices, showing important data while avoiding horizontal scroll bars. You can enable responsive layouts using the responsiveLayout option.
$("#example-table").tabulator({
responsiveLayout:true, // this option takes a boolean value (default = false)
});
By default, columns will be hidden from right to left as the width of the table decreases. You can choose exactly how columns are hidden using the responsive property in the column definition object.
When responsive layout is enabled, all columns are given a default responsive value of 1. The higher you set this value the sooner that column will be hidden as the table width decreases. If two columns have the same responsive value then they are hidden from right to left (as defined in the column definition array, ignoring user moving of the columns). If you set the value to 0 then the column will never be hidden regardless of how narrow the table gets.
$("#example-table").tabulator({
responsiveLayout:true, // enable responsive layouts
columns:[ //set column definitions for imported table data
{title:"Name", field:"name", responsive:0}, // this column wil never be hidden
{title:"Age", field:"age" , responsive:3}, // hidden first
{title:"Gender", field:"gender" }, // hidden fifth
{title:"Height", field:"height" , responsive:2}, // hidden third
{title:"Favourite Color", field:"color" , responsive:2}, // hidden second
{title:"Date of Birth", field:"dob" }, // hidden fourth
],
});
Note: If you are using the fitColumns feature, you will need to set a minWidth property on the columns you want to respond responsively to ensure they are hidden when necessary, otherwise Tabulator will keep on reducing the width of the columns instead.
You can freeze the position of columns on the left and right of the table using the frozen property in the column definition array. This will keep the column still when the table is scrolled horizontally.
$("#example-table").tabulator({
[
{title:"Name", field:"name", frozen:true}, //frozen column on left of table
{title:"Age", field:"age"},
{title:"Eye Colour", field:"eyes"},
{title:"Height", field:"height", frozen:true}, //frozen column on right of table
]
});
You can freeze any number of columns on the left or right of the table, but they must be next to each other in the column definition array.
Tabulator builds the frozen columns by looking through the column definition array from both sides, building up the frozen columns as it see the frozen property. Once a non-frozen column is reached it stops building the frozen list for that side of the table.
Note: Frozen columns are locked in place and cannot be reordered by dragging and dropping the column header. It is also not possible to freeze a column that is part of a column group.
Redrawing the table
If the size of the element containing the Tabulator changes or you create a table before its containing element is visible, it will necessary to redraw the table to make sure the rows and columns render correctly.
This can be done by calling the redraw method. For example, to trigger a redraw whenever the viewport width is changed:
The redraw function also has an optional boolean argument that when set to true triggers a full rerender of the table including all data on all rows.
$(window).resize(function(){
$("#example-table").tabulator("redraw", true); //trigger full rerender including all data and rows
});
Virtual DOM Updated
As of version 3.0 tabulator renders its table using a Virtual DOM, this means that it only renders the rows you seen in the table (plus a few above and below the current view) and creates and destroys the rows as you scroll through the table. If no height is set the table will revert to the standard DOM mode and try and render all rows at once, which will have a performance impact on tables with a large number of rows.
This allows tabulator to handle thousands of rows with no overhead as it only processes the information it needs to display.
In order for the virtual DOM to function correctly you must ensure that the height option is set in the table constructor, this can be set to any valid CSS value.
Note: It is not possible to externally add event bindings to elements in the table because they are created and destroyed by Tabulator as needed. The good news is there are callbacks and options to register almost every binding through the setup options.
Changing Table Height New
If you want to manually change the height of the table at any time, you can use the setHeight function, which will also redraw the virtual DOM if necessary.
If the height of the table changes at any point (for example the height is set at a percentage and the user resizes the window), you will need to call the redraw function to ensure that the virtual DOM updates to display the correct number of rows.
$("#example-table").tabulator("redraw");
Standard DOM Exceptions
In order for the virtual DOM to function correctly it needs to know the height of the table, so you must ensure that the height option of the table is set so the table can calculate correctly what it should be displaying.
When pagination is enabled Tabulator will revert to using standard DOM rendering as it will only be displaying one page at a time.
Disabling the Virtual DOM
if you need to disable virtual rendering for any reason you can set the virtualDom option to false to force standard rendering.
$("#example-table").tabulator({
virtualDom:false, //disable virtual DOM rendering
});
Note: You must have the height option set to enable progressive rendering.
Empty Table Placeholder
You can use the placeholder option to display a message to your users when the table has no data set. The function can either take a string to display or, the HTML or jQuery element to display in the empty table.
$("#example-table").tabulator({
placeholder:"No Data Available", //display message to user on empty table
});
Table Footer New
The footer element that the tables uses for holding pagination elements etc, is automatically generated by Tabulator.
If you want to use your own element for any reason, for example you want to add aditional elements to the footer, then you can use the footerElement option to pass a jquery selector for the footer element into the table.
Note: To ensure correct functioning of the table, it is recommended that you apply the tabulator-footer class to the footer element
Callbacks
A range of callbacks are available for tracking progress of table rendering. See the Layout Callbacks section for more information.
Pagination
Pagination functionality is provided by the page extension
If you would prefer to display your data as pages rather than a scrolling list Tabulator can help you out there too.
There are two forms of pagination available. local pagination, where Tabulator will parse in all available data and then paginate this data set. Or remote pagination, where Tabulator will load individual pages of data via Ajax from a remote server.
When pagination is enabled, a footer element will be added to the bottom of the table, with a range of navigation controls to allow your users to easily switch between pages.
The first page of a table will automatically be loaded when the table is created if pagination is enabled.
If you are a Laravel user then you should find that the auto generated URL's and data processing work straight out the box with no aditional configuration needed.
Note: Changing the filter or sorting while pagination is enabled will revert the table back to the first page.
Note: Pagination and row grouping cannot be used together, enabling one will disable the other.
Remote Pagination
To enable remote pagination, set the pagination option to remote, and set the url for the Ajax request using the ajaxURL parameter. You can also pass an optional object to ajaxParams for any parameters you want to pass with the url (these should be static parameters, the page number etc, will be added later on).
By default the page size will be set by the amount of data returned by the remote server, if you need to tell the remote server how many rows to send you can set the paginationSize parameter.
$("#example-table").tabulator({
pagination:"remote", //enable remote pagination
ajaxURL:"http://testdata.com/data", //set url for ajax request
ajaxParams:{token:"ABC123"}, //set any standard parameters to pass with the request
paginationSize:5, //optional parameter to request a certain number of rows per page
});
Request URL
Tabulator will automatically create a page request URL when a user selects a page.
By default a url will be generated using the provided ajaxURL and a number of system generated parameters:
page - the page number being requested
size - the number of rows to a page (if paginationSize is set)
sort - the first currently sorted field (if any)
sort_dir - the first currently sort direction (if any)
filter - the first currently filtered field (if any)
filter_value - the first current filter value (if any)
filter_type - the first current filter type (if any)
If you need to change the names of any of these parameters to fit your existing system, you can use the paginationDataSent option to set alternative parameter names.
If you need to have more complex control over the request URL, you can pass a callback to the paginator option to return the URL you wish to use for each page.
$("#example-table").tabulator({
pagination:"remote", //enable remote pagination
ajaxURL:"http://testdata.com/data", //set url for ajax request
paginator: function(url, pageNo, pageSize, ajaxParams ){
//url - the url from the ajaxURL parameter
//pageNo - the requested page number
//pageSize - the value of the paginationSize parameter
//ajaxParams - the value of the ajaxParams parameter
return ""; //must return the string of the page request URL
},
});
Note: If you use a paginator function you will need to manyally add the sort and filter parameters to the request url.
Returned Data
The remote server should return a JSON formatted object with the following structure:
{
"last_page":15, //the total number of available pages
"data":[ // an array of row data objects
{id:1, name:"bob", age:"23"}, //example row data object
]
}
If you need to change the names of any of these parameters to fit your existing system, you can use the paginationDataReceived option to set alternative parameter names.
$("#example-table").tabulator({
pagination:"remote", //enable remote pagination
ajaxURL:"http://testdata.com/data", //set url for ajax request
paginationDataReceived:{
"last_page":"max_pages", //change last_page parameter name to "max_pages"
} ,
});
Local Pagination
Local pagination works by loading the entire data set into the table then generating paged views of that data.
To enable local pagination set the pagination option to local.
$("#example-table").tabulator({
pagination:"local", //enable local pagination.
});
Setting Page size
With local pagination there are a couple ways to set the number of rows in each page.
You can specify the page size during table creation by setting the paginationSize option. If no height option is specified the table will resize to fit the number of rows on the page.
$("#example-table").tabulator({
pagination:"local", //enable local pagination.
paginationSize:5, // this option can take any positive integer value (default = 10)
});
Alternatively, if you specify the height option, and don't define the paginationSize option the page size will be automatically set to fill the height of the table.
$("#example-table").tabulator({
height:"300px",
pagination:"local", //enable local pagination.
});
Advance Controls
A number of additional controls are available to help customize the pagination experience.
Set Current Page
When pagination is enabled the table footer will contain a number of pagination controls for navigating through the data.
In addition to these controls it is possible to change page using the setPage function
$("#example-table").tabulator("setPage", 5); // show page 5
The setPage function takes one parameter, which should be an integer representing the page you wish to see. There are also four strings that you can pass into the parameter for special functions.
"first" - show the first page
"prev" - show the previous page
"next" - show the next page
"last" - show the last page
Change Page Size
You can change the page size at any point by using the setPageSize function. (this setting will be ignored if using remote pagination with the page size set by the server)
$("#example-table").tabulator("setPageSize", 50); // show 50 rows per page
Get Current Page Number
To retrieve the current page use the getPage function. this will return the number of the current page. If pagination is disabled this will return false.
$("#example-table").tabulator("getPage"); // returns current page
Get Maximum Page Number
To retrieve the maximum available page use the getPageMax function. this will return the number of the maximum available page. If pagination is disabled this will return false.
$("#example-table").tabulator("getPageMax"); // returns maximum page
Custom Pagination Control Element
By default the pagination controls are added to the footer of the table. If you wish the controls to be created in another element pass a JQuery object for that element to the paginationElement option.
$("#example-table").tabulator({
pagination:"local",
paginationElement:$("#pagination-element"), //build pagination controls in this element
});
Callbacks
A range of callbacks are available for pagination. See the Pagination Callbacks section for more information.
You can group rows together that share a column value, this creates a visible header for each group and allows the user to collapse groups that they don't want to see.
Rows can be grouped by a common field value by setting the groupBy option to the name of the field to be grouped.
groupBy:"gender",
If you need to group by more complex value, you can pass a function that returns a string that represents the group.
groupBy:function(data){
//data - the data object for the row being grouped
return data.gender + " - " + data.age; //groups by data and age
}
Note: Grouping and pagination cannot be used together, enabling one will disable the other.
Custom Group Headers
You can set the contents of the group headers with the groupHeader option. This should return the contents of the group header.
groupHeader:function(value, count, data){
//value - the value all members of this group share
//count - the number of rows in this group
//data - an array of all the row data objects in this group
return value + "<span style='color:#d00; margin-left:10px;'>(" + count + " item)</span>";
},
Group Open State
You can set the default open state of groups using the groupStartOpen property.
groupStartOpen:true,
This can take one of three possible values:
true - all groups start open (default value)
false - all groups start closed
function() - a callback to decide if a group should start open or closed
Group Open Function
If you want to decide on a group by group basis which should start open or closed then you can pass a function to the groupStartOpen property. This should return true if the group should start open or false if the group should start closed.
groupStartOpen:function(value, count, data){
//value - the value all members of this group share
//count - the number of rows in this group
//data - an array of all the row data objects in this group
return count > 3; //all groups with more than three rows start open, any with three or less start closed
},
Callbacks
A range of callbacks are available for grouping. See the Group Callbacks section for more information.
Row selection allows users to select and highlight a number of rows that you can then take action on. This allows rows to be selected in a number of ways:
Clicking on a row, to toggle its state.
Holding down the shift key and click dragging over a number of rows to toggle the state of all rows the cursor passes over.
Programmatically with the selectRow and deselectRow functions.
To enable row selection, set the selectable option to true
The selectable option can take one of a several values:
false - selectable rows are disabled
true - selectable rows are enabled, and you can select as many as you want
integer - any integer value, this sets the maximum number of rows that can be selected (when the maximum number of selected rows is exceded, the first selected row will be deselected to allow the next row to be selected).
"highlight"(default) - rows have the same hover stylings as selectable rows but do not change state when clicked. This is great for when you want to show that a row is clickable but don't want it to be selectable.
Note: using the setData function will clear the currently selected rows.
Rolling Selection
By default, row selection works on a rolling basis, if you set the selectable option to a numeric value then when you select past this number of rows, the first row to be selected will be deselected. If you want to disabled this behaviour and instead prevent selection of new rows once the limit is reached you can set the selectableRollingSelection option to false.
$("#example-table").tabulator({
selectable:5,
selectableRollingSelection:false, // disable rolling selection
});
Persistent Selection
By default Tabulator will maintain selected rows when the table is filtered, sorted or paginated (but NOT when the setData function is used). If you want the selected rows to be cleared whenever the table view is updated then set the selectablePersistence option to false.
$("#example-table").tabulator({
selectable:true,
selectablePersistence:false, // disable rolling selection
});
Selection Eligibility
You many want to exclude certain rows from being selected. The selectableCheck options allows you to pass a function to check if the current row should be selectable, returning true will allow row selection, false will result in nothing happening. The function should accept a RowComponent as its first argument.
$("#example-table").tabulator({
selectableCheck:function(row){
//row - row component
return row.getData().age > 18; //allow selection of rows where the age is greater than 18
},
});
Note: Any selectable rows will be assigned the tabulator-selectable class, any unselectable rows will be assigned the tabulator-unselectable class.
Programmatic Row Selection
As well as clicking on a row, you can trigger the selection or deselection of a row programmatically.
Select Row
To programmatically select a row you can use the selectRow function.
To select a specific row you can pass the any of the standard row component look up options into the first argument of the function. If you leave the argument blank you will select all rows (if you have set the selectable option to a numeric value, it will be ignored when selecting all rows).
$("#example-table").tabulator("selectRow", 1); //select row with id of 1
If you want to select multiple rows you can pass an array of row component look up options into the first parameter
Note: If you do not pass any arguments to the selectRow function, all rows will be selected.
Deselect Row
To programmatically deselect a row you can use the deselectRow function.
To deselect a specific row you can pass any of the standard row component look up options into the first argument of the function. If you leave the argument blank you will deselect all rows.
$("#example-table").tabulator("deselectRow", 1); //deselect row with id of 1
If you want to deselect multiple rows you can pass an array of row component look up options into the first parameter
Note: If you do not pass any arguments to the the deselectRow function, all rows will be deselected.
Get Selected Data
To get the data objects for the selected rows you can use the getSelectedData function.
This will return an array of the selected rows data objects in the order in which they were selected.
var selectedData = $("#example-table").tabulator("getSelectedData"); //get array of currently selected data.
Get Selected Row Components
To get the RowComponent's for the selected rows at any time you can use the getSelectedRows function.
This will return an array of RowComponent's for the selected rows in the order in which they were selected.
var selectedRows = $("#example-table").tabulator("getSelectedRows"); //get array of currently selected row components.
Callbacks
A range of callbacks are available for row selection. See the Selection Callbacks section for more information.
To allow the user to move rows up and down the table, set the movableRows parameter in the options:
$('#example-table'),tabulator({
movableRows: true, //enable user movable rows
})
This will allow users to drag rows around by clicking and dragging on any part of the row.
Note: When grouping is enabled, rows can only be moved within their own group.
Row Handles
If you would prefer the user only be able to move a column around by one particular cell, the you can set the rowHandle property to true in the column definition object for that column to restrict the trigger for row movement to that cell only.
The jQuery library does not currently support touch events. To enable movable rows on a touch device, you will need to include the excellent touchpunch.js library which adds touch event support touch event support to jQuery.
Scroll To Row
If you want to trigger an animated scroll to a row then you can use the scrollToRow function. The first argument should be any of the standard row component look up options for the row you want to scroll to.
Columns Definition - The column definition object for the column you want to add.
Before (optional) - Determines how to position the new column. A value of true will insert the column to the left of existing columns, a value of false will insert it to the right. If a Position argument is supplied then this will determine whether the new colum is inserted before or after this column.
Position (optional) - The field to insert the new column next to, this can be any of the standard column component look up options.
Delete Column
To permanently remove a column from the table deleteColumn function. This function takes any of the standard column component look up options as its first parameter.
Alternatively if you have the ColumnComponent of the column you wish to delete, you can call the delete function directly on the component.
column.delete();
Get Column Definitions
To get the current column definition array (including any changes made through user actions, such as resizing or re-ordering columns), call the getColumnDefinitions function. this will return the current columns definition array.
var colDefs = $("#example-table").tabulator("getColumnDefinitions") //get column definition array
Get Column Components
To get an array of ColumnComponent's for the current table setup, call the getColumns function.
var cols = $("#example-table").tabulator("getColumns") //get array of column components
If you are planning on having multiple tables on the same page using column persistence then Tabulator needs a way to uniquely identify each table. There are two ways to do this either set the id attribute on the element that will hold the Tabulator, Tabulator will automatically use this id as a reference for the storage id.
<div id="example-table"></div>
Alternatively if you do not want to give an id to the table holding element you can set the tabulator options parameter persistentLayoutID to a unique storage id for that table.
$("#example-table").tabulator({
persistentLayout:true, //Enable column layout persistence
persistentLayoutID:"example1", //id string, can only be numbers, letters, hyphens and underscores.
});
Note: If you update the column definition array after the the layout has been stored you may have to change the storage id to clear out the old column layout information.
Get Column Layout Information New
If you want to handle column layout persistence manually, for example storing it in a database to use elsewhere, you can use the getColumnLayout function to retrieve a layout object for the current table.
var columnLayout = $("#example-table").tabulator("getColumnLayout");
Set Column Layout New
If you have previously used the getColumnLayout function to retrieve a tables layout, you can use the setColumnLayout function to apply it to a table.
Column titles can be made user editable by setting the editableTitle parameter to true in a columns definition object.
{title:"Name", field:"name", editableTitle:true} //allow user to update this columns title
This will result in the columns title being displayed in an input element, that will let the user change the title.
After a the user changes a column title the colTitleChanged callback is triggered.
("#example-table").tabulator({
colTitleChanged:function(value, col, cols){
//value - the new column value
//col - the updated column definition object for the affected column
//cols - the updated column definition array for all columns in the table
},
});
Column Visibility
Column visibility can be set in a number of different ways.
Column Definition Visibility
You can set the column visibility when you create the column definition array:
{title:"Name", field:"name", visible:false}, //create hidden column for the field "name"
By default columns are set with a visible parameter value of true.
Show Column
You can show a hidden column at any point using the showColumn function. Pass the field name of the column you wish to show as the first parameter of the function.
$("#example-table").tabulator("showColumn","name") //show the "name" column
Alternatively if you have the ColumnComponent of the column you wish to show, you can call the show function directly on the component.
column.show();
Hide Column
You can hide a visible column at any point using the hideColumn function. Pass the field name of the column you wish to hide as the first parameter of the function.
$("#example-table").tabulator("hideColumn","name") //hide the "name" column
Alternatively if you have the ColumnComponent of the column you wish to hide, you can call the hide function directly on the component.
column.hide();
Toggle Column
You can toggle the visibility of a column at any point using the toggleColumn function. Pass the field name of the column you wish to toggle as the first parameter of the function.
$("#example-table").tabulator("toggleColumn","name") ////toggle the visibility of the "name" column
Alternatively if you have the ColumnComponent of the column you wish to toggle, you can call the toggle function directly on the component.
column.toggle();
Callbacks
A range of callbacks are available for columns. See the Column Callbacks section for more information.
CSS Classes & Theming
As of version 2.1 all Tabulator elements are styled using a range CSS classes to make it easier for you to manipulate the look, feel and function of the table.
A SASS file is also provided for each stylesheet, containing a set of variables to make generating your own theme even easier. These can be found in the src/scss directory
Packaged Themes
As well as the default theme, tabulator comes with a number of pre packaged themes. To use one of these simply include the matching css file instead of the default tabulator.css
All stylesheets can be found in the /dist/css directory, with standard CSS and minified versions available.
For example to use the simple theme, you would need to use the following css link:
The stylesheet maps the standard bootstrap table styling onto Tabulator. If you have customised your bootstrap theme, then the /src/scss/bootstrap directory also contains a variables.scss file containing all the standard bootstrap variables. Make any changes in here to match your custom theme and recompile the tabulator_bootstrap.css file and Tabulator will now match your theme.
The theme also maps some of the standard table styling classes. You can use any of these classes on your Tabulator element and get the same effect as bootstrap:
table-striped - alternating row colors
table-bordered - borders around table and between cells
table-condensed - minimal cell and header padding
You can also apply the following classes to rows using the rowFormatter to get the same results as in bootstrap:
active
success
info
warning
danger
$("#example-table").tabulator({
rowFormatter:function(row, data){
if(data.age >= 18){
row.getElement().addClass("success"); //mark rows with age greater than or equal to 18 as successful;
}
},
});
For full details on the bootstrap table layout, checkout the Bootstrap Website.
Semantic UI Theme
A Semantic UI compatible theme that can be included from:
The stylesheet maps the standard semantic ui table styling onto Tabulator. If you have customised your theme, then the /src/scss/semantic-ui directory also contains the variables.scss and variables_table.scss files containing all the standard semantic ui variables. Make any changes in here to match your custom theme and recompile the tabulator_semantic-ui.css file and Tabulator will now match your theme.
The theme also maps some of the standard table styling classes. You can use any of these classes on your Tabulator element and get the same effect as semantic ui:
striped - alternating row colors
celled - borders between cells
compact - minimal cell and header padding
very compact - almost no cell and header padding
padded - more cell and header padding
very padded - a lot more cell and header padding
The full range of colour classes can also be used:
inverted
red
orange
yellow
olive
green
teal
blue
violet
purple
brown
grey
black
You can also apply the following classes to rows or cells using the rowFormatter to get the same results as in semantic ui:
positive
negative
error
warning
active
disabled
$("#example-table").tabulator({
rowFormatter:function(row, data){
if(data.age < 18){
row.getElement().addClass("warning"); //mark rows with age less than 18 with a warning state;
}
},
});
For full details on the Semantic UI table layout, checkout the Semantic UI Website.
CSS Classes
All elements of Tabulator have classes set to make theming your tables as easy as possible.
General Classes
Class
Element Description
tabulator
Tabulator container element
tabulator-tableHolder
Contain table and scroll bars
tabulator-table
Contain table rows
tabulator-loader
Ajax loader message holder
tabulator-loader-msg
Ajax loader message
tabulator-loading
Applied to .tabulator-load-msg to style a loading message
tabulator-error
Applied to .tabulator-load-msg to style an error message
tabulator-placeholder
The containing element for the empty table placeholder
tabulator-moving
Applied to rows and columns when they are being moved
tabulator-block-select
Applied to the .tabulator element when the mouse is dragging to prevent accidental text selection
tabulator-moving
Applied to rows and columns when they are being moved
Headers & Columns
Class
Element Description
tabulator-header
Column header row
tabulator-col
Column header (in header row)
tabulator-col-content
Holds the contents for the column header
tabulator-col-title
Holds the text for the column header title
tabulator-col-group
Marks a column header as a group that contains other columns
tabulator-col-group-cols
Holds the column headers contained in a column group
tabulator-handle
Invisible resize handle on the right of each column header
tabulator-title-editor
The input box used for editing titles when the editableTitle option is set
tabulator-header-filter
The containing element for the header filter elements, when the headerFilter option is set
tabulator-sortable
Applied to columns with header sorting enabled
tabulator-frozen
The containing element for all frozen columns
tabulator-frozen-left
Applied to frozen columns on the left edge of the table
tabulator-frozen-right
Applied to frozen columns on the right edge of the table
Rows
Class
Element Description
tabulator-row
Row of table
tabulator-row-odd
Odd numbered row
tabulator-row-even
Even numbered row
tabulator-cell
Data cell
tabulator-selectable
Styling for selectable rows
tabulator-unselectable
Styling for unselectable rows
tabulator-selected
Currently selected row
tabulator-editing
Applied to cells being edited and the rows that contain them
tabulator-group
The header element for a row group
tabulator-group-visible
Applied to .tabulator-group when the group is visible
Pagination
Class
Element Description
tabulator-footer
Tabulator footer element
tabulator-paginator
Contains the pagination controls
tabulator-pages
Contains individual page buttons
tabulator-page
Page selection button
SASS Variables
The packaged SASS theme files is included in the project with a number of setup variables to make theming a table even easier.
General
Variable
Default Value
Description
backgroundColor
#888
The background colour of the tabulator element
borderColor
#999
The border colour of the tabulator element
textSize
14
The text size for all text in the tabulator
Headers & Columns
Variable
Default Value
Description
headerBackgroundColor
#e6e6e6
The background colour for header cells
headerTextColor
#555
The header cells text colour
headerBorderColor
#aaa
The header cells border colour
headerSeparatorColor
#999
The header row bottom border colour
headerMargin
4
The size in pixels for the header cells margin
sortArrowActive
#666
The colour of the column sorter arrow when sorting is active on a column
sortArrowInactive
#bbb
The colour of the column sorter arrow when sorting is not active on a column
Rows
Variable
Default Value
Description
rowBackgroundColor
#fff
The background colour of the table rows
rowAltBackgroundColor
#e0e0e0
The background colour of the even numbered table rows
rowBorderColor
#fff
The table row border colour
rowTextColor
#333
The table row text colour
rowHoverBackground
#bbb
The table row background colour when hovered over.
rowSelectedBackground
#9ABCEA
The table row background colour when selected.
rowSelectedBackgroundHover
#769BCC
The table row background colour when selected and hovered over.
editBoxColor
#1D68CD
The border colour of a cell being edited.
Pagination
Variable
Default Value
Description
footerBackgroundColor
#e6e6e6
The footer background colour
footerTextColor
#555
The footer text colour
footerBorderColor
#aaa
The footer buttons border colour
footerSeparatorColor
#999
The footer element top border colour
Component Objects Updated
Component objects allow you to interact directly with various parts of your tables. They are usually passed in the arguments of callbacks and expose a range of functions that can be called directly on the object.
Row Component
The row component provides access to a specific row. The example below shows how it is passed to the rowFormatter callback:
$("#example-table").tabulator({
rowFormatter:function(row){
var data = row.getData(); //get data object for row
if(data.col == "blue"){
row.getElement().css({"background-color":"#A6A6DF"}); //apply css change to row element
}
},
});
The component provides the following functions:
Get Data
The getData function returns the data object for the row.
var rowData = row.getData();
Get Element
The getElement function returns the jQuery DOM element for the row.
var rowElement = row.getElement();
Get Cells
The getCells function returns an array of CellComponent objects, one for each cell in the row.
var cells = row.getCells();
Get Cell in Specific Column
The getCell function returns the CellComponent for the specified column from this row.
var cells = row.getCell(column);
Get Index
The getIndex function returns the index value for the row.
var rowIndex = row.getIndex();
Delete
The delete function deletes the row, removing its data from the table
row.delete();
Scroll To
The scrollTo function will scroll the table to the row if it passes the current filters.
row.scrollTo();
Update
You can update the data in the row using the update function. You should pass an object to the function containing any fields you wish to update. This object will not replace the row data, only the fields included in the object will be updated.
row.update({"name":"steve"}); //update the row data for field "name"
Normalize Height
If you are making manual adjustments to elements contained within the row, it may sometimes be necessary to recalculate the height of all the cells in the row to make sure they remain aligned. Call the normalizeHeight function to do this.
row.normalizeHeight();
Column Component
The column component provides access to a specific column. The example below shows how it is passed to the columnMoved callback.
$("#example-table").tabulator({
columnMoved:function(column){
alert("The user has moved column: " + column.getField()); //display the columns field name
}
});
The component provides the following functions:
Get Element
The getElement function returns the jQuery DOM element for the column.
var columnElement = column.getElement();
Get Definition
The getDefinition function returns the column definition object for the column.
var columnDefinition = column.getDefinition();
Get Field
The getField function returns the field name for the column.
var columnField = column.getField();
Get Cells
The getCells function returns an array of CellComponent objects, one for each cell in the column.
var cells = column.getCells();
Get Visibility
The getVisibility function returns a boolean to show if the column is visible, a value of true means it is visible.
var visible = column.getVisibility();
Show Column
The show function shows the column if it is hidden.
column.show();
Hide Column
The hide function hides the column if it is visible.
column.hide();
Toggle Visibility
The toggle function toggles the visibility of the column, switching between hidden and visible.
column.toggle();
Delete
The delete function deletes the column, removing it from the table
column.delete();
Cell Component Updated
The cell component provides access to a specific cell. The example below shows how it is passed to the cellClick callback for a cell.
{title:"Name", field:"name", cellClick:function(e, cell){
alert("The cell has a value of:" + cell.getValue()); //display the cells value
},
}
The Component provides the following functions:
Get Value
The getValue function returns the current value for the cell.
var cellValue = cell.getValue();
Get Old Value
The getOldValue function returns the previous value of the cell. Very useful in the event of cell update callbacks.
var cellOldValue = cell.getOldValue();
Get Element
The getElement function returns the jQuery DOM element for the cell.
var cellElement = cell.getElement();
Get Row
The getRow function returns the RowComponent for the row that contains the cell.
var row = cell.getRow();
Get Column
The getColumn function returns the ColumnComponent for the column that contains the cell.
var column = cell.getColumn();
Set Value Updated
You can change the value of the cell using the setValue function. The first parameter should be the new value for the cell, the second optional parameter will apply the column mutators to the value when set to true(default = true).
cell.setValue("Steve", true); //set the cell's value to "Steve" and apply the column mutators if present
Check Height
If you are making manual adjustments to elements contained withing the cell, or the cell itself, it may sometimes be necessary to recalculate the height of all the cells in the row to make sure they remain aligned. Call the checkHeight function to check if the height of the cell has changed and normalize the row if it has.
cell.checkHeight();
Edit New
You and programmatically cause a cell to open its editor element using the edit function.
cell.edit();
Navigation New
When a cell is being edited it is possible to move the editor focus from the current cell to one if its neighbours. There are a number of functions that can be called on the nav function to move the focus in different directions.
cell.nav().left(); //move focus left to next editable cell.
You can navigate any direction around the table using the following functions:
prev - next editable cell on the left, if none available move to the right most editable cell on the row above
next - next editable cell on the right, if none available move to left most editable cell on the row below
left - next editable cell on the left, return false if none available on row
right - next editable cell on the right, return false if none available on row
up - move to the same cell in the row above
down - move to the same cell in the row below
Group Component
The group component provides access to a set of grouped rows. The example below shows how it is passed to the groupVisibilityChanged callback.
$("#example-table").tabulator({
groupVisibilityChanged:function(group, visible){
alert("The user has " (visible ? "opened" : "collapsed") +" group: " + group.getKey()); //display the groups unique key
}
});
The component provides the following functions:
Get Element
The getElement function returns the jQuery DOM element for the group header.
var groupElement = group.getElement();
Get Key
The getKey function returns the unique key that is shared between all rows in this group.
var key = group.getKey();
Get Rows
The getRows function returns an array of RowComponent objects, one for each row in the group.
var rows = group.getRows();
Get Visibility
The getVisibility function returns a boolean to show if the group is visible, a value of true means it is visible.
var visible = group.getVisibility();
Show Group
The show function shows the group if it is hidden.
group.show();
Hide Group
The hide function hides the group if it is visible.
group.hide();
Toggle Visibility
The toggle function toggles the visibility of the group, switching between hidden and visible.
group.toggle();
Component Lookup
Any function that takes a component as and argument will also attempt to find that component based on the value provided if it is not a component itself. The following values can be used for each component type:
Tabulator has a wide range of setup options to help you customise the user experience of your tables. This section outlines all the available options and links to the relevant section in this documentation to show you how to use them.
Each of these options can be set in the constructor object when you define your Tabulator.
$("#example-table").tabulator({
height:"300px", //set the table height option
});
General Table Configuration Updated
Option
Data Type
Default Value
Description
height
string/int
false
Sets the height of the containing element, can be set to any valid height css value. If set to false (the default), the height of the table will resize to fit the table data.
virtualDom
boolean
true
Enable rendering using the Virtual DOM engine
placeholder
string or element
""
placeholder element to display on empty table
footerElement
JQuery Element
(see documentation)
Footer element for the table
tooltips
boolean/function
false
Function to generate tooltips for cells
history
boolean/function
false
Enable user interaction history functionality
keybindings
boolean/function
false
Keybinding configuration object
locale
string/boolean
false
set the current localization language
langs
object
(see documentation)
hold localization templates
Columns
Option
Data Type
Default Value
Description
columns
array
[]
Holder for column definition array
fitColumns
boolean
false
Resize column widths to horizontally fill the table
responsiveLayout
boolean
false
Automatically hide/show columns to fit the width of the Tabulator element
columnMinWidth
CSS width value
40px
Minimum width for a column
resizableColumns
boolean
true
Allow user to resize columns (via handles on the left and right edges of the column header)
movableColumns
boolean
false
Allow users to move and reorder columns
tooltipsHeader
boolean/function
false
Function to generate tooltips for column headers
columnVertAlign
string
top
Vertical alignment for contents of column header (used in column grouping)
headerFilterPlaceholder
string
"filter column..."
The placeholder text to be set in any header filter input elements
Rows
Option
Data Type
Default Value
Description
rowFormatter
function/boolean
false
Function to alter layout of rows
groupBy
string/function
false
String/function to select field to group rows by
groupHeader
function
(see documentation)
function to layout group header row
groupStartOpen
boolean/function
true
Boolean/function to set the open/closed state of groups when they are first created
addRowPos
string
"bottom"
The position in the table for new rows to be added, "bottom" or "top"
selectable
boolean/integer/string
"highlight"
Enable/Disable row selection
selectableRollingSelection
boolean
true
Allow rolling selection
selectablePersistence
boolean
true
Maintain selected rows on filter or sort
selectableCheck
function
(see documentation)
Check if row should be selectable or unselectable
movableRows
boolean
false
Allow users to move and reorder rows
Data
Option
Data Type
Default Value
Description
index
string
id
The field to be used as the unique index for each row
data
array
[]
Array to hold data that should be loaded on table creation
ajaxURL
string/boolean
false
URL for remote Ajax data loading
ajaxParams
object
{}
Parameters to be passed to remote Ajax data loading request
ajaxConfig
string/object
"GET"
The HTTP request type for Ajax requests or config object for the request
ajaxFiltering
boolean
false
Send filter config to server instead of processing locally
ajaxSorting
boolean
false
Send sorter config to server instead of processing locally
ajaxLoader
boolean
true
Show loader while data is loading
ajaxLoaderLoading
string
html (see below)
html for loader element
ajaxLoaderError
string
html (see below)
html for the loader element in the event of an error
When loading data, Tabulator can display a loading overlay over the table. This consists of a modal background and a loader element. The loader element can be set globally in the options and should be specified as a div with a display style of inline-block.
The headerClick callback is triggered when a user left clicks on a column or group header, it can be set on a per column basis using the option in the columns data.
The headerDblClick callback is triggered when a user double clicks on a column or group header, it can be set on a per column basis using the option in the columns data.
The headerContext callback is triggered when a user right clicks on a column or group header, it can be set on a per column basis using the option in the columns data.
The columnMoved callback will be triggered when a column has been successfully moved.
$("#example-table").tabulator({
columnMoved:function(column, columns){
//column - column component of the moved column
//columns- array of columns in new order
}
});
Column Resized
The columnResized callback will be triggered when a column has been resized by the user.
$("#example-table").tabulator({
columnResized:function(column){
//column - column component of the resized column
}
});
Column Visibility Changed
The columnVisibilityChanged callback is triggered whenever a column changes between hidden and visible states.
The columnTitleChanged callback is triggered whenever a user edits a column title when the editableTitle parameter has been enabled in the column definition array.
The rowContext callback is triggered when a user right clicks on a row.
If you want to prevent the browsers context menu being triggered in this event you will need to include the preventDefault() function in your callback.
$("#example-table").tabulator({
rowContext:function(e, row){
//e - the click event object
//row - row component
e.preventDefault(); // prevent the browsers default context menu form appearing.
},
});
Row Added
The rowAdded callback is triggered when a row is added to the table by the addRow and updateOrAddRow functions.
The dataLoading callback is triggered whenever new data is loaded into the table.
$("#example-table").tabulator({
dataLoading:function(data){
//data - the data loading into the table
},
});
Data Loaded
The dataLoaded callback is triggered when a new set of data is loaded into the table.
$("#example-table").tabulator({
dataLoaded:function(data){
//data - all data loaded into the table
},
});
Data Edited
The dataEdited callback is triggered whenever the table data is changed by the user. Triggers for this include editing any cell in the table, adding a row and deleting a row.
$("#example-table").tabulator({
dataEdited:function(data){
//data - the updated table data
},
});
HTML Importing
The htmlImporting callback is triggered when Tabulator starts importing data from an HTML table.
The ajaxRequesting callback is triggered when ever an ajax request is made.
$("#example-table").tabulator({
ajaxRequesting:function(url, params){
//url - the URL of the request
//params - the parameters passed with the request
},
});
Ajax Response
The ajaxResponse callback is triggered when a successful ajax request has been made. This callback can also be used to modify the received data before it is parsed by the table. If you use this callback it must return the data to be parsed by Tabulator, otherwise no data will be rendered.
$("#example-table").tabulator({
ajaxResponse:function(url, params, response){
//url - the URL of the request
//params - the parameters passed with the request
//response - the JSON object returned in the body of the response.
return response; //return the response data to tabulator
},
});
Ajax Error
The ajaxError callback is triggered there is an error response to an ajax request.
$("#example-table").tabulator({
ajaxError:function(xhr, textStatus, errorThrown){
//xhr - the XHR object
//textStatus - error type
//errorThrown - text portion of the HTTP status
},
});
Filter Callbacks
Data Filtering
The dataFiltering callback is triggered whenever a filter event occurs, before the filter happens.
$("#example-table").tabulator({
dataFiltering:function(filters){
//filters - array of filters currently applied
},
});
Data Filtered
The dataFiltered callback is triggered after the table dataset is filtered.
$("#example-table").tabulator({
dataFiltered:function(filters, rows){
//filters - array of filters currently applied
//rows - array of row components that pass the filters
},
});
Sorting Callbacks
Data Sorting
The dataSorting callback is triggered whenever a sort event occurs, before sorting happens.
$("#example-table").tabulator({
dataSorting:function(sorters){
//sorters - an array of the sorters currently applied
},
});
Data Sorted
The dataSorted callback is triggered after the table dataset is sorted.
$("#example-table").tabulator({
dataSorted:function(sorters, rows){
//sorters - array of the sorters currently applied
//rows - array of row components in their new order
},
});
Layout Callbacks
Render Started
The renderStarted callback is triggered whenever all the rows in the table are about to be rendered. This can include:
Data is loaded into the table when setData is called
A page is loaded through any form of pagination
Rows are added to the table during progressive rendering
Whenever a page has been loaded, the pageLoaded callback is called, passing the current page number as an argument.
$("#example-table").tabulator({
pageLoaded:function(pageno){
//pageno - the number of the loaded page
}
});
Localization
Table Localized
When a localization event has occurred , the localized callback will triggered, passing the current locale code and language object:
$("#example-table").tabulator({
localized:function(locale, lang){
//locale - a string representing the current locale
//lang - the language object for the current locale
},
});
Group Callbacks
Data Grouping
The dataGrouping callback is triggered whenever a data grouping event occurs, before grouping happens.
The dataGrouped callback is triggered whenever a data grouping event occurs, after grouping happens.
$("#example-table").tabulator({
dataGrouped:function(groups){
//groups - array of group components
},
});
Group Visibility Changed
The groupVisibilityChanged callback is triggered whenever a group changes between hidden and visible states.
$("#example-table").tabulator({
groupVisibilityChanged:function(group, visible){
//group - group component
//visible - is group visible (true = visible, false = hidden)
},
});
Selection Callbacks
Row Selected
The rowSelected event is triggered when a row is selected, either by the user or programmatically.
$("#example-table").tabulator({
rowSelected:function(row){
//row - row component for the selected row
},
});
Row Deselected
The rowDeselected event is triggered when a row is deselected, either by the user or programmatically.
$("#example-table").tabulator({
rowDeselected:function(row){
//row - row component for the deselected row
},
});
Row Selection Changed
Whenever the number of selected rows changes, through selection or deselection, the rowSelectionChanged event is triggered. This passes an array of the data objects for each row in the order they were selected as the first argument, and an array of jQuery elements for each of the rows in order of selection as the second argument.
$("#example-table").tabulator({
rowSelectionChanged:function(data, rows){
//rows - array of row components for the selected rows in order of selection
//data - array of data objects for the selected rows in order of selection
},
});
If you give a table focus by clicking on it, you can then interact with the table using the a number of different keyboard short cuts.
Action
Default Key Combination (keycode)
Function
navPrev
ctrl + tab ("ctrl + 9")
Shift focus to the next editable cell on the left, if none available move to the right most editable cell on the row above
navNext
tab ("9")
Shift focus to the next editable cell on the right, if none available move to left most editable cell on the row below
navLeft
Shift focus to next editable cell on the left
navRight
Shift focus to next editable cell on the right
navUp
up arrow ("38")
Shift focus to the same cell in the row above
navDown
down arrow ("40")
Shift focus to the same cell in the row below
undo
ctrl + z ("ctrl + 90")
Undo last user data edit
redo
ctrl + y ("ctrl + 89")
Redo last user data edit
Customize Key Bindings
If you would prefer to use different key combinations then that is no problem, you can use the keybindings option to change any of the above bindings.
The keybindings option takes an object that should consist of properties with the name of the action you wish to bind and a value of the key code string.
The key code should consist of the keycodes for the keys to be pressed, separated by the + symbol. The exceptions to this are ctrl and shift which should be used to check that the ctrl or shift keys are pressed as well.
The example below shows how to change the key bindings for the redo function to user the ctrl and r keys:
$("#example-table").tabulator({
keybindings:{
"redo" : "ctrl + 82", //bind redo function to ctrl + r
},
});
Disable A Default Key Binding
To disable any of the default keybindings, pass a value of false to is property in the keybindings option:
Tabulator allows you to download the table data as a file directly from your browser, no server needed.
The download will contain the text values of all data currently visible in the table, matching the current column layout, column titles, sorting and filtering.
You have a choice of four file types to choose from:
To trigger a download, call the download function, passing the file type (from the above list) as the first argument, and an optional second argument of the file name for the download (if this is left out it will be "Tabulator.ext"). The optional third argument is an object containing any setup options for the formatter, such as the delimiter choice for CSV's).
$("#example-table").tabulator("download", "csv", "data.csv"); //download table data as a CSV formatted file with a file name of data.csv
Custom CSV Delimiters
By default CSV files are created using a comma (,) delimiter. If you need to change this for any reason the you can pass the options object with a delimiter property to the download function which will then use this delimiter instead of the comma.
$("#example-table").tabulator("download", "csv", "data.csv", {delimiter:"."}); //download a CSV file that uses a fullstop (.) delimiter
Custom File Formatter
If you want to create a custom file type from the table data then you can pass a function to the type argument, instead of a string value. At the end of this function you must call the setFileContents function, passing the formatted data and the mime type.
//custom file formatter
var fileFormatter = function(columns, data, options, setFileContents){
//columns - column definition array for table (with columns in current visible order);
//data - currently displayed table data
//options - the options object passed from the download function
//setFileContents - function to call to pass the formatted data to the downloader
//create a list of all name fields
var names = [];
data.forEach(function(row){
names.push(row.name);
})
//trigger file download, passing the formatted data and mime type
setFileContents(names.join(", "), "text/plain");
}
//trigger file download
$("#example-table").tabulator("download", fileFormatter, "test.txt");
Note: You can find out more about data URI's Here.
If you want to make your table accessible to users from a wide variety of languages then Tabulators localization features are for you.
Using the langs option you can specify the localized content for the table in any number of languages.
You can store as many languages as you like, creating an object inside the langs object with a property of the locale code for that language. A list of locale codes can be found here.
At present there are three parts of the table that can be localised, the column headers, the header filter placeholder text and the pagination buttons. To localize the pagination buttons, create a pagination property inside your language object and give it the properties outlined below.
If you wish you can also localize column titles by adding a columns property to your language object. You should store a property of the field name of the column you wish to change, with a value of its title. Any fields that match this will use this title instead of the one provided by the column definition array.
$("#example-table").tabulator({
locale:true,
langs:{
"en-gb":{
"columns":{
"name":"Name", //replace the title of column name with the value "Name"
},
"ajax":{
"loading":"Loading", //ajax loader text
"error":"Error", //ajax error text
},
"pagination":{
"first":"First", //text for the first page button
"first_title":"First Page", //tooltip text for the first page button
"last":"Last",
"last_title":"Last Page",
"prev":"Prev",
"prev_title":"Prev Page",
"next":"Next",
"next_title":"Next Page",
},
"headerFilters":{
"default":"filter column...", //default header filter placeholder text
"columns":{
"name":"filter name...", //replace default header filter text for column name
}
}
}
},
});
Setting the Locale
You can set the current local in one of two ways. If you want to set it when the table is created, simply include the locale option in your Tabulator constructor. You can either pass in a string matching one of the language options you have defined, or pass in the boolean true which will cause Tabulator to auto-detect the browsers language settings from the navigator.language object.
$("#example-table").tabulator({
locale:true, //auto detect the current language.
});
You can also set the language at any point after the table has loaded using the setLocale function, which takes the same range of values as the locale setup option mentioned above.
$("#example-table").tabulator("setLocale", "fr"); //set locale to french
Note: if Tabulator cant find a match, it will try and find the next best thing. For example if you were trying to set the locale to Belgian French "fr-be", if that option had not been defined, then Tabulator would go on to look for an"fr" option instead. if no matching locale is found then Then tabulator will default to using its built-in English language text.
When a localization event has occurred , the localized callback will triggered, passing the current locale code and language object:
$("#example-table").tabulator({
localized:function(locale, lang){
//locale - a string representing the current locale
//lang - the language object for the current locale
},
});
Getting the Current Locale
It is possible to retrieve the locale code currently being used by Tabulator using the getLocale function:
$("#example-table").tabulator("getLocale"); //return string for current locale code
Extending Localization
As well as the default columns and pagination properties required in the language object, you can also add any additional properties you like to the object to be used in localising other elements.
$("#example-table").tabulator({
langs:{
"en-gb":{
"custom":{
"site_name":"What A Great Table Based Site!!!",
},
"columns":{
"name":"Name", //replace the title of column name with the value "Name";
},
"pagination":{
"first":"First", //text for the first page button
"first_title":"First Page", //tooltip text for the first page button
"last":"Last",
"last_title":"Last Page",
"prev":"Prev",
"prev_title":"Prev Page",
"next":"Next",
"next_title":"Next Page",
},
}
},
});
You can then access these at any point using the getLang function, which will return the language object for the currently active locale.
$("#example-table").tabulator("getLang"); //return current lang object
Accessibility
Tabulator makes full use of aria accessibility tags to make the table machine readable by screen readers and other digital accessibility equipment.
The following role tags are used:
grid - Marks the element containing the tabulator as a grid
columngroup - Marks any column group title cells
columnheader - Marks each column header cell
row - Marks each row of the table
rowgroup - Marks any sections of grouped rows
rowheader - Marks the header of row group sections
gridcell - Marks each cell of the table
alert - Marks ant popup messages such as the ajax loader message
button - used to mark the pagination controls as buttons
In addition a number of other tags are used as needed throughout Tabulator:
aria-label - Used to hold cell value on graphically formatted cells. also used to give useful information on pagination controls
aria-sort - Shows current sort property of each column
aria-disabled - Shows the disabled state of pagination controls
aria-checked - Shows the checked state of cells that use a tick formatter
aria-valuemin - Shows the minimum possible value on the progressbar editor
aria-valuemax - Shows the maximum possible value on the progressbar editor
aria-valuenow - Shows the current value on the progressbar editor
Extensions Updated
Tabulator is built in a modular fashion with a core codebase providing basic table rendering functionality and a series of extensions that provide all of its wonderful features.
All of the available extensions are installed by default to ensure that you can provide your users with the richest experience possible with minimal setup.
Creating a Custom Tabulator Build
If you want to run a minimal installation of Tabulator, using only the extensions needed for your project then you will need to rebuild a custom distribution using the steps below.
Tabulator's codebase is composed of a number of files located in the /src folder, and is built using the Gulp Task Runner. The gulpfile.js file that controls the build can be found in the root directory.
As gulp is a Node.js tool, you will first need to make sure you have Node.js installed.
Once installed you will then need to install the gulp plugin by opening a console window in the tabulator folder and typing the following command:
npm install gulp-cli -g
You will then need to setup the project by opening a console window in the root of the Tabulator directory and typing the following command:
npm install
You are now ready to make a custom build. The /src/extensions_enabled.js file lists all extensions that will be installed in the build (they are supposed to be in comments). To remove an extension from your build, simply delete its line in the file.
Once you are happy with the list of extensions that are going to be installed you need to trigger the build process. To do this open a console in the root of the Tabulator directory and run the following command:
gulp
Wait for the command to finish processing, then the /dist folder will contain your own custom build of Tabulator!
Extending Extensions
A lot of the extensions come with a range of default settings to make setting up your table easier, for example the sorters, formatters and editors that ship with Tabulator as standard.
If you are using a lot of custom settings over and over again (for example a custom sorter). you can end up re-declaring it several time for different tables. To make your life easier Tabulator allows you to extend the default setup of each extension to make your custom options as easily accessible as the defaults.
Using the extendExtension function on the global Tabulator variable allows you to globally add these options to all tables.
The function takes three arguments, the name of the extension, the name of the property you want to extend, and an object containing the elements you want to add in your extension. In the example below we extend the format extension to add two new default formatters:
Tabulator.extendExtension("format", "formatters", {
bold:function(cell, formatterParams){
return "<strong>" + cell.getValue() + "</strong>"; //make the contents of the cell bold
},
uppercase:function(cell, formatterParams){
return cell.getValue().toUpperCase(); //make the contents of the cell uppercase
}
});
These formatters can then be access like any of the default formatters in the column definition object:
This can be extended to add custom accessor functions to the default list:
Tabulator.extendExtension("accessor", "accessors", {
roundDown:function(value, data, accessorParams){
return Math.floor(value); //return the new value for the cell data.
}
});
You can use an accessor defined in the extension by passing the name to the accessor property in the column definition object.
The ajax extension allows for loading data from remote sources using ajax requests.
More information on these functions can be found in the Ajax Documentation.
The default ajax configuration object can be extended to changed the default request behaviour. the example below will change the default request type to POST and the contentType header to application/JSON.
The persistent layout extension allows the layout of columns to be stored in local storage or cookies so that a users preferences can be remembered every time they reload the page.
If you always pass the same setup options to your Tabulator constructor object, you can also make these default by Aextending the jQuery widget, these will then automatically apply to any new Tabulator's unless the value is overwritten in construction object when you create a specific Tabulator.
This code must be inserted after the tabulator.js file is included but before any tables are instantiated.
For example the below code will cause all Tabulators to have resizable columns by default.