From 113defbac6be56317fdb30d6845d9d10f2441a71 Mon Sep 17 00:00:00 2001 From: riahk Date: Mon, 25 Jul 2022 14:06:11 -0700 Subject: [PATCH 01/13] updates to allow insertion of workspace home sidescroll/table UI --- .../src/ui-overrides/ExtensionsRegistry.ts | 2 + .../src/components/Radio/index.tsx | 1 + .../src/views/CRUD/welcome/Welcome.tsx | 140 ++++++++++-------- 3 files changed, 79 insertions(+), 64 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index bf050a2c4c49..fc1dec67254a 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -46,6 +46,8 @@ export type Extensions = Partial<{ 'dashboard.nav.right': React.ComponentType; 'navbar.right': React.ComponentType; 'welcome.banner': React.ComponentType; + 'welcome.data': React.ComponentType; + 'welcome.table': React.ComponentType; }>; /** diff --git a/superset-frontend/src/components/Radio/index.tsx b/superset-frontend/src/components/Radio/index.tsx index 9ab656e4aa80..f06392d27879 100644 --- a/superset-frontend/src/components/Radio/index.tsx +++ b/superset-frontend/src/components/Radio/index.tsx @@ -57,4 +57,5 @@ const StyledGroup = styled(AntdRadio.Group)` export const Radio = Object.assign(StyledRadio, { Group: StyledGroup, + Button: AntdRadio.Button, }); diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx index 8f403b999bf7..b4dd2cc62350 100644 --- a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx +++ b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx @@ -180,6 +180,8 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { }; const WelcomeTopExtension = extensionsRegistry.get('welcome.banner'); + const WelcomeDataExtension = extensionsRegistry.get('welcome.data'); + const WelcomeTableExtension = extensionsRegistry.get('welcome.table'); useEffect(() => { const activeTab = getItem(LocalStorageKeys.homepage_activity_filter, null); @@ -283,70 +285,80 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { return ( {WelcomeTopExtension && } - -

Home

- {isFeatureEnabled(FeatureFlag.THUMBNAILS) ? ( -
- - Thumbnails -
- ) : null} -
- - - {activityData && - (activityData.Viewed || - activityData.Examples || - activityData.Created) && - activeChild !== 'Loading' ? ( - - ) : ( - - )} - - - {!dashboardData || isRecentActivityLoading ? ( - - ) : ( - - )} - - - {!chartData || isRecentActivityLoading ? ( - - ) : ( - - )} - - - {!queryData ? ( - - ) : ( - - )} - - + {WelcomeDataExtension && } + {WelcomeTableExtension && ( + + )} + {(!WelcomeTopExtension || + !WelcomeTableExtension || + !WelcomeDataExtension) && ( + <> + +

Home

+ {isFeatureEnabled(FeatureFlag.THUMBNAILS) ? ( +
+ + Thumbnails +
+ ) : null} +
+ + + {activityData && + (activityData.Viewed || + activityData.Examples || + activityData.Created) && + activeChild !== 'Loading' ? ( + + ) : ( + + )} + + + {!dashboardData || isRecentActivityLoading ? ( + + ) : ( + + )} + + + {!chartData || isRecentActivityLoading ? ( + + ) : ( + + )} + + + {!queryData ? ( + + ) : ( + + )} + + + + )}
); } From b5d1c8615f795f46c9d3f34ce4f6f36a681464ba Mon Sep 17 00:00:00 2001 From: riahk Date: Mon, 25 Jul 2022 16:31:41 -0700 Subject: [PATCH 02/13] fix types --- .../src/ui-overrides/ExtensionsRegistry.ts | 5 +++-- .../src/views/CRUD/welcome/Welcome.tsx | 13 +++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index fc1dec67254a..f10bd928096f 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -20,6 +20,7 @@ import React from 'react'; import { TypedRegistry } from '../models'; import { makeSingleton } from '../utils'; +import { User } from 'src/types/bootstrapTypes'; /** * A function which returns text (or marked-up text) @@ -46,8 +47,8 @@ export type Extensions = Partial<{ 'dashboard.nav.right': React.ComponentType; 'navbar.right': React.ComponentType; 'welcome.banner': React.ComponentType; - 'welcome.data': React.ComponentType; - 'welcome.table': React.ComponentType; + 'welcome.data': React.ComponentType; + 'welcome.table': React.ComponentType; }>; /** diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx index b4dd2cc62350..ff7ffa4b3ac3 100644 --- a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx +++ b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx @@ -285,10 +285,10 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { return ( {WelcomeTopExtension && } - {WelcomeDataExtension && } - {WelcomeTableExtension && ( - + {WelcomeDataExtension && ( + )} + {WelcomeTableExtension && } {(!WelcomeTopExtension || !WelcomeTableExtension || !WelcomeDataExtension) && ( @@ -302,7 +302,12 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { ) : null} - + {activityData && (activityData.Viewed || From ebbddf6c4de7a00e1ee41c67d7e8f41df8441b8e Mon Sep 17 00:00:00 2001 From: riahk Date: Tue, 26 Jul 2022 10:36:43 -0700 Subject: [PATCH 03/13] fix User type import --- .../src/ui-overrides/ExtensionsRegistry.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index f10bd928096f..0663f19c4185 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -20,7 +20,18 @@ import React from 'react'; import { TypedRegistry } from '../models'; import { makeSingleton } from '../utils'; -import { User } from 'src/types/bootstrapTypes'; + +// Taken from superset-frontend bootstrapTypes +type User = { + createdOn?: string; + email?: string; + firstName: string; + isActive: boolean; + isAnonymous: boolean; + lastName: string; + userId?: number; // optional because guest user doesn't have a user id + username: string; +}; /** * A function which returns text (or marked-up text) From a9f725e7e3539970ed9a30954b8687aeea787126 Mon Sep 17 00:00:00 2001 From: riahk Date: Mon, 1 Aug 2022 17:35:22 -0700 Subject: [PATCH 04/13] add welcome message to ui registry --- .../superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts | 1 + superset-frontend/src/views/CRUD/welcome/Welcome.tsx | 2 ++ 2 files changed, 3 insertions(+) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index 0663f19c4185..728004bc1a9e 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -57,6 +57,7 @@ export type Extensions = Partial<{ 'embedded.documentation.url': string; 'dashboard.nav.right': React.ComponentType; 'navbar.right': React.ComponentType; + 'welcome.message': React.ComponentType; 'welcome.banner': React.ComponentType; 'welcome.data': React.ComponentType; 'welcome.table': React.ComponentType; diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx index ff7ffa4b3ac3..68390f78fab7 100644 --- a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx +++ b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx @@ -179,6 +179,7 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { setItem(LocalStorageKeys.homepage_collapse_state, state); }; + const WelcomeMessageExtension = extensionsRegistry.get('welcome.message'); const WelcomeTopExtension = extensionsRegistry.get('welcome.banner'); const WelcomeDataExtension = extensionsRegistry.get('welcome.data'); const WelcomeTableExtension = extensionsRegistry.get('welcome.table'); @@ -284,6 +285,7 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { !activityData?.Examples && !activityData?.Viewed; return ( + {WelcomeMessageExtension && } {WelcomeTopExtension && } {WelcomeDataExtension && ( From e9c481f7ef172a3e8fddc374c4c6b12e3781da4b Mon Sep 17 00:00:00 2001 From: riahk Date: Sun, 7 Aug 2022 21:37:16 -0700 Subject: [PATCH 05/13] add extra fields to individual chart/query GET results (for workspace home required info) --- superset/charts/api.py | 3 +++ superset/queries/saved_queries/api.py | 1 + 2 files changed, 4 insertions(+) diff --git a/superset/charts/api.py b/superset/charts/api.py index e7e511d4fdbd..0169c4cd64bd 100644 --- a/superset/charts/api.py +++ b/superset/charts/api.py @@ -114,6 +114,7 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "cache_timeout", "certified_by", "certification_details", + "changed_on_delta_humanized", "dashboards.dashboard_title", "dashboards.id", "dashboards.json_metadata", @@ -124,6 +125,8 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "owners.username", "params", "slice_name", + "thumbnail_url", + "url", "viz_type", "query_context", "is_managed_externally", diff --git a/superset/queries/saved_queries/api.py b/superset/queries/saved_queries/api.py index a82a3dd8efcf..1f2088d7598a 100644 --- a/superset/queries/saved_queries/api.py +++ b/superset/queries/saved_queries/api.py @@ -81,6 +81,7 @@ class SavedQueryRestApi(BaseSupersetModelRestApi): base_filters = [["id", SavedQueryFilter, lambda: []]] show_columns = [ + "changed_on_delta_humanized", "created_by.first_name", "created_by.id", "created_by.last_name", From b60525bcbc11e1afb5d1d2655d6af61ae9542f34 Mon Sep 17 00:00:00 2001 From: riahk Date: Mon, 8 Aug 2022 15:34:25 -0700 Subject: [PATCH 06/13] update list view card to support a subtitle --- .../src/components/ListViewCard/index.tsx | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/superset-frontend/src/components/ListViewCard/index.tsx b/superset-frontend/src/components/ListViewCard/index.tsx index 3078db8ea4ba..ac38a06ad9f0 100644 --- a/superset-frontend/src/components/ListViewCard/index.tsx +++ b/superset-frontend/src/components/ListViewCard/index.tsx @@ -71,7 +71,7 @@ const Cover = styled.div` const TitleContainer = styled.div` display: flex; justify-content: flex-start; - flex-direction: row; + flex-direction: column; .card-actions { margin-left: auto; @@ -82,6 +82,12 @@ const TitleContainer = styled.div` align-items: center; } } + + .titleRow { + display: flex; + justify-content: flex-start; + flex-direction: row; + } `; const TitleLink = styled.span` @@ -141,6 +147,7 @@ const AnchorLink: React.FC = ({ to, children }) => ( interface CardProps { title?: React.ReactNode; + subtitle?: React.ReactNode; url?: string; linkComponent?: React.ComponentType; imgURL?: string; @@ -161,6 +168,7 @@ interface CardProps { function ListViewCard({ title, + subtitle, url, linkComponent, titleRight, @@ -245,24 +253,27 @@ function ListViewCard({ - - - - {certifiedBy && ( - <> - {' '} - - )} - {title} - - - - {titleRight && {titleRight}} -
- {actions} + {subtitle || null} +
+ + + + {certifiedBy && ( + <> + {' '} + + )} + {title} + + + + {titleRight && {titleRight}} +
+ {actions} +
} From f61e87d7d9fdddac9e48d9f2e4f7bd8df7edf957 Mon Sep 17 00:00:00 2001 From: riahk Date: Tue, 9 Aug 2022 14:21:43 -0700 Subject: [PATCH 07/13] add id to individual chart fetch --- superset/charts/api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/superset/charts/api.py b/superset/charts/api.py index 0169c4cd64bd..09cc7352bffd 100644 --- a/superset/charts/api.py +++ b/superset/charts/api.py @@ -119,6 +119,7 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "dashboards.id", "dashboards.json_metadata", "description", + "id", "owners.first_name", "owners.id", "owners.last_name", From a8f73856558c139c72e8a3b2077bacb6c94adf45 Mon Sep 17 00:00:00 2001 From: riahk Date: Thu, 11 Aug 2022 14:25:54 -0700 Subject: [PATCH 08/13] update chart api test --- tests/integration_tests/charts/api_tests.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/integration_tests/charts/api_tests.py b/tests/integration_tests/charts/api_tests.py index aabe0f719a6b..5633b3068aad 100644 --- a/tests/integration_tests/charts/api_tests.py +++ b/tests/integration_tests/charts/api_tests.py @@ -17,6 +17,7 @@ # isort:skip_file """Unit tests for Superset""" import json +import logging from io import BytesIO from zipfile import is_zipfile, ZipFile @@ -756,13 +757,24 @@ def test_get_chart(self): } ], "params": None, + "id": 42, "slice_name": "title", "viz_type": None, "query_context": None, "is_managed_externally": False, } data = json.loads(rv.data.decode("utf-8")) - self.assertEqual(data["result"], expected_result) + self.assertIn("changed_on_delta_humanized", data["result"]) + self.assertIn("thumbnail_url", data["result"]) + self.assertIn("url", data["result"]) + for key, value in data["result"].items(): + # We can't assert timestamp values + if key not in ( + "changed_on_delta_humanized", + "thumbnail_url", + "url", + ): + self.assertEqual(value, expected_result[key]) db.session.delete(chart) db.session.commit() From d5e448cb46bfb21ff0641eadd90e005aa4991965 Mon Sep 17 00:00:00 2001 From: riahk Date: Thu, 11 Aug 2022 16:02:06 -0700 Subject: [PATCH 09/13] another test fix --- tests/integration_tests/charts/api_tests.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/integration_tests/charts/api_tests.py b/tests/integration_tests/charts/api_tests.py index 5633b3068aad..c3546f32b966 100644 --- a/tests/integration_tests/charts/api_tests.py +++ b/tests/integration_tests/charts/api_tests.py @@ -757,7 +757,6 @@ def test_get_chart(self): } ], "params": None, - "id": 42, "slice_name": "title", "viz_type": None, "query_context": None, @@ -765,12 +764,14 @@ def test_get_chart(self): } data = json.loads(rv.data.decode("utf-8")) self.assertIn("changed_on_delta_humanized", data["result"]) + self.assertIn("id", data["result"]) self.assertIn("thumbnail_url", data["result"]) self.assertIn("url", data["result"]) for key, value in data["result"].items(): - # We can't assert timestamp values + # We can't assert timestamp values or id/urls if key not in ( "changed_on_delta_humanized", + "id", "thumbnail_url", "url", ): From 48b5fca1ad58ec0052764042fc97d5eb42afb030 Mon Sep 17 00:00:00 2001 From: riahk Date: Thu, 11 Aug 2022 16:28:06 -0700 Subject: [PATCH 10/13] fix saved query test --- tests/integration_tests/queries/saved_queries/api_tests.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/integration_tests/queries/saved_queries/api_tests.py b/tests/integration_tests/queries/saved_queries/api_tests.py index 2659bc224ff3..184df9c266ed 100644 --- a/tests/integration_tests/queries/saved_queries/api_tests.py +++ b/tests/integration_tests/queries/saved_queries/api_tests.py @@ -525,8 +525,12 @@ def test_get_saved_query(self): "label": "label1", } data = json.loads(rv.data.decode("utf-8")) + self.assertIn("changed_on_delta_humanized", data["result"]) for key, value in data["result"].items(): - assert value == expected_result[key] + if key not in ( + "changed_on_delta_humanized", + ): + assert value == expected_result[key] def test_get_saved_query_not_found(self): """ From eb938607ad54bf672dffd320fd84929847bebf14 Mon Sep 17 00:00:00 2001 From: riahk Date: Thu, 11 Aug 2022 18:14:33 -0700 Subject: [PATCH 11/13] update extension types + insert point --- .../src/ui-overrides/ExtensionsRegistry.ts | 5 ++--- .../src/views/CRUD/welcome/Welcome.tsx | 16 ++++++---------- .../queries/saved_queries/api_tests.py | 4 +--- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index 728004bc1a9e..97d317dc06d5 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -57,10 +57,9 @@ export type Extensions = Partial<{ 'embedded.documentation.url': string; 'dashboard.nav.right': React.ComponentType; 'navbar.right': React.ComponentType; - 'welcome.message': React.ComponentType; + 'welcome.message': React.ComponentType; 'welcome.banner': React.ComponentType; - 'welcome.data': React.ComponentType; - 'welcome.table': React.ComponentType; + 'welcome.page.replacement': React.ComponentType; }>; /** diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx index 68390f78fab7..ddbd0b26d382 100644 --- a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx +++ b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx @@ -181,8 +181,9 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { const WelcomeMessageExtension = extensionsRegistry.get('welcome.message'); const WelcomeTopExtension = extensionsRegistry.get('welcome.banner'); - const WelcomeDataExtension = extensionsRegistry.get('welcome.data'); - const WelcomeTableExtension = extensionsRegistry.get('welcome.table'); + const WelcomeMainExtension = extensionsRegistry.get( + 'welcome.main.replacement', + ); useEffect(() => { const activeTab = getItem(LocalStorageKeys.homepage_activity_filter, null); @@ -285,15 +286,10 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { !activityData?.Examples && !activityData?.Viewed; return ( - {WelcomeMessageExtension && } + {WelcomeMessageExtension && } {WelcomeTopExtension && } - {WelcomeDataExtension && ( - - )} - {WelcomeTableExtension && } - {(!WelcomeTopExtension || - !WelcomeTableExtension || - !WelcomeDataExtension) && ( + {WelcomeMainExtension && } + {(!WelcomeTopExtension || !WelcomeMainExtension) && ( <>

Home

diff --git a/tests/integration_tests/queries/saved_queries/api_tests.py b/tests/integration_tests/queries/saved_queries/api_tests.py index 184df9c266ed..2569e7af406e 100644 --- a/tests/integration_tests/queries/saved_queries/api_tests.py +++ b/tests/integration_tests/queries/saved_queries/api_tests.py @@ -527,9 +527,7 @@ def test_get_saved_query(self): data = json.loads(rv.data.decode("utf-8")) self.assertIn("changed_on_delta_humanized", data["result"]) for key, value in data["result"].items(): - if key not in ( - "changed_on_delta_humanized", - ): + if key not in ("changed_on_delta_humanized",): assert value == expected_result[key] def test_get_saved_query_not_found(self): From be8faef1224ec33376e307b848716dea9b5fd3b9 Mon Sep 17 00:00:00 2001 From: riahk Date: Fri, 12 Aug 2022 09:49:41 -0700 Subject: [PATCH 12/13] fix typing --- .../src/ui-overrides/ExtensionsRegistry.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index 97d317dc06d5..e2ec58b6278d 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -21,18 +21,6 @@ import React from 'react'; import { TypedRegistry } from '../models'; import { makeSingleton } from '../utils'; -// Taken from superset-frontend bootstrapTypes -type User = { - createdOn?: string; - email?: string; - firstName: string; - isActive: boolean; - isAnonymous: boolean; - lastName: string; - userId?: number; // optional because guest user doesn't have a user id - username: string; -}; - /** * A function which returns text (or marked-up text) * If what you want is a react component, don't use this. Use React.ComponentType instead. From e1a4d11d90867a02bccd7b0fa5c170ee58c5dcf1 Mon Sep 17 00:00:00 2001 From: riahk Date: Fri, 12 Aug 2022 10:04:16 -0700 Subject: [PATCH 13/13] fix type name --- .../superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts index e2ec58b6278d..82e68efcf0e9 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -47,7 +47,7 @@ export type Extensions = Partial<{ 'navbar.right': React.ComponentType; 'welcome.message': React.ComponentType; 'welcome.banner': React.ComponentType; - 'welcome.page.replacement': React.ComponentType; + 'welcome.main.replacement': React.ComponentType; }>; /**