@@ -4,6 +4,7 @@ import {SetCodec} from "edgedb/dist/codecs/set";
4
4
import { DataGridState } from "../dataGrid/state" ;
5
5
import { assertNever } from "../../utils/assertNever" ;
6
6
import { NamedTupleCodec } from "edgedb/dist/codecs/namedtuple" ;
7
+ import { RecordCodec } from "edgedb/dist/codecs/record" ;
7
8
8
9
export function createResultGridState ( codec : ICodec , data : any [ ] ) {
9
10
return new ResultGridState ( codec , data ) ;
@@ -15,6 +16,7 @@ export interface GridHeader {
15
16
id : string ;
16
17
parent : GridHeader | null ;
17
18
name : string | null ;
19
+ key : string | number | null ;
18
20
multi : boolean ;
19
21
codec : ICodec ;
20
22
typename : string ;
@@ -76,7 +78,7 @@ export class ResultGridState {
76
78
? tops . findIndex ( ( top ) => top > offsetRowIndex ) - 1
77
79
: offsetRowIndex ;
78
80
return {
79
- data : parentData [ dataIndex ] ?. [ header . parent . name ! ] ?? [ ] ,
81
+ data : parentData [ dataIndex ] ?. [ header . parent . key ! ] ?? [ ] ,
80
82
indexOffset : indexOffset + ( tops ? tops [ dataIndex ] : dataIndex ) ,
81
83
endIndex : indexOffset + ( tops ? tops [ dataIndex + 1 ] : dataIndex + 1 ) ,
82
84
} ;
@@ -97,8 +99,8 @@ function _getRowTops(
97
99
if ( ! header . multi ) continue ;
98
100
const colHeight =
99
101
header . subHeaders && header . subHeaders [ 0 ] . name !== null
100
- ? _getRowTops ( topsMap , item [ header . name ! ] , header . subHeaders )
101
- : item [ header . name ! ] . length ;
102
+ ? _getRowTops ( topsMap , item [ header . key ! ] , header . subHeaders )
103
+ : item [ header . key ! ] . length ;
102
104
if ( colHeight > height ) {
103
105
height = colHeight ;
104
106
}
@@ -139,6 +141,7 @@ function _getHeaders(
139
141
id : parent ? `${ parent . id } .${ field . name } ` : field . name ,
140
142
parent,
141
143
name : field . name ,
144
+ key : field . name ,
142
145
multi,
143
146
codec : subcodec ,
144
147
typename : getTypename ( subcodec ) ,
@@ -165,6 +168,7 @@ function _getHeaders(
165
168
id : `${ header . id } .__multi__` ,
166
169
parent : header ,
167
170
name : null ,
171
+ key : null ,
168
172
multi : false ,
169
173
codec : subcodec ,
170
174
typename : getTypename ( subcodec ) ,
@@ -180,6 +184,31 @@ function _getHeaders(
180
184
}
181
185
}
182
186
return { headers, colCount} ;
187
+ } else if ( codec instanceof RecordCodec ) {
188
+ const subcodecs = codec . getSubcodecs ( ) ;
189
+ const headers : GridHeader [ ] = [ ] ;
190
+ let i = 0 ;
191
+ const names = codec . getNames ( ) ;
192
+ for ( const name of names ) {
193
+ const subcodec = subcodecs [ i ] ;
194
+ const startIndex = indexStart + i ;
195
+ const header : GridHeader = {
196
+ id : name ,
197
+ parent,
198
+ name : name ,
199
+ key : i ,
200
+ multi : false ,
201
+ codec : subcodec ,
202
+ typename : getTypename ( subcodec ) ,
203
+ depth,
204
+ startIndex,
205
+ span : 1 ,
206
+ subHeaders : null ,
207
+ } ;
208
+ headers . push ( header ) ;
209
+ i ++ ;
210
+ }
211
+ return { headers, colCount : headers . length } ;
183
212
}
184
213
throw new Error ( `unexpected codec kind: ${ codec . getKind ( ) } ` ) ;
185
214
}
@@ -197,6 +226,7 @@ function getTypename(codec: ICodec): string {
197
226
case "scalar" :
198
227
case "object" :
199
228
case "sparse_object" :
229
+ case "record" :
200
230
return codec . getKnownTypeName ( ) ;
201
231
case "array" :
202
232
case "range" :
0 commit comments