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):