Files
grafana/public/app/core/components/scroll/scroll.ts

87 lines
2.1 KiB
TypeScript
Raw Normal View History

2018-03-27 23:27:23 +03:00
import $ from 'jquery';
import baron from 'baron';
2017-12-20 12:33:33 +01:00
import coreModule from 'app/core/core_module';
import appEvents from 'app/core/app_events';
2017-08-15 11:51:47 +02:00
2018-03-27 23:27:23 +03:00
const scrollBarHTML = `
<div class="baron__track">
<div class="baron__bar"></div>
</div>
`;
const scrollRootClass = 'baron baron__root';
const scrollerClass = 'baron__scroller';
2017-08-15 11:51:47 +02:00
export function geminiScrollbar() {
return {
2017-12-20 12:33:33 +01:00
restrict: 'A',
2017-08-15 11:51:47 +02:00
link: function(scope, elem, attrs) {
2018-03-27 23:27:23 +03:00
let scrollRoot = elem.parent();
let scroller = elem;
if (attrs.grafanaScrollbar && attrs.grafanaScrollbar === 'scrollonroot') {
scrollRoot = scroller;
}
scrollRoot.addClass(scrollRootClass);
$(scrollBarHTML).appendTo(scrollRoot);
elem.addClass(scrollerClass);
2018-04-04 19:21:17 +03:00
let scrollParams = {
2018-03-27 23:27:23 +03:00
root: scrollRoot[0],
scroller: scroller[0],
bar: '.baron__bar',
barOnCls: '_scrollbar',
scrollingCls: '_scrolling',
track: '.baron__track',
2018-04-04 19:21:17 +03:00
direction: 'v',
};
let scrollbar = baron(scrollParams);
2018-03-27 23:27:23 +03:00
let lastPos = 0;
appEvents.on(
'dash-scroll',
evt => {
if (evt.restore) {
elem[0].scrollTop = lastPos;
return;
}
lastPos = elem[0].scrollTop;
if (evt.animate) {
elem.animate({ scrollTop: evt.pos }, 500);
} else {
elem[0].scrollTop = evt.pos;
}
},
scope
);
// force updating dashboard width
appEvents.on('toggle-sidemenu', forceUpdate, scope);
appEvents.on('toggle-sidemenu-hidden', forceUpdate, scope);
appEvents.on('toggle-view-mode', forceUpdate, scope);
appEvents.on('toggle-kiosk-mode', forceUpdate, scope);
appEvents.on('toggle-inactive-mode', forceUpdate, scope);
function forceUpdate() {
2018-04-04 19:21:17 +03:00
scrollbar.scroll();
}
2018-04-04 19:21:17 +03:00
2017-12-20 12:33:33 +01:00
scope.$on('$routeChangeSuccess', () => {
lastPos = 0;
elem[0].scrollTop = 0;
});
2017-12-20 12:33:33 +01:00
scope.$on('$destroy', () => {
2018-03-27 23:27:23 +03:00
scrollbar.dispose();
});
2017-12-20 12:33:33 +01:00
},
2017-08-15 11:51:47 +02:00
};
}
2017-12-20 12:33:33 +01:00
coreModule.directive('grafanaScrollbar', geminiScrollbar);