@@ -23,68 +23,83 @@ export class Sample {
2323 private dropdown : IgcDropdownComponent ;
2424 private formattersSwitch : IgcSwitchComponent ;
2525 protected hasFormatters = true ;
26+ protected columns : any [ ] ;
2627 protected format = ( params : any ) => html `< span > ${ formatter . format ( params . value ) } </ span > ` ;
2728
29+ private checkHandler = ( col : any , prop : string , e : CustomEvent < IgcCheckboxChangeEventArgs > ) => {
30+ const columnElement = this . gridLite ! . querySelector ( `#col-${ col . field } ` ) as any ;
31+ columnElement [ prop ] = e . detail . checked ;
32+ }
33+
2834 constructor ( ) {
2935 this . dataService = new GridLiteDataService ( ) ;
30- this . dropdown = document . getElementById ( 'dropdown' ) as IgcDropdownComponent ;
31- this . formattersSwitch = document . getElementById ( 'formattersSwitch' ) as IgcSwitchComponent ;
32-
3336 const data : ProductInfo [ ] = this . dataService . generateProducts ( 50 ) ;
3437
38+ const controlPanel = document . getElementById ( 'panel' ) ;
3539 const container = document . getElementById ( 'grid-lite' ) ;
36-
40+
41+ this . columns = [
42+ { field : 'id' , header : 'ID' , hidden : true , resizable : true , sortable : false , filterable : false } ,
43+ { field : 'name' , header : 'Product Name' , hidden : false , resizable : true , sortable : false , filterable : false } ,
44+ { field : 'price' , header : 'Price' , hidden : false , resizable : true , sortable : false , filterable : false } ,
45+ { field : 'sold' , header : 'Units sold' , hidden : false , resizable : true , sortable : false , filterable : false , dataType : 'number' } ,
46+ { field : 'total' , header : 'Total sold' , hidden : false , resizable : true , sortable : false , filterable : false } ,
47+ { field : 'rating' , header : 'Customer rating' , hidden : false , resizable : true , sortable : false , filterable : false , dataType : 'number' }
48+ ] ;
49+
50+ const ratingTemplate = ( params : any ) => html `< igc-rating readonly step ="0.01 " value =${ params . value } > </ igc-rating > ` ;
51+
52+ const panelTemplate = html `
53+ < igc-dropdown id ="dropdown " keep-open-on-select flip >
54+ < igc-button slot ="target " variant ="outlined "> Column properties</ igc-button >
55+ ${ this . columns . map ( col => html `
56+ < igc-dropdown-item id =${ col . field } role ="option">
57+ < div class ="config ">
58+ < span class ="config-key "> ${ col . header } </ span >
59+ < igc-checkbox @igcChange =${ ( e : CustomEvent < IgcCheckboxChangeEventArgs > ) => this . checkHandler ( col , 'hidden' , e ) } class ="hidden-checkbox" ?checked=${ col . hidden } label-position="before"> Hidden</ igc-checkbox >
60+ < igc-checkbox @igcChange =${ ( e : CustomEvent < IgcCheckboxChangeEventArgs > ) => this . checkHandler ( col , 'resizable' , e ) } class ="resizable-checkbox" ?checked=${ col . resizable } label-position="before"> Resizable</ igc-checkbox >
61+ < igc-checkbox @igcChange =${ ( e : CustomEvent < IgcCheckboxChangeEventArgs > ) => this . checkHandler ( col , 'sortable' , e ) } class ="sort-checkbox" ?checked=${ col . sortable } label-position="before"> Sortable</ igc-checkbox >
62+ < igc-checkbox @igcChange =${ ( e : CustomEvent < IgcCheckboxChangeEventArgs > ) => this . checkHandler ( col , 'filterable' , e ) } class ="filter-checkbox" ?checked=${ col . filterable } label-position="before"> Filterable</ igc-checkbox >
63+ </ div >
64+ </ igc-dropdown-item >
65+ ` ) }
66+ </ igc-dropdown >
67+ < igc-switch id ="formattersSwitch " label-position ="before " checked ="true "> Value formatters:</ igc-switch >
68+ ` ;
69+
3770 const template = html `
3871 < igc-grid-lite .data =${ data } >
39- < igc-grid-lite-column
40- id ="col-id "
41- field ="id "
42- header ="ID "
43- hidden
44- > </ igc-grid-lite-column >
45- < igc-grid-lite-column
46- id ="col-name "
47- field ="name "
48- header ="Product Name "
49- > </ igc-grid-lite-column >
50- < igc-grid-lite-column
51- id ="col-price "
52- field ="price "
53- header ="Price "
54- data-type ="number "
55- .cellTemplate =${ this . format }
56- > </ igc-grid-lite-column >
57- < igc-grid-lite-column
58- id ="col-sold "
59- field ="sold "
60- header ="Units sold "
61- data-type ="number "
62- > </ igc-grid-lite-column >
63- < igc-grid-lite-column
64- id ="col-total "
65- field ="total "
66- header ="Total sold "
67- .cellTemplate =${ this . format }
68- > </ igc-grid-lite-column >
69- < igc-grid-lite-column
70- id ="col-rating "
71- field ="rating "
72- header ="Customer rating "
73- data-type ="number "
74- .cellTemplate =${ ( params : any ) => html `< igc-rating readonly step="0.01 " value =${ params . value } > </ igc-rating> ` }
75- > </ igc-grid-lite-column>
72+ ${ this . columns . map ( col => html `
73+ < igc-grid-lite-column
74+ id ="col- ${ col . field } "
75+ field =${ col . field }
76+ header =${ col . header }
77+ ?hidden=${ col . hidden }
78+ ?resizable=${ col . resizable }
79+ ?sortable=${ col . sortable }
80+ ?filterable=${ col . filterable }
81+ .cellTemplate=${ col . field === 'price' || col . field === 'total'
82+ ? this . format
83+ : col . field === 'rating'
84+ ? ratingTemplate
85+ : undefined }
86+ > </ igc-grid-lite-column >
87+ ` ) }
7688 </ igc-grid-lite >
7789 ` ;
78-
90+
91+ render ( panelTemplate , controlPanel ! ) ;
7992 render ( template , container ! ) ;
80-
93+
94+ this . dropdown = document . getElementById ( 'dropdown' ) as IgcDropdownComponent ;
95+ this . formattersSwitch = document . getElementById ( 'formattersSwitch' ) as IgcSwitchComponent ;
8196 this . gridLite = container ! . querySelector ( 'igc-grid-lite' ) ;
8297
8398 this . dropdown . addEventListener ( 'igcChange' , ( e : any ) => { this . dropdown . clearSelection ( ) ; } ) ;
8499 this . formattersSwitch . addEventListener ( 'igcChange' , ( e : CustomEvent < IgcCheckboxChangeEventArgs > ) => {
85100 const priceCol = this . gridLite ! . querySelector ( '#col-price' ) as any ;
86101 const totalCol = this . gridLite ! . querySelector ( '#col-total' ) as any ;
87-
102+
88103 if ( e . detail . checked ) {
89104 priceCol . cellTemplate = this . format ;
90105 totalCol . cellTemplate = this . format ;
@@ -93,30 +108,6 @@ export class Sample {
93108 totalCol . cellTemplate = undefined ;
94109 }
95110 } ) ;
96-
97- document . addEventListener ( 'click' , ( e : MouseEvent ) => {
98- const target = e . target as HTMLElement ;
99- if ( target . tagName . toLowerCase ( ) === 'igc-checkbox' ) {
100- const checkbox = target as IgcCheckboxComponent ;
101- const dropdownItem = checkbox . closest ( 'igc-dropdown-item' ) ;
102- const columnKey = dropdownItem ?. id ;
103- const prop = Array . from ( checkbox . classList ) . filter ( c => c . endsWith ( '-checkbox' ) ) [ 0 ] . split ( '-' ) [ 0 ] ;
104-
105- const column = this . gridLite ! . querySelector ( `#col-${ columnKey } ` ) as any ;
106- if ( column ) {
107- // Map property names for declarative API
108- if ( prop === 'hidden' ) {
109- column . hidden = ! checkbox . checked ;
110- } else if ( prop === 'resizable' ) {
111- column . resizable = checkbox . checked ;
112- } else if ( prop === 'filter' ) {
113- column . filterable = checkbox . checked ;
114- } else if ( prop === 'sort' ) {
115- column . sortable = checkbox . checked ;
116- }
117- }
118- }
119- } ) ;
120111 }
121112}
122113
0 commit comments