+
{selectedItems && selectedItems.size > 1 && (
-
- {selectedItems.size} {t('label.selected-lowercase')}
+
+ {selectedItems.size} {t('label.items-selected-lowercase')}
)}
-
+
),
placement: 'bottom',
@@ -880,12 +814,12 @@ const AssetsTabs = forwardRef(
index: isEmpty(activeFilter) ? [SearchIndex.ALL] : activeFilter,
page: currentPage,
});
- }, [activeFilter, currentPage, pageSize, searchValue]);
+ }, [activeFilter, currentPage, pageSize, searchValue, quickFilterQuery]);
useEffect(() => {
- const dropdownItems = getAssetsPageQuickFilters();
+ const dropdownItems = getAssetsPageQuickFilters(type);
- setSelectedQuickFilters(
+ setFilters(
dropdownItems.map((item) => ({
...item,
value: getSelectedValuesFromQuickFilter(
@@ -897,6 +831,32 @@ const AssetsTabs = forwardRef(
);
}, [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]);
+
useImperativeHandle(ref, () => ({
refreshAssets() {
fetchAssets({
@@ -926,28 +886,48 @@ const AssetsTabs = forwardRef(
-
-
-
-
-
-
-
-
+ {assetCount > 0 && (
+
+
+
+
+ } size="small" type="primary" />
+
+
+
+
+
+
+
+
+
+ {quickFilterQuery && (
+
+ {t('label.clear-entity', {
+ entity: '',
+ })}
+
+ )}
+
+
+
+ )}
{isLoading || isCountLoading ? (
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 30a0336e952..0c37cda95ec 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
@@ -28,6 +28,7 @@ import { OperationPermission } from '../../../PermissionProvider/PermissionProvi
import TagsContainerV2 from '../../../Tag/TagsContainerV2/TagsContainerV2';
import { DisplayType } from '../../../Tag/TagsViewer/TagsViewer.interface';
import GlossaryDetailsRightPanel from '../../GlossaryDetailsRightPanel/GlossaryDetailsRightPanel.component';
+import { GlossaryUpdateConfirmationModal } from '../../GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal';
import GlossaryTermReferences from './GlossaryTermReferences';
import GlossaryTermSynonyms from './GlossaryTermSynonyms';
import RelatedTerms from './RelatedTerms';
@@ -51,6 +52,7 @@ const GlossaryOverviewTab = ({
}: Props) => {
const [isDescriptionEditable, setIsDescriptionEditable] =
useState(false);
+ const [tagsUpdatating, setTagsUpdating] = useState();
const onDescriptionUpdate = async (updatedHTML: string) => {
if (selectedData.description !== updatedHTML) {
@@ -82,14 +84,7 @@ const GlossaryOverviewTab = ({
}, [selectedData, isVersionView]);
const handleTagsUpdate = async (updatedTags: TagLabel[]) => {
- if (updatedTags) {
- const updatedData = {
- ...selectedData,
- tags: updatedTags,
- };
-
- onUpdate(updatedData);
- }
+ setTagsUpdating(updatedTags);
};
const tags = useMemo(
@@ -103,6 +98,17 @@ const GlossaryOverviewTab = ({
[isVersionView, selectedData]
);
+ const handleGlossaryTagUpdateValidationConfirm = async () => {
+ if (selectedData) {
+ await onUpdate({
+ ...selectedData,
+ tags: tagsUpdatating,
+ });
+
+ setTagsUpdating(undefined);
+ }
+ };
+
return (
+ {tagsUpdatating && (
+ setTagsUpdating(undefined)}
+ onValidationSuccess={handleGlossaryTagUpdateValidationConfirm}
+ />
+ )}
);
};
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 489d473ffbf..e7655be5ed1 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
@@ -79,3 +79,22 @@
}
}
}
+
+.asset-tab-delete-notification {
+ background-color: @text-color !important;
+ box-shadow: none !important;
+ .ant-notification-notice-icon {
+ display: none;
+ }
+ .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;
+ }
+}
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
new file mode 100644
index 00000000000..ef578c85b53
--- /dev/null
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.interface.tsx
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2023 Collate.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { GlossaryTerm } from '../../../generated/entity/data/glossaryTerm';
+import { TagLabel } from '../../../generated/entity/data/table';
+
+export interface GlossaryUpdateConfirmationModalProps {
+ glossaryTerm: GlossaryTerm;
+ onValidationSuccess: (() => void) | (() => Promise);
+ onCancel: () => void;
+ updatedTags: TagLabel[];
+}
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.test.tsx
new file mode 100644
index 00000000000..1cd935adfa3
--- /dev/null
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.test.tsx
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2023 Collate.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { act, fireEvent, render } from '@testing-library/react';
+import React from 'react';
+import { GlossaryTerm } from '../../../generated/entity/data/glossaryTerm';
+import { GlossaryUpdateConfirmationModal } from './GlossaryUpdateConfirmationModal';
+
+const mockOnCancel = jest.fn();
+const mockOnValidationSuccess = jest.fn();
+const mockValidateTagAddtionToGlossary = jest.fn().mockResolvedValue({});
+
+jest.mock('../../../rest/glossaryAPI', () => ({
+ validateTagAddtionToGlossary: mockValidateTagAddtionToGlossary,
+}));
+
+jest.mock('../../../utils/EntityUtils', () => ({
+ getEntityLinkFromType: jest.fn(),
+ getEntityName: jest.fn(),
+}));
+
+jest.mock('../../common/Table/Table', () => {
+ return jest.fn();
+});
+
+describe('GlossaryUpdateConfirmationModal component', () => {
+ it('should render confirmation screen', async () => {
+ const { findByText } = render(
+
+ );
+
+ expect(await findByText('label.no-comma-cancel')).toBeInTheDocument();
+ expect(await findByText('label.yes-comma-confirm')).toBeInTheDocument();
+ expect(
+ await findByText('message.tag-update-confirmation')
+ ).toBeInTheDocument();
+ expect(
+ await findByText('message.glossary-tag-update-description')
+ ).toBeInTheDocument();
+ });
+
+ it('should call onCancel on clicking on no, cancel button', async () => {
+ const { findByText } = render(
+
+ );
+
+ fireEvent.click(await findByText('label.no-comma-cancel'));
+
+ expect(mockOnCancel).toHaveBeenCalled();
+ });
+
+ it.skip('should call validation api on clicking on yes, confirm button', async () => {
+ const { findByText } = render(
+
+ );
+
+ await act(async () => {
+ fireEvent.click(await findByText('label.yes-comma-confirm'));
+ });
+
+ expect(mockValidateTagAddtionToGlossary).toHaveBeenCalledWith(
+ { tags: [] },
+ true
+ );
+ });
+});
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
new file mode 100644
index 00000000000..e9e9c9e1cb9
--- /dev/null
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryUpdateConfirmationModal/GlossaryUpdateConfirmationModal.tsx
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2023 Collate.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import Icon from '@ant-design/icons';
+import { Button, Modal, Space, Typography } from 'antd';
+import { isEmpty } from 'lodash';
+import React, { useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Link } from 'react-router-dom';
+import { ReactComponent as ExclamationIcon } from '../../../assets/svg/ic-exclamation-circle.svg';
+import { ClientErrors } from '../../../enums/axios.enum';
+import { EntityType } from '../../../enums/entity.enum';
+import { GlossaryTerm } from '../../../generated/entity/data/glossaryTerm';
+import { EntityReference } from '../../../generated/entity/type';
+import {
+ BulkOperationResult,
+ Status,
+} from '../../../generated/type/bulkOperationResult';
+import { validateTagAddtionToGlossary } from '../../../rest/glossaryAPI';
+import {
+ getEntityLinkFromType,
+ getEntityName,
+} from '../../../utils/EntityUtils';
+import Table from '../../common/Table/Table';
+import { GlossaryUpdateConfirmationModalProps } from './GlossaryUpdateConfirmationModal.interface';
+
+export const GlossaryUpdateConfirmationModal = ({
+ glossaryTerm,
+ onValidationSuccess,
+ onCancel,
+ updatedTags,
+}: GlossaryUpdateConfirmationModalProps) => {
+ const [failedStatus, setFailedStatus] = useState();
+ const [tagError, setTagError] = useState<{ code: number; message: string }>();
+ const [tagAdditionConfirmation, setTagAdditionConfirmation] = useState(false);
+ const [validating, setValidating] = useState(false);
+ const { t } = useTranslation();
+
+ const handleUpdateConfirmation = async () => {
+ setTagAdditionConfirmation(true);
+ setValidating(true);
+ try {
+ // dryRun validations so that we can list failures if any
+ const res = await validateTagAddtionToGlossary(
+ { ...glossaryTerm, tags: updatedTags } as GlossaryTerm,
+ true
+ );
+
+ if (res.status && res.status === Status.Success) {
+ await onValidationSuccess();
+ } else {
+ setFailedStatus(res);
+ }
+ } catch (err) {
+ // error
+ setTagError(err.response?.data);
+ } finally {
+ setValidating(false);
+ }
+ };
+
+ const tagsColumn = useMemo(() => {
+ return [
+ {
+ title: t('label.asset-plural'),
+ dataIndex: 'request',
+ key: 'request',
+ render: (record: EntityReference) => (
+
+ {record.fullyQualifiedName}
+
+ ),
+ },
+ {
+ title: t('label.failure-reason'),
+ dataIndex: 'message',
+ key: 'message',
+ render: (error: string) => (
+ {error}
+ ),
+ },
+ ];
+ }, []);
+
+ return (
+
+
+ {failedStatus?.numberOfRowsFailed &&
+ `${failedStatus.numberOfRowsFailed} ${t('label.failed')}`}
+
+
+
+ )
+ }
+ title={
+ tagAdditionConfirmation
+ ? t('message.glossary-tag-update-modal-title')
+ : undefined
+ }
+ width={tagAdditionConfirmation ? 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)}
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.component.tsx
index ff3df3f2ee7..a7ed2805b69 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.component.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.component.tsx
@@ -14,19 +14,18 @@ import { Tag, Tooltip, Typography } from 'antd';
import classNames from 'classnames';
import React, { useCallback, useMemo } from 'react';
import { useHistory } from 'react-router-dom';
-import { FQN_SEPARATOR_CHAR } from '../../../constants/char.constants';
-import { ROUTES } from '../../../constants/constants';
-import { TagSource } from '../../../generated/type/tagLabel';
-import { getTagDisplay, getTagTooltip } from '../../../utils/TagsUtils';
-
import { ReactComponent as IconTerm } from '../../../assets/svg/book.svg';
import { ReactComponent as IconTag } from '../../../assets/svg/classification.svg';
import { ReactComponent as PlusIcon } from '../../../assets/svg/plus-primary.svg';
+import { FQN_SEPARATOR_CHAR } from '../../../constants/char.constants';
+import { ROUTES } from '../../../constants/constants';
import { TAG_START_WITH } from '../../../constants/Tag.constants';
+import { TagSource } from '../../../generated/type/tagLabel';
import { reduceColorOpacity } from '../../../utils/CommonUtils';
import { getEntityName } from '../../../utils/EntityUtils';
import Fqn from '../../../utils/Fqn';
import { getEncodedFqn } from '../../../utils/StringsUtils';
+import { getTagDisplay, getTagTooltip } from '../../../utils/TagsUtils';
import { TagsV1Props } from './TagsV1.interface';
import './tagsV1.less';
@@ -37,6 +36,7 @@ const TagsV1 = ({
showOnlyName = false,
isVersionPage = false,
tagProps,
+ tooltipOverride,
}: TagsV1Props) => {
const history = useHistory();
const color = useMemo(
@@ -153,7 +153,7 @@ const TagsV1 = ({
const addTagChip = useMemo(
() => (
}>
{tagChip}
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.interface.ts
index 407ef452087..cee867a81be 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.interface.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsV1/TagsV1.interface.ts
@@ -22,4 +22,6 @@ export type TagsV1Props = {
className?: string;
isVersionPage?: boolean;
tagProps?: TagProps;
+ disabled?: boolean;
+ tooltipOverride?: string;
};
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsViewer/TagsViewer.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsViewer/TagsViewer.tsx
index bdbafd0e912..0bf07b71bf0 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsViewer/TagsViewer.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/components/Tag/TagsViewer/TagsViewer.tsx
@@ -46,6 +46,7 @@ const TagsViewer: FunctionComponent = ({
{ 'diff-removed': tag?.removed }
)}
isVersionPage={tag?.added || tag?.removed}
+ key={tag.tagFQN}
showOnlyName={tag.source === TagSource.Glossary}
startWith={TAG_START_WITH.SOURCE_ICON}
tag={tag}
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/OwnerLabel/OwnerLabel.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/OwnerLabel/OwnerLabel.component.tsx
index 42bb97740d9..663668fda30 100644
--- a/openmetadata-ui/src/main/resources/ui/src/components/common/OwnerLabel/OwnerLabel.component.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/components/common/OwnerLabel/OwnerLabel.component.tsx
@@ -63,14 +63,16 @@ export const OwnerLabel = ({
style={{ fontSize: '18px' }}
/>
) : (
-
+
);
}, [owner]);
diff --git a/openmetadata-ui/src/main/resources/ui/src/constants/AdvancedSearch.constants.ts b/openmetadata-ui/src/main/resources/ui/src/constants/AdvancedSearch.constants.ts
index fed8b06d13a..503c13a63d2 100644
--- a/openmetadata-ui/src/main/resources/ui/src/constants/AdvancedSearch.constants.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/constants/AdvancedSearch.constants.ts
@@ -171,6 +171,29 @@ export const DATA_PRODUCT_DROPDOWN_ITEMS = [
},
];
+export const DOMAIN_DATAPRODUCT_DROPDOWN_ITEMS = [
+ {
+ label: t('label.owner'),
+ key: 'owner.displayName.keyword',
+ },
+ {
+ label: t('label.tag'),
+ key: 'tags.tagFQN',
+ },
+ {
+ label: t('label.tier'),
+ key: 'tier.tagFQN',
+ },
+ {
+ label: t('label.service'),
+ key: 'service.displayName.keyword',
+ },
+ {
+ label: t('label.service-type'),
+ key: 'serviceType',
+ },
+];
+
export const ALL_DROPDOWN_ITEMS = [
...COMMON_DROPDOWN_ITEMS,
...TABLE_DROPDOWN_ITEMS,
diff --git a/openmetadata-ui/src/main/resources/ui/src/enums/Explore.enum.ts b/openmetadata-ui/src/main/resources/ui/src/enums/Explore.enum.ts
index ff3e1035df7..1090619ab7a 100644
--- a/openmetadata-ui/src/main/resources/ui/src/enums/Explore.enum.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/enums/Explore.enum.ts
@@ -14,6 +14,7 @@
export enum QueryFilterFieldsEnum {
MUST = 'must',
SHOULD = 'should',
+ MUST_NOT = 'must_not',
}
export enum ExplorePageTabs {
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 2f9d65743d1..291610f1d11 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
@@ -258,6 +258,7 @@
"data-model-plural": "Datenmodelle",
"data-model-type": "Datenmodelltyp",
"data-product": "Datenprodukt",
+ "data-product-lowercase": "data product",
"data-product-plural": "Datenprodukte",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "Datenverhältnisse",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "Fehlgeschlagen",
"failure-context": "Fehlerkontext",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "Funktion",
"feature-lowercase": "funktion",
@@ -529,6 +531,7 @@
"invalid-condition": "Ungültige Bedingung",
"invalid-name": "Ungültiger Name",
"is-ready-for-preview": "ist bereit zur Vorschau",
+ "items-selected-lowercase": "items selected",
"january": "Januar",
"job-lowercase": "aufgabe",
"join": "Beitreten",
@@ -659,6 +662,7 @@
"new-test-suite": "Neue Test-Suite",
"next": "Nächster",
"no": "Nein",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "Keine Datenanlagen gefunden für",
"no-data-found": "Keine Daten gefunden",
"no-description": "Keine Beschreibung",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "Ja",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Gestern",
"your-entity": "Ihre {{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "Nachricht löschen?",
"delete-team-message": "Alle Teams unter \"{{teamName}}\" werden ebenfalls {{deleteType}} gelöscht.",
"delete-webhook-permanently": "Möchten Sie den Webhook \"{{webhookName}}\" dauerhaft löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "Durch Deaktivieren der Klassifizierung können Sie nicht mehr nach dieser suchen oder sie mit zugeordneten Tags einer Entität zuweisen.",
"disabled-classification-actions-message": "Sie können diese Aktion auf deaktivierten Klassifikationen nicht ausführen.",
@@ -1356,6 +1362,9 @@
"find-in-table": "In Tabelle suchen",
"fosters-collaboration-among-producers-and-consumers": "Setzen Sie Unternehmensziele und KPIs, um die Datenkultur Ihres Unternehmens proaktiv voranzutreiben. Fördern Sie eine Kultur kontinuierlicher Verbesserung mit rechtzeitigen Berichten zur Überwachung der Datenqualität.",
"get-started-with-open-metadata": "Erste Schritte mit OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Jeder Begriff im Glossar hat eine eindeutige Definition. Neben der Definition des Standardbegriffs für ein Konzept können auch Synonyme sowie verwandte Begriffe (z. B. übergeordnete und untergeordnete Begriffe) angegeben werden. Es können Referenzen zu den Assets hinzugefügt werden, die sich auf die Begriffe beziehen. Neue Begriffe können dem Glossar hinzugefügt oder aktualisiert werden. Die Glossarbegriffe können von bestimmten Benutzern überprüft werden, die die Begriffe akzeptieren oder ablehnen können.",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "Zurück zur Anmeldeseite",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "Sie haben die Tour erfolgreich abgeschlossen.",
"synonym-placeholder": "Um ein Synonym hinzuzufügen, geben Sie es einfach ein und drücken Sie Enter",
"system-tag-delete-disable-message": "Das Löschen von systemgenerierten Tags ist nicht zulässig. Sie können versuchen, den Tag stattdessen zu deaktivieren.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Machen Sie eine Produkttour, um loszulegen!",
"team-moved-success": "Team erfolgreich verschoben!",
"team-no-asset": "Ihr Team hat keine Vermögenswerte.",
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 9020624b2a4..a883b3bb513 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
@@ -258,6 +258,7 @@
"data-model-plural": "Data Models",
"data-model-type": "Data Model Type",
"data-product": "Data Product",
+ "data-product-lowercase": "data product",
"data-product-plural": "Data Products",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "Data Proportions",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "Failed",
"failure-context": "Failure Context",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "Feature",
"feature-lowercase": "feature",
@@ -529,6 +531,7 @@
"invalid-condition": "Invalid condition",
"invalid-name": "Invalid Name",
"is-ready-for-preview": "is ready for preview",
+ "items-selected-lowercase": "items selected",
"january": "January",
"job-lowercase": "job",
"join": "Join",
@@ -659,6 +662,7 @@
"new-test-suite": "New Test Suite",
"next": "Next",
"no": "No",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "No data assets found for",
"no-data-found": "No data found",
"no-description": "No description",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "Yes",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Yesterday",
"your-entity": "Your {{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "Delete Message?",
"delete-team-message": "Any teams under \"{{teamName}}\" will be {{deleteType}} deleted as well.",
"delete-webhook-permanently": "You want to delete webhook {{webhookName}} permanently? This action cannot be reverted.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "By disabling classification, you will not be able to search by, or assign associated tags to any entity.",
"disabled-classification-actions-message": "You can not perform this action on disabled classifications.",
@@ -1356,6 +1362,9 @@
"find-in-table": "Find in table",
"fosters-collaboration-among-producers-and-consumers": "Set organizational goals and KPIs to proactively drive the data culture of your company. Foster a culture of continuous improvement with timely reports to monitor data health.",
"get-started-with-open-metadata": "Get started with OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Every term in the glossary has a unique definition. Along with defining the standard term for a concept, the synonyms as well as related terms (for e.g., parent and child terms) can be specified. References can be added to the assets related to the terms. New terms can be added or updated to the Glossary. The glossary terms can be reviewed by certain users, who can accept or reject the terms.",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "Go back to Login page",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "You’ve successfully completed the tour.",
"synonym-placeholder": "To add a synonym, simply type it in and press Enter",
"system-tag-delete-disable-message": "Deleting a system generated tags is not allowed. You can try disabling the tag instead.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Take a product tour to get started!",
"team-moved-success": "Team moved successfully!",
"team-no-asset": "Your team does not have any assets.",
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 bf9800d020a..66026b7d0ce 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
@@ -258,6 +258,7 @@
"data-model-plural": "Data Models",
"data-model-type": "Data Model Type",
"data-product": "Data Product",
+ "data-product-lowercase": "data product",
"data-product-plural": "Data Products",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "Data Proportions",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "Falló",
"failure-context": "Contexto del error",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "Funcionalidad",
"feature-lowercase": "funcionalidad",
@@ -529,6 +531,7 @@
"invalid-condition": "Condición inválida",
"invalid-name": "Nombre inválido",
"is-ready-for-preview": "está listo para previsualización",
+ "items-selected-lowercase": "items selected",
"january": "Enero",
"job-lowercase": "trabajo",
"join": "Unirse",
@@ -659,6 +662,7 @@
"new-test-suite": "Nueva Suite de Pruebas",
"next": "Siguiente",
"no": "No",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "No data assets found for",
"no-data-found": "No se encontraron datos",
"no-description": "Sin descripción",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "Sí",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Yesterday",
"your-entity": "Tu {{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "¿Eliminar mensaje?",
"delete-team-message": "Cualquier equipo bajo \"{{teamName}}\" también será {{deleteType}} eliminado.",
"delete-webhook-permanently": "¿Quieres eliminar permanentemente el webhook {{webhookName}}? Esta acción no se puede revertir.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "Option to disable classifications, You won't be able to see associated tags within application",
"disabled-classification-actions-message": "You can not perform this action on disabled classifications.",
@@ -1356,6 +1362,9 @@
"find-in-table": "Buscar en la tabla",
"fosters-collaboration-among-producers-and-consumers": "Fomenta la colaboración entre los productores y consumidores de datos.",
"get-started-with-open-metadata": "Empezar con OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Cada término en el glosario tiene una definición única. Además de definir el término estándar para un concepto, se pueden especificar sinónimos y términos relacionados (por ejemplo, términos padre e hijo). Se pueden agregar referencias a los activos relacionados con los términos. Se pueden agregar o actualizar nuevos términos al glosario. Los términos del glosario pueden ser revisados por ciertos usuarios, quienes pueden aceptar o rechazar los términos.",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "Volver a la página de inicio de sesión",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "Has completado el recorrido con éxito.",
"synonym-placeholder": "To add a synonym, simply type it in and press Enter",
"system-tag-delete-disable-message": "Deleting a system generated tags is not allowed. You can try disabling the tag instead.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Take a product tour to get started!",
"team-moved-success": "¡Equipo movido con éxito!",
"team-no-asset": "Tu equipo no tiene ningún activo.",
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 3df7e4911a9..ee1ba174604 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
@@ -258,6 +258,7 @@
"data-model-plural": "Modèles de Données",
"data-model-type": "Type de Modèle de Données",
"data-product": "Produit de Données",
+ "data-product-lowercase": "data product",
"data-product-plural": "Produits de Données",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "Proportions des Données",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "Échec",
"failure-context": "Contexte de l'Échec",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "Fonctionnalité",
"feature-lowercase": "fonctionnalité",
@@ -529,6 +531,7 @@
"invalid-condition": "Condition Invalide",
"invalid-name": "Nom Invalide",
"is-ready-for-preview": "est prêt à être prévisualisé",
+ "items-selected-lowercase": "items selected",
"january": "Janvier",
"job-lowercase": "tâche",
"join": "Rejoindre",
@@ -659,6 +662,7 @@
"new-test-suite": "Nouvel Ensemble de Tests",
"next": "Suivant",
"no": "Non",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "Aucun actif de données trouvé pour",
"no-data-found": "Aucune donnée trouvée",
"no-description": "Aucune description",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "Oui",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Hier",
"your-entity": "Votre {{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "Supprimer le Message ?",
"delete-team-message": "N'importe quelle équipe sous \"{{teamName}}\" sera {{deleteType}} supprimée aussi.",
"delete-webhook-permanently": "Vous voulez supprimer le webhook {{webhookName}} de manière permanente ? Cette action ne peut pas être annulée.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "Option to disable classifications, You won't be able to see associated tags within the application",
"disabled-classification-actions-message": "You cannot perform this action on disabled classifications.",
@@ -1356,6 +1362,9 @@
"find-in-table": "Trouver dans la table",
"fosters-collaboration-among-producers-and-consumers": "Encouragez la collaborations entre les consommateurs et producteurs de données",
"get-started-with-open-metadata": "Commencez votre Journée avec OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Chaque terme du glossaire a une définition unique. En plus de définir le terme standard pour un concept, les synonymes ainsi que les termes associés (par exemple, les termes parent et enfant) peuvent être spécifiés. Des références peuvent être ajoutées aux actifs liés aux termes. De nouveaux termes peuvent être ajoutés ou mis à jour dans le glossaire. Les termes du glossaire peuvent être examinés par certains utilisateurs, qui peuvent accepter ou rejeter les termes.",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "Retour à la page d'accueil",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "Vous avez fini la visite avec succès.",
"synonym-placeholder": "Pour ajouter un synonyme, tapez-le et appuyez sur Entrée",
"system-tag-delete-disable-message": "Deleting a system generated tags is not allowed. You can try disabling the tag instead.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Faites une visite guidée pour vous lancer!",
"team-moved-success": "L'équipe a été déplacée avec succès !",
"team-no-asset": "Votre équipe n'a pas de ressources de données",
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 e5f14782b39..19fda7a46d3 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
@@ -258,6 +258,7 @@
"data-model-plural": "Data Models",
"data-model-type": "Data Model Type",
"data-product": "Data Product",
+ "data-product-lowercase": "data product",
"data-product-plural": "Data Products",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "Data Proportions",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "失敗",
"failure-context": "Failure Context",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "Feature",
"feature-lowercase": "feature",
@@ -529,6 +531,7 @@
"invalid-condition": "不正な条件",
"invalid-name": "不正な名称",
"is-ready-for-preview": "はプレビューの準備ができました",
+ "items-selected-lowercase": "items selected",
"january": "1月",
"job-lowercase": "ジョブ",
"join": "参加",
@@ -659,6 +662,7 @@
"new-test-suite": "新しいテストスイート",
"next": "次へ",
"no": "いいえ",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "No data assets found for",
"no-data-found": "データが見つかりません",
"no-description": "説明がありません",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "はい",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Yesterday",
"your-entity": "あなたの{{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "このメッセージを削除しますか?",
"delete-team-message": "Any teams under \"{{teamName}}\" will be {{deleteType}} deleted as well.",
"delete-webhook-permanently": "You want to delete webhook {{webhookName}} permanently? This action cannot be reverted.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "Option to disable classifications, You won't be able to see associated tags within application",
"disabled-classification-actions-message": "You can not perform this action on disabled classifications.",
@@ -1356,6 +1362,9 @@
"find-in-table": "テーブルで探す",
"fosters-collaboration-among-producers-and-consumers": "Fosters collaboration among the producers and consumers of data.",
"get-started-with-open-metadata": "Get started with OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Every term in the glossary has a unique definition. Along with defining the standard term for a concept, the synonyms as well as related terms (for e.g., parent and child terms) can be specified. References can be added to the assets related to the terms. New terms can be added or updated to the Glossary. The glossary terms can be reviewed by certain users, who can accept or reject the terms.",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "ログインページに戻る",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "あなたは無事ツアーを終了しました。",
"synonym-placeholder": "To add a synonym, simply type it in and press Enter",
"system-tag-delete-disable-message": "Deleting a system generated tags is not allowed. You can try disabling the tag instead.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Take a product tour to get started!",
"team-moved-success": "チームの移動が成功しました!",
"team-no-asset": "あなたのチームはアセットを持っていません。",
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 97ec82d43b1..ff1c5e1f536 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
@@ -258,6 +258,7 @@
"data-model-plural": "Modelos de Dados",
"data-model-type": "Tipo de Modelo de Dados",
"data-product": "Produto de Dados",
+ "data-product-lowercase": "data product",
"data-product-plural": "Produtos de Dados",
"data-profiler-metrics": "Métricas do Examinador de Dados",
"data-proportion-plural": "Proporções de Dados",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Expandir OpenMetadata",
"failed": "Falhou",
"failure-context": "Contexto de Falha",
+ "failure-reason": "Failure Reason",
"favicon-url": "URL do Favicon",
"feature": "Recurso",
"feature-lowercase": "recurso",
@@ -529,6 +531,7 @@
"invalid-condition": "Condição Inválida",
"invalid-name": "Nome Inválido",
"is-ready-for-preview": "está pronto para visualização",
+ "items-selected-lowercase": "items selected",
"january": "Janeiro",
"job-lowercase": "trabalho",
"join": "Juntar",
@@ -659,6 +662,7 @@
"new-test-suite": "Novo Conjunto de Testes",
"next": "Próximo",
"no": "Não",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "Nenhum ativo de dados encontrado para",
"no-data-found": "Nenhum dado encontrado",
"no-description": "Sem descrição",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Fluxos de Trabalho",
"yes": "Sim",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Ontem",
"your-entity": "Sua {{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "Excluir Mensagem?",
"delete-team-message": "Qualquer equipe sob \"{{teamName}}\" será {{deleteType}} excluída também.",
"delete-webhook-permanently": "Você deseja excluir permanentemente o webhook {{webhookName}}? Esta ação não pode ser revertida.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "Isso desativará a aplicação {{app}}.",
"disable-classification-description": "Ao desativar a classificação, você não poderá buscar por, ou atribuir tags associadas a qualquer entidade.",
"disabled-classification-actions-message": "Você não pode realizar esta ação em classificações desativadas.",
@@ -1356,6 +1362,9 @@
"find-in-table": "Encontrar na tabela",
"fosters-collaboration-among-producers-and-consumers": "Estabeleça metas organizacionais e KPIs para impulsionar proativamente a cultura de dados da sua empresa. Fomente uma cultura de melhoria contínua com relatórios oportunos para monitorar a saúde dos dados.",
"get-started-with-open-metadata": "Comece com o OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Cada termo no glossário tem uma definição única. Além de definir o termo padrão para um conceito, os sinônimos e termos relacionados (por exemplo, termos pai e filho) podem ser especificados. Referências podem ser adicionadas aos ativos relacionados aos termos. Novos termos podem ser adicionados ou atualizados no Glossário. Os termos do glossário podem ser revisados por certos usuários, que podem aceitar ou rejeitar os termos.",
"glossary-term-status": "Termo do Glossário foi {{status}}.",
"go-back-to-login-page": "Voltar para a página de Login",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "Você concluiu com sucesso o tour.",
"synonym-placeholder": "Para adicionar um sinônimo, basta digitá-lo e pressionar Enter",
"system-tag-delete-disable-message": "Não é permitido excluir tags geradas pelo sistema. Você pode tentar desativar a tag em vez disso.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Faça um tour pelo produto para começar!",
"team-moved-success": "Equipe movida com sucesso!",
"team-no-asset": "Sua equipe não possui ativos.",
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 d19a314bb11..eb4205441c6 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
@@ -258,6 +258,7 @@
"data-model-plural": "Модели данных",
"data-model-type": "Тип модели данных",
"data-product": "Data Product",
+ "data-product-lowercase": "data product",
"data-product-plural": "Data Products",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "Распределение данных",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "Неуспешно",
"failure-context": "Контекст отказа",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "Свойство",
"feature-lowercase": "свойство",
@@ -529,6 +531,7 @@
"invalid-condition": "Недопустимое условие",
"invalid-name": "Неверное имя",
"is-ready-for-preview": "готов к предварительному просмотру",
+ "items-selected-lowercase": "items selected",
"january": "Январь",
"job-lowercase": "job",
"join": "Соединить",
@@ -659,6 +662,7 @@
"new-test-suite": "Новый набор тестов",
"next": "Следующий",
"no": "Нет",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "Объекты данных не найдены",
"no-data-found": "Данные не найдены",
"no-description": "Нет описания",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "Да",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "Вчера",
"your-entity": "Ваш {{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "Удалить сообщение?",
"delete-team-message": "Все команды под \"{{teamName}}\" также будут {{deleteType}} удалены.",
"delete-webhook-permanently": "Вы хотите навсегда удалить webhook {{webhookName}}? Это действие нельзя отменить.",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "Отключив классификацию, вы не сможете выполнять поиск или назначать связанные теги любому объекту.",
"disabled-classification-actions-message": "Вы не можете выполнить это действие с отключенными классификациями.",
@@ -1356,6 +1362,9 @@
"find-in-table": "Найти в таблице",
"fosters-collaboration-among-producers-and-consumers": "Способствует сотрудничеству между производителями и потребителями данных.",
"get-started-with-open-metadata": "Начните работу с OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "Каждый термин в глоссарии имеет уникальное определение. Наряду с определением стандартного термина для понятия можно указать синонимы, а также связанные термины (например, родительские и дочерние термины). Ссылки могут быть добавлены к объектам данных, связанным с терминами. Новые термины могут быть добавлены или обновлены в Глоссарий. Термины глоссария могут быть просмотрены определенными пользователями, которые могут принять или отклонить термины.",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "Вернуться на страницу входа",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "Вы успешно завершили экскурсию.",
"synonym-placeholder": "Чтобы добавить синоним, просто введите его и нажмите Enter.",
"system-tag-delete-disable-message": "Удаление сгенерированных системой тегов не допускается. Вместо этого вы можете попробовать отключить тег.",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "Ознакомьтесь с продуктом, чтобы начать работу!",
"team-moved-success": "Команда успешно переехала!",
"team-no-asset": "У вашей команды нет объектов.",
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 39dc448dced..a2feaf2f6d3 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
@@ -258,6 +258,7 @@
"data-model-plural": "数据模型",
"data-model-type": "数据模型类型",
"data-product": "数据产品",
+ "data-product-lowercase": "data product",
"data-product-plural": "数据产品",
"data-profiler-metrics": "Data Profiler Metrics",
"data-proportion-plural": "数据比例",
@@ -413,6 +414,7 @@
"extend-open-meta-data": "Extend OpenMetadata",
"failed": "失败",
"failure-context": "失败上下文",
+ "failure-reason": "Failure Reason",
"favicon-url": "Favicon URL",
"feature": "特点",
"feature-lowercase": "特点",
@@ -529,6 +531,7 @@
"invalid-condition": "无效条件",
"invalid-name": "无效名称",
"is-ready-for-preview": "可预览",
+ "items-selected-lowercase": "items selected",
"january": "一月",
"job-lowercase": "作业",
"join": "加入",
@@ -659,6 +662,7 @@
"new-test-suite": "新质控测试",
"next": "下一步",
"no": "否",
+ "no-comma-cancel": "No, cancel",
"no-data-asset-found-for": "没有查询到相关的数据资产",
"no-data-found": "未找到数据",
"no-description": "无描述",
@@ -1160,6 +1164,7 @@
"widget-lowercase": "widget",
"workflow-plural": "Workflows",
"yes": "是",
+ "yes-comma-confirm": "Yes, confirm",
"yesterday": "昨天",
"your-entity": "您的{{entity}}"
},
@@ -1275,6 +1280,7 @@
"delete-message-question-mark": "删除消息?",
"delete-team-message": "任何在\"{{teamName}}\"下的团队也将被{{deleteType}}删除",
"delete-webhook-permanently": "您要永久删除 Webhook {{webhookName}} 吗?此操作无法撤消",
+ "derived-tag-warning": "This tag is automatically derived and can only be removed by deleting the related Glossary Term.",
"disable-app": "This will disable the {{app}} application.",
"disable-classification-description": "禁用分类选项,您将无法查看到关联的标签",
"disabled-classification-actions-message": "您无法在已禁用的分类上执行此操作",
@@ -1356,6 +1362,9 @@
"find-in-table": "在数据表中查找",
"fosters-collaboration-among-producers-and-consumers": "促进数据生产者和使用者之间的合作",
"get-started-with-open-metadata": "开始使用 OpenMetadata",
+ "glossary-tag-assignement-help-message": "You can either remove this assets or remove conflicting tag from the asset and try again adding tags!",
+ "glossary-tag-update-description": "This action will apply the tag to all Assets linked to the Glossary Term",
+ "glossary-tag-update-modal-title": "Validation failed for following assets",
"glossary-term-description": "术语库中的每个术语都有一个唯一的定义。除了为概念定义标准术语之外,还可以指定同义词以及相关术语(例如,父项和子项)。可以向与术语相关的资产添加引用。可以向术语库添加或更新新术语。某些用户可以审查术语,并接受或拒绝这些术语。",
"glossary-term-status": "Glossary Term was {{status}}.",
"go-back-to-login-page": "返回登录页面",
@@ -1574,6 +1583,7 @@
"successfully-completed-the-tour": "您已成功完成导览",
"synonym-placeholder": "输入并按回车键以新增一个同义词",
"system-tag-delete-disable-message": "无法删除系统默认的标签,您可以尝试禁用标签",
+ "tag-update-confirmation": "Would you like to proceed with adding a new tag?",
"take-quick-product-tour": "快速查看产品导览",
"team-moved-success": "团队移动成功",
"team-no-asset": "您的团队没有任何资产",
diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/ExplorePage/ExplorePage.interface.ts b/openmetadata-ui/src/main/resources/ui/src/pages/ExplorePage/ExplorePage.interface.ts
index aea5180e39c..5844cc98ff9 100644
--- a/openmetadata-ui/src/main/resources/ui/src/pages/ExplorePage/ExplorePage.interface.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/pages/ExplorePage/ExplorePage.interface.ts
@@ -18,6 +18,7 @@ export interface QueryFieldValueInterface {
export interface QueryFieldInterface {
bool: {
must?: Array;
+ must_not?: Array;
should?: Array;
};
}
@@ -26,6 +27,7 @@ export interface QueryFilterInterface {
query: {
bool: {
must?: QueryFieldInterface[];
+ must_not?: QueryFieldInterface[];
should?: QueryFieldInterface[];
};
};
diff --git a/openmetadata-ui/src/main/resources/ui/src/rest/dataProductAPI.ts b/openmetadata-ui/src/main/resources/ui/src/rest/dataProductAPI.ts
index 5a3a2c89c44..e093f5c448e 100644
--- a/openmetadata-ui/src/main/resources/ui/src/rest/dataProductAPI.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/rest/dataProductAPI.ts
@@ -17,7 +17,10 @@ import { PagingResponse } from 'Models';
import { PAGE_SIZE } from '../constants/constants';
import { SearchIndex } from '../enums/search.enum';
import { CreateDataProduct } from '../generated/api/domains/createDataProduct';
-import { DataProduct } from '../generated/entity/domains/dataProduct';
+import {
+ DataProduct,
+ EntityReference,
+} from '../generated/entity/domains/dataProduct';
import { EntityHistory } from '../generated/type/entityHistory';
import { Include } from '../generated/type/include';
import { Paging } from '../generated/type/paging';
@@ -136,3 +139,35 @@ export const fetchDataProductsElasticSearch = async (
},
};
};
+
+export const addAssetsToDataProduct = async (
+ dataProductFqn: string,
+ assets: EntityReference[]
+) => {
+ const data: { assets: EntityReference[] } = {
+ assets: assets,
+ };
+
+ const response = await APIClient.put<
+ { assets: EntityReference[] },
+ AxiosResponse
+ >(`/dataProducts/${dataProductFqn}/assets/add`, data);
+
+ return response.data;
+};
+
+export const removeAssetsFromDataProduct = async (
+ dataProductFqn: string,
+ assets: EntityReference[]
+) => {
+ const data = {
+ assets: assets,
+ };
+
+ const response = await APIClient.put<
+ { assets: EntityReference[] },
+ AxiosResponse
+ >(`/dataProducts/${dataProductFqn}/assets/remove`, data);
+
+ return response.data;
+};
diff --git a/openmetadata-ui/src/main/resources/ui/src/rest/domainAPI.ts b/openmetadata-ui/src/main/resources/ui/src/rest/domainAPI.ts
index 08655d8dc79..8239d80b476 100644
--- a/openmetadata-ui/src/main/resources/ui/src/rest/domainAPI.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/rest/domainAPI.ts
@@ -15,7 +15,7 @@ import { AxiosResponse } from 'axios';
import { Operation } from 'fast-json-patch';
import { PagingResponse } from 'Models';
import { CreateDomain } from '../generated/api/domains/createDomain';
-import { Domain } from '../generated/entity/domains/domain';
+import { Domain, EntityReference } from '../generated/entity/domains/domain';
import { EntityHistory } from '../generated/type/entityHistory';
import { ListParams } from '../interface/API.interface';
import { getURLWithQueryFields } from '../utils/APIUtils';
@@ -81,3 +81,35 @@ export const getDomainVersionData = async (id: string, version: string) => {
return response.data;
};
+
+export const addAssetsToDomain = async (
+ domainFqn: string,
+ assets: EntityReference[]
+) => {
+ const data: { assets: EntityReference[] } = {
+ assets: assets,
+ };
+
+ const response = await APIClient.put<
+ { assets: EntityReference[] },
+ AxiosResponse
+ >(`/domains/${domainFqn}/assets/add`, data);
+
+ return response.data;
+};
+
+export const removeAssetsFromDomain = async (
+ domainFqn: string,
+ assets: EntityReference[]
+) => {
+ const data = {
+ assets: assets,
+ };
+
+ const response = await APIClient.put<
+ { assets: EntityReference[] },
+ AxiosResponse
+ >(`/domains/${domainFqn}/assets/remove`, data);
+
+ return response.data;
+};
diff --git a/openmetadata-ui/src/main/resources/ui/src/rest/glossaryAPI.ts b/openmetadata-ui/src/main/resources/ui/src/rest/glossaryAPI.ts
index f78c93c5c18..e143c4aa687 100644
--- a/openmetadata-ui/src/main/resources/ui/src/rest/glossaryAPI.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/rest/glossaryAPI.ts
@@ -20,6 +20,7 @@ import { CreateGlossary } from '../generated/api/data/createGlossary';
import { CreateGlossaryTerm } from '../generated/api/data/createGlossaryTerm';
import { EntityReference, Glossary } from '../generated/entity/data/glossary';
import { GlossaryTerm } from '../generated/entity/data/glossaryTerm';
+import { BulkOperationResult } from '../generated/type/bulkOperationResult';
import { CSVImportResult } from '../generated/type/csvImportResult';
import { EntityHistory } from '../generated/type/entityHistory';
import { ListParams } from '../interface/API.interface';
@@ -251,13 +252,31 @@ export const updateGlossaryTermVotes = async (
return response.data;
};
+export const validateTagAddtionToGlossary = async (
+ glossaryTerm: GlossaryTerm,
+ dryRun = false
+) => {
+ const data = {
+ dryRun: dryRun,
+ glossaryTags: glossaryTerm.tags ?? [],
+ };
+
+ const response = await APIClient.put<
+ AddGlossaryToAssetsRequest,
+ AxiosResponse
+ >(`/glossaryTerms/${glossaryTerm.id}/tags/validate`, data);
+
+ return response.data;
+};
+
export const addAssetsToGlossaryTerm = async (
glossaryTerm: GlossaryTerm,
- assets: EntityReference[]
+ assets: EntityReference[],
+ dryRun = false
) => {
const data = {
assets: assets,
- dryRun: false,
+ dryRun: dryRun,
glossaryTags: glossaryTerm.tags ?? [],
};
diff --git a/openmetadata-ui/src/main/resources/ui/src/styles/border.less b/openmetadata-ui/src/main/resources/ui/src/styles/border.less
index 526d4a6d96d..c8073f6dc58 100644
--- a/openmetadata-ui/src/main/resources/ui/src/styles/border.less
+++ b/openmetadata-ui/src/main/resources/ui/src/styles/border.less
@@ -43,3 +43,7 @@
.border-color-primary {
border-color: @primary-color;
}
+
+.border-danger {
+ border: 1px solid @error-color;
+}
diff --git a/openmetadata-ui/src/main/resources/ui/src/styles/fonts.less b/openmetadata-ui/src/main/resources/ui/src/styles/fonts.less
index 3eec3d3dd67..0625d540e91 100644
--- a/openmetadata-ui/src/main/resources/ui/src/styles/fonts.less
+++ b/openmetadata-ui/src/main/resources/ui/src/styles/fonts.less
@@ -89,6 +89,10 @@ pre {
}
}
+.text-danger {
+ color: @error-color;
+}
+
.text-inherit {
font-size: inherit;
}
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchUtils.tsx
index b42c531201e..639b3f07119 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchUtils.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/AdvancedSearchUtils.tsx
@@ -18,6 +18,7 @@ import { isArray, isEmpty } from 'lodash';
import React from 'react';
import { RenderSettings } from 'react-awesome-query-builder';
import ProfilePicture from '../components/common/ProfilePicture/ProfilePicture';
+import { AssetsOfEntity } from '../components/Glossary/GlossaryTerms/tabs/AssetsTabs.interface';
import { SearchDropdownOption } from '../components/SearchDropdown/SearchDropdown.interface';
import {
COMMON_DROPDOWN_ITEMS,
@@ -25,6 +26,7 @@ import {
DASHBOARD_DATA_MODEL_TYPE,
DASHBOARD_DROPDOWN_ITEMS,
DATA_PRODUCT_DROPDOWN_ITEMS,
+ DOMAIN_DATAPRODUCT_DROPDOWN_ITEMS,
GLOSSARY_DROPDOWN_ITEMS,
PIPELINE_DROPDOWN_ITEMS,
SEARCH_INDEX_DROPDOWN_ITEMS,
@@ -88,9 +90,17 @@ export const getDropDownItems = (index: string) => {
}
};
-export const getAssetsPageQuickFilters = () => {
+export const getAssetsPageQuickFilters = (type: AssetsOfEntity) => {
+ switch (type) {
+ case AssetsOfEntity.DOMAIN:
+ case AssetsOfEntity.DATA_PRODUCT:
+ return [...DOMAIN_DATAPRODUCT_DROPDOWN_ITEMS];
+
+ case AssetsOfEntity.GLOSSARY:
+ default:
+ return [...COMMON_DROPDOWN_ITEMS];
+ }
// TODO: Add more quick filters
- return [...COMMON_DROPDOWN_ITEMS];
};
export const getAdvancedField = (field: string) => {
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 06b104b794c..56e3fabe49b 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/DomainUtils.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/DomainUtils.tsx
@@ -25,6 +25,7 @@ import { EntityField } from '../constants/Feeds.constants';
import { DataProduct } from '../generated/entity/domains/dataProduct';
import { Domain } from '../generated/entity/domains/domain';
import { ChangeDescription, EntityReference } from '../generated/entity/type';
+import { QueryFilterInterface } from '../pages/ExplorePage/ExplorePage.interface';
import { getEntityName } from './EntityUtils';
import {
getChangedEntityNewValue,
@@ -152,20 +153,18 @@ export const getQueryFilterToIncludeDomain = (
},
});
-export const getQueryFilterToExcludeDomainTerms = (fqn: string) => ({
+export const getQueryFilterToExcludeDomainTerms = (
+ fqn: string
+): QueryFilterInterface => ({
query: {
bool: {
must: [
{
bool: {
- must: [
+ must_not: [
{
- bool: {
- must_not: {
- term: {
- 'domain.fullyQualifiedName': fqn,
- },
- },
+ term: {
+ 'domain.fullyQualifiedName': fqn,
},
},
],
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/ExplorePage/ExplorePageUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/ExplorePage/ExplorePageUtils.ts
index cc688c0b9b1..ac293627fda 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/ExplorePage/ExplorePageUtils.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/ExplorePage/ExplorePageUtils.ts
@@ -30,6 +30,9 @@ export const getQueryFiltersArray = (
case QueryFilterFieldsEnum.MUST: {
return queryFiltersObj?.query?.bool?.must ?? [];
}
+ case QueryFilterFieldsEnum.MUST_NOT: {
+ return queryFiltersObj?.query?.bool?.must_not ?? [];
+ }
}
};
@@ -58,6 +61,13 @@ export const getCombinedQueryFilterObject = (
advancesSearchQueryFilter,
advancesSearchFilter,
]);
+
+ const mustNotField = getCombinedFields(QueryFilterFieldsEnum.MUST_NOT, [
+ elasticsearchQueryFilter,
+ advancesSearchQueryFilter,
+ advancesSearchFilter,
+ ]);
+
const shouldField = getCombinedFields(QueryFilterFieldsEnum.SHOULD, [
elasticsearchQueryFilter,
advancesSearchQueryFilter,
@@ -68,6 +78,7 @@ export const getCombinedQueryFilterObject = (
query: {
bool: {
...(isEmpty(mustField) ? {} : { must: mustField }),
+ ...(isEmpty(mustNotField) ? {} : { must_not: mustNotField }),
...(isEmpty(shouldField) ? {} : { should: shouldField }),
},
},
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.test.ts b/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.test.ts
index 747607250f5..4864cf7b18c 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.test.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.test.ts
@@ -31,14 +31,10 @@ describe('Glossary Utils', () => {
must: [
{
bool: {
- must: [
+ must_not: [
{
- bool: {
- must_not: {
- term: {
- 'tags.tagFQN': fqn,
- },
- },
+ term: {
+ 'tags.tagFQN': fqn,
},
},
],
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.ts
index 31b438c3ef2..ac31ebf3f33 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.ts
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/GlossaryUtils.ts
@@ -195,14 +195,10 @@ export const getQueryFilterToExcludeTerm = (fqn: string) => ({
must: [
{
bool: {
- must: [
+ must_not: [
{
- bool: {
- must_not: {
- term: {
- 'tags.tagFQN': fqn,
- },
- },
+ term: {
+ 'tags.tagFQN': fqn,
},
},
],
diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx
index f78651f7e5b..805085963f8 100644
--- a/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx
+++ b/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx
@@ -85,7 +85,6 @@ import IconDownArrow from '../assets/svg/ic-down-arrow.svg';
import IconEditLineageColor from '../assets/svg/ic-edit-lineage-colored.svg';
import IconEditLineage from '../assets/svg/ic-edit-lineage.svg';
import IconEdit from '../assets/svg/ic-edit.svg';
-import IconExclamationCircle from '../assets/svg/ic-exclamation-circle.svg';
import IconExplore from '../assets/svg/ic-explore.svg';
import IconFeed from '../assets/svg/ic-feed.svg';
import IconFilter from '../assets/svg/ic-filter.svg';
@@ -249,7 +248,6 @@ export const Icons = {
GROWTH_ARROW: 'icon-growth-arrow',
LOSS_ARROW: 'icon-loss-arrow',
CHECK_CIRCLE: 'icon-check-circle',
- EXCLAMATION_CIRCLE: 'icon-exclamation-circle',
TIMES_CIRCLE: 'icon-times-circle',
HELP_CIRCLE: 'icon-help-circle',
FILTERS: 'icon-filters',
@@ -586,10 +584,7 @@ const SVGIcons: FunctionComponent = ({ icon, ...props }: Props) => {
IconComponent = IconCheckCircle;
break;
- case Icons.EXCLAMATION_CIRCLE:
- IconComponent = IconExclamationCircle;
- break;
case Icons.TIMES_CIRCLE:
IconComponent = IconTimesCircle;