diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java index 98330c65b6f..d37fbd24202 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java @@ -13,6 +13,7 @@ package org.openmetadata.service.jdbi3; +import static org.openmetadata.csv.CsvUtil.addExtension; import static org.openmetadata.csv.CsvUtil.addField; import static org.openmetadata.csv.CsvUtil.addGlossaryTerms; import static org.openmetadata.csv.CsvUtil.addOwners; @@ -68,6 +69,7 @@ public class DatabaseRepository extends EntityRepository { "", ""); supportsSearch = true; + fieldFetchers.put("name", this::fetchAndSetService); } @Override @@ -125,7 +127,8 @@ public class DatabaseRepository extends EntityRepository { (DatabaseSchemaRepository) Entity.getEntityRepository(DATABASE_SCHEMA); List schemas = repository.listAllForCSV( - repository.getFields("owners,tags,domain"), database.getFullyQualifiedName()); + repository.getFields("owners,tags,domain,extension"), database.getFullyQualifiedName()); + schemas.sort(Comparator.comparing(EntityInterface::getFullyQualifiedName)); return new DatabaseCsv(database, user).exportCsv(schemas); } @@ -224,6 +227,17 @@ public class DatabaseRepository extends EntityRepository { return database; } + private void fetchAndSetService(List entities, Fields fields) { + if (entities == null || entities.isEmpty() || (!fields.contains("name"))) { + return; + } + + EntityReference service = getContainer(entities.get(0).getId()); + for (Database database : entities) { + database.setService(service); + } + } + public class DatabaseUpdater extends EntityUpdater { public DatabaseUpdater(Database original, Database updated, Operation operation) { super(original, updated, operation); @@ -282,7 +296,8 @@ public class DatabaseRepository extends EntityRepository { .withTags(tagLabels) .withRetentionPeriod(csvRecord.get(7)) .withSourceUrl(csvRecord.get(8)) - .withDomain(getEntityReference(printer, csvRecord, 9, Entity.DOMAIN)); + .withDomain(getEntityReference(printer, csvRecord, 9, Entity.DOMAIN)) + .withExtension(getExtension(printer, csvRecord, 10)); if (processRecord) { createEntity(printer, csvRecord, schema); } @@ -306,6 +321,7 @@ public class DatabaseRepository extends EntityRepository { ? "" : entity.getDomain().getFullyQualifiedName(); addField(recordList, domain); + addExtension(recordList, entity.getExtension()); addRecord(csvFile, recordList); } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java index 1117b61a3ec..82cca116660 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java @@ -14,6 +14,7 @@ package org.openmetadata.service.jdbi3; import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty; +import static org.openmetadata.csv.CsvUtil.addExtension; import static org.openmetadata.csv.CsvUtil.addField; import static org.openmetadata.csv.CsvUtil.addGlossaryTerms; import static org.openmetadata.csv.CsvUtil.addOwners; @@ -196,9 +197,11 @@ public class DatabaseSchemaRepository extends EntityRepository { public String exportToCsv(String name, String user) throws IOException { DatabaseSchema schema = getByName(null, name, Fields.EMPTY_FIELDS); // Validate database schema TableRepository repository = (TableRepository) Entity.getEntityRepository(TABLE); + List tables = repository.listAllForCSV( - repository.getFields("owners,tags,domain"), schema.getFullyQualifiedName()); + repository.getFields("owners,tags,domain,extension"), schema.getFullyQualifiedName()); + tables.sort(Comparator.comparing(EntityInterface::getFullyQualifiedName)); return new DatabaseSchemaCsv(schema, user).exportCsv(tables); } @@ -315,7 +318,8 @@ public class DatabaseSchemaRepository extends EntityRepository { .withRetentionPeriod(csvRecord.get(7)) .withSourceUrl(csvRecord.get(8)) .withColumns(nullOrEmpty(table.getColumns()) ? new ArrayList<>() : table.getColumns()) - .withDomain(getEntityReference(printer, csvRecord, 9, Entity.DOMAIN)); + .withDomain(getEntityReference(printer, csvRecord, 9, Entity.DOMAIN)) + .withExtension(getExtension(printer, csvRecord, 10)); if (processRecord) { createEntity(printer, csvRecord, table); @@ -340,6 +344,7 @@ public class DatabaseSchemaRepository extends EntityRepository { ? "" : entity.getDomain().getFullyQualifiedName(); addField(recordList, domain); + addExtension(recordList, entity.getExtension()); addRecord(csvFile, recordList); } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java index 959ce9d8d3a..fc4440c9525 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseServiceRepository.java @@ -13,6 +13,7 @@ package org.openmetadata.service.jdbi3; +import static org.openmetadata.csv.CsvUtil.addExtension; import static org.openmetadata.csv.CsvUtil.addField; import static org.openmetadata.csv.CsvUtil.addGlossaryTerms; import static org.openmetadata.csv.CsvUtil.addOwners; @@ -68,7 +69,9 @@ public class DatabaseServiceRepository DatabaseRepository repository = (DatabaseRepository) Entity.getEntityRepository(DATABASE); List databases = repository.listAllForCSV( - repository.getFields("owners,tags,domain"), databaseService.getFullyQualifiedName()); + repository.getFields("name,owners,tags,domain,extension"), + databaseService.getFullyQualifiedName()); + databases.sort(Comparator.comparing(EntityInterface::getFullyQualifiedName)); return new DatabaseServiceCsv(databaseService, user).exportCsv(databases); } @@ -122,7 +125,8 @@ public class DatabaseServiceRepository .withDescription(csvRecord.get(2)) .withOwners(getOwners(printer, csvRecord, 3)) .withTags(tagLabels) - .withDomain(getEntityReference(printer, csvRecord, 7, Entity.DOMAIN)); + .withDomain(getEntityReference(printer, csvRecord, 7, Entity.DOMAIN)) + .withExtension(getExtension(printer, csvRecord, 8)); if (processRecord) { createEntity(printer, csvRecord, database); @@ -145,6 +149,7 @@ public class DatabaseServiceRepository ? "" : entity.getDomain().getFullyQualifiedName(); addField(recordList, domain); + addExtension(recordList, entity.getExtension()); addRecord(csvFile, recordList); } } diff --git a/openmetadata-service/src/main/resources/json/data/database/databaseCsvDocumentation.json b/openmetadata-service/src/main/resources/json/data/database/databaseCsvDocumentation.json index 6357f94217f..90b7c5fb122 100644 --- a/openmetadata-service/src/main/resources/json/data/database/databaseCsvDocumentation.json +++ b/openmetadata-service/src/main/resources/json/data/database/databaseCsvDocumentation.json @@ -84,6 +84,23 @@ "examples": [ "Marketing", "Sales" ] + }, + { + "name": "extension", + "required": false, + "description": "Custom property values added to the glossary term. Each field value (property and its value) is separated by `;` and internal values can be separated by `|`. For `entityReferenceList` type property, pass `type1:fqn1|type2:fqn2`. For single `entityReference` type property, pass `type:fqn`. Similarly, for `enumMultiSelect`, pass values separated by `|`, and for `enumSingleSelect`, pass a single value along with the property name. For `timeInterval` property type, pass the `startTime:endTime` to the property name. If the field value itself contains delimiter values like `,` and `;` or newline they need to be quoted, and the quotation needs to be further escaped. In general, if passing multiple field values separated by `;`, the extension column value needs to be quoted.", + "examples": [ + "`customAttribute1:value1;customAttribute2:value2`", + "`\"dateCp:18-09-2024;dateTimeCp:18-09-2024 01:09:34;durationCp:PT5H30M10S;emailCp:admin@open-metadata.org\"`", + "`entRefListCp:searchIndex:elasticsearch_sample.table_search_index|databaseSchema:Glue.default.information_schema|databaseSchema:sample_data.ecommerce_db.shopify|database:Glue.default|`", + "`\"entRefCp:user:\"\"aaron.singh2\"\"\"`", + "`\"enumMultiSelectCp:val3|val2|val1|val4|val5;enumSingleSelectCp:singleVal1\"`", + "`\"timeCp:10:08:45;timeIntervalCp:1726142300000:17261420000;timeStampCp:1726142400000\"`", + "`\"integerCp:7777;numberCp:123456\"`", + "`\"\"\"queryCp:select col,row from table where id ='30';\"\";stringcp:sample string content\"`", + "`markdownCp:# Sample Markdown Text`", + "\"\"\"tableCp:row_1_col1_Value,row_1_col2_Value,row_1_col3_Value\"\"\"" + ] } ] } \ No newline at end of file diff --git a/openmetadata-service/src/main/resources/json/data/databaseSchema/databaseSchemaCsvDocumentation.json b/openmetadata-service/src/main/resources/json/data/databaseSchema/databaseSchemaCsvDocumentation.json index 55d0fd342ea..32bd6c12f69 100644 --- a/openmetadata-service/src/main/resources/json/data/databaseSchema/databaseSchemaCsvDocumentation.json +++ b/openmetadata-service/src/main/resources/json/data/databaseSchema/databaseSchemaCsvDocumentation.json @@ -84,6 +84,23 @@ "examples": [ "Marketing", "Sales" ] + }, + { + "name": "extension", + "required": false, + "description": "Custom property values added to the glossary term. Each field value (property and its value) is separated by `;` and internal values can be separated by `|`. For `entityReferenceList` type property, pass `type1:fqn1|type2:fqn2`. For single `entityReference` type property, pass `type:fqn`. Similarly, for `enumMultiSelect`, pass values separated by `|`, and for `enumSingleSelect`, pass a single value along with the property name. For `timeInterval` property type, pass the `startTime:endTime` to the property name. If the field value itself contains delimiter values like `,` and `;` or newline they need to be quoted, and the quotation needs to be further escaped. In general, if passing multiple field values separated by `;`, the extension column value needs to be quoted.", + "examples": [ + "`customAttribute1:value1;customAttribute2:value2`", + "`\"dateCp:18-09-2024;dateTimeCp:18-09-2024 01:09:34;durationCp:PT5H30M10S;emailCp:admin@open-metadata.org\"`", + "`entRefListCp:searchIndex:elasticsearch_sample.table_search_index|databaseSchema:Glue.default.information_schema|databaseSchema:sample_data.ecommerce_db.shopify|database:Glue.default|`", + "`\"entRefCp:user:\"\"aaron.singh2\"\"\"`", + "`\"enumMultiSelectCp:val3|val2|val1|val4|val5;enumSingleSelectCp:singleVal1\"`", + "`\"timeCp:10:08:45;timeIntervalCp:1726142300000:17261420000;timeStampCp:1726142400000\"`", + "`\"integerCp:7777;numberCp:123456\"`", + "`\"\"\"queryCp:select col,row from table where id ='30';\"\";stringcp:sample string content\"`", + "`markdownCp:# Sample Markdown Text`", + "\"\"\"tableCp:row_1_col1_Value,row_1_col2_Value,row_1_col3_Value\"\"\"" + ] } ] } \ No newline at end of file diff --git a/openmetadata-service/src/main/resources/json/data/databaseService/databaseServiceCsvDocumentation.json b/openmetadata-service/src/main/resources/json/data/databaseService/databaseServiceCsvDocumentation.json index 6c4346b6925..2b643158d13 100644 --- a/openmetadata-service/src/main/resources/json/data/databaseService/databaseServiceCsvDocumentation.json +++ b/openmetadata-service/src/main/resources/json/data/databaseService/databaseServiceCsvDocumentation.json @@ -68,6 +68,23 @@ "examples": [ "Marketing", "Sales" ] + }, + { + "name": "extension", + "required": false, + "description": "Custom property values added to the glossary term. Each field value (property and its value) is separated by `;` and internal values can be separated by `|`. For `entityReferenceList` type property, pass `type1:fqn1|type2:fqn2`. For single `entityReference` type property, pass `type:fqn`. Similarly, for `enumMultiSelect`, pass values separated by `|`, and for `enumSingleSelect`, pass a single value along with the property name. For `timeInterval` property type, pass the `startTime:endTime` to the property name. If the field value itself contains delimiter values like `,` and `;` or newline they need to be quoted, and the quotation needs to be further escaped. In general, if passing multiple field values separated by `;`, the extension column value needs to be quoted.", + "examples": [ + "`customAttribute1:value1;customAttribute2:value2`", + "`\"dateCp:18-09-2024;dateTimeCp:18-09-2024 01:09:34;durationCp:PT5H30M10S;emailCp:admin@open-metadata.org\"`", + "`entRefListCp:searchIndex:elasticsearch_sample.table_search_index|databaseSchema:Glue.default.information_schema|databaseSchema:sample_data.ecommerce_db.shopify|database:Glue.default|`", + "`\"entRefCp:user:\"\"aaron.singh2\"\"\"`", + "`\"enumMultiSelectCp:val3|val2|val1|val4|val5;enumSingleSelectCp:singleVal1\"`", + "`\"timeCp:10:08:45;timeIntervalCp:1726142300000:17261420000;timeStampCp:1726142400000\"`", + "`\"integerCp:7777;numberCp:123456\"`", + "`\"\"\"queryCp:select col,row from table where id ='30';\"\";stringcp:sample string content\"`", + "`markdownCp:# Sample Markdown Text`", + "\"\"\"tableCp:row_1_col1_Value,row_1_col2_Value,row_1_col3_Value\"\"\"" + ] } ] } \ No newline at end of file diff --git a/openmetadata-service/src/main/resources/json/data/glossary/glossaryCsvDocumentation.json b/openmetadata-service/src/main/resources/json/data/glossary/glossaryCsvDocumentation.json index 47750c710b2..0890452ad13 100644 --- a/openmetadata-service/src/main/resources/json/data/glossary/glossaryCsvDocumentation.json +++ b/openmetadata-service/src/main/resources/json/data/glossary/glossaryCsvDocumentation.json @@ -108,7 +108,8 @@ "`\"timeCp:10:08:45;timeIntervalCp:1726142300000:17261420000;timeStampCp:1726142400000\"`", "`\"integerCp:7777;numberCp:123456\"`", "`\"\"\"queryCp:select col,row from table where id ='30';\"\";stringcp:sample string content\"`", - "`markdownCp:# Sample Markdown Text`" + "`markdownCp:# Sample Markdown Text`", + "\"\"\"tableCp:row_1_col1_Value,row_1_col2_Value,row_1_col3_Value\"\"\"" ] } ] diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java index 796479b2ade..a7374a3ae22 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java @@ -121,7 +121,7 @@ public class DatabaseResourceTest extends EntityResourceTest updateRecords = listOf( String.format( - "s1,dsp1,new-dsc1,user:%s,,,Tier.Tier1,P23DT23H,http://test.com,%s", + "s1,dsp1,new-dsc1,user:%s,,,Tier.Tier1,P23DT23H,http://test.com,%s,", user1, escapeCsv(DOMAIN.getFullyQualifiedName()))); // Update created entity with changes diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/services/DatabaseServiceResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/services/DatabaseServiceResourceTest.java index f3eee61abe7..8472dd6e742 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/services/DatabaseServiceResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/services/DatabaseServiceResourceTest.java @@ -15,10 +15,16 @@ package org.openmetadata.service.resources.services; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; import static javax.ws.rs.core.Response.Status.OK; +import static org.apache.commons.lang.StringEscapeUtils.escapeCsv; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.openmetadata.common.utils.CommonUtil.listOf; +import static org.openmetadata.csv.CsvUtil.recordToString; +import static org.openmetadata.csv.EntityCsv.entityNotFound; +import static org.openmetadata.csv.EntityCsvTest.*; +import static org.openmetadata.csv.EntityCsvTest.assertRows; import static org.openmetadata.service.exception.CatalogExceptionMessage.invalidEnumValue; import static org.openmetadata.service.util.EntityUtil.fieldAdded; import static org.openmetadata.service.util.EntityUtil.fieldUpdated; @@ -35,14 +41,18 @@ import java.util.List; import java.util.Map; import java.util.UUID; import javax.ws.rs.client.WebTarget; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.HttpResponseException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.openmetadata.csv.EntityCsv; +import org.openmetadata.schema.api.data.CreateDatabase; import org.openmetadata.schema.api.services.CreateDatabaseService; import org.openmetadata.schema.api.services.CreateDatabaseService.DatabaseServiceType; import org.openmetadata.schema.api.services.DatabaseConnection; import org.openmetadata.schema.api.services.ingestionPipelines.CreateIngestionPipeline; +import org.openmetadata.schema.entity.data.Database; import org.openmetadata.schema.entity.services.DatabaseService; import org.openmetadata.schema.entity.services.connections.TestConnectionResult; import org.openmetadata.schema.entity.services.connections.TestConnectionResultStatus; @@ -57,13 +67,18 @@ import org.openmetadata.schema.services.connections.database.MysqlConnection; import org.openmetadata.schema.services.connections.database.RedshiftConnection; import org.openmetadata.schema.services.connections.database.SnowflakeConnection; import org.openmetadata.schema.services.connections.database.common.basicAuth; +import org.openmetadata.schema.type.ApiStatus; import org.openmetadata.schema.type.ChangeDescription; import org.openmetadata.schema.type.Include; import org.openmetadata.schema.type.Schedule; +import org.openmetadata.schema.type.csv.CsvImportResult; import org.openmetadata.service.Entity; +import org.openmetadata.service.jdbi3.DatabaseServiceRepository.DatabaseServiceCsv; +import org.openmetadata.service.resources.databases.DatabaseResourceTest; import org.openmetadata.service.resources.services.database.DatabaseServiceResource.DatabaseServiceList; import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResourceTest; import org.openmetadata.service.secrets.masker.PasswordEntityMasker; +import org.openmetadata.service.util.FullyQualifiedName; import org.openmetadata.service.util.JsonUtils; import org.openmetadata.service.util.TestUtils; @@ -321,6 +336,72 @@ public class DatabaseServiceResourceTest invalidEnumValue(Include.class)); } + @Test + @SneakyThrows + void testImportInvalidCsv() { + DatabaseService service = createEntity(createRequest("invalidCsv"), ADMIN_AUTH_HEADERS); + String serviceName = service.getFullyQualifiedName(); + DatabaseResourceTest databaseTest = new DatabaseResourceTest(); + CreateDatabase createDatabase = databaseTest.createRequest("s1").withService(serviceName); + databaseTest.createEntity(createDatabase, ADMIN_AUTH_HEADERS); + + // Headers: name, displayName, description, owner, tags, glossaryTerms, tiers, domain, extension + // Update database with invalid tags field + String resultsHeader = recordToString(EntityCsv.getResultHeaders(DatabaseServiceCsv.HEADERS)); + String record = "d1,dsp1,dsc1,,Tag.invalidTag,,,,"; + String csv = createCsv(DatabaseServiceCsv.HEADERS, listOf(record), null); + CsvImportResult result = importCsv(serviceName, csv, false); + assertSummary(result, ApiStatus.PARTIAL_SUCCESS, 2, 1, 1); + String[] expectedRows = + new String[] { + resultsHeader, getFailedRecord(record, entityNotFound(4, "tag", "Tag.invalidTag")) + }; + assertRows(result, expectedRows); + + // invalid tag it will give error. + record = "non-existing,dsp1,dsc1,,Tag.invalidTag,,,,"; + csv = createCsv(DatabaseServiceCsv.HEADERS, listOf(record), null); + result = importCsv(serviceName, csv, false); + assertSummary(result, ApiStatus.PARTIAL_SUCCESS, 2, 1, 1); + expectedRows = + new String[] { + resultsHeader, getFailedRecord(record, entityNotFound(4, "tag", "Tag.invalidTag")) + }; + assertRows(result, expectedRows); + + // database will be created if it does not exist + String databaseFqn = FullyQualifiedName.add(serviceName, "non-existing"); + record = "non-existing,dsp1,dsc1,,,,,,"; + csv = createCsv(DatabaseServiceCsv.HEADERS, listOf(record), null); + result = importCsv(serviceName, csv, false); + assertSummary(result, ApiStatus.SUCCESS, 2, 2, 0); + expectedRows = new String[] {resultsHeader, getSuccessRecord(record, "Entity created")}; + assertRows(result, expectedRows); + Database createdDatabase = databaseTest.getEntityByName(databaseFqn, "id", ADMIN_AUTH_HEADERS); + assertEquals(databaseFqn, createdDatabase.getFullyQualifiedName()); + } + + @Test + void testImportExport() throws IOException { + String user1 = USER1.getName(); + DatabaseService service = createEntity(createRequest("importExportTest"), ADMIN_AUTH_HEADERS); + DatabaseResourceTest databaseTest = new DatabaseResourceTest(); + CreateDatabase createDatabase = + databaseTest.createRequest("d1").withService(service.getFullyQualifiedName()); + databaseTest.createEntity(createDatabase, ADMIN_AUTH_HEADERS); + + // Headers: name, displayName, description, owner, tags, glossaryTerms, tiers, domain, extension + // Update terms with change in description + String record = + String.format( + "d1,dsp1,new-dsc1,user:%s,,,Tier.Tier1,%s,", + user1, escapeCsv(DOMAIN.getFullyQualifiedName())); + + // Update created entity with changes + importCsvAndValidate( + service.getFullyQualifiedName(), DatabaseServiceCsv.HEADERS, null, listOf(record)); + } + public DatabaseService putTestConnectionResult( UUID serviceId, TestConnectionResult testConnectionResult, Map authHeaders) throws HttpResponseException { diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/svg/customproperties/number.svg b/openmetadata-ui/src/main/resources/ui/src/assets/svg/customproperties/number.svg index 715ebe96b0c..7bf22c0aebc 100644 --- a/openmetadata-ui/src/main/resources/ui/src/assets/svg/customproperties/number.svg +++ b/openmetadata-ui/src/main/resources/ui/src/assets/svg/customproperties/number.svg @@ -10,4 +10,4 @@ - + \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/CustomPropertyTable/PropertyValue.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/CustomPropertyTable/PropertyValue.tsx index af4d82a1a38..e0b0e4f0768 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/CustomPropertyTable/PropertyValue.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/CustomPropertyTable/PropertyValue.tsx @@ -243,6 +243,7 @@ export const PropertyValue: FC = ({ return ( = ({ return ( = ({ return ( = ({ return ( = ({ return ( = ({ return ( = ({ return ( = ({ return ( = ({ return (