mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	Refactor authors dropdown (send get request from frontend to avoid long wait time) (#23890)
Right now the authors search dropdown might take a long time to load if amount of authors is huge. Example: (In the video below, there are about 10000 authors, and it takes about 10 seconds to open the author dropdown) https://user-images.githubusercontent.com/17645053/229422229-98aa9656-3439-4f8c-9f4e-83bd8e2a2557.mov Possible improvements can be made, which will take 2 steps (Thanks to @wolfogre for advice): Step 1: Backend: Add a new api, which returns a limit of 30 posters with matched prefix. Frontend: Change the search behavior from frontend search(fomantic search) to backend search(when input is changed, send a request to get authors matching the current search prefix) Step 2: Backend: Optimize the api in step 1 using indexer to support fuzzy search. This PR is implements the first step. The main changes: 1. Added api: `GET /{type:issues|pulls}/posters` , which return a limit of 30 users with matched prefix (prefix sent as query). If `DEFAULT_SHOW_FULL_NAME` in `custom/conf/app.ini` is set to true, will also include fullnames fuzzy search. 2. Added a tooltip saying "Shows a maximum of 30 users" to the author search dropdown 3. Change the search behavior from frontend search to backend search After: https://user-images.githubusercontent.com/17645053/229430960-f88fafd8-fd5d-4f84-9df2-2677539d5d08.mov Fixes: https://github.com/go-gitea/gitea/issues/22586 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: silverwind <me@silverwind.io>
This commit is contained in:
		| @@ -19,7 +19,48 @@ export function initGiteaFomantic() { | ||||
|     return escape(text, preserveHTML) + svg('octicon-x', 16, `${className.delete} icon`); | ||||
|   }; | ||||
|  | ||||
|   initFomanticApiPatch(); | ||||
|  | ||||
|   // Use the patches to improve accessibility, these patches are designed to be as independent as possible, make it easy to modify or remove in the future. | ||||
|   initAriaCheckboxPatch(); | ||||
|   initAriaDropdownPatch(); | ||||
| } | ||||
|  | ||||
| function initFomanticApiPatch() { | ||||
|   // | ||||
|   // Fomantic API module has some very buggy behaviors: | ||||
|   // | ||||
|   // If encodeParameters=true, it calls `urlEncodedValue` to encode the parameter. | ||||
|   // However, `urlEncodedValue` just tries to "guess" whether the parameter is already encoded, by decoding the parameter and encoding it again. | ||||
|   // | ||||
|   // There are 2 problems: | ||||
|   // 1. It may guess wrong, and skip encoding a parameter which looks like encoded. | ||||
|   // 2. If the parameter can't be decoded, `decodeURIComponent` will throw an error, and the whole request will fail. | ||||
|   // | ||||
|   // This patch only fixes the second error behavior at the moment. | ||||
|   // | ||||
|   const patchKey = '_giteaFomanticApiPatch'; | ||||
|   const oldApi = $.api; | ||||
|   $.api = $.fn.api = function(...args) { | ||||
|     const apiCall = oldApi.bind(this); | ||||
|     const ret = oldApi.apply(this, args); | ||||
|  | ||||
|     if (typeof args[0] !== 'string') { | ||||
|       const internalGet = apiCall('internal', 'get'); | ||||
|       if (!internalGet.urlEncodedValue[patchKey]) { | ||||
|         const oldUrlEncodedValue = internalGet.urlEncodedValue; | ||||
|         internalGet.urlEncodedValue = function (value) { | ||||
|           try { | ||||
|             return oldUrlEncodedValue(value); | ||||
|           } catch { | ||||
|             // if Fomantic API module's `urlEncodedValue` throws an error, we encode it by ourselves. | ||||
|             return encodeURIComponent(value); | ||||
|           } | ||||
|         }; | ||||
|         internalGet.urlEncodedValue[patchKey] = true; | ||||
|       } | ||||
|     } | ||||
|     return ret; | ||||
|   }; | ||||
|   $.api.settings = oldApi.settings; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user