@@ -4,33 +4,31 @@ import cn from 'bem-cn-lite';
44import { Button , Icon , ArrowToggle } from '@gravity-ui/uikit' ;
55import ShortyString from '../../../../components/ShortyString/ShortyString' ;
66
7- import { IssueType , SEVERITY , getSeverity } from './models ' ;
7+ import type { ErrorResponse , IssueMessage } from '../../../../types/api/query ' ;
88
99import fatalIcon from '../../../../assets/icons/circle-xmark.svg' ;
1010import errorIcon from '../../../../assets/icons/triangle-exclamation.svg' ;
1111import warningIcon from '../../../../assets/icons/circle-exclamation.svg' ;
1212import infoIcon from '../../../../assets/icons/circle-info.svg' ;
1313
14+ import { SEVERITY , getSeverity } from './models' ;
15+
1416import './Issues.scss' ;
1517
1618const blockWrapper = cn ( 'kv-result-issues' ) ;
1719const blockIssues = cn ( 'kv-issues' ) ;
1820const blockIssue = cn ( 'kv-issue' ) ;
1921
20- type DataIssues = {
21- error : IssueType ;
22- issues ?: IssueType [ ] ;
23- } ;
24-
2522interface ResultIssuesProps {
26- data : DataIssues | string ;
23+ data : ErrorResponse | string ;
2724 className : string ;
2825}
2926
3027export default function ResultIssues ( { data, className} : ResultIssuesProps ) {
3128 const [ showIssues , setShowIssues ] = React . useState ( false ) ;
3229
33- const hasIssues = typeof data === 'string' ? false : Array . isArray ( data ?. issues ) ;
30+ const issues = typeof data === 'string' ? undefined : data ?. issues ;
31+ const hasIssues = Array . isArray ( issues ) && issues . length > 0 ;
3432
3533 const renderTitle = ( ) => {
3634 let content ;
@@ -61,37 +59,37 @@ export default function ResultIssues({data, className}: ResultIssuesProps) {
6159 </ Button >
6260 ) }
6361 </ div >
64- { hasIssues && showIssues && (
65- < Issues issues = { ( data as DataIssues ) . issues ! } className = { className } />
66- ) }
62+ { hasIssues && showIssues && < Issues issues = { issues } className = { className } /> }
6763 </ div >
6864 ) ;
6965}
7066
7167interface IssuesProps {
7268 className ?: string ;
73- issues : IssueType [ ] ;
69+ issues : IssueMessage [ ] | null | undefined ;
7470}
7571export function Issues ( { issues, className} : IssuesProps ) {
76- const mostSevereIssue = issues . reduce ( ( result , issue ) => {
72+ const mostSevereIssue = issues ? .reduce ( ( result , issue ) => {
7773 const severity = issue . severity ?? 10 ;
7874 return Math . min ( result , severity ) ;
7975 } , 10 ) ;
8076 return (
8177 < div className = { blockIssues ( null , className ) } >
82- { issues . map ( ( issue , index ) => (
78+ { issues ? .map ( ( issue , index ) => (
8379 < Issue key = { index } issue = { issue } expanded = { issue === mostSevereIssue } />
8480 ) ) }
8581 </ div >
8682 ) ;
8783}
8884
89- function Issue ( { issue, level = 0 } : { issue : IssueType ; expanded ?: boolean ; level ?: number } ) {
85+ function Issue ( { issue, level = 0 } : { issue : IssueMessage ; expanded ?: boolean ; level ?: number } ) {
9086 const [ isExpand , setIsExpand ] = React . useState ( true ) ;
9187 const severity = getSeverity ( issue . severity ) ;
92- const hasIssues = Array . isArray ( issue . issues ) && issue . issues . length > 0 ;
9388 const position = getIssuePosition ( issue ) ;
9489
90+ const issues = issue . issues ;
91+ const hasIssues = Array . isArray ( issues ) && issues . length > 0 ;
92+
9593 const arrowDirection = isExpand ? 'bottom' : 'right' ;
9694
9795 return (
@@ -123,18 +121,20 @@ function Issue({issue, level = 0}: {issue: IssueType; expanded?: boolean; level?
123121 < ShortyString value = { issue . message } expandLabel = { 'Show full message' } />
124122 </ div >
125123 </ span >
126- { issue . code ? < span className = { blockIssue ( 'code' ) } > Code: { issue . code } </ span > : null }
124+ { issue . issue_code ? (
125+ < span className = { blockIssue ( 'code' ) } > Code: { issue . issue_code } </ span >
126+ ) : null }
127127 </ div >
128128 { hasIssues && isExpand && (
129129 < div className = { blockIssue ( 'issues' ) } >
130- < IssueList issues = { issue . issues ! } level = { level + 1 } expanded = { isExpand } />
130+ < IssueList issues = { issues } level = { level + 1 } expanded = { isExpand } />
131131 </ div >
132132 ) }
133133 </ div >
134134 ) ;
135135}
136136
137- function IssueList ( props : { issues : IssueType [ ] ; expanded : boolean ; level : number } ) {
137+ function IssueList ( props : { issues : IssueMessage [ ] ; expanded : boolean ; level : number } ) {
138138 const { issues, level, expanded} = props ;
139139 return (
140140 < div className = { blockIssue ( 'list' ) } >
@@ -145,7 +145,7 @@ function IssueList(props: {issues: IssueType[]; expanded: boolean; level: number
145145 ) ;
146146}
147147
148- const severityIcons : Record < SEVERITY , any > = {
148+ const severityIcons : Record < SEVERITY , string > = {
149149 S_INFO : infoIcon ,
150150 S_WARNING : warningIcon ,
151151 S_ERROR : errorIcon ,
@@ -162,10 +162,14 @@ function IssueSeverity({severity}: {severity: SEVERITY}) {
162162 ) ;
163163}
164164
165- function getIssuePosition ( issue : IssueType ) {
166- const { file, position} = issue ;
165+ function getIssuePosition ( issue : IssueMessage ) {
166+ const { position = { } } = issue ;
167+
167168 if ( ! position ) {
168169 return false ;
169170 }
170- return `${ file ? 'file:' : '' } ${ position . row } :${ position . column } ` ;
171+
172+ const { file, row, column} = position ;
173+
174+ return `${ file ? 'file:' : '' } ${ row } :${ column } ` ;
171175}
0 commit comments