* Implementation of all repositories of a user from user->settings * Update message when no repository found * Update according to comments * Change UI to have a better look * improved user repositories UItags/v1.21.12.1
@@ -308,6 +308,7 @@ ssh_gpg_keys = SSH / GPG Keys | |||||
social = Social Accounts | social = Social Accounts | ||||
applications = Applications | applications = Applications | ||||
orgs = Organizations | orgs = Organizations | ||||
repos = Repositories | |||||
delete = Delete Account | delete = Delete Account | ||||
twofa = Two-Factor Authentication | twofa = Two-Factor Authentication | ||||
account_link = External Accounts | account_link = External Accounts | ||||
@@ -446,6 +447,7 @@ remove_account_link_desc = Removing this linked account will revoke all related | |||||
remove_account_link_success = Account link has been removed successfully! | remove_account_link_success = Account link has been removed successfully! | ||||
orgs_none = You are not a member of any organizations. | orgs_none = You are not a member of any organizations. | ||||
repos_none = You do not own any repositories | |||||
delete_account = Delete Your Account | delete_account = Delete Your Account | ||||
delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone! | delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone! | ||||
@@ -2877,6 +2877,9 @@ footer .ui.language .menu { | |||||
padding-top: 15px; | padding-top: 15px; | ||||
padding-bottom: 5px; | padding-bottom: 5px; | ||||
} | } | ||||
.user.settings .iconFloat { | |||||
float: left; | |||||
} | |||||
.dashboard { | .dashboard { | ||||
padding-top: 15px; | padding-top: 15px; | ||||
padding-bottom: 80px; | padding-bottom: 80px; | ||||
@@ -101,4 +101,9 @@ | |||||
padding-top: 15px; | padding-top: 15px; | ||||
padding-bottom: 5px; | padding-bottom: 5px; | ||||
} | } | ||||
&.settings { | |||||
.iconFloat { | |||||
float: left; | |||||
} | |||||
} | |||||
} | } |
@@ -237,6 +237,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Route("/delete", "GET,POST", user.SettingsDelete) | m.Route("/delete", "GET,POST", user.SettingsDelete) | ||||
m.Combo("/account_link").Get(user.SettingsAccountLinks).Post(user.SettingsDeleteAccountLink) | m.Combo("/account_link").Get(user.SettingsAccountLinks).Post(user.SettingsDeleteAccountLink) | ||||
m.Get("/organization", user.SettingsOrganization) | m.Get("/organization", user.SettingsOrganization) | ||||
m.Get("/repos", user.SettingsRepos) | |||||
m.Group("/two_factor", func() { | m.Group("/two_factor", func() { | ||||
m.Get("", user.SettingsTwoFactor) | m.Get("", user.SettingsTwoFactor) | ||||
m.Post("/regenerate_scratch", user.SettingsTwoFactorRegenerateScratch) | m.Post("/regenerate_scratch", user.SettingsTwoFactorRegenerateScratch) | ||||
@@ -39,6 +39,7 @@ const ( | |||||
tplSettingsTwofaEnroll base.TplName = "user/settings/twofa_enroll" | tplSettingsTwofaEnroll base.TplName = "user/settings/twofa_enroll" | ||||
tplSettingsAccountLink base.TplName = "user/settings/account_link" | tplSettingsAccountLink base.TplName = "user/settings/account_link" | ||||
tplSettingsOrganization base.TplName = "user/settings/organization" | tplSettingsOrganization base.TplName = "user/settings/organization" | ||||
tplSettingsRepositories base.TplName = "user/settings/repos" | |||||
tplSettingsDelete base.TplName = "user/settings/delete" | tplSettingsDelete base.TplName = "user/settings/delete" | ||||
tplSecurity base.TplName = "user/security" | tplSecurity base.TplName = "user/security" | ||||
) | ) | ||||
@@ -785,3 +786,37 @@ func SettingsOrganization(ctx *context.Context) { | |||||
ctx.Data["Orgs"] = orgs | ctx.Data["Orgs"] = orgs | ||||
ctx.HTML(200, tplSettingsOrganization) | ctx.HTML(200, tplSettingsOrganization) | ||||
} | } | ||||
// SettingsRepos display a list of all repositories of the user | |||||
func SettingsRepos(ctx *context.Context) { | |||||
ctx.Data["Title"] = ctx.Tr("settings") | |||||
ctx.Data["PageIsSettingsRepos"] = true | |||||
ctxUser := ctx.User | |||||
var err error | |||||
if err = ctxUser.GetRepositories(1, setting.UI.User.RepoPagingNum); err != nil { | |||||
ctx.Handle(500, "GetRepositories", err) | |||||
return | |||||
} | |||||
repos := ctxUser.Repos | |||||
for i := range repos { | |||||
if repos[i].IsFork { | |||||
err := repos[i].GetBaseRepo() | |||||
if err != nil { | |||||
ctx.Handle(500, "GetBaseRepo", err) | |||||
return | |||||
} | |||||
err = repos[i].BaseRepo.GetOwner() | |||||
if err != nil { | |||||
ctx.Handle(500, "GetOwner", err) | |||||
return | |||||
} | |||||
} | |||||
} | |||||
ctx.Data["Owner"] = ctxUser | |||||
ctx.Data["Repos"] = repos | |||||
ctx.HTML(200, tplSettingsRepositories) | |||||
} |
@@ -30,6 +30,8 @@ | |||||
</a> | </a> | ||||
<a class="{{if .PageIsSettingsOrganization}}active{{end}} item" href="{{AppSubUrl}}/user/settings/organization"> | <a class="{{if .PageIsSettingsOrganization}}active{{end}} item" href="{{AppSubUrl}}/user/settings/organization"> | ||||
{{.i18n.Tr "settings.organization"}} | {{.i18n.Tr "settings.organization"}} | ||||
<a class="{{if .PageIsSettingsRepos}}active{{end}} item" href="{{AppSubUrl}}/user/settings/repos"> | |||||
{{.i18n.Tr "settings.repos"}} | |||||
</a> | </a> | ||||
<a class="{{if .PageIsSettingsDelete}}active{{end}} item" href="{{AppSubUrl}}/user/settings/delete"> | <a class="{{if .PageIsSettingsDelete}}active{{end}} item" href="{{AppSubUrl}}/user/settings/delete"> | ||||
{{.i18n.Tr "settings.delete"}} | {{.i18n.Tr "settings.delete"}} | ||||
@@ -0,0 +1,53 @@ | |||||
{{template "base/head" .}} | |||||
<div class="user settings"> | |||||
{{template "user/settings/navbar" .}} | |||||
<div class="ui container"> | |||||
{{template "base/alert" .}} | |||||
<h4 class="ui top attached header"> | |||||
{{.i18n.Tr "settings.repos"}} | |||||
</h4> | |||||
<div class="ui attached segment"> | |||||
{{if .Repos}} | |||||
<div class="ui middle aligned divided list"> | |||||
{{range .Repos}} | |||||
<div class="item"> | |||||
<div class="content"> | |||||
{{if .IsPrivate}} | |||||
<span class="text gold iconFloat"><i class="octicon octicon-lock"></i></span> | |||||
{{else if .IsFork}} | |||||
<span class="iconFloat"><i class="octicon octicon-repo-forked"></i></span> | |||||
{{else if .IsMirror}} | |||||
<span class="iconFloat"><i class="octicon octicon-repo-clone"></i></span> | |||||
{{else}} | |||||
<span class="iconFloat"><i class="octicon octicon-repo"></i></span> | |||||
{{end}} | |||||
<a class="name" href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{$.Owner.Name}}/{{.Name}}</a> | |||||
<span>{{SizeFmt .Size}}</span> | |||||
{{if .IsFork}} | |||||
{{$.i18n.Tr "repo.forked_from"}} | |||||
<span><a href="{{AppSubUrl}}/{{.BaseRepo.Owner.Name}}/{{.BaseRepo.Name}}">{{.BaseRepo.Owner.Name}}/{{.BaseRepo.Name}}</a></span> | |||||
{{end}} | |||||
</div> | |||||
</div> | |||||
{{end}} | |||||
</div> | |||||
{{else}} | |||||
<div class="item"> | |||||
{{.i18n.Tr "settings.repos_none"}} | |||||
</div> | |||||
{{end}} | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="ui small basic delete modal"> | |||||
<div class="ui icon header"> | |||||
<i class="trash icon"></i> | |||||
{{.i18n.Tr "settings.remove_account_link"}} | |||||
</div> | |||||
<div class="content"> | |||||
<p>{{.i18n.Tr "settings.remove_account_link_desc"}}</p> | |||||
</div> | |||||
{{template "base/delete_modal_actions" .}} | |||||
</div> | |||||
{{template "base/footer" .}} |