@@ -13,10 +13,18 @@ import { TableColumnElement } from './TableColumnElement';
1313 * <js-table data="#data-source-id"><!-- .... --></js-table>
1414 */
1515export class TableElement extends LitElement {
16+ // Data source node
1617 #data = null ;
1718
19+ // Table header node
1820 #head = null ;
1921
22+ // Table column renderers
23+ #renderer = { } ;
24+
25+ // Default renderer
26+ #default;
27+
2028 static get localName ( ) {
2129 return 'js-table' ;
2230 }
@@ -98,13 +106,19 @@ export class TableElement extends LitElement {
98106 const elements = this . childNodes ;
99107 for ( let i = 0 ; i < elements . length ; i += 1 ) {
100108 if ( elements [ i ] instanceof TableColumnElement ) {
109+ // Column name and title
101110 const name = elements [ i ] . getAttribute ( 'name' ) ;
111+ // If the name is not empty, add it to the column list
102112 if ( name && name !== '' ) {
103113 // Append the column to the list
104114 if ( this . columns . indexOf ( name ) === - 1 ) {
105115 this . columns . push ( elements [ i ] . getAttribute ( 'name' ) ) ;
106116 }
107- // TODO: Set this column as the renderer
117+ // Set column renderer
118+ this . #renderer[ name ] = elements [ i ] ;
119+ } else {
120+ // Set the default renderer
121+ this . #default = elements [ i ] ;
108122 }
109123 }
110124 }
@@ -127,14 +141,28 @@ export class TableElement extends LitElement {
127141 return rows ;
128142 }
129143
144+ #rendererFor( key ) {
145+ const renderer = this . #renderer[ key ] ;
146+ if ( renderer ) {
147+ return renderer ;
148+ }
149+ return this . #default;
150+ }
151+
152+ #hidden( key ) {
153+ return this . #rendererFor( key ) . hidden ;
154+ }
155+
130156 #renderColumns( row ) {
131157 const cells = [ ] ;
132158 if ( row instanceof Object ) {
133159 Object . keys ( row ) . forEach ( ( key ) => {
134- if ( this . columns . indexOf ( key ) === - 1 ) {
135- this . columns . push ( key ) ;
160+ if ( ! this . #hidden( key ) ) {
161+ if ( this . columns . indexOf ( key ) === - 1 ) {
162+ this . columns . push ( key ) ;
163+ }
164+ cells [ this . columns . indexOf ( key ) ] = html `< td > < div class ="cell "> ${ this . #renderCell( row , key ) } </ div > </ td > ` ;
136165 }
137- cells [ this . columns . indexOf ( key ) ] = html `< td > < div class ="cell "> ${ this . #renderCell( row [ key ] ) } </ div > </ td > ` ;
138166 } ) ;
139167 } else {
140168 this . columns . push ( 'value' ) ;
@@ -152,14 +180,7 @@ export class TableElement extends LitElement {
152180 return cells ;
153181 }
154182
155- // eslint-disable-next-line class-methods-use-this
156- #renderCell( cell ) {
157- if ( cell === null || cell === undefined || cell === '' ) {
158- return html `nil` ;
159- }
160- if ( cell instanceof Object ) {
161- return html `< code > ${ JSON . stringify ( cell ) } </ code > ` ;
162- }
163- return html `${ cell } ` ;
183+ #renderCell( value , key ) {
184+ return this . #rendererFor( key ) . render ( value , key ) ;
164185 }
165186}
0 commit comments