diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component.tsx
index 8fe062baa67..cfdab5c5a8d 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component.tsx
@@ -69,7 +69,7 @@ export const AdvanceSearchProvider = ({
([, tabInfo]) => tabInfo.path === tab
);
if (isNil(tabInfo)) {
- return SearchIndex.TABLE;
+ return SearchIndex.DATA_ASSET;
}
return tabInfo[0] as SearchIndex;
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx
index aeeeb0a8dd8..1bb38fb717e 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx
@@ -63,6 +63,7 @@ import {
} from '../../utils/BrowserNotificationUtils';
import { refreshPage } from '../../utils/CommonUtils';
import entityUtilClassBase from '../../utils/EntityUtilClassBase';
+import { getEntityName } from '../../utils/EntityUtils';
import {
getEntityFQN,
getEntityType,
@@ -472,6 +473,8 @@ const NavBar = ({
menu={{
items: domainOptions,
onClick: handleDomainChange,
+ className: 'domain-dropdown-menu',
+ defaultSelectedKeys: [activeDomain],
}}
placement="bottomRight"
trigger={['click']}>
@@ -486,7 +489,9 @@ const NavBar = ({
- {activeDomainEntityRef?.displayName ?? activeDomain}
+ {activeDomainEntityRef
+ ? getEntityName(activeDomainEntityRef)
+ : activeDomain}
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less
index a27e1f12647..325a0886e98 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less
+++ b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less
@@ -29,3 +29,8 @@
}
}
}
+
+.domain-dropdown-menu {
+ max-height: 400px;
+ overflow-y: auto;
+}
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/DomainLabel/DomainLabel.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/DomainLabel/DomainLabel.component.tsx
index cac6fd2af31..f0c725a66aa 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/common/DomainLabel/DomainLabel.component.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/components/common/DomainLabel/DomainLabel.component.tsx
@@ -10,7 +10,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { Typography } from 'antd';
+import { Tooltip, Typography } from 'antd';
import { AxiosError } from 'axios';
import classNames from 'classnames';
import { compare } from 'fast-json-patch';
@@ -18,6 +18,7 @@ import { get, isEmpty, isUndefined } from 'lodash';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { ReactComponent as DomainIcon } from '../../../assets/svg/ic-domain.svg';
+import { ReactComponent as InheritIcon } from '../../../assets/svg/ic-inherit.svg';
import { DE_ACTIVE_COLOR } from '../../../constants/constants';
import { EntityReference } from '../../../generated/entity/type';
import {
@@ -104,17 +105,37 @@ export const DomainLabel = ({
Array.isArray(activeDomain) &&
activeDomain.length > 0
) {
- return activeDomain.map((domain, index) => (
-
- {renderDomainLink(
- domain,
- domainDisplayName,
- showDomainHeading,
- textClassName
- )}
- {index < activeDomain.length - 1 && ', '}
-
- ));
+ return activeDomain.map((domain) => {
+ const inheritedIcon = domain?.inherited ? (
+
+
+
+ ) : null;
+
+ return (
+
+
+
+
+ {renderDomainLink(
+ domain,
+ domainDisplayName,
+ showDomainHeading,
+ textClassName
+ )}
+ {inheritedIcon &&
{inheritedIcon}
}
+
+ );
+ });
} else {
return (
-
-
+
{domainLink}
>
@@ -170,19 +184,9 @@ export const DomainLabel = ({
return (
-
-
-
{domainLink}
-
{selectableList}
);
diff --git a/openmetadata-ui/src/main/resources/ui/src/hooks/useDomainStore.ts b/openmetadata-ui/src/main/resources/ui/src/hooks/useDomainStore.ts
index c2a58b3acd2..c25f6fb992d 100644
--- a/openmetadata-ui/src/main/resources/ui/src/hooks/useDomainStore.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/hooks/useDomainStore.ts
@@ -60,14 +60,19 @@ export const useDomainStore = create
()(
selectDefault &&
!isAdmin &&
userDomainsObj.length > 0 &&
- !get().activeDomain
+ get().activeDomain === DEFAULT_DOMAIN_VALUE
) {
- set({ activeDomain: userDomainsObj[0].fullyQualifiedName });
+ get().updateActiveDomain(userDomainsObj[0].fullyQualifiedName ?? '');
}
},
updateActiveDomain: (activeDomainKey: string) => {
+ const currentUser = useApplicationStore.getState().currentUser;
+ const { isAdmin = false, domains = [] } = currentUser ?? {};
+ const userDomainsObj = isAdmin ? [] : domains;
+ const allDomains = isAdmin ? get().domains : userDomainsObj;
+
const activeDomainEntityRef = initializeDomainEntityRef(
- get().domains,
+ allDomains as EntityReference[],
activeDomainKey
);
set({
@@ -93,8 +98,13 @@ export const useDomainStore = create()(
{
name: DOMAIN_STORAGE_KEY,
partialize: (state) => {
+ const currentUser = useApplicationStore.getState().currentUser;
+ const { isAdmin = false, domains = [] } = currentUser ?? {};
+ const userDomainsObj = isAdmin ? [] : domains;
+ const allDomains = isAdmin ? state.domains : userDomainsObj;
+
const activeDomainEntityRef = initializeDomainEntityRef(
- state.domains,
+ allDomains as EntityReference[],
state.activeDomain
);
diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/ServiceDetailsPage/ServiceDetailsPage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/ServiceDetailsPage/ServiceDetailsPage.tsx
index 51b2d6c6e29..738f3fa1b38 100644
--- a/openmetadata-ui/src/main/resources/ui/src/pages/ServiceDetailsPage/ServiceDetailsPage.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/pages/ServiceDetailsPage/ServiceDetailsPage.tsx
@@ -46,6 +46,7 @@ import {
INITIAL_PAGING_VALUE,
PAGE_SIZE,
pagingObject,
+ ROUTES,
} from '../../constants/constants';
import {
OPEN_METADATA,
@@ -53,6 +54,7 @@ import {
} from '../../constants/Services.constant';
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
import { OperationPermission } from '../../context/PermissionProvider/PermissionProvider.interface';
+import { ClientErrors } from '../../enums/Axios.enum';
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
import {
EntityTabs,
@@ -582,6 +584,9 @@ const ServiceDetailsPage: FunctionComponent = () => {
setShowDeleted(response.deleted ?? false);
} catch (error) {
// Error
+ if ((error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
+ history.replace(ROUTES.FORBIDDEN);
+ }
} finally {
setIsLoading(false);
}
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchClassBase.ts b/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchClassBase.ts
index 562a4c30fc9..efcda7e4c1a 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchClassBase.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchClassBase.ts
@@ -109,6 +109,19 @@ class AdvancedSearchClassBase {
useAsyncSearch: true,
},
},
+
+ tableType: {
+ label: t('label.table-type'),
+ type: 'select',
+ mainWidgetProps: this.mainWidgetProps,
+ fieldSettings: {
+ asyncFetch: this.autocomplete({
+ searchIndex: SearchIndex.TABLE,
+ entityField: EntityFields.TABLE_TYPE,
+ }),
+ useAsyncSearch: true,
+ },
+ },
};
/**
@@ -177,6 +190,24 @@ class AdvancedSearchClassBase {
},
};
+ /**
+ * Fields specific to Glossary
+ */
+ glossaryQueryBuilderFields: Fields = {
+ status: {
+ label: t('label.status'),
+ type: 'select',
+ mainWidgetProps: this.mainWidgetProps,
+ fieldSettings: {
+ asyncFetch: this.autocomplete({
+ searchIndex: SearchIndex.GLOSSARY_TERM,
+ entityField: EntityFields.GLOSSARY_TERM_STATUS,
+ }),
+ useAsyncSearch: true,
+ },
+ },
+ };
+
/**
* Fields specific to dashboard
*/
@@ -548,6 +579,18 @@ class AdvancedSearchClassBase {
...this.dataModelQueryBuilderFields,
...this.apiEndpointQueryBuilderFields,
},
+ [SearchIndex.DATA_ASSET]: {
+ ...this.tableQueryBuilderFields,
+ ...this.pipelineQueryBuilderFields,
+ ...this.dashboardQueryBuilderFields,
+ ...this.topicQueryBuilderFields,
+ ...this.mlModelQueryBuilderFields,
+ ...this.containerQueryBuilderFields,
+ ...this.searchIndexQueryBuilderFields,
+ ...this.dataModelQueryBuilderFields,
+ ...this.apiEndpointQueryBuilderFields,
+ ...this.glossaryQueryBuilderFields,
+ },
};
entitySearchIndex.forEach((index) => {
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/DomainUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/DomainUtils.tsx
index 1e2f9d90893..f6643c077ad 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/DomainUtils.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/DomainUtils.tsx
@@ -244,12 +244,12 @@ export const renderDomainLink = (
);
export const initializeDomainEntityRef = (
- domains: Domain[],
+ domains: EntityReference[],
activeDomainKey: string
) => {
- const domain = domains.find(
- (item) => item.fullyQualifiedName === activeDomainKey
- );
+ const domain = domains.find((item) => {
+ return item.fullyQualifiedName === activeDomainKey;
+ });
if (domain) {
return getEntityReferenceFromEntity(domain, EntityType.DOMAIN);
}