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 ? (