mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Improve dashboard's repo list performance (#18963)
* Improve dashboard's repo list performance - Avoid a lot of database lookups for all the repo's, by adding a undocumented "minimal" mode for this specific task, which returns the data that's only needed by this list which doesn't require any database lookups. - Makes fetching these list faster. - Less CPU overhead when a user visits home page. * Refactor javascript code + fix Fork icon - Use async in the function so we can use `await`. - Remove `archivedFilter` check for count, as it doesn't make sense to show the count of repos when you can't even see them(as they are filited away). * Add `count_only` * Remove uncessary code * Improve comment Co-authored-by: delvh <dev.lh@web.de> * Update web_src/js/components/DashboardRepoList.js Co-authored-by: delvh <dev.lh@web.de> * Update web_src/js/components/DashboardRepoList.js Co-authored-by: delvh <dev.lh@web.de> * By default apply minimal mode * Remove `minimal` paramater * Refactor count header * Simplify init Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		@@ -298,36 +298,41 @@ function initVueComponents() {
 | 
			
		||||
        this.searchRepos();
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      searchRepos() {
 | 
			
		||||
      async searchRepos() {
 | 
			
		||||
        this.isLoading = true;
 | 
			
		||||
 | 
			
		||||
        if (!this.reposTotalCount) {
 | 
			
		||||
          const totalCountSearchURL = `${this.subUrl}/repo/search?sort=updated&order=desc&uid=${this.uid}&team_id=${this.teamId}&q=&page=1&mode=`;
 | 
			
		||||
          $.getJSON(totalCountSearchURL, (_result, _textStatus, request) => {
 | 
			
		||||
            this.reposTotalCount = request.getResponseHeader('X-Total-Count');
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const searchedMode = this.repoTypes[this.reposFilter].searchMode;
 | 
			
		||||
        const searchedURL = this.searchURL;
 | 
			
		||||
        const searchedQuery = this.searchQuery;
 | 
			
		||||
 | 
			
		||||
        $.getJSON(searchedURL, (result, _textStatus, request) => {
 | 
			
		||||
          if (searchedURL === this.searchURL) {
 | 
			
		||||
            this.repos = result.data;
 | 
			
		||||
            const count = request.getResponseHeader('X-Total-Count');
 | 
			
		||||
            if (searchedQuery === '' && searchedMode === '' && this.archivedFilter === 'both') {
 | 
			
		||||
              this.reposTotalCount = count;
 | 
			
		||||
            }
 | 
			
		||||
            Vue.set(this.counts, `${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`, count);
 | 
			
		||||
            this.finalPage = Math.ceil(count / this.searchLimit);
 | 
			
		||||
            this.updateHistory();
 | 
			
		||||
        let response, json;
 | 
			
		||||
        try {
 | 
			
		||||
          if (!this.reposTotalCount) {
 | 
			
		||||
            const totalCountSearchURL = `${this.subUrl}/repo/search?count_only=1&uid=${this.uid}&team_id=${this.teamId}&q=&page=1&mode=`;
 | 
			
		||||
            response = await fetch(totalCountSearchURL);
 | 
			
		||||
            this.reposTotalCount = response.headers.get('X-Total-Count');
 | 
			
		||||
          }
 | 
			
		||||
        }).always(() => {
 | 
			
		||||
 | 
			
		||||
          response = await fetch(searchedURL);
 | 
			
		||||
          json = await response.json();
 | 
			
		||||
        } catch {
 | 
			
		||||
          if (searchedURL === this.searchURL) {
 | 
			
		||||
            this.isLoading = false;
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (searchedURL === this.searchURL) {
 | 
			
		||||
          this.repos = json.data;
 | 
			
		||||
          const count = response.headers.get('X-Total-Count');
 | 
			
		||||
          if (searchedQuery === '' && searchedMode === '' && this.archivedFilter === 'both') {
 | 
			
		||||
            this.reposTotalCount = count;
 | 
			
		||||
          }
 | 
			
		||||
          Vue.set(this.counts, `${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`, count);
 | 
			
		||||
          this.finalPage = Math.ceil(count / this.searchLimit);
 | 
			
		||||
          this.updateHistory();
 | 
			
		||||
          this.isLoading = false;
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      repoIcon(repo) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user