mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	| @@ -1,5 +1,41 @@ | ||||
| import {matchEmoji, matchMention} from '../../utils/match.ts'; | ||||
| import {matchEmoji, matchMention, matchIssue} from '../../utils/match.ts'; | ||||
| import {emojiString} from '../emoji.ts'; | ||||
| import {svg} from '../../svg.ts'; | ||||
| import {parseIssueHref} from '../../utils.ts'; | ||||
| import {createElementFromAttrs, createElementFromHTML} from '../../utils/dom.ts'; | ||||
| import {getIssueColor, getIssueIcon} from '../issue.ts'; | ||||
| import {debounce} from 'perfect-debounce'; | ||||
|  | ||||
| const debouncedSuggestIssues = debounce((key: string, text: string) => new Promise<{matched:boolean; fragment?: HTMLElement}>(async (resolve) => { | ||||
|   const {owner, repo, index} = parseIssueHref(window.location.href); | ||||
|   const matches = await matchIssue(owner, repo, index, text); | ||||
|   if (!matches.length) return resolve({matched: false}); | ||||
|  | ||||
|   const ul = document.createElement('ul'); | ||||
|   ul.classList.add('suggestions'); | ||||
|   for (const issue of matches) { | ||||
|     const li = createElementFromAttrs('li', { | ||||
|       role: 'option', | ||||
|       'data-value': `${key}${issue.id}`, | ||||
|       class: 'tw-flex tw-gap-2', | ||||
|     }); | ||||
|  | ||||
|     const icon = svg(getIssueIcon(issue), 16, ['text', getIssueColor(issue)].join(' ')); | ||||
|     li.append(createElementFromHTML(icon)); | ||||
|  | ||||
|     const id = document.createElement('span'); | ||||
|     id.textContent = issue.id.toString(); | ||||
|     li.append(id); | ||||
|  | ||||
|     const nameSpan = document.createElement('span'); | ||||
|     nameSpan.textContent = issue.title; | ||||
|     li.append(nameSpan); | ||||
|  | ||||
|     ul.append(li); | ||||
|   } | ||||
|  | ||||
|   resolve({matched: true, fragment: ul}); | ||||
| }), 100); | ||||
|  | ||||
| export function initTextExpander(expander) { | ||||
|   expander?.addEventListener('text-expander-change', ({detail: {key, provide, text}}) => { | ||||
| @@ -49,12 +85,14 @@ export function initTextExpander(expander) { | ||||
|       } | ||||
|  | ||||
|       provide({matched: true, fragment: ul}); | ||||
|     } else if (key === '#') { | ||||
|       provide(debouncedSuggestIssues(key, text)); | ||||
|     } | ||||
|   }); | ||||
|   expander?.addEventListener('text-expander-value', ({detail}) => { | ||||
|     if (detail?.item) { | ||||
|       // add a space after @mentions as it's likely the user wants one | ||||
|       const suffix = detail.key === '@' ? ' ' : ''; | ||||
|       // add a space after @mentions and #issue as it's likely the user wants one | ||||
|       const suffix = ['@', '#'].includes(detail.key) ? ' ' : ''; | ||||
|       detail.value = `${detail.item.getAttribute('data-value')}${suffix}`; | ||||
|     } | ||||
|   }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user