mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Optimize the dashboard (#32990)
before:  after:  -----  ----- Optimize the dashboard by adding welcoming messages or quick action entry points (such as adding a new repository or organization) to ensure that new users are not greeted by a blank page upon logging in. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -385,6 +385,13 @@ show_only_public = Showing only public | |||||||
|  |  | ||||||
| issues.in_your_repos = In your repositories | issues.in_your_repos = In your repositories | ||||||
|  |  | ||||||
|  | guide_title = No Activity | ||||||
|  | guide_desc = You are currently not following any repositories or users, so there is no content to display. You can explore repositories or users of interest from the links below. | ||||||
|  | explore_repos = Explore repositories | ||||||
|  | explore_users = Explore users | ||||||
|  | empty_org = There are no organizations yet. | ||||||
|  | empty_repo = There are no repositories yet. | ||||||
|  |  | ||||||
| [explore] | [explore] | ||||||
| repos = Repositories | repos = Repositories | ||||||
| users = Users | users = Users | ||||||
|   | |||||||
| @@ -5,7 +5,11 @@ | |||||||
| 		<div class="flex-container-main"> | 		<div class="flex-container-main"> | ||||||
| 			{{template "base/alert" .}} | 			{{template "base/alert" .}} | ||||||
| 			{{template "user/heatmap" .}} | 			{{template "user/heatmap" .}} | ||||||
| 			{{template "user/dashboard/feeds" .}} | 			{{if .Feeds}} | ||||||
|  | 				{{template "user/dashboard/feeds" .}} | ||||||
|  | 			{{else}} | ||||||
|  | 				{{template "user/dashboard/guide" .}} | ||||||
|  | 			{{end}} | ||||||
| 		</div> | 		</div> | ||||||
| 		{{template "user/dashboard/repolist" .}} | 		{{template "user/dashboard/repolist" .}} | ||||||
| 	</div> | 	</div> | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								templates/user/dashboard/guide.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								templates/user/dashboard/guide.tmpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | <div class="tw-text-center tw-p-8"> | ||||||
|  | 	{{svg "octicon-package" 24 "tw-text-placeholder-text"}} | ||||||
|  | 	<h3 class="tw-my-4">{{ctx.Locale.Tr "home.guide_title"}}</h3> | ||||||
|  | 	<p class="tw-text-placeholder-text">{{ctx.Locale.Tr "home.guide_desc"}}</p> | ||||||
|  | 	<div> | ||||||
|  | 		<a href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "home.explore_repos"}}</a> | ||||||
|  | 		<span>·</span> | ||||||
|  | 		<a href="{{AppSubUrl}}/explore/users">{{ctx.Locale.Tr "home.explore_users"}}</a> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
| @@ -5,6 +5,10 @@ const data = { | |||||||
| 	isMirrorsEnabled: {{.MirrorsEnabled}}, | 	isMirrorsEnabled: {{.MirrorsEnabled}}, | ||||||
| 	isStarsEnabled: {{not .IsDisableStars}}, | 	isStarsEnabled: {{not .IsDisableStars}}, | ||||||
|  |  | ||||||
|  | 	canCreateMigrations: {{not .DisableMigrations}}, | ||||||
|  |  | ||||||
|  | 	textNoOrg: {{ctx.Locale.Tr "home.empty_org"}}, | ||||||
|  | 	textNoRepo: {{ctx.Locale.Tr "home.empty_repo"}}, | ||||||
| 	textRepository: {{ctx.Locale.Tr "repository"}}, | 	textRepository: {{ctx.Locale.Tr "repository"}}, | ||||||
| 	textOrganization: {{ctx.Locale.Tr "organization"}}, | 	textOrganization: {{ctx.Locale.Tr "organization"}}, | ||||||
| 	textMyRepos: {{ctx.Locale.Tr "home.my_repos"}}, | 	textMyRepos: {{ctx.Locale.Tr "home.my_repos"}}, | ||||||
|   | |||||||
| @@ -113,7 +113,7 @@ export default defineComponent({ | |||||||
|     this.changeReposFilter(this.reposFilter); |     this.changeReposFilter(this.reposFilter); | ||||||
|     fomanticQuery(el.querySelector('.ui.dropdown')).dropdown(); |     fomanticQuery(el.querySelector('.ui.dropdown')).dropdown(); | ||||||
|     nextTick(() => { |     nextTick(() => { | ||||||
|       this.$refs.search.focus(); |       this.$refs.search?.focus(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     this.textArchivedFilterTitles = { |     this.textArchivedFilterTitles = { | ||||||
| @@ -243,7 +243,7 @@ export default defineComponent({ | |||||||
|         if (!this.reposTotalCount) { |         if (!this.reposTotalCount) { | ||||||
|           const totalCountSearchURL = `${this.subUrl}/repo/search?count_only=1&uid=${this.uid}&team_id=${this.teamId}&q=&page=1&mode=`; |           const totalCountSearchURL = `${this.subUrl}/repo/search?count_only=1&uid=${this.uid}&team_id=${this.teamId}&q=&page=1&mode=`; | ||||||
|           response = await GET(totalCountSearchURL); |           response = await GET(totalCountSearchURL); | ||||||
|           this.reposTotalCount = response.headers.get('X-Total-Count') ?? '?'; |           this.reposTotalCount = parseInt(response.headers.get('X-Total-Count') ?? '0'); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         response = await GET(searchedURL); |         response = await GET(searchedURL); | ||||||
| @@ -336,7 +336,6 @@ export default defineComponent({ | |||||||
|     }, |     }, | ||||||
|   }, |   }, | ||||||
| }); | }); | ||||||
|  |  | ||||||
| </script> | </script> | ||||||
| <template> | <template> | ||||||
|   <div> |   <div> | ||||||
| @@ -354,7 +353,15 @@ export default defineComponent({ | |||||||
|           <svg-icon name="octicon-plus"/> |           <svg-icon name="octicon-plus"/> | ||||||
|         </a> |         </a> | ||||||
|       </h4> |       </h4> | ||||||
|       <div class="ui attached segment repos-search"> |       <div v-if="!reposTotalCount" class="ui attached segment"> | ||||||
|  |         <div v-if="!isLoading" class="empty-repo-or-org"> | ||||||
|  |           <svg-icon name="octicon-git-branch" :size="24"/> | ||||||
|  |           <p>{{ textNoRepo }}</p> | ||||||
|  |         </div> | ||||||
|  |         <!-- using the loading indicator here will cause more (unnecessary) page flickers, so at the moment, not use the loading indicator --> | ||||||
|  |         <!-- <div v-else class="is-loading loading-icon-2px tw-min-h-16"/> --> | ||||||
|  |       </div> | ||||||
|  |       <div v-else class="ui attached segment repos-search"> | ||||||
|         <div class="ui small fluid action left icon input"> |         <div class="ui small fluid action left icon input"> | ||||||
|           <input type="search" spellcheck="false" maxlength="255" @input="changeReposFilter(reposFilter)" v-model="searchQuery" ref="search" @keydown="reposFilterKeyControl" :placeholder="textSearchRepos"> |           <input type="search" spellcheck="false" maxlength="255" @input="changeReposFilter(reposFilter)" v-model="searchQuery" ref="search" @keydown="reposFilterKeyControl" :placeholder="textSearchRepos"> | ||||||
|           <i class="icon loading-icon-3px" :class="{'is-loading': isLoading}"><svg-icon name="octicon-search" :size="16"/></i> |           <i class="icon loading-icon-3px" :class="{'is-loading': isLoading}"><svg-icon name="octicon-search" :size="16"/></i> | ||||||
| @@ -438,7 +445,7 @@ export default defineComponent({ | |||||||
|               class="item navigation tw-py-1" :class="{'disabled': page === 1}" |               class="item navigation tw-py-1" :class="{'disabled': page === 1}" | ||||||
|               @click="changePage(page - 1)" :title="textPreviousPage" |               @click="changePage(page - 1)" :title="textPreviousPage" | ||||||
|             > |             > | ||||||
|               <svg-icon name="octicon-chevron-left" :size="16" clsas-name="tw-mr-1"/> |               <svg-icon name="octicon-chevron-left" :size="16" clsas="tw-mr-1"/> | ||||||
|             </a> |             </a> | ||||||
|             <a class="active item tw-py-1">{{ page }}</a> |             <a class="active item tw-py-1">{{ page }}</a> | ||||||
|             <a |             <a | ||||||
| @@ -467,7 +474,13 @@ export default defineComponent({ | |||||||
|           <svg-icon name="octicon-plus"/> |           <svg-icon name="octicon-plus"/> | ||||||
|         </a> |         </a> | ||||||
|       </h4> |       </h4> | ||||||
|       <div v-if="organizations.length" class="ui attached table segment tw-rounded-b"> |       <div v-if="!organizations.length" class="ui attached segment"> | ||||||
|  |         <div class="empty-repo-or-org"> | ||||||
|  |           <svg-icon name="octicon-organization" :size="24"/> | ||||||
|  |           <p>{{ textNoOrg }}</p> | ||||||
|  |         </div> | ||||||
|  |       </div> | ||||||
|  |       <div v-else class="ui attached table segment tw-rounded-b"> | ||||||
|         <ul class="repo-owner-name-list"> |         <ul class="repo-owner-name-list"> | ||||||
|           <li class="tw-flex tw-items-center tw-py-2" v-for="org in organizations" :key="org.name"> |           <li class="tw-flex tw-items-center tw-py-2" v-for="org in organizations" :key="org.name"> | ||||||
|             <a class="repo-list-link muted" :href="subUrl + '/' + encodeURIComponent(org.name)"> |             <a class="repo-list-link muted" :href="subUrl + '/' + encodeURIComponent(org.name)"> | ||||||
| @@ -546,4 +559,14 @@ ul li:not(:last-child) { | |||||||
| .repo-owner-name-list li.active { | .repo-owner-name-list li.active { | ||||||
|   background: var(--color-hover); |   background: var(--color-hover); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .empty-repo-or-org { | ||||||
|  |   margin-top: 1em; | ||||||
|  |   text-align: center; | ||||||
|  |   color: var(--color-placeholder-text); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .empty-repo-or-org p { | ||||||
|  |   margin: 1em auto; | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Kerwin Bryant
					Kerwin Bryant