diff --git a/src/containers/Tenant/EntityTitle/EntityTitle.tsx b/src/containers/Tenant/EntityTitle/EntityTitle.tsx
new file mode 100644
index 000000000..953291d40
--- /dev/null
+++ b/src/containers/Tenant/EntityTitle/EntityTitle.tsx
@@ -0,0 +1,23 @@
+import {Flex, Label} from '@gravity-ui/uikit';
+
+import type {TPathDescription} from '../../../types/api/schema';
+import i18n from '../i18n';
+import {getEntityName, isReadOnlyTable} from '../utils';
+
+interface EntityTitleProps {
+ data?: TPathDescription;
+}
+
+export function EntityTitle({data}: EntityTitleProps) {
+ const entityName = getEntityName(data);
+
+ if (isReadOnlyTable(data)) {
+ return (
+
+ {entityName}
+
+ );
+ }
+
+ return entityName;
+}
diff --git a/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx b/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx
index ca7c84d57..c558bd5b8 100644
--- a/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx
+++ b/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx
@@ -15,7 +15,6 @@ import type {InfoViewerItem} from '../../../components/InfoViewer/InfoViewer';
import {LinkWithIcon} from '../../../components/LinkWithIcon/LinkWithIcon';
import {Loader} from '../../../components/Loader';
import SplitPane from '../../../components/SplitPane';
-import {getEntityName} from '../../../containers/Tenant/utils';
import routes, {createExternalUILink, createHref} from '../../../routes';
import {schemaApi, setShowPreview} from '../../../store/reducers/schema/schema';
import {
@@ -33,6 +32,7 @@ import {
import {formatDateTime, formatSecondsToHours} from '../../../utils/dataFormatters/dataFormatters';
import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks';
import {Acl} from '../Acl/Acl';
+import {EntityTitle} from '../EntityTitle/EntityTitle';
import {SchemaTree} from '../Schema/SchemaTree/SchemaTree';
import {SchemaViewer} from '../Schema/SchemaViewer/SchemaViewer';
import {TENANT_INFO_TABS, TENANT_SCHEMA_TAB, TenantTabsGroups} from '../TenantPages';
@@ -159,7 +159,8 @@ export function ObjectSummary({
});
const {PathDescription} = currentObjectData;
- const title = getEntityName(PathDescription);
+
+ const title = ;
const getPathTypeOverview: Record InfoViewerItem[]) | undefined> = {
[EPathType.EPathTypeInvalid]: undefined,
diff --git a/src/containers/Tenant/i18n/en.json b/src/containers/Tenant/i18n/en.json
index 46e8b558d..8b358bb9a 100644
--- a/src/containers/Tenant/i18n/en.json
+++ b/src/containers/Tenant/i18n/en.json
@@ -21,6 +21,7 @@
"summary.mode": "Mode",
"summary.format": "Format",
"summary.retention": "Retention",
+ "label.read-only": "ReadOnly",
"actions.copied": "The path is copied to the clipboard",
"actions.notCopied": "Couldn’t copy the path",
"actions.copyPath": "Copy path",
diff --git a/src/containers/Tenant/utils/index.ts b/src/containers/Tenant/utils/index.ts
index f85b2ccca..d0861b5a8 100644
--- a/src/containers/Tenant/utils/index.ts
+++ b/src/containers/Tenant/utils/index.ts
@@ -7,3 +7,9 @@ export const getEntityName = (pathDescription?: TPathDescription) => {
return mapPathTypeToEntityName(PathType, PathSubType);
};
+
+export const isReadOnlyTable = (pathDescription?: TPathDescription) => {
+ return pathDescription?.UserAttributes?.some(({Key, Value}) => {
+ return Key === '__async_replica' && Value === 'true';
+ });
+};
diff --git a/src/types/api/schema/schema.ts b/src/types/api/schema/schema.ts
index 2bc0c781d..f4929b271 100644
--- a/src/types/api/schema/schema.ts
+++ b/src/types/api/schema/schema.ts
@@ -61,6 +61,7 @@ export interface TPathDescription {
/** info about the path itself */
Self?: TDirEntry;
DomainDescription?: TDomainDescription;
+ UserAttributes?: TUserAttribute[];
// for directory
Children?: TDirEntry[];
@@ -309,3 +310,8 @@ interface TTablePartition {
/** uint64 */
DatashardId?: string;
}
+
+interface TUserAttribute {
+ Key?: string;
+ Value?: string;
+}