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.4KB

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