scroll.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import $ from 'jquery';
  2. import baron from 'baron';
  3. import coreModule from 'app/core/core_module';
  4. import appEvents from 'app/core/app_events';
  5. const scrollBarHTML = `
  6. <div class="baron__track">
  7. <div class="baron__bar"></div>
  8. </div>
  9. `;
  10. const scrollRootClass = 'baron baron__root';
  11. const scrollerClass = 'baron__scroller';
  12. export function geminiScrollbar() {
  13. return {
  14. restrict: 'A',
  15. link: function(scope, elem, attrs) {
  16. let scrollRoot = elem.parent();
  17. let scroller = elem;
  18. console.log('scroll');
  19. if (attrs.grafanaScrollbar && attrs.grafanaScrollbar === 'scrollonroot') {
  20. scrollRoot = scroller;
  21. }
  22. scrollRoot.addClass(scrollRootClass);
  23. $(scrollBarHTML).appendTo(scrollRoot);
  24. elem.addClass(scrollerClass);
  25. let scrollParams = {
  26. root: scrollRoot[0],
  27. scroller: scroller[0],
  28. bar: '.baron__bar',
  29. barOnCls: '_scrollbar',
  30. scrollingCls: '_scrolling',
  31. track: '.baron__track',
  32. direction: 'v',
  33. };
  34. let scrollbar = baron(scrollParams);
  35. let lastPos = 0;
  36. appEvents.on(
  37. 'dash-scroll',
  38. evt => {
  39. if (evt.restore) {
  40. elem[0].scrollTop = lastPos;
  41. return;
  42. }
  43. lastPos = elem[0].scrollTop;
  44. if (evt.animate) {
  45. elem.animate({ scrollTop: evt.pos }, 500);
  46. } else {
  47. elem[0].scrollTop = evt.pos;
  48. }
  49. },
  50. scope
  51. );
  52. // force updating dashboard width
  53. appEvents.on('toggle-sidemenu', forceUpdate, scope);
  54. appEvents.on('toggle-sidemenu-hidden', forceUpdate, scope);
  55. appEvents.on('toggle-view-mode', forceUpdate, scope);
  56. appEvents.on('toggle-kiosk-mode', forceUpdate, scope);
  57. appEvents.on('toggle-inactive-mode', forceUpdate, scope);
  58. function forceUpdate() {
  59. scrollbar.scroll();
  60. }
  61. scope.$on('$routeChangeSuccess', () => {
  62. lastPos = 0;
  63. elem[0].scrollTop = 0;
  64. });
  65. scope.$on('$destroy', () => {
  66. scrollbar.dispose();
  67. });
  68. },
  69. };
  70. }
  71. coreModule.directive('grafanaScrollbar', geminiScrollbar);