diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java index f382c39fc17..21a4e67cd12 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java @@ -273,7 +273,8 @@ public class SearchRepository { if (changeDescription != null) { Pair> updates = getInheritedFieldChanges(changeDescription); Pair parentMatch; - if (updates.getValue().get("type").toString().equalsIgnoreCase("domain") + if (!updates.getValue().isEmpty() + && updates.getValue().get("type").toString().equalsIgnoreCase("domain") && (entityType.equalsIgnoreCase(Entity.DATABASE_SERVICE) || entityType.equalsIgnoreCase(Entity.DASHBOARD_SERVICE) || entityType.equalsIgnoreCase(Entity.MESSAGING_SERVICE) diff --git a/openmetadata-service/src/main/resources/elasticsearch/indexMapping.json b/openmetadata-service/src/main/resources/elasticsearch/indexMapping.json index d717accb058..eb0b0c67d99 100644 --- a/openmetadata-service/src/main/resources/elasticsearch/indexMapping.json +++ b/openmetadata-service/src/main/resources/elasticsearch/indexMapping.json @@ -207,7 +207,7 @@ "indexName": "mlmodel_service_search_index", "indexMappingFile": "/elasticsearch/%s/mlmodel_service_index_mapping.json", "alias": "mlModelService", - "parentAliases": ["all"] + "parentAliases": ["all","mlModelService"] }, "testCaseResolutionStatus": { "indexName": "test_case_resolution_status_search_index", diff --git a/openmetadata-ui/src/main/resources/ui/cypress/constants/constants.js b/openmetadata-ui/src/main/resources/ui/cypress/constants/constants.js index 294f382aca2..e2b5c648200 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/constants/constants.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/constants/constants.js @@ -307,6 +307,7 @@ export const NEW_GLOSSARY = { reviewer: 'Aaron Johnson', addReviewer: true, tag: 'PersonalData.Personal', + isMutually: true, }; export const NEW_GLOSSARY_1 = { name: 'Cypress Product%Glossary', diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Glossary.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Glossary.spec.js index 6dca15e8333..21d665261e1 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Glossary.spec.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/Glossary.spec.js @@ -116,7 +116,11 @@ const createGlossary = (glossaryData) => { .should('be.visible') .type(glossaryData.description); - cy.get('[data-testid="mutually-exclusive-button"]').scrollIntoView().click(); + if (glossaryData.isMutually) { + cy.get('[data-testid="mutually-exclusive-button"]') + .scrollIntoView() + .click(); + } if (glossaryData.tag) { // Add tag @@ -311,10 +315,12 @@ const removeAssetsFromGlossaryTerm = (glossaryTerm, glossary) => { cy.get('[data-testid="delete-button"]').click(); cy.get("[data-testid='save-button']").click(); - interceptURL('GET', '/api/v1/search/query*', 'assetTab'); + cy.get('[data-testid="overview"]').click(); + cy.get('[data-testid="assets"]').click(); + // go assets tab - goToAssetsTab(glossaryTerm.name, glossaryTerm.fullyQualifiedName, true); - verifyResponseStatusCode('@assetTab', 200); + verifyResponseStatusCode('@searchAssets', 200); + checkAssetsCount(glossaryTerm.assets.length - (index + 1)); }); }; @@ -719,7 +725,7 @@ describe('Glossary page should work properly', () => { const ProductTerms = Object.values(NEW_GLOSSARY_1_TERMS); ProductTerms.forEach((term) => - createGlossaryTerm(term, NEW_GLOSSARY_1, 'Approved') + createGlossaryTerm(term, NEW_GLOSSARY_1, 'Approved', false) ); }); diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Service/postgres.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Service/postgres.spec.js index c49d12e5367..ca46fe4aaf0 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Service/postgres.spec.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Service/postgres.spec.js @@ -131,7 +131,7 @@ describe('Postgres Ingestion', () => { cy.get('#root\\/filterCondition') .scrollIntoView() - .type(`s.query like '%${tableName}%'`); + .type(`s.query like '%%${tableName}%%'`); cy.get('[data-testid="submit-btn"]') .scrollIntoView() .should('be.visible') diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx index 8bccef55584..020390be469 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx @@ -40,6 +40,7 @@ import { ThreadTaskStatus, ThreadType, } from '../../../generated/entity/feed/thread'; +import { useAuth } from '../../../hooks/authHooks'; import { useElementInView } from '../../../hooks/useElementInView'; import { getAllFeeds, getFeedCount } from '../../../rest/feedsAPI'; import { getCountBadge, getEntityDetailLink } from '../../../utils/CommonUtils'; @@ -81,6 +82,7 @@ export const ActivityFeedTab = ({ }); const { subTab: activeTab = ActivityFeedTabs.ALL } = useParams<{ subTab: ActivityFeedTabs }>(); + const { isAdminUser } = useAuth(); const [taskFilter, setTaskFilter] = useState('open'); const [allCount, setAllCount] = useState(0); const [tasksCount, setTasksCount] = useState(0); @@ -162,7 +164,7 @@ export const ActivityFeedTab = ({ undefined, undefined, ThreadType.Task, - FeedFilter.OWNER, + isAdminUser ? undefined : FeedFilter.OWNER, undefined, userId ).then((res) => { @@ -178,7 +180,7 @@ export const ActivityFeedTab = ({ undefined, undefined, ThreadType.Conversation, - FeedFilter.OWNER, + isAdminUser ? undefined : FeedFilter.OWNER, undefined, userId ).then((res) => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AppBar/Suggestions.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AppBar/Suggestions.tsx index d62568422c8..29b81f1cc2f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AppBar/Suggestions.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AppBar/Suggestions.tsx @@ -13,6 +13,7 @@ import { Typography } from 'antd'; import { AxiosError } from 'axios'; +import { isEmpty } from 'lodash'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import Loader from '../../components/Loader/Loader'; @@ -239,7 +240,7 @@ const Suggestions = ({ return ; } - if (options.length === 0 && !isTourOpen) { + if (options.length === 0 && !isTourOpen && !isEmpty(searchText)) { return ( { - const { t } = useTranslation(); - const [filters, setFilters] = useState([]); - const [selectedFilter, setSelectedFilter] = useState([]); - const [selectedQuickFilters, setSelectedQuickFilters] = useState< - ExploreQuickFilterField[] - >([]); - - const handleMenuClick = ({ key }: { key: string }) => { - setSelectedFilter((prevSelected) => [...prevSelected, key]); - }; - - const menu = useMemo( - () => ( - - {filters.map((filter) => ( - {filter.label} - ))} - - ), - [selectedFilter, filters] - ); - - const handleQuickFiltersChange = (data: ExploreQuickFilterField[]) => { - const must: QueryFieldInterface[] = []; - data.forEach((filter) => { - if (!isEmpty(filter.value)) { - const should: QueryFieldValueInterface[] = []; - if (filter.value) { - filter.value.forEach((filterValue) => { - const term: Record = {}; - term[filter.key] = filterValue.key; - should.push({ term }); - }); - } - - must.push({ - bool: { should }, - }); - } - }); - - const quickFilterQuery = isEmpty(must) - ? undefined - : { - query: { bool: { must } }, - }; - - onQuickFilterChange?.(quickFilterQuery); - }; - - const handleQuickFiltersValueSelect = useCallback( - (field: ExploreQuickFilterField) => { - setSelectedQuickFilters((pre) => { - const data = pre.map((preField) => { - if (preField.key === field.key) { - return field; - } else { - return preField; - } - }); - - handleQuickFiltersChange(data); - - return data; - }); - }, - [setSelectedQuickFilters] - ); - - const clearFilters = useCallback(() => { - setSelectedQuickFilters((pre) => { - const data = pre.map((preField) => { - return { ...preField, value: [] }; - }); - - handleQuickFiltersChange(data); - - return data; - }); - }, [handleQuickFiltersChange, setSelectedQuickFilters]); - - useEffect(() => { - if (filterData?.length === 0) { - const dropdownItems = getAssetsPageQuickFilters(type); - - setFilters( - dropdownItems.map((item) => ({ - ...item, - value: getSelectedValuesFromQuickFilter(item, dropdownItems), - })) - ); - } else { - setFilters(filterData ?? []); - } - }, [filterData, type]); - - useEffect(() => { - const updatedQuickFilters = filters - .filter((filter) => selectedFilter.includes(filter.key)) - .map((selectedFilterItem) => { - const originalFilterItem = selectedQuickFilters?.find( - (filter) => filter.key === selectedFilterItem.key - ); - - return originalFilterItem || selectedFilterItem; - }); - - const newItems = updatedQuickFilters.filter( - (item) => - !selectedQuickFilters.some( - (existingItem) => item.key === existingItem.key - ) - ); - - if (newItems.length > 0) { - setSelectedQuickFilters((prevSelected) => [...prevSelected, ...newItems]); - } - }, [selectedFilter, selectedQuickFilters, filters]); - - return ( - <> - - - - ), - placement: 'bottom', - className: 'asset-tab-delete-notification', - duration: 0, - }); - }; - useEffect(() => { fetchAssets({ index: isEmpty(activeFilter) ? [SearchIndex.ALL] : activeFilter, @@ -861,7 +830,7 @@ const AssetsTabs = forwardRef( refreshAssets() { fetchAssets({ index: isEmpty(activeFilter) ? [SearchIndex.ALL] : activeFilter, - page: currentPage, + page: 1, }); fetchCountsByEntity(); }, @@ -885,12 +854,18 @@ const AssetsTabs = forwardRef( return (
+ data-testid="table-container" + id="asset-tab"> {assetCount > 0 && (
- + +
+ + )}
); } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/GlossaryOverviewTab.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/GlossaryOverviewTab.component.tsx index 0c37cda95ec..a18b850ed68 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/GlossaryOverviewTab.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/GlossaryOverviewTab.component.tsx @@ -83,10 +83,6 @@ const GlossaryOverviewTab = ({ } }, [selectedData, isVersionView]); - const handleTagsUpdate = async (updatedTags: TagLabel[]) => { - setTagsUpdating(updatedTags); - }; - const tags = useMemo( () => isVersionView @@ -98,14 +94,16 @@ const GlossaryOverviewTab = ({ [isVersionView, selectedData] ); + const handleTagsUpdate = async (updatedTags: TagLabel[]) => { + setTagsUpdating(updatedTags); + }; + const handleGlossaryTagUpdateValidationConfirm = async () => { if (selectedData) { await onUpdate({ ...selectedData, tags: tagsUpdatating, }); - - setTagsUpdating(undefined); } }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/assets-tabs.less b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/assets-tabs.less index e7655be5ed1..cab1f8cf9ad 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/assets-tabs.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/assets-tabs.less @@ -81,20 +81,24 @@ } .asset-tab-delete-notification { - background-color: @text-color !important; - box-shadow: none !important; - .ant-notification-notice-icon { - display: none; + &.visible { + .ant-affix { + bottom: 10px !important; + } } - .ant-notification-notice-close { - color: @white !important; - left: 24px; - top: 22px; - width: 20px; - } - .ant-notification-notice-message { - padding-right: 0 !important; - margin-left: 20px !important; - font-size: 14px !important; + + .ant-affix { + border-radius: 10px; + background: #292929; + height: 64px !important; + width: 350px !important; + bottom: -64px !important; + left: 40%; + transform: translateX(-60%); + transition: bottom ease-in 0.5s; + + & > div { + padding: 15px 20px; + } } } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.interface.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.interface.tsx index ef578c85b53..ad8f096a3bf 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.interface.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.interface.tsx @@ -19,3 +19,11 @@ export interface GlossaryUpdateConfirmationModalProps { onCancel: () => void; updatedTags: TagLabel[]; } + +export enum UpdateState { + INITIAL, + VALIDATING, + FAILED, + UPDATATING, + SUCESS, +} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.tsx index e9e9c9e1cb9..93931199ee1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.tsx @@ -11,8 +11,7 @@ * limitations under the License. */ import Icon from '@ant-design/icons'; -import { Button, Modal, Space, Typography } from 'antd'; -import { isEmpty } from 'lodash'; +import { Alert, Button, Modal, Progress, Space, Typography } from 'antd'; import React, { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; @@ -31,7 +30,10 @@ import { getEntityName, } from '../../../utils/EntityUtils'; import Table from '../../common/Table/Table'; -import { GlossaryUpdateConfirmationModalProps } from './GlossaryUpdateConfirmationModal.interface'; +import { + GlossaryUpdateConfirmationModalProps, + UpdateState, +} from './GlossaryUpdateConfirmationModal.interface'; export const GlossaryUpdateConfirmationModal = ({ glossaryTerm, @@ -41,13 +43,12 @@ export const GlossaryUpdateConfirmationModal = ({ }: GlossaryUpdateConfirmationModalProps) => { const [failedStatus, setFailedStatus] = useState(); const [tagError, setTagError] = useState<{ code: number; message: string }>(); - const [tagAdditionConfirmation, setTagAdditionConfirmation] = useState(false); - const [validating, setValidating] = useState(false); + const [updateState, setUpdateState] = useState(UpdateState.INITIAL); const { t } = useTranslation(); const handleUpdateConfirmation = async () => { - setTagAdditionConfirmation(true); - setValidating(true); + setUpdateState(UpdateState.VALIDATING); + try { // dryRun validations so that we can list failures if any const res = await validateTagAddtionToGlossary( @@ -55,16 +56,24 @@ export const GlossaryUpdateConfirmationModal = ({ true ); - if (res.status && res.status === Status.Success) { - await onValidationSuccess(); + if (res.status === Status.Success) { + setUpdateState(UpdateState.UPDATATING); + try { + await onValidationSuccess(); + setUpdateState(UpdateState.SUCESS); + } catch (err) { + // Error + } finally { + setTimeout(onCancel, 500); + } } else { + setUpdateState(UpdateState.FAILED); setFailedStatus(res); } } catch (err) { // error setTagError(err.response?.data); - } finally { - setValidating(false); + setUpdateState(UpdateState.FAILED); } }; @@ -96,81 +105,139 @@ export const GlossaryUpdateConfirmationModal = ({ ]; }, []); + const progress = + updateState === UpdateState.VALIDATING + ? 10 + : updateState === UpdateState.UPDATATING + ? 60 + : 100; + + const data = useMemo(() => { + const footer = ( +
+ + {failedStatus?.numberOfRowsFailed && + `${failedStatus.numberOfRowsFailed} ${t('label.failed')}`} + + +
+ ); + + const progressBar = ( +
+ +
+ ); + + switch (updateState) { + case UpdateState.INITIAL: + return { + footer: null, + content: ( +
+ + + {t('message.tag-update-confirmation')} + + + {t('message.glossary-tag-update-description')}{' '} + + {getEntityName(glossaryTerm)} + + +
+ + + + +
+
+ ), + }; + case UpdateState.VALIDATING: + return { + content: progressBar, + footer: footer, + }; + case UpdateState.FAILED: + return { + content: ( +
+ {failedStatus && ( + <> + record.request?.id} + /> + + + )} + {tagError?.code === ClientErrors.BAD_REQUEST && ( + + )} + + ), + footer: ( +
+ + {failedStatus?.numberOfRowsFailed && + `${failedStatus.numberOfRowsFailed} ${t('label.failed')}`} + + +
+ ), + }; + case UpdateState.UPDATATING: + return { + content: progressBar, + footer: , + }; + case UpdateState.SUCESS: + return { + content: progressBar, + footer: , + }; + } + }, [updateState, failedStatus]); + return ( - - {failedStatus?.numberOfRowsFailed && - `${failedStatus.numberOfRowsFailed} ${t('label.failed')}`} - - - - ) - } + footer={data.footer} title={ - tagAdditionConfirmation + [ + UpdateState.VALIDATING, + UpdateState.FAILED, + UpdateState.UPDATATING, + UpdateState.SUCESS, + ].includes(updateState) ? t('message.glossary-tag-update-modal-title') : undefined } - width={tagAdditionConfirmation ? 750 : undefined} + width={updateState === UpdateState.FAILED ? 750 : undefined} onCancel={onCancel}> - {tagAdditionConfirmation || validating ? ( -
- {!isEmpty(failedStatus?.failedRequest) && !validating && ( - <> -
record.request.id} - /> - - {t('message.glossary-tag-assignement-help-message')} - - - )} - {tagError?.code === ClientErrors.BAD_REQUEST && ( - {tagError.message} - )} - - ) : ( -
- - - {t('message.tag-update-confirmation')} - - - {t('message.glossary-tag-update-description')}{' '} - {getEntityName(glossaryTerm)} - -
- - - - -
-
- )} + {data.content} ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsContainerV2/TagsContainerV2.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsContainerV2/TagsContainerV2.tsx index f8058bdc744..0dfa6fb0d51 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsContainerV2/TagsContainerV2.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsContainerV2/TagsContainerV2.tsx @@ -13,7 +13,7 @@ import { Col, Form, Row, Space, Tooltip, Typography } from 'antd'; import { DefaultOptionType } from 'antd/lib/select'; -import { isEmpty } from 'lodash'; +import { isEmpty, isEqual } from 'lodash'; import { EntityTags } from 'Models'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -104,7 +104,7 @@ const TagsContainerV2 = ({ const handleSave = async (data: DefaultOptionType | DefaultOptionType[]) => { const updatedTags = (data as DefaultOptionType[]).map((tag) => { let tagData: EntityTags = { - tagFQN: tag.value, + tagFQN: typeof tag === 'string' ? tag : tag.value, source: tagType, }; @@ -115,13 +115,16 @@ const TagsContainerV2 = ({ displayName: tag.data?.displayName, description: tag.data?.description, style: tag.data?.style, + labelType: tag.data?.labelType, }; } return tagData; }); - if (onSelectionChange) { + const newTags = updatedTags.map((t) => t.tagFQN); + + if (onSelectionChange && !isEqual(selectedTagsInternal, newTags)) { await onSelectionChange([ ...updatedTags, ...((isGlossaryType diff --git a/openmetadata-ui/src/main/resources/ui/src/constants/constants.ts b/openmetadata-ui/src/main/resources/ui/src/constants/constants.ts index 3db893ed8bf..0b728398984 100644 --- a/openmetadata-ui/src/main/resources/ui/src/constants/constants.ts +++ b/openmetadata-ui/src/main/resources/ui/src/constants/constants.ts @@ -30,6 +30,7 @@ import { export const PRIMERY_COLOR = '#0968da'; export const SECONDARY_COLOR = '#B02AAC'; export const INFO_COLOR = '#2196f3'; +export const ERROR_COLOR = '#ff4c3b'; export const LITE_GRAY_COLOR = '#DBE0EB'; export const TEXT_BODY_COLOR = '#37352F'; export const TEXT_GREY_MUTED = '#757575'; diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json index 291610f1d11..50eb76d36dd 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json @@ -396,6 +396,7 @@ "entity-service": "{{entity}}-Dienst", "entity-type-plural": "{{entity}}-Typen", "entity-version-detail-plural": "Details zu {{entity}}-Versionen", + "error": "Error", "event-publisher-plural": "Ereignisveröffentlicher", "event-type": "Ereignistyp", "every": "Jede/r/s", @@ -1133,6 +1134,7 @@ "username-or-email": "Benutzername oder E-Mail", "valid-condition": "Gültige Bedingung", "validating-condition": "Bedingung validieren...", + "validation-error-plural": "Validation Errors!", "value": "Wert", "value-count": "Wertanzahl", "value-plural": "Werte", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}} hat Sie in einem Kommentar erwähnt.", "user-verified-successfully": "Benutzer erfolgreich verifiziert", "valid-url-endpoint": "Endpunkte sollten gültige URLs sein", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "{{version}} Veröffentlicht <0>Sehen Sie, was es Neues gibt!", "view-deleted-entity": "Alle gelöschten {{entity}}, die zu diesem {{parent}} gehören, anzeigen.", "view-sample-data-entity": "Um Musterdaten anzuzeigen, führen Sie {{entity}} aus. Bitte beachten Sie dieses Dokument, um die <0>{{entity}} zu planen.", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json index a883b3bb513..d34f55a3a73 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json @@ -396,6 +396,7 @@ "entity-service": "{{entity}} Service", "entity-type-plural": "{{entity}} Type", "entity-version-detail-plural": "{{entity}} Version Details", + "error": "Error", "event-publisher-plural": "Event Publishers", "event-type": "Event Type", "every": "Every", @@ -1133,6 +1134,7 @@ "username-or-email": "Username or Email", "valid-condition": "Valid condition", "validating-condition": "Validating the condition...", + "validation-error-plural": "Validation Errors!", "value": "Value", "value-count": "Value Count", "value-plural": "Values", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}} mentioned you in a comment.", "user-verified-successfully": "User Verified Successfully", "valid-url-endpoint": "Endpoints should be valid URL", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "{{version}} Released <0>See What's New!", "view-deleted-entity": "View All the Deleted {{entity}}, which come under this {{parent}}.", "view-sample-data-entity": "To view Sample Data, run the {{entity}}. Please refer to this doc to schedule the <0>{{entity}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json index 66026b7d0ce..7a2e5a889ee 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json @@ -396,6 +396,7 @@ "entity-service": "Servicio de {{entity}}", "entity-type-plural": "{{entity}} Type", "entity-version-detail-plural": "{{entity}} Version Details", + "error": "Error", "event-publisher-plural": "Publicadores de eventos", "event-type": "Tipo de evento", "every": "Cada", @@ -1133,6 +1134,7 @@ "username-or-email": "Nombre de usuario o correo electrónico", "valid-condition": "Condición válida", "validating-condition": "Validando la condición...", + "validation-error-plural": "Validation Errors!", "value": "Valor", "value-count": "Recuento de valor", "value-plural": "Valores", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}} te mencionó en un comentario.", "user-verified-successfully": "Usuario verificado con éxito", "valid-url-endpoint": "Los terminales deben ser URL válidas", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "{{version}} Released <0>See What's New!", "view-deleted-entity": "Ver todas las {{entity}} eliminadas que se encuentran bajo este {{parent}}.", "view-sample-data-entity": "To view Sample Data, run the {{entity}}. Please refer to this doc to schedule the <0>{{entity}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json index ee1ba174604..3fbc2d9bb39 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json @@ -396,6 +396,7 @@ "entity-service": "Service de {{entity}}", "entity-type-plural": "{{entity}} Types", "entity-version-detail-plural": "Détails des Versions de {{entity}}", + "error": "Error", "event-publisher-plural": "Publicateurs d'Événements", "event-type": "Type d'Événement", "every": "Chaque", @@ -1133,6 +1134,7 @@ "username-or-email": "Nom d'Utilisateur ou Email", "valid-condition": "Condition Valide", "validating-condition": "Validation de la Condition...", + "validation-error-plural": "Validation Errors!", "value": "Valeur", "value-count": "Décompte de la Valeur", "value-plural": "Valeurs", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}} vous a mentionné dans un commentaire.", "user-verified-successfully": "L'utilisateur a été vérifié avec succès", "valid-url-endpoint": "Les points de terminaison doivent être une URL valide", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "{{version}} publié essayez maintenant !", "view-deleted-entity": "Afficher toutes les {{entity}} supprimées qui relèvent de ce {{parent}}.", "view-sample-data-entity": "Pour afficher des données d'exemple, exécutez {{entity}}. Veuillez vous référer à ce document pour planifier {{entity}}.", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json index 19fda7a46d3..a4907d30b05 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json @@ -396,6 +396,7 @@ "entity-service": "{{entity}}サービス", "entity-type-plural": "{{entity}} Type", "entity-version-detail-plural": "{{entity}} Version Details", + "error": "Error", "event-publisher-plural": "イベントの作成者", "event-type": "イベントの種類", "every": "Every", @@ -1133,6 +1134,7 @@ "username-or-email": "ユーザ名あるいはEmailアドレス", "valid-condition": "正しい条件", "validating-condition": "条件を検証中...", + "validation-error-plural": "Validation Errors!", "value": "値", "value-count": "値の数", "value-plural": "値", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}}がコメントであなたにメンションしました。", "user-verified-successfully": "ユーザ認証に成功しました", "valid-url-endpoint": "エンドポイントは有効なURLでなければなりません", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "{{version}} Released <0>See What's New!", "view-deleted-entity": "View All the Deleted {{entity}}, which come under this {{parent}}.", "view-sample-data-entity": "To view Sample Data, run the {{entity}}. Please refer to this doc to schedule the <0>{{entity}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json index ff1c5e1f536..a62d030fccb 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json @@ -396,6 +396,7 @@ "entity-service": "Serviço de {{entity}}", "entity-type-plural": "Tipo de {{entity}}", "entity-version-detail-plural": "Detalhes da Versão de {{entity}}", + "error": "Error", "event-publisher-plural": "Publicadores de Eventos", "event-type": "Tipo de Evento", "every": "Cada", @@ -1133,6 +1134,7 @@ "username-or-email": "Nome de Usuário ou Email", "valid-condition": "Condição Válida", "validating-condition": "Validando a condição...", + "validation-error-plural": "Validation Errors!", "value": "Valor", "value-count": "Contagem de Valor", "value-plural": "Valores", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}} mencionou você em um comentário.", "user-verified-successfully": "Usuário verificado com sucesso", "valid-url-endpoint": "Os endpoints devem ser URLs válidas", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "{{version}} Lançada <0>Veja o que há de novo!", "view-deleted-entity": "Visualize todos os {{entity}} excluídos, que fazem parte deste {{parent}}.", "view-sample-data-entity": "Para visualizar os Dados de Amostra, execute o {{entity}}. Consulte este documento para agendar o <0>{{entity}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json index eb4205441c6..c5f016ba5b6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json @@ -396,6 +396,7 @@ "entity-service": "Сервис {{entity}}", "entity-type-plural": "Тип {{entity}}", "entity-version-detail-plural": "{{entity}} Version Details", + "error": "Error", "event-publisher-plural": "Издатели события", "event-type": "Тип события", "every": "Каждый", @@ -1133,6 +1134,7 @@ "username-or-email": "Имя пользователя или Email", "valid-condition": "Действительное условие", "validating-condition": "Проверка условия...", + "validation-error-plural": "Validation Errors!", "value": "Значение", "value-count": "Количество значений", "value-plural": "Значения", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}} упомянул вас в комментарии.", "user-verified-successfully": "Пользователь успешно проверен", "valid-url-endpoint": "Конечные точки должны быть действительным URL", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "Выпущена {{версия}} <0>Посмотрите, что нового!", "view-deleted-entity": "Просмотреть все удаленные {{entity}}, относящиеся к этому {{parent}}.", "view-sample-data-entity": "Чтобы просмотреть образцы данных, запустите {{entity}}. Пожалуйста, обратитесь к этому документу, чтобы запланировать <0>{{entity}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json index a2feaf2f6d3..3ff1c2cbf8e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json @@ -396,6 +396,7 @@ "entity-service": "{{entity}}服务", "entity-type-plural": "{{entity}}类型", "entity-version-detail-plural": "{{entity}}版本详情", + "error": "Error", "event-publisher-plural": "事件发布者", "event-type": "事件类型", "every": "每个", @@ -1133,6 +1134,7 @@ "username-or-email": "用户名或电子邮箱", "valid-condition": "有效条件", "validating-condition": "正在验证条件...", + "validation-error-plural": "Validation Errors!", "value": "值", "value-count": "值数量", "value-plural": "值", @@ -1628,6 +1630,7 @@ "user-mentioned-in-comment": "{{user}}在评论中提到了您", "user-verified-successfully": "用户验证成功", "valid-url-endpoint": "端点应该是有效的 URL", + "validation-error-assets": "Please examine all your assets that are being added", "version-released-try-now": "查看新版本 {{version}} 的新特性!", "view-deleted-entity": "查看所有被删除的{{entity}},隶属于该{{parent}}", "view-sample-data-entity": "要查看样本数据,请运行{{entity}}。您还可以前往查看任务调度相关的信息<0>{{entity}}。", diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/Glossary/GlossaryPage/GlossaryPage.component.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/Glossary/GlossaryPage/GlossaryPage.component.tsx index d594db19526..0efe3562d6c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/Glossary/GlossaryPage/GlossaryPage.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/Glossary/GlossaryPage/GlossaryPage.component.tsx @@ -305,9 +305,12 @@ const GlossaryPage = () => { .finally(() => setDeleteStatus(LOADING_STATE.INITIAL)); }; - const handleAssetClick = (asset?: EntityDetailsObjectInterface) => { - setPreviewAsset(asset); - }; + const handleAssetClick = useCallback( + (asset?: EntityDetailsObjectInterface) => { + setPreviewAsset(asset); + }, + [] + ); if (isLoading) { return ; diff --git a/openmetadata-ui/src/main/resources/ui/src/setupTests.js b/openmetadata-ui/src/main/resources/ui/src/setupTests.js index ba9a5ce0030..73e10eeb45c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/setupTests.js +++ b/openmetadata-ui/src/main/resources/ui/src/setupTests.js @@ -103,4 +103,4 @@ jest.mock('react-i18next', () => ({ jest.mock('./utils/ToastUtils', () => ({ showErrorToast: jest.fn(), -})); \ No newline at end of file +})); diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/ApplicationUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/ApplicationUtils.tsx index dbd814d33cf..fa9ad893160 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/ApplicationUtils.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/utils/ApplicationUtils.tsx @@ -15,15 +15,20 @@ import { Status } from '../generated/entity/applications/appRunRecord'; import { PipelineState } from '../generated/entity/services/ingestionPipelines/ingestionPipeline'; export const getStatusTypeForApplication = (status: Status) => { - if (status === Status.Failed) { - return StatusType.Failure; - } else if (status === Status.Success) { - return StatusType.Success; - } else if (status === Status.Running) { - return StatusType.Warning; - } + switch (status) { + case Status.Failed: + return StatusType.Failure; - return StatusType.Failure; + case Status.Success: + case Status.Completed: + return StatusType.Success; + + case Status.Running: + return StatusType.Warning; + + default: + return StatusType.Failure; + } }; export const getStatusFromPipelineState = (status: PipelineState) => {