mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	Refactor copy button event handler (#29379)
				
					
				
			Use "closest" instead of "for-loop"
This commit is contained in:
		| @@ -5,37 +5,30 @@ import {clippie} from 'clippie'; | |||||||
| const {copy_success, copy_error} = window.config.i18n; | const {copy_success, copy_error} = window.config.i18n; | ||||||
|  |  | ||||||
| // Enable clipboard copy from HTML attributes. These properties are supported: | // Enable clipboard copy from HTML attributes. These properties are supported: | ||||||
| // - data-clipboard-text: Direct text to copy, has highest precedence | // - data-clipboard-text: Direct text to copy | ||||||
| // - data-clipboard-target: Holds a selector for a <input> or <textarea> whose content is copied | // - data-clipboard-target: Holds a selector for a <input> or <textarea> whose content is copied | ||||||
| // - data-clipboard-text-type: When set to 'url' will convert relative to absolute urls | // - data-clipboard-text-type: When set to 'url' will convert relative to absolute urls | ||||||
| export function initGlobalCopyToClipboardListener() { | export function initGlobalCopyToClipboardListener() { | ||||||
|   document.addEventListener('click', (e) => { |   document.addEventListener('click', async (e) => { | ||||||
|     let target = e.target; |     const target = e.target.closest('[data-clipboard-text], [data-clipboard-target]'); | ||||||
|     // In case <button data-clipboard-text><svg></button>, so we just search |     if (!target) return; | ||||||
|     // up to 3 levels for performance |  | ||||||
|     for (let i = 0; i < 3 && target; i++) { |  | ||||||
|       let text = target.getAttribute('data-clipboard-text'); |  | ||||||
|  |  | ||||||
|       if (!text && target.getAttribute('data-clipboard-target')) { |     e.preventDefault(); | ||||||
|         text = document.querySelector(target.getAttribute('data-clipboard-target'))?.value; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       if (text && target.getAttribute('data-clipboard-text-type') === 'url') { |     let text; | ||||||
|         text = toAbsoluteUrl(text); |     if (target.hasAttribute('data-clipboard-text')) { | ||||||
|       } |       text = target.getAttribute('data-clipboard-text'); | ||||||
|  |     } else { | ||||||
|  |       text = document.querySelector(target.getAttribute('data-clipboard-target'))?.value; | ||||||
|  |     } | ||||||
|  |  | ||||||
|       if (text) { |     if (text && target.getAttribute('data-clipboard-text-type') === 'url') { | ||||||
|         e.preventDefault(); |       text = toAbsoluteUrl(text); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         (async() => { |     if (text) { | ||||||
|           const success = await clippie(text); |       const success = await clippie(text); | ||||||
|           showTemporaryTooltip(target, success ? copy_success : copy_error); |       showTemporaryTooltip(target, success ? copy_success : copy_error); | ||||||
|         })(); |  | ||||||
|  |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       target = target.parentElement; |  | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user