@@ -106,31 +106,44 @@ export default class EventDrops extends Morph {
106106 "themes" : { "icons" : false }
107107 }
108108 } ) ;
109-
109+
110110 this . aeChangedDebounced = ( ( ) => this . setAexprs ( this . getDataFromSource ( ) ) ) . debounce ( 10 , 300 ) ;
111111 this . eventsChangedDebounced = ( ( ) => this . updateTimeline ( this . getDataFromSource ( ) ) ) . debounce ( 100 , 1000 ) ;
112112 this . activeExpressionsChanged ( ) ;
113113 //Register to AE changes
114114 AExprRegistry . addEventListener ( this , ( ae , event ) => {
115- if ( event . type === "created" || event . type === "disposed" ) {
116- this . activeExpressionsChanged ( )
115+ if ( event . type === "created" || event . type === "disposed" ) {
116+ this . activeExpressionsChanged ( ) ;
117117 } else {
118- this . eventsChanged ( )
118+ this . eventsChanged ( ) ;
119119 }
120120 } ) ;
121121 //Register to overview selection changes
122122 jQuery ( this . aeOverview ) . on ( "changed.jstree" , ( e , data ) => {
123123 this . eventsChanged ( ) ;
124- } )
124+ }
125125 //Register to grouping change
126- this . groupByLine . addEventListener ( 'change' , ( ) => {
126+ ) ; this . groupByLine . addEventListener ( 'change' , ( ) => {
127127 if ( this . groupByLine . checked ) {
128128 this . groupingFunction = this . locationGrouping ( ) ;
129129 } else {
130130 this . groupingFunction = this . instanceGrouping ( ) ;
131131 }
132132 this . eventsChanged ( ) ;
133133 } ) ;
134+ //Register to filter changes
135+ this . filterFunction = ( ) => true ;
136+ this . filterButton . addEventListener ( 'click' , ( ) => {
137+ const inputValue = this . filterInput . value ;
138+ if ( ! inputValue ) {
139+ this . filterFunction = ( ) => true ;
140+ } else {
141+ this . filterFunction = event => {
142+ return eval ( inputValue ) ;
143+ } ;
144+ }
145+ this . eventsChanged ( ) ;
146+ } ) ;
134147 }
135148
136149 humanizeEventData ( event ) {
@@ -178,7 +191,6 @@ export default class EventDrops extends Morph {
178191 getGroupingFunction ( ) {
179192 return this . groupingFunction || this . locationGrouping ( ) ;
180193 }
181-
182194
183195 activeExpressionsChanged ( ) {
184196 this . aeChangedDebounced ( ) ;
@@ -201,15 +213,19 @@ export default class EventDrops extends Morph {
201213 aexprs [ i ] . timelineID = i ;
202214 }
203215 this . updateOverview ( aexprs ) ;
204- this . updateTimeline ( aexprs )
216+ this . updateTimeline ( aexprs ) ;
205217 }
206218
207219 updateTimeline ( aexprs ) {
208220 const checkedIndices = jQuery ( this . aeOverview ) . jstree ( true ) . get_bottom_selected ( ) ;
209221 const selectedAEs = checkedIndices . map ( i => aexprs [ i - 1 ] ) . filter ( ae => ae ) ;
222+ this . updateValuesOverTime ( selectedAEs ) ;
210223 let scrollBefore = this . diagram . scrollTop ;
211224 let groups = selectedAEs . groupBy ( this . getGroupingFunction ( ) ) ;
212- groups = Object . keys ( groups ) . map ( each => ( { name : each , data : groups [ each ] . flatMap ( ae => ae . meta ( ) . get ( 'events' ) ) } ) ) ;
225+ groups = Object . keys ( groups ) . map ( each => ( {
226+ name : each ,
227+ data : groups [ each ] . flatMap ( ae => ae . meta ( ) . get ( 'events' ) ) . filter ( this . filterFunction )
228+ } ) ) ;
213229 this . setData ( groups ) ;
214230 if ( selectedAEs . length == 0 ) return ;
215231
@@ -238,6 +254,23 @@ export default class EventDrops extends Morph {
238254 this . diagram . scrollTop = scrollBefore ;
239255 }
240256
257+ updateValuesOverTime ( aexprs ) {
258+ const aeWithRelevantEvents = aexprs . map ( ae => {
259+ return { ae, events : ae . meta ( ) . get ( 'events' ) . filter ( event => event . type === "changed value" ) . filter ( this . filterFunction ) } ;
260+ } ) ;
261+ this . valuesOverTime . innerHTML = "" ;
262+
263+ for ( const { ae, events} of aeWithRelevantEvents ) {
264+ if ( events . length === 0 ) continue ;
265+ let row = < tr > < th > { ae . meta ( ) . get ( 'id' ) } </ th > </ tr >
266+ row . append ( < td > { events [ 0 ] . value . lastValue } </ td > ) ;
267+ for ( const event of events ) {
268+ row . append ( < td > { event . value . value } </ td > ) ;
269+ }
270+ this . valuesOverTime . append ( row ) ;
271+ }
272+ }
273+
241274 updateOverview ( aexprs ) {
242275 jQuery ( this . aeOverview ) . jstree ( true ) . settings . core . data = this . generateOverviewJSON ( aexprs ) ;
243276 jQuery ( this . aeOverview ) . jstree ( true ) . refresh ( ) ;
@@ -320,4 +353,17 @@ export default class EventDrops extends Morph {
320353 get aeOverview ( ) {
321354 return this . get ( "#aeOverview" ) ;
322355 }
356+
357+ get filterInput ( ) {
358+ return this . get ( "#filterInput" ) ;
359+ }
360+
361+ get filterButton ( ) {
362+ return this . get ( "#filterButton" ) ;
363+ }
364+
365+ get valuesOverTime ( ) {
366+ return this . get ( "#valuesOverTime" ) ;
367+ }
368+
323369}
0 commit comments