From 7040e02cfbf0f6538df8eb451f2e62ad264b27e3 Mon Sep 17 00:00:00 2001
From: Chirag Madlani <12962843+chirag-madlani@users.noreply.github.com>
Date: Fri, 6 Jun 2025 18:06:26 +0530
Subject: [PATCH] fix(ui): overflow for frequently joined table widget (#21623)
(cherry picked from commit b0f82aa0ef5f98384bebca74e6d837ffbd231222)
---
.../FrequentlyJoinedTables.component.tsx | 68 ++++++++++++++-----
.../frequently-joined-tables.style.less | 16 +++--
2 files changed, 60 insertions(+), 24 deletions(-)
diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/FrequentlyJoinedTables.component.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/FrequentlyJoinedTables.component.tsx
index aaf1702549d..06abbe68846 100644
--- a/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/FrequentlyJoinedTables.component.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/FrequentlyJoinedTables.component.tsx
@@ -10,13 +10,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { Space, Typography } from 'antd';
+import { Button, Typography } from 'antd';
import { isEmpty } from 'lodash';
-import React, { useEffect, useMemo } from 'react';
+import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Link } from 'react-router-dom';
import ExpandableCard from '../../../components/common/ExpandableCard/ExpandableCard';
import { useGenericContext } from '../../../components/Customization/GenericProvider/GenericProvider';
+import { LIST_SIZE } from '../../../constants/constants';
import { DetailPageWidgetKeys } from '../../../enums/CustomizeDetailPage.enum';
import { EntityType } from '../../../enums/entity.enum';
import { JoinedWith, Table } from '../../../generated/entity/data/table';
@@ -36,6 +37,7 @@ export const FrequentlyJoinedTables = ({
}) => {
const { t } = useTranslation();
const { data, filterWidgets } = useGenericContext
();
+ const [visibleCount, setVisibleCount] = useState(LIST_SIZE);
const joinedTables = useMemo(
() => getJoinsFromTableJoins(data?.joins),
@@ -48,34 +50,64 @@ export const FrequentlyJoinedTables = ({
}
}, [joinedTables]);
+ const hasMoreElement = useMemo(
+ () => LIST_SIZE < joinedTables.length,
+ [joinedTables]
+ );
+
+ const handleShowMore = useCallback(() => {
+ setVisibleCount(
+ visibleCount === joinedTables.length ? LIST_SIZE : joinedTables.length
+ );
+ }, [joinedTables, visibleCount]);
+
+ const content = useMemo(() => {
+ return joinedTables.slice(0, visibleCount).map((table) => (
+
+
+
+ {table.name}
+
+
+ {getCountBadge(table.joinCount, '', false)}
+
+ ));
+ }, [joinedTables, visibleCount]);
+
if (isEmpty(joinedTables)) {
return null;
}
- const content = joinedTables.map((table) => (
-
-
-
- {table.name}
-
-
- {getCountBadge(table.joinCount, '', false)}
-
- ));
-
return renderAsExpandableCard ? (
{content}
+
+ {hasMoreElement ? (
+
+ ) : null}
) : (
<>{content}>
diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/frequently-joined-tables.style.less b/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/frequently-joined-tables.style.less
index 8e50bd05463..f0fec46ee24 100644
--- a/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/frequently-joined-tables.style.less
+++ b/openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/FrequentlyJoinedTables/frequently-joined-tables.style.less
@@ -10,15 +10,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@import url('../../../styles/variables.less');
+@import (reference) url('../../../styles/variables.less');
.frequently-joint-data-container {
- max-height: 200px;
- overflow-y: scroll;
-
.frequently-joint-data {
- .frequently-joint-name {
- font-weight: 300;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ margin-bottom: 8px;
+
+ > a {
+ flex: 1;
+ min-width: 0;
}
}
}