mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Improve behavior of "Fork" button (#17288)
* Improbe behaviour of fork button * Apply suggestions from code review * Remove old lines * Apply suggestions * Fix test * Remove unnecessary or * Update templates/repo/header.tmpl Co-authored-by: silverwind <me@silverwind.io> * Add comment * Fix situation if you can't fork but don't have forks * Fix lint * Apply changes from #17783 * fmt * fmt * Apply tweaks Co-authored by: silverwind <me@silverwind.io> * Rm dupl css * Fix build Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		| @@ -294,6 +294,36 @@ func CanUserForkRepo(user *user_model.User, repo *repo_model.Repository) (bool, | |||||||
| 	return false, nil | 	return false, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetForksByUserAndOrgs return forked repos of the user and owned orgs | ||||||
|  | func GetForksByUserAndOrgs(user *user_model.User, repo *repo_model.Repository) ([]*repo_model.Repository, error) { | ||||||
|  | 	var repoList []*repo_model.Repository | ||||||
|  | 	if user == nil { | ||||||
|  | 		return repoList, nil | ||||||
|  | 	} | ||||||
|  | 	var forkedRepo *repo_model.Repository | ||||||
|  | 	forkedRepo, err := repo_model.GetUserFork(repo.ID, user.ID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return repoList, err | ||||||
|  | 	} | ||||||
|  | 	if forkedRepo != nil { | ||||||
|  | 		repoList = append(repoList, forkedRepo) | ||||||
|  | 	} | ||||||
|  | 	canCreateRepos, err := GetOrgsCanCreateRepoByUserID(user.ID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return repoList, err | ||||||
|  | 	} | ||||||
|  | 	for _, org := range canCreateRepos { | ||||||
|  | 		forkedRepo, err := repo_model.GetUserFork(repo.ID, org.ID) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return repoList, err | ||||||
|  | 		} | ||||||
|  | 		if forkedRepo != nil { | ||||||
|  | 			repoList = append(repoList, forkedRepo) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return repoList, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // CanUserDelete returns true if user could delete the repository | // CanUserDelete returns true if user could delete the repository | ||||||
| func CanUserDelete(repo *repo_model.Repository, user *user_model.User) (bool, error) { | func CanUserDelete(repo *repo_model.Repository, user *user_model.User) (bool, error) { | ||||||
| 	if user.IsAdmin || user.ID == repo.OwnerID { | 	if user.IsAdmin || user.ID == repo.OwnerID { | ||||||
|   | |||||||
| @@ -499,10 +499,24 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) { | |||||||
| 	ctx.Data["CanWriteIssues"] = ctx.Repo.CanWrite(unit_model.TypeIssues) | 	ctx.Data["CanWriteIssues"] = ctx.Repo.CanWrite(unit_model.TypeIssues) | ||||||
| 	ctx.Data["CanWritePulls"] = ctx.Repo.CanWrite(unit_model.TypePullRequests) | 	ctx.Data["CanWritePulls"] = ctx.Repo.CanWrite(unit_model.TypePullRequests) | ||||||
|  |  | ||||||
| 	if ctx.Data["CanSignedUserFork"], err = models.CanUserForkRepo(ctx.User, ctx.Repo.Repository); err != nil { | 	canSignedUserFork, err := models.CanUserForkRepo(ctx.User, ctx.Repo.Repository) | ||||||
| 		ctx.ServerError("CanSignedUserFork", err) | 	if err != nil { | ||||||
|  | 		ctx.ServerError("CanUserForkRepo", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 	ctx.Data["CanSignedUserFork"] = canSignedUserFork | ||||||
|  |  | ||||||
|  | 	userAndOrgForks, err := models.GetForksByUserAndOrgs(ctx.User, ctx.Repo.Repository) | ||||||
|  | 	if err != nil { | ||||||
|  | 		ctx.ServerError("GetForksByUserAndOrgs", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	ctx.Data["UserAndOrgForks"] = userAndOrgForks | ||||||
|  |  | ||||||
|  | 	// canSignedUserFork is true if the current user doesn't have a fork of this repo yet or | ||||||
|  | 	// if he owns an org that doesn't have a fork of this repo yet | ||||||
|  | 	// If multiple forks are available or if the user can fork to another account, but there is already a fork: open selection dialog | ||||||
|  | 	ctx.Data["ShowForkModal"] = len(userAndOrgForks) > 1 || (canSignedUserFork && len(userAndOrgForks) > 0) | ||||||
|  |  | ||||||
| 	ctx.Data["DisableSSH"] = setting.SSH.Disabled | 	ctx.Data["DisableSSH"] = setting.SSH.Disabled | ||||||
| 	ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous | 	ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous | ||||||
|   | |||||||
| @@ -785,6 +785,8 @@ visibility_fork_helper = (Changing this will affect all forks.) | |||||||
| clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener noreferrer" href="%s">Help</a>. | clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener noreferrer" href="%s">Help</a>. | ||||||
| fork_repo = Fork Repository | fork_repo = Fork Repository | ||||||
| fork_from = Fork From | fork_from = Fork From | ||||||
|  | already_forked = You've already forked %s | ||||||
|  | fork_to_different_account = Fork to a different account | ||||||
| fork_visibility_helper = The visibility of a forked repository cannot be changed. | fork_visibility_helper = The visibility of a forked repository cannot be changed. | ||||||
| use_template = Use this template | use_template = Use this template | ||||||
| clone_in_vsc = Clone in VS Code | clone_in_vsc = Clone in VS Code | ||||||
|   | |||||||
| @@ -85,10 +85,55 @@ | |||||||
| 						</form> | 						</form> | ||||||
| 					{{end}} | 					{{end}} | ||||||
| 					{{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} | 					{{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} | ||||||
| 						<div class="ui labeled button{{if not $.CanSignedUserFork}} tooltip disabled{{end}}"{{if and (not $.CanSignedUserFork) $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_from_self"}}" {{else if not $.IsSigned}} data-content="{{$.i18n.Tr "repo.fork_guest_user"}}"{{end}} data-position="top center" tabindex="0"> | 						<div class="ui labeled button | ||||||
| 							<a class="ui compact small basic button"{{if $.CanSignedUserFork}} href="{{AppSubUrl}}/repo/fork/{{.ID}}"{{end}}> | 							{{if or (not $.IsSigned) (and (not $.CanSignedUserFork) (eq (len $.UserAndOrgForks) 0))}} | ||||||
|  | 								tooltip disabled | ||||||
|  | 							{{end}}" | ||||||
|  | 							{{if not $.IsSigned}} | ||||||
|  | 								data-content="{{$.i18n.Tr "repo.fork_guest_user"}}" | ||||||
|  | 							{{else if and (not $.CanSignedUserFork) (eq (len $.UserAndOrgForks) 0)}} | ||||||
|  | 								data-content="{{$.i18n.Tr "repo.fork_from_self"}}" | ||||||
|  | 							{{end}} | ||||||
|  | 						data-position="top center" data-variation="tiny" tabindex="0"> | ||||||
|  | 							<a class="ui compact{{if $.ShowForkModal}} show-modal{{end}} small basic button" | ||||||
|  | 								{{if not $.CanSignedUserFork}} | ||||||
|  | 									{{if gt (len $.UserAndOrgForks) 1}} | ||||||
|  | 										data-modal="#fork-repo-modal" | ||||||
|  | 									{{else if eq (len $.UserAndOrgForks) 1}} | ||||||
|  | 										href="{{AppSubUrl}}/{{(index $.UserAndOrgForks 0).FullName}}" | ||||||
|  | 									{{/*else is not required here, because the button shouldn't link to any site if you can't create a fork*/}} | ||||||
|  | 									{{end}} | ||||||
|  | 								{{else if eq (len $.UserAndOrgForks) 0}} | ||||||
|  | 									href="{{AppSubUrl}}/repo/fork/{{.ID}}" | ||||||
|  | 								{{else}} | ||||||
|  | 									data-modal="#fork-repo-modal" | ||||||
|  | 								{{end}} | ||||||
|  | 							> | ||||||
| 								{{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} | 								{{svg "octicon-repo-forked"}}{{$.i18n.Tr "repo.fork"}} | ||||||
| 							</a> | 							</a> | ||||||
|  | 							<div class="ui small modal" id="fork-repo-modal"> | ||||||
|  | 								{{svg "octicon-x" 16 "close inside"}} | ||||||
|  | 								<div class="header"> | ||||||
|  | 									{{$.i18n.Tr "repo.already_forked" .Name}} | ||||||
|  | 								</div> | ||||||
|  | 								<div class="content tl"> | ||||||
|  | 									<div class="ui list"> | ||||||
|  | 										{{range $.UserAndOrgForks}} | ||||||
|  | 											<div class="ui item py-3"> | ||||||
|  | 												<a href="{{.Link}}"> | ||||||
|  | 													{{svg "octicon-repo-forked" 16 "mr-3"}}{{.FullName}} | ||||||
|  | 												</a> | ||||||
|  | 											</div> | ||||||
|  | 										{{end}} | ||||||
|  | 									</div> | ||||||
|  | 									{{if $.CanSignedUserFork}} | ||||||
|  | 									<div class="ui divider"></div> | ||||||
|  | 									<a href="{{AppSubUrl}}/repo/fork/{{.ID}}"> | ||||||
|  | 										{{$.i18n.Tr "repo.fork_to_different_account"}} | ||||||
|  | 									</a> | ||||||
|  | 									{{end}} | ||||||
|  | 								</div> | ||||||
|  | 							</div> | ||||||
| 							<a class="ui basic label" href="{{.Link}}/forks"> | 							<a class="ui basic label" href="{{.Link}}/forks"> | ||||||
| 								{{CountFmt .NumForks}} | 								{{CountFmt .NumForks}} | ||||||
| 							</a> | 							</a> | ||||||
|   | |||||||
| @@ -2746,7 +2746,8 @@ | |||||||
| #delete-repo-modal, | #delete-repo-modal, | ||||||
| #delete-wiki-modal, | #delete-wiki-modal, | ||||||
| #convert-fork-repo-modal, | #convert-fork-repo-modal, | ||||||
| #convert-mirror-repo-modal { | #convert-mirror-repo-modal, | ||||||
|  | #fork-repo-modal { | ||||||
|   .ui.message { |   .ui.message { | ||||||
|     width: 100% !important; |     width: 100% !important; | ||||||
|   } |   } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 qwerty287
					qwerty287