All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
- #787 Add
cell_selectable
property to allow/disallow cell selection
- #787
- Clicking on a link in a Markdown cell now requires a single click instead of two
- Links in Markdown cells now open a new tab (target="_blank")
- #729 Improve conditional styling
style_data_conditional
: Add support forrow_index
andcolumn_id
array of valuesstyle_header_conditional
: Add support forheader_index
andcolumn_id
array of valuesstyle_filter_conditional
: Add support forcolumn_id
array of valuesstyle_cell_conditional
: Add support forcolumn_id
array of valuesstyle_data_conditional
: Add new conditionsstate: 'active'|'selected'
to customize selected and active cell styles
- #722 Fix a bug where row height is misaligned when using fixed_columns and/or fixed_rows
- #728 Fix copy/paste on readonly cells
- #724 Fix
active_cell
docstring: clarify optional nature of therow_id
nested prop - #732 Fix a bug where opening a dropdown scrolled the table down its last row
- #731 Fix a bug where
data=None
andcolumns=None
caused the table to throw an error - #766 Sanitize table
id
for stylesheet injection (fixes usage with Pattern-Matching callbacks)
- #758 Improve error message for invalid filter queries
- #713 Update from React 16.8.6 to 16.13.0
- #711 Added R examples to package help
- #704 Renamed async modules with hyphen
-
instead of tilde~
- #606 Add markdown support for table cells. Cells will be rendered as markdown if the column
presentation
is specified asmarkdown
.- Add highlight.js for syntax highlighting. If
window.hljs
is specified, that will be used for highlighting instead.
- Add highlight.js for syntax highlighting. If
- #670 Fix a bug where
derived_filter_query_structure
was not getting updated properly - #677 Fix a bug where the table fails to load when used inside an iframe with a sandbox attribute that only has allow-scripts
- #665 Fix a bug in Firefox where the dropdown cells height is incorrect
- #637 Fix multiple issues
- Fix IE11 compatibility issues and add ES5 compatibility and validation
- Fix a bug with
loading_state
being handled incorrectly, causing the table to steal focus
- #554 Async loading of
xlsx
library on export
- #618 Fix a bug with keyboard navigation not working correctly in certain circumstances when the table contains
readonly
columns. - #206 Fix a bug with copy/paste to and from column filters not working.
- #561 Fix an incorrect React PureComponent usage causing warnings in DevTools.
- #611 Fix a bug with copy/paste causing hidden columns to be removed from the table
- New prop
export_columns
that takes valuesall
orvisible
(default). This prop controls the columns used during export
- Add
is blank
unary operator. Returns true forundefined
,null
and''
.
- New prop
page_count
that sets the maximum number of pages that are accessible via the pagination menu when using backend pagination.
- Allow values with whitespaces in column filters
- Change pagination menu button UI to use arrow icons instead of plain buttons
- Move pagination menu to bottom-right of table
- Include go-to-first and go-to-last buttons
- Include current-page and total-pages display in pagination menu
- Include input box for user to navigate directly to a page
- The
datestartswith
relational operator now supports number comparison - Fixed a bug where the implicit operator for columns was
equal
instead of the expected default for the column type
- Visible columns are used correctly for both header and data rows
- Fixed a bug where any string beginning with a relational operator was being interpreted as that operator being applied to the rest of the string (e.g., "lens" was interpreted as "<=ns")
- Fixed row and column selection when multiple tables are present
- Fixed reconciliation when validation default value is
0
(number) - Apply reconciliation value when deleting cells, if possible
- Support persisting user edits when the component or the page is reloaded. New props are
persistence
,persistence_type
, andpersisted_props
. Setpersistence
to a truthy value to enable, the other two modify persistence behavior. See plotly/dash#903 for more details.
- New 'loading_state' prop that contains information about which prop, if any, is being computed.
- Table no longer allows for editing while the
data
prop is loading.
- Fix #576, editing column names or deleting columns while other columns are hidden causing the hidden columns to be lost.
- Fix an unreported bug that clicking "Cancel" at the column name edit prompt would clear the name, rather than leaving it unchanged as it should.
- Allow empty strings in all
filter_query
(e.g filter_query: '{colA} eq ""')
- Add support for missing
border-radius
in style_** props - Fix table's inner vs. outer container styling
- Fix row selection vertical and horizontal alignment
- Simplify usage for multi-line cells and ellipsis. The cell's content now inherits the value of
white-space
,overflow
andtext-overflow
from its parent, making it possible to style multi-line & ellipsis withstyle_data
and other style props.
- Fix regression when editing the content of a cell in a scrolled virtualized table
- Fix bug where boolean values are not showing up in the table
- New
column.selectable
nested prop that displays a selection checkbox or radio button in the column. - New
column_selectable
prop to choose whether columns can be selected or not, and whether a single or multiple selections can be in effect at the same time. - New
selected_columns
prop that contains the list of visible and hidden columns that are currently selected - New
derived_viewport_selected_columns
that contains the list of visible columns that are currently selected This prop is read-only. Useselected_columns
in callbacks instead.
- Fixed problem clearing one column shifting everything to the left and leaving the last column blank
- Add merge_duplicate_headers prop to correct
export_format: display
behavior. #549 - Fixed renaming of single-row headers in the GUI
- New
column.hideable
flag that displays an "eye" action icon in the column Accepts a boolean, array of booleans, 'last' or 'first'. Clicking on the "eye" will add the column to thehidden_columns
prop.hidden_columns
can be added back through the Columns toggle menu whether they are hideable or not. - New accepted values for
column.clearable
,column.deletable
andcolumn.renamable
These props now also accept 'last' and 'first'.- 'last' will display the action only on the last row of the headers
- 'first' will display the action only on the first row of the headers
- Ability to export table as csv or xlsx file.
-
New
column.clearable
flag that displays a "eraser" action in the column Accepts a boolean or array of booleans for multi-line headers. Clicking a merged column's "eraser" will clear all related columns.- Clearing column(s) will remove the appropriate data props from each datum
row of
data
. - Additionally clearing the column will reset the filter for the affected column(s)
- Clearing column(s) will remove the appropriate data props from each datum
row of
- Headers are included when copying from the table to different tabs and elsewhere. They are ignored when copying from the table onto itself and between two tables within the same tab.
- Like for clearing above, deleting through the "trash" action will also reset the filter for the affected column(s)
- Fixed readonly dropdown cells content (display label, not value)
- Fixed columns
sticky
on Safari
- Fixed inconsistent behaviors when editing cell headers
- Fixed white line artifacts when rendering the table with browser zoom different from 100%
- Add
fill_width
prop to replacecontent_style
prop removed in the 4.0 API rework
- Update table build for use as a library and make consistent with other Dash repos
- Table API rework
- `column.sort_as_null`: Allows sorting behavior customization.
Accepts an array of string, number or booleans.
- `column.clearable`: Allows clearing the value of a dropdown cell.
Removed in favor of `dropdown_**` `clearable` nested property.
- `column.hidden`: Allows hiding column
Removed. Stay tuned by following https://github.com/plotly/dash-table/issues/314.
- `column.options`
Removed. Redundant with `dropdown`.
- `content_style`
Removed. Deemed unnecessary. NOTE - This was added back in 4.0.2 under the name the "fill_width" property name.
- `pagination_settings`
Replaced by two props `page_current` and `page_size`.
- `column_static_tooltip`
Renamed to `tooltip`.
- `column_conditional_tooltips`
Renamed to `tooltip_conditional`.
- `filter`
Renamed to `filter_query`.
- `sort_type`
Renamed to `sort_mode`.
- `derived_filter_structure`
Renamed to `derived_filter_query_structure`.
- `column.deletable`: Allows column deletion.
Now accepts a boolean or an array of booleans (for multi-line headers).
For example, if there are multiple headers and you want the second header row to be deletable, this would be `[False, True]`.
- `column.editable_name`: Allows column renaming.
Renamed to `column.renamable`
Now accepts a boolean or an array of booleans (for multi-line headers).
For example, if there are multiple headers and you want the second row's header's name to be editable, this would be `[False, True]`.
- `column.id`
Now accepts `string` only -- `number` column ids can be casted to string.
- `n_fixed_columns`: Will fix columns to the left.
Renamed to `fixed_columns`
Now accepts an object { headers: boolean, data: number } instead of a number.
{ headers: true } determines the number of columns to fix automatically. For example, if the rows are selectable or deletable, { headers: true } would fix those columns automatically. If { headers: true, data: 2 }, it would fix the first two data columns in addition to the selectable and deletable if visible.
- `n_fixed_rows`: Will fix rows to the top.
Renamed to `fixed_rows`
Now accepts an object { headers: boolean, data: number } instead of a number.
{ headers: true } determines the number of rows to fix automatically (i.e. if there are multiple headers, it will fix all of them as well as the filter row).
{ headers: true, data: 2} would fix all of the header rows as well as the first 2 data rows.
- `pagination_mode`
Renamed to `page_action`.
`'fe'` is now `'native'`, `'be'` is now `'custom'`, and `false` is now '`none'`
- `column_static_dropdown`
Renamed to `dropdown`.
Now an object with each entry refering to a Column ID. Each nested prop expects.
`clearable` and `options`.
- `column_conditional_dropdowns`
Renamed to `dropdown_conditional`.
`condition` changed to the same `if` nested prop used by styles.
`dropdown` renamed to `options`.
- `dropdown_properties`
Renamed to `dropdown_data`.
Matches the `data` structure.
- `tooltips`
Renamed to `tooltip_data`.
Matches the `data` structure.
- `filtering`
Renamed to `filter_action`.
- `sorting`
Renamed to `sort_action`.
- `sorting_treat_empty_string_as_none`
Renamed to `sort_as_null`.
Now accepts an array of string, number or booleans that can be ignored during sort.
Table-level prop for the `column.sort_as_null` column nested prop.
- `style_data_conditional`
Renamed `filter` to `filter_query`.
- Ability to conditionally format columns if editing is disabled.
- Support for dash-table is now available for R users of Dash.
- Fix CSS borders properties overwrite style_* borders properties.
- selected_cells background color is set through styling pipeline / derivations.
- Improve filtering syntax and capabilities
- new field syntax
{myField}
- short form by-column filter
- implicit column and default operator based on column type
- Text and Any columns default to
contains
- Numeric columns default to
eq
- Date columns default to
datestartswith
- Text and Any columns default to
- implicit column (e.g
ne "value"
becomes{my-column} ne "value"
)
- implicit column and default operator based on column type
- new
contains
relational operator for strings - new
datestartswith
relational operator for dates - new
eq
behavior (will attempt to convert and compare numeric values if possible) - new readonly
derived_filter_structure
prop exposing the query structure in a programmatically friendlier way
- new field syntax
- Add support for row IDs, based on the
'id'
attribute of each row ofdata
- IDs will not be displayed unless there is a column with
id='id'
active_cell
,start_cell
,end_cell
, and items inselected_cells
contain row and column IDs: All are now dicts{'row', 'column', 'row_id' and 'column_id'}
rather than arrays[row, column]
.- Added new props mirroring all existing row indices props:
selected_row_ids
mirrorsselected_rows
derived_viewport_row_ids
mirrorsderived_viewport_indices
derived_virtual_row_ids
mirrorsderived_virtual_indices
derived_viewport_selected_row_ids
mirrorsderived_viewport_selected_rows
derived_virtual_selected_row_ids
mirrorsderived_virtual_selected_rows
- IDs will not be displayed unless there is a column with
- Customizable cell borders through
style_**
props- cell borders now no longer use
box-shadow
and useborder
instead - Supports CSS shorthands: border, border_bottom, border_left, border_right, border_top
- style_** props will ignore the following CSS rules: border_bottom_color, border_bottom_left_radius, border_bottom_right_radius, border_bottom_style, border_bottom_width, border_collapse, border_color, border_corner_shape, border_image_source, border_image_width, border_left_color, border_left_style, border_left_width, border_right_color, border_right_style, border_right_width, border_spacing, border_style, border_top_color, border_top_left_radius, border_top_right_radius, border_top_style, border_top_width, border_width
- Styles priority:
- Props priority in decreasing order style_data_conditional style_data style_filter_conditional style_filter style_header_conditional style_header style_cell_conditional style_cell
- Within each props, higher index rules win over lower index rules
- Previously applied styles of equal priority win over later ones (applied top to bottom, left to right)
- cell borders now no longer use
- Rename
filtering_settings
tofilter
- Rename
sorting_settings
tosort_by
active_cell
andselected_cells
items are dicts{'row', 'column', 'row_id' and 'column_id'}
instead of arrays[row, column]
- Added
format
nested prop to columns- Applied to columns with
type=numeric
(more to come) - Uses d3-format under the hood
format.locale
for localization configurationformat.prefix
for SI prefix configurationformat.specifier
for formatting configurationformat.separate_4digits
to configure grouping behavior for numbers with 4 digits or less- Python helpers (dash_table.FormatTemplate)
- Applied to columns with
- Added
locale_format
prop to table (default localization configuration, merged with column.format.locale)
- Fix filtering conditions using floats
- Added
column_type
condition to styleif
; allows applying styles based on the type of the column for propsstyle_cell_conditional
style_data_conditional
style_filter_conditional
style_header_conditional
- Fixed table behavior when
filtering_settings
is updated through a callback
- Added LICENSE file to Python distributable
- Added already supported
filter
nested prop / condition tostyle_data_conditional
props definition
- Added the
datetime
data type
- Added support for unquoted column id with
- letters, numbers, [-+:.]
- Added support for single and double quoted column id with arbitrary name
-
Incorrect tooltip behavior if cell is in a fixed row or column
-
Incorrect default value for
column_static_tooltip
changed from [] to {}
- Added tooltip_delay and tooltip_duration props to tweak table's tooltips display behavior
- Added tooltips, column_static_tooltip, column_conditional_tooltips to define the tooltip applicable to a certain cell in the table with nested props delay and duration to override table's default behavior
- Added column.validation nested prop to tweak coercion and validation behavior
- allow_null (boolean): [numeric, text] Allow null/undefined/NaN value
- default (any): [numeric, text] Default value to use on validation/coercion failure
- Added on user-initiated data change processing (column.on_change.action)
- Coerce: As Validation + attempts to convert the user-provided value into the destination type
- None: Accept the user-provided value without verification
- Validation: Check if the user-provided value is of the correct type/format/etc.
- Added on user-initiated data change failure processing (column.on_change.failure)
This comes into effect after the column.on_change.action has failed
- Accept: Accept the user-provide value
- Default Applies the value defined in column.validation.default
- Reject: Confirms the failure
- Moved column.type
dropdown
to column.presentation=dropdown
- Regression, misaligned header #324
- Test with head of both Dash v0.x and Dash v1.x #20
- Selection, navigation, copy from readonly cell #276
- Deprecated nested property 'displayed_pages' from 'pagination_settings' #275
- Refactoring in preparation for data types #280
- Virtualization #234
- Linting correctly applied to all code #254
- Visual offset with vertical scroll #216
- Generate python components classes for IDE support #243
- Fix python package regression #235
- Fix load in IE 11 #217
The version in the package didn't get updated.
The remote URL path for the bundle was incorrect.
- 3.1.0 (Alpha) Release of the Dash Table
- Fire submit when pressing enter key in
IsolatedInput
. Fixes issue #194
- Change default styles #193 #150
- prop
content_style
defaults to 'grow' instead of 'fit' - prop
style_table
width nested property defaults to '100%' if not provided
- prop
- Change cell styling and filter display #196 #150
- uneditable cells can be clicked & navigated, the mouse cursor is the default one
- filter inputs have a placeholder that is visible on hover and focus
- first filter input placeholder is always visible
- Fix regressions linked to the style_as_list_view feature / prop #179
- Improved props docstrings #163
- Sort ascending on first click #164 #118
- Flips icons displayed so that they are pointing up on ascending and down on descending.
-
Styling API refactoring
- Remove column width / maxWidth / minWidth
- Rename property table_style to css
Cell: All table cells Data: All data driven cells (no operations, headers, filters) Filter: All basic filter cells Header: All header cells
Priority Data: style_data_conditional > style_data > style_cell_conditional > style_cell Filter: style_filter_conditional > style_filter > style_cell_conditional > style_cell Header: style_header_conditional > style_header > style_cell_conditional > style_cell
Merge Logic Only properties defined at a higher priority level will override properties defined at lower priority levels. For example if A is applied then B, A+B will be..
A = { background_color: 'floralwhite', color: 'red', font_type: 'monospace', width: 100 }
B = { color: 'black', font_size: 22 }
A+B = { background_color: 'floralwhite', // from A, not overridden color: 'black', // from B, A overridden font_size: 22, // from B font_type: 'monospace', // from A width: 100 // from A }
- Add new property style_table of form { ...CSSProperties }
- Add new property style_cell of form { ...CSSProperties }
- Add new property style_data of form { ...CSSProperties }
- Add new property style_filter of form { ...CSSProperties }
- Add new property style_header of form { ...CSSProperties }
- Add new property style_cell_conditional of form [{ if: { column_id: string | number }, ...CSSProperties }]
- Add new property style_data_conditional of form [{ if: { column_id: string | number, filter: string, row_index: number | 'odd' | 'even' }, ...CSSProperties }]
- Add new property style_filter_conditional of form [{ if: { column_id: string | number }, ...CSSProperties }]
- Add new property style_header_conditional of form [{ if: { column_id: string | number, header_index: number | 'odd' | 'even' }, ...CSSProperties }]
- All CSSProperties are supported in kebab-case, camelCase and snake_case
- Renaming 'dataframe' props to 'data' dataframe -> data dataframe_previous -> data_previous dataframe_timestamp -> data_timestamp derived_virtual_dataframe -> derived_virtual_data derived_viewport_dataframe -> derived_viewport_data
Columns width percentage and default (fit to content) support
- Added prop content_style that takes values 'fit' or 'grow' (Default='fit')
- Added width percentage support
- Modified default column behavior from fixed width to 'fit content'
- Modified width, min-width, max-width interaction on columns
Width percentage
Columns can now accept '%' width, minWidth, maxWidth
For the percentages to have meaning, the dash-table must be forced to have a width and the content of the dash-table must be forced to grow to fill the available space made available by the container (by default the table is only as big as it needs to be).
To use percentage-based column widths, add:
- content style
content_style='grow'
- table style (example)
table_style=[{ selector: '.dash-spreadsheet', rule: 'width: 100%; max-width: 100%' }]
- column with %-based width
columns=[{
id: 'column',
width: '40%'
}]
Default column width
Columns now default to 'fit to content' when no width is defined
Note: If pagination is used or the dataframe modified, the column width will be re-evaluated on each modification.
Interaction between width, min-width and max-width
Column min-width and max-width do not default to width value is not defined.
- Miscellaneous fixes for pagination, virtual df and viewport df #112
- 1 new internal facing derived/controlled property: columns: Columns -> columns: VisibleColumns Gets rid of conditional processing for hidden columns in the cell and header factories as well as in navigation/selection handlers
Clean up column offsets
- A bunch of offsets were introduced to the table in the previous development cycle (2.x -> 3.0). Turns out these offsets are neither useful or necessary
Validate compatibility of filtering, sorting, pagination
External facing classes and attributes
-
(ATTRIBUTE) data-dash-column=
.dash-cell, .dash-header { &[data-dash-column='ticker'] { // styling } }
-
(CLASS) dash-cell
-
(CLASS) dash-header
-
(CLASS) dash-delete-cell
-
(CLASS) dash-delete-header
-
(CLASS) dash-select-cell
-
(CLASS) dash-select-header
-
(CLASS) dash-cell-value
-
(CLASS) dash-freeze-left
-
(CLASS) dash-freeze-top
-
(CLASS) dash-spreadsheet
-
(CLASS) dash-spreadsheet-container
-
(CLASS) dash-spreadsheet-inner
Version 3.1 of the Dash-Table builds upon the 3.0 table and solidifies the external facing API of the table
- introducing the notion of derived properties
- virtual and viewport dataframe and indices for more flexibility
- code refactoring to simplify and improve the existing implementation / prepare for the future
- documentation of the API and table features
- additional e2e, integration and unit tests for a more mature development platform
Derived Properties
- Derived properties are new to 3.1
- They are readonly properties that represent a transform from multiple 'first-class' properties of the component.
- For example,
derived_viewport_dataframe
is a readonly view based on(dataframe, filtering params, sorting params, pagination params) --> derived_viewport_dataframe
Derived properties allow the component to expose complex state that can be useful for a Dash Server developer but without introducing dual states, a situation where multiple properties may represent the same state within the component, making it necessary to reconcile them on each prop update.
Virtual and Viewport Dataframe
-
4 new external facing derived properties and 4 internal facing controlled properties that represent:
- the filtered and sorted dataframe and the indices mapping
- the filtered, sorted and paginated dataframe and the indices mapping
derived_viewport_dataframe
derived_viewport_indices
derived_virtual_dataframe
derived_virtual_indices
In the event where sorting, filtering or pagination is done on the Dash server, it is possible that some or all derived dataframes will be equal to the dataframe prop.
- Fix regression for user select Sorting arrow will no longer highlight.
- Improve performance when the user clicks outside of the table #104
Clicking outside of the table was setting the table's
is_focused
property. Setting component properties in Dash can be expensive: it can cause the entire app to re-render. Now, clicking outside the table will update the component more efficiently, prevent excessive application re-renders.
-
Fix incorrect border around table cells when not filled #102 #101 Table styling has been changed for frozen rows and columns. Default styling change from:
- frozen rows: { height: 500px } to { height: fit-content, max-height: 500px }
- frozen columns: { width: 500px } to { width: fit-content, max-width: 500px }
- Fix dropdown position & behavior on scroll #96 Limitation: The dropdown in fixed columns behaves differently from the dropdown in the non-fixed portion of the table. Because of layers of overflow & positioning, the dropdown does not show outside of the table is instead part of it. Opening the dropdown in bottom rows will require scrolling vs. displaying on top of the table.
Basic Filtering & Preparation work for advaced filtering
-
Additional filtering_type prop that can take value 'basic' (or eventually 'advanced') This prop defines whether the user is presented with the UI to filter by column or with complex expressions The default value is 'basic'
Note: The filtering row counts against n_fixed_rows
-
Additional filtering_types prop that takes an array of values with valid values 'basic' (and eventually 'advanced') This prop defines what type of filtering are available to the user The default value is ['basic']
Note: This value needs to be consistent with
filtering_type
- Partial implementation of new click & sequential click behavior #79 #77
- First click selects the cell's content and will cause user input to override the cell content.
- Second click into the cell will remove the selection and position the cursor accordingly.
- Fix double click regression #63
Treat empty strings as none
- sorting_treat_empty_string_as_none takes value True or False Overrides sorting default behavior to consider empty strings as a nully value. Note: This is a stopgag prop, full implementation of sorting overrides will most probably deprecate it. Default value is False.
setProps bug fix
- Fixing initialization issue where the FE wrongly believes it's working in DEV mode
Additional sorting_type
prop that can take value 'multi' or 'single'
This prop defines whether the user can sort based on multiple columns or can only sort by one column at a time. The default value is 'single'.
Consolidating virtualization, sorting, filtering
- First steps to make sorting work from both FE and BE *
- and consistent with Virtualization settings *
New Props
- sorting -> ['fe', 'be', true, false] (default: false) -- replaces
sortable
prop - sorting_settings -> array of { field, ascending } -- replaces
sort
prop virtual_dataframe
(READONLY)virtual_dataframe_indices
(READONLY; not officially supported yet -- IN DEVELOPMENT)
virtual_dataframe vs. dataframe
- the virtual dataframe is the content of the viewport for the user (e.g. user has a 10k rows dataframe with FE/250 lines paging, on 1st page -> the
virtual_dataframe
contains items [0,250[ of the dataframe); the dataframe still contains 10k items - 10k rows, no paging, sorting and filtering -> the virtual dataframe contains items visible in the viewport, in the visible order; the dataframe still contains 10k items
- if the user modifies a cell, the dataframe and the virtual_dataframe are updated with the new data
- sortable
- sort
- dataframe behavior on sort (see below)
New props for Conditional Style, Conditional Dropdown, Filter
- filtering -> ['fe', 'be', true, false] (default: false)
- filtering_settings -> AST query string (default: '')
- column_conditional_dropdowns
- column_static_dropdown
- column_conditional_styles
- column_static_style
- row_conditional_styles
- row_static_style
- column style
- column options
- dropdown_properties prop
Version 3.0 of the Dash-Table expands vastly on the capability of the 2.x table and provides features:
- visually freezing rows and/or columns
- filtering in either FE or BE, basic filtering UI
- sorting in either FE or BE, basic sorting UI
- pagination in either FE or BE, basic pagination UI
- performance optimizations
- basic coverage through e2e, integration and unit tests
Virtualization
- See v_be_page_usage.py and v_fe_page_usage.py for FE and BE usage scenarios.
- virtual_dataframe and virtual_dataframe_indices are exposed and expected to be readonly. Setting them from the BE will have no impact on the FE display. FE Virtualization
- BE is not expected to update the dataframe when the virtualization settings are updated.
BE Virtualization
- BE is expected to update the dataframe when the virtualization settings are updated.
Freeze Top Rows (Limitations)
- the table styling is forced to { table-layout: fixed; width: 0 !important; } to ensure the frozen section and the rest of the table stay in sync (width-wise); this means that the width of the table is only driven by the width of the columns (default width is 200px)
- can't freeze rows and columns at the same time
Freeze Left Columns (Limitations)
- performance is highly impacted if the table is in a scrollable container as the frozen columns position has to be recalculated on each scroll event; impact is minimal up to 50-100 items and makes the table difficult to use with 250-500 items
- can't freeze rows and columns at the same time
- when using merged headers, make sure that the number of fixed columns respects the merged headers, otherwise there will be some unresolved visual bugs/artifacts
- rows are assumed to all have the same height
Deletable Columns (Limitations)
- there might be unintended side-effects if used with BE virtualization (the act of deleting a column / columns modifies the dataframe)
Performance Improvements
- Table now renders and navigates faster
- Typing in cell does not modify dataframe until focus is lost / edit is confirmed ("enter" or "tab)
- prop "update_on_unfocus" has been removed