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); }