You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repo-graph.js 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. export default function initRepoGraphGit() {
  2. const graphContainer = document.getElementById('git-graph-container');
  3. if (!graphContainer) return;
  4. $('#flow-color-monochrome').on('click', () => {
  5. $('#flow-color-monochrome').addClass('active');
  6. $('#flow-color-colored').removeClass('active');
  7. $('#git-graph-container').removeClass('colored').addClass('monochrome');
  8. const params = new URLSearchParams(window.location.search);
  9. params.set('mode', 'monochrome');
  10. const queryString = params.toString();
  11. if (queryString) {
  12. window.history.replaceState({}, '', `?${queryString}`);
  13. } else {
  14. window.history.replaceState({}, '', window.location.pathname);
  15. }
  16. $('.pagination a').each((_, that) => {
  17. const href = $(that).attr('href');
  18. if (!href) return;
  19. const url = new URL(href, window.location);
  20. const params = url.searchParams;
  21. params.set('mode', 'monochrome');
  22. url.search = `?${params.toString()}`;
  23. $(that).attr('href', url.href);
  24. });
  25. });
  26. $('#flow-color-colored').on('click', () => {
  27. $('#flow-color-colored').addClass('active');
  28. $('#flow-color-monochrome').removeClass('active');
  29. $('#git-graph-container').addClass('colored').removeClass('monochrome');
  30. $('.pagination a').each((_, that) => {
  31. const href = $(that).attr('href');
  32. if (!href) return;
  33. const url = new URL(href, window.location);
  34. const params = url.searchParams;
  35. params.delete('mode');
  36. url.search = `?${params.toString()}`;
  37. $(that).attr('href', url.href);
  38. });
  39. const params = new URLSearchParams(window.location.search);
  40. params.delete('mode');
  41. const queryString = params.toString();
  42. if (queryString) {
  43. window.history.replaceState({}, '', `?${queryString}`);
  44. } else {
  45. window.history.replaceState({}, '', window.location.pathname);
  46. }
  47. });
  48. const url = new URL(window.location);
  49. const params = url.searchParams;
  50. const updateGraph = () => {
  51. const queryString = params.toString();
  52. const ajaxUrl = new URL(url);
  53. ajaxUrl.searchParams.set('div-only', 'true');
  54. window.history.replaceState({}, '', queryString ? `?${queryString}` : window.location.pathname);
  55. $('#pagination').empty();
  56. $('#rel-container').addClass('hide');
  57. $('#rev-container').addClass('hide');
  58. $('#loading-indicator').removeClass('hide');
  59. (async () => {
  60. const div = $(await $.ajax(String(ajaxUrl)));
  61. $('#pagination').html(div.find('#pagination').html());
  62. $('#rel-container').html(div.find('#rel-container').html());
  63. $('#rev-container').html(div.find('#rev-container').html());
  64. $('#loading-indicator').addClass('hide');
  65. $('#rel-container').removeClass('hide');
  66. $('#rev-container').removeClass('hide');
  67. })();
  68. };
  69. const dropdownSelected = params.getAll('branch');
  70. if (params.has('hide-pr-refs') && params.get('hide-pr-refs') === 'true') {
  71. dropdownSelected.splice(0, 0, '...flow-hide-pr-refs');
  72. }
  73. $('#flow-select-refs-dropdown').dropdown('set selected', dropdownSelected);
  74. $('#flow-select-refs-dropdown').dropdown({
  75. clearable: true,
  76. fullTextSeach: 'exact',
  77. onRemove(toRemove) {
  78. if (toRemove === '...flow-hide-pr-refs') {
  79. params.delete('hide-pr-refs');
  80. } else {
  81. const branches = params.getAll('branch');
  82. params.delete('branch');
  83. for (const branch of branches) {
  84. if (branch !== toRemove) {
  85. params.append('branch', branch);
  86. }
  87. }
  88. }
  89. updateGraph();
  90. },
  91. onAdd(toAdd) {
  92. if (toAdd === '...flow-hide-pr-refs') {
  93. params.set('hide-pr-refs', true);
  94. } else {
  95. params.append('branch', toAdd);
  96. }
  97. updateGraph();
  98. },
  99. });
  100. $('#git-graph-container').on('mouseenter', '#rev-list li', (e) => {
  101. const flow = $(e.currentTarget).data('flow');
  102. if (flow === 0) return;
  103. $(`#flow-${flow}`).addClass('highlight');
  104. $(e.currentTarget).addClass('hover');
  105. $(`#rev-list li[data-flow='${flow}']`).addClass('highlight');
  106. });
  107. $('#git-graph-container').on('mouseleave', '#rev-list li', (e) => {
  108. const flow = $(e.currentTarget).data('flow');
  109. if (flow === 0) return;
  110. $(`#flow-${flow}`).removeClass('highlight');
  111. $(e.currentTarget).removeClass('hover');
  112. $(`#rev-list li[data-flow='${flow}']`).removeClass('highlight');
  113. });
  114. $('#git-graph-container').on('mouseenter', '#rel-container .flow-group', (e) => {
  115. $(e.currentTarget).addClass('highlight');
  116. const flow = $(e.currentTarget).data('flow');
  117. $(`#rev-list li[data-flow='${flow}']`).addClass('highlight');
  118. });
  119. $('#git-graph-container').on('mouseleave', '#rel-container .flow-group', (e) => {
  120. $(e.currentTarget).removeClass('highlight');
  121. const flow = $(e.currentTarget).data('flow');
  122. $(`#rev-list li[data-flow='${flow}']`).removeClass('highlight');
  123. });
  124. $('#git-graph-container').on('mouseenter', '#rel-container .flow-commit', (e) => {
  125. const rev = $(e.currentTarget).data('rev');
  126. $(`#rev-list li#commit-${rev}`).addClass('hover');
  127. });
  128. $('#git-graph-container').on('mouseleave', '#rel-container .flow-commit', (e) => {
  129. const rev = $(e.currentTarget).data('rev');
  130. $(`#rev-list li#commit-${rev}`).removeClass('hover');
  131. });
  132. }