import React from 'react'; import type {Column} from '@gravity-ui/react-data-table'; import DataTable from '@gravity-ui/react-data-table'; import {ClipboardButton, Flex, HelpMark, Progress, Text} from '@gravity-ui/uikit'; import { ColumnTableIcon, ExternalTableIcon, TableIcon, TableIndexIcon, TopicIcon, ViewIcon, } from 'ydb-ui-components'; import {CellWithPopover} from '../../../../../components/CellWithPopover/CellWithPopover'; import {LinkToSchemaObject} from '../../../../../components/LinkToSchemaObject/LinkToSchemaObject'; import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import {EPathType} from '../../../../../types/api/schema'; import {cn} from '../../../../../utils/cn'; import { EMPTY_DATA_PLACEHOLDER, TENANT_OVERVIEW_TABLES_SETTINGS, } from '../../../../../utils/constants'; import {formatPercent} from '../../../../../utils/dataFormatters/dataFormatters'; import {mapPathTypeToEntityName, mapPathTypeToNavigationTreeType} from '../../../utils/schema'; import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; import { formatTenantStorageTableMetric, formatTenantStorageTableOverhead, } from './displayFormatters'; import i18n from './i18n'; import type {TenantStorageTopRow} from './utils'; import {isSystemStoragePath} from './utils'; import './TenantStorageTopUsageTable.scss'; const b = cn('ydb-tenant-storage-top-usage-table'); const TENANT_STORAGE_COLUMNS_WIDTH_LS_KEY = 'tenantStorageTopUsageTableColumnsWidth'; interface TenantStorageTopUsageTableProps { error?: unknown; loading: boolean; rows: TenantStorageTopRow[]; withData: boolean; } function renderPathTypeIcon(row: TenantStorageTopRow) { if (isSystemStoragePath(row.path)) { return ; } switch (mapPathTypeToNavigationTreeType(row.pathType, row.pathSubType, 'directory')) { case 'column_table': return ; case 'topic': return ; case 'index': return ; case 'view': return ; case 'external_table': return ; case 'table': case 'index_table': case 'system_table': return ; default: return null; } } function getObjectName(path: string) { const normalizedPath = path.endsWith('/') ? path.slice(0, -1) : path; const pathParts = normalizedPath.split('/'); return pathParts[pathParts.length - 1] || normalizedPath; } function TypeCell({row}: {row: TenantStorageTopRow}) { let label = row.displayTypeLabel ?? mapPathTypeToEntityName(row.pathType, row.pathSubType) ?? i18n('value_object'); if (!row.displayTypeLabel && isSystemStoragePath(row.path)) { label = i18n('value_system-table'); } else if (!row.displayTypeLabel && row.pathType === EPathType.EPathTypeTable) { label = i18n('value_row-table'); } return (
{renderPathTypeIcon(row)}
{label}
); } function ObjectPathCell({row}: {row: TenantStorageTopRow}) { const pathLabel = row.displayPath ?? row.path; const objectName = getObjectName(pathLabel); return ( {objectName}
{pathLabel}
); } function DatabaseSpaceCell({row}: {row: TenantStorageTopRow}) { const share = Math.min(Math.max(row.dbShare, 0), 1); const percent = share * 100; const precision = percent > 0 && percent < 1 ? 1 : 0; return (
{formatPercent(share, precision) || EMPTY_DATA_PLACEHOLDER}
); } function getTopUsageColumns(): Column[] { return [ { name: 'type', header: i18n('field_type'), width: 130, align: DataTable.LEFT, render: ({row}) => , }, { name: 'path', header: i18n('field_object-path'), width: undefined, align: DataTable.LEFT, render: ({row}) => , }, { name: 'dbShare', header: i18n('field_database-space'), width: 220, align: DataTable.LEFT, render: ({row}) => , }, { name: 'dataSize', header: i18n('field_user-data'), width: 100, align: DataTable.LEFT, render: ({row}) => ( {formatTenantStorageTableMetric(row.userData)} ), }, { name: 'storageSize', header: i18n('field_physical-disk'), width: 140, align: DataTable.LEFT, render: ({row}) => ( {formatTenantStorageTableMetric(row.physicalDisk)} ), }, { name: 'overhead', header: ( {i18n('field_overhead')} {i18n('context_overhead-description')} ), width: 106, align: DataTable.LEFT, render: ({row}) => ( {formatTenantStorageTableOverhead(row.overhead)} ), }, ]; } export function TenantStorageTopUsageTable({ error, loading, rows, withData, }: TenantStorageTopUsageTableProps) { const columns = React.useMemo(() => getTopUsageColumns(), []); return (
{i18n('title_top-space-usage-main')} {i18n('title_top-space-usage-suffix')} } >
); }