@@ -7,7 +7,7 @@ import type * as TextUtils from '../../../../models/text_utils/text_utils.js';
77import inspectorCommonStyles from '../../inspectorCommon.css.js' ;
88
99import dataGridStyles from './dataGrid.css.js' ;
10- import { Align , Events as DataGridEvents } from './DataGrid.js' ;
10+ import { Align , type ColumnDescriptor , DataType , Events as DataGridEvents } from './DataGrid.js' ;
1111import { SortableDataGrid , SortableDataGridNode } from './SortableDataGrid.js' ;
1212
1313const DUMMY_COLUMN_ID = 'dummy' ; // SortableDataGrid.create requires at least one column.
@@ -37,7 +37,6 @@ const DUMMY_COLUMN_ID = 'dummy'; // SortableDataGrid.create requires at least o
3737 *
3838 * @attr striped
3939 * @attr displayName
40- * @prop columnsOrder
4140 * @prop filters
4241 */
4342class DataGridElement extends HTMLElement {
@@ -51,7 +50,7 @@ class DataGridElement extends HTMLElement {
5150 }
5251 } ) ;
5352 #shadowRoot: ShadowRoot ;
54- #columnsOrder: string [ ] = [ ] ;
53+ #columns: ColumnDescriptor [ ] = [ ] ;
5554 #hideableColumns = new Set < string > ( ) ;
5655 #hiddenColumns = new Set < string > ( ) ;
5756 #usedCreationNode: DataGridElementNode | null = null ;
@@ -80,18 +79,18 @@ class DataGridElement extends HTMLElement {
8079 new CustomEvent ( 'contextmenu' , { detail : { menu, element : ( node as DataGridElementNode ) . configElement } } ) ) ;
8180 } ) ;
8281 this . #dataGrid. setHeaderContextMenuCallback ( menu => {
83- for ( const columnId of this . #columnsOrder ) {
84- if ( this . #hideableColumns. has ( columnId ) ) {
82+ for ( const column of this . #columns ) {
83+ if ( this . #hideableColumns. has ( column . id ) ) {
8584 menu . defaultSection ( ) . appendCheckboxItem (
86- this . #dataGrid. columns [ columnId ] . title as Platform . UIString . LocalizedString , ( ) => {
87- if ( this . #hiddenColumns. has ( columnId ) ) {
88- this . #hiddenColumns. delete ( columnId ) ;
85+ this . #dataGrid. columns [ column . id ] . title as Platform . UIString . LocalizedString , ( ) => {
86+ if ( this . #hiddenColumns. has ( column . id ) ) {
87+ this . #hiddenColumns. delete ( column . id ) ;
8988 } else {
90- this . #hiddenColumns. add ( columnId ) ;
89+ this . #hiddenColumns. add ( column . id ) ;
9190 }
9291 this . #dataGrid. setColumnsVisibility (
93- new Set ( this . #columnsOrder . filter ( column => ! this . #hiddenColumns. has ( column ) ) ) ) ;
94- } , { checked : ! this . #hiddenColumns. has ( columnId ) } ) ;
92+ new Set ( this . #columns . map ( ( { id } ) => id ) . filter ( column => ! this . #hiddenColumns. has ( column ) ) ) ) ;
93+ } , { checked : ! this . #hiddenColumns. has ( column . id ) } ) ;
9594 }
9695 }
9796 } ) ;
@@ -148,20 +147,19 @@ class DataGridElement extends HTMLElement {
148147 this . #dataGrid. element . setAttribute ( 'aria-rowcount' , String ( this . #dataGrid. getNumberOfRows ( ) ) ) ;
149148 }
150149
151- get columnsOrder ( ) : string [ ] {
152- return this . #columnsOrder ;
150+ get columns ( ) : ColumnDescriptor [ ] {
151+ return this . #columns ;
153152 }
154153
155154 #updateColumns( ) : void {
156155 for ( const column of Object . keys ( this . #dataGrid. columns ) ) {
157156 this . #dataGrid. removeColumn ( column ) ;
158157 }
159158 this . #hideableColumns. clear ( ) ;
160- this . #columnsOrder = [ ] ;
159+ this . #columns = [ ] ;
161160 let hasEditableColumn = false ;
162161 for ( const column of this . querySelectorAll ( 'th[id]' ) || [ ] ) {
163162 const id = column . id as Lowercase < string > ;
164- this . #columnsOrder. push ( id ) ;
165163 let title = column . textContent ?. trim ( ) || '' ;
166164 const titleDOMFragment = column . firstElementChild ? document . createDocumentFragment ( ) : undefined ;
167165 if ( titleDOMFragment ) {
@@ -178,12 +176,13 @@ class DataGridElement extends HTMLElement {
178176 if ( align !== Align . CENTER && align !== Align . RIGHT ) {
179177 align = undefined ;
180178 }
179+ const dataType = column . getAttribute ( 'type' ) === 'boolean' ? DataType . BOOLEAN : DataType . STRING ;
181180 const weight = parseFloat ( column . getAttribute ( 'weight' ) || '' ) ?? undefined ;
182181 const editable = column . hasAttribute ( 'editable' ) ;
183182 if ( editable ) {
184183 hasEditableColumn = true ;
185184 }
186- this . #dataGrid . addColumn ( {
185+ const columnDescriptor = {
187186 id,
188187 title : title as Platform . UIString . LocalizedString ,
189188 titleDOMFragment,
@@ -192,13 +191,16 @@ class DataGridElement extends HTMLElement {
192191 width,
193192 align,
194193 weight,
195- editable
196- } ) ;
194+ editable,
195+ dataType,
196+ } ;
197+ this . #dataGrid. addColumn ( columnDescriptor ) ;
198+ this . #columns. push ( columnDescriptor ) ;
197199 if ( hasBooleanAttribute ( column , 'hideable' ) ) {
198200 this . #hideableColumns. add ( id ) ;
199201 }
200202 }
201- const visibleColumns = new Set ( this . #columnsOrder . filter ( column => ! this . #hiddenColumns. has ( column ) ) ) ;
203+ const visibleColumns = new Set ( this . #columns . map ( ( { id } ) => id ) . filter ( id => ! this . #hiddenColumns. has ( id ) ) ) ;
202204 if ( visibleColumns . size ) {
203205 this . #dataGrid. setColumnsVisibility ( visibleColumns ) ;
204206 }
@@ -337,8 +339,8 @@ class DataGridElement extends HTMLElement {
337339 if ( node . isCreationNode ) {
338340 this . #usedCreationNode = node ;
339341 if ( moveDirection === 'forward' ) {
340- const hasNextEditableColumn = this . columnsOrder . slice ( this . columnsOrder . indexOf ( columnId ) + 1 )
341- . some ( columnId => this . #dataGrid . columns [ columnId ] . editable ) ;
342+ const hasNextEditableColumn =
343+ this . #columns . slice ( this . #columns . findIndex ( ( { id } ) => id === columnId ) + 1 ) . some ( ( { editable } ) => editable ) ;
342344 if ( ! hasNextEditableColumn ) {
343345 node . deselect ( ) ;
344346 }
@@ -398,8 +400,12 @@ class DataGridElementNode extends SortableDataGridNode<DataGridElementNode> {
398400 const cells = this . #configElement. querySelectorAll ( 'td' ) ;
399401 for ( let i = 0 ; i < cells . length ; ++ i ) {
400402 const cell = cells [ i ] ;
401- const columnId = this . #dataGridElement. columnsOrder [ i ] ;
402- this . data [ columnId ] = cell . dataset . value ?? cell . textContent ?? '' ;
403+ const column = this . #dataGridElement. columns [ i ] ;
404+ if ( column . dataType === DataType . BOOLEAN ) {
405+ this . data [ column . id ] = hasBooleanAttribute ( cell , 'data-value' ) ;
406+ } else {
407+ this . data [ column . id ] = cell . dataset . value ?? cell . textContent ?? '' ;
408+ }
403409 }
404410 }
405411
@@ -455,11 +461,14 @@ class DataGridElementNode extends SortableDataGridNode<DataGridElementNode> {
455461 }
456462
457463 override createCell ( columnId : string ) : HTMLElement {
464+ const index = this . #dataGridElement. columns . findIndex ( ( { id} ) => id === columnId ) ;
465+ if ( this . #dataGridElement. columns [ index ] . dataType === DataType . BOOLEAN ) {
466+ return super . createCell ( columnId ) ;
467+ }
458468 const cell = this . createTD ( columnId ) ;
459469 if ( this . isCreationNode ) {
460470 return cell ;
461471 }
462- const index = this . #dataGridElement. columnsOrder . indexOf ( columnId ) ;
463472 const configCell = this . #configElement. querySelectorAll ( 'td' ) [ index ] ;
464473 if ( ! configCell ) {
465474 throw new Error ( `Column ${ columnId } not found in the data grid` ) ;
0 commit comments