ydb-embedded-ui 22.3.0 → 22.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
- package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +19 -4
- package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js.map +1 -1
- package/dist/components/CopyableValue/CopyableValue.d.ts +10 -0
- package/dist/components/CopyableValue/CopyableValue.js +10 -0
- package/dist/components/CopyableValue/CopyableValue.js.map +1 -0
- package/dist/components/CopyableValue/CopyableValue.scss +16 -0
- package/dist/components/CopyableValue/i18n/en.json +3 -0
- package/dist/components/CopyableValue/i18n/index.d.ts +2 -0
- package/dist/components/CopyableValue/i18n/index.js +6 -0
- package/dist/components/CopyableValue/i18n/index.js.map +1 -0
- package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +2 -1
- package/dist/components/CriticalActionDialog/CriticalActionDialog.js +2 -1
- package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
- package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +8 -19
- package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +68 -92
- package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
- package/dist/components/DiskCapacityInfo/i18n/en.json +0 -1
- package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
- package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
- package/dist/components/DiskPopup/DiskPopup.js +44 -0
- package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
- package/dist/components/DiskPopup/DiskPopup.scss +203 -0
- package/dist/components/DiskPopup/i18n/en.json +3 -0
- package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
- package/dist/components/DiskPopup/i18n/index.js +4 -0
- package/dist/components/DiskPopup/i18n/index.js.map +1 -0
- package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
- package/dist/components/DiskStatus/DiskStatus.js +61 -0
- package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
- package/dist/components/DiskStatus/DiskStatus.scss +59 -0
- package/dist/components/DiskStatus/i18n/en.json +6 -0
- package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
- package/dist/components/DiskStatus/i18n/index.js +4 -0
- package/dist/components/DiskStatus/i18n/index.js.map +1 -0
- package/dist/components/EntityStatus/EntityStatus.d.ts +19 -6
- package/dist/components/EntityStatus/EntityStatus.js +6 -2
- package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
- package/dist/components/EntityStatus/EntityStatus.scss +5 -0
- package/dist/components/EvictVDiskButton/EvictVDiskButton.d.ts +5 -2
- package/dist/components/EvictVDiskButton/EvictVDiskButton.js +3 -2
- package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
- package/dist/components/EvictVDiskButton/i18n/en.json +2 -2
- package/dist/components/FullNodeViewer/FullNodeViewer.js +4 -7
- package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
- package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
- package/dist/components/HoverPopup/HoverPopup.d.ts +3 -1
- package/dist/components/HoverPopup/HoverPopup.js +131 -28
- package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
- package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
- package/dist/components/HoverPopup/usePopupPriority.js +30 -0
- package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
- package/dist/components/MemoryViewer/MemoryViewer.d.ts +3 -1
- package/dist/components/MemoryViewer/MemoryViewer.js +25 -16
- package/dist/components/MemoryViewer/MemoryViewer.js.map +1 -1
- package/dist/components/MemoryViewer/i18n/en.json +4 -3
- package/dist/components/MemoryViewer/i18n/index.d.ts +1 -1
- package/dist/components/MemoryViewer/utils.d.ts +4 -2
- package/dist/components/MemoryViewer/utils.js +11 -11
- package/dist/components/MemoryViewer/utils.js.map +1 -1
- package/dist/components/PDiskInfo/PDiskInfo.d.ts +4 -9
- package/dist/components/PDiskInfo/PDiskInfo.js +32 -144
- package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
- package/dist/components/PDiskInfo/PDiskInfo.scss +15 -0
- package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
- package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
- package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
- package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
- package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
- package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
- package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
- package/dist/components/PDiskInfo/i18n/en.json +69 -4
- package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
- package/dist/components/PDiskInfo/statuses.d.ts +7 -0
- package/dist/components/PDiskInfo/statuses.js +194 -0
- package/dist/components/PDiskInfo/statuses.js.map +1 -0
- package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
- package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
- package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
- package/dist/components/PDiskPopup/i18n/en.json +2 -12
- package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
- package/dist/components/Search/Search.js +3 -1
- package/dist/components/Search/Search.js.map +1 -1
- package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
- package/dist/components/StorageGroupInfo/StorageGroupInfo.js +73 -218
- package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
- package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
- package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
- package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
- package/dist/components/TenantNameWrapper/i18n/index.d.ts +1 -1
- package/dist/components/VDisk/VDisk.d.ts +2 -1
- package/dist/components/VDisk/VDisk.js +24 -33
- package/dist/components/VDisk/VDisk.js.map +1 -1
- package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
- package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
- package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
- package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
- package/dist/components/VDisk/getFlagStatusText.js +18 -0
- package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
- package/dist/components/VDisk/i18n/en.json +1 -1
- package/dist/components/VDisk/i18n/index.d.ts +1 -1
- package/dist/components/VDiskInfo/VDiskInfo.d.ts +3 -7
- package/dist/components/VDiskInfo/VDiskInfo.js +57 -235
- package/dist/components/VDiskInfo/VDiskInfo.js.map +1 -1
- package/dist/components/VDiskInfo/VDiskInfo.scss +19 -3
- package/dist/components/VDiskInfo/getVDiskDetails.d.ts +11 -0
- package/dist/components/VDiskInfo/getVDiskDetails.js +42 -0
- package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
- package/dist/components/VDiskInfo/i18n/en.json +5 -12
- package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
- package/dist/components/VDiskPopup/VDiskPopup.d.ts +7 -8
- package/dist/components/VDiskPopup/VDiskPopup.js +91 -241
- package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
- package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
- package/dist/components/VDiskPopup/i18n/en.json +4 -22
- package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
- package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
- package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
- package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
- package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
- package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
- package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
- package/dist/components/VDiskStatus/VDiskStatus.scss +36 -0
- package/dist/components/VDiskStatus/i18n/en.json +33 -0
- package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
- package/dist/components/VDiskStatus/i18n/index.js +5 -0
- package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
- package/dist/components/VDiskStatus/index.d.ts +2 -0
- package/dist/components/VDiskStatus/index.js +3 -0
- package/dist/components/VDiskStatus/index.js.map +1 -0
- package/dist/components/VDiskStatus/statuses.d.ts +4 -0
- package/dist/components/VDiskStatus/statuses.js +120 -0
- package/dist/components/VDiskStatus/statuses.js.map +1 -0
- package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
- package/dist/components/nodesColumns/columns.d.ts +1 -0
- package/dist/components/nodesColumns/columns.js +13 -6
- package/dist/components/nodesColumns/columns.js.map +1 -1
- package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
- package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
- package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
- package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
- package/dist/containers/Clusters/Clusters.js +35 -6
- package/dist/containers/Clusters/Clusters.js.map +1 -1
- package/dist/containers/Clusters/Clusters.scss +24 -6
- package/dist/containers/Clusters/columns.js +9 -4
- package/dist/containers/Clusters/columns.js.map +1 -1
- package/dist/containers/Clusters/i18n/en.json +6 -0
- package/dist/containers/Clusters/i18n/index.d.ts +1 -1
- package/dist/containers/Header/Header.js +16 -2
- package/dist/containers/Header/Header.js.map +1 -1
- package/dist/containers/Header/HeaderLeftControls.js +3 -1
- package/dist/containers/Header/HeaderLeftControls.js.map +1 -1
- package/dist/containers/Header/PDiskLeftControls.d.ts +1 -0
- package/dist/containers/Header/PDiskLeftControls.js +24 -0
- package/dist/containers/Header/PDiskLeftControls.js.map +1 -0
- package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
- package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
- package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
- package/dist/containers/Header/VDiskLeftControls.d.ts +1 -0
- package/dist/containers/Header/VDiskLeftControls.js +23 -0
- package/dist/containers/Header/VDiskLeftControls.js.map +1 -0
- package/dist/containers/Header/breadcrumbs.js +5 -2
- package/dist/containers/Header/breadcrumbs.js.map +1 -1
- package/dist/containers/Header/i18n/en.json +6 -1
- package/dist/containers/Header/i18n/index.d.ts +1 -1
- package/dist/containers/Nodes/NodesControls/NodesControls.js +1 -1
- package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
- package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +5 -3
- package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
- package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js +4 -2
- package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js.map +1 -1
- package/dist/containers/Nodes/useDebouncedSearch.d.ts +2 -0
- package/dist/containers/Nodes/useDebouncedSearch.js +11 -0
- package/dist/containers/Nodes/useDebouncedSearch.js.map +1 -0
- package/dist/containers/Operations/constants.d.ts +1 -1
- package/dist/containers/PDiskPage/PDiskPage.js +30 -31
- package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
- package/dist/containers/PDiskPage/PDiskPage.scss +22 -11
- package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +7 -7
- package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
- package/dist/containers/PDiskPage/PDiskStorageDetails.d.ts +6 -0
- package/dist/containers/PDiskPage/PDiskStorageDetails.js +28 -0
- package/dist/containers/PDiskPage/PDiskStorageDetails.js.map +1 -0
- package/dist/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
- package/dist/containers/PDiskPage/i18n/en.json +2 -0
- package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
- package/dist/containers/Storage/Disks/Disks.js +36 -9
- package/dist/containers/Storage/Disks/Disks.js.map +1 -1
- package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
- package/dist/containers/Storage/PDisk/PDisk.js +2 -2
- package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
- package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
- package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
- package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
- package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
- package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
- package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +1 -1
- package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
- package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
- package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
- package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
- package/dist/containers/Storage/useStorageQueryParams.d.ts +4 -4
- package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
- package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
- package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
- package/dist/containers/StorageGroupPage/StorageGroupPage.js +20 -13
- package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
- package/dist/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
- package/dist/containers/StorageGroupPage/i18n/en.json +2 -1
- package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
- package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +4 -1
- package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
- package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +11 -2
- package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
- package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
- package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
- package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +56 -19
- package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
- package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/ManagePartitioningDialog/i18n/index.d.ts +1 -1
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +5 -12
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
- package/dist/containers/Tenant/Diagnostics/TopQueries/columns/i18n/index.d.ts +1 -1
- package/dist/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js +2 -2
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js.map +1 -1
- package/dist/containers/Tenant/TenantDrawerHealthcheck.js +17 -2
- package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
- package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
- package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
- package/dist/containers/VDiskPage/VDiskPage.js +33 -33
- package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
- package/dist/containers/VDiskPage/VDiskPage.scss +21 -8
- package/dist/containers/VDiskPage/VDiskStorageDetails.js +27 -29
- package/dist/containers/VDiskPage/VDiskStorageDetails.js.map +1 -1
- package/dist/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
- package/dist/containers/VDiskPage/i18n/en.json +3 -12
- package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
- package/dist/lib.d.ts +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/store/configureStore.d.ts +2 -2
- package/dist/store/defaultStore.d.ts +1 -1
- package/dist/store/reducers/cluster/parseFields.js +1 -0
- package/dist/store/reducers/cluster/parseFields.js.map +1 -1
- package/dist/store/reducers/clusters/clusters.js +1 -0
- package/dist/store/reducers/clusters/clusters.js.map +1 -1
- package/dist/store/reducers/clusters/selectors.d.ts +1 -0
- package/dist/store/reducers/clusters/selectors.js +4 -1
- package/dist/store/reducers/clusters/selectors.js.map +1 -1
- package/dist/store/reducers/clusters/types.d.ts +2 -0
- package/dist/store/reducers/header/types.d.ts +1 -1
- package/dist/store/reducers/index.d.ts +2 -2
- package/dist/store/reducers/pdisk/types.d.ts +1 -0
- package/dist/store/reducers/pdisk/utils.js +6 -1
- package/dist/store/reducers/pdisk/utils.js.map +1 -1
- package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +2 -1
- package/dist/store/reducers/storage/prepareGroupsDisks.js +9 -19
- package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
- package/dist/store/reducers/storage/utils.js +14 -3
- package/dist/store/reducers/storage/utils.js.map +1 -1
- package/dist/store/reducers/streamingQuery/streamingQuery.js +2 -4
- package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
- package/dist/store/reducers/vdisk/types.d.ts +1 -1
- package/dist/store/reducers/vdisk/utils.js +5 -5
- package/dist/store/reducers/vdisk/utils.js.map +1 -1
- package/dist/styles/mixins.scss +22 -0
- package/dist/types/api/meta.d.ts +1 -0
- package/dist/types/api/nodesList.d.ts +2 -0
- package/dist/types/api/pdisk.d.ts +4 -0
- package/dist/types/api/pdisk.js.map +1 -1
- package/dist/types/api/vdisk.d.ts +8 -0
- package/dist/types/api/vdisk.js +7 -0
- package/dist/types/api/vdisk.js.map +1 -1
- package/dist/types/store/nodesList.d.ts +4 -2
- package/dist/uiFactory/types.d.ts +5 -2
- package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
- package/dist/utils/bytesParsers/formatBytes.js +12 -3
- package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
- package/dist/utils/disks/constants.d.ts +1 -0
- package/dist/utils/disks/constants.js +4 -0
- package/dist/utils/disks/constants.js.map +1 -1
- package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
- package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
- package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
- package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
- package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
- package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
- package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
- package/dist/utils/disks/iconCalculators.d.ts +5 -0
- package/dist/utils/disks/iconCalculators.js +1 -1
- package/dist/utils/disks/iconCalculators.js.map +1 -1
- package/dist/utils/disks/prepareDisks.d.ts +6 -2
- package/dist/utils/disks/prepareDisks.js +22 -35
- package/dist/utils/disks/prepareDisks.js.map +1 -1
- package/dist/utils/disks/types.d.ts +9 -2
- package/dist/utils/hooks/useDatabaseHealthcheckAvailable.d.ts +2 -0
- package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js +6 -0
- package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js.map +1 -0
- package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
- package/dist/utils/hooks/useNodeMetadata.js +15 -0
- package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
- package/dist/utils/memory.d.ts +5 -0
- package/dist/utils/memory.js +9 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/nodes.js +6 -2
- package/dist/utils/nodes.js.map +1 -1
- package/dist/utils/storageMetrics.d.ts +3 -2
- package/dist/utils/storageMetrics.js +30 -10
- package/dist/utils/storageMetrics.js.map +1 -1
- package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
- package/dist/utils/timeParsers/formatDuration.js +16 -1
- package/dist/utils/timeParsers/formatDuration.js.map +1 -1
- package/dist/utils/timeParsers/i18n/en.json +5 -1
- package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
- package/dist/utils/timeParsers/i18n/ru.json +5 -1
- package/package.json +2 -2
- package/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +22 -3
- package/src/components/CopyableValue/CopyableValue.scss +16 -0
- package/src/components/CopyableValue/CopyableValue.tsx +40 -0
- package/src/components/CopyableValue/i18n/en.json +3 -0
- package/src/components/CopyableValue/i18n/index.ts +8 -0
- package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +3 -0
- package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +75 -129
- package/src/components/DiskCapacityInfo/i18n/en.json +0 -1
- package/src/components/DiskPopup/DiskPopup.scss +203 -0
- package/src/components/DiskPopup/DiskPopup.tsx +123 -0
- package/src/components/DiskPopup/i18n/en.json +3 -0
- package/src/components/DiskPopup/i18n/index.ts +5 -0
- package/src/components/DiskStatus/DiskStatus.scss +59 -0
- package/src/components/DiskStatus/DiskStatus.tsx +149 -0
- package/src/components/DiskStatus/i18n/en.json +6 -0
- package/src/components/DiskStatus/i18n/index.ts +5 -0
- package/src/components/EntityStatus/EntityStatus.scss +5 -0
- package/src/components/EntityStatus/EntityStatus.tsx +39 -6
- package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -2
- package/src/components/EvictVDiskButton/i18n/en.json +2 -2
- package/src/components/FullNodeViewer/FullNodeViewer.tsx +4 -9
- package/src/components/HoverPopup/HoverPopup.tsx +157 -34
- package/src/components/HoverPopup/usePopupPriority.ts +39 -0
- package/src/components/MemoryViewer/MemoryViewer.tsx +30 -17
- package/src/components/MemoryViewer/i18n/en.json +4 -3
- package/src/components/MemoryViewer/utils.ts +19 -12
- package/src/components/PDiskInfo/PDiskInfo.scss +15 -0
- package/src/components/PDiskInfo/PDiskInfo.tsx +51 -243
- package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
- package/src/components/PDiskInfo/PDiskLogSize.tsx +41 -0
- package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
- package/src/components/PDiskInfo/i18n/en.json +69 -10
- package/src/components/PDiskInfo/statuses.ts +222 -0
- package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
- package/src/components/PDiskPopup/i18n/en.json +2 -12
- package/src/components/Search/Search.tsx +5 -2
- package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
- package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +119 -263
- package/src/components/StorageGroupInfo/i18n/en.json +1 -9
- package/src/components/VDisk/VDisk.tsx +34 -36
- package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
- package/src/components/VDisk/getFlagStatusText.ts +19 -0
- package/src/components/VDisk/i18n/en.json +1 -1
- package/src/components/VDiskInfo/VDiskInfo.scss +19 -3
- package/src/components/VDiskInfo/VDiskInfo.tsx +119 -341
- package/src/components/VDiskInfo/getVDiskDetails.tsx +63 -0
- package/src/components/VDiskInfo/i18n/en.json +5 -21
- package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
- package/src/components/VDiskPopup/VDiskPopup.tsx +192 -424
- package/src/components/VDiskPopup/i18n/en.json +4 -22
- package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
- package/src/components/VDiskStatus/VDiskStatus.scss +36 -0
- package/src/components/VDiskStatus/VDiskStatus.tsx +49 -0
- package/src/components/VDiskStatus/i18n/en.json +33 -0
- package/src/components/VDiskStatus/i18n/index.ts +7 -0
- package/src/components/VDiskStatus/index.ts +7 -0
- package/src/components/VDiskStatus/statuses.ts +139 -0
- package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
- package/src/components/nodesColumns/columns.tsx +26 -12
- package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
- package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
- package/src/containers/Clusters/Clusters.scss +24 -6
- package/src/containers/Clusters/Clusters.tsx +74 -5
- package/src/containers/Clusters/columns.tsx +36 -6
- package/src/containers/Clusters/i18n/en.json +6 -0
- package/src/containers/Header/Header.tsx +19 -3
- package/src/containers/Header/HeaderLeftControls.tsx +3 -1
- package/src/containers/Header/PDiskLeftControls.tsx +41 -0
- package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
- package/src/containers/Header/VDiskLeftControls.tsx +40 -0
- package/src/containers/Header/breadcrumbs.tsx +4 -2
- package/src/containers/Header/i18n/en.json +6 -1
- package/src/containers/Nodes/NodesControls/NodesControls.tsx +1 -0
- package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +5 -3
- package/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +4 -2
- package/src/containers/Nodes/useDebouncedSearch.ts +13 -0
- package/src/containers/PDiskPage/PDiskPage.scss +22 -11
- package/src/containers/PDiskPage/PDiskPage.tsx +88 -56
- package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +16 -11
- package/src/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
- package/src/containers/PDiskPage/PDiskStorageDetails.tsx +64 -0
- package/src/containers/PDiskPage/i18n/en.json +2 -0
- package/src/containers/Storage/Disks/Disks.tsx +66 -12
- package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
- package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
- package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
- package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
- package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
- package/src/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
- package/src/containers/StorageGroupPage/StorageGroupPage.tsx +63 -26
- package/src/containers/StorageGroupPage/i18n/en.json +2 -1
- package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +5 -1
- package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +12 -1
- package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
- package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +83 -20
- package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
- package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -32
- package/src/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
- package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
- package/src/containers/Tenant/Healthcheck/components/HealthcheckIssue.tsx +18 -8
- package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +24 -1
- package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
- package/src/containers/VDiskPage/VDiskPage.scss +21 -8
- package/src/containers/VDiskPage/VDiskPage.tsx +103 -64
- package/src/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
- package/src/containers/VDiskPage/VDiskStorageDetails.tsx +50 -158
- package/src/containers/VDiskPage/i18n/en.json +3 -14
- package/src/lib.ts +1 -0
- package/src/store/reducers/cluster/parseFields.ts +1 -0
- package/src/store/reducers/clusters/clusters.ts +1 -0
- package/src/store/reducers/clusters/selectors.ts +4 -0
- package/src/store/reducers/clusters/types.ts +3 -0
- package/src/store/reducers/header/types.ts +3 -1
- package/src/store/reducers/pdisk/types.ts +1 -0
- package/src/store/reducers/pdisk/utils.ts +6 -3
- package/src/store/reducers/storage/prepareGroupsDisks.ts +9 -22
- package/src/store/reducers/storage/utils.ts +17 -3
- package/src/store/reducers/streamingQuery/streamingQuery.ts +2 -4
- package/src/store/reducers/vdisk/types.ts +2 -1
- package/src/store/reducers/vdisk/utils.ts +4 -5
- package/src/styles/mixins.scss +22 -0
- package/src/types/api/meta.ts +1 -0
- package/src/types/api/nodesList.ts +3 -0
- package/src/types/api/pdisk.ts +4 -0
- package/src/types/api/vdisk.ts +9 -0
- package/src/types/store/nodesList.ts +7 -7
- package/src/uiFactory/types.ts +9 -2
- package/src/utils/bytesParsers/formatBytes.ts +23 -4
- package/src/utils/disks/constants.ts +5 -0
- package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
- package/src/utils/disks/diskInfo/i18n/en.json +9 -0
- package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
- package/src/utils/disks/iconCalculators.ts +1 -1
- package/src/utils/disks/prepareDisks.ts +21 -47
- package/src/utils/disks/types.ts +10 -2
- package/src/utils/hooks/useDatabaseHealthcheckAvailable.ts +9 -0
- package/src/utils/hooks/useNodeMetadata.ts +21 -0
- package/src/utils/memory.ts +16 -0
- package/src/utils/nodes.ts +7 -1
- package/src/utils/storageMetrics.ts +38 -14
- package/src/utils/timeParsers/formatDuration.ts +22 -1
- package/src/utils/timeParsers/i18n/en.json +5 -1
- package/src/utils/timeParsers/i18n/ru.json +5 -1
- package/dist/components/VDiskInfo/getVDiskCapacityColumns.d.ts +0 -11
- package/dist/components/VDiskInfo/getVDiskCapacityColumns.js +0 -52
- package/dist/components/VDiskInfo/getVDiskCapacityColumns.js.map +0 -1
- package/src/components/VDiskInfo/getVDiskCapacityColumns.tsx +0 -83
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type {StorageGroupsResponse} from '../../../types/api/storage';
|
|
2
2
|
import type {TEvSystemStateResponse} from '../../../types/api/systemState';
|
|
3
|
-
import type {PreparedVDisk} from '../../../utils/disks/types';
|
|
4
3
|
import {prepareNodeSystemState} from '../../../utils/nodes';
|
|
5
4
|
import {prepareGroupsVDisk} from '../storage/prepareGroupsDisks';
|
|
6
5
|
|
|
@@ -20,14 +19,16 @@ export function prepareVDiskDataResponse(
|
|
|
20
19
|
|
|
21
20
|
const preparedVDisk = prepareGroupsVDisk(rawVDisk);
|
|
22
21
|
|
|
23
|
-
let currentVDisk:
|
|
22
|
+
let currentVDisk: VDiskData = {};
|
|
24
23
|
|
|
25
24
|
if (preparedVDisk.StringifiedId === vDiskId) {
|
|
26
25
|
currentVDisk = preparedVDisk;
|
|
27
26
|
} else {
|
|
28
27
|
for (const donor of preparedVDisk.Donors ?? []) {
|
|
29
28
|
if (donor.StringifiedId === vDiskId) {
|
|
30
|
-
|
|
29
|
+
// Keep the recipient's metrics without a back-reference to this donor.
|
|
30
|
+
const {Donors: _donors, ...recipient} = preparedVDisk;
|
|
31
|
+
currentVDisk = {...donor, Recipient: recipient};
|
|
31
32
|
break;
|
|
32
33
|
}
|
|
33
34
|
}
|
|
@@ -40,7 +41,6 @@ export function prepareVDiskDataResponse(
|
|
|
40
41
|
|
|
41
42
|
const NodeId = currentVDisk.NodeId ?? preparedPDisk?.NodeId ?? preparedNode.NodeId;
|
|
42
43
|
const NodeHost = preparedNode.Host;
|
|
43
|
-
const NodeType = preparedNode.Roles?.[0];
|
|
44
44
|
const NodeDC = preparedNode.DC;
|
|
45
45
|
const NodeRack = preparedNode.Rack;
|
|
46
46
|
|
|
@@ -52,7 +52,6 @@ export function prepareVDiskDataResponse(
|
|
|
52
52
|
|
|
53
53
|
NodeId,
|
|
54
54
|
NodeHost,
|
|
55
|
-
NodeType,
|
|
56
55
|
NodeDC,
|
|
57
56
|
NodeRack,
|
|
58
57
|
|
package/src/styles/mixins.scss
CHANGED
|
@@ -9,6 +9,28 @@
|
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
@mixin capacity-alert-label-colors($color) {
|
|
13
|
+
background-color: var(--ydb-capacity-alert-label-background);
|
|
14
|
+
|
|
15
|
+
@if $color == 'green' {
|
|
16
|
+
--ydb-capacity-alert-label-background: var(--g-color-base-positive-light);
|
|
17
|
+
|
|
18
|
+
color: var(--g-color-text-positive-heavy);
|
|
19
|
+
} @else if $color == 'yellow' {
|
|
20
|
+
--ydb-capacity-alert-label-background: var(--g-color-base-warning-light);
|
|
21
|
+
|
|
22
|
+
color: var(--g-color-text-warning-heavy);
|
|
23
|
+
} @else if $color == 'red' {
|
|
24
|
+
--ydb-capacity-alert-label-background: var(--g-color-base-danger-light);
|
|
25
|
+
|
|
26
|
+
color: var(--g-color-base-danger-heavy);
|
|
27
|
+
} @else {
|
|
28
|
+
--ydb-capacity-alert-label-background: var(--ydb-space-#{$color}-bg);
|
|
29
|
+
|
|
30
|
+
color: var(--ydb-space-#{$color}-text);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
12
34
|
@mixin container() {
|
|
13
35
|
max-width: 1170px;
|
|
14
36
|
margin: 0 auto;
|
package/src/types/api/meta.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type {TSystemStateInfo} from './nodes';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* endpoint: /viewer/json/nodesList
|
|
3
5
|
*
|
|
@@ -11,6 +13,7 @@ export interface TNodeInfo {
|
|
|
11
13
|
ResolveHost?: string;
|
|
12
14
|
Address?: string;
|
|
13
15
|
Port?: number;
|
|
16
|
+
Location?: TSystemStateInfo['Location'];
|
|
14
17
|
PhysicalLocation?: TNodeLocation;
|
|
15
18
|
}
|
|
16
19
|
|
package/src/types/api/pdisk.ts
CHANGED
|
@@ -56,6 +56,10 @@ export interface TPDiskStateInfo {
|
|
|
56
56
|
/** float; percent in the 0..100 scale. */
|
|
57
57
|
PDiskUsage?: number;
|
|
58
58
|
PDiskCapacityAlert?: ECapacityAlert | string;
|
|
59
|
+
/** Added by viewer from the BlobStorage controller system view. */
|
|
60
|
+
Status?: EDriveStatus;
|
|
61
|
+
DecommitStatus?: EDecommitStatus;
|
|
62
|
+
MaintenanceStatus?: EMaintenanceStatus;
|
|
59
63
|
}
|
|
60
64
|
|
|
61
65
|
export enum TPDiskState {
|
package/src/types/api/vdisk.ts
CHANGED
|
@@ -41,6 +41,8 @@ export interface TVDiskStateInfo {
|
|
|
41
41
|
SatisfactionRank?: TVDiskSatisfactionRank;
|
|
42
42
|
/** Is VDisk replicated? (i.e. contains all blobs it must have) */
|
|
43
43
|
Replicated?: boolean;
|
|
44
|
+
/** Detailed Whiteboard replication status. May be absent on older nodes. */
|
|
45
|
+
DetailedReplicationStatus?: EVDiskDetailedReplicationStatus;
|
|
44
46
|
/** Does this VDisk has any yet unreplicated phantom-like blobs? */
|
|
45
47
|
UnreplicatedPhantoms?: boolean;
|
|
46
48
|
/** The same for the non-phantom-like blobs. */
|
|
@@ -138,6 +140,13 @@ export enum EVDiskState {
|
|
|
138
140
|
PDiskError = 'PDiskError',
|
|
139
141
|
}
|
|
140
142
|
|
|
143
|
+
export enum EVDiskDetailedReplicationStatus {
|
|
144
|
+
Replicated = 'Replicated',
|
|
145
|
+
WaitingForToken = 'WaitingForToken',
|
|
146
|
+
InProgress = 'InProgress',
|
|
147
|
+
PhantomsOnly = 'PhantomsOnly',
|
|
148
|
+
}
|
|
149
|
+
|
|
141
150
|
/**
|
|
142
151
|
* BSC VDisk data
|
|
143
152
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
>;
|
|
1
|
+
export interface NodeMetadata {
|
|
2
|
+
Host?: string;
|
|
3
|
+
DC?: string;
|
|
4
|
+
Rack?: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type NodesMap = Map<number, NodeMetadata>;
|
package/src/uiFactory/types.ts
CHANGED
|
@@ -7,7 +7,10 @@ import type {
|
|
|
7
7
|
GetHealthcheckViewTitles,
|
|
8
8
|
GetHealthcheckViewsOrder,
|
|
9
9
|
} from '../containers/Tenant/Healthcheck/shared';
|
|
10
|
-
import type {
|
|
10
|
+
import type {
|
|
11
|
+
HealthcheckAssistantActionProps,
|
|
12
|
+
HealthcheckAssistantTarget,
|
|
13
|
+
} from '../containers/Tenant/Healthcheck/types';
|
|
11
14
|
import type {ClusterInfo} from '../store/reducers/cluster/cluster';
|
|
12
15
|
import type {PreparedStorageNode} from '../store/reducers/storage/types';
|
|
13
16
|
import type {PreparedTenant} from '../store/reducers/tenants/types';
|
|
@@ -70,7 +73,7 @@ export interface UIFactory<H extends string = CommonIssueCategory, T extends str
|
|
|
70
73
|
* Renders after the drawer header and before Healthcheck content.
|
|
71
74
|
* Stays mounted while the drawer is open, independent of loading, error or issue state.
|
|
72
75
|
*/
|
|
73
|
-
renderDrawerExtension?: () => React.ReactNode;
|
|
76
|
+
renderDrawerExtension?: (props: HealthcheckDrawerExtensionProps) => React.ReactNode;
|
|
74
77
|
};
|
|
75
78
|
hasAccess: HasAccess;
|
|
76
79
|
hideGrantAccess?: boolean;
|
|
@@ -211,6 +214,10 @@ export type RenderNodeTooltipActions = (props: {data?: PreparedStorageNode}) =>
|
|
|
211
214
|
|
|
212
215
|
export type RenderChatPanel = () => React.ReactNode;
|
|
213
216
|
|
|
217
|
+
export interface HealthcheckDrawerExtensionProps {
|
|
218
|
+
target?: HealthcheckAssistantTarget;
|
|
219
|
+
}
|
|
220
|
+
|
|
214
221
|
export type RenderHealthcheckAssistantAction = (
|
|
215
222
|
props: HealthcheckAssistantActionProps,
|
|
216
223
|
) => React.ReactNode;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import {GIGABYTE, KILOBYTE, MEGABYTE, PETABYTE, TERABYTE, UNBREAKABLE_GAP} from '../constants';
|
|
2
2
|
import type {FormatToSizeArgs, FormatValuesArgs} from '../dataFormatters/common';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
formatNumber,
|
|
5
|
+
roundToDecimalPlaces,
|
|
6
|
+
roundToPrecision,
|
|
7
|
+
} from '../dataFormatters/dataFormatters';
|
|
8
|
+
import {configuredNumeral} from '../numeral';
|
|
4
9
|
import {isNumeric} from '../utils';
|
|
5
10
|
|
|
6
11
|
import i18n from './i18n';
|
|
@@ -57,8 +62,22 @@ export const getBytesSizeUnit = (value: number) => {
|
|
|
57
62
|
return size;
|
|
58
63
|
};
|
|
59
64
|
|
|
60
|
-
const formatToSize = ({
|
|
61
|
-
|
|
65
|
+
const formatToSize = ({
|
|
66
|
+
value,
|
|
67
|
+
size = 'mb',
|
|
68
|
+
precision = 0,
|
|
69
|
+
fixedDecimalPlaces,
|
|
70
|
+
}: FormatToSizeArgs<BytesSizes> & {fixedDecimalPlaces?: number}) => {
|
|
71
|
+
const convertedValue = Number(value) / sizes[size].value;
|
|
72
|
+
if (fixedDecimalPlaces !== undefined) {
|
|
73
|
+
const roundedValue = roundToDecimalPlaces(convertedValue, fixedDecimalPlaces);
|
|
74
|
+
const pattern =
|
|
75
|
+
roundedValue !== 0 && fixedDecimalPlaces > 0
|
|
76
|
+
? `0,0.${'0'.repeat(fixedDecimalPlaces)}`
|
|
77
|
+
: '0,0';
|
|
78
|
+
return configuredNumeral(roundedValue).format(pattern);
|
|
79
|
+
}
|
|
80
|
+
const result = roundToPrecision(convertedValue, precision);
|
|
62
81
|
|
|
63
82
|
return formatNumber(result);
|
|
64
83
|
};
|
|
@@ -78,7 +97,7 @@ export const formatBytes = ({
|
|
|
78
97
|
withSizeLabel = true,
|
|
79
98
|
delimiter,
|
|
80
99
|
...params
|
|
81
|
-
}: FormatValuesArgs<BytesSizes>) => {
|
|
100
|
+
}: FormatValuesArgs<BytesSizes> & {fixedDecimalPlaces?: number}) => {
|
|
82
101
|
if (!isNumeric(value)) {
|
|
83
102
|
return '';
|
|
84
103
|
}
|
|
@@ -142,6 +142,7 @@ export const PDISK_STATE_SEVERITY = {
|
|
|
142
142
|
export interface LabelVisualConfig {
|
|
143
143
|
theme: LabelProps['theme'];
|
|
144
144
|
icon?: IconData;
|
|
145
|
+
dangerHeavy?: boolean;
|
|
145
146
|
}
|
|
146
147
|
|
|
147
148
|
export const NUMERIC_SEVERITY_TO_LABEL_VIEW: Record<number, LabelVisualConfig> = {
|
|
@@ -157,6 +158,10 @@ export const NUMERIC_SEVERITY_TO_LABEL_VIEW: Record<number, LabelVisualConfig> =
|
|
|
157
158
|
theme: 'danger',
|
|
158
159
|
icon: CircleExclamation,
|
|
159
160
|
},
|
|
161
|
+
[SOLID_RED_SEVERITY]: {
|
|
162
|
+
theme: 'danger',
|
|
163
|
+
dangerHeavy: true,
|
|
164
|
+
},
|
|
160
165
|
[DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Blue]: {
|
|
161
166
|
theme: 'info',
|
|
162
167
|
icon: ArrowsRotateLeft,
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {isNil} from 'lodash';
|
|
2
|
+
|
|
3
|
+
import type {YDBDefinitionListItem} from '../../../components/YDBDefinitionList/YDBDefinitionList';
|
|
4
|
+
import type {NodeMetadata} from '../../../types/store/nodesList';
|
|
5
|
+
import {EMPTY_DATA_PLACEHOLDER} from '../../constants';
|
|
6
|
+
|
|
7
|
+
import i18n from './i18n';
|
|
8
|
+
|
|
9
|
+
export interface DiskDetailItem extends YDBDefinitionListItem {
|
|
10
|
+
/** Stable field identifier for ordering and grouping independently of translated names. */
|
|
11
|
+
id: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface DiskLocationData {
|
|
15
|
+
NodeId?: number;
|
|
16
|
+
PDiskId?: number;
|
|
17
|
+
Path?: string;
|
|
18
|
+
VDiskSlotId?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function getDiskLocationItems(
|
|
22
|
+
data: DiskLocationData,
|
|
23
|
+
nodeData: NodeMetadata,
|
|
24
|
+
{withVDiskSlotId = false}: {withVDiskSlotId?: boolean} = {},
|
|
25
|
+
): DiskDetailItem[] {
|
|
26
|
+
const entries = [
|
|
27
|
+
{id: 'fqdn', name: i18n('field_fqdn'), value: nodeData.Host},
|
|
28
|
+
{id: 'rack', name: i18n('field_rack'), value: nodeData.Rack},
|
|
29
|
+
{id: 'datacenter', name: i18n('field_datacenter'), value: nodeData.DC},
|
|
30
|
+
{id: 'pdisk-path', name: i18n('field_pdisk-path'), value: data.Path},
|
|
31
|
+
{id: 'node-id', name: i18n('field_node-id'), value: data.NodeId || undefined},
|
|
32
|
+
{id: 'pdisk-id', name: i18n('field_pdisk-id'), value: data.PDiskId},
|
|
33
|
+
];
|
|
34
|
+
if (withVDiskSlotId) {
|
|
35
|
+
entries.push({
|
|
36
|
+
id: 'vdisk-slot-id',
|
|
37
|
+
name: i18n('field_vdisk-slot-id'),
|
|
38
|
+
value: data.VDiskSlotId,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return entries.map(({id, name, value}) => {
|
|
42
|
+
const missing = isNil(value) || value === '';
|
|
43
|
+
return {
|
|
44
|
+
id,
|
|
45
|
+
name,
|
|
46
|
+
content: missing ? EMPTY_DATA_PLACEHOLDER : value,
|
|
47
|
+
copyText: missing ? undefined : value,
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -161,7 +161,7 @@ export function calculateFrontQueuesIcon(
|
|
|
161
161
|
* Get icon and color for a single status flag.
|
|
162
162
|
* Maps EFlag to the corresponding pair-legend icon and color.
|
|
163
163
|
*/
|
|
164
|
-
function getFlagIconWithColor(flag: EFlag | undefined): IconWithColor | undefined {
|
|
164
|
+
export function getFlagIconWithColor(flag: EFlag | undefined): IconWithColor | undefined {
|
|
165
165
|
if (!flag || flag === EFlag.Grey) {
|
|
166
166
|
return {
|
|
167
167
|
icon: CircleQuestionFill,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {isNil} from 'lodash';
|
|
2
2
|
|
|
3
|
-
import type {TPDiskStateInfo} from '../../types/api/pdisk';
|
|
3
|
+
import type {TPDiskInfo, TPDiskStateInfo} from '../../types/api/pdisk';
|
|
4
4
|
import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk';
|
|
5
5
|
import {stringifyVdiskId} from '../dataFormatters/dataFormatters';
|
|
6
6
|
import {isNumeric, parseOptionalNonNegativeNumber} from '../utils';
|
|
@@ -8,7 +8,7 @@ import {isNumeric, parseOptionalNonNegativeNumber} from '../utils';
|
|
|
8
8
|
import {calculatePDiskSeverity} from './calculatePDiskSeverity';
|
|
9
9
|
import {calculateVDiskSeverity} from './calculateVDiskSeverity';
|
|
10
10
|
import {getPDiskType} from './getPDiskType';
|
|
11
|
-
import {getPDiskId, isFullVDiskData} from './helpers';
|
|
11
|
+
import {getPDiskId, isFullVDiskData, makeVDiskLocationKey} from './helpers';
|
|
12
12
|
import type {PreparedPDisk, PreparedVDisk} from './types';
|
|
13
13
|
|
|
14
14
|
export function prepareWhiteboardVDiskData(
|
|
@@ -21,16 +21,7 @@ export function prepareWhiteboardVDiskData(
|
|
|
21
21
|
if (!isFullVDiskData(vDiskState)) {
|
|
22
22
|
const {NodeId, PDiskId, VSlotId, ...restVDiskFields} = vDiskState;
|
|
23
23
|
|
|
24
|
-
const
|
|
25
|
-
!isNil(VSlotId) && !isNil(PDiskId) && !isNil(NodeId)
|
|
26
|
-
? {
|
|
27
|
-
NodeId,
|
|
28
|
-
PDiskId,
|
|
29
|
-
VSlotId,
|
|
30
|
-
}
|
|
31
|
-
: undefined;
|
|
32
|
-
|
|
33
|
-
const StringifiedId = stringifyVdiskId(vDiskId);
|
|
24
|
+
const StringifiedId = makeVDiskLocationKey(NodeId, PDiskId, VSlotId) ?? '';
|
|
34
25
|
|
|
35
26
|
return {
|
|
36
27
|
...restVDiskFields,
|
|
@@ -66,13 +57,7 @@ export function prepareWhiteboardVDiskData(
|
|
|
66
57
|
AllocatedSize: AllocatedSize,
|
|
67
58
|
SlotSize: PDisk?.EnforcedDynamicSlotSize,
|
|
68
59
|
});
|
|
69
|
-
const WhiteboardSize = hasWhiteboardData
|
|
70
|
-
? prepareWhiteboardVDiskSizeFields({
|
|
71
|
-
AvailableSize,
|
|
72
|
-
AllocatedSize,
|
|
73
|
-
SlotSize: PDisk?.EnforcedDynamicSlotSize,
|
|
74
|
-
})
|
|
75
|
-
: undefined;
|
|
60
|
+
const WhiteboardSize = hasWhiteboardData ? vDiskSizeFields.DisplaySize : undefined;
|
|
76
61
|
|
|
77
62
|
const Severity = calculateVDiskSeverity(vDiskState);
|
|
78
63
|
|
|
@@ -124,7 +109,7 @@ export function prepareWhiteboardVDiskData(
|
|
|
124
109
|
}
|
|
125
110
|
|
|
126
111
|
export function prepareWhiteboardPDiskData(
|
|
127
|
-
pdiskState: TPDiskStateInfo = {},
|
|
112
|
+
pdiskState: TPDiskStateInfo & Pick<TPDiskInfo, 'StatusV2'> = {},
|
|
128
113
|
whiteboardSizeSource: Pick<TPDiskStateInfo, 'AvailableSize' | 'TotalSize'> | null = pdiskState,
|
|
129
114
|
): PreparedPDisk {
|
|
130
115
|
const hasWhiteboardData = pdiskState.HasWhiteboardData ?? Boolean(whiteboardSizeSource);
|
|
@@ -170,33 +155,7 @@ export function prepareWhiteboardPDiskData(
|
|
|
170
155
|
State,
|
|
171
156
|
Severity,
|
|
172
157
|
SlotSize: EnforcedDynamicSlotSize,
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function prepareWhiteboardVDiskSizeFields({
|
|
177
|
-
AvailableSize,
|
|
178
|
-
AllocatedSize,
|
|
179
|
-
SlotSize,
|
|
180
|
-
}: {
|
|
181
|
-
AvailableSize: unknown;
|
|
182
|
-
AllocatedSize: unknown;
|
|
183
|
-
SlotSize: unknown;
|
|
184
|
-
}) {
|
|
185
|
-
const allocatedSize = parseOptionalNonNegativeNumber(AllocatedSize);
|
|
186
|
-
const availableSize = parseOptionalNonNegativeNumber(AvailableSize);
|
|
187
|
-
const slotSize = parseOptionalNonNegativeNumber(SlotSize);
|
|
188
|
-
const preparedSizeFields = prepareVDiskSizeFields({
|
|
189
|
-
AvailableSize: availableSize,
|
|
190
|
-
AllocatedSize: allocatedSize,
|
|
191
|
-
SlotSize: slotSize,
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
return {
|
|
195
|
-
AllocatedSize: allocatedSize === undefined ? undefined : preparedSizeFields.AllocatedSize,
|
|
196
|
-
SizeLimit:
|
|
197
|
-
availableSize === undefined && slotSize === undefined
|
|
198
|
-
? undefined
|
|
199
|
-
: preparedSizeFields.SizeLimit,
|
|
158
|
+
DriveStatus: pdiskState.Status ?? pdiskState.StatusV2,
|
|
200
159
|
};
|
|
201
160
|
}
|
|
202
161
|
|
|
@@ -253,12 +212,27 @@ export function prepareVDiskSizeFields({
|
|
|
253
212
|
});
|
|
254
213
|
const allocatedPercent = sizeLimit > 0 ? Math.floor((allocated * 100) / sizeLimit) : NaN;
|
|
255
214
|
|
|
215
|
+
// Preserve missing values for display without changing the legacy calculations above.
|
|
216
|
+
const displayAllocatedSize = parseOptionalNonNegativeNumber(AllocatedSize);
|
|
217
|
+
const displayAvailableSize = parseOptionalNonNegativeNumber(AvailableSize);
|
|
218
|
+
const displaySlotSize = parseOptionalNonNegativeNumber(SlotSize);
|
|
219
|
+
let displaySizeLimit: number | undefined;
|
|
220
|
+
if (!displayAvailableSize && displaySlotSize) {
|
|
221
|
+
displaySizeLimit = displaySlotSize;
|
|
222
|
+
} else if (displayAllocatedSize !== undefined && displayAvailableSize !== undefined) {
|
|
223
|
+
displaySizeLimit = displayAllocatedSize + displayAvailableSize;
|
|
224
|
+
}
|
|
225
|
+
|
|
256
226
|
return {
|
|
257
227
|
AvailableSize: available,
|
|
258
228
|
AllocatedSize: allocated,
|
|
259
229
|
SizeLimit: sizeLimit,
|
|
260
230
|
FreeSize: freeSize,
|
|
261
231
|
AllocatedPercent: allocatedPercent,
|
|
232
|
+
DisplaySize: {
|
|
233
|
+
AllocatedSize: displayAllocatedSize,
|
|
234
|
+
SizeLimit: displaySizeLimit,
|
|
235
|
+
},
|
|
262
236
|
};
|
|
263
237
|
}
|
|
264
238
|
|
package/src/utils/disks/types.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type {EFlag} from '../../types/api/enums';
|
|
2
2
|
import type {EDriveStatus, TPDiskInfo, TPDiskStateInfo} from '../../types/api/pdisk';
|
|
3
|
-
import type {EVDiskStatus, TVDiskStateInfo
|
|
3
|
+
import type {EVDiskStatus, TVDiskStateInfo} from '../../types/api/vdisk';
|
|
4
4
|
import type {ValueOf} from '../../types/common';
|
|
5
5
|
|
|
6
6
|
import type {PDISK_TYPES} from './getPDiskType';
|
|
@@ -98,6 +98,8 @@ export interface PreparedVDisk
|
|
|
98
98
|
extends Omit<TVDiskStateInfo, 'PDisk' | 'AvailableSize' | 'AllocatedSize' | 'Donors'> {
|
|
99
99
|
Status?: EVDiskStatus;
|
|
100
100
|
PDisk?: PreparedPDisk;
|
|
101
|
+
PDiskType?: string;
|
|
102
|
+
PDiskPath?: string;
|
|
101
103
|
Severity?: number;
|
|
102
104
|
StringifiedId?: string;
|
|
103
105
|
|
|
@@ -106,6 +108,11 @@ export interface PreparedVDisk
|
|
|
106
108
|
AllocatedPercent?: number;
|
|
107
109
|
SizeLimit?: number;
|
|
108
110
|
FreeSize?: number;
|
|
111
|
+
/** Size values for display, preserving missing source values independently. */
|
|
112
|
+
DisplaySize?: {
|
|
113
|
+
AllocatedSize?: number;
|
|
114
|
+
SizeLimit?: number;
|
|
115
|
+
};
|
|
109
116
|
WhiteboardSize?: {
|
|
110
117
|
AllocatedSize?: number;
|
|
111
118
|
SizeLimit?: number;
|
|
@@ -118,7 +125,8 @@ export interface PreparedVDisk
|
|
|
118
125
|
|
|
119
126
|
export type PDiskType = ValueOf<typeof PDISK_TYPES>;
|
|
120
127
|
|
|
121
|
-
export interface UnavailableDonor
|
|
128
|
+
export interface UnavailableDonor
|
|
129
|
+
extends Pick<PreparedVDisk, 'NodeId' | 'PDiskId' | 'VDiskSlotId'> {
|
|
122
130
|
DonorMode?: boolean;
|
|
123
131
|
StoragePoolName?: string;
|
|
124
132
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type {ETenantType} from '../../types/api/tenant';
|
|
2
|
+
|
|
3
|
+
import {useIsUserAllowedToMakeChanges} from './useIsUserAllowedToMakeChanges';
|
|
4
|
+
|
|
5
|
+
export function useDatabaseHealthcheckAvailable(databaseType?: ETenantType) {
|
|
6
|
+
const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
|
|
7
|
+
|
|
8
|
+
return isUserAllowedToMakeChanges && databaseType !== 'Serverless';
|
|
9
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {isNil} from 'lodash';
|
|
2
|
+
|
|
3
|
+
import {selectNodesMap} from '../../store/reducers/nodesList';
|
|
4
|
+
import type {NodeMetadata} from '../../types/store/nodesList';
|
|
5
|
+
import {useTypedSelector} from '../hooks';
|
|
6
|
+
|
|
7
|
+
import {useDatabaseFromQuery} from './useDatabaseFromQuery';
|
|
8
|
+
|
|
9
|
+
export function useNodeMetadata(
|
|
10
|
+
nodeId: number | undefined,
|
|
11
|
+
parentNodeData?: NodeMetadata,
|
|
12
|
+
): NodeMetadata {
|
|
13
|
+
const database = useDatabaseFromQuery();
|
|
14
|
+
const nodesMap = useTypedSelector((state) => selectNodesMap(state, database));
|
|
15
|
+
const storedNodeData = isNil(nodeId) ? undefined : nodesMap?.get(nodeId);
|
|
16
|
+
return {
|
|
17
|
+
Host: parentNodeData?.Host || storedNodeData?.Host,
|
|
18
|
+
DC: parentNodeData?.DC || storedNodeData?.DC,
|
|
19
|
+
Rack: parentNodeData?.Rack || storedNodeData?.Rack,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type {TSystemStateInfo} from '../types/api/nodes';
|
|
2
|
+
|
|
3
|
+
import {parseOptionalNonNegativeNumber} from './utils';
|
|
4
|
+
|
|
5
|
+
export function getNodeMemory(
|
|
6
|
+
node: Pick<TSystemStateInfo, 'MemoryStats' | 'MemoryUsed' | 'MemoryLimit'>,
|
|
7
|
+
) {
|
|
8
|
+
// Match the backend's process usage and sorting, including its allocator fallback.
|
|
9
|
+
const memoryUsed =
|
|
10
|
+
parseOptionalNonNegativeNumber(node.MemoryUsed) ??
|
|
11
|
+
parseOptionalNonNegativeNumber(node.MemoryStats?.AnonRss) ??
|
|
12
|
+
parseOptionalNonNegativeNumber(node.MemoryStats?.AllocatedMemory);
|
|
13
|
+
const memoryLimit = parseOptionalNonNegativeNumber(node.MemoryLimit) || undefined;
|
|
14
|
+
|
|
15
|
+
return {memoryUsed, memoryLimit};
|
|
16
|
+
}
|
package/src/utils/nodes.ts
CHANGED
|
@@ -32,9 +32,15 @@ export const isUnavailableNode = <
|
|
|
32
32
|
export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
|
|
33
33
|
return nodesList?.reduce<NodesMap>((nodeHosts, node) => {
|
|
34
34
|
if (valueIsDefined(node.Id)) {
|
|
35
|
+
const physicalLocation = node.PhysicalLocation;
|
|
36
|
+
// The legacy numeric Rack can be a hash of the actual rack name.
|
|
37
|
+
const Rack =
|
|
38
|
+
node.Location?.Rack || physicalLocation?.Location?.match(/(?:^|\/)R=([^/]+)/)?.[1];
|
|
39
|
+
|
|
35
40
|
nodeHosts.set(node.Id, {
|
|
36
41
|
Host: node.Host,
|
|
37
|
-
DC: node.
|
|
42
|
+
DC: node.Location?.DataCenter || physicalLocation?.DataCenterId,
|
|
43
|
+
Rack,
|
|
38
44
|
});
|
|
39
45
|
}
|
|
40
46
|
return nodeHosts;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type {BytesSizes} from './bytesParsers';
|
|
2
|
-
import {bytesSizes, getBytesSizeUnit, sizes} from './bytesParsers';
|
|
2
|
+
import {bytesSizes, formatBytes, getBytesSizeUnit, sizes} from './bytesParsers';
|
|
3
3
|
import {EMPTY_DATA_PLACEHOLDER, UNBREAKABLE_GAP} from './constants';
|
|
4
|
-
import {
|
|
5
|
-
formatNumber,
|
|
6
|
-
formatPercent,
|
|
7
|
-
formatStorageValuesToGb,
|
|
8
|
-
} from './dataFormatters/dataFormatters';
|
|
4
|
+
import {formatNumber, formatPercent, roundToDecimalPlaces} from './dataFormatters/dataFormatters';
|
|
9
5
|
import {parseOptionalNonNegativeNumber} from './utils';
|
|
10
6
|
|
|
11
7
|
export interface FormatMetricBytesOptions {
|
|
@@ -165,27 +161,55 @@ export function formatMetricBytes(
|
|
|
165
161
|
: EMPTY_DATA_PLACEHOLDER;
|
|
166
162
|
}
|
|
167
163
|
|
|
168
|
-
export function formatMetricPercent(value?: unknown) {
|
|
164
|
+
export function formatMetricPercent(value?: unknown, fixedDecimalPlaces?: number) {
|
|
169
165
|
const numericValue = parseOptionalNonNegativeNumber(value);
|
|
170
166
|
|
|
171
167
|
if (numericValue === undefined) {
|
|
172
168
|
return EMPTY_DATA_PLACEHOLDER;
|
|
173
169
|
}
|
|
174
170
|
|
|
175
|
-
const precision = Number.isInteger(numericValue) ? 0 : 1;
|
|
171
|
+
const precision = fixedDecimalPlaces ?? (Number.isInteger(numericValue) ? 0 : 1);
|
|
172
|
+
const fixed =
|
|
173
|
+
fixedDecimalPlaces !== undefined && roundToDecimalPlaces(numericValue, precision) !== 0;
|
|
176
174
|
|
|
177
|
-
return formatPercent(numericValue / 100, precision) || EMPTY_DATA_PLACEHOLDER;
|
|
175
|
+
return formatPercent(numericValue / 100, precision, {fixed}) || EMPTY_DATA_PLACEHOLDER;
|
|
178
176
|
}
|
|
179
177
|
|
|
180
|
-
export function formatStorageMetricPair(
|
|
178
|
+
export function formatStorageMetricPair(
|
|
179
|
+
value?: string | number,
|
|
180
|
+
capacity?: string | number,
|
|
181
|
+
fixedDecimalPlaces?: number,
|
|
182
|
+
) {
|
|
181
183
|
const parsedValue = parseOptionalNonNegativeNumber(value);
|
|
182
184
|
const parsedCapacity = parseOptionalNonNegativeNumber(capacity);
|
|
183
185
|
|
|
184
|
-
if (parsedValue === undefined
|
|
186
|
+
if (parsedValue === undefined && parsedCapacity === undefined) {
|
|
185
187
|
return EMPTY_DATA_PLACEHOLDER;
|
|
186
188
|
}
|
|
187
189
|
|
|
188
|
-
return
|
|
190
|
+
return [
|
|
191
|
+
formatBytes({
|
|
192
|
+
value: parsedValue,
|
|
193
|
+
size: 'gb',
|
|
194
|
+
precision: 1,
|
|
195
|
+
withSizeLabel: parsedCapacity === undefined,
|
|
196
|
+
fixedDecimalPlaces,
|
|
197
|
+
}),
|
|
198
|
+
formatBytes({value: parsedCapacity, size: 'gb', fixedDecimalPlaces}),
|
|
199
|
+
]
|
|
200
|
+
.map((formattedValue) => formattedValue || EMPTY_DATA_PLACEHOLDER)
|
|
201
|
+
.join(' / ');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export function formatStorageThroughput(value?: string | number) {
|
|
205
|
+
return (
|
|
206
|
+
formatBytes({
|
|
207
|
+
value: parseOptionalNonNegativeNumber(value),
|
|
208
|
+
size: 'mb',
|
|
209
|
+
fixedDecimalPlaces: 2,
|
|
210
|
+
withSpeedLabel: true,
|
|
211
|
+
}) || EMPTY_DATA_PLACEHOLDER
|
|
212
|
+
);
|
|
189
213
|
}
|
|
190
214
|
|
|
191
215
|
export function formatNormalizedMetricPercent(value?: number) {
|
|
@@ -195,7 +219,7 @@ export function formatNormalizedMetricPercent(value?: number) {
|
|
|
195
219
|
return EMPTY_DATA_PLACEHOLDER;
|
|
196
220
|
}
|
|
197
221
|
|
|
198
|
-
return
|
|
222
|
+
return formatMetricPercent(parsedValue * 100, 2);
|
|
199
223
|
}
|
|
200
224
|
|
|
201
225
|
export function formatMetricCount(value?: unknown) {
|
|
@@ -212,7 +236,7 @@ export function formatMetricCountPair(value?: unknown, capacity?: unknown) {
|
|
|
212
236
|
const formattedValue = formatMetricCount(value);
|
|
213
237
|
const formattedCapacity = formatMetricCount(capacity);
|
|
214
238
|
|
|
215
|
-
if (formattedValue === EMPTY_DATA_PLACEHOLDER
|
|
239
|
+
if (formattedValue === EMPTY_DATA_PLACEHOLDER && formattedCapacity === EMPTY_DATA_PLACEHOLDER) {
|
|
216
240
|
return EMPTY_DATA_PLACEHOLDER;
|
|
217
241
|
}
|
|
218
242
|
|