This is an automated email from the ASF dual-hosted git repository.
ccwilliams pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new 9b4cf85 [cypress] add SQL lab tests (#5974)
9b4cf85 is described below
commit 9b4cf856ddb272fd9e99d719aa528ac50eac8444
Author: Chris Williams <[email protected]>
AuthorDate: Tue Oct 9 14:28:11 2018 -0700
[cypress] add SQL lab tests (#5974)
* [cypress] add sqllab/sourcePanel integration tests
* [cypress] add tests for SQL Lab query panel
* [cypress] add selectors/
* [cypress] add tests for SQL Lab tabs
* [cypress][sqllab] remove nested assertions where possible, update to
single test index file
* [cypress][sqllab] try force click
* [cypress][sqllab] wait for saved query to load
* [cypress][sqllab] unnest, use visit for href
* [cypress][sqllab] try 1s wait :O
* [cypress][sqllab] wait for savedquery api response
* [cypress][sqllab] fix wait syntax
* [cypress][sqllab] add route wait in sourcepanel for flakiness
* [cypress] use *.test.js pattern for tests
* [cypress] fix paths
* [cypress][sqllab] actually try running lint
* [cypress][dashboards] use *.test.js pattern for tests
* [cypress][sqllab] combine tests, remove nesting
* [cypress][sqllab] explicitly wait for query results
---
superset/assets/cypress.json | 5 +-
.../assets/cypress/integration/dashboard/all.js | 11 ---
.../dashboard/{_controls.js => controls.js} | 0
.../dashboard/{_edit_mode.js => edit_mode.js} | 0
.../dashboard/{_filter.js => filter.js} | 0
.../cypress/integration/dashboard/index.test.js | 11 +++
.../integration/dashboard/{_load.js => load.js} | 0
.../explore/{control_tests.js => control.test.js} | 0
.../integration/explore/visualizations/all.js | 35 -------
.../explore/visualizations/{_area.js => area.js} | 0
.../{_big_number.js => big_number.js} | 0
.../{_big_number_total.js => big_number_total.js} | 0
.../visualizations/{_box_plot.js => box_plot.js} | 0
.../visualizations/{_bubble.js => bubble.js} | 0
.../visualizations/{_compare.js => compare.js} | 0
.../visualizations/{_dist_bar.js => dist_bar.js} | 0
.../visualizations/{_dual_line.js => dual_line.js} | 0
.../visualizations/{_histogram.js => histogram.js} | 0
.../explore/visualizations/index.test.js | 35 +++++++
.../explore/visualizations/{_line.js => line.js} | 0
.../explore/visualizations/{_pie.js => pie.js} | 0
.../{_pivot_table.js => pivot_table.js} | 0
.../visualizations/{_sankey.js => sankey.js} | 0
.../visualizations/{_sunburst.js => sunburst.js} | 0
.../explore/visualizations/{_table.js => table.js} | 0
.../visualizations/{_treemap.js => treemap.js} | 0
.../visualizations/{_world_map.js => world_map.js} | 0
.../cypress/integration/sqllab/index.test.js | 9 ++
.../assets/cypress/integration/sqllab/query.js | 103 +++++++++++++++++++++
.../cypress/integration/sqllab/sourcePanel.js | 57 ++++++++++++
.../cypress/integration/sqllab/sqllab.helper.js | 22 +++++
superset/assets/cypress/integration/sqllab/tabs.js | 38 ++++++++
.../assets/src/SqlLab/components/TableElement.jsx | 2 +-
33 files changed, 277 insertions(+), 51 deletions(-)
diff --git a/superset/assets/cypress.json b/superset/assets/cypress.json
index dee8cf6..3f410e4 100644
--- a/superset/assets/cypress.json
+++ b/superset/assets/cypress.json
@@ -1,9 +1,6 @@
{
"baseUrl": "http://localhost:8081",
"videoUploadOnPasses": false,
- "ignoreTestFiles": [
- "_*.js",
- "*.helper.js"
- ],
+ "ignoreTestFiles": ["**/!(*.test.js)"],
"projectId": "fbf96q"
}
diff --git a/superset/assets/cypress/integration/dashboard/all.js
b/superset/assets/cypress/integration/dashboard/all.js
deleted file mode 100644
index e448319..0000000
--- a/superset/assets/cypress/integration/dashboard/all.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import DashboardControlsTest from './_controls';
-import DashboardEditModeTest from './_edit_mode';
-import DashboardFilterTest from './_filter';
-import DashboardLoadTest from './_load';
-
-describe('Dashboard', () => {
- DashboardControlsTest();
- DashboardEditModeTest();
- DashboardFilterTest();
- DashboardLoadTest();
-});
diff --git a/superset/assets/cypress/integration/dashboard/_controls.js
b/superset/assets/cypress/integration/dashboard/controls.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_controls.js
rename to superset/assets/cypress/integration/dashboard/controls.js
diff --git a/superset/assets/cypress/integration/dashboard/_edit_mode.js
b/superset/assets/cypress/integration/dashboard/edit_mode.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_edit_mode.js
rename to superset/assets/cypress/integration/dashboard/edit_mode.js
diff --git a/superset/assets/cypress/integration/dashboard/_filter.js
b/superset/assets/cypress/integration/dashboard/filter.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_filter.js
rename to superset/assets/cypress/integration/dashboard/filter.js
diff --git a/superset/assets/cypress/integration/dashboard/index.test.js
b/superset/assets/cypress/integration/dashboard/index.test.js
new file mode 100644
index 0000000..664e3ac
--- /dev/null
+++ b/superset/assets/cypress/integration/dashboard/index.test.js
@@ -0,0 +1,11 @@
+import DashboardControlsTest from './controls';
+import DashboardEditModeTest from './edit_mode';
+import DashboardFilterTest from './filter';
+import DashboardLoadTest from './load';
+
+describe('Dashboard', () => {
+ DashboardControlsTest();
+ DashboardEditModeTest();
+ DashboardFilterTest();
+ DashboardLoadTest();
+});
diff --git a/superset/assets/cypress/integration/dashboard/_load.js
b/superset/assets/cypress/integration/dashboard/load.js
similarity index 100%
rename from superset/assets/cypress/integration/dashboard/_load.js
rename to superset/assets/cypress/integration/dashboard/load.js
diff --git a/superset/assets/cypress/integration/explore/control_tests.js
b/superset/assets/cypress/integration/explore/control.test.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/control_tests.js
rename to superset/assets/cypress/integration/explore/control.test.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/all.js
b/superset/assets/cypress/integration/explore/visualizations/all.js
deleted file mode 100644
index 730bf13..0000000
--- a/superset/assets/cypress/integration/explore/visualizations/all.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import AreaTest from './_area';
-import BigNumberTest from './_big_number';
-import BigNumberTotalTest from './_big_number_total';
-import BubbleTest from './_bubble';
-import CompareTest from './_compare';
-import DistBarTest from './_dist_bar';
-import DualLineTest from './_dual_line';
-import HistogramTest from './_histogram';
-import LineTest from './_line';
-import PieTest from './_pie';
-import PivotTableTest from './_pivot_table';
-import SankeyTest from './_sankey';
-import SunburstTest from './_sunburst';
-import TableTest from './_table';
-import TreemapTest from './_treemap';
-import WorldMapTest from './_world_map';
-
-describe('All Visualizations', () => {
- AreaTest();
- BigNumberTest();
- BigNumberTotalTest();
- BubbleTest();
- CompareTest();
- DistBarTest();
- DualLineTest();
- HistogramTest();
- LineTest();
- PieTest();
- PivotTableTest();
- SankeyTest();
- SunburstTest();
- TableTest();
- TreemapTest();
- WorldMapTest();
-});
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_area.js
b/superset/assets/cypress/integration/explore/visualizations/area.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_area.js
rename to superset/assets/cypress/integration/explore/visualizations/area.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_big_number.js
b/superset/assets/cypress/integration/explore/visualizations/big_number.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_big_number.js
rename to
superset/assets/cypress/integration/explore/visualizations/big_number.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_big_number_total.js
b/superset/assets/cypress/integration/explore/visualizations/big_number_total.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_big_number_total.js
rename to
superset/assets/cypress/integration/explore/visualizations/big_number_total.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_box_plot.js
b/superset/assets/cypress/integration/explore/visualizations/box_plot.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_box_plot.js
rename to superset/assets/cypress/integration/explore/visualizations/box_plot.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_bubble.js
b/superset/assets/cypress/integration/explore/visualizations/bubble.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_bubble.js
rename to superset/assets/cypress/integration/explore/visualizations/bubble.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_compare.js
b/superset/assets/cypress/integration/explore/visualizations/compare.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_compare.js
rename to superset/assets/cypress/integration/explore/visualizations/compare.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_dist_bar.js
b/superset/assets/cypress/integration/explore/visualizations/dist_bar.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_dist_bar.js
rename to superset/assets/cypress/integration/explore/visualizations/dist_bar.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_dual_line.js
b/superset/assets/cypress/integration/explore/visualizations/dual_line.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_dual_line.js
rename to
superset/assets/cypress/integration/explore/visualizations/dual_line.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_histogram.js
b/superset/assets/cypress/integration/explore/visualizations/histogram.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_histogram.js
rename to
superset/assets/cypress/integration/explore/visualizations/histogram.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/index.test.js
b/superset/assets/cypress/integration/explore/visualizations/index.test.js
new file mode 100644
index 0000000..2f28083
--- /dev/null
+++ b/superset/assets/cypress/integration/explore/visualizations/index.test.js
@@ -0,0 +1,35 @@
+import AreaTest from './area';
+import BigNumberTest from './big_number';
+import BigNumberTotalTest from './big_number_total';
+import BubbleTest from './bubble';
+import CompareTest from './compare';
+import DistBarTest from './dist_bar';
+import DualLineTest from './dual_line';
+import HistogramTest from './histogram';
+import LineTest from './line';
+import PieTest from './pie';
+import PivotTableTest from './pivot_table';
+import SankeyTest from './sankey';
+import SunburstTest from './sunburst';
+import TableTest from './table';
+import TreemapTest from './treemap';
+import WorldMapTest from './world_map';
+
+describe('All Visualizations', () => {
+ AreaTest();
+ BigNumberTest();
+ BigNumberTotalTest();
+ BubbleTest();
+ CompareTest();
+ DistBarTest();
+ DualLineTest();
+ HistogramTest();
+ LineTest();
+ PieTest();
+ PivotTableTest();
+ SankeyTest();
+ SunburstTest();
+ TableTest();
+ TreemapTest();
+ WorldMapTest();
+});
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_line.js
b/superset/assets/cypress/integration/explore/visualizations/line.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_line.js
rename to superset/assets/cypress/integration/explore/visualizations/line.js
diff --git a/superset/assets/cypress/integration/explore/visualizations/_pie.js
b/superset/assets/cypress/integration/explore/visualizations/pie.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_pie.js
rename to superset/assets/cypress/integration/explore/visualizations/pie.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_pivot_table.js
b/superset/assets/cypress/integration/explore/visualizations/pivot_table.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_pivot_table.js
rename to
superset/assets/cypress/integration/explore/visualizations/pivot_table.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_sankey.js
b/superset/assets/cypress/integration/explore/visualizations/sankey.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_sankey.js
rename to superset/assets/cypress/integration/explore/visualizations/sankey.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_sunburst.js
b/superset/assets/cypress/integration/explore/visualizations/sunburst.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_sunburst.js
rename to superset/assets/cypress/integration/explore/visualizations/sunburst.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_table.js
b/superset/assets/cypress/integration/explore/visualizations/table.js
similarity index 100%
rename from superset/assets/cypress/integration/explore/visualizations/_table.js
rename to superset/assets/cypress/integration/explore/visualizations/table.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_treemap.js
b/superset/assets/cypress/integration/explore/visualizations/treemap.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_treemap.js
rename to superset/assets/cypress/integration/explore/visualizations/treemap.js
diff --git
a/superset/assets/cypress/integration/explore/visualizations/_world_map.js
b/superset/assets/cypress/integration/explore/visualizations/world_map.js
similarity index 100%
rename from
superset/assets/cypress/integration/explore/visualizations/_world_map.js
rename to
superset/assets/cypress/integration/explore/visualizations/world_map.js
diff --git a/superset/assets/cypress/integration/sqllab/index.test.js
b/superset/assets/cypress/integration/sqllab/index.test.js
new file mode 100644
index 0000000..fe85fd1
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/index.test.js
@@ -0,0 +1,9 @@
+import queryTests from './query';
+import sourcePanelTests from './sourcePanel';
+import tabsTests from './tabs';
+
+describe('All SqlLab tests', () => {
+ queryTests();
+ sourcePanelTests();
+ tabsTests();
+});
diff --git a/superset/assets/cypress/integration/sqllab/query.js
b/superset/assets/cypress/integration/sqllab/query.js
new file mode 100644
index 0000000..2f799b0
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/query.js
@@ -0,0 +1,103 @@
+import shortid from 'shortid';
+import { selectResultsTab, assertSQLLabResultsAreEqual } from
'./sqllab.helper';
+
+export default () => {
+ describe('SqlLab query panel', () => {
+ beforeEach(() => {
+ cy.login();
+ cy.server();
+ cy.visit('/superset/sqllab');
+
+ cy.route('POST', '/superset/sql_json/**').as('sqlLabQuery');
+ });
+
+ it('supports entering and running a query', () => {
+ // row limit has to be < ~10 for us to be able to determine how many rows
+ // are fetched below (because React _Virtualized_ does not render all
rows)
+ const rowLimit = 3;
+
+ cy.get('#brace-editor textarea').type(
+ `{selectall}{backspace}SELECT ds, gender, name, num FROM
main.birth_names LIMIT ${rowLimit}`,
+ { force: true },
+ );
+ cy.get('#js-sql-toolbar button')
+ .eq(0)
+ .click();
+
+ cy.wait('@sqlLabQuery');
+
+ cy.get('.SouthPane .ReactVirtualized__Table')
+ .eq(0) // ensures results tab in case preview tab exists
+ .then((tableNodes) => {
+ const [header, bodyWrapper] = tableNodes[0].childNodes;
+ const body = bodyWrapper.childNodes[0];
+ const expectedColCount = header.childNodes.length;
+ const expectedRowCount = body.childNodes.length;
+ expect(expectedColCount).to.equal(4);
+ expect(expectedRowCount).to.equal(rowLimit);
+ });
+ });
+
+ it('successfully saves a query', () => {
+ cy.route('savedqueryviewapi/**').as('getSavedQuery');
+
+ const query = 'SELECT ds, gender, name, num FROM main.birth_names ORDER
BY name LIMIT 3';
+ const savedQueryTitle = `CYPRESS TEST QUERY ${shortid.generate()}`;
+
+ // we will assert that the results of the query we save, and the saved
query are the same
+ let initialResultsTable = null;
+ let savedQueryResultsTable = null;
+
+ cy.get('#brace-editor textarea')
+ .type(`{selectall}{backspace}${query}`, { force: true })
+ .focus() // focus => blur is required for updating the query that is
to be saved
+ .blur();
+
+ // ctrl + r also runs query
+ cy.get('#brace-editor textarea').type('{ctrl}r', { force: true });
+
+ cy.wait('@sqlLabQuery');
+
+ // Save results to check agains below
+ selectResultsTab().then((resultsA) => {
+ initialResultsTable = resultsA[0];
+ });
+
+ cy.get('#js-sql-toolbar button')
+ .eq(1) // save query
+ .click();
+
+ // Enter name + save into modal
+ cy.get('.modal-sm
input').type(`{selectall}{backspace}${savedQueryTitle}`, {
+ force: true,
+ });
+
+ cy.get('.modal-sm .modal-body button')
+ .eq(0) // save
+ .click();
+
+ // visit saved queries
+ cy.visit('/sqllab/my_queries/');
+
+ // first row contains most recent link, follow back to SqlLab
+ cy.get('table tr:first-child a[href*="savedQueryId"').click();
+
+ // will timeout without explicitly waiting here
+ cy.wait('@getSavedQuery');
+
+ // run the saved query
+ cy.get('#js-sql-toolbar button')
+ .eq(0) // run query
+ .click();
+
+ cy.wait('@sqlLabQuery');
+
+ // assert the results of the saved query match the initial results
+ selectResultsTab().then((resultsB) => {
+ savedQueryResultsTable = resultsB[0];
+
+ assertSQLLabResultsAreEqual(initialResultsTable,
savedQueryResultsTable);
+ });
+ });
+ });
+};
diff --git a/superset/assets/cypress/integration/sqllab/sourcePanel.js
b/superset/assets/cypress/integration/sqllab/sourcePanel.js
new file mode 100644
index 0000000..5db5924
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/sourcePanel.js
@@ -0,0 +1,57 @@
+import { selectResultsTab } from './sqllab.helper';
+
+export default () => {
+ describe('SqlLab datasource panel', () => {
+ beforeEach(() => {
+ cy.login();
+ cy.server();
+ cy.visit('/superset/sqllab');
+ });
+
+ it('creates a table schema and preview when a database, schema, and table
are selected', () => {
+ cy.route('/superset/table/**').as('tableMetadata');
+
+ // it should have dropdowns to select database, schema, and table
+ cy.get('.sql-toolbar .Select').should('have.length', 3);
+
+ cy.get('.sql-toolbar .table-schema').should('not.exist');
+ cy.get('.SouthPane .tab-content
.filterable-table-container').should('not.exist');
+
+ cy.get('.sql-toolbar .Select')
+ .eq(0) // database select
+ .within(() => {
+ // note: we have to set force: true because the input is invisible /
cypress throws
+ cy.get('input').type('main{enter}', { force: true });
+ });
+
+ cy.get('.sql-toolbar .Select')
+ .eq(1) // schema select
+ .within(() => {
+ cy.get('input').type('main{enter}', { force: true });
+ });
+
+ cy.get('.sql-toolbar .Select')
+ .eq(2) // table select
+ .within(() => {
+ cy.get('input').type('birth_names{enter}', { force: true });
+ });
+
+ cy.wait('@tableMetadata');
+
+ cy.get('.sql-toolbar .table-schema').should('have.length', 1);
+ selectResultsTab().should('have.length', 1);
+
+ // add another table and check for added schema + preview
+ cy.get('.sql-toolbar .Select')
+ .eq(2)
+ .within(() => {
+ cy.get('input').type('logs{enter}', { force: true });
+ });
+
+ cy.wait('@tableMetadata');
+
+ cy.get('.sql-toolbar .table-schema').should('have.length', 2);
+ selectResultsTab().should('have.length', 2);
+ });
+ });
+};
diff --git a/superset/assets/cypress/integration/sqllab/sqllab.helper.js
b/superset/assets/cypress/integration/sqllab/sqllab.helper.js
new file mode 100644
index 0000000..7c28b5f
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/sqllab.helper.js
@@ -0,0 +1,22 @@
+export const selectResultsTab = () => cy.get('.SouthPane
.ReactVirtualized__Table');
+
+// this function asserts that the result set for two SQL lab table results are
equal
+export const assertSQLLabResultsAreEqual = (resultsA, resultsB) => {
+ const [headerA, bodyWrapperA] = resultsA.childNodes;
+ const bodyA = bodyWrapperA.childNodes[0];
+
+ const [headerB, bodyWrapperB] = resultsB.childNodes;
+ const bodyB = bodyWrapperB.childNodes[0];
+
+ expect(headerA.childNodes.length).to.equal(headerB.childNodes.length);
+ expect(bodyA.childNodes.length).to.equal(bodyB.childNodes.length);
+
+ bodyA.childNodes.forEach((rowA, rowIndex) => {
+ const rowB = bodyB.childNodes[rowIndex];
+
+ rowA.childNodes.forEach((cellA, columnIndex) => {
+ const cellB = rowB.childNodes[columnIndex];
+ expect(cellA.innerText).to.equal(cellB.innerText);
+ });
+ });
+};
diff --git a/superset/assets/cypress/integration/sqllab/tabs.js
b/superset/assets/cypress/integration/sqllab/tabs.js
new file mode 100644
index 0000000..cf49c18
--- /dev/null
+++ b/superset/assets/cypress/integration/sqllab/tabs.js
@@ -0,0 +1,38 @@
+export default () => {
+ describe('SqlLab query tabs', () => {
+ beforeEach(() => {
+ cy.login();
+ cy.server();
+ cy.visit('/superset/sqllab');
+ });
+
+ it('allows you to create a tab', () => {
+ cy.get('#a11y-query-editor-tabs > ul > li').then((tabList) => {
+ const initialTabCount = tabList.length;
+
+ // add tab
+ cy.get('#a11y-query-editor-tabs > ul > li')
+ .last()
+ .click();
+
+ cy.get('#a11y-query-editor-tabs > ul > li').should('have.length',
initialTabCount + 1);
+ });
+ });
+
+ it('allows you to close a tab', () => {
+ cy.get('#a11y-query-editor-tabs > ul > li').then((tabListA) => {
+ const initialTabCount = tabListA.length;
+
+ // open the tab dropdown to remove
+ cy.get('#a11y-query-editor-tabs > ul > li:first button').click();
+
+ // first item is close
+ cy.get('#a11y-query-editor-tabs > ul > li:first ul li a')
+ .eq(0)
+ .click();
+
+ cy.get('#a11y-query-editor-tabs > ul > li').should('have.length',
initialTabCount - 1);
+ });
+ });
+ });
+};
diff --git a/superset/assets/src/SqlLab/components/TableElement.jsx
b/superset/assets/src/SqlLab/components/TableElement.jsx
index b1e53a9..ce6bf68 100644
--- a/superset/assets/src/SqlLab/components/TableElement.jsx
+++ b/superset/assets/src/SqlLab/components/TableElement.jsx
@@ -216,7 +216,7 @@ class TableElement extends React.PureComponent {
transitionAppear
onExited={this.removeFromStore.bind(this)}
>
- <div className="TableElement m-b-10">
+ <div className="TableElement table-schema m-b-10">
{this.renderHeader()}
<div>
{this.renderBody()}