Branch: master
Find file Copy path
567 lines (453 sloc) 23.7 KB

Change Log for dash-table

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.




  • Added column_type condition to style if; allows applying styles based on the type of the column for props
    • style_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 to style_data_conditional props definition

[3.4.0] - 2019-02-08



  • 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 {}

[3.3.0] - 2019-02-01



  • 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

[3.2.0] - 2019-01-25



  • 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

[3.1.12] - 2019-01-11


  • Regression, misaligned header #324


  • Test with head of both Dash v0.x and Dash v1.x #20

[3.1.11] - 2018-12-10


  • Selection, navigation, copy from readonly cell #276

[3.1.10] - 2018-12-10


  • Deprecated nested property 'displayed_pages' from 'pagination_settings' #275

[3.1.9] - 2018-12-06


  • Source map #284 Related Dash issue #480


  • Refactoring in preparation for data types #280

[3.1.8] - 2018-12-04


  • Virtualization #234


  • Linting correctly applied to all code #254


  • Update dependencies #278
  • Update dependencies #274
  • Update dependencies #251

[3.1.7] - 2018-11-19


  • Visual offset with vertical scroll #216

[3.1.6] - 2018-11-15


  • Generate python components classes for IDE support #243

[3.1.5] - 2018-11-09


  • Fix python package regression #235

[3.1.4] - 2018-11-06


  • New derived props for selected_rows #147
  • Package library the UMD way #212

[3.1.3] - 2018-11-05


  • Fix load in IE 11 #217

[3.1.2] - 2018-11-02


The version in the package didn't get updated.

[3.1.1] - 2018-11-02


The remote URL path for the bundle was incorrect.

[3.1.0] - 2018-11-02

  • 3.1.0 (Alpha) Release of the Dash Table

[3.1.0-rc21] - 2018-11-02


  • Fire submit when pressing enter key in IsolatedInput. Fixes issue #194

[3.1.0-rc20] - 2018-11-01


[3.1.0-rc19] - 2018-11-01


  • 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
  • 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

[3.1.0-rc18] - 2018-10-31


  • Rename table component to DataTable #187 #154

[3.1.0-rc17] - 2018-10-31


[3.1.0-rc16] - 2018-10-30


  • Fix copy/paste behavior when copying rows larger than data #180 #142

[3.1.0-rc15] - 2018-10-30


  • Column 'editable' prop takes precedence over table 'editable' prop#182 #175

[3.1.0-rc14] - 2018-10-30


  • Rename sorting_settings columnId -> column_id #183 #171

[3.1.0-rc13] - 2018-10-30


[3.1.0-rc12] - 2018-10-29


  • Rename selected_cell -> selected_cells #181 #177



  • 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.





  • Make table id optional (generate random one if needed) #155 #139



  • 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 overriden color: 'black', // from B, A overriden 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-cass, 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



  • Tests and fixes for editable/readonly #134 #132



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

- table style (example)
    table_style=[{ selector: '.dash-spreadsheet', rule: 'width: 100%; max-width: 100%' }]

- column with %-based width
        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:

    1. the filtered and sorted dataframe and the indices mapping
    2. 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



  • Make buttons non-selectable #105 #91



  • Fix keyboard navigation after copy #90 #49



  • Fix global copy paste regression #87 #75
  • Fix data paste #87 #88



  • Empty dropdown setting value regression fix #85 #83

RC13 - Modify click & sequential click behavior


  • 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 copy/paste regression #70 #64
  • Fix click/blur regression #70 #65
  • Fix delete regression #70 #67



  • 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


  • See and 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/artefacts
  • 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