scroll.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. if (attrs.grafanaScrollbar && attrs.grafanaScrollbar === 'scrollonroot') {
  19. scrollRoot = scroller;
  20. }
  21. scrollRoot.addClass(scrollRootClass);
  22. $(scrollBarHTML).appendTo(scrollRoot);
  23. elem.addClass(scrollerClass);
  24. let scrollbar = baron({
  25. root: scrollRoot[0],
  26. scroller: scroller[0],
  27. bar: '.baron__bar',
  28. barOnCls: '_scrollbar',
  29. scrollingCls: '_scrolling',
  30. track: '.baron__track',
  31. });
  32. let lastPos = 0;
  33. appEvents.on(
  34. 'dash-scroll',
  35. evt => {
  36. if (evt.restore) {
  37. elem[0].scrollTop = lastPos;
  38. return;
  39. }
  40. lastPos = elem[0].scrollTop;
  41. if (evt.animate) {
  42. elem.animate({ scrollTop: evt.pos }, 500);
  43. } else {
  44. elem[0].scrollTop = evt.pos;
  45. }
  46. },
  47. scope
  48. );
  49. scope.$on('$routeChangeSuccess', () => {
  50. lastPos = 0;
  51. elem[0].scrollTop = 0;
  52. });
  53. scope.$on('$destroy', () => {
  54. // scrollbar.destroy();
  55. scrollbar.dispose();
  56. });
  57. },
  58. };
  59. }
  60. coreModule.directive('grafanaScrollbar', geminiScrollbar);