import {Ban, Check, CircleQuestionFill, CircleXmarkFill} from '@gravity-ui/icons'; import type {EDecommitStatus, EDriveStatus, EMaintenanceStatus} from '../../types/api/pdisk'; import {TPDiskState} from '../../types/api/pdisk'; import {NOT_AVAILABLE_SEVERITY, NUMERIC_SEVERITY_TO_LABEL_VIEW} from '../../utils/disks/constants'; import { getPDiskDecommitDisplayState, getPDiskDriveDisplayState, getPDiskMaintenanceDisplayState, getPDiskStateDisplayState, } from '../../utils/disks/pdiskState'; import type {DiskStatusLabelData} from '../DiskStatus/DiskStatus'; import {pDiskInfoKeyset as i18n} from './i18n'; type StatusText = Pick; function unknownLabel(): DiskStatusLabelData { return { value: i18n('value_unknown'), tooltip: i18n('context_unknown'), theme: 'unknown', icon: CircleQuestionFill, }; } function unavailableLabel(title: string, tooltip: string): DiskStatusLabelData { return { title, value: i18n('value_not-available'), tooltip, theme: 'unknown', icon: CircleQuestionFill, }; } function getLabelView({ severity, icon, }: ReturnType): Pick< DiskStatusLabelData, 'theme' | 'icon' | 'dangerHeavy' > { const labelView = NUMERIC_SEVERITY_TO_LABEL_VIEW[severity]; return { theme: severity === NOT_AVAILABLE_SEVERITY ? 'unknown' : labelView?.theme, icon, dangerHeavy: Boolean(labelView?.dangerHeavy), }; } export function getPDiskStateLabel(state?: TPDiskState): DiskStatusLabelData { const labels: Partial> = { [TPDiskState.Normal]: {value: i18n('value_ok'), tooltip: i18n('context_state-normal')}, [TPDiskState.Initial]: { value: i18n('value_initial'), tooltip: i18n('context_state-initial'), }, [TPDiskState.InitialFormatRead]: { value: i18n('value_initial-format-read'), tooltip: i18n('context_initial-format-read'), }, [TPDiskState.InitialSysLogRead]: { value: i18n('value_initial-sys-log-read'), tooltip: i18n('context_initial-sys-log-read'), }, [TPDiskState.InitialCommonLogRead]: { value: i18n('value_initial-common-log-read'), tooltip: i18n('context_initial-common-log-read'), }, [TPDiskState.OpenFileError]: { value: i18n('value_open-file-error'), tooltip: i18n('context_open-file-error'), }, [TPDiskState.DeviceIoError]: { value: i18n('value_device-io-error'), tooltip: i18n('context_device-io-error'), }, [TPDiskState.Stopped]: {value: i18n('value_stopped'), tooltip: i18n('context_stopped')}, [TPDiskState.InitialFormatReadError]: { value: i18n('value_initial-format-read-error'), tooltip: i18n('context_initial-format-read-error'), }, [TPDiskState.InitialSysLogReadError]: { value: i18n('value_initial-sys-log-read-error'), tooltip: i18n('context_initial-sys-log-read-error'), }, [TPDiskState.InitialSysLogParseError]: { value: i18n('value_initial-sys-log-parse-error'), tooltip: i18n('context_initial-sys-log-parse-error'), }, [TPDiskState.CommonLoggerInitError]: { value: i18n('value_common-logger-init-error'), tooltip: i18n('context_common-logger-init-error'), }, [TPDiskState.InitialCommonLogReadError]: { value: i18n('value_initial-common-log-read-error'), tooltip: i18n('context_initial-common-log-read-error'), }, [TPDiskState.InitialCommonLogParseError]: { value: i18n('value_initial-common-log-parse-error'), tooltip: i18n('context_initial-common-log-parse-error'), }, [TPDiskState.ChunkQuotaError]: { value: i18n('value_chunk-quota-error'), tooltip: i18n('context_chunk-quota-error'), }, }; const label = state && Object.hasOwn(labels, state) ? labels[state] : undefined; if (!label) { return unknownLabel(); } const {theme, icon, dangerHeavy} = getLabelView(getPDiskStateDisplayState(state)); return { ...label, theme, icon: state === TPDiskState.Normal ? Check : icon, dangerHeavy, }; } export function getPDiskDriveLabel(status?: EDriveStatus): DiskStatusLabelData | undefined { if (!status || status === 'UNKNOWN') { return unavailableLabel(i18n('field_drive'), i18n('context_drive-not-available')); } const labels: Record, StatusText> = { ACTIVE: {value: i18n('value_active'), tooltip: i18n('context_active')}, INACTIVE: {value: i18n('value_inactive'), tooltip: i18n('context_inactive')}, TO_BE_REMOVED: {value: i18n('value_to-be-removed'), tooltip: i18n('context_to-be-removed')}, FAULTY: {value: i18n('value_faulty'), tooltip: i18n('context_faulty')}, BROKEN: {value: i18n('value_broken'), tooltip: i18n('context_broken')}, }; if (!Object.hasOwn(labels, status)) { return undefined; } const {theme, icon: defaultIcon} = getLabelView(getPDiskDriveDisplayState(status)); let icon = defaultIcon; if (status === 'ACTIVE') { icon = Check; } else if (status === 'BROKEN') { icon = CircleXmarkFill; } return { ...labels[status], theme, icon, dangerHeavy: status === 'BROKEN', }; } export function getPDiskDecommitLabel(status?: EDecommitStatus): DiskStatusLabelData | undefined { if (!status || status === 'DECOMMIT_UNSET') { return unavailableLabel(i18n('field_decommit'), i18n('context_decommit-not-available')); } const labels: Record, StatusText> = { DECOMMIT_NONE: {value: i18n('value_decommit-none'), tooltip: i18n('context_decommit-none')}, DECOMMIT_PENDING: { value: i18n('value_decommit-pending'), tooltip: i18n('context_decommit-pending'), }, DECOMMIT_REJECTED: { value: i18n('value_decommit-rejected'), tooltip: i18n('context_decommit-rejected'), }, DECOMMIT_IMMINENT: { value: i18n('value_decommit-imminent'), tooltip: i18n('context_decommit-imminent'), }, }; if (!Object.hasOwn(labels, status)) { return undefined; } const {theme, icon, dangerHeavy} = getLabelView(getPDiskDecommitDisplayState(status)); return { ...labels[status], theme, icon: status === 'DECOMMIT_NONE' ? Ban : icon, dangerHeavy, }; } export function getPDiskMaintenanceLabel( status?: EMaintenanceStatus, ): DiskStatusLabelData | undefined { if (!status) { return unavailableLabel( i18n('label_maintenance'), i18n('context_maintenance-not-available'), ); } const labels: Record = { NO_REQUEST: { value: i18n('value_maintenance-none'), tooltip: i18n('context_maintenance-none'), }, NOT_SET: { value: i18n('value_maintenance-unset'), tooltip: i18n('context_maintenance-unset'), }, NO_NEW_VDISKS: { value: i18n('value_maintenance-no-new-vdisks'), tooltip: i18n('context_maintenance-no-new-vdisks'), }, LONG_TERM_MAINTENANCE_PLANNED: { value: i18n('value_maintenance-long-term'), tooltip: i18n('context_maintenance-long-term'), }, }; if (!Object.hasOwn(labels, status)) { return undefined; } const {theme, icon, dangerHeavy} = getLabelView(getPDiskMaintenanceDisplayState(status)); return { ...labels[status], title: i18n('label_maintenance'), // An explicitly unset status is shown as a normal state in the popup design. theme: status === 'NOT_SET' ? 'success' : theme, icon: status === 'NOT_SET' ? undefined : icon, dangerHeavy, }; }