diff --git a/.flake8 b/.flake8
index f994d595b..25750c831 100644
--- a/.flake8
+++ b/.flake8
@@ -1,5 +1,5 @@
[flake8]
-ignore = E203, E266, E501, E731, W503
+ignore = C901, E203, E266, E501, E731, W503
max-line-length = 88
max-complexity = 18
select = B,C,E,F,W,T4
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c769c228a..f2d9bde46 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
+## [Unreleased]
+### Changed
+- [#713](https://github.com/plotly/dash-table/pull/713) Update from React 16.8.6 to 16.13.0
+
## [4.6.1] - 2020-02-27
### Added
- [#711](https://github.com/plotly/dash-table/pull/711) Added R examples to package help
diff --git a/demo/index.html b/demo/index.html
index 613c17016..55aad84a5 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -5,8 +5,8 @@
-
-
+
+
diff --git a/package-lock.json b/package-lock.json
index 00a318d64..39462095e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "dash-table",
- "version": "4.5.1",
+ "version": "4.6.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -23699,9 +23699,9 @@
}
},
"react": {
- "version": "16.9.0",
- "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz",
- "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==",
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.13.0.tgz",
+ "integrity": "sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ==",
"dev": true,
"requires": {
"loose-envify": "^1.1.0",
@@ -23979,15 +23979,15 @@
}
},
"react-dom": {
- "version": "16.9.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz",
- "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==",
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.0.tgz",
+ "integrity": "sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg==",
"dev": true,
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"prop-types": "^15.6.2",
- "scheduler": "^0.15.0"
+ "scheduler": "^0.19.0"
}
},
"react-draggable": {
@@ -25109,9 +25109,9 @@
"dev": true
},
"scheduler": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
- "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.0.tgz",
+ "integrity": "sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA==",
"dev": true,
"requires": {
"loose-envify": "^1.1.0",
diff --git a/package.json b/package.json
index bd123a740..63fc996e0 100644
--- a/package.json
+++ b/package.json
@@ -24,7 +24,7 @@
"private::build:py": "dash-generate-components src/dash-table/dash/DataTable.js dash_table -p package-info.json && cp dash_table_base/** dash_table/ && dash-generate-components src/dash-table/dash/DataTable.js dash_table -p package-info.json --r-prefix 'dash'",
"private::host_js": "http-server ./dash_table -c-1 --silent",
"private::lint:ts": "tslint --project tsconfig.json --config tslint.json",
- "private::lint:py": "flake8 --exclude=DataTable.py,__init__.py,_imports_.py dash_table && black --check --exclude dash_table .",
+ "private::lint:py": "flake8 --exclude=DataTable.py,__init__.py,_imports_.py dash_table tests && black --check --exclude dash_table .",
"private::wait_js": "wait-on http://localhost:8080",
"private::opentests": "cypress open",
"private::test.python": "python -m unittest tests/unit/format_test.py",
@@ -86,9 +86,9 @@
"papaparse": "^5.1.1",
"ramda": "^0.26.1",
"raw-loader": "^3.1.0",
- "react": "16.9.0",
+ "react": "16.13.0",
"react-docgen": "^4.1.1",
- "react-dom": "16.9.0",
+ "react-dom": "16.13.0",
"react-select": "^1.3.0",
"remarkable": "^2.0.0",
"sheetclip": "^0.3.0",
diff --git a/src/core/components/IsolatedInput/index.tsx b/src/core/components/IsolatedInput/index.tsx
index c3280c8eb..45d574555 100644
--- a/src/core/components/IsolatedInput/index.tsx
+++ b/src/core/components/IsolatedInput/index.tsx
@@ -40,7 +40,7 @@ export default class IsolatedInput extends PureComponent {
return this.props as PropsWithDefaults;
}
- componentWillReceiveProps(nextProps: IProps) {
+ UNSAFE_componentWillReceiveProps(nextProps: IProps) {
const { value } = this.props;
const { value: nextValue } = nextProps;
diff --git a/src/dash-table/components/CellInput/index.tsx b/src/dash-table/components/CellInput/index.tsx
index 5c02ab2e8..63f932915 100644
--- a/src/dash-table/components/CellInput/index.tsx
+++ b/src/dash-table/components/CellInput/index.tsx
@@ -97,7 +97,7 @@ export default class CellInput extends PureComponent {
this.propagateChange();
}
- componentWillReceiveProps(nextProps: ICellProps) {
+ UNSAFE_componentWillReceiveProps(nextProps: ICellProps) {
const { value: nextValue } = nextProps;
if (this.state.value !== nextValue) {
diff --git a/src/dash-table/components/ControlledTable/index.tsx b/src/dash-table/components/ControlledTable/index.tsx
index 67611e64d..c633c8e36 100644
--- a/src/dash-table/components/ControlledTable/index.tsx
+++ b/src/dash-table/components/ControlledTable/index.tsx
@@ -115,6 +115,12 @@ export default class ControlledTable extends PureComponent
}
componentDidMount() {
+ // Fallback method for paste handling in Chrome
+ // when no input element has focused inside the table
+ window.addEventListener('resize', this.forceHandleResize);
+ document.addEventListener('mousedown', this.handleClick);
+ document.addEventListener('paste', this.handlePaste);
+
const {
active_cell,
selected_cells,
@@ -132,25 +138,14 @@ export default class ControlledTable extends PureComponent
this.handleResize();
}
- componentWillMount() {
- // Fallback method for paste handling in Chrome
- // when no input element has focused inside the table
- window.addEventListener('resize', this.forceHandleResize);
- document.addEventListener('mousedown', this.handleClick);
- document.addEventListener('paste', this.handlePaste);
- }
-
componentWillUnmount() {
window.removeEventListener('resize', this.forceHandleResize);
document.removeEventListener('mousedown', this.handleClick);
document.removeEventListener('paste', this.handlePaste);
}
- componentWillUpdate() {
- this.updateStylesheet();
- }
-
componentDidUpdate() {
+ this.updateStylesheet();
this.applyStyle();
this.handleResize();
this.handleDropdown();
diff --git a/src/dash-table/components/Table/index.tsx b/src/dash-table/components/Table/index.tsx
index 927fd3386..27b6bfae6 100644
--- a/src/dash-table/components/Table/index.tsx
+++ b/src/dash-table/components/Table/index.tsx
@@ -49,7 +49,7 @@ export default class Table extends Component {
const { applyFocus: currentApplyFocus, workFilter: { map: currentMap, value } } = state;
diff --git a/src/dash-table/components/Tooltip/index.tsx b/src/dash-table/components/Tooltip/index.tsx
index c9e5e7ee5..0710efec9 100644
--- a/src/dash-table/components/Tooltip/index.tsx
+++ b/src/dash-table/components/Tooltip/index.tsx
@@ -41,7 +41,7 @@ export default class Tooltip extends PureComponent
};
}
- componentWillReceiveProps(nextProps: ITooltipProps) {
+ UNSAFE_componentWillReceiveProps(nextProps: ITooltipProps) {
const { delay, duration } = nextProps.tooltip;
if (isEqual(
diff --git a/tests/integration/review_app/test_app_df_backend_paging.py b/tests/integration/review_app/test_app_df_backend_paging.py
index bd6109eaa..0f3118684 100644
--- a/tests/integration/review_app/test_app_df_backend_paging.py
+++ b/tests/integration/review_app/test_app_df_backend_paging.py
@@ -204,9 +204,9 @@ def section_title(title):
@app.callback(
Output(IDS["table"], "data"),
- [Input(IDS["table"], "page_current"), Input(IDS["table"], "page_size"),],
+ [Input(IDS["table"], "page_current"), Input(IDS["table"], "page_size")],
)
- def update_graph(page_current, page_size):
+ def update_data(page_current, page_size):
return df.iloc[
page_current * page_size : (page_current + 1) * page_size
].to_dict("rows")
@@ -243,7 +243,7 @@ def update_graph(page_current, page_size, sort_by):
Input(IDS["table-multi-sorting"], "sort_by"),
],
)
- def update_graph(page_current, page_size, sort_by):
+ def update_multi_data(page_current, page_size, sort_by):
# print(sort_by)
if len(sort_by):
dff = df.sort_values(
@@ -267,7 +267,7 @@ def update_graph(page_current, page_size, sort_by):
Input(IDS["table-filtering"], "filter_query"),
],
)
- def update_graph(page_current, page_size, filter_query):
+ def updat_filtering_data(page_current, page_size, filter_query):
# print(filter_query)
filtering_expressions = filter_query.split(" && ")
dff = df
@@ -298,7 +298,7 @@ def update_graph(page_current, page_size, filter_query):
Input(IDS["table-sorting-filtering"], "filter_query"),
],
)
- def update_graph(page_current, page_size, sort_by, filter_query):
+ def update_sorting_filtering_data(page_current, page_size, sort_by, filter_query):
filtering_expressions = filter_query.split(" && ")
dff = df
for filter_query in filtering_expressions:
@@ -367,7 +367,7 @@ def update_table(page_current, page_size, sort_by, filter_query):
Output(IDS["table-paging-with-graph-container"], "children"),
[Input(IDS["table-paging-with-graph"], "data")],
)
- def update_graph(rows):
+ def update_children(rows):
dff = pd.DataFrame(rows)
return html.Div(
[
diff --git a/tests/integration/review_app/test_app_df_graph.py b/tests/integration/review_app/test_app_df_graph.py
index a7de35c40..60dfecd9a 100644
--- a/tests/integration/review_app/test_app_df_graph.py
+++ b/tests/integration/review_app/test_app_df_graph.py
@@ -10,6 +10,7 @@
ID_PREFIX = "app_data_updating_graph"
IDS = {"table": ID_PREFIX, "container": "{}-container".format(ID_PREFIX)}
+_TIMEOUT = 10
def test_rapp002_df_graph(dash_duo):
@@ -149,4 +150,7 @@ def update_graph(rows, selected_rows):
dash_duo.start_server(app)
dash_duo.wait_for_element("#waitfor")
+
+ dash_duo.wait_for_element("#{}".format(IDS["table"]))
+
dash_duo.percy_snapshot("rapp002 - loaded")
diff --git a/tests/selenium/test_markdown_copy_paste.py b/tests/selenium/test_markdown_copy_paste.py
index 1bcab4443..602e4e2d2 100644
--- a/tests/selenium/test_markdown_copy_paste.py
+++ b/tests/selenium/test_markdown_copy_paste.py
@@ -22,7 +22,7 @@ def get_app():
id="table",
data=df[0:250],
columns=[
- {"id": "Complaint ID", "name": "Complaint ID", "presentation": "markdown",},
+ {"id": "Complaint ID", "name": "Complaint ID", "presentation": "markdown"},
{"id": "Product", "name": "Product", "presentation": "markdown"},
{"id": "Sub-product", "name": "Sub-product"},
{"id": "Issue", "name": "Issue", "presentation": "markdown"},
diff --git a/tests/selenium/test_pagination.py b/tests/selenium/test_pagination.py
index 3d4c046b4..324206ad1 100644
--- a/tests/selenium/test_pagination.py
+++ b/tests/selenium/test_pagination.py
@@ -1,14 +1,11 @@
import dash
-from dash.dependencies import Input, Output, State
+from dash.dependencies import Input, Output
from dash.exceptions import PreventUpdate
-import dash_core_components as dcc
-import dash_html_components as html
from dash_table import DataTable
import pytest
from selenium.webdriver.common.keys import Keys
-from selenium.webdriver.common.action_chains import ActionChains
import math
import pandas as pd
@@ -148,8 +145,6 @@ def test_tpag006_ops_input_invalid_with_enter(test, value, expected_value):
target = test.table("table")
- text00 = target.cell(0, 0).get_text()
-
assert target.paging.current.get_value() == "1"
target.paging.current.click()
@@ -166,8 +161,6 @@ def test_tpag007_ops_input_invalid_with_unfocus(test, value, expected_value):
target = test.table("table")
- text00 = target.cell(0, 0).get_text()
-
assert target.paging.current.get_value() == "1"
target.paging.current.click()
diff --git a/tests/unit/format_test.py b/tests/unit/format_test.py
index 63bc5cd35..21aa1ebf9 100644
--- a/tests/unit/format_test.py
+++ b/tests/unit/format_test.py
@@ -223,16 +223,16 @@ def test_invalid_trim_type(self):
def test_valid_decimal_delimiter(self):
Format().decimal_delimiter("x")
- def test_valid_decimal_delimiter(self):
+ def test_valid_decimal_delimiter_multi_char(self):
self.assertRaises(ValueError, Format().decimal_delimiter, "xyz")
def test_invalid_decimal_delimiter(self):
self.assertRaises(TypeError, Format().decimal_delimiter, 7)
- def test_valid_group_delimiator(self):
+ def test_valid_group_delimitator(self):
Format().group_delimiter("y")
- def test_valid_group_delimiator(self):
+ def test_valid_group_delimitator_multi_char(self):
self.assertRaises(ValueError, Format().group_delimiter, "xyz")
def test_invalid_group_delimiter(self):