@@ -92,25 +92,58 @@ const plugin: JupyterFrontEndPlugin<void> = {
9292 } ;
9393 return f ;
9494 } ;
95+ const eventListener = ( name : string , emitAlert = false ) => {
96+ const f = ( event : Event ) => {
97+ console . log ( event ) ;
98+ if ( emitAlert ) {
99+ alert ( `${ name } event: ${ event . type } ` ) ;
100+ }
101+ } ;
102+ return f ;
103+ } ;
95104 const buttons = widget . node . querySelectorAll ( 'jp-button' ) ;
96105 buttons . forEach ( button => {
97106 button . addEventListener ( 'click' , clickListener ) ;
98107 } ) ;
99108 const search = widget . node . querySelector ( 'jp-search' ) ;
100109 search ?. addEventListener ( 'change' , changeListener ( 'Search' ) ) ;
101110 search ?. addEventListener ( 'input' , changeConsoleListener ( 'Search' ) ) ;
111+
102112 const textField = widget . node . querySelector ( 'jp-text-field' ) ;
103113 textField ?. addEventListener ( 'change' , changeListener ( 'Text field' ) ) ;
114+ textField ?. addEventListener ( 'input' , changeListener ( 'Text field' ) ) ;
115+
104116 const numberField = widget . node . querySelector ( 'jp-number-field' ) ;
105117 numberField ?. addEventListener ( 'change' , changeListener ( 'Number field' ) ) ;
118+ numberField ?. addEventListener ( 'input' , changeListener ( 'Number field' ) ) ;
119+
106120 const select = widget . node . querySelector ( 'jp-select' ) ;
107121 select ?. addEventListener ( 'change' , changeListener ( 'Select' ) ) ;
122+
108123 const combobox = widget . node . querySelector ( 'jp-combobox' ) ;
109124 combobox ?. addEventListener ( 'change' , changeListener ( 'Combobox' ) ) ;
110125 combobox ?. addEventListener ( 'input' , changeConsoleListener ( 'Combobox' ) ) ;
126+
111127 const slider = widget . node . querySelector ( 'jp-slider' ) ;
112128 slider ?. addEventListener ( 'change' , changeConsoleListener ( 'Slider' ) ) ;
113129
130+ const checkbox = widget . node . querySelectorAll ( 'jp-checkbox' ) ;
131+ checkbox . forEach ( box => {
132+ box . addEventListener ( 'change' , eventListener ( 'Checkbox' , true ) ) ;
133+ } ) ;
134+
135+ const tooltip = widget . node . querySelector ( 'jp-tooltip' ) ;
136+ tooltip ?. addEventListener ( 'dismiss' , eventListener ( 'Tooltip' ) ) ;
137+
138+ const tabs = widget . node . querySelector ( 'jp-tabs' ) ;
139+ tabs ?. addEventListener ( 'change' , eventListener ( 'Tabs' ) ) ;
140+
141+ const treeItems = widget . node . querySelectorAll ( 'jp-tree-item' ) ;
142+ treeItems . forEach ( item => {
143+ item . addEventListener ( 'selected-change' , eventListener ( 'Tree Item' ) ) ;
144+ item . addEventListener ( 'expanded-change' , eventListener ( 'Tree Item' ) ) ;
145+ } ) ;
146+
114147 const dataRef = React . createRef < WebDataGrid > ( ) ;
115148 const reactWidget = ReactWidget . create ( < Artwork dataRef = { dataRef } /> ) ;
116149 reactWidget . addClass ( 'jp-Artwork' ) ;
@@ -122,22 +155,25 @@ const plugin: JupyterFrontEndPlugin<void> = {
122155 app . shell . add ( reactWidget , 'main' , { mode : 'split-bottom' } ) ;
123156 app . shell . activateById ( widget . id ) ;
124157
125- const loadTableData = setInterval ( ( ) => {
126- const dataGrid : WebDataGrid | null =
127- widget . node . querySelector ( '#basic-grid' ) ;
128- if ( dataGrid ?. isConnected ) {
129- clearInterval ( loadTableData ) ;
130- dataGrid . rowsData = TABLE_DATA ;
131- if ( dataRef . current ) {
132- dataRef . current . rowsData = TABLE_DATA ;
133- }
158+ const dataGrid : WebDataGrid | null =
159+ widget . node . querySelector ( '#basic-grid' ) ;
160+ if ( dataGrid ?. isConnected ) {
161+ dataGrid . rowsData = TABLE_DATA ;
162+ if ( dataRef . current ) {
163+ dataRef . current . rowsData = TABLE_DATA ;
134164 }
135- } , 100 ) ;
165+ }
136166 } ) ;
137167 }
138168} ;
139169
140170function Artwork ( props : { dataRef : React . Ref < WebDataGrid > } ) : JSX . Element {
171+ const tooltipAnchor = React . useRef < HTMLElement > ( null ) ;
172+
173+ const onEvent = ( event : any ) => {
174+ console . log ( event ) ;
175+ alert ( `Got a React event: ${ event . type } ` ) ;
176+ } ;
141177 const onChange = ( event : any ) => {
142178 alert ( `React on React change event: ${ event ?. target ?. value } ` ) ;
143179 } ;
@@ -208,9 +244,13 @@ function Artwork(props: { dataRef: React.Ref<WebDataGrid> }): JSX.Element {
208244 </RadioGroup> */ }
209245 < div className = "jp-FlexColumn" >
210246 < label > Checkboxes</ label >
211- < Checkbox checked > Label</ Checkbox >
212- < Checkbox checked > Label</ Checkbox >
213- < Checkbox disabled > Label</ Checkbox >
247+ < Checkbox onChange = { onEvent } checked >
248+ Label
249+ </ Checkbox >
250+ < Checkbox onChange = { onEvent } > Label</ Checkbox >
251+ < Checkbox onChange = { onEvent } disabled >
252+ Label
253+ </ Checkbox >
214254 </ div >
215255 { /* <div>
216256 <Tag>Tag</Tag>
@@ -235,14 +275,15 @@ function Artwork(props: { dataRef: React.Ref<WebDataGrid> }): JSX.Element {
235275 </ div >
236276 < div className = "jp-FlexColumn" >
237277 < label > Tooltip</ label >
238- < Tooltip anchor = "anchored-react-button" > React tooltip</ Tooltip >
239- < Button id = "anchored-react-button" > Anchor</ Button >
278+ { /* The tooltip component needs to be placed after the anchor so the reference is defined */ }
279+ < Button ref = { tooltipAnchor } > Anchor</ Button >
280+ < Tooltip anchorElement = { tooltipAnchor . current } > React tooltip</ Tooltip >
240281 </ div >
241282 </ div >
242283 < div className = "jp-FlexColumn" style = { { gridColumn : 4 } } >
243284 < DataGrid ref = { props . dataRef } > </ DataGrid >
244285
245- < Tabs >
286+ < Tabs onChange = { onEvent } >
246287 < Tab id = "one" > One</ Tab >
247288 < Tab id = "two" > Two</ Tab >
248289 < Tab id = "three" > Three</ Tab >
@@ -252,7 +293,8 @@ function Artwork(props: { dataRef: React.Ref<WebDataGrid> }): JSX.Element {
252293 </ Tabs >
253294
254295 < TreeView >
255- < TreeItem >
296+ { /* @ts -expect-error unknown event onExpand */ }
297+ < TreeItem onSelect = { onEvent } onExpand = { onEvent } >
256298 Root item 1
257299 < TreeItem expanded >
258300 Flowers
@@ -340,8 +382,8 @@ function createNode(): HTMLElement {
340382 -->
341383 <div class="jp-FlexColumn">
342384 <label>Checkboxes</label>
343- <jp-checkbox autofocus checked>Label</jp-checkbox>
344385 <jp-checkbox checked>Label</jp-checkbox>
386+ <jp-checkbox>Label</jp-checkbox>
345387 <jp-checkbox disabled>Label</jp-checkbox>
346388 </div>
347389 <!--
0 commit comments