@@ -156,11 +156,66 @@ const drawGrid = (options, header) => activations => {
156156
157157 //injectHTML(content, 'grid/bottom-bar.html', 'bottom-bar')
158158
159+ /** zoom update button click handler */
160+ const rezoom = change => ( ) => {
161+ const gridGrid = content . querySelector ( `.${ css . gridGrid } ` ) ,
162+ currentZoom = parseInt ( gridGrid . getAttribute ( 'data-zoom-level' ) ) ,
163+ newZoom = change ( currentZoom ) ,
164+ zoomMin = - 2 ,
165+ zoomMax = 2
166+
167+ if ( newZoom !== currentZoom ) {
168+ gridGrid . setAttribute ( 'data-zoom-level' , newZoom )
169+ gridGrid . classList . remove ( `zoom_${ currentZoom } ` )
170+ gridGrid . classList . add ( `zoom_${ newZoom } ` )
171+
172+ // and try to make the gridDom mostly squarish
173+ const grids = gridGrid . querySelectorAll ( '.grid' )
174+ for ( let idx = 0 ; idx < grids . length ; idx ++ ) {
175+ const gridDom = grids [ idx ] ,
176+ gridLabel = gridDom . querySelector ( '.grid-label' ) ,
177+ gridRow = gridDom . querySelector ( '.grid-row' ) ,
178+ width = gridDom . getAttribute ( 'data-width' ) ,
179+ vws = newZoom === 0 ? 2.75 : newZoom === 1 ? 3 : newZoom === 2 ? 4 : 0.75
180+
181+ gridLabel . style . maxWidth = `${ Math . max ( 8 , width * vws * 1.1 ) } vw`
182+ gridRow . style . maxWidth = `${ Math . max ( 8 , width * vws ) } vw`
183+ }
184+
185+ if ( newZoom === zoomMax ) {
186+ return { toggle : [ { mode : 'zoom-in' , disabled : true } , // can't zoom in any further
187+ { mode : 'zoom-out' , disabled : false } ] }
188+ } else if ( newZoom == zoomMin ) {
189+ return { toggle : [ { mode : 'zoom-out' , disabled : true } , // can't zoom out any further
190+ { mode : 'zoom-in' , disabled : false } ] }
191+ } else {
192+ return { toggle : [ { mode : 'zoom-out' , disabled : false } ,
193+ { mode : 'zoom-in' , disabled : false } ] }
194+ }
195+ }
196+ }
197+ const zoomIn = { mode : 'zoom-in' ,
198+ fontawesome : 'fas fa-search-plus' ,
199+ balloon : 'Use larger grid cells' ,
200+ flush : 'right' ,
201+ actAsButton : true ,
202+ direct : rezoom ( _ => Math . min ( 2 , _ + 1 ) )
203+ } ,
204+ zoomOut = { mode : 'zoom-out' ,
205+ fontawesome : 'fas fa-search-minus' ,
206+ balloon : 'Use smaller grid cells' ,
207+ flush : 'right' ,
208+ actAsButton : true ,
209+ direct : rezoom ( _ => Math . max ( - 2 , _ - 1 ) )
210+ }
211+
159212 return {
160213 type : 'custom' ,
161214 content,
162215 controlHeaders : true ,
163- modes : modes ( 'grid' , options )
216+
217+ // add zoom buttons to the mode button model
218+ modes : modes ( 'grid' , options ) . concat ( [ zoomIn , zoomOut ] )
164219 }
165220}
166221
@@ -199,6 +254,7 @@ const _drawGrid = (options, {sidecar, leftHeader, rightHeader}, content, groupDa
199254 zoomLevelForDisplay = totalCount > 1000 ? - 2 : totalCount <= 100 ? zoomLevel : 0 // don't zoom in too far, if there are many cells to display
200255
201256 gridGrid . className = `${ css . gridGrid } cell-container zoom_${ zoomLevelForDisplay } `
257+ gridGrid . setAttribute ( 'data-zoom-level' , zoomLevelForDisplay )
202258 colorBy ( 'duration' , gridGrid )
203259
204260 if ( ! redraw ) {
@@ -214,7 +270,7 @@ const _drawGrid = (options, {sidecar, leftHeader, rightHeader}, content, groupDa
214270 const onclick = drilldownWith ( viewName , `action get "${ group . path } "` )
215271 ui . addNameToSidecarHeader ( sidecar , group . name , packageName , onclick )
216272
217- drawLegend ( viewName , rightHeader , group , options )
273+ drawLegend ( viewName , rightHeader , group , gridGrid , options )
218274 } else {
219275 const onclick = options . appName ? drilldownWith ( viewName , `app get "${ options . appName } "` ) : undefined ,
220276 pathComponents = ( options . appName || '' ) . split ( '/' ) ,
@@ -224,7 +280,7 @@ const _drawGrid = (options, {sidecar, leftHeader, rightHeader}, content, groupDa
224280 ui . addNameToSidecarHeader ( sidecar , name , packageName , onclick )
225281
226282 if ( groups . length > 0 ) {
227- drawLegend ( viewName , rightHeader , summary , options )
283+ drawLegend ( viewName , rightHeader , summary , gridGrid , options )
228284 }
229285 }
230286
@@ -281,13 +337,15 @@ const _drawGrid = (options, {sidecar, leftHeader, rightHeader}, content, groupDa
281337 group . height = L
282338 cells = grid . reserve ( group )
283339
340+ gridDom . setAttribute ( 'data-width' , width )
341+
284342 // now that we know the width of the grid, adjust the width of the label
285343 if ( zoomLevel === 0 ) {
286344 gridLabel . style . maxWidth = `${ width * 2.75 * 1.1 } vw` // 2.75vw is the width in table.css; 1.1x to give a bit of overflow
287345 }
288346
289347 // and try to make the gridDom mostly squarish
290- gridDom . querySelector ( '.grid-row' ) . style . maxWidth = `${ width * ( zoomLevelForDisplay === 0 ? 2.75 : zoomLevelForDisplay === 1 ? 3 : zoomLevelForDisplay === 2 ? 4 : 0.75 ) } vw`
348+ gridDom . querySelector ( '.grid-row' ) . style . maxWidth = `${ width * ( zoomLevelForDisplay === 0 ? 2.75 : zoomLevelForDisplay === 1 ? 3 : zoomLevelForDisplay === 2 ? 4 : 0.75 ) * 1.1 } vw`
291349
292350 let idx = 0
293351 group . activations . forEach ( activation => {
0 commit comments