From d66aa1e1efc527a44c4562811548390839abf69e Mon Sep 17 00:00:00 2001 From: Uday Raj Sahai Date: Thu, 24 Sep 2026 16:45:18 +0530 Subject: [PATCH] Embedding-dataset changes --- .../usecases/[useCaseSlug]/Dashboards.tsx | 86 ++++++++++++------- .../[useCaseSlug]/UsecaseDetailsClient.tsx | 2 +- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx b/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx index e1ec3e69..20ce2e66 100644 --- a/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx +++ b/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx @@ -1,4 +1,3 @@ -import Link from 'next/link'; import { useParams } from 'next/navigation'; import { graphql } from '@/gql'; import { useQuery } from '@tanstack/react-query'; @@ -7,6 +6,23 @@ import { Text } from 'opub-ui'; import { GraphQL } from '@/lib/api'; import { Loading } from '@/components/loading'; +const getSafeEmbedUrl = (link: string | null | undefined) => { + if (!link) return null; + + try { + const url = new URL(link); + if (url.protocol !== 'https:' && url.protocol !== 'http:') return null; + + if (url.pathname.includes('/superset/')) { + url.searchParams.set('standalone', '1'); + } + + return url.toString(); + } catch { + return null; + } +}; + const DashboardsList = graphql(` query usecaseDashboards($usecaseId: Int!) { usecaseDashboards(usecaseId: $usecaseId) { @@ -36,7 +52,14 @@ const Dashboards = () => { } ); - if (!isValidId) { + const dashboards = (data?.usecaseDashboards ?? []) + .map((dashboard) => ({ + ...dashboard, + embedUrl: getSafeEmbedUrl(dashboard.link), + })) + .filter((dashboard) => dashboard.embedUrl); + + if (!isValidId || (!isLoading && dashboards.length === 0)) { return null; } @@ -45,36 +68,41 @@ const Dashboards = () => { {isLoading ? ( ) : ( - (data?.usecaseDashboards?.length ?? 0) > 0 && ( -
-
- - Dashboards Linked to this Use Case - - - Analytical dashboards to explore the data further{' '} - -
-
- {data?.usecaseDashboards?.map((dashboard) => ( - +
+ Dashboards Linked to this Use Case + + Analytical dashboards to explore the data further{' '} + +
+
+ {dashboards.map((dashboard) => ( +
+ + {dashboard.name} + +
+