mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Dashboard: Fixes scrolling issues for Edge browser (#17033)
* Fix: Only set scrollTop on CustomScroll element when it's needed and move arrow functions out of the props * Fix: Update snapshots * Minor refactoring to reuse same functions when rendering custom scrollbar Fixes #16796
This commit is contained in:
committed by
Torkel Ödegaard
parent
bbb1427f46
commit
1001cd7ac3
@@ -42,9 +42,10 @@ export class CustomScrollbar extends Component<Props> {
|
|||||||
|
|
||||||
updateScroll() {
|
updateScroll() {
|
||||||
const ref = this.ref.current;
|
const ref = this.ref.current;
|
||||||
|
const { scrollTop } = this.props;
|
||||||
|
|
||||||
if (ref && !isNil(this.props.scrollTop)) {
|
if (ref && !isNil(scrollTop)) {
|
||||||
ref.scrollTop(this.props.scrollTop);
|
ref.scrollTop(scrollTop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +71,44 @@ export class CustomScrollbar extends Component<Props> {
|
|||||||
this.updateScroll();
|
this.updateScroll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderTrack = (track: 'track-vertical' | 'track-horizontal', hideTrack: boolean | undefined, passedProps: any) => {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
{...passedProps}
|
||||||
|
className={cx(
|
||||||
|
css`
|
||||||
|
visibility: ${hideTrack ? 'none' : 'visible'};
|
||||||
|
`,
|
||||||
|
track
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
renderThumb = (thumb: 'thumb-horizontal' | 'thumb-vertical', passedProps: any) => {
|
||||||
|
return <div {...passedProps} className={thumb} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
renderTrackHorizontal = (passedProps: any) => {
|
||||||
|
return this.renderTrack('track-horizontal', this.props.hideHorizontalTrack, passedProps);
|
||||||
|
};
|
||||||
|
|
||||||
|
renderTrackVertical = (passedProps: any) => {
|
||||||
|
return this.renderTrack('track-vertical', this.props.hideVerticalTrack, passedProps);
|
||||||
|
};
|
||||||
|
|
||||||
|
renderThumbHorizontal = (passedProps: any) => {
|
||||||
|
return this.renderThumb('thumb-horizontal', passedProps);
|
||||||
|
};
|
||||||
|
|
||||||
|
renderThumbVertical = (passedProps: any) => {
|
||||||
|
return this.renderThumb('thumb-vertical', passedProps);
|
||||||
|
};
|
||||||
|
|
||||||
|
renderView = (passedProps: any) => {
|
||||||
|
return <div {...passedProps} className="view" />;
|
||||||
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
className,
|
className,
|
||||||
@@ -80,8 +119,6 @@ export class CustomScrollbar extends Component<Props> {
|
|||||||
autoHide,
|
autoHide,
|
||||||
autoHideTimeout,
|
autoHideTimeout,
|
||||||
hideTracksWhenNotNeeded,
|
hideTracksWhenNotNeeded,
|
||||||
hideHorizontalTrack,
|
|
||||||
hideVerticalTrack,
|
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -97,31 +134,11 @@ export class CustomScrollbar extends Component<Props> {
|
|||||||
// Before these where set to inhert but that caused problems with cut of legends in firefox
|
// Before these where set to inhert but that caused problems with cut of legends in firefox
|
||||||
autoHeightMax={autoHeightMax}
|
autoHeightMax={autoHeightMax}
|
||||||
autoHeightMin={autoHeightMin}
|
autoHeightMin={autoHeightMin}
|
||||||
renderTrackHorizontal={props => (
|
renderTrackHorizontal={this.renderTrackHorizontal}
|
||||||
<div
|
renderTrackVertical={this.renderTrackVertical}
|
||||||
{...props}
|
renderThumbHorizontal={this.renderThumbHorizontal}
|
||||||
className={cx(
|
renderThumbVertical={this.renderThumbVertical}
|
||||||
css`
|
renderView={this.renderView}
|
||||||
visibility: ${hideHorizontalTrack ? 'none' : 'visible'};
|
|
||||||
`,
|
|
||||||
'track-horizontal'
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
renderTrackVertical={props => (
|
|
||||||
<div
|
|
||||||
{...props}
|
|
||||||
className={cx(
|
|
||||||
css`
|
|
||||||
visibility: ${hideVerticalTrack ? 'none' : 'visible'};
|
|
||||||
`,
|
|
||||||
'track-vertical'
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
renderThumbHorizontal={props => <div {...props} className="thumb-horizontal" />}
|
|
||||||
renderThumbVertical={props => <div {...props} className="thumb-vertical" />}
|
|
||||||
renderView={props => <div {...props} className="view" />}
|
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</Scrollbars>
|
</Scrollbars>
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ exports[`CustomScrollbar renders correctly 1`] = `
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="css-17l4171 track-horizontal"
|
className="css-52gpmd track-horizontal"
|
||||||
style={
|
style={
|
||||||
Object {
|
Object {
|
||||||
"display": "none",
|
"display": "none",
|
||||||
@@ -58,7 +58,7 @@ exports[`CustomScrollbar renders correctly 1`] = `
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="css-17l4171 track-vertical"
|
className="css-52gpmd track-vertical"
|
||||||
style={
|
style={
|
||||||
Object {
|
Object {
|
||||||
"display": "none",
|
"display": "none",
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ exports[`ServerStats Should render table with stats 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="css-17l4171 track-horizontal"
|
className="css-52gpmd track-horizontal"
|
||||||
style={
|
style={
|
||||||
Object {
|
Object {
|
||||||
"display": "none",
|
"display": "none",
|
||||||
@@ -233,7 +233,7 @@ exports[`ServerStats Should render table with stats 1`] = `
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="css-17l4171 track-vertical"
|
className="css-52gpmd track-vertical"
|
||||||
style={
|
style={
|
||||||
Object {
|
Object {
|
||||||
"display": "none",
|
"display": "none",
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ export interface State {
|
|||||||
isFullscreen: boolean;
|
isFullscreen: boolean;
|
||||||
fullscreenPanel: PanelModel | null;
|
fullscreenPanel: PanelModel | null;
|
||||||
scrollTop: number;
|
scrollTop: number;
|
||||||
|
updateScrollTop: number;
|
||||||
rememberScrollTop: number;
|
rememberScrollTop: number;
|
||||||
showLoadingState: boolean;
|
showLoadingState: boolean;
|
||||||
}
|
}
|
||||||
@@ -73,6 +74,7 @@ export class DashboardPage extends PureComponent<Props, State> {
|
|||||||
showLoadingState: false,
|
showLoadingState: false,
|
||||||
fullscreenPanel: null,
|
fullscreenPanel: null,
|
||||||
scrollTop: 0,
|
scrollTop: 0,
|
||||||
|
updateScrollTop: null,
|
||||||
rememberScrollTop: 0,
|
rememberScrollTop: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -168,7 +170,7 @@ export class DashboardPage extends PureComponent<Props, State> {
|
|||||||
isEditing: false,
|
isEditing: false,
|
||||||
isFullscreen: false,
|
isFullscreen: false,
|
||||||
fullscreenPanel: null,
|
fullscreenPanel: null,
|
||||||
scrollTop: this.state.rememberScrollTop,
|
updateScrollTop: this.state.rememberScrollTop,
|
||||||
},
|
},
|
||||||
this.triggerPanelsRendering.bind(this)
|
this.triggerPanelsRendering.bind(this)
|
||||||
);
|
);
|
||||||
@@ -204,7 +206,7 @@ export class DashboardPage extends PureComponent<Props, State> {
|
|||||||
|
|
||||||
setScrollTop = (e: MouseEvent<HTMLElement>): void => {
|
setScrollTop = (e: MouseEvent<HTMLElement>): void => {
|
||||||
const target = e.target as HTMLElement;
|
const target = e.target as HTMLElement;
|
||||||
this.setState({ scrollTop: target.scrollTop });
|
this.setState({ scrollTop: target.scrollTop, updateScrollTop: null });
|
||||||
};
|
};
|
||||||
|
|
||||||
onAddPanel = () => {
|
onAddPanel = () => {
|
||||||
@@ -251,7 +253,7 @@ export class DashboardPage extends PureComponent<Props, State> {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { dashboard, editview, $injector, isInitSlow, initError } = this.props;
|
const { dashboard, editview, $injector, isInitSlow, initError } = this.props;
|
||||||
const { isSettingsOpening, isEditing, isFullscreen, scrollTop } = this.state;
|
const { isSettingsOpening, isEditing, isFullscreen, scrollTop, updateScrollTop } = this.state;
|
||||||
|
|
||||||
if (!dashboard) {
|
if (!dashboard) {
|
||||||
if (isInitSlow) {
|
if (isInitSlow) {
|
||||||
@@ -285,9 +287,9 @@ export class DashboardPage extends PureComponent<Props, State> {
|
|||||||
/>
|
/>
|
||||||
<div className="scroll-canvas scroll-canvas--dashboard">
|
<div className="scroll-canvas scroll-canvas--dashboard">
|
||||||
<CustomScrollbar
|
<CustomScrollbar
|
||||||
autoHeightMin={'100%'}
|
autoHeightMin="100%"
|
||||||
setScrollTop={this.setScrollTop}
|
setScrollTop={this.setScrollTop}
|
||||||
scrollTop={scrollTop}
|
scrollTop={updateScrollTop}
|
||||||
updateAfterMountMs={500}
|
updateAfterMountMs={500}
|
||||||
className="custom-scrollbar--page"
|
className="custom-scrollbar--page"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ exports[`DashboardPage Dashboard init completed Should render dashboard grid 1`
|
|||||||
autoHideTimeout={200}
|
autoHideTimeout={200}
|
||||||
className="custom-scrollbar--page"
|
className="custom-scrollbar--page"
|
||||||
hideTracksWhenNotNeeded={false}
|
hideTracksWhenNotNeeded={false}
|
||||||
scrollTop={0}
|
scrollTop={null}
|
||||||
setScrollTop={[Function]}
|
setScrollTop={[Function]}
|
||||||
updateAfterMountMs={500}
|
updateAfterMountMs={500}
|
||||||
>
|
>
|
||||||
@@ -349,7 +349,7 @@ exports[`DashboardPage When dashboard has editview url state should render setti
|
|||||||
autoHideTimeout={200}
|
autoHideTimeout={200}
|
||||||
className="custom-scrollbar--page"
|
className="custom-scrollbar--page"
|
||||||
hideTracksWhenNotNeeded={false}
|
hideTracksWhenNotNeeded={false}
|
||||||
scrollTop={0}
|
scrollTop={null}
|
||||||
setScrollTop={[Function]}
|
setScrollTop={[Function]}
|
||||||
updateAfterMountMs={500}
|
updateAfterMountMs={500}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user