@ -1,6 +1,6 @@
import { css } from '@emotion/css' ;
import { isEqual } from 'lodash' ;
import React , { memo , useEffect , useRef , useState } from 'react' ;
import React , { memo , useCallback , use Effect , useRef , useState } from 'react' ;
import { AbsoluteTimeRange , GrafanaTheme2 , LogsSortOrder , TimeZone } from '@grafana/data' ;
import { reportInteraction } from '@grafana/runtime' ;
@ -54,7 +54,7 @@ function LogsNavigation({
const onFirstPage = oldestLogsFirst ? currentPageIndex === pages . length - 1 : currentPageIndex === 0 ;
const onLastPage = oldestLogsFirst ? currentPageIndex === 0 : currentPageIndex === pages . length - 1 ;
const theme = useTheme2 ( ) ;
const styles = getStyles ( theme , oldestLogsFirst , loading ) ;
const styles = getStyles ( theme , oldestLogsFirst ) ;
// Main effect to set pages and index
useEffect ( ( ) = > {
@ -91,10 +91,13 @@ function LogsNavigation({
// eslint-disable-next-line react-hooks/exhaustive-deps
} , [ ] ) ;
const changeTime = ( { from , to } : AbsoluteTimeRange ) = > {
const changeTime = useCallback (
( { from , to } : AbsoluteTimeRange ) = > {
expectedRangeRef . current = { from , to } ;
onChangeTime ( { from , to } ) ;
} ;
} ,
[ onChangeTime ]
) ;
const sortPages = ( a : LogsPage , b : LogsPage , logsSortOrder? : LogsSortOrder | null ) = > {
if ( logsSortOrder === LogsSortOrder . Ascending ) {
@ -123,6 +126,7 @@ function LogsNavigation({
//If we are on the last page, create new range
changeTime ( { from : visibleRange . from - rangeSpanRef . current , to : visibleRange.from } ) ;
}
scrollToTopLogs ( ) ;
} }
disabled = { loading }
>
@ -150,6 +154,7 @@ function LogsNavigation({
to : pages [ currentPageIndex + indexChange ] . queryRange . to ,
} ) ;
}
scrollToTopLogs ( ) ;
//If we are on the first page, button is disabled and we do nothing
} }
disabled = { loading || onFirstPage }
@ -162,6 +167,18 @@ function LogsNavigation({
< / Button >
) ;
const onPageClick = useCallback (
( page : LogsPage , pageNumber : number ) = > {
reportInteraction ( 'grafana_explore_logs_pagination_clicked' , {
pageType : 'page' ,
pageNumber ,
} ) ;
! loading && changeTime ( { from : page . queryRange . from , to : page.queryRange.to } ) ;
scrollToTopLogs ( ) ;
} ,
[ changeTime , loading , scrollToTopLogs ]
) ;
return (
< div className = { styles . navContainer } >
{ oldestLogsFirst ? olderLogsButton : newerLogsButton }
@ -171,7 +188,7 @@ function LogsNavigation({
oldestLogsFirst = { oldestLogsFirst }
timeZone = { timeZone }
loading = { loading }
changeTime = { changeTime }
onClick = { onPageClick }
/ >
{ oldestLogsFirst ? newerLogsButton : olderLogsButton }
< Button
@ -189,7 +206,7 @@ function LogsNavigation({
export default memo ( LogsNavigation ) ;
const getStyles = ( theme : GrafanaTheme2 , oldestLogsFirst : boolean , loading : boolean ) = > {
const getStyles = ( theme : GrafanaTheme2 , oldestLogsFirst : boolean ) = > {
const navContainerHeight = theme . flags . topnav
? ` calc(100vh - 2* ${ theme . spacing ( 2 ) } - 2* ${ TOP_BAR_LEVEL_HEIGHT } px) `
: '95vh' ;