Skip to main content

    DataTable

    The DataTable is a component for building tables which organize information into rows and columns.

    Import

    import { DataTable } from '@dynatrace/strato-components/tables';

    Demo

    CodeSandbox
    Data and column memoization

    Make sure to memoize the data and columns props passed to the DataTable and use the useMemo hook so the props don't change on each render cycle.

    Columns

    Table size limit

    The DataTable supports a maximum of 10,000 columns (including built-in columns) due to CSS Grid layout constraints. This aligns with W3C CSS Grid Layout Module recommendations. Exceeding this limit may cause rendering issues in browsers such as Firefox.

    Define column types

    You can assign a predefined type to every column. Available types: text, date, bit, number, long, currency, log-content, sparkline, meterbar, markdown, and gantt. Column values render and sort according to their predefined types.

    By default, columns of type text automatically detect and render links. To disable this feature, set the detectLinks prop in the column config to false. If you use a custom cell renderer, you can also apply the detectLinks function.

    Note

    When setting the column type to log-content, only the first 1,000 characters are highlighted to optimize performance for datasets of any size. In addition, log lines are truncated after 1,000 characters. This limit can be changed via the truncationLimit property in the column config. Note that any trailing whitespaces are removed after truncation.

    Note

    If the column type is set to date, nanosecond precision is only supported when the input includes sub-second time information, such as hh:mm:ss.sssssssss. This typically includes the ISO 8601 strings with fractional seconds. In all other cases, the precision is limited to milliseconds due to the constraints of the JavaScript Date type.

    CodeSandbox

    Customize markdown rendering

    Use the customComponentMappings config to override the default markdown rendering behavior.

    import { Components } from '@dynatrace/strato-components/core';

    const customMappings: Components = {
    h2: ({ children }: PropsWithChildren) => (
    <i>
    <h2>{children}</h2>
    </i>
    ),
    };

    const columns = [
    // ...
    {
    header: 'Markdown',
    accessor: 'markdown',
    id: 'markdown',
    columnType: 'markdown',
    width: 220,
    config: { customComponentMappings: customMappings },
    },
    ];

    Column sizing

    To set default column widths, use defaultColumnSizing as a DataTable prop. This property requires an object that maps column IDs to their respective widths in pixels.

    CodeSandbox

    Control column sizing

    To activate the column resizing feature in DataTable, you must include the resizable property within the table configuration. This property acts as a flag that allows the user to adjust column widths.

    You can track the changes to column widths during resizing events with the onColumnSizingChange and columnSizing properties. The callback triggered upon resizing delivers data for the current widths of all columns. This information can be used to record and maintain the dimensions of resized columns. For instance, as demonstrated here, whenever the email column is resized, it reverts to a default width of 300px.

    Note

    As soon as a resizing event starts, all columns with a fraction width or no defined width will be locked to their current width.

    CodeSandbox

    Control column width behavior

    The DataTable lets you control column width behavior in different ways:

    • Fixed width in pixels: You can set a fixed width for the column by specifying the exact number of pixels. For example, width: 100 would set the column to 100 pixels wide.

    • Minimum and maximum width constraints: You can specify minWidth and maxWidth in the exact number of pixels to set width boundaries for a column. maxWidth will not work on fraction widths, to avoid circular width calculations.

    • Flexible width in fractions: You can set a flexible width for the column using a fractional unit. This is done by specifying the width as a fraction, like width: '1fr'. This approach allows the column to take up a proportion of the available space, adjusting dynamically based on the total space available and the fractional values assigned to other columns. For instance, if you have two columns and set their widths to width: '1fr' and width: '2fr', the second column will be twice as wide as the first one.

    • Fit to content: To make a column's width automatically adjust to fit the content of its cells, set the column's width property to content.

    • Shared leftover space: If you want certain columns to share the leftover space among themselves set the option to a fraction value for those columns. See the example in allow certain columns to occupy the remaining space.

    • auto will hand over control about the column size to the browsers grid layout and follows the layout engine and specification of the browser. Reference MDN grid documentation for details.

    • You can also set a maximum width for the column when using either of the previous two options by configuring it like this: {type: 'auto' | 'content', maxWidth: 100}. Here, maxWidth specifies the maximum width in pixels.

    CodeSandbox

    Allow specific columns to occupy remaining space

    Your DataTable may have columns that are more important than others. Between these columns, you can spread the remaining space within the table by providing a fraction width like 1fr for the columns. In the example below the columns Memory Total and Timestamp occupy each one fraction of the remaining space, and the Price column takes up two fractions.

    CodeSandbox

    Accessors

    Accessors specify how to retrieve column data from your data structure. Accessor strings that contain dots allow you to retrieve nested data. If the actual property key contains a dot, you can escape an accessor by enclosing the string in square brackets. It is also possible to specify an accessor function that returns the value you want to extract. See the code below for examples of each.

    CodeSandbox

    Define header groups

    It is possible to define header groups by providing a nested array of columns via the columns property in the column definition. Currently, a header group can only contain columns and not another nested header group.

    CodeSandbox

    Customize column header

    To customize the column header, simply use the header property within the column definition. Assign a function to this property that returns a customized JSX element.

    You can also use the optional label property for accessibility and for elements such as column settings. If the label isn't defined, the column's id will be used as a fallback.

    As with cells, to maintain the default header styling, you must wrap each return statement with the DataTable.DefaultHeader element. The DataTable.DefaultHeader also supports className and style props, allowing further customization of the header appearance.

    Caution

    Avoid placing interactive elements within a custom-rendered header if column actions are already configured for the same column. Since a column header with column actions already includes a button element, adding additional interactive elements inside may result in unexpected behavior.

    CodeSandbox

    Configure column visibility

    The column visibility feature allows you to specify which columns should be visible and which should be hidden. Use the defaultColumnVisibility prop to define the column visibility state. Provide an object with the respective column IDs as keys and boolean values indicating their visibility. A value of true means the column is visible, while false means it is hidden. By default, all columns are visible.

    CodeSandbox

    Column visibility UI elements

    To allow the user to show and hide columns, you need to configure the corresponding UI elements in the table. Column visibility can be controlled through either the DataTable.Toolbar or the DataTable.ColumnActions.

    Use the DataTable.VisibilitySettings component inside the toolbar, to render a trigger for the column settings and enable the visibility settings. To let users hide a column via the column actions, include the TableActionsMenu.HideColumn as a menu item.

    To prevent a specific column from being hidden, set the disableColumnHiding prop to true in the column definition. For header groups, the group itself cannot be hidden if at least one of its child columns has disableColumnHiding prop set to true.

    CodeSandbox

    Control column visibility

    To control column visibility, use the columnVisibility prop to provide the visibility state, along with the onColumnVisibilityChange callback which allows you to react to visibility changes.

    CodeSandbox

    Reset column visibility

    Column visibility can be reset to default original value using the column settings overlay trigger in toolbar. A custom reset state can be set using the resetColumnVisibility prop in DataTable.VisibilitySettings component, which allows the column visibility state to be set to the provided reset state. In uncontrolled, the column visibility resets to defaultColumnVisibility prop state if present or original visibility state. This ensures that the columns can be easily reverted to their default visibility state whenever needed. Reset button is disabled when the current state is the same as the default state.

    CodeSandbox

    Open column settings programmatically

    You can open the column settings programmatically using the openColumnSettings() function. By default, the settings modal is opened with the same options (column visibility, column order and/or column pinning settings) as specified in the DataTable.Toolbar. However, you can override these options via the function's parameters. This is particularly useful if the data table is used without its built-in toolbar.

    CodeSandbox

    Configure column order

    To enable column ordering, set the columnOrdering prop to true.

    For uncontrolled, you can optionally use defaultColumnOrder to define the initial column order, by providing an array of all column IDs in the desired order. If you don't specify any order, the initial order is inferred from the column definition.

    The defined column order should include all columns and ensure that child columns with the same parent are not separated. To avoid invalid configurations, the passed column order is validated and corrected if necessary. The following issues will be resolved:

    • duplicate column IDs
    • column IDs that don't exist in the column definition
    • missing column IDs
    • column IDs within the same group that are not adjacent

    When column ordering is enabled, column headers will be draggable. To move a column to another position hold down the mouse on the column header and then release it when you have moved it to its destination. This is also possible using touch (press, hold and release).

    CodeSandbox

    Column order UI elements

    In addition to drag and drop, the column order can be adjusted using corresponding UI elements in the table. You can control the column order through either the DataTable.Toolbar or the DataTable.ColumnActions.

    Use the DataTable.ColumnOrderSettings component within the toolbar to render a trigger for the column settings and enable the column order settings. To allow users to move a column via the column actions, include the TableActionsMenu.ColumnOrder as a menu item.

    CodeSandbox

    Control column order

    To control column order, use the columnOrder prop to provide the desired order, along with the onColumnOrderChange callback which allows you to react to changes in the column order.

    CodeSandbox

    Reset column order

    Column order can be reset to default original value using column settings overlay trigger inside the toolbar. A custom reset state can be set using the resetColumnOrder prop can be set in DataTable.ColumnOrderSettings component, which allows the column order state to be set to the provided reset state. In uncontrolled, the column order resets to defaultColumnOrder prop value if present or original order. This ensures that the columns can be easily reverted to their default order whenever needed. Reset button is disabled when the current state is the same as the default state.

    CodeSandbox

    Configure pinned columns

    Column pinning enables individual columns to remain pinned to the left or right edge of the table, improving visibility for important data. To enable column pinning, set the columnPinning prop to true.

    Default pinned columns

    The built-in columns for drag and drop row ordering, row selection, expandable rows, and row actions are always pinned by default and cannot be unpinned, regardless of whether column pinning is enabled.

    For uncontrolled usage, you can use defaultPinnedColumns to define the initial pinned state. This prop accepts an object with two optional properties:

    • left: An array of child column IDs to pin to the left side.
    • right: An array of child column IDs to pin to the right side.
    Limitations

    While ordering is supported for unpinned columns, pinned columns cannot be re-ordered. Unpinned columns can be re-ordered via column actions and column settings.

    CodeSandbox

    Column pinning UI elements

    Column pinning can be configured through the table's UI. To enable users to pin and unpin columns via the column actions menu, use DataTable.ColumnActions and include TableActionsMenu.ColumnPinning as a menu item.

    To render a trigger for the column settings and enable column pinning settings, use the DataTable.ColumnPinningSettings component inside the DataTable.Toolbar.

    CodeSandbox

    Control column pinning

    To control column pinning, use the pinnedColumns prop to specify which columns should be pinned to the left or right. To handle updates, provide an onPinnedColumnsChange callback to respond to changes in the pinned column state.

    CodeSandbox

    Customize the label of the column settings trigger

    Adding the DataTable.ColumnSettingsTrigger component inside DataTable.Toolbar in combination with DataTable.VisibilitySettings, DataTable.ColumnOrderSettings, or DataTable.ColumnPinningSettings allows you to configure a custom text that will be displayed as the trigger label for the column settings.

    CodeSandbox

    Rows

    Enable interactive rows

    To activate interactive rows in DataTable, you must configure the interactiveRows prop on the table. This will make the entire row highlightable and selectable by the user. A row can be activated either by clicking on it or focusing it.

    CodeSandbox

    Disable auto-activation for interactive rows

    By default, interactive rows are automatically activated when they are focused using the keyboard. However, if you want to disable automatic activation, you can do so by setting interactiveRows={{ autoActivate: false }}. This allows you to activate a specific row by pressing the Enter key.

    CodeSandbox

    To enable navigation from interactive rows, use the link prop within the interactiveRows prop. link accepts a function that receives the row's data and returns a URL. When a row is clicked or activated via the Enter key, the user will be directed to the specified URL.

    CodeSandbox

    Control interactive rows

    When you want to control which row is currently activated, you use the activeRow prop. This prop allows you to specify which row should be marked as active at any given time. To make this dynamic, you can also provide a handler function for the onActiveRowChange callback. The rows themselves are identified by the rowId, which can be customized as well. For details on how to do this, reference the control row IDs section.

    Note

    In addition to the interactiveRows prop, it is advised to debounce the row activation when auto-activation is enabled. This allows you to specify by how many milliseconds the activation of a row should be delayed for better performance. By default, the row is immediately activated.

    CodeSandbox

    Provide sub-rows

    The DataTable component offers the capability to include sub-rows.

    1. Enable sub-rows - To activate this functionality, the subRows prop must be defined. This prop accepts either a boolean value, which activates the default sub-row view, or an object configuration.

    2. Provide sub-rows data - Simply define the respective sub-row data by adding the subRows property to the parent row's data definition. The specified sub-rows must have the same data structure as the parent rows and can be nested over multiple levels.

    Use the defaultOpenSubRows prop to specify sub-rows that are already open upon initial rendering. The onOpenSubRowsChange handler allows you to react to changes in the currently open sub-rows.

    The defaultOpenSubrows/openSubRows expects the id of the row (unless otherwise specified, this is the array index of the data) along with a boolean whether or not it's opened. Nested sub-rows are separated with a dot by default, so '0.0' would be the first row's first sub-row. For details on how to customize row IDs, reference the control row IDs section.

    Note

    The column containing the sub-row indicator should always be left aligned.

    CodeSandbox

    Configure sub-rows

    To further configure sub-rows, you can pass a configuration object to the subRows prop, using the following options:

    1. accessor—Provides a custom accessor that retrieves the corresponding sub-rows for each row from the data.

    2. subRowColumnId—Specifies the ID of the column in which to inject the sub-row indicator. By default, this is the first visible column.

    3. disableSubRow—Accepts a function that evaluates whether or not to disable the sub-row trigger for a given row.

    CodeSandbox

    Control sub-rows

    To control the state of the open sub-rows, provide the desired rows using the openSubRows prop along with a handler for the onOpenSubRowsChange callback.

    CodeSandbox

    Enable expandable rows

    Expandable rows allow you to add additional data to a row. This information is only visible when the row is expanded.

    The default state of each row can be controlled using the defaultExpandedRows prop on the DataTable.ExpandableRow slot child. To control each row over the lifetime of the table use the expandedRows property and the onExpandedRowsChange callback.

    In this example, every second row is disabled for demo purposes.

    CodeSandbox

    Enable row selection

    To activate row selection in DataTable, you must configure the selectableRows prop on the table. Assigning a boolean value to this prop will add a checkbox in the first column across all rows, enabling selection functionality. Alternatively, selectableRows can be defined as an object, allowing for further customization through the following options:

    1. disableRowSelection - Accepts a function that takes the row's data as input and returns a boolean value. If it returns true, the row will be non-selectable; if false, the row will be selectable.

    2. selectAllBehavior - A string value that specifies whether the Select all action applies to only the currently visible rows on the page or to all rows within the table.

    3. limit - A positive integer that sets the maximum number of selectable rows.

    Note

    If a limit is specified, rows will still be de-selectable even when disableRowSelection is enabled. This prevents inconsistent states where the selection limit is reached but all selected rows are disabled, making it impossible to adjust the selection.

    To set up rows that should be selected as soon as your table loads, you need to use a prop defaultSelectedRows. This option should be assigned an object that specifies which rows are selected. Each row is identified by its id, and the selection state is indicated by a boolean value (true for selected, false for not selected). To ensure correct selection behavior when updating table data dynamically (e.g., adding or removing rows), make sure to provide unique row IDs.

    It is possible to select or deselect multiple rows at once by first clicking on a start row, then holding the Shift key while clicking on an end row.

    CodeSandbox

    Control row selection

    When you want to control which rows are selected, you use the selectedRows prop. This prop allows you to specify which rows should be considered selected at any given time. To make this dynamic, so that it can change in response to user actions, you also provide a handler function for the onRowSelectionChange callback.

    Here's how it works:

    • selectedRows prop: This is where you pass an object that represents the currently selected rows. Each row is identified by its id, and the selection state is indicated by a boolean value (true for selected, false for not selected).
    • onRowSelectionChange callback: This function is called whenever the selection changes, such as when a user clicks on a row checkbox. The callback function receives information about the new set of selected rows. By using these two together, you can maintain the selection state outside of the component, giving you full control over the behavior of the selection.
    CodeSandbox

    Control select-all behavior

    The string value selectAllBehavior specifies whether the Select all action applies only to currently visible rows or all rows within the table. As usual, you must memoize the configuration object to avoid unwanted side effects.

    CodeSandbox

    Control row IDs

    Features like row selection, sub-rows and row interactivity by default use a row id based on the index of the data that is passed. This can be problematic when you want to persist any of the states while the data itself changes. For this usecase you are able to change how rows are identified by providing a rowId function on the DataTable. When providing a custom row id function, for sub row identification, the row IDs will be separated by character.

    CodeSandbox

    Configure row order

    To enable row ordering, set the rowOrdering prop to true. Note that if you are providing your own row IDs you need to specify the rowId prop.

    For uncontrolled, you can optionally use defaultRowOrder to define the initial row order, by providing an array of all row IDs in the desired order. If you don't specify any order, the initial order is inferred from the order in data.

    To enable drag and drop row ordering, you can pass a configuration object to the rowOrdering prop with the option enableDragAndDrop set to true. Additionally, the option disableRowDragAndDrop accepts a function that takes the row's data as input and returns a boolean value. If true is returned, drag and drop will be disabled for the row, otherwise it is enabled.

    Additionally, the lockDisabledRows option ensures that rows with disabled drag and drop remain fixed in place when sorted to the start or end of the table. Consequently, other rows cannot be dropped above or below these locked rows. If set to true, the rows are locked when sorted to the start or end of the table. Optionally, lockDisabledRows can be set to 'start' or 'end' if rows should be locked solely at the start or at the end.

    When drag and drop is enabled, a drag handle for every row will be rendered in the first column. To move a row to another position hold down the mouse on the drag handle and then release it when you have moved it to its destination. This is also possible using touch (press, hold and release).

    Alternatively, using the keyboard use the tab key to focus the drag handle and then press the spacebar once. Use the up and down arrow keys to move the row to its destination and then press the spacebar again to release it. To cancel press escape.

    If you are using row ordering with pagination and modifying the data, you should set autoResetPageIndex to false to prevent the pagination jumping back to the first page. If you are only modifying the rowOrder then there is no need.

    CodeSandbox

    Control row ordering

    For controlled, the rowOrder prop holds the order of the rows. This is an ordered set of string IDs of the rows. It's up to you to use the onRowOrderChange event to update row order and optionally update the original data as you see fit.

    CodeSandbox

    Order rows with disabled drag and drop

    To facilitate disabling of drag and drop functionality for certain rows, we provide the useLockedRowOrder hook. This hook disables drag and drop functionality for the specified rows and locks them at the start or the end of the table. It takes an object with the following options:

    • initialRowOrder - An ordered set of row IDs representing the initial row order.
    • lockedRows - A set of row IDs for which drag and drop is disabled and should be sorted.
    • position - The position where the rows with disabled drag and drop should be grouped. Use 'start' to position the rows at the start of the table and 'end' to group them at the end. By default, the rows are positioned at the start.
    CodeSandbox

    Highlight rows

    You have the option to highlight an entire row. The thresholds for row highlighting can be configured at the table level using the rowThresholds prop. This prop accepts the same options as the cell threshold with the addition of a type. However, it also allows you to specify which cell value should be used for the row threshold by defining an accessor or id.

    You can add either a single rule or multiple rules to the threshold definition. If you choose to use multiple rules, you can define different thresholds for different cell values within a row. However, regardless of which threshold is met, the same color will be applied to the entire row.

    The type determines how the highlighted row will be visually marked. The pill type accepts a color and shows a marker on the start of the row. The hightlight type accepts color and backgroundColor and changes the textcolor and background color of all cells in a row.

    CodeSandbox

    Define custom comparator

    You can define a custom comparator function to evaluate the threshold using your own logic. This function should return a boolean. If it returns true, the threshold is applied; if false, it's not. The function receives the row data as input. Please note that this custom comparator function will not be serialized for sharing via intents.

    CodeSandbox

    Cells

    Format cell data

    You can format the cell data via the column definition, by specifying the column property formatter. For configuration, use the corresponding options from '@dynatrace-sdk/units', i.e. FormatOptions for numbers, FormatDateOptions for dates, and DataTableCellFormatterCurrencyOptions for currencies.

    CodeSandbox

    Customize cell rendering

    To customize the cell rendering, pass the corresponding function to the cell prop in the column definition. If you want to maintain default cell styling, you need to wrap each return statement with DataTable.DefaultCell element. Also, DataTable.DefaultCell supports className and style props, allowing further customization of the cell appearance.

    Within the function passed to the cell property, you can access the cell's value, rowIndex, rowData and rowId. Additionally, the isLineWrapped prop provides the current line wrap state of the column in which the cell is rendered.

    Moreover, a format, a formatLogContent and a detectLinks function are available:

    • format - Allows you to apply the formatter options that have been configured for that cell (either via the column definition or via the columnType).
    • formatLogContent - Formats the given text as a log output.
    • detectLinks - Automatically detects links in the given text and renders them as such using the ExternalLink component.
    CodeSandbox

    Highlight cells

    Cells can be highlighted in different colors depending on the specified threshold. In the column definition, you can configure the threshold for every column. You can specify value, comparator, color, backgroundColor, and accessor. The color will be applied to the cell text and backgroundColor to the cell background. The accessor prop can also be used for providing custom accessor for the cell value that can be used for threshold calculations.

    If the column cell value passed is a string (text), the threshold comparator can be set with either an equal-to or not-equal-to operator. On the other hand, if your value is a number, you can use one of the following operators:

    • greater-than
    • less-than
    • greater-than-or-equal-to
    • less-than-or-equal-to
    • equal-to
    • not-equal-to

    If the value of the cell is an object, the threshold accessor could return a specific attribute within the object, such as a number or string. This allows for more complex threshold calculations based on specific attributes of object values.

    Note

    When multiple thresholds are applicable (evaluate to true) the final valid threshold has priority. Also, if both row and column thresholds apply to a cell, the column threshold takes precedence over the row threshold.

    CodeSandbox

    Layout and format

    Customize visual representation

    The variant prop allows you to customize the appearance of the DataTable by setting the configuration options available in DataTableProps['variant'].

    Row density

    The rowDensity option adds spacing around the content within a row. By default, rowDensity is set to default, which represents a medium spacing. If the option is set to condensed, the spacing becomes minimal while comfortable represents the maximum spacing.

    CodeSandbox

    Row separation

    The rowSeparation option determines how rows should be separated visually. By default, rowSeparation is set to horizontalDividers which adds lines between the rows. zebraStripes additionally provides alternate row coloring. By setting rowSeparation to none, the rows are not separated visually.

    CodeSandbox

    Vertical dividers

    The verticalDividers option determines whether columns should be separated visually. By default, false is set which does not separate the columns within a DataTable. If verticalDividers is set to true, lines are added between the columns.

    CodeSandbox

    Borders

    The contained option provides a border for the DataTable. By default, contained is set to true to display the border. If false is set, no border is added.

    CodeSandbox

    Hide header

    You can customize the DataTable's appearance to hide the entire header, by setting headers: 'hidden'.

    If you choose to hide the header, please note that the ability to sort columns by header, as well as any actions that could be triggered with column headers, won't be available.

    CodeSandbox

    Vertical alignment

    Use the verticalAlignment option to configure the vertical alignment of the cell content. The alignment options are top, center, and bottom. It is also possible to configure the vertical alignment for header and body cells separately. By default, all cell content is top-aligned.

    CodeSandbox

    Enable full width

    By default, the DataTable is set to automatically expand and occupy the full width of its parent element. However, this behavior changes when the table is placed within a flex container. In such cases, if you wish to ensure that the table maintains full width, you can include the fullWidth prop when using the DataTable component.

    When this value is not set, it will grow as needed based on the number of columns and their width.

    CodeSandbox

    Enable full height

    By default, the DataTable grows as needed based on the number of rows. When placed inside a container, the table's height can be the same as its parent or smaller depending on how many rows would be visible inside the parent container. If you wish to ensure that the table always occupies the full height of its parent element, you can include the fullHeight prop when using the DataTable component.

    Note

    Keep in mind that the fullHeight prop should be applied carefully. Setting fullHeight on the table that is placed inside a container that takes up the height of the page can lead to serious performance issues. It is therefore advisable to use the prop in combination with a well-defined container height.

    CodeSandbox

    Fonts

    The DataTable allows for the customization of font styles across the entire table or within individual columns. This can be achieved by configuring it in the table variant options or the column definition.

    CodeSandbox

    Text alignment

    If no column type is set, text within the cell is left-aligned by default. To explicitly change the default alignment, use the alignment property in the column definition.

    CodeSandbox

    Enable line wrap

    The DataTable component offers flexible options for managing the line wrapping of cell content within your table. Here’s how you can control it:

    • Global line wrapping configuration - To activate line wrapping across all columns, set the defaultLineWrap or lineWrap property to true.

    • Column-specific line wrapping - If you prefer to enable or disable line wrapping for certain columns, pass an object to the defaultLineWrap property. Use column IDs as keys and set their values to true (to enable) or false (to disable).

    • User-Controlled Line Wrapping - Toggle via column actions: Incorporate TableActionsMenu.LineWrap into your table to allow users to switch line wrapping on or off for specific columns through the column actions menu.

    • User-Controlled Line Wrapping (entire table) - Toggle via a DataTable.Toolbar action: Incorporate DataTable.LineWrap into you tables DataTable.Toolbar component to allow users to switch line wrapping on or off for all columns.

    Props for line wrap control

    The DataTable also provides properties to manage line wrapping state:

    • defaultLineWrap- Defines the initial state of line wrapping when the table loads.
    • lineWrap - Sets the line wrapping state.
    • onLineWrapChange - A callback function that triggers when the line wrapping state changes.
    Note

    The DataTable uses column virtualization to optimize performance. With line wrap enabled, row heights might change while scrolling horizontally as wrapped content becomes visible.

    CodeSandbox

    Export configuration

    The DataTable's configuration can be exported at any time for various purposes, such as sharing the configuration with other applications through an intent. The current configuration can be retrieved by creating and assigning a ref to the corresponding ref property of the DataTable, and then calling ref.getConfig() function.

    Note

    When the getConfig function is invoked, a snapshot of the serialized configuration is returned. As such, it will not change if the DataTable's configuration is subsequently modified. It is recommended to ensure that you apply all your required configurations to the DataTable before calling this function.

    CodeSandbox

    Import configuration

    The configuration provider for the DataTable accepts a JSON object and also accepts a string as input for importing a serialized configuration. When a string is provided, it is internally parsed and applied as the DataTable configuration.

    Note

    If the configuration provided does not match the properties of the DataTable configuration, any unknown properties will be ignored. Additionally, if required properties are not provided, or the given config is invalid, default values will be applied.

    Note

    We do not support dynamically changing default values, as doing so goes against their intended purpose. Therefore, changing the values of defaultPageSize or defaultPageIndex in the configuration for pagination will not update the corresponding props in the DataTable. If you need to set default values, it is recommended to ensure that you always do that before importing the configuration.

    Note

    Due to potential version mismatches in DataTable packages used in different applications, importing a configuration from another application may produce an unintended outcome and not result in a perfect match.

    CodeSandbox

    Enable pagination

    To enable pagination add the DataTable.Pagination component to your table. This component allows you to configure the default page size and the default page index via the defaultPageSize and defaultPageIndex props.

    CodeSandbox

    Change page size

    The default page size options are 10, 20, 50, 100, 250, 500 and 1000. To customize these options, use the pageSizeOptions prop, which allows you to pass the desired page sizes as an array. Please ensure that the passed (default) page size aligns with the defined options. The table will not sanitize page sizes that do not exist in the options.

    CodeSandbox

    Control pagination

    It is also possible to control the page size and the page index using the pageSize and the pageIndex props together with the onPageSizeChange and the onPageIndexChange callbacks.

    CodeSandbox

    Use server-side pagination

    In addition to the regular client-side pagination, it is also possible to use server-side pagination. For server-side pagination, pass the data for the respective page to the table and update the enablePrevPage and enableNextPage flags accordingly. Upon navigating to another page or changing the page size the corresponding callbacks as well as the onPageChange callbacks provide the updated values, allowing you to retrieve the corresponding data.

    By default, the server-side pagination does not display the indicator for which page out of the total number of pages is currently shown, i.e. "Page 1 of 30", in the bottom right corner. This is because the total number of rows is unknown since only the data for the respective page is passed. However, adding the totalRowsCount prop enables this information to be displayed as well.

    CodeSandbox

    Scroll to a given row

    The DataTableRef provides the scrollToRow method, which enables programmatic scrolling to a specific row in the table, identified by its rowId.

    If the target row is a sub-row, the parent row must be expanded beforehand. Otherwise, the sub-row will not be accessible for scrolling.

    CodeSandbox

    States

    Loading state

    Use the loading prop to display a loading indicator. This can be used for the initial load where columns and data are not yet available, when waiting for data to be fetched or when performing actions such as moving to the next page. The loading indicator will adjust accordingly depending on whether columns and data are already loaded.

    Initial table load

    CodeSandbox

    Load data

    CodeSandbox

    Customize empty state

    The DataTable.EmptyState component allows you to configure a custom empty state that will be displayed if no data or no columns are available.

    CodeSandbox

    Actions and intents

    Configure column actions

    The column actions are represented by a button in a column header that opens a drop-down menu. Within the menu, you can include various functionalities allowing end users to perform actions related to the columns.

    The drop-down menu also appears on right-click, providing additional access to defined cell or column actions. This feature adds a layer of functionality, allowing users to access more options directly from the table.

    To configure column actions you need to define the DataTable.ColumnActions slot component.

    Within the DataTable.ColumnActions slot there's a function that receives the current column's details, enabling customization of the column's actions. The function should return a TableActionsMenu object, which defines user actions for the cell. It should also include the TableActionsMenu.Item slot component to represent a single action item.

    This is similar to the TableActionsMenu.Link component, which renders a defined link element as a menu action item. You can assign an onSelect event as a property of this component. This will execute the specified action upon user interaction.

    Additionally, you can use the TableActionsMenu.Prefix slot to place an icon on the left side of the action item, while the TableActionsMenu.Suffix slot lets you place an icon on the right.

    For cross-app navigation, the TableActionsMenu.Intent slot component can be used to define an intent item. See the section Configure intents to learn more.

    Use the predefined TableActionsMenu.CopyItem slot component to let users copy column values to the clipboard. To group items semantically within the menu, use TableActionsMenu.Group and TableActionsMenu.Label. See the documentation for more information about grouping items in menus.

    The user action menu supports multi-level menus, allowing you to configure sub-menus using the slots TableActionsMenu.SubMenu, TableActionsMenu.SubContent, and TableActionsMenu.SubTrigger.

    To configure actions for a particular column, its ID must be provided to the column property. Omit the DataTable.ColumnActions column ID to make default actions apply to any columns without explicitly configured column actions.

    CodeSandbox

    Configure row actions

    Configuring row actions in a DataTable involves adding an action column to the far right of the table. This column should contain buttons, menus, or links that allow users to perform actions specific to each row.

    To set up row actions in the table you need to locate DataTable.RowActions slot component as a DataTable child. This component takes a function that receives the current row’s data as well as some meta information about the tables layout as its parameters. This allows you to access and manipulate the data for that specific row. The function needs to return a ReactNode that defines the user actions for the row. Most likely you want to add some primary actions as buttons and secondary actions into a menu.

    CodeSandbox

    Configure selected row actions

    The DataTable.SelectedRowsActions component provides an additional slot where you can perform actions simultaneously on one or more selected rows. Actions passed to this slot are placed right above the table header and are shown only when at least one row is selected. If table actions exist, they are hidden when the selected rows actions menu is active.

    CodeSandbox

    Configure cell actions

    The cell actions are represented by a button in a table cell that opens a drop-down menu. Within the menu, you can include various functionalities allowing end users to perform actions related to the cells.

    The cells within the DataTable allow custom interactive elements, allowing you to include links or other actionable elements within cells with cell actions defined.

    To configure cell actions you must define the DataTable.CellActions slot component. There's a function within the DataTable.CellActions tag that returns a TableActionsMenu object that defines the user actions for the cell. It should also include the TableActionsMenu.Item slot component to represent a single action item, similar to the TableActionsMenu.Link component, which renders a defined link element as a menu action item.

    You can assign an onSelect event as a property of this component to execute the specified action upon user interaction. Additionally, the TableActionsMenu.Prefix and TableActionsMenu.Suffix properties can be applied to the item to add an icon on the left or right side of the action trigger element.

    For cross-app navigation, the TableActionsMenu.Intent slot component can be used to define an intent item. See the section Configure intents to learn more.

    To enable users to copy cell values to the clipboard, use the predefined TableActionsMenu.CopyItem slot component.

    To group items semantically within the menu, use TableActionsMenu.Group and TableActionsMenu.Label. For more information about menu groups and labels, refer to the documentation. The user action menu supports multi-level menus, allowing you to configure sub-menus using the slots TableActionsMenu.SubMenu, TableActionsMenu.SubContent, and TableActionsMenu.SubTrigger.

    To assign actions to cells in a specific column, you must specify the unique identifier (ID) of the column. This ID is used as the value for the column property within the DataTable.CellActions configuration. It tells the DataTable which column to associate the actions with. Omit the column ID to have default actions apply to any columns without explicitly configured actions.

    CodeSandbox

    Configure table actions

    The DataTable.TableActions component provides an additional slot where you can place custom actions that affect the entire table. Actions passed to this slot are placed right above the table header.

    CodeSandbox

    Download data

    The DataTable.Toolbar has an item DownloadData which enables the downloading of the table data. Depending on your table configuration, you can choose between downloading all data, downloading the current page and only downloading the selected rows. Only visible columns are included when downloading data. To exclude specific columns, provide an array of column IDs to the excludeColumns prop in the DownloadData slot of the toolbar.

    Note

    Columns with sparkline column type are always excluded from the downloaded data, as sparkline visualizations cannot be meaningfully represented in CSV format.

    Note

    CSV data is generated in the browser. For very large tables (with many rows or large cell content), exporting all rows may slow down the browser or even cause it to crash. In such cases, prefer exporting only individual pages or selected rows.

    If the table has sub-rows, an additional column index is added to the downloaded table data, indicating the row's indentation level. For example, the first row has index 1, its first sub-row has index 1.1 and so on. Sub-rows are included in the downloaded table data regardless of whether they are currently open or closed. When downloading the current page, all sub-rows of the rows on that page are included, even if some sub-rows are actually rendered on following pages.

    When downloading, double quotes are escaped and if the text has commas, new lines, double quotes, tabs or carriage returns, the entire line is enclosed in double quotes. In addition, values starting with =, +, -, @, \t and \r are escaped with a single quote to mitigate CSV injection. Also note that if you have custom cells you can provide a toString function on the data object for customized download output.

    The DataTable also provides the onDownloadData callback that fires once data has been downloaded. The callback's subset parameter indicates whether all data, the current page, or the selected rows were downloaded. The excludedColumns parameter indicates which specified columns were excluded from the download.

    CodeSandbox

    The preferred way is to use the toolbar item as above but if you have some good reason not to use the toolbar you can create your own download trigger which programmatically calls downloadData() with one of the parameters 'all', 'page', or 'selected'. You can also exclude specific columns by providing an array of column IDs to the excludeColumns parameter.

    CodeSandbox

    Enable sorting

    By using the sortable flag, you can enable sorting for the entire table. Additionally, you have the option to disable sorting on a per-column basis by configuring the disableSorting property in the column definition. For meterbar columns, sorting is disabled by default and can be enabled explicitly by setting disableSorting to false. Please note that sorting is not supported for MultiMeterBarCharts.

    By default, the first sorting direction is ascending. If you want to change that, you can configure the sortDescFirst flag for the individual column. There is also a possibility to invert the sorting logic. Setting sortInverted to true means the underlying sorting direction will be inverted, but the UI will not change. This could be useful, for example, when a lower score is better. Values like null and undefined will be sorted with lower priority and will always appear at the end of the list.

    Columns can be sorted by clicking directly on the header, even on header cells with column actions defined. Sorting indicators and column action indicators are shown on hover or on sorted columns, which allow for header cells to be less cluttered, allowing to focus on the header's content

    CodeSandbox

    Sort programmatically

    Control sorting programmatically by setting the sortBy prop, passing an array with column IDs and sorting directions. Use the onSortByChange callback to monitor and manipulate sorting changes within the DataTable. If you want to sort your data before it is passed to the table, you need to disable built-in sorting by setting sortable={{ manualSorting: true }}. This is particularly useful for server-side sorting. To initially sort tables without controlling their state, use defaultSortBy.

    CodeSandbox

    Define sortAccessor

    Define a custom sortAccessor in the column definition to sort by a different value than the one returned by the accessor. For example, if the accessor returns an object, you can set the sortAccessor to return a number or string field within the object.

    CodeSandbox

    Define custom sortType

    You can specify a sortType in the column definition to control sorting behavior more precisely. The built-in options are 'text' | 'textCaseSensitive' | 'number' | 'datetime'. However, for more advanced scenarios, you can pass a function as well. This is particularly useful for compound data, where a column displays multiple or combined data entries. When using a custom sortType function, you may also need to define a custom sortAccessor in your column definition. For details, see: Define a sortAccessor.

    In the example below, a column displays both CPU usage (as a percentage) and memory usage (in GB). The custom sorting function prioritizes higher CPU usage and resolves ties by considering higher memory usage.

    CodeSandbox

    Configure intents

    An intent is a message object that enables users to pass the user flow from one app to another. It is possible to perform actions such as viewing data in another application. You can read more about intents in the Intents docs.

    The DataTable supports intents within the following slot components:

    • DataTable.CellActions and DataTable.ColumnActions: Use the TableActionsMenu.Intent slot within the TableActionsMenu. For custom icons, use the TableActionsMenu.Prefix slot within TableActionsMenu.Intent.

    • DataTable.RowActions: Provide a Menu component containing the Menu.Intent slot. For custom icons, place the Menu.Prefix slot within Menu.Intent.

    • DataTable.Toolbar: Use the DataTable.Intent slot to configure intents. Optionally, set a custom icon by passing the desired icon to the icon prop.

    Intents can be configured using the following options:

    • payload: An object containing the data to be passed to the target app. The structure depends on the target application's requirements.
    • options: Configuration options for the intent.
      • keyProperties: Array of properties that should be included as keys in the intent.
      • recommendedAppId: ID of the application that will be launched to handle the intent.
      • recommendedIntentId: ID of the action that is passed to the application.
      • responseProperties: Array of properties to be included in the response.
    • onResponse: Optional callback function that is called when a response is received from the target app.
    CodeSandbox

    Configure intents in toolbar

    The DataTable.Toolbar accepts DataTable.Intent slot components, offering a menu with the specified intents for cross-app navigation. See the Configure intents section to learn more about the configuration of intents in the DataTable.

    CodeSandbox

    Charts in tables

    Gantt chart

    To visualize column data with a Gantt chart, set the columnType to gantt. The Gantt column definition also accepts a config prop in the format DataTableGanttColumnConfig, which allows configuration of the following options:

    • min: Axis configuration for the minimum value (MinScaleBoundary).
    • max: Axis configuration for the maximum value (MaxScaleBoundary).
    • xAxisType: Whether the axis type is numerical or time.
    • nameAccessor: String accessor for the segment's name, which is displayed in the tooltip.
    • colorAccessor: String accessor for the segment's color.
    • colorPalette: The palette that contains the segment color mapping.
    • showBackground: Whether gaps between segments should receive a background.
    • tooltipActions: Actions that should be displayed with the default tooltip. The function provides the segment, row and parent data as parameters.
    • tooltip: Custom tooltip implementation. The function provides the segment, row and parent data as parameters.
    • formatter: Formatter options from the @dynatrace-sdk/units package.
    • annotationsHeader: Configuration for displaying an AnnotationsChart in the header above the x-axis. See the GanttAnnotationsHeaderConfig type for details.

    The data for the Gantt chart must contain the Gantt segment data in this format: { start: number; end?: number; }. Each row can display one or more Gantt segments. If multiple segments should be displayed, you can pass an array of segment data. The segment data can also contain further properties to configure color or name, for example, if the corresponding accessor is specified in the config.

    When configuring annotations for the Gantt chart, please note that the data must be of the same type as the Gantt data (numerical or time). If min is set to data-min, or max is set to data-max, the values from the annotation data will also be considered to determine the axis boundaries of the chart.

    CodeSandbox

    MeterBarChart

    You can visualize numerical data within the DataTable by using the MeterBarChart. Follow these steps to render a MeterBarChart in the table:

    1. Set columnType to meterbar in the column definition.
    2. Use the accessor property to specify the value data to process.

    The MeterBarChart in the DataTable column can be further customized through the column definition. You can configure its appearance by using the config prop, which includes the following options:

    • color (string): Specifies the color of the MeterBarChart.
    • min (number): Sets the minimum value for the MeterBarChart.
    • max (number): Sets the maximum value for the MeterBarChart.
    • showTooltip (boolean): Controls whether tooltips are displayed.
    • formatter (formatter function or format option): Formats the value displayed in the tooltip.
    • thresholds (array of objects {name: string, value: number, color: string, showIndicator?: boolean}): Defines threshold values and associated colors.
    CodeSandbox

    MultiMeterBarChart

    To add a MultiMeterBarChart to the DataTable, follow the steps described in the section on displaying a MeterBarChart in a table.

    Set the columnType to meterbar in the column definition and use the accessor property to specify the value data to process. Instead of providing a single numerical value, as for MeterBarChart, with MultiMeterBarChart you can provide an array of value objects. Each value object should have the following structure: {name: string, value: number, color: string} as data.

    As with the MeterBarChart, you can fine-tune the appearance of the MultiMeterBarChart by using the colorPalette property to set a custom color pattern.

    When data is provided as value array objects, the color and thresholds props in config are ignored.

    CodeSandbox

    Sparkline chart

    To pass timeseries data to the DataTable and visualize it with a Sparkline chart, set the column's columnType to sparkline and use the column's accessor to point to the timeseries data that you want to process.

    The Sparkline chart in the DataTable can be further configured via the column definition. You can set its color and variant by adding config: {color: string, variant: 'line' | 'area' | 'bar'}. The default configuration of sparkline is config: {color: 'categorical', variant: 'line', showContextValues: false}.

    CodeSandbox
    Still have questions?
    Find answers in the Dynatrace Community