import React from 'react'; import {ChevronsCollapseVertical, ChevronsExpandVertical} from '@gravity-ui/icons'; import {Button, Flex, Icon, Select, Text} from '@gravity-ui/uikit'; import {StringParam, useQueryParams} from 'use-query-params'; import {z} from 'zod'; import {LoaderWrapper} from '../../components/LoaderWrapper/LoaderWrapper'; import {VersionsBar} from '../../components/VersionsBar/VersionsBar'; import {nodesApi} from '../../store/reducers/nodes/nodes'; import type {PreparedStorageNode} from '../../store/reducers/storage/types'; import type {TClusterInfo} from '../../types/api/cluster'; import {cn} from '../../utils/cn'; import {useAutoRefreshInterval} from '../../utils/hooks'; import type {PreparedVersion, VersionsDataMap} from '../../utils/versions/types'; import {GroupedNodesTree} from './GroupedNodesTree/GroupedNodesTree'; import {getGroupedStorageNodes, getGroupedTenantNodes, getOtherNodes} from './groupNodes'; import i18n from './i18n'; import type {GroupedNodesItem} from './types'; import {GroupByValue} from './types'; import {useGetPreparedVersions, useVersionsDataMap} from './utils'; import './Versions.scss'; const b = cn('ydb-versions'); interface VersionsContainerProps { cluster?: TClusterInfo; loading?: boolean; } export function VersionsContainer({cluster, loading}: VersionsContainerProps) { const [autoRefreshInterval] = useAutoRefreshInterval(); const {currentData, isLoading: isNodesLoading} = nodesApi.useGetNodesQuery( {tablets: false, fieldsRequired: ['SystemState', 'SubDomainKey']}, {pollingInterval: autoRefreshInterval}, ); const versionsDataMap = useVersionsDataMap(cluster); const preparedVersions = useGetPreparedVersions({ cluster, versionsDataMap, clusterLoading: loading, }); return ( ); } interface VersionsProps { nodes?: PreparedStorageNode[]; preparedVersions: PreparedVersion[]; versionsDataMap?: VersionsDataMap; } const groupByValueSchema = z.nativeEnum(GroupByValue).catch(GroupByValue.VERSION); function Versions({preparedVersions, nodes, versionsDataMap}: VersionsProps) { const [{groupBy: rawGroupByValue}, setQueryParams] = useQueryParams({ groupBy: StringParam, }); const groupByValue = groupByValueSchema.parse(rawGroupByValue); const tenantNodes = React.useMemo(() => { return getGroupedTenantNodes(nodes, versionsDataMap, groupByValue); }, [groupByValue, nodes, versionsDataMap]); const storageNodes = React.useMemo(() => { return getGroupedStorageNodes(nodes, versionsDataMap); }, [nodes, versionsDataMap]); const otherNodes = React.useMemo(() => { return getOtherNodes(nodes, versionsDataMap); }, [nodes, versionsDataMap]); const handleGroupByValueChange = (value: string) => { setQueryParams({groupBy: value as GroupByValue}, 'replaceIn'); }; const renderGroupControl = () => { const options = [ {value: GroupByValue.TENANT, content: i18n('title_database')}, {value: GroupByValue.VERSION, content: i18n('title_version')}, ]; return (