From 436b221f584e2efd2d895aa8cc21f3728b79d4c5 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Thu, 6 Sep 2018 21:48:41 -0700 Subject: [PATCH 1/7] [bugfix] Fix bignumber overflow in dashboard (#5839) * Move BigNumber to directory. * fix chart margin in dashboard * Fix margin and be more conservative about width. (cherry picked from commit 3f8b970a88136623179f37afc4af4fb0d4ee6dd2) --- .../components/gridComponents/ChartHolder.jsx | 2 +- .../{big_number.css => BigNumber/BigNumber.css} | 0 .../visualizations/{ => BigNumber}/BigNumber.jsx | 16 ++++++++-------- superset/assets/src/visualizations/index.js | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) rename superset/assets/src/visualizations/{big_number.css => BigNumber/BigNumber.css} (100%) rename superset/assets/src/visualizations/{ => BigNumber}/BigNumber.jsx (95%) diff --git a/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx b/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx index 9ad9522965dcd..0598635c35b06 100644 --- a/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx +++ b/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx @@ -131,7 +131,7 @@ class ChartHolder extends React.Component { > - loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber.jsx')), + loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber/BigNumber.jsx')), [VIZ_TYPES.big_number_total]: () => - loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber.jsx')), + loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber/BigNumber.jsx')), [VIZ_TYPES.box_plot]: loadNvd3, [VIZ_TYPES.bubble]: loadNvd3, [VIZ_TYPES.bullet]: loadNvd3, From 8c0b15a37731a940a1bd889062efbcce937b38e5 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 5 Sep 2018 14:14:12 -0700 Subject: [PATCH 2/7] [SIP-5] Refactor pivot table (#5705) * extract slice and formData * rename variables * update proptypes and add comments (cherry picked from commit 5eff7a8d6ccfefabad77f9704521959f14be530d) --- .../assets/src/visualizations/pivot_table.js | 98 ++++++++++++++----- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/superset/assets/src/visualizations/pivot_table.js b/superset/assets/src/visualizations/pivot_table.js index fded4616b350a..cd93867cbfdb4 100644 --- a/superset/assets/src/visualizations/pivot_table.js +++ b/superset/assets/src/visualizations/pivot_table.js @@ -1,51 +1,78 @@ import dt from 'datatables.net-bs'; import 'datatables.net-bs/css/dataTables.bootstrap.css'; import $ from 'jquery'; - +import PropTypes from 'prop-types'; import { d3format, fixDataTableBodyHeight } from '../modules/utils'; import './pivot_table.css'; dt(window, $); -module.exports = function (slice, payload) { - const container = slice.container; - const fd = slice.formData; - const height = container.height(); - let cols = payload.data.columns; - if (Array.isArray(cols[0])) { - cols = cols.map(col => col[0]); - } +const propTypes = { + data: PropTypes.shape({ + // TODO: replace this with raw data in SIP-6 + html: PropTypes.string, + columns: PropTypes.arrayOf(PropTypes.oneOfType([ + PropTypes.string, + PropTypes.arrayOf(PropTypes.string), + ])), + }), + height: PropTypes.number, + columnFormats: PropTypes.objectOf(PropTypes.string), + groupBy: PropTypes.arrayOf(PropTypes.string), + numberFormat: PropTypes.string, + verboseMap: PropTypes.objectOf(PropTypes.string), +}; + +function PivotTable(element, props) { + PropTypes.checkPropTypes(propTypes, props, 'prop', 'PivotTable'); + + const { + data, + height, + columnFormats, + groupBy, + numberFormat, + verboseMap, + } = props; + + const { html, columns } = data; + const container = element; + const $container = $(element); // payload data is a string of html with a single table element - container.html(payload.data.html); + container.innerHTML = html; + + const cols = Array.isArray(columns[0]) + ? columns.map(col => col[0]) + : columns; // jQuery hack to set verbose names in headers const replaceCell = function () { const s = $(this)[0].textContent; - $(this)[0].textContent = slice.datasource.verbose_map[s] || s; + $(this)[0].textContent = verboseMap[s] || s; }; - slice.container.find('thead tr:first th').each(replaceCell); - slice.container.find('thead tr th:first-child').each(replaceCell); + $container.find('thead tr:first th').each(replaceCell); + $container.find('thead tr th:first-child').each(replaceCell); // jQuery hack to format number - slice.container.find('tbody tr').each(function () { + $container.find('tbody tr').each(function () { $(this).find('td').each(function (i) { const metric = cols[i]; - const format = slice.datasource.column_formats[metric] || fd.number_format || '.3s'; + const format = columnFormats[metric] || numberFormat || '.3s'; const tdText = $(this)[0].textContent; - if (!isNaN(tdText) && tdText !== '') { + if (!Number.isNaN(tdText) && tdText !== '') { $(this)[0].textContent = d3format(format, tdText); } }); }); - if (fd.groupby.length === 1) { + if (groupBy.length === 1) { // When there is only 1 group by column, // we use the DataTable plugin to make the header fixed. // The plugin takes care of the scrolling so we don't need // overflow: 'auto' on the table. - container.css('overflow', 'hidden'); - const table = container.find('table').DataTable({ + container.style.overflow = 'hidden'; + const table = $container.find('table').DataTable({ paging: false, searching: false, bInfo: false, @@ -54,12 +81,37 @@ module.exports = function (slice, payload) { scrollX: true, }); table.column('-1').order('desc').draw(); - fixDataTableBodyHeight(container.find('.dataTables_wrapper'), height); + fixDataTableBodyHeight($container.find('.dataTables_wrapper'), height); } else { // When there is more than 1 group by column we just render the table, without using // the DataTable plugin, so we need to handle the scrolling ourselves. // In this case the header is not fixed. - container.css('overflow', 'auto'); - container.css('height', `${height + 10}px`); + container.style.overflow = 'auto'; + container.style.height = `${height + 10}px`; } -}; +} + +function adaptor(slice, payload) { + const { selector, formData, datasource } = slice; + const { + groupby: groupBy, + number_format: numberFormat, + } = formData; + const { + column_formats: columnFormats, + verbose_map: verboseMap, + } = datasource; + const element = document.querySelector(selector); + + return PivotTable(element, { + data: payload.data, + height: slice.height(), + columnFormats, + groupBy, + numberFormat, + verboseMap, + }); +} + +export default adaptor; + From 38b80477c02bfddd6fdc2f9beed7ea39990fa528 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 10:05:39 -0700 Subject: [PATCH 3/7] correctly compute slice width in dashboard (#5867) (cherry picked from commit 166058d95f69cfb43e064d4cfd0c0b62a7192d06) --- .../components/gridComponents/ChartHolder.jsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx b/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx index 0598635c35b06..366d3fede833b 100644 --- a/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx +++ b/superset/assets/src/dashboard/components/gridComponents/ChartHolder.jsx @@ -12,6 +12,7 @@ import { GRID_MIN_COLUMN_COUNT, GRID_MIN_ROW_UNITS, GRID_BASE_UNIT, + GRID_GUTTER_SIZE, } from '../../util/constants'; const CHART_MARGIN = 32; @@ -131,8 +132,14 @@ class ChartHolder extends React.Component { > From 1c30480c3844bab564ea78d1bb4de763608bcbfb Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Tue, 11 Sep 2018 16:57:11 -0700 Subject: [PATCH 4/7] fix Object.assign try to write to read-only option.style (#5860) (cherry picked from commit 962eb0860c992c1b2af3e2b5b93b2f5a31c15cf9) --- superset/assets/src/components/VirtualizedRendererWrap.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/assets/src/components/VirtualizedRendererWrap.jsx b/superset/assets/src/components/VirtualizedRendererWrap.jsx index 32821124bd19b..2f4e063fc6919 100644 --- a/superset/assets/src/components/VirtualizedRendererWrap.jsx +++ b/superset/assets/src/components/VirtualizedRendererWrap.jsx @@ -35,7 +35,7 @@ export default function VirtualizedRendererWrap(renderer) {
From e108110711ebbd1758fc75fc23516ab7af3abf13 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Wed, 12 Sep 2018 11:21:48 -0700 Subject: [PATCH 5/7] [time table] fix sorting on missing values (#5863) (cherry picked from commit 367dcdaa7de04bb281df6a59926cefa7ec1794a1) --- superset/assets/src/visualizations/time_table.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/superset/assets/src/visualizations/time_table.jsx b/superset/assets/src/visualizations/time_table.jsx index c34e5d01c7379..d2bf633e46f75 100644 --- a/superset/assets/src/visualizations/time_table.jsx +++ b/superset/assets/src/visualizations/time_table.jsx @@ -123,6 +123,7 @@ function viz(slice, payload) { } else if (column.comparisonType === 'perc_change') { v = (recent / v) - 1; } + v = v || 0; } else if (column.colType === 'contrib') { // contribution to column total v = recent / Object.keys(reversedData[0]) From a1c3ded3d87fd29af54c0e8c5f6fac7e4ae23d4f Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Wed, 12 Sep 2018 12:32:46 -0700 Subject: [PATCH 6/7] [tests] fix sqllab/TableElement_spec (#5874) (cherry picked from commit bec0b4cc37f15b2091f81a0c40bb585dd1d5c676) --- superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx b/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx index ff3087158599f..e19a312a856ef 100644 --- a/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx +++ b/superset/assets/spec/javascripts/sqllab/TableElement_spec.jsx @@ -54,8 +54,6 @@ describe('TableElement', () => { expect(wrapper.state().expanded).to.equal(true); wrapper.find('.table-remove').simulate('click'); expect(wrapper.state().expanded).to.equal(false); - setTimeout(() => { - expect(mockedActions.removeTable.called).to.equal(true); - }, 10); + expect(mockedActions.removeDataPreview.called).to.equal(true); }); }); From b9dfd18c77c160f6e6a50b6008810787728a191d Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 14:33:53 -0700 Subject: [PATCH 7/7] update yarn.lock --- superset/assets/yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index 0b112848213af..5edcfa92fbaeb 100644 --- a/superset/assets/yarn.lock +++ b/superset/assets/yarn.lock @@ -12382,7 +12382,7 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-sources@^1.0.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0: +webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" dependencies: