diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts index c0054e5b363..4c14a95bd09 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts @@ -1418,6 +1418,144 @@ test.describe('Data Contracts', () => { } }); + test('Operation on Old Schema Columns Contract', async ({ page }) => { + test.slow(true); + + const { apiContext } = await getApiContext(page); + const table = new TableClass(); + await table.create(apiContext); + + await redirectToHomePage(page); + await table.visitEntityPage(page); + + const entityFQN = table.entityResponseData.fullyQualifiedName; + + await page.click('[data-testid="contract"]'); + await page.waitForSelector('[data-testid="loader"]', { + state: 'detached', + }); + + await page.getByTestId('add-contract-button').click(); + + await expect(page.getByTestId('add-contract-card')).toBeVisible(); + + await page.getByTestId('contract-name').fill(DATA_CONTRACT_DETAILS.name); + + await page.getByRole('tab', { name: 'Schema' }).click(); + + await page + .locator('input[type="checkbox"][aria-label="Select all"]') + .check(); + + await expect( + page.getByRole('checkbox', { name: 'Select all' }) + ).toBeChecked(); + + // save and trigger contract validation + await saveAndTriggerDataContractValidation(page, true); + + await expect( + page.getByTestId('contract-status-card-item-schema-status') + ).toContainText('Passed'); + + // Modify the first 2 columns with PATCH API + await table.patch({ + apiContext, + patchData: [ + { + op: 'replace', + path: '/columns/0/name', + value: 'new_column_0', + }, + { + op: 'replace', + path: '/columns/0/fullyQualifiedName', + value: `${table.entityResponseData.fullyQualifiedName}.new_column_0`, + }, + { + op: 'replace', + path: '/columns/1/name', + value: 'new_column_1', + }, + { + op: 'replace', + path: '/columns/1/fullyQualifiedName', + value: `${table.entityResponseData.fullyQualifiedName}.new_column_1`, + }, + ], + }); + + // Run Contract After Schema Change should Fail + await page.getByTestId('manage-contract-actions').click(); + + await page.waitForSelector('.contract-action-dropdown', { + state: 'visible', + }); + + await page.getByTestId('contract-run-now-button').click(); + + await page.reload(); + + await page.waitForLoadState('networkidle'); + await page.waitForSelector('[data-testid="loader"]', { + state: 'detached', + }); + + await expect( + page.getByTestId('contract-status-card-item-schema-status') + ).toContainText('Failed'); + await expect( + page.getByTestId('data-contract-latest-result-btn') + ).toContainText('Contract Failed'); + + await expect( + page.getByTestId(`schema-column-${table.entityLinkColumnsName[0]}-failed`) + ).toBeVisible(); + + await expect( + page.getByTestId(`schema-column-${table.entityLinkColumnsName[1]}-failed`) + ).toBeVisible(); + + // Check the Columns Present in Contract Schema Form Component + + await page.getByTestId('manage-contract-actions').click(); + + await page.waitForSelector('.contract-action-dropdown', { + state: 'visible', + }); + await page.getByTestId('contract-edit-button').click(); + + await page.getByRole('tab', { name: 'Schema' }).click(); + + // Old column should be visible and we should un-check them + await page + .locator( + `[data-row-key="${entityFQN}.${table.entityLinkColumnsName[0]}"] .ant-checkbox-input` + ) + .click(); + + await page + .locator( + `[data-row-key="${entityFQN}.${table.entityLinkColumnsName[1]}"] .ant-checkbox-input` + ) + .click(); + + // Select newly added column + await page + .locator(`[data-row-key="${entityFQN}.new_column_0"] .ant-checkbox-input`) + .click(); + await page + .locator(`[data-row-key="${entityFQN}.new_column_1"] .ant-checkbox-input`) + .click(); + + // save and trigger contract validation + await saveAndTriggerDataContractValidation(page, true); + + await expect( + page.getByTestId('contract-status-card-item-schema-status') + ).toContainText('Passed'); + }); + test('should allow adding a semantic with multiple rules', async ({ page, }) => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/ContractDetail.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/ContractDetail.tsx index 8299097faa6..f2465ea6bf2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/ContractDetail.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/ContractDetail.tsx @@ -55,6 +55,7 @@ import { } from '../../../utils/DataContract/DataContractUtils'; import { customFormatDateTime } from '../../../utils/date-time/DateTimeUtils'; import { getEntityName } from '../../../utils/EntityUtils'; +import { getPopupContainer } from '../../../utils/formUtils'; import { pruneEmptyChildren } from '../../../utils/TableUtils'; import { showErrorToast, showSuccessToast } from '../../../utils/ToastUtils'; import AlertBar from '../../AlertBar/AlertBar'; @@ -254,6 +255,7 @@ const ContractDetail: React.FC<{ diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/contract-detail.less b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/contract-detail.less index 538ebab0405..302152b829b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/contract-detail.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractDetailTab/contract-detail.less @@ -16,6 +16,10 @@ .ant-card-head { border-bottom: none; + .ant-card-head-title { + overflow: initial; + } + .contract-header-container { width: 100%; display: flex; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx index 0ea945d01cd..94feb01fcee 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaFormTab/ContractScehmaFormTab.tsx @@ -26,7 +26,7 @@ import { import { TABLE_COLUMNS_KEYS } from '../../../constants/TableKeys.constants'; import { EntityType, FqnPart } from '../../../enums/entity.enum'; import { DataContract } from '../../../generated/entity/data/dataContract'; -import { Column } from '../../../generated/entity/data/table'; +import { Column, Table } from '../../../generated/entity/data/table'; import { TagSource } from '../../../generated/tests/testCase'; import { TagLabel } from '../../../generated/type/tagLabel'; import { usePaging } from '../../../hooks/paging/usePaging'; @@ -40,7 +40,8 @@ import { import Fqn from '../../../utils/Fqn'; import { pruneEmptyChildren } from '../../../utils/TableUtils'; import { PagingHandlerParams } from '../../common/NextPrevious/NextPrevious.interface'; -import Table from '../../common/Table/Table'; +import AntTable from '../../common/Table/Table'; +import { useGenericContext } from '../../Customization/GenericProvider/GenericProvider'; import { TableCellRendered } from '../../Database/SchemaTable/SchemaTable.interface'; import TableTags from '../../Database/TableTags/TableTags.component'; @@ -54,7 +55,8 @@ export const ContractSchemaFormTab: React.FC<{ }> = ({ selectedSchema, onNext, onChange, onPrev, nextLabel, prevLabel }) => { const { t } = useTranslation(); const { fqn } = useFqn(); - const [allColumnsData, setAllColumnData] = useState([]); + const { data: tableData } = useGenericContext(); + const [allColumnsData, setAllColumnsData] = useState([]); const [columnsData, setColumnsData] = useState([]); const [selectedKeys, setSelectedKeys] = useState(); const [isLoading, setIsLoading] = useState(false); @@ -95,6 +97,17 @@ export const ContractSchemaFormTab: React.FC<{ [allColumnsData, onChange] ); + // Old Columns which are available in Contract but being Modified/Removed at Table Schema Level + const oldRemovedColumns = useMemo(() => { + const columnsDataFQN = new Set( + (tableData as Table).columns.map((col) => col.fullyQualifiedName) + ); + + return selectedSchema.filter( + (col) => !columnsDataFQN.has(col.fullyQualifiedName) + ); + }, [selectedSchema, tableData]); + const fetchTableColumns = useCallback( async (page = 1) => { if (!tableFqn) { @@ -112,9 +125,18 @@ export const ContractSchemaFormTab: React.FC<{ }); const prunedColumns = pruneEmptyChildren(response.data); - setColumnsData(prunedColumns); - setAllColumnData((prev) => { - const combined = [...prev, ...selectedSchema, ...prunedColumns]; + const oldPrunedColumns = pruneEmptyChildren(oldRemovedColumns); + // should render the oldPrunedColumns only on the first page, if there is pagination + setColumnsData( + offset === 0 ? [...oldPrunedColumns, ...prunedColumns] : prunedColumns + ); + setAllColumnsData((prev) => { + const combined = [ + ...prev, + ...selectedSchema, + ...oldPrunedColumns, + ...prunedColumns, + ]; return uniqBy(combined, 'fullyQualifiedName'); }); @@ -131,7 +153,7 @@ export const ContractSchemaFormTab: React.FC<{ } setIsLoading(false); }, - [tableFqn, pageSize, selectedSchema, setAllColumnData] + [tableFqn, pageSize, selectedSchema, oldRemovedColumns, setAllColumnsData] ); const handleColumnsPageChange = useCallback( @@ -295,7 +317,7 @@ export const ContractSchemaFormTab: React.FC<{ useEffect(() => { setSelectedKeys( - selectedSchema.map((item) => (item as Column).fullyQualifiedName ?? '') + selectedSchema.map((item) => item.fullyQualifiedName ?? '') ); }, [selectedSchema]); @@ -314,7 +336,7 @@ export const ContractSchemaFormTab: React.FC<{ {t('message.data-contract-schema-description')} - ({ pruneEmptyChildren: jest.fn().mockImplementation((columns) => columns), })); +jest.mock('../../Customization/GenericProvider/GenericProvider', () => ({ + useGenericContext: jest.fn().mockImplementation(() => ({ + data: mockTableData, + })), +})); + jest.mock('../../common/Table/Table', () => { return function MockTable({ columns, diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.component.tsx index a02126705c0..c46534a607f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.component.tsx @@ -12,11 +12,16 @@ */ import Icon from '@ant-design/icons'; import { Col, Row, Tag, Typography } from 'antd'; +import { ColumnsType, ColumnType, TablePaginationConfig } from 'antd/lib/table'; +import classNames from 'classnames'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { ReactComponent as ArrowIcon } from '../../../assets/svg/arrow-right-full.svg'; +import { ReactComponent as FailedIcon } from '../../../assets/svg/fail-badge.svg'; +import { ReactComponent as CompletedIcon } from '../../../assets/svg/ic-check-circle-colored.svg'; import { LIST_SIZE, NO_DATA_PLACEHOLDER } from '../../../constants/constants'; import { Column } from '../../../generated/entity/data/table'; +import { SchemaValidation } from '../../../generated/entity/datacontract/dataContractResult'; import { getContractStatusType } from '../../../utils/DataContract/DataContractUtils'; import StatusBadgeV2 from '../../common/StatusBadge/StatusBadgeV2.component'; import Table from '../../common/Table/Table'; @@ -25,10 +30,23 @@ import './contract-schema.less'; const ContractSchemaTable: React.FC<{ schemaDetail: Column[]; contractStatus?: string; -}> = ({ schemaDetail, contractStatus }) => { + latestSchemaValidationResult?: SchemaValidation; +}> = ({ schemaDetail, contractStatus, latestSchemaValidationResult }) => { const { t } = useTranslation(); - const schemaColumns = useMemo( + const tablePaginationProps: TablePaginationConfig = useMemo( + () => ({ + size: 'default', + hideOnSinglePage: true, + pageSize: LIST_SIZE, + prevIcon: , + nextIcon: , + className: 'schema-custom-pagination', + }), + [] + ); + + const schemaColumns: ColumnsType = useMemo( () => [ { title: t('label.name'), @@ -66,8 +84,31 @@ const ContractSchemaTable: React.FC<{ ), }, + ...(latestSchemaValidationResult + ? [ + { + title: t('label.column-status'), + dataIndex: 'name', + key: 'columnStatus', + align: 'center', + render: (name: string) => { + const isColumnFailed = + latestSchemaValidationResult?.failedFields?.includes(name); + const iconClass = isColumnFailed ? 'failed' : 'success'; + + return ( + + ); + }, + } as ColumnType, + ] + : []), ], - [] + [latestSchemaValidationResult] ); return ( @@ -76,14 +117,7 @@ const ContractSchemaTable: React.FC<{
, - nextIcon: , - className: 'schema-custom-pagination', - }} + pagination={tablePaginationProps} rowKey="name" size="small" /> diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.test.tsx index 5ba9b1c7e55..93fe6ba1f46 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/ContractSchemaTable.test.tsx @@ -55,10 +55,42 @@ describe('ContractSchemaTable', () => { expect(screen.getByText('label.name')).toBeInTheDocument(); expect(screen.getByText('label.type')).toBeInTheDocument(); expect(screen.getByText('label.constraint-plural')).toBeInTheDocument(); - + expect(screen.queryByText('label.column-status')).not.toBeInTheDocument(); expect(screen.queryByText('StatusBadgeV2')).not.toBeInTheDocument(); }); + it('should render ColumnStatus column when latestSchemaValidationResult present', () => { + render( + + ); + + expect(screen.getByText('label.column-status')).toBeInTheDocument(); + expect(screen.getByTestId('schema-column-name-failed')).toBeInTheDocument(); + expect(screen.getByTestId('schema-column-id-success')).toBeInTheDocument(); + expect( + screen.getByTestId('schema-column-email-success') + ).toBeInTheDocument(); + expect( + screen.getByTestId('schema-column-contract-success') + ).toBeInTheDocument(); + expect( + screen.getByTestId('schema-column-property-success') + ).toBeInTheDocument(); + + // Since being on second page + expect( + screen.queryByTestId('schema-column-business-success') + ).not.toBeInTheDocument(); + }); + it('should render schema table with pagination', () => { render(); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less index 84270b038b9..55c90221666 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less @@ -13,6 +13,15 @@ @import (reference) '../../../styles/variables.less'; +.contract-schema-component-container { + .column-status-icon { + font-size: 16px; + &.success { + color: transparent; + } + } +} + .ant-pagination.schema-custom-pagination { align-items: center; &.ant-table-pagination-right { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractTab/ContractTab.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractTab/ContractTab.tsx index 13acedd6dba..2fc1912de81 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractTab/ContractTab.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractTab/ContractTab.tsx @@ -54,7 +54,7 @@ export const ContractTab = () => { } }; - const handleDelete = async () => { + const handleDelete = () => { if (contract?.id) { setIsDeleteModalVisible(true); } 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 d83a9afb694..1c792f52690 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 @@ -262,6 +262,7 @@ "column-name": "Spaltenname", "column-plural": "Spalten", "column-profile": "Spaltenprofil", + "column-status": "Spaltenstatus", "comment": "Kommentar", "comment-lowercase": "kommentar", "comment-plural": "Kommentare", 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 8f6fd8b0e9b..c91dd993a2c 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 @@ -262,6 +262,7 @@ "column-name": "Column Name", "column-plural": "Columns", "column-profile": "Column Profile", + "column-status": "Column Status", "comment": "Comment", "comment-lowercase": "comment", "comment-plural": "Comments", 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 33f9c7711e0..88c35e30a93 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 @@ -262,6 +262,7 @@ "column-name": "Nombre de columna", "column-plural": "Columnas", "column-profile": "Perfilado de columnas", + "column-status": "Estado de la columna", "comment": "Comentar", "comment-lowercase": "comentario", "comment-plural": "Comentarios", 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 490d558bd63..fa1cf2c3c20 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 @@ -262,6 +262,7 @@ "column-name": "Nom de colonne", "column-plural": "Colonnes", "column-profile": "Profil de Colonne", + "column-status": "Statut de la colonne", "comment": "Commentaire", "comment-lowercase": "commentaire", "comment-plural": "Commentaires", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json index 16a8b3e6078..a01bd283ce5 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json @@ -262,6 +262,7 @@ "column-name": "Nome da columna", "column-plural": "Columnas", "column-profile": "Perfil da columna", + "column-status": "Estado da columna", "comment": "Comentario", "comment-lowercase": "comentario", "comment-plural": "Comentarios", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json index 0cdaa8b1b69..3e6a35a9942 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json @@ -262,6 +262,7 @@ "column-name": "שם עמודה", "column-plural": "עמודות", "column-profile": "פרופיל עמודה", + "column-status": "סטטוס עמודה", "comment": "תגובה", "comment-lowercase": "תגובה", "comment-plural": "תגובות", 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 fd815ab4598..1a2b2a6ae81 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 @@ -262,6 +262,7 @@ "column-name": "カラム名", "column-plural": "カラム", "column-profile": "カラムプロファイル", + "column-status": "カラムステータス", "comment": "コメント", "comment-lowercase": "コメント", "comment-plural": "コメント", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json index 5ac0dba1ce9..ba983654306 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json @@ -262,6 +262,7 @@ "column-name": "열 이름", "column-plural": "열들", "column-profile": "열 프로필", + "column-status": "열 상태", "comment": "댓글", "comment-lowercase": "댓글", "comment-plural": "댓글들", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json index ad4ba5531ce..18441e3c7ff 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json @@ -262,6 +262,7 @@ "column-name": "स्तंभ नाव", "column-plural": "स्तंभ", "column-profile": "स्तंभ प्रोफाइल", + "column-status": "स्तंभ स्थिती", "comment": "टिप्पणी", "comment-lowercase": "टिप्पणी", "comment-plural": "टिप्पण्या", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json index f4e05c45613..23e815c23e8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json @@ -262,6 +262,7 @@ "column-name": "Kolomnaam", "column-plural": "Kolommen", "column-profile": "Kolomprofiel", + "column-status": "Kolomstatus", "comment": "Opmerking", "comment-lowercase": "opmerking", "comment-plural": "Opmerkingen", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json index a5b320e2eff..b01fd988d9f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json @@ -262,6 +262,7 @@ "column-name": "نام ستون", "column-plural": "ستون‌ها", "column-profile": "پروفایل ستون", + "column-status": "وضعیت ستون", "comment": "نظر", "comment-lowercase": "نظر", "comment-plural": "Comentarios", 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 64f328e3b27..f45f0958bec 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 @@ -262,6 +262,7 @@ "column-name": "Nome da coluna", "column-plural": "Colunas", "column-profile": "Perfil da Coluna", + "column-status": "Status da coluna", "comment": "Comentário", "comment-lowercase": "comentário", "comment-plural": "Comentários", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json index 6c7c8f27c7e..93e1093f641 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json @@ -262,6 +262,7 @@ "column-name": "Nome da coluna", "column-plural": "Colunas", "column-profile": "Perfil da Coluna", + "column-status": "Estado da coluna", "comment": "Comentário", "comment-lowercase": "comentário", "comment-plural": "Comentários", 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 e3eb10da59f..29609da8ceb 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 @@ -262,6 +262,7 @@ "column-name": "Имя столбца", "column-plural": "Столбцы", "column-profile": "Профиль столбца", + "column-status": "Статус столбца", "comment": "Комментарий", "comment-lowercase": "комментарий", "comment-plural": "Комментарии", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json index 9ad35ce7248..b2eccde167e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json @@ -262,6 +262,7 @@ "column-name": "ชื่อคอลัมน์", "column-plural": "คอลัมน์หลายรายการ", "column-profile": "โปรไฟล์คอลัมน์", + "column-status": "สถานะคอลัมน์", "comment": "ความคิดเห็น", "comment-lowercase": "ความคิดเห็น", "comment-plural": "ความคิดเห็น", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json index 8b61c56f29a..f1a1a4a2312 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json @@ -262,6 +262,7 @@ "column-name": "Sütun adı", "column-plural": "Sütunlar", "column-profile": "Sütun Profili", + "column-status": "Sütun Durumu", "comment": "Yorum", "comment-lowercase": "yorum", "comment-plural": "Yorumlar", 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 0e9cf4bacab..cd8ebcef941 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 @@ -262,6 +262,7 @@ "column-name": "列名", "column-plural": "列", "column-profile": "列分析", + "column-status": "列状态", "comment": "评论", "comment-lowercase": "评论", "comment-plural": "评论", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json index fe2f2a74b8a..95e78927992 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json @@ -262,6 +262,7 @@ "column-name": "欄位名稱", "column-plural": "欄位", "column-profile": "欄位分析", + "column-status": "欄位狀態", "comment": "留言", "comment-lowercase": "留言", "comment-plural": "留言",