You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2021/12/14 22:48:19 UTC
[superset] branch master updated: feat: add main datetime column to dataset editor (#17739)
This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 63d9693 feat: add main datetime column to dataset editor (#17739)
63d9693 is described below
commit 63d9693f21786431ba7e2ec11d6658bcd3a1f9e9
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Tue Dec 14 14:47:08 2021 -0800
feat: add main datetime column to dataset editor (#17739)
* feat: add main dttm col to dataset editor
* Add tests
---
superset-frontend/spec/fixtures/mockDatasource.js | 1 +
.../src/components/Datasource/DatasourceEditor.jsx | 56 +++++++++++++++++++---
.../Datasource/DatasourceEditor.test.jsx | 26 ++++++++++
.../datasets/examples/cleaned_sales_data.yaml | 2 +-
4 files changed, 77 insertions(+), 8 deletions(-)
diff --git a/superset-frontend/spec/fixtures/mockDatasource.js b/superset-frontend/spec/fixtures/mockDatasource.js
index ca60a71..30513fc 100644
--- a/superset-frontend/spec/fixtures/mockDatasource.js
+++ b/superset-frontend/spec/fixtures/mockDatasource.js
@@ -167,6 +167,7 @@ export default {
column_types: [0, 1, 2],
id,
granularity_sqla: [['ds', 'ds']],
+ main_dttm_col: 'ds',
name: 'birth_names',
owners: [{ first_name: 'joe', last_name: 'man', id: 1 }],
database: {
diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx
index cd21519..001fc3c 100644
--- a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx
+++ b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx
@@ -156,7 +156,9 @@ CollectionTabTitle.propTypes = {
function ColumnCollectionTable({
columns,
- onChange,
+ datasource,
+ onColumnsChange,
+ onDatasourceChange,
editableColumnName,
showExpression,
allowAddItem,
@@ -166,8 +168,22 @@ function ColumnCollectionTable({
return (
<CollectionTable
collection={columns}
- tableColumns={['column_name', 'type', 'is_dttm', 'filterable', 'groupby']}
- sortColumns={['column_name', 'type', 'is_dttm', 'filterable', 'groupby']}
+ tableColumns={[
+ 'column_name',
+ 'type',
+ 'is_dttm',
+ 'main_dttm_col',
+ 'filterable',
+ 'groupby',
+ ]}
+ sortColumns={[
+ 'column_name',
+ 'type',
+ 'is_dttm',
+ 'main_dttm_col',
+ 'filterable',
+ 'groupby',
+ ]}
allowDeletes
allowAddItem={allowAddItem}
itemGenerator={itemGenerator}
@@ -284,9 +300,10 @@ function ColumnCollectionTable({
type: t('Data type'),
groupby: t('Is dimension'),
is_dttm: t('Is temporal'),
+ main_dttm_col: t('Default datetime'),
filterable: t('Is filterable'),
}}
- onChange={onChange}
+ onChange={onColumnsChange}
itemRenderers={{
column_name: (v, onItemChange, _, record) =>
editableColumnName ? (
@@ -310,6 +327,25 @@ function ColumnCollectionTable({
{v}
</StyledLabelWrapper>
),
+ main_dttm_col: (value, _onItemChange, _label, record) => {
+ const checked = datasource.main_dttm_col === record.column_name;
+ const disabled = !columns.find(
+ column => column.column_name === record.column_name,
+ ).is_dttm;
+ return (
+ <Radio
+ data-test={`radio-default-dttm-${record.column_name}`}
+ checked={checked}
+ disabled={disabled}
+ onChange={() =>
+ onDatasourceChange({
+ ...datasource,
+ main_dttm_col: record.column_name,
+ })
+ }
+ />
+ );
+ },
type: d => (d ? <Label>{d}</Label> : null),
is_dttm: checkboxGenerator,
filterable: checkboxGenerator,
@@ -320,7 +356,9 @@ function ColumnCollectionTable({
}
ColumnCollectionTable.propTypes = {
columns: PropTypes.array.isRequired,
- onChange: PropTypes.func.isRequired,
+ datasource: PropTypes.object.isRequired,
+ onColumnsChange: PropTypes.func.isRequired,
+ onDatasourceChange: PropTypes.func.isRequired,
editableColumnName: PropTypes.bool,
showExpression: PropTypes.bool,
allowAddItem: PropTypes.bool,
@@ -1227,9 +1265,11 @@ class DatasourceEditor extends React.PureComponent {
<ColumnCollectionTable
className="columns-table"
columns={this.state.databaseColumns}
- onChange={databaseColumns =>
+ datasource={datasource}
+ onColumnsChange={databaseColumns =>
this.setColumns({ databaseColumns })
}
+ onDatasourceChange={this.onDatasourceChange}
/>
{this.state.metadataLoading && <Loading />}
</div>
@@ -1245,9 +1285,11 @@ class DatasourceEditor extends React.PureComponent {
>
<ColumnCollectionTable
columns={this.state.calculatedColumns}
- onChange={calculatedColumns =>
+ onColumnsChange={calculatedColumns =>
this.setColumns({ calculatedColumns })
}
+ onDatasourceChange={this.onDatasourceChange}
+ datasource={datasource}
editableColumnName
showExpression
allowAddItem
diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx
index a0d46a6..8d63493 100644
--- a/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx
+++ b/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx
@@ -230,4 +230,30 @@ describe('DatasourceEditor RTL', () => {
userEvent.type(certificationDetails, 'I am typing something new');
expect(certificationDetails.value).toEqual('I am typing something new');
});
+ it('shows the default datetime column', async () => {
+ render(<DatasourceEditor {...props} />, { useRedux: true });
+ const metricButton = screen.getByTestId('collection-tab-Columns');
+ userEvent.click(metricButton);
+
+ const dsDefaultDatetimeRadio = screen.getByTestId('radio-default-dttm-ds');
+ expect(dsDefaultDatetimeRadio).toBeChecked();
+
+ const genderDefaultDatetimeRadio = screen.getByTestId(
+ 'radio-default-dttm-gender',
+ );
+ expect(genderDefaultDatetimeRadio).not.toBeChecked();
+ });
+ it('allows choosing only temporal columns as the default datetime', async () => {
+ render(<DatasourceEditor {...props} />, { useRedux: true });
+ const metricButton = screen.getByTestId('collection-tab-Columns');
+ userEvent.click(metricButton);
+
+ const dsDefaultDatetimeRadio = screen.getByTestId('radio-default-dttm-ds');
+ expect(dsDefaultDatetimeRadio).toBeEnabled();
+
+ const genderDefaultDatetimeRadio = screen.getByTestId(
+ 'radio-default-dttm-gender',
+ );
+ expect(genderDefaultDatetimeRadio).toBeDisabled();
+ });
});
diff --git a/superset/examples/configs/datasets/examples/cleaned_sales_data.yaml b/superset/examples/configs/datasets/examples/cleaned_sales_data.yaml
index 8832cc5..fcf91bc 100644
--- a/superset/examples/configs/datasets/examples/cleaned_sales_data.yaml
+++ b/superset/examples/configs/datasets/examples/cleaned_sales_data.yaml
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
table_name: cleaned_sales_data
-main_dttm_col: OrderDate
+main_dttm_col: order_date
description: null
default_endpoint: null
offset: 0