From fc914fd347c77cfb3e97e7f5569cd7514d58db0b Mon Sep 17 00:00:00 2001 From: hughhhh Date: Sat, 31 Oct 2020 13:33:39 -0700 Subject: [PATCH 001/138] create boiler modal component --- .../src/SqlLab/components/ResultSet.tsx | 4 +++ .../SqlLab/components/SaveDatasetModal.tsx | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index f83aebb8dc0c3..d1a2c40cbdae9 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -34,6 +34,8 @@ import { prepareCopyToClipboardTabularData } from '../../utils/common'; import { CtasEnum } from '../actions/sqlLab'; import { Query } from '../types'; +import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal' + const SEARCH_HEIGHT = 46; const LOADING_STYLES: CSSProperties = { position: 'relative', minHeight: 100 }; @@ -174,6 +176,7 @@ export default class ResultSet extends React.PureComponent< } return (
+
{this.props.visualize && this.props.database && @@ -385,6 +388,7 @@ export default class ResultSet extends React.PureComponent<
{progressBar}
{trackingUrl}
+
); } diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx new file mode 100644 index 0000000000000..2b2784176c9a8 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { FunctionComponent } from 'react'; +import Modal from 'src/common/components/Modal'; + + +export const SaveDatasetModal = ({}) => { + return (
SaveDatasetModal
) +} From bfac037e04453d44af372d9ed524fefbc2680d96 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Sun, 1 Nov 2020 18:52:31 -0800 Subject: [PATCH 002/138] hello world modal --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 1 - .../src/SqlLab/components/SaveDatasetModal.tsx | 10 +++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index d1a2c40cbdae9..2c3e7f5bc57d0 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -388,7 +388,6 @@ export default class ResultSet extends React.PureComponent<
{progressBar}
{trackingUrl}
- ); } diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 2b2784176c9a8..acdb279bcebed 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -20,7 +20,11 @@ import React, { FunctionComponent } from 'react'; import Modal from 'src/common/components/Modal'; - +// eslint-disable-next-line no-empty-pattern export const SaveDatasetModal = ({}) => { - return (
SaveDatasetModal
) -} + return ( + {}} title="Save a new dataset"> +
hello world
+
+ ); +}; From b2a8d6bf7cc5244ce916fe6a9a1cd8f3b41271e1 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 2 Nov 2020 09:16:37 -0800 Subject: [PATCH 003/138] setup modal flow --- superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index acdb279bcebed..b7bd1d39f271b 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -24,7 +24,7 @@ import Modal from 'src/common/components/Modal'; export const SaveDatasetModal = ({}) => { return ( {}} title="Save a new dataset"> -
hello world
+
To explore the results of this query, we need to save it as a virtual dataset
); }; From 04e12163ec2bfee8f7ca272bcffdb67ab9070edb Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 9 Nov 2020 18:37:20 -0800 Subject: [PATCH 004/138] setup savemodal for components --- .../SqlLab/components/SaveDatasetModal.tsx | 43 ++++++++++++++++++- .../components/controls/preset.code-workspace | 10 +++++ 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 superset-frontend/src/explore/components/controls/preset.code-workspace diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index b7bd1d39f271b..708599123201a 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -17,14 +17,53 @@ * under the License. */ -import React, { FunctionComponent } from 'react'; +import React, { useState } from 'react'; +import { Radio, AutoComplete, Input } from 'src/common/components'; import Modal from 'src/common/components/Modal'; +const mockVal = (str, repeat = 1) => { + return { + value: str.repeat(repeat), + }; +}; + // eslint-disable-next-line no-empty-pattern export const SaveDatasetModal = ({}) => { + const [value, setValue] = useState(''); + const [options, setOptions] = useState([]); + + const onSearch = (searchText) => { + setOptions( + !searchText ? [] : [mockVal(searchText), mockVal(searchText, 2), mockVal(searchText, 3)], + ); + }; + + const onSelect = (data) => { + console.log('onSelect', data); + }; + + const onChange = (data) => { + setValue(data); + }; + return ( {}} title="Save a new dataset"> -
To explore the results of this query, we need to save it as a virtual dataset
+
+ To explore the results of this query, we need to save it as a virtual dataset + Save as new dataset + +
+ Overwrite existing dataset + +
); }; diff --git a/superset-frontend/src/explore/components/controls/preset.code-workspace b/superset-frontend/src/explore/components/controls/preset.code-workspace new file mode 100644 index 0000000000000..419b3b4976b55 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/preset.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "../../../../.." + }, + { + "path": "../../../../../../superset-shell" + } + ] +} From 6d2a61b63ac7dd83dd016dc06cf629781612b4e5 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Sat, 14 Nov 2020 17:46:06 -0800 Subject: [PATCH 005/138] flake8 --- .../src/SqlLab/components/ResultSet.tsx | 23 +++++- .../SqlLab/components/SaveDatasetModal.tsx | 73 ++++++++++++++----- 2 files changed, 78 insertions(+), 18 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 2c3e7f5bc57d0..c613a0f113665 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -88,6 +88,7 @@ export default class ResultSet extends React.PureComponent< searchText: '', showExploreResultsButton: false, data: [], + showSaveDatasetModal: false }; this.changeSearch = this.changeSearch.bind(this); @@ -97,6 +98,8 @@ export default class ResultSet extends React.PureComponent< this.toggleExploreResultsButton = this.toggleExploreResultsButton.bind( this, ); + this.handleSaveInDataset = this.handleSaveInDataset.bind(this); + this.handleHideSaveModal = this.handleHideSaveModal.bind(this); } componentDidMount() { @@ -168,15 +171,30 @@ export default class ResultSet extends React.PureComponent< } } + handleSaveInDataset() { + console.log('Saving dataset'); + } + + handleHideSaveModal() { + console.log('hiding the modal'); + this.setState({showSaveDatasetModal: false}) + } + renderControls() { if (this.props.search || this.props.visualize || this.props.csv) { let { data } = this.props.query.results; if (this.props.cache && this.props.query.cached) { ({ data } = this.state); } + + const { showSaveDatasetModal } = this.state; return (
- +
{this.props.visualize && this.props.database && @@ -186,6 +204,9 @@ export default class ResultSet extends React.PureComponent< query={this.props.query} database={this.props.database} actions={this.props.actions} + onClick={() => { + this.setState({showSaveDatasetModal: true}) + }} /> )} {this.props.csv && ( diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 708599123201a..e052e25c80dcc 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -17,9 +17,10 @@ * under the License. */ -import React, { useState } from 'react'; +import React, { useState, FunctionComponent} from 'react'; import { Radio, AutoComplete, Input } from 'src/common/components'; import Modal from 'src/common/components/Modal'; +import Button from 'src/components/Button'; const mockVal = (str, repeat = 1) => { return { @@ -27,10 +28,14 @@ const mockVal = (str, repeat = 1) => { }; }; +interface SaveDatasetModalProps = { +} + // eslint-disable-next-line no-empty-pattern -export const SaveDatasetModal = ({}) => { +export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel}) => { const [value, setValue] = useState(''); const [options, setOptions] = useState([]); + const [radioOption, setRadioOptions] = useState(1); const onSearch = (searchText) => { setOptions( @@ -46,23 +51,57 @@ export const SaveDatasetModal = ({}) => { setValue(data); }; + const onRadioChange = e => { + console.log('radio checked', e.target.value); + setRadioOptions(e.target.value) + }; + + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; + return ( - {}} title="Save a new dataset"> + {}} + title="Save a new dataset" + onCancel={onCancel} + footer={<> + + + } + >
- To explore the results of this query, we need to save it as a virtual dataset - Save as new dataset - -
- Overwrite existing dataset - +
+ To explore the results of this query, we need to save it as a virtual dataset +
+ + + Save as new dataset + + + + Overwrite existing dataset + + +
); From 3170382c5855b08b259e181f25636a8866a5a5d4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 16 Nov 2020 09:33:14 -0800 Subject: [PATCH 006/138] fix onclick reference --- .../components/ExploreResultsButton.jsx | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx index ea52f09bed94c..30b99c7a2a4fc 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx @@ -46,7 +46,7 @@ class ExploreResultsButton extends React.PureComponent { constructor(props) { super(props); this.visualize = this.visualize.bind(this); - this.onClick = this.onClick.bind(this); + // this.onClick = this.onClick.bind(this); this.getInvalidColumns = this.getInvalidColumns.bind(this); this.renderInvalidColumnMessage = this.renderInvalidColumnMessage.bind( this, @@ -54,37 +54,38 @@ class ExploreResultsButton extends React.PureComponent { } onClick() { - const { timeout } = this.props; - const msg = this.renderInvalidColumnMessage(); - if (Math.round(this.getQueryDuration()) > timeout) { - this.dialog.show({ - title: t('Explore'), - body: this.renderTimeoutWarning(), - actions: [ - Dialog.CancelAction(), - Dialog.OKAction(() => { - this.visualize(); - }), - ], - bsSize: 'large', - onHide: dialog => { - dialog.hide(); - }, - }); - } else if (msg) { - this.dialog.show({ - title: t('Explore'), - body: msg, - actions: [Dialog.DefaultAction('Ok', () => {})], - bsSize: 'large', - bsStyle: 'warning', - onHide: dialog => { - dialog.hide(); - }, - }); - } else { - this.visualize(); - } + console.log('in onclick') + // const { timeout } = this.props; + // const msg = this.renderInvalidColumnMessage(); + // if (Math.round(this.getQueryDuration()) > timeout) { + // this.dialog.show({ + // title: t('Explore'), + // body: this.renderTimeoutWarning(), + // actions: [ + // Dialog.CancelAction(), + // Dialog.OKAction(() => { + // this.visualize(); + // }), + // ], + // bsSize: 'large', + // onHide: dialog => { + // dialog.hide(); + // }, + // }); + // } else if (msg) { + // this.dialog.show({ + // title: t('Explore'), + // body: msg, + // actions: [Dialog.DefaultAction('Ok', () => {})], + // bsSize: 'large', + // bsStyle: 'warning', + // onHide: dialog => { + // dialog.hide(); + // }, + // }); + // } else { + // this.visualize(); + // } } getColumns() { @@ -217,7 +218,7 @@ class ExploreResultsButton extends React.PureComponent { <> + + } + {overwriteDataSet && <> + } } > -
+ {!overwriteDataSet &&
To explore the results of this query, we need to save it as a virtual dataset
@@ -98,7 +118,13 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, /> -
+
+ } + {overwriteDataSet && +
+ Are you sure you want to overwrite this dataset? +
+ }
); }; From 398bfee0cabd5e9a13615cb8d40ec8ba6eca45b5 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 13:24:33 -0800 Subject: [PATCH 017/138] hacked overwrite process --- .../src/SqlLab/components/ResultSet.tsx | 42 +++++++++++++++++++ .../SqlLab/components/SaveDatasetModal.tsx | 16 +++---- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 56acb7035d240..02f0bd709b9da 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -94,6 +94,7 @@ export default class ResultSet extends React.PureComponent< userDatasetsOwned: [], saveDatasetRadioBtnState: 1, overwriteDataSet: false, + datasetToOverwrite: {} }; this.changeSearch = this.changeSearch.bind(this); @@ -108,6 +109,8 @@ export default class ResultSet extends React.PureComponent< this.handleDatasetNameChange = this.handleDatasetNameChange.bind(this); this.handleSaveDatasetRadioBtnState = this.handleSaveDatasetRadioBtnState.bind(this); this.handleOverwriteCancel = this.handleOverwriteCancel.bind(this); + this.handleOverwriteDataset = this.handleOverwriteDataset.bind(this); + this.handleOverwriteDatasetOption = this.handleOverwriteDatasetOption.bind(this); } componentDidMount() { @@ -190,6 +193,43 @@ export default class ResultSet extends React.PureComponent< } } + handleOverwriteDatasetOption(data, option) { + console.log(option); + this.setState({ datasetToOverwrite: option }) + } + + handleOverwriteDataset() { + console.log('handle overwrite dataset') + const { sql, results } = this.props.query; + const { datasetToOverwrite } = this.state + console.log(sql) + console.log(results.selected_columns) + console.log(datasetToOverwrite) + + // HACK: to clear the columns in the previous dataset and update + // it with the new selected columns from the query + SupersetClient.put({ + endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + columns: [] + }), + }).then(d => { + console.log(d) + }).catch(err => console.log(err)) + + SupersetClient.put({ + endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + sql, + columns: results.selected_columns.map(d => ({column_name: d.name})) + }), + }).then(d => { + console.log(d) + }).catch(err => console.log(err)) + } + handleSaveInDataset() { console.log('Saving dataset'); console.log(this.state.saveDatasetRadioBtnState) @@ -276,6 +316,8 @@ export default class ResultSet extends React.PureComponent< saveDatasetRadioBtnState={this.state.saveDatasetRadioBtnState} overwriteDataSet={this.state.overwriteDataSet} handleOverwriteCancel={this.handleOverwriteCancel} + handleOverwriteDataset={this.handleOverwriteDataset} + handleOverwriteDatasetOption={this.handleOverwriteDatasetOption} />
{this.props.visualize && diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 4816cacbeaa67..7f9ce1d15784a 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -33,13 +33,14 @@ interface SaveDatasetModalProps = { } // eslint-disable-next-line no-empty-pattern -export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel}) => { +export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption}) => { const [options, setOptions] = useState([]); const [radioOption, setRadioOptions] = useState(1); const onSearch = (searchText) => { + console.log(userDatasetsOwned) setOptions( - !searchText ? [] : userDatasetsOwned.map(d => ({value: d.dataSetName})), + !searchText ? [] : userDatasetsOwned.map(d => ({value: d.dataSetName, dataSetId: d.dataSetId})), ); }; @@ -47,10 +48,6 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, return option.value.includes(inputValue) } - const onSelect = (data) => { - console.log('onSelect', data); - }; - const radioStyle = { display: 'block', height: '30px', @@ -80,7 +77,6 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, buttonStyle="danger" className="m-r-5" onClick={() => { - console.log('go back to original screen') handleOverwriteCancel() }} >Cancel @@ -88,9 +84,7 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, buttonSize="sm" buttonStyle="primary" className="m-r-5" - onClick={() => { - console.log('overwriting dataset') - }} + onClick={handleOverwriteDataset} >Ok } } @@ -111,7 +105,7 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, style={{ width: 200, }} - onSelect={onSelect} + onSelect={handleOverwriteDatasetOption} onSearch={onSearch} placeholder="input here" filterOption={filterAutocompleteOption} From 07e7388487c53fb03e7b63112f96092bc3d0c711 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 13:33:24 -0800 Subject: [PATCH 018/138] linting --- .../src/SqlLab/components/ResultSet.tsx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 02f0bd709b9da..712110765c185 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -199,12 +199,8 @@ export default class ResultSet extends React.PureComponent< } handleOverwriteDataset() { - console.log('handle overwrite dataset') const { sql, results } = this.props.query; const { datasetToOverwrite } = this.state - console.log(sql) - console.log(results.selected_columns) - console.log(datasetToOverwrite) // HACK: to clear the columns in the previous dataset and update // it with the new selected columns from the query @@ -231,16 +227,12 @@ export default class ResultSet extends React.PureComponent< } handleSaveInDataset() { - console.log('Saving dataset'); - console.log(this.state.saveDatasetRadioBtnState) + // if user wants to overwrite a dataset we need to prompt them if (this.state.saveDatasetRadioBtnState === 2) { this.setState({overwriteDataSet: true}) - console.log('make sure user is okay with overwriting') return } - console.log(this.props.query); - console.log(this.props.actions.createDatasource); const { schema, sql, dbId, templateParams } = this.props.query; let selectedColumns; @@ -284,7 +276,7 @@ export default class ResultSet extends React.PureComponent< } handleHideSaveModal() { - this.setState({showSaveDatasetModal: false}) + this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) } handleSaveDatasetRadioBtnState(e) { From 203aa157ad611c2823f764b8f54bfd1e0cef463e Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 13:50:55 -0800 Subject: [PATCH 019/138] fix filter --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 712110765c185..b24d01db34c3a 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -116,10 +116,9 @@ export default class ResultSet extends React.PureComponent< componentDidMount() { // only do this the first time the component is rendered/mounted this.reRunQueryIfSessionTimeoutErrorOnMount(); - + const userId = 3; SupersetClient.get({ - endpoint: - 'api/v1/dataset/?q=(filters:!((col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)', + endpoint: `/api/v1/dataset/?q=(filters:!((col:owners,opr:rel_m_m,value:${userId}),(col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)`, }).then(data => { const userDatasetsOwned = data.json.result.map(r => { return { dataSetName: r.table_name, dataSetId: r.id } @@ -211,7 +210,7 @@ export default class ResultSet extends React.PureComponent< columns: [] }), }).then(d => { - console.log(d) + console.log(d) }).catch(err => console.log(err)) SupersetClient.put({ From f8a34be29e118411893190d13fd71d9ceae4fc4b Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 14:03:52 -0800 Subject: [PATCH 020/138] cleaning up the coe --- .../src/SqlLab/components/ResultSet.tsx | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index b24d01db34c3a..24a28d59d6b35 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -116,16 +116,18 @@ export default class ResultSet extends React.PureComponent< componentDidMount() { // only do this the first time the component is rendered/mounted this.reRunQueryIfSessionTimeoutErrorOnMount(); + + // Todo: figure out how to get user information to properly query datasets they own + // Todo: move this to actions file const userId = 3; SupersetClient.get({ endpoint: `/api/v1/dataset/?q=(filters:!((col:owners,opr:rel_m_m,value:${userId}),(col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)`, - }).then(data => { - const userDatasetsOwned = data.json.result.map(r => { - return { dataSetName: r.table_name, dataSetId: r.id } - }) - this.setState({userDatasetsOwned}) + }).then(data => { + const userDatasetsOwned = data.json.result.map(r => { + return { dataSetName: r.table_name, dataSetId: r.id }; + }); + this.setState({ userDatasetsOwned }) }); - } UNSAFE_componentWillReceiveProps(nextProps: ResultSetProps) { @@ -193,7 +195,6 @@ export default class ResultSet extends React.PureComponent< } handleOverwriteDatasetOption(data, option) { - console.log(option); this.setState({ datasetToOverwrite: option }) } @@ -203,15 +204,18 @@ export default class ResultSet extends React.PureComponent< // HACK: to clear the columns in the previous dataset and update // it with the new selected columns from the query + // Todo: move this to actions file SupersetClient.put({ endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - columns: [] + columns: [], }), - }).then(d => { - console.log(d) - }).catch(err => console.log(err)) + }) + .then(d => { + console.log(d); + }) + .catch(err => console.log(err)); SupersetClient.put({ endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, @@ -221,20 +225,21 @@ export default class ResultSet extends React.PureComponent< columns: results.selected_columns.map(d => ({column_name: d.name})) }), }).then(d => { - console.log(d) - }).catch(err => console.log(err)) + console.log(d); + }) + .catch(err => console.log(err)); } handleSaveInDataset() { // if user wants to overwrite a dataset we need to prompt them if (this.state.saveDatasetRadioBtnState === 2) { this.setState({overwriteDataSet: true}) - return + return; } const { schema, sql, dbId, templateParams } = this.props.query; - let selectedColumns; + let selectedColumns: any[]; if ( this.props.query && this.props.query.results && @@ -253,8 +258,8 @@ export default class ResultSet extends React.PureComponent< templateParams, datasourceName: this.state.newSaveDatasetName, columns: selectedColumns, - }).then(data => { - console.log('Create datasource successfully'); + }) + .then((data: { table_id: any }) => { exploreChart({ datasource: `${data.table_id}__table`, metrics: [], @@ -263,8 +268,8 @@ export default class ResultSet extends React.PureComponent< viz_type: 'table', all_columns: selectedColumns.map(c => c.name), row_limit: 1000, - }) - }).catch(error => { + }); + }).catch((error: any) => { console.log('an error occurred trying to create a datasource'); console.log(error); }); @@ -294,7 +299,6 @@ export default class ResultSet extends React.PureComponent< } const { showSaveDatasetModal } = this.state; - console.log(this.state.overwriteDataSet) return (
Date: Thu, 19 Nov 2020 14:09:17 -0800 Subject: [PATCH 021/138] Delete preset.code-workspace --- .../explore/components/controls/preset.code-workspace | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 superset-frontend/src/explore/components/controls/preset.code-workspace diff --git a/superset-frontend/src/explore/components/controls/preset.code-workspace b/superset-frontend/src/explore/components/controls/preset.code-workspace deleted file mode 100644 index 419b3b4976b55..0000000000000 --- a/superset-frontend/src/explore/components/controls/preset.code-workspace +++ /dev/null @@ -1,10 +0,0 @@ -{ - "folders": [ - { - "path": "../../../../.." - }, - { - "path": "../../../../../../superset-shell" - } - ] -} From 482353f02420d5fc5a3baeacc56bf6dc4869dabc Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 14:11:41 -0800 Subject: [PATCH 022/138] remove unused code --- .../components/ExploreResultsButton.jsx | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx index cf9a8192e82de..6663b0e5926fe 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx @@ -46,48 +46,12 @@ class ExploreResultsButton extends React.PureComponent { constructor(props) { super(props); this.visualize = this.visualize.bind(this); - // this.onClick = this.onClick.bind(this); this.getInvalidColumns = this.getInvalidColumns.bind(this); this.renderInvalidColumnMessage = this.renderInvalidColumnMessage.bind( this, ); } - onClick() { - console.log('in onclick') - // const { timeout } = this.props; - // const msg = this.renderInvalidColumnMessage(); - // if (Math.round(this.getQueryDuration()) > timeout) { - // this.dialog.show({ - // title: t('Explore'), - // body: this.renderTimeoutWarning(), - // actions: [ - // Dialog.CancelAction(), - // Dialog.OKAction(() => { - // this.visualize(); - // }), - // ], - // bsSize: 'large', - // onHide: dialog => { - // dialog.hide(); - // }, - // }); - // } else if (msg) { - // this.dialog.show({ - // title: t('Explore'), - // body: msg, - // actions: [Dialog.DefaultAction('Ok', () => {})], - // bsSize: 'large', - // bsStyle: 'warning', - // onHide: dialog => { - // dialog.hide(); - // }, - // }); - // } else { - // this.visualize(); - // } - } - getColumns() { const { props } = this; if ( From cc5dfff82935a9b1fc3186239c1db148c3d6ba64 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 14:12:48 -0800 Subject: [PATCH 023/138] remove visualize --- .../components/ExploreResultsButton.jsx | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx index 6663b0e5926fe..fa724273da1ad 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx @@ -45,7 +45,6 @@ const defaultProps = { class ExploreResultsButton extends React.PureComponent { constructor(props) { super(props); - this.visualize = this.visualize.bind(this); this.getInvalidColumns = this.getInvalidColumns.bind(this); this.renderInvalidColumnMessage = this.renderInvalidColumnMessage.bind( this, @@ -102,35 +101,6 @@ class ExploreResultsButton extends React.PureComponent { }; } - visualize() { - this.props.actions - .createDatasource(this.buildVizOptions()) - .then(data => { - const columns = this.getColumns(); - const formData = { - datasource: `${data.table_id}__table`, - metrics: [], - groupby: [], - time_range: 'No filter', - viz_type: 'table', - all_columns: columns.map(c => c.name), - row_limit: 1000, - }; - - this.props.actions.addInfoToast( - t('Creating a data source and creating a new tab'), - ); - - // open new window for data visualization - exploreChart(formData); - }) - .catch(() => { - this.props.actions.addDangerToast( - this.props.errorMessage || t('An error occurred'), - ); - }); - } - renderTimeoutWarning() { return ( From 616480beb2f06c8e6e92aeec5297cbcf1f49fcf8 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 14:37:55 -0800 Subject: [PATCH 024/138] update default value --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 4 ++++ superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 24a28d59d6b35..6428152bc80c8 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -299,6 +299,9 @@ export default class ResultSet extends React.PureComponent< } const { showSaveDatasetModal } = this.state; + + console.log(this.props) + return (
{this.props.visualize && diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 7f9ce1d15784a..21982c0352566 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -33,7 +33,7 @@ interface SaveDatasetModalProps = { } // eslint-disable-next-line no-empty-pattern -export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption}) => { +export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption, defaultCreateDatasetValue}) => { const [options, setOptions] = useState([]); const [radioOption, setRadioOptions] = useState(1); @@ -96,7 +96,7 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, Save as new dataset - + Overwrite existing dataset From c6f17dc80788fe3a96904042a8145cb01f8e22c3 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 17:04:14 -0800 Subject: [PATCH 025/138] remove unneeded vars --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 3 --- .../src/SqlLab/components/SaveDatasetModal.tsx | 6 ------ 2 files changed, 9 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 6428152bc80c8..a358a17accc86 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -299,9 +299,6 @@ export default class ResultSet extends React.PureComponent< } const { showSaveDatasetModal } = this.state; - - console.log(this.props) - return (
{ - return { - value: str.repeat(repeat), - }; -}; - interface SaveDatasetModalProps = { } From 251b82909bb3ee9fa5ef4875af18b42762f60c96 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 17:05:20 -0800 Subject: [PATCH 026/138] checkout package-lock.json --- superset-frontend/package-lock.json | 114 ++++++++++++++-------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index c437e3cb46358..ea758d431db26 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -21829,28 +21829,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -21861,14 +21861,14 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, @@ -21879,35 +21879,35 @@ }, "code-point-at": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "optional": true, @@ -21917,35 +21917,35 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs.realpath": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -21962,7 +21962,7 @@ }, "glob": { "version": "7.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, @@ -21977,14 +21977,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -21994,7 +21994,7 @@ }, "ignore-walk": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, @@ -22004,7 +22004,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -22015,21 +22015,21 @@ }, "inherits": { "version": "2.0.3", - "resolved": "", + "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, @@ -22039,14 +22039,14 @@ }, "isarray": { "version": "1.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, @@ -22063,14 +22063,14 @@ }, "ms": { "version": "2.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, "optional": true }, "needle": { "version": "2.3.0", - "resolved": "", + "resolved": false, "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "dev": true, "optional": true, @@ -22082,7 +22082,7 @@ }, "node-pre-gyp": { "version": "0.12.0", - "resolved": "", + "resolved": false, "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "dev": true, "optional": true, @@ -22101,7 +22101,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, @@ -22112,14 +22112,14 @@ }, "npm-bundled": { "version": "1.0.6", - "resolved": "", + "resolved": false, "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.1", - "resolved": "", + "resolved": false, "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "dev": true, "optional": true, @@ -22130,7 +22130,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -22143,21 +22143,21 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, @@ -22167,21 +22167,21 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -22192,21 +22192,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -22219,7 +22219,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "", + "resolved": false, "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, @@ -22235,7 +22235,7 @@ }, "rimraf": { "version": "2.6.3", - "resolved": "", + "resolved": false, "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "optional": true, @@ -22245,49 +22245,49 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.0", - "resolved": "", + "resolved": false, "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, @@ -22299,7 +22299,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -22309,7 +22309,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, @@ -22319,21 +22319,21 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "util-deprecate": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -22343,7 +22343,7 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true From 14b2a71b05c282107bddfd2cfbc6d0d83539e503 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 17:45:26 -0800 Subject: [PATCH 027/138] linting --- superset/views/core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/superset/views/core.py b/superset/views/core.py index fbfac7cb944e2..e12e50c248cce 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -2729,6 +2729,8 @@ def sqllab(self) -> FlaskResponse: payload["requested_query"] = json.loads(form_data) except json.JSONDecodeError: pass + + payload["user"] = bootstrap_user_data(g.user) bootstrap_data = json.dumps( payload, default=utils.pessimistic_json_iso_dttm_ser ) From 2c99c7f4ad73342b7fbec8c04c91f7eb3c729091 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 18:30:50 -0800 Subject: [PATCH 028/138] get user id --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 9 ++++++--- superset-frontend/src/SqlLab/reducers/getInitialState.js | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index a358a17accc86..d03297831105f 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -94,7 +94,7 @@ export default class ResultSet extends React.PureComponent< userDatasetsOwned: [], saveDatasetRadioBtnState: 1, overwriteDataSet: false, - datasetToOverwrite: {} + datasetToOverwrite: {}, }; this.changeSearch = this.changeSearch.bind(this); @@ -117,11 +117,14 @@ export default class ResultSet extends React.PureComponent< // only do this the first time the component is rendered/mounted this.reRunQueryIfSessionTimeoutErrorOnMount(); + // Hack: waiting for talks with tai to pull data out of the initial state + const appContainer = document.getElementById('app'); + const bootstrapData = JSON.parse(appContainer.getAttribute('data-bootstrap')); + // Todo: figure out how to get user information to properly query datasets they own // Todo: move this to actions file - const userId = 3; SupersetClient.get({ - endpoint: `/api/v1/dataset/?q=(filters:!((col:owners,opr:rel_m_m,value:${userId}),(col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)`, + endpoint: `/api/v1/dataset/?q=(filters:!((col:owners,opr:rel_m_m,value:${bootstrapData.user.userId}),(col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)`, }).then(data => { const userDatasetsOwned = data.json.result.map(r => { return { dataSetName: r.table_name, dataSetId: r.id }; diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.js b/superset-frontend/src/SqlLab/reducers/getInitialState.js index 14efdeef912a8..831df3ba3a7d2 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.js +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.js @@ -27,6 +27,7 @@ export default function getInitialState({ databases, queries: queries_, requested_query: requestedQuery, + user, }) { /** * Before YYYY-MM-DD, the state for SQL Lab was stored exclusively in the @@ -190,5 +191,6 @@ export default function getInitialState({ flash_messages: common.flash_messages, conf: common.conf, }, + user, }; } From c02a8181344744a76b1eda6776dcecf3e1fde5b9 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 19 Nov 2020 18:32:42 -0800 Subject: [PATCH 029/138] remove page filter --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index d03297831105f..f8c87cac76d38 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -124,7 +124,7 @@ export default class ResultSet extends React.PureComponent< // Todo: figure out how to get user information to properly query datasets they own // Todo: move this to actions file SupersetClient.get({ - endpoint: `/api/v1/dataset/?q=(filters:!((col:owners,opr:rel_m_m,value:${bootstrapData.user.userId}),(col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)`, + endpoint: `/api/v1/dataset/?q=(filters:!((col:owners,opr:rel_m_m,value:${bootstrapData.user.userId}),(col:table_name,opr:ct,value:%27%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0)`, }).then(data => { const userDatasetsOwned = data.json.result.map(r => { return { dataSetName: r.table_name, dataSetId: r.id }; From 4ad9bee75e75c5d537f0def86f2464337ce949ac Mon Sep 17 00:00:00 2001 From: hughhhh Date: Fri, 20 Nov 2020 13:45:13 -0800 Subject: [PATCH 030/138] setup proper call for updating columns in dataset --- .../src/SqlLab/components/ResultSet.tsx | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index f8c87cac76d38..d96aaa1aeb75d 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -205,32 +205,26 @@ export default class ResultSet extends React.PureComponent< const { sql, results } = this.props.query; const { datasetToOverwrite } = this.state - // HACK: to clear the columns in the previous dataset and update - // it with the new selected columns from the query - // Todo: move this to actions file - SupersetClient.put({ - endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - columns: [], - }), - }) - .then(d => { - console.log(d); - }) - .catch(err => console.log(err)); - SupersetClient.put({ endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql, columns: results.selected_columns.map(d => ({column_name: d.name})) + //columns: [] }), }).then(d => { console.log(d); }) .catch(err => console.log(err)); + + // sync columns for dataset + // SupersetClient.get({ + // endpoint: `/datasource/external_metadata/table/${datasetToOverwrite.dataSetId}`, + // headers: { 'Content-Type': 'application/json' }, + // }).then(d => { + // console.log(d); + // }).catch(err => console.log(err)); } handleSaveInDataset() { From 98fa585039b7414ba22d5c0f6358e1409b6767a6 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Fri, 20 Nov 2020 13:49:30 -0800 Subject: [PATCH 031/138] add move to explore flow --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index d96aaa1aeb75d..1ab14b113ae99 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -215,9 +215,20 @@ export default class ResultSet extends React.PureComponent< }), }).then(d => { console.log(d); + exploreChart({ + datasource: `${datasetToOverwrite.dataSetId}__table`, + metrics: [], + groupby: [], + time_range: 'No filter', + viz_type: 'table', + all_columns: results.selected_columns.map(d => d.name) // selectedColumns.map(c => c.name), + row_limit: 1000, + }); }) .catch(err => console.log(err)); + this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) + // sync columns for dataset // SupersetClient.get({ // endpoint: `/datasource/external_metadata/table/${datasetToOverwrite.dataSetId}`, From 2a8cca1c8bf656d102d4194757e9fde9c6741dc9 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Fri, 20 Nov 2020 15:03:25 -0800 Subject: [PATCH 032/138] linting --- superset/datasets/api.py | 13 ++++++++++- superset/datasets/commands/update.py | 33 +++++++++++++++++++--------- superset/datasets/dao.py | 15 +++++++++++-- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/superset/datasets/api.py b/superset/datasets/api.py index 1decc707ac032..a2f10f92c038a 100644 --- a/superset/datasets/api.py +++ b/superset/datasets/api.py @@ -248,6 +248,10 @@ def put(self, pk: int) -> Response: schema: type: integer name: pk + - in: path + schema: + type: bool + name: override_column requestBody: description: Dataset schema required: true @@ -280,6 +284,11 @@ def put(self, pk: int) -> Response: 500: $ref: '#/components/responses/500' """ + override_column = ( + request.args["override_column"] + if request.args.get("override_column") + else False + ) if not request.is_json: return self.response_400(message="Request is not JSON") try: @@ -288,7 +297,9 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - changed_model = UpdateDatasetCommand(g.user, pk, item).run() + changed_model = UpdateDatasetCommand( + g.user, pk, item, override_column + ).run() response = self.response(200, id=changed_model.id, result=item) except DatasetNotFoundError: response = self.response_404() diff --git a/superset/datasets/commands/update.py b/superset/datasets/commands/update.py index dfc3986c09f22..809720ed6ab39 100644 --- a/superset/datasets/commands/update.py +++ b/superset/datasets/commands/update.py @@ -16,7 +16,7 @@ # under the License. import logging from collections import Counter -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Union from flask_appbuilder.models.sqla import Model from flask_appbuilder.security.sqla.models import User @@ -48,17 +48,28 @@ class UpdateDatasetCommand(BaseCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): + def __init__( + self, + user: User, + model_id: int, + data: Dict[str, Any], + override_columns: Union[bool, Any, None] = False, + ): self._actor = user self._model_id = model_id self._properties = data.copy() self._model: Optional[SqlaTable] = None + self.override_columns = override_columns def run(self) -> Model: self.validate() if self._model: try: - dataset = DatasetDAO.update(self._model, self._properties) + dataset = DatasetDAO.update( + self._model, + self._properties, + override_columns=self.override_columns, + ) return dataset except DAOUpdateFailedError as ex: logger.exception(ex.exception) @@ -123,14 +134,16 @@ def _validate_columns( ] if not DatasetDAO.validate_columns_exist(self._model_id, columns_ids): exceptions.append(DatasetColumnNotFoundValidationError()) + # validate new column names uniqueness - columns_names: List[str] = [ - column["column_name"] for column in columns if "id" not in column - ] - if not DatasetDAO.validate_columns_uniqueness( - self._model_id, columns_names - ): - exceptions.append(DatasetColumnsExistsValidationError()) + if not self.override_columns: + columns_names: List[str] = [ + column["column_name"] for column in columns if "id" not in column + ] + if not DatasetDAO.validate_columns_uniqueness( + self._model_id, columns_names + ): + exceptions.append(DatasetColumnsExistsValidationError()) def _validate_metrics( self, metrics: List[Dict[str, Any]], exceptions: List[ValidationError] diff --git a/superset/datasets/dao.py b/superset/datasets/dao.py index 3b905f450cd0f..22526e92079bf 100644 --- a/superset/datasets/dao.py +++ b/superset/datasets/dao.py @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. import logging -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Union from flask import current_app from sqlalchemy.exc import SQLAlchemyError @@ -144,7 +144,11 @@ def validate_metrics_uniqueness(dataset_id: int, metrics_names: List[str]) -> bo @classmethod def update( - cls, model: SqlaTable, properties: Dict[str, Any], commit: bool = True + cls, + model: SqlaTable, + properties: Dict[str, Any], + commit: bool = True, + override_columns: Union[bool, Any, None] = False, ) -> Optional[SqlaTable]: """ Updates a Dataset model on the metadata DB @@ -175,6 +179,13 @@ def update( new_metrics.append(metric_obj) properties["metrics"] = new_metrics + if override_columns: + # remove columns initially for full refresh + original_properties = properties["columns"] + properties["columns"] = [] + super().update(model, properties, commit=commit) + properties["columns"] = original_properties + return super().update(model, properties, commit=commit) @classmethod From ef9693953e6da38816a18584830670a0e25064b6 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 09:57:27 -0800 Subject: [PATCH 033/138] add param for overriding columns --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 1ab14b113ae99..fe5870bf5a5ac 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -206,7 +206,7 @@ export default class ResultSet extends React.PureComponent< const { datasetToOverwrite } = this.state SupersetClient.put({ - endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}`, + endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}?override_column=true`, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql, From 140227c60e628dfc7b76ca01366a21aa218c7ee4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 11:59:40 -0800 Subject: [PATCH 034/138] linting --- .../SqlLab/components/SaveDatasetModal.tsx | 158 ++++++++++-------- 1 file changed, 87 insertions(+), 71 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 3ae83181259ce..8caed25190e62 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -19,17 +19,38 @@ import React, { useState, FunctionComponent} from 'react'; import { Radio, AutoComplete, Input } from 'src/common/components'; -import Modal from 'src/common/components/Modal'; +import StyledModal from 'src/common/components/Modal'; import Button from 'src/components/Button'; -import { SupersetClient } from '@superset-ui/core'; +import { styled } from '@superset-ui/core'; interface SaveDatasetModalProps = { } +const Styles = styled.div` + .smd-input { + margin-left: 45px; + width: 290px; + } + .smd-autocomplete { + margin-left: 8px; + width: 290px; + } + .smd-radio { + display: block; + height: 30px; + margin: 10px 0px; + line-height: 30px; + } + .smd-body { + display: flex; + flex-direction: column; + align-items: center; + } +`; + // eslint-disable-next-line no-empty-pattern export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption, defaultCreateDatasetValue}) => { const [options, setOptions] = useState([]); - const [radioOption, setRadioOptions] = useState(1); const onSearch = (searchText) => { console.log(userDatasetsOwned) @@ -42,77 +63,72 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, return option.value.includes(inputValue) } - const radioStyle = { - display: 'block', - height: '30px', - lineHeight: '30px', - }; return ( - {}} - title="Save a new dataset" - onCancel={onCancel} - footer={ - <> - {!overwriteDataSet && - - } - {overwriteDataSet && <> - } - - } - > - {!overwriteDataSet &&
-
- To explore the results of this query, we need to save it as a virtual dataset -
- - - Save as new dataset - - - - Overwrite existing dataset - {}} + title="Save a new dataset" + onCancel={onCancel} + footer={ + <> + {!overwriteDataSet && + + } + {overwriteDataSet && <>
- } - {overwriteDataSet && -
- Are you sure you want to overwrite this dataset? -
+ >Cancel + } + } -
+ > + + {!overwriteDataSet &&
+
+ To explore the results of this query, we need to save it as a virtual dataset +
+ + + Save as new dataset + + + + Overwrite existing dataset + + + +
+ } + {overwriteDataSet && +
+ Are you sure you want to overwrite this dataset? +
+ } +
+ ); }; From 56d4648d2bcca84376b253adf60ebfa2e867da32 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 14:53:44 -0800 Subject: [PATCH 035/138] change title --- superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 8caed25190e62..d0940807a9aa0 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -68,7 +68,7 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, {}} - title="Save a new dataset" + title="Save or Overwrite Datasets" onCancel={onCancel} footer={ <> From acb255a4673712b156f29fea74b0ee71dcfc600b Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 15:28:53 -0800 Subject: [PATCH 036/138] fix some tings --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 5 +++-- .../src/SqlLab/components/SaveDatasetModal.tsx | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index fe5870bf5a5ac..af3d071049fda 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -306,7 +306,8 @@ export default class ResultSet extends React.PureComponent< ({ data } = this.state); } - const { showSaveDatasetModal } = this.state; + const defaultCreateDatasetValue = `${this.props.query.tab} ${new Date().toLocaleString().replace(',', '')}` + return (
{this.props.visualize && diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index d0940807a9aa0..1fd5bad4b4cad 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -68,7 +68,7 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, {}} - title="Save or Overwrite Datasets" + title="Save or Overwrite Dataset" onCancel={onCancel} footer={ <> @@ -102,21 +102,21 @@ export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, {!overwriteDataSet &&
- To explore the results of this query, we need to save it as a virtual dataset + Save this query as virtual dataset to continue exploring.
- Save as new dataset + Save as new - Overwrite existing dataset + Overwrite existing From 546dd2a5444ca837ef7d99ef06ee2d93fe2d5815 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 16:06:39 -0800 Subject: [PATCH 037/138] cleanup --- .../src/SqlLab/components/ResultSet.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index af3d071049fda..bc14f609e1962 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -211,10 +211,8 @@ export default class ResultSet extends React.PureComponent< body: JSON.stringify({ sql, columns: results.selected_columns.map(d => ({column_name: d.name})) - //columns: [] }), }).then(d => { - console.log(d); exploreChart({ datasource: `${datasetToOverwrite.dataSetId}__table`, metrics: [], @@ -225,17 +223,9 @@ export default class ResultSet extends React.PureComponent< row_limit: 1000, }); }) - .catch(err => console.log(err)); + .catch(err => alert(err)); this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) - - // sync columns for dataset - // SupersetClient.get({ - // endpoint: `/datasource/external_metadata/table/${datasetToOverwrite.dataSetId}`, - // headers: { 'Content-Type': 'application/json' }, - // }).then(d => { - // console.log(d); - // }).catch(err => console.log(err)); } handleSaveInDataset() { From c1a2615386a01c8d8eeb17298c4d9ce1d6bb1a00 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 16:22:48 -0800 Subject: [PATCH 038/138] linting --- .../src/SqlLab/components/ResultSet.tsx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index bc14f609e1962..5fc3873b16f7d 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -129,7 +129,7 @@ export default class ResultSet extends React.PureComponent< const userDatasetsOwned = data.json.result.map(r => { return { dataSetName: r.table_name, dataSetId: r.id }; }); - this.setState({ userDatasetsOwned }) + this.setState({ userDatasetsOwned }); }); } @@ -203,7 +203,7 @@ export default class ResultSet extends React.PureComponent< handleOverwriteDataset() { const { sql, results } = this.props.query; - const { datasetToOverwrite } = this.state + const { datasetToOverwrite } = this.state; SupersetClient.put({ endpoint: `api/v1/dataset/${datasetToOverwrite.dataSetId}?override_column=true`, @@ -219,13 +219,13 @@ export default class ResultSet extends React.PureComponent< groupby: [], time_range: 'No filter', viz_type: 'table', - all_columns: results.selected_columns.map(d => d.name) // selectedColumns.map(c => c.name), + all_columns: results.selected_columns.map(d => d.name), row_limit: 1000, }); }) .catch(err => alert(err)); - this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) + this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) } handleSaveInDataset() { @@ -273,16 +273,16 @@ export default class ResultSet extends React.PureComponent< }); } - handleDatasetNameChange(e) { - this.setState({ newSaveDatasetName: e.target.value }) + handleDatasetNameChange(e: { target: { value: any } }) { + this.setState({ newSaveDatasetName: e.target.value }); } handleHideSaveModal() { this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) } - handleSaveDatasetRadioBtnState(e) { - this.setState({saveDatasetRadioBtnState: e.target.value}); + handleSaveDatasetRadioBtnState(e: { target: { value: any } }) { + this.setState({ saveDatasetRadioBtnState: e.target.value }); } handleOverwriteCancel() { @@ -296,7 +296,9 @@ export default class ResultSet extends React.PureComponent< ({ data } = this.state); } - const defaultCreateDatasetValue = `${this.props.query.tab} ${new Date().toLocaleString().replace(',', '')}` + const defaultCreateDatasetValue = `${ + this.props.query.tab + } ${new Date().toLocaleString().replace(',', '')}`; return (
From 9991c602b8857ea91846bdfd0f4e41ef215596d6 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 17:00:23 -0800 Subject: [PATCH 039/138] add types in some places --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 8 +++++++- .../src/SqlLab/components/SaveDatasetModal.tsx | 7 +++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 5fc3873b16f7d..d759a580c94dd 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -58,6 +58,12 @@ interface ResultSetState { searchText: string; showExploreResultsButton: boolean; data: Record[]; + showSaveDatasetModal: boolean; + newSaveDatasetName: string; + userDatasetsOwned: []; + saveDatasetRadioBtnState: number; + overwriteDataSet: boolean; + datasetToOverwrite: Record; } // Making text render line breaks/tabs as is as monospace, @@ -303,7 +309,7 @@ export default class ResultSet extends React.PureComponent< return (
= ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption, defaultCreateDatasetValue}) => { const [options, setOptions] = useState([]); - const onSearch = (searchText) => { - console.log(userDatasetsOwned) + const onSearch = (searchText: any) => { setOptions( - !searchText ? [] : userDatasetsOwned.map(d => ({value: d.dataSetName, dataSetId: d.dataSetId})), + !searchText ? [] : userDatasetsOwned.map((d: { dataSetName: any; dataSetId: any; }) => ({value: d.dataSetName, dataSetId: d.dataSetId})), ); }; - const filterAutocompleteOption = (inputValue, option) => { + const filterAutocompleteOption = (inputValue: any, option: { value: string | any[]; }) => { return option.value.includes(inputValue) } From a09f9c45d214930f63a3a6da8353a1c4b54b1485 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 19:16:41 -0800 Subject: [PATCH 040/138] save toast --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index d759a580c94dd..60ddc59f50be7 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -273,9 +273,11 @@ export default class ResultSet extends React.PureComponent< all_columns: selectedColumns.map(c => c.name), row_limit: 1000, }); - }).catch((error: any) => { - console.log('an error occurred trying to create a datasource'); - console.log(error); + }) + .catch((error: any) => { + this.props.actions.addDangerToast( + t('An error occurred saving dataset'), + ); }); } From 80179cbca668e868632b3c248f3f8805ac5d04f4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 23 Nov 2020 20:11:53 -0800 Subject: [PATCH 041/138] use moment --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 60ddc59f50be7..c586b4530d133 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -18,6 +18,7 @@ */ import React, { CSSProperties } from 'react'; import { Alert, ButtonGroup, ProgressBar } from 'react-bootstrap'; +import moment from 'moment'; import Button from 'src/components/Button'; import shortid from 'shortid'; import { styled, t, SupersetClient} from '@superset-ui/core'; @@ -306,7 +307,7 @@ export default class ResultSet extends React.PureComponent< const defaultCreateDatasetValue = `${ this.props.query.tab - } ${new Date().toLocaleString().replace(',', '')}`; + } ${moment().format('MM/DD/YYYY HH:mm:ss')}`; return (
From fb317937fd4d52b2d9749262956b72039615fa71 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 11:27:55 -0800 Subject: [PATCH 042/138] add error toast --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index c586b4530d133..5cafdb36dc9f8 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -230,7 +230,11 @@ export default class ResultSet extends React.PureComponent< row_limit: 1000, }); }) - .catch(err => alert(err)); + .catch(() => { + this.props.actions.addDangerToast( + t('An error occurred overwriting dataset'), + ); + }); this.setState({showSaveDatasetModal: false, overwriteDataSet: false}) } @@ -275,7 +279,7 @@ export default class ResultSet extends React.PureComponent< row_limit: 1000, }); }) - .catch((error: any) => { + .catch(() => { this.props.actions.addDangerToast( t('An error occurred saving dataset'), ); From fdd06e52f7dac015aeb43d29148d3320bdfc2851 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 11:37:10 -0800 Subject: [PATCH 043/138] create enum for radio states --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 5cafdb36dc9f8..012738a172788 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -40,6 +40,9 @@ import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal' const SEARCH_HEIGHT = 46; +const SAVE_NEW_DATASET_RADIO_STATE = 1; +const OVERWRITE_DATASET_RADIO_STATE = 2; + const LOADING_STYLES: CSSProperties = { position: 'relative', minHeight: 100 }; interface ResultSetProps { @@ -99,7 +102,7 @@ export default class ResultSet extends React.PureComponent< showSaveDatasetModal: false, newSaveDatasetName: '', userDatasetsOwned: [], - saveDatasetRadioBtnState: 1, + saveDatasetRadioBtnState: SAVE_NEW_DATASET_RADIO_STATE, overwriteDataSet: false, datasetToOverwrite: {}, }; @@ -241,8 +244,8 @@ export default class ResultSet extends React.PureComponent< handleSaveInDataset() { // if user wants to overwrite a dataset we need to prompt them - if (this.state.saveDatasetRadioBtnState === 2) { - this.setState({overwriteDataSet: true}) + if (this.state.saveDatasetRadioBtnState === OVERWRITE_DATASET_RADIO_STATE) { + this.setState({ overwriteDataSet: true }); return; } From a3e4cc7f806ce5469b7915deb2434e20a1b60f24 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 11:51:26 -0800 Subject: [PATCH 044/138] initial state for saving query --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 10 ++++------ .../src/SqlLab/components/SaveDatasetModal.tsx | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 012738a172788..259a73fea2f04 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -100,7 +100,9 @@ export default class ResultSet extends React.PureComponent< showExploreResultsButton: false, data: [], showSaveDatasetModal: false, - newSaveDatasetName: '', + newSaveDatasetName: `${props.query.tab} ${moment().format( + 'MM/DD/YYYY HH:mm:ss', + )}`, userDatasetsOwned: [], saveDatasetRadioBtnState: SAVE_NEW_DATASET_RADIO_STATE, overwriteDataSet: false, @@ -312,10 +314,6 @@ export default class ResultSet extends React.PureComponent< ({ data } = this.state); } - const defaultCreateDatasetValue = `${ - this.props.query.tab - } ${moment().format('MM/DD/YYYY HH:mm:ss')}`; - return (
{this.props.visualize && diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 993a61cfafde6..06a182d998a9b 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -49,7 +49,7 @@ const Styles = styled.div` `; // eslint-disable-next-line no-empty-pattern -export const SaveDatasetModal: FunctionComponent<> = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption, defaultCreateDatasetValue}) => { +export const SaveDatasetModal: FunctionComponent = ({visible, onOk, onCancel, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, overwriteDataSet, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption, defaultCreateDatasetValue}) => { const [options, setOptions] = useState([]); const onSearch = (searchText: any) => { From a7228bfee95b05597422adefa2ab00ab2c853d27 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 11:53:54 -0800 Subject: [PATCH 045/138] add tpying --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 259a73fea2f04..074da99337a54 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -273,7 +273,7 @@ export default class ResultSet extends React.PureComponent< datasourceName: this.state.newSaveDatasetName, columns: selectedColumns, }) - .then((data: { table_id: any }) => { + .then((data: { table_id: number }) => { exploreChart({ datasource: `${data.table_id}__table`, metrics: [], From 0b1acfd5d20c5e4dbd0777c5a620e7fc76637eb8 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 11:56:40 -0800 Subject: [PATCH 046/138] addressing concerns --- .../src/SqlLab/components/ResultSet.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 074da99337a54..35c329c38531e 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -252,17 +252,7 @@ export default class ResultSet extends React.PureComponent< } const { schema, sql, dbId, templateParams } = this.props.query; - - let selectedColumns: any[]; - if ( - this.props.query && - this.props.query.results && - this.props.query.results.selected_columns - ) { - selectedColumns = this.props.query.results.selected_columns; - } else { - selectedColumns = [] - } + const selectedColumns = this.props.query?.results?.selected_columns || []; this.props.actions .createDatasource({ From 3f9c417998c11fda1ce79e19f190508004b181fc Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 11:57:46 -0800 Subject: [PATCH 047/138] update propTypes --- superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx index fa724273da1ad..192687774266d 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx @@ -37,6 +37,7 @@ const propTypes = { errorMessage: PropTypes.string, timeout: PropTypes.number, database: PropTypes.object.isRequired, + onClick: PropTypes.func.isRequired, }; const defaultProps = { query: {}, From 02f4da799a5bde5d10490c610b7f6f9b3abcc8bb Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 12:13:14 -0800 Subject: [PATCH 048/138] add functionality for CTAS explor btn --- .../src/SqlLab/components/ResultSet.tsx | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 35c329c38531e..9ecf28e71faa7 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -281,6 +281,43 @@ export default class ResultSet extends React.PureComponent< }); } + handleCTASSaveInDataset() { + // if user wants to overwrite a dataset we need to prompt them + if (this.state.saveDatasetRadioBtnState === OVERWRITE_DATASET_RADIO_STATE) { + this.setState({ overwriteDataSet: true }); + return; + } + + const { schema, sql, dbId, templateParams } = this.props.query; + this.props.actions + .createCtasDatasource({ + schema, + dbId, + templateParams, + datasourceName: this.state.newSaveDatasetName, + }) + .then((data: { table_id: number }) => { + const formData = { + datasource: `${data.table_id}__table`, + metrics: ['count'], + groupby: [], + viz_type: 'table', + since: '100 years ago', + all_columns: [], + row_limit: 1000, + }; + this.props.actions.addInfoToast( + t('Creating a data source and creating a new tab'), + ); + + // open new window for data visualization + exploreChart(formData); + }) + .catch(() => { + this.props.actions.addDangerToast(t('An error occurred')); + }); + } + handleDatasetNameChange(e: { target: { value: any } }) { this.setState({ newSaveDatasetName: e.target.value }); } From 9b1f5a263d05d2da3d4eaadf0858f3be8347d532 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 12:19:57 -0800 Subject: [PATCH 049/138] handle CTAS state --- .../src/SqlLab/components/ResultSet.tsx | 120 +++++++++--------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 9ecf28e71faa7..369c3ab6c46e0 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -107,6 +107,7 @@ export default class ResultSet extends React.PureComponent< saveDatasetRadioBtnState: SAVE_NEW_DATASET_RADIO_STATE, overwriteDataSet: false, datasetToOverwrite: {}, + ctasSave: false, }; this.changeSearch = this.changeSearch.bind(this); @@ -254,68 +255,62 @@ export default class ResultSet extends React.PureComponent< const { schema, sql, dbId, templateParams } = this.props.query; const selectedColumns = this.props.query?.results?.selected_columns || []; - this.props.actions - .createDatasource({ - schema, - sql, - dbId, - templateParams, - datasourceName: this.state.newSaveDatasetName, - columns: selectedColumns, - }) - .then((data: { table_id: number }) => { - exploreChart({ - datasource: `${data.table_id}__table`, - metrics: [], - groupby: [], - time_range: 'No filter', - viz_type: 'table', - all_columns: selectedColumns.map(c => c.name), - row_limit: 1000, + if (this.state.ctasSave) { + // Create Table As flow for explore view + this.props.actions + .createCtasDatasource({ + schema, + dbId, + templateParams, + datasourceName: this.state.newSaveDatasetName, + }) + .then((data: { table_id: number }) => { + const formData = { + datasource: `${data.table_id}__table`, + metrics: ['count'], + groupby: [], + viz_type: 'table', + since: '100 years ago', + all_columns: [], + row_limit: 1000, + }; + this.props.actions.addInfoToast( + t('Creating a data source and creating a new tab'), + ); + + // open new window for data visualization + exploreChart(formData); + }) + .catch(() => { + this.props.actions.addDangerToast(t('An error occurred')); + }); + } else { + this.props.actions + .createDatasource({ + schema, + sql, + dbId, + templateParams, + datasourceName: this.state.newSaveDatasetName, + columns: selectedColumns, + }) + .then((data: { table_id: number }) => { + exploreChart({ + datasource: `${data.table_id}__table`, + metrics: [], + groupby: [], + time_range: 'No filter', + viz_type: 'table', + all_columns: selectedColumns.map(c => c.name), + row_limit: 1000, + }); + }) + .catch(() => { + this.props.actions.addDangerToast( + t('An error occurred saving dataset'), + ); }); - }) - .catch(() => { - this.props.actions.addDangerToast( - t('An error occurred saving dataset'), - ); - }); - } - - handleCTASSaveInDataset() { - // if user wants to overwrite a dataset we need to prompt them - if (this.state.saveDatasetRadioBtnState === OVERWRITE_DATASET_RADIO_STATE) { - this.setState({ overwriteDataSet: true }); - return; } - - const { schema, sql, dbId, templateParams } = this.props.query; - this.props.actions - .createCtasDatasource({ - schema, - dbId, - templateParams, - datasourceName: this.state.newSaveDatasetName, - }) - .then((data: { table_id: number }) => { - const formData = { - datasource: `${data.table_id}__table`, - metrics: ['count'], - groupby: [], - viz_type: 'table', - since: '100 years ago', - all_columns: [], - row_limit: 1000, - }; - this.props.actions.addInfoToast( - t('Creating a data source and creating a new tab'), - ); - - // open new window for data visualization - exploreChart(formData); - }) - .catch(() => { - this.props.actions.addDangerToast(t('An error occurred')); - }); } handleDatasetNameChange(e: { target: { value: any } }) { @@ -367,7 +362,7 @@ export default class ResultSet extends React.PureComponent< database={this.props.database} actions={this.props.actions} onClick={() => { - this.setState({showSaveDatasetModal: true}) + this.setState({showSaveDatasetModal: true, ctasSave: false}) }} /> )} @@ -468,6 +463,9 @@ export default class ResultSet extends React.PureComponent< dbId={exploreDBId} database={this.props.database} actions={this.props.actions} + onClick={() => { + this.setState({ showSaveDatasetModal: true, ctasSave: true }) + }} /> From 9e3d5282149d0394ff70db6056860ba8de88367c Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 24 Nov 2020 12:21:32 -0800 Subject: [PATCH 050/138] fix onclick to reference upper level component --- .../components/ExploreCtasResultsButton.jsx | 41 +------------------ 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/superset/assets/src/SqlLab/components/ExploreCtasResultsButton.jsx b/superset/assets/src/SqlLab/components/ExploreCtasResultsButton.jsx index 915ea9b87ee8b..85d7283d77c0f 100644 --- a/superset/assets/src/SqlLab/components/ExploreCtasResultsButton.jsx +++ b/superset/assets/src/SqlLab/components/ExploreCtasResultsButton.jsx @@ -35,6 +35,7 @@ const propTypes = { dbId: PropTypes.number.isRequired, errorMessage: PropTypes.string, templateParams: PropTypes.string, + onClick: PropTypes.func.isRequired, }; const defaultProps = { vizRequest: {}, @@ -46,50 +47,12 @@ class ExploreCtasResultsButton extends React.PureComponent { this.visualize = this.visualize.bind(this); this.onClick = this.onClick.bind(this); } - onClick() { - this.visualize(); - } - - buildVizOptions() { - return { - datasourceName: this.props.table, - schema: this.props.schema, - dbId: this.props.dbId, - templateParams: this.props.templateParams, - }; - } - visualize() { - this.props.actions - .createCtasDatasource(this.buildVizOptions()) - .then(data => { - const formData = { - datasource: `${data.table_id}__table`, - metrics: ['count'], - groupby: [], - viz_type: 'table', - since: '100 years ago', - all_columns: [], - row_limit: 1000, - }; - this.props.actions.addInfoToast( - t('Creating a data source and creating a new tab'), - ); - - // open new window for data visualization - exploreChart(formData); - }) - .catch(() => { - this.props.actions.addDangerToast( - this.props.errorMessage || t('An error occurred'), - ); - }); - } render() { return ( <> - } - {overwriteDataSet && <> - } + )} + {overwriteDataSet && ( + <> + {' '} + + {' '} + + )} } - > + > - {!overwriteDataSet &&
-
- Save this query as virtual dataset to continue exploring. -
- - - Save as new - - - - Overwrite existing - - - -
- } - {overwriteDataSet && -
- Are you sure you want to overwrite this dataset? + {!overwriteDataSet && ( +
+
+ Save this query as virtual dataset to continue exploring. +
+ + + Save as new + + + + Overwrite existing + + +
- } - - + )} + {overwriteDataSet && ( +
Are you sure you want to overwrite this dataset?
+ )} + + ); }; From 056bf143349e80d25d5f9353ce574caa4ebe1b30 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 30 Nov 2020 08:22:55 -0800 Subject: [PATCH 067/138] linting --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 1 + .../src/SqlLab/components/SaveDatasetModal.tsx | 9 ++++++--- superset-frontend/src/common/components/index.tsx | 4 +--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 5bc95a1d3141a..769fe15312c3e 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -75,6 +75,7 @@ interface ResultSetState { saveDatasetRadioBtnState: number; overwriteDataSet: boolean; datasetToOverwrite: Record; + ctasSave: boolean; } // Making text render line breaks/tabs as is as monospace, diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index dfb75fd5dbb80..2cdc4e7c8f499 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -29,13 +29,16 @@ interface SaveDatasetModalProps { onCancel: () => void; handleDatasetNameChange: (e: { target: { value: any } }) => void; userDatasetsOwned: Array>; - handleSaveDatasetRadioBtnState: () => void; + handleSaveDatasetRadioBtnState: (e: { target: { value: any } }) => void; saveDatasetRadioBtnState: number; overwriteDataSet: boolean; handleOverwriteCancel: () => void; handleOverwriteDataset: () => void; - handleOverwriteDatasetOption: () => void; - defaultCreateDatasetValue: () => void; + handleOverwriteDatasetOption: ( + data: string, + option: Record, + ) => void; + defaultCreateDatasetValue: string; } const Styles = styled.div` diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index 12f251ae4adad..dff007dc4df30 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -19,10 +19,8 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports -import { AutoComplete } from 'antd' -import { Dropdown, Skeleton, Menu as AntdMenu } from 'antd'; +import { AutoComplete, Dropdown, Skeleton, Menu as AntdMenu, Radio} from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; -import { Radio } from 'antd' /* Antd is re-exported from here so we can override components with Emotion as needed. From f6c60e84e52282945c7be2fdab7493bcca02e9b5 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 30 Nov 2020 09:17:19 -0800 Subject: [PATCH 068/138] add basic spec test --- .../sqllab/SaveDatasetModal_spec.jsx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx new file mode 100644 index 0000000000000..89fa7567e6540 --- /dev/null +++ b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { shallow } from 'enzyme'; +import sinon from 'sinon'; +import { Radio, AutoComplete, Input } from 'src/common/components'; +import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; + +describe('SaveDatasetModal', () => { + const mockedProps = {}; + it('renders a radio group btn', () => { + const wrapper = shallow(); + expect(wrapper.find(Radio.Group)).toExist(); + }); + it('renders a autocomplete', () => { + const wrapper = shallow(); + expect(wrapper.find(AutoComplete)).toExist(); + }); + it('renders an input form ', () => { + const wrapper = shallow(); + expect(wrapper.find(Input)).toExist(); + }); +}); From 7834b193369fbe69b13d6424018ffcb12002b432 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 30 Nov 2020 13:44:51 -0800 Subject: [PATCH 069/138] create dataset modal --- .../sqllab/SaveDatasetModal_spec.jsx | 39 ++++ .../SqlLab/components/SaveDatasetModal.tsx | 178 ++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx create mode 100644 superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx new file mode 100644 index 0000000000000..89fa7567e6540 --- /dev/null +++ b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { shallow } from 'enzyme'; +import sinon from 'sinon'; +import { Radio, AutoComplete, Input } from 'src/common/components'; +import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; + +describe('SaveDatasetModal', () => { + const mockedProps = {}; + it('renders a radio group btn', () => { + const wrapper = shallow(); + expect(wrapper.find(Radio.Group)).toExist(); + }); + it('renders a autocomplete', () => { + const wrapper = shallow(); + expect(wrapper.find(AutoComplete)).toExist(); + }); + it('renders an input form ', () => { + const wrapper = shallow(); + expect(wrapper.find(Input)).toExist(); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx new file mode 100644 index 0000000000000..2cdc4e7c8f499 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -0,0 +1,178 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, FunctionComponent } from 'react'; +import { Radio, AutoComplete, Input } from 'src/common/components'; +import StyledModal from 'src/common/components/Modal'; +import Button from 'src/components/Button'; +import { styled } from '@superset-ui/core'; + +interface SaveDatasetModalProps { + visible: boolean; + onOk: () => void; + onCancel: () => void; + handleDatasetNameChange: (e: { target: { value: any } }) => void; + userDatasetsOwned: Array>; + handleSaveDatasetRadioBtnState: (e: { target: { value: any } }) => void; + saveDatasetRadioBtnState: number; + overwriteDataSet: boolean; + handleOverwriteCancel: () => void; + handleOverwriteDataset: () => void; + handleOverwriteDatasetOption: ( + data: string, + option: Record, + ) => void; + defaultCreateDatasetValue: string; +} + +const Styles = styled.div` + .smd-input { + margin-left: 45px; + width: 290px; + } + .smd-autocomplete { + margin-left: 8px; + width: 290px; + } + .smd-radio { + display: block; + height: 30px; + margin: 10px 0px; + line-height: 30px; + } +`; + +// eslint-disable-next-line no-empty-pattern +export const SaveDatasetModal: FunctionComponent = ({ + visible, + onOk, + onCancel, + handleDatasetNameChange, + userDatasetsOwned, + handleSaveDatasetRadioBtnState, + saveDatasetRadioBtnState, + overwriteDataSet, + handleOverwriteCancel, + handleOverwriteDataset, + handleOverwriteDatasetOption, + defaultCreateDatasetValue, +}) => { + const [options, setOptions] = useState([]); + + const onSearch = (searchText: any) => { + setOptions( + !searchText + ? [] + : userDatasetsOwned.map((d: { dataSetName: any; dataSetId: any }) => ({ + value: d.dataSetName, + dataSetId: d.dataSetId, + })), + ); + }; + + const filterAutocompleteOption = ( + inputValue: any, + option: { value: string | any[] }, + ) => { + return option.value.includes(inputValue); + }; + + return ( + {}} + title="Save or Overwrite Dataset" + onCancel={onCancel} + footer={ + <> + {!overwriteDataSet && ( + + )} + {overwriteDataSet && ( + <> + {' '} + + {' '} + + )} + + } + > + + {!overwriteDataSet && ( +
+
+ Save this query as virtual dataset to continue exploring. +
+ + + Save as new + + + + Overwrite existing + + + +
+ )} + {overwriteDataSet && ( +
Are you sure you want to overwrite this dataset?
+ )} +
+
+ ); +}; From 734efab0596be0f96883a274310f0ba1a4cf42e6 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 30 Nov 2020 13:45:45 -0800 Subject: [PATCH 070/138] add components reference --- superset-frontend/src/common/components/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index cb11a6f1cf1dc..e88573503cc4e 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports -import { Dropdown, Skeleton, Menu as AntdMenu } from 'antd'; +import { AutoComplete, Dropdown, Skeleton, Menu as AntdMenu, Radio} from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; /* @@ -29,6 +29,7 @@ import { DropDownProps } from 'antd/lib/dropdown'; */ // eslint-disable-next-line no-restricted-imports export { + AutoComplete, Avatar, Button, Card, @@ -41,6 +42,7 @@ export { Popover, Select, Skeleton, + Radio, Tabs, Tooltip, } from 'antd'; From 77594ce1e3aba7b833e7b3ea9605fd4987015f8c Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Mon, 30 Nov 2020 13:51:00 -0800 Subject: [PATCH 071/138] Rename SaveDatasetModal_spec.jsx to SaveDatasetModal_spec.tsx --- .../{SaveDatasetModal_spec.jsx => SaveDatasetModal_spec.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename superset-frontend/spec/javascripts/sqllab/{SaveDatasetModal_spec.jsx => SaveDatasetModal_spec.tsx} (100%) diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx similarity index 100% rename from superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx rename to superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx From bde85ebfecefa5437ab98f7af087156f0f552bb6 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 30 Nov 2020 23:00:42 -0800 Subject: [PATCH 072/138] remove sinon for now --- .../spec/javascripts/sqllab/SaveDatasetModal_spec.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx index 89fa7567e6540..a26b56c99f115 100644 --- a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx +++ b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx @@ -18,7 +18,6 @@ */ import React from 'react'; import { shallow } from 'enzyme'; -import sinon from 'sinon'; import { Radio, AutoComplete, Input } from 'src/common/components'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; From 7c26b280aa700966e6569c70fc3b271786d0d0a9 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 30 Nov 2020 23:41:02 -0800 Subject: [PATCH 073/138] fix typing errors on modal files --- .../SqlLab/components/SaveDatasetModal.tsx | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 2cdc4e7c8f499..9ae3ce8328cf2 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -22,14 +22,15 @@ import { Radio, AutoComplete, Input } from 'src/common/components'; import StyledModal from 'src/common/components/Modal'; import Button from 'src/components/Button'; import { styled } from '@superset-ui/core'; +import { RadioChangeEvent } from 'antd/lib/radio'; interface SaveDatasetModalProps { visible: boolean; onOk: () => void; - onCancel: () => void; + onHide: () => void; handleDatasetNameChange: (e: { target: { value: any } }) => void; userDatasetsOwned: Array>; - handleSaveDatasetRadioBtnState: (e: { target: { value: any } }) => void; + handleSaveDatasetRadioBtnState: (e: RadioChangeEvent) => void; saveDatasetRadioBtnState: number; overwriteDataSet: boolean; handleOverwriteCancel: () => void; @@ -62,7 +63,7 @@ const Styles = styled.div` export const SaveDatasetModal: FunctionComponent = ({ visible, onOk, - onCancel, + onHide, handleDatasetNameChange, userDatasetsOwned, handleSaveDatasetRadioBtnState, @@ -73,13 +74,17 @@ export const SaveDatasetModal: FunctionComponent = ({ handleOverwriteDatasetOption, defaultCreateDatasetValue, }) => { - const [options, setOptions] = useState([]); + const [options, setOptions] = useState<{ + value: string; + dataSetId: number; + }[] + >([]); const onSearch = (searchText: any) => { setOptions( !searchText ? [] - : userDatasetsOwned.map((d: { dataSetName: any; dataSetId: any }) => ({ + : userDatasetsOwned.map(d => ({ value: d.dataSetName, dataSetId: d.dataSetId, })), @@ -87,8 +92,8 @@ export const SaveDatasetModal: FunctionComponent = ({ }; const filterAutocompleteOption = ( - inputValue: any, - option: { value: string | any[] }, + inputValue: string, + option: { [key: string]: any } | any, ) => { return option.value.includes(inputValue); }; @@ -96,9 +101,8 @@ export const SaveDatasetModal: FunctionComponent = ({ return ( {}} title="Save or Overwrite Dataset" - onCancel={onCancel} + onHide={onHide} footer={ <> {!overwriteDataSet && ( @@ -108,7 +112,7 @@ export const SaveDatasetModal: FunctionComponent = ({ className="m-r-5" onClick={onOk} > - Save & Explore + Save & Explore )} {overwriteDataSet && ( From b46f125f38fbeea68aec2a07f70bc09c2454bd85 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 09:15:24 -0800 Subject: [PATCH 074/138] fix linting --- .../src/SqlLab/components/SaveDatasetModal.tsx | 3 ++- superset-frontend/src/common/components/index.tsx | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 9ae3ce8328cf2..f7293b0bf281d 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -74,7 +74,8 @@ export const SaveDatasetModal: FunctionComponent = ({ handleOverwriteDatasetOption, defaultCreateDatasetValue, }) => { - const [options, setOptions] = useState<{ + const [options, setOptions] = useState< + { value: string; dataSetId: number; }[] diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index e88573503cc4e..94d16de23361b 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -19,7 +19,13 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports -import { AutoComplete, Dropdown, Skeleton, Menu as AntdMenu, Radio} from 'antd'; +import { + AutoComplete, + Dropdown, + Skeleton, + Menu as AntdMenu, + Radio, +} from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; /* From d4d4ddd3396e2716ee392d0f37e3ee1380171dae Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 19:25:27 -0800 Subject: [PATCH 075/138] address comments --- .../src/SqlLab/components/SaveDatasetModal.tsx | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 887f4d0b5d6ec..fe6c4950fcd78 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -22,25 +22,15 @@ import { Radio, AutoComplete, Input } from 'src/common/components'; import StyledModal from 'src/common/components/Modal'; import Button from 'src/components/Button'; import { styled } from '@superset-ui/core'; -<<<<<<< HEAD -======= import { RadioChangeEvent } from 'antd/lib/radio'; ->>>>>>> 014cdeeac4dfd1fc61d176e0796a07d29db808d6 interface SaveDatasetModalProps { visible: boolean; onOk: () => void; -<<<<<<< HEAD - onCancel: () => void; - handleDatasetNameChange: (e: { target: { value: any } }) => void; - userDatasetsOwned: Array>; - handleSaveDatasetRadioBtnState: (e: { target: { value: any } }) => void; -======= onHide: () => void; handleDatasetNameChange: (e: { target: { value: any } }) => void; userDatasetsOwned: Array>; handleSaveDatasetRadioBtnState: (e: RadioChangeEvent) => void; ->>>>>>> 014cdeeac4dfd1fc61d176e0796a07d29db808d6 saveDatasetRadioBtnState: number; overwriteDataSet: boolean; handleOverwriteCancel: () => void; @@ -92,7 +82,7 @@ export const SaveDatasetModal: FunctionComponent = ({ }[] >([]); - const onSearch = (searchText: any) => { + const onSearch = (searchText: string | undefined) => { setOptions( !searchText ? [] @@ -147,7 +137,7 @@ export const SaveDatasetModal: FunctionComponent = ({ onClick={handleOverwriteDataset} > Ok - {' '} + )} From d01b0be3f510d0955144c3314778d428ff2a3a75 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 20:14:23 -0800 Subject: [PATCH 076/138] attempt to fix linting --- .../sqllab/SaveDatasetModal_spec.jsx | 18 +++++++++++++++--- .../SqlLab/components/ExploreResultsButton.jsx | 2 -- .../src/SqlLab/components/ResultSet.tsx | 1 - .../src/SqlLab/components/SaveDatasetModal.tsx | 1 - 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx index 89fa7567e6540..41cadec74ffe9 100644 --- a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx +++ b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.jsx @@ -18,14 +18,26 @@ */ import React from 'react'; import { shallow } from 'enzyme'; -import sinon from 'sinon'; import { Radio, AutoComplete, Input } from 'src/common/components'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; describe('SaveDatasetModal', () => { - const mockedProps = {}; + const mockedProps = { + visible: false, + onOk: () => {}, + onHide: () => {}, + handleDatasetNameChange: () => {}, + userDatasetsOwned: [], + handleSaveDatasetRadioBtnState: () => {}, + saveDatasetRadioBtnState: 1, + overwriteDataSet: false, + handleOverwriteCancel: () => {}, + handleOverwriteDataset: () => {}, + handleOverwriteDatasetOption: () => {}, + defaultCreateDatasetValue: 'someDatasets', + }; it('renders a radio group btn', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(Radio.Group)).toExist(); }); it('renders a autocomplete', () => { diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx index 192687774266d..fc8c8ac017d60 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton.jsx @@ -26,9 +26,7 @@ import { t } from '@superset-ui/core'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import shortid from 'shortid'; -import Modal from 'src/common/components/Modal'; import Button from 'src/components/Button'; -import { exploreChart } from '../../explore/exploreUtils'; import * as actions from '../actions/sqlLab'; const propTypes = { diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 0951b7115352f..a418f9657506f 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -38,7 +38,6 @@ import { exploreChart } from '../../explore/exploreUtils'; import { CtasEnum } from '../actions/sqlLab'; import { Query } from '../types'; - const SEARCH_HEIGHT = 46; const SAVE_NEW_DATASET_RADIO_STATE = 1; diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index fe6c4950fcd78..c6ade3c80cb5d 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -74,7 +74,6 @@ export const SaveDatasetModal: FunctionComponent = ({ handleOverwriteDatasetOption, defaultCreateDatasetValue, }) => { - const [options, setOptions] = useState< { value: string; From c5977822497dd200b71837986739ea9daeeefc18 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 20:22:02 -0800 Subject: [PATCH 077/138] add props --- .../sqllab/SaveDatasetModal_spec.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx index a26b56c99f115..41cadec74ffe9 100644 --- a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx +++ b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx @@ -22,9 +22,22 @@ import { Radio, AutoComplete, Input } from 'src/common/components'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; describe('SaveDatasetModal', () => { - const mockedProps = {}; + const mockedProps = { + visible: false, + onOk: () => {}, + onHide: () => {}, + handleDatasetNameChange: () => {}, + userDatasetsOwned: [], + handleSaveDatasetRadioBtnState: () => {}, + saveDatasetRadioBtnState: 1, + overwriteDataSet: false, + handleOverwriteCancel: () => {}, + handleOverwriteDataset: () => {}, + handleOverwriteDatasetOption: () => {}, + defaultCreateDatasetValue: 'someDatasets', + }; it('renders a radio group btn', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(Radio.Group)).toExist(); }); it('renders a autocomplete', () => { From 5f134d264282d23832b851ec245f7fb399fc0028 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 20:25:26 -0800 Subject: [PATCH 078/138] fix test --- .../spec/javascripts/sqllab/SaveDatasetModal_spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx index 41cadec74ffe9..905e743c7f2e6 100644 --- a/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx +++ b/superset-frontend/spec/javascripts/sqllab/SaveDatasetModal_spec.tsx @@ -37,7 +37,7 @@ describe('SaveDatasetModal', () => { defaultCreateDatasetValue: 'someDatasets', }; it('renders a radio group btn', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(Radio.Group)).toExist(); }); it('renders a autocomplete', () => { From aa1df1b376598f6ac498ca6fa3ec28908c4ab291 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 22:06:32 -0800 Subject: [PATCH 079/138] fix the linting --- superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx | 4 ++-- superset-frontend/src/common/components/index.tsx | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index f7293b0bf281d..2b63154f83fd6 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -81,7 +81,7 @@ export const SaveDatasetModal: FunctionComponent = ({ }[] >([]); - const onSearch = (searchText: any) => { + const onSearch = (searchText: string) => { setOptions( !searchText ? [] @@ -136,7 +136,7 @@ export const SaveDatasetModal: FunctionComponent = ({ onClick={handleOverwriteDataset} > Ok - {' '} + )} diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index 3d169324bba56..ab2dd06a7b9c3 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -20,11 +20,9 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports import { - AutoComplete, Dropdown, Skeleton, Menu as AntdMenu, - Radio, } from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; From e4988f28a522a5766764facba713d3e8a3b21af0 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 22:45:07 -0800 Subject: [PATCH 080/138] yerp --- superset-frontend/src/common/components/index.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index ab2dd06a7b9c3..228404b2a7575 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -19,11 +19,6 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports -import { - Dropdown, - Skeleton, - Menu as AntdMenu, -} from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; /* @@ -42,6 +37,7 @@ export { Dropdown, Empty, Input, + Menu as AntdMenu, Modal, Popover, Select, From e0e1261bb7e8a3d32aeb52567bf87e5344693b7b Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 22:56:27 -0800 Subject: [PATCH 081/138] fix this references --- superset-frontend/src/common/components/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index 228404b2a7575..7852fbe016dec 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -19,6 +19,7 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports +import { Menu as AntdMenu, Dropdown, Skeleton} from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; /* @@ -37,7 +38,6 @@ export { Dropdown, Empty, Input, - Menu as AntdMenu, Modal, Popover, Select, From 38f03dff99f61a7309bb46539f8a4184d2989001 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 22:59:03 -0800 Subject: [PATCH 082/138] spaces --- superset-frontend/src/common/components/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index 7852fbe016dec..97ddef73f2412 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { styled } from '@superset-ui/core'; // eslint-disable-next-line no-restricted-imports -import { Menu as AntdMenu, Dropdown, Skeleton} from 'antd'; +import { Menu as AntdMenu, Dropdown, Skeleton } from 'antd'; import { DropDownProps } from 'antd/lib/dropdown'; /* From 1c44814f92e3d9ec07a2911ffc31ceb5a35472c4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 23:17:57 -0800 Subject: [PATCH 083/138] handleOverwriteCancel reference cleanup --- superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index 2b63154f83fd6..d4f240ae4ee6a 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -118,14 +118,11 @@ export const SaveDatasetModal: FunctionComponent = ({ )} {overwriteDataSet && ( <> - {' '} From ad4f9526adc1abd758e3f2cfaa6342868fe3f8b4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 1 Dec 2020 23:41:07 -0800 Subject: [PATCH 084/138] rename bool value for shouldOverwriteDataset --- .../src/SqlLab/components/SaveDatasetModal.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index d4f240ae4ee6a..422f89abf8512 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -32,7 +32,7 @@ interface SaveDatasetModalProps { userDatasetsOwned: Array>; handleSaveDatasetRadioBtnState: (e: RadioChangeEvent) => void; saveDatasetRadioBtnState: number; - overwriteDataSet: boolean; + shouldOverwriteDataset: boolean; handleOverwriteCancel: () => void; handleOverwriteDataset: () => void; handleOverwriteDatasetOption: ( @@ -68,7 +68,7 @@ export const SaveDatasetModal: FunctionComponent = ({ userDatasetsOwned, handleSaveDatasetRadioBtnState, saveDatasetRadioBtnState, - overwriteDataSet, + shouldOverwriteDataset, handleOverwriteCancel, handleOverwriteDataset, handleOverwriteDatasetOption, @@ -106,7 +106,7 @@ export const SaveDatasetModal: FunctionComponent = ({ onHide={onHide} footer={ <> - {!overwriteDataSet && ( + {!shouldOverwriteDataset && ( )} - {overwriteDataSet && ( + {shouldOverwriteDataset && ( <> )} @@ -165,9 +172,9 @@ export const SaveDatasetModal: FunctionComponent = ({ Overwrite existing - )} {shouldOverwriteDataset && ( @@ -117,7 +120,7 @@ export const SaveDatasetModal: FunctionComponent = ({ onClick={handleOverwriteDataset} disabled={disableSaveAndExploreBtn} > - Save & Explore + {t('Overwrite & Explore')} )} @@ -161,7 +164,9 @@ export const SaveDatasetModal: FunctionComponent = ({
)} {shouldOverwriteDataset && ( -
Are you sure you want to overwrite this dataset?
+
+ Are you sure you want to overwrite this dataset? +
)}
From 2ec480a97bf3f60fd4f59271ba4f824462764e2e Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 8 Dec 2020 12:43:39 -0800 Subject: [PATCH 134/138] get rid of .then --- .../src/SqlLab/components/ResultSet.tsx | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 672348ae1e01a..5692808709ee2 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -213,25 +213,13 @@ export default class ResultSet extends React.PureComponent< const { sql, results, dbId } = this.props.query; const { datasetToOverwrite } = this.state; - updateDatset( + await updateDatset( datasetToOverwrite.datasetId, dbId, sql, results.selected_columns.map(d => ({ column_name: d.name })), true, - ) - .then(() => { - exploreChart({ - ...EXPLORE_CHART_DEFAULT, - datasource: `${datasetToOverwrite.datasetId}__table`, - all_columns: results.selected_columns.map(d => d.name), - }); - }) - .catch(() => { - this.props.actions.addDangerToast( - t('An error occurred overwriting dataset'), - ); - }); + ); this.setState({ showSaveDatasetModal: false, @@ -241,6 +229,12 @@ export default class ResultSet extends React.PureComponent< 'MM/DD/YYYY HH:mm:ss', )}`, }); + + exploreChart({ + ...EXPLORE_CHART_DEFAULT, + datasource: `${datasetToOverwrite.datasetId}__table`, + all_columns: results.selected_columns.map(d => d.name), + }); }; handleSaveInDataset = () => { @@ -325,7 +319,7 @@ export default class ResultSet extends React.PureComponent< handleSaveDatasetModalSearch = (searchText: string) => { // Making sure that autocomplete input has a value before rendering the dropdown - // Transforming the userDatasetsOwned data for SaveModalComponent + // Transforming the userDatasetsOwned data for SaveModalComponent) const { userDatasetsOwned } = this.state; const userDatasets = !searchText ? [] From 1d8686a91f9b74a78ddbdb7a84549beab5efb624 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 8 Dec 2020 12:50:01 -0800 Subject: [PATCH 135/138] add function to compute default value with tiem --- .../src/SqlLab/components/ResultSet.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 5692808709ee2..d92a2978d44fc 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -123,9 +123,7 @@ export default class ResultSet extends React.PureComponent< showExploreResultsButton: false, data: [], showSaveDatasetModal: false, - newSaveDatasetName: `${props.query.tab} ${moment().format( - 'MM/DD/YYYY HH:mm:ss', - )}`, + newSaveDatasetName: this.getDefaultDatasetName(), userDatasetsOwned: [], saveDatasetRadioBtnState: DatasetRadioState.SAVE_NEW, shouldOverwriteDataSet: false, @@ -205,6 +203,10 @@ export default class ResultSet extends React.PureComponent< } } + getDefaultDatasetName = () => { + return `${this.props.query.tab} ${moment().format('MM/DD/YYYY HH:mm:ss')}`; + }; + handleOnChangeAutoComplete = () => { this.setState({ datasetToOverwrite: {} }); }; @@ -225,9 +227,7 @@ export default class ResultSet extends React.PureComponent< showSaveDatasetModal: false, shouldOverwriteDataSet: false, datasetToOverwrite: {}, - newSaveDatasetName: `${this.props.query.tab} ${moment().format( - 'MM/DD/YYYY HH:mm:ss', - )}`, + newSaveDatasetName: this.getDefaultDatasetName(), }); exploreChart({ From 88ba7a17f1be913c4998b569e87f0ba588ee5147 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 8 Dec 2020 13:12:12 -0800 Subject: [PATCH 136/138] lit --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index d92a2978d44fc..44c5ed654c950 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -278,9 +278,7 @@ export default class ResultSet extends React.PureComponent< this.setState({ showSaveDatasetModal: false, - newSaveDatasetName: `${this.props.query.tab} ${moment().format( - 'MM/DD/YYYY HH:mm:ss', - )}`, + newSaveDatasetName: this.getDefaultDatasetName(), }); }; From 1aff0f1c9dbe5ce2ea2d6692a8d70a7c580ccaa4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 8 Dec 2020 13:45:24 -0800 Subject: [PATCH 137/138] remove ts-error --- superset-frontend/src/SqlLab/components/ResultSet.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index 44c5ed654c950..a5a1d5f842054 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -606,7 +606,6 @@ export default class ResultSet extends React.PureComponent< if (query.progress > 0) { progressBar = ( From 2953258ad1e40b3aeb10f8d511e6f2b5b17a5bcb Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 8 Dec 2020 14:08:10 -0800 Subject: [PATCH 138/138] fix typing --- superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx index f64841aef83fa..7e3cd87059a81 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal.tsx @@ -18,6 +18,7 @@ */ import React, { FunctionComponent } from 'react'; +import { AutoCompleteProps } from 'antd/lib/auto-complete'; import { Radio, AutoComplete, Input } from 'src/common/components'; import StyledModal from 'src/common/components/Modal'; import Button from 'src/components/Button'; @@ -46,7 +47,7 @@ interface SaveDatasetModalProps { disableSaveAndExploreBtn: boolean; saveDatasetRadioBtnState: number; shouldOverwriteDataset: boolean; - userDatasetOptions: Array>; + userDatasetOptions: AutoCompleteProps['options']; } const Styles = styled.div` @@ -150,7 +151,6 @@ export const SaveDatasetModal: FunctionComponent = ({ Overwrite existing