gitea源码

contextpopup.ts 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import {createApp} from 'vue';
  2. import ContextPopup from '../components/ContextPopup.vue';
  3. import {parseIssueHref} from '../utils.ts';
  4. import {createTippy} from '../modules/tippy.ts';
  5. export function initContextPopups() {
  6. const refIssues = document.querySelectorAll<HTMLElement>('.ref-issue');
  7. attachRefIssueContextPopup(refIssues);
  8. }
  9. export function attachRefIssueContextPopup(refIssues: NodeListOf<HTMLElement>) {
  10. for (const refIssue of refIssues) {
  11. if (refIssue.classList.contains('ref-external-issue')) continue;
  12. const issuePathInfo = parseIssueHref(refIssue.getAttribute('href'));
  13. if (!issuePathInfo.ownerName) continue;
  14. const el = document.createElement('div');
  15. el.classList.add('tw-p-3');
  16. refIssue.parentNode.insertBefore(el, refIssue.nextSibling);
  17. const view = createApp(ContextPopup);
  18. try {
  19. view.mount(el);
  20. } catch (err) {
  21. console.error(err);
  22. el.textContent = 'ContextPopup failed to load';
  23. }
  24. createTippy(refIssue, {
  25. theme: 'default',
  26. content: el,
  27. placement: 'top-start',
  28. interactive: true,
  29. role: 'dialog',
  30. interactiveBorder: 5,
  31. onShow: () => {
  32. el.firstChild.dispatchEvent(new CustomEvent('ce-load-context-popup', {detail: issuePathInfo}));
  33. },
  34. });
  35. }
  36. }