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