diff options
author | Unknwon <joe2010xtmf@163.com> | 2014-08-29 20:50:43 +0800 |
---|---|---|
committer | Unknwon <joe2010xtmf@163.com> | 2014-08-29 20:50:43 +0800 |
commit | d2aff9a46a20bfd5345fec8a88d2638997a833c0 (patch) | |
tree | f655789858cc809b080bcd49ee75824384e550a5 | |
parent | 904bf1a50b021798344f8e124439bdd6a4db9cfc (diff) | |
download | gitea-d2aff9a46a20bfd5345fec8a88d2638997a833c0.tar.gz gitea-d2aff9a46a20bfd5345fec8a88d2638997a833c0.zip |
Continue working on new admin pages
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | README_ZH.md | 2 | ||||
-rw-r--r-- | cmd/web.go | 44 | ||||
-rw-r--r-- | conf/locale/locale_en-US.ini | 50 | ||||
-rw-r--r-- | conf/locale/locale_zh-CN.ini | 54 | ||||
-rw-r--r-- | gogs.go | 2 | ||||
-rw-r--r-- | models/org.go | 7 | ||||
-rw-r--r-- | models/user.go | 4 | ||||
-rw-r--r-- | public/ng/css/gogs.css | 6 | ||||
-rw-r--r-- | public/ng/js/gogs.js | 29 | ||||
-rw-r--r-- | public/ng/less/gogs/settings.less | 1 | ||||
-rw-r--r-- | routers/admin/admin.go | 44 | ||||
-rw-r--r-- | routers/admin/auths.go (renamed from routers/admin/auth.go) | 78 | ||||
-rw-r--r-- | routers/admin/orgs.go | 32 | ||||
-rw-r--r-- | routers/admin/repos.go | 32 | ||||
-rw-r--r-- | routers/admin/users.go | 20 | ||||
-rw-r--r-- | templates/.VERSION | 2 | ||||
-rw-r--r-- | templates/admin/auth/edit.tmpl | 260 | ||||
-rw-r--r-- | templates/admin/auth/list.tmpl | 59 | ||||
-rw-r--r-- | templates/admin/auth/new.tmpl | 266 | ||||
-rw-r--r-- | templates/admin/auths.tmpl | 43 | ||||
-rw-r--r-- | templates/admin/nav.tmpl | 2 | ||||
-rw-r--r-- | templates/admin/org/list.tmpl | 58 | ||||
-rw-r--r-- | templates/admin/repo/list.tmpl | 60 | ||||
-rw-r--r-- | templates/admin/repos.tmpl | 48 | ||||
-rw-r--r-- | templates/admin/user/list.tmpl | 3 | ||||
-rw-r--r-- | templates/admin/user/new.tmpl | 2 |
27 files changed, 670 insertions, 540 deletions
@@ -5,7 +5,7 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. ![Demo](http://gowalker.org/public/gogs_demo.gif) -##### Current version: 0.4.7 Beta +##### Current version: 0.4.8 Beta ### NOTICES diff --git a/README_ZH.md b/README_ZH.md index fd78922ab7..3bf67f38d8 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。 ![Demo](http://gowalker.org/public/gogs_demo.gif) -##### 当前版本:0.4.7 Beta +##### 当前版本:0.4.8 Beta ## 开发目的 diff --git a/cmd/web.go b/cmd/web.go index de1aa03cc2..2bc9be457a 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -192,28 +192,36 @@ func runWeb(*cli.Context) { adminReq := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true, AdminRequire: true}) - m.Get("/admin", adminReq, admin.Dashboard) m.Group("/admin", func(r *macaron.Router) { - r.Get("/users", admin.Users) - r.Get("/repos", admin.Repositories) - r.Get("/auths", admin.Auths) + m.Get("", adminReq, admin.Dashboard) r.Get("/config", admin.Config) r.Get("/monitor", admin.Monitor) - }, adminReq) - m.Group("/admin/users", func(r *macaron.Router) { - r.Get("/new", admin.NewUser) - r.Post("/new", bindIgnErr(auth.RegisterForm{}), admin.NewUserPost) - r.Get("/:userid", admin.EditUser) - r.Post("/:userid", bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost) - r.Post("/:userid/delete", admin.DeleteUser) - }, adminReq) - m.Group("/admin/auths", func(r *macaron.Router) { - r.Get("/new", admin.NewAuthSource) - r.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) - r.Get("/:authid", admin.EditAuthSource) - r.Post("/:authid", bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost) - r.Get("/:authid/delete", admin.DeleteAuthSource) + m.Group("/users", func(r *macaron.Router) { + r.Get("", admin.Users) + r.Get("/new", admin.NewUser) + r.Post("/new", bindIgnErr(auth.RegisterForm{}), admin.NewUserPost) + r.Get("/:userid", admin.EditUser) + r.Post("/:userid", bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost) + r.Post("/:userid/delete", admin.DeleteUser) + }) + + m.Group("/orgs", func(r *macaron.Router) { + r.Get("", admin.Organizations) + }) + + m.Group("/repos", func(r *macaron.Router) { + r.Get("", admin.Repositories) + }) + + m.Group("/auths", func(r *macaron.Router) { + r.Get("", admin.Authentications) + r.Get("/new", admin.NewAuthSource) + r.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) + r.Get("/:authid", admin.EditAuthSource) + r.Post("/:authid", bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost) + r.Post("/:authid/delete", admin.DeleteAuthSource) + }) }, adminReq) m.Get("/:username", ignSignIn, user.Profile) diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 106e765cb8..8fbf42ca8b 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -80,6 +80,7 @@ SSHTitle = SSH key name HttpsUrl = HTTPS URL PayloadUrl = Payload URL TeamName = Team name +AuthName = Authorization name require_error = ` cannot be empty.` alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.` @@ -115,6 +116,8 @@ auth_failed = Authentication failed: %v still_own_repo = Your account still have ownership of repository, you have to delete or transfer them first. org_still_own_repo = This organization still have ownership of repository, you have to delete or transfer them first. +still_own_user = This authentication still has used by some users, you should move them and then delete again. + [settings] profile = Profile password = Password @@ -300,6 +303,8 @@ repositories = Repositories authentication = Authentications config = Configuration monitor = Monitoring +prev = Prev. +next = Next dashboard.statistic = Statistic dashboard.operations = Operations @@ -343,15 +348,14 @@ dashboard.gc_times = GC Times users.user_manage_panel = User Manage Panel users.new_account = Create New Account users.name = Name -users.email = E-mail users.activated = Activated users.admin = Admin users.repos = Repos users.created = Created users.edit = Edit -users.auth_source = Auth Source +users.auth_source = Authorization Source users.local = Local -users.auth_login_name = Auth Login Name +users.auth_login_name = Authorization Login Name users.update_profile_success = Account profile has been successfully updated. users.edit_account = Edit Account users.is_activated = This account is activated @@ -360,6 +364,46 @@ users.update_profile = Update Account Profile users.delete_account = Delete This Account users.still_own_repo = This account still have ownership of repository, you have to delete or transfer them first. +orgs.org_manage_panel = Organization Manage Panel +orgs.name = Name +orgs.teams = Teams +orgs.members = Members + +repos.repo_manage_panel = Repository Manage Panel +repos.owner = Owner +repos.name = Name +repos.private = Private +repos.watches = Watches +repos.stars = Stars +repos.issues = Issues + +auths.auth_manage_panel = Authorization Manage Panel +auths.new = Add New Authorization Source +auths.name = Name +auths.type = Type +auths.enabled = Enabled +auths.updated = Updated +auths.auth_type = Authorization Type +auths.auth_name = Authorization Name +auths.domain = Domain +auths.host = Host +auths.port = Port +auths.base_dn = Base DN +auths.attributes = Search Attributes +auths.filter = Search Filter +auths.ms_ad_sa = Ms Ad SA +auths.smtp_auth = SMTP Authorization Type +auths.smtphost = SMTP Host +auths.smtpport = SMTP Port +auths.enable_tls = Enable TLS Encryption +auths.enable_auto_register = Enable Auto Registration +auths.tips = Tips +auths.edit = Edit Authorization Setting +auths.activated = This authentication has activated +auths.update_success = Authorization setting has been successfully updated. +auths.update = Update Authorization Setting +auths.delete = Delete This Authorization + [action] create_repo = created repository <a href="/%s">%s</a> commit_repo = pushed to <a href="/%s/src/%s">%s</a> at <a href="/%s">%s</a> diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index 2254f370ba..310bc8c968 100644 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -80,6 +80,7 @@ SSHTitle = SSH 密钥名称 HttpsUrl = HTTPS URL 地址 PayloadUrl = 推送地址 TeamName = 团队名称 +AuthName = 认证名称 require_error = 不能为空。 alpha_dash_error = 必须为英文字母、阿拉伯数字或横线(-_)。 @@ -115,6 +116,8 @@ auth_failed = 授权验证失败:%v still_own_repo = 您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作! org_still_own_repo = 该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作! +still_own_user = 该授权认证依旧被部分用户使用,请先删除该部分用户后再试! + [settings] profile = 个人信息 password = 修改密码 @@ -129,7 +132,7 @@ full_name = 自定义名称 website = 个人网站 location = 所在地区 update_profile = 更新信息 -update_profile_success = 您的个人信息已经更新成功! +update_profile_success = 您的个人信息更新成功! change_password = 修改密码 old_password = 当前密码 @@ -284,7 +287,7 @@ teams.members = 团队成员 teams.update_settings = 更新团队设置 teams.delete_team = 删除当前团队 teams.add_team_member = 添加团队成员 -teams.delete_team_success = 指定团队已经被成功删除! +teams.delete_team_success = 指定团队删除成功! teams.read_permission_desc = 该团队拥有对所属仓库的 <strong>读取</strong> 权限,团队成员可以进行查看和克隆等只读操作。 teams.write_permission_desc = 该团队拥有对所属仓库的 <strong>读取</strong> 和 <strong>写入</strong> 的权限。 teams.admin_permission_desc = 该团队拥有一定的 <strong>管理</strong> 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。 @@ -297,9 +300,11 @@ dashboard = 控制面板 users = 用户管理 organizations = 组织管理 repositories = 仓库管理 -authentication = 权限认证管理 +authentication = 授权认证管理 config = 应用配置管理 monitor = 应用监控面板 +prev = 上一页 +next = 下一页 dashboard.statistic = 应用统计数据 dashboard.operations = 管理员操作 @@ -343,7 +348,6 @@ dashboard.gc_times = GC 执行次数 users.user_manage_panel = 用户管理面板 users.new_account = 创建新的帐户 users.name = 用户名 -users.email = 邮箱 users.activated = 已激活 users.admin = 管理员 users.repos = 仓库数 @@ -352,13 +356,53 @@ users.edit = 编辑 users.auth_source = 认证源 users.local = 本地 users.auth_login_name = 认证登录名 -users.update_profile_success = 该用户信息已经更新成功! +users.update_profile_success = 该用户信息更新成功! users.edit_account = 编辑用户信息 users.is_activated = 该用户已被激活 users.is_admin = 该用户具有管理员权限 users.update_profile = 更新用户信息 users.delete_account = 删除该用户 +orgs.org_manage_panel = 组织管理面板 +orgs.name = 组织名称 +orgs.teams = 团队数 +orgs.members = 成员数 + +repos.repo_manage_panel = 仓库管理界面 +repos.owner = 所有者 +repos.name = 仓库名称 +repos.private = 私有库 +repos.watches = 关注数 +repos.stars = 点赞数 +repos.issues = 工单数 + +auths.auth_manage_panel = 授权认证管理面板 +auths.new = 添加新的认证源 +auths.name = 认证名称 +auths.type = 认证类型 +auths.enabled = 已启用 +auths.updated = 最后更新时间 +auths.auth_type = 授权类型 +auths.auth_name = 授权名称 +auths.domain = 域名 +auths.host = 主机地址 +auths.port = 主机端口 +auths.base_dn = Base DN +auths.attributes = Search Attributes +auths.filter = Search Filter +auths.ms_ad_sa = Ms Ad SA +auths.smtp_auth = SMTP 授权类型 +auths.smtphost = SMTP 主机地址 +auths.smtpport = SMTP 主机端口 +auths.enable_tls = 启用 TLS 加密 +auths.enable_auto_register = 允许授权用户自动注册 +auths.tips = 帮助提示 +auths.edit = 修改授权认证设置 +auths.activated = 该授权认证已经启用 +auths.update_success = 授权认证设置更新成功! +auths.update = 更新授权认证信息 +auths.delete = 删除该授权认证 + [action] create_repo = 创建了仓库 <a href="/%s">%s</a> commit_repo = 推送了 <a href="/%s/src/%s">%s</a> 分支的代码到 <a href="/%s">%s</a> @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.4.7.0829 Alpha" +const APP_VER = "0.4.8.0829 Alpha" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/org.go b/models/org.go index 18ed68e6f4..ce50670582 100644 --- a/models/org.go +++ b/models/org.go @@ -165,6 +165,13 @@ func CountOrganizations() int64 { return count } +// GetOrganizations returns given number of organizations with offset. +func GetOrganizations(num, offset int) ([]*User, error) { + orgs := make([]*User, 0, num) + err := x.Limit(num, offset).Where("type=1").Asc("id").Find(&orgs) + return orgs, err +} + // TODO: need some kind of mechanism to record failure. // DeleteOrganization completely and permanently deletes everything of organization. func DeleteOrganization(org *User) (err error) { diff --git a/models/user.go b/models/user.go index 661fb1c220..96881ea355 100644 --- a/models/user.go +++ b/models/user.go @@ -248,8 +248,8 @@ func CountUsers() int64 { } // GetUsers returns given number of user objects with offset. -func GetUsers(num, offset int) ([]User, error) { - users := make([]User, 0, num) +func GetUsers(num, offset int) ([]*User, error) { + users := make([]*User, 0, num) err := x.Limit(num, offset).Where("type=0").Asc("id").Find(&users) return users, err } diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index 34d71028e7..d81d6f3149 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -1400,31 +1400,37 @@ The register and sign-in page style .setting-content { margin-left: 32px; } +#auth-setting-form, #org-setting-form, #repo-setting-form, #user-profile-form { background-color: #FFF; padding: 30px 0; } +#auth-setting-form textarea, #org-setting-form textarea, #repo-setting-form textarea, #user-profile-form textarea { margin-left: 4px; height: 100px; } +#auth-setting-form label, #org-setting-form label, #repo-setting-form label, #user-profile-form label, +#auth-setting-form .form-label, #org-setting-form .form-label, #repo-setting-form .form-label, #user-profile-form .form-label { width: 240px; } +#auth-setting-form .ipt, #org-setting-form .ipt, #repo-setting-form .ipt, #user-profile-form .ipt { width: 360px; } +#auth-setting-form .field, #org-setting-form .field, #repo-setting-form .field, #user-profile-form .field { diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js index 69ac380fd9..9fe0655528 100644 --- a/public/ng/js/gogs.js +++ b/public/ng/js/gogs.js @@ -429,13 +429,13 @@ function initTeamRepositoriesList() { function initAdmin() { // Create account. - $('#login-type').on("change",function(){ + $('#login-type').on("change", function () { var v = $(this).val(); - if(v.indexOf("0-")+1){ + if (v.indexOf("0-") + 1) { $('.auth-name').toggleHide(); - $(".pwd").find("input").attr("required","required") + $(".pwd").find("input").attr("required", "required") .end().toggleShow(); - }else{ + } else { $(".pwd").find("input").removeAttr("required") .end().toggleHide(); $('.auth-name').toggleShow(); @@ -450,6 +450,27 @@ function initAdmin() { var $form = $('user-profile-form'); $form.attr('action', $form.data('delete-url')); }); + // Create authorization. + $('#auth-type').on("change", function () { + var v = $(this).val(); + if (v == 2) { + $('.ldap').toggleShow(); + $('.smtp').toggleHide(); + } + if (v == 3) { + $('.smtp').toggleShow(); + $('.ldap').toggleHide(); + } + }); + // Delete authorization. + $('#auth-delete').click(function (e) { + if (!confirm('This authorization is going to be deleted, do you want to continue?')) { + e.preventDefault(); + return true; + } + var $form = $('auth-setting-form'); + $form.attr('action', $form.data('delete-url')); + }); } $(document).ready(function () { diff --git a/public/ng/less/gogs/settings.less b/public/ng/less/gogs/settings.less index cc922e3ffe..b246a947ec 100644 --- a/public/ng/less/gogs/settings.less +++ b/public/ng/less/gogs/settings.less @@ -31,6 +31,7 @@ margin-left: 32px; } +#auth-setting-form, #org-setting-form, #repo-setting-form, #user-profile-form { diff --git a/routers/admin/admin.go b/routers/admin/admin.go index 75dbf2712b..b2c932c98f 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -23,8 +23,6 @@ import ( const ( DASHBOARD base.TplName = "admin/dashboard" - REPOS base.TplName = "admin/repos" - AUTHS base.TplName = "admin/auths" CONFIG base.TplName = "admin/config" MONITOR_PROCESS base.TplName = "admin/monitor/process" MONITOR_CRON base.TplName = "admin/monitor/cron" @@ -156,48 +154,6 @@ func Dashboard(ctx *middleware.Context) { ctx.HTML(200, DASHBOARD) } -func Repositories(ctx *middleware.Context) { - ctx.Data["Title"] = "Repository Management" - ctx.Data["PageIsRepos"] = true - - p := com.StrTo(ctx.Query("p")).MustInt() - if p < 1 { - p = 1 - } - pageNum := 50 - count := models.CountRepositories() - curCount := int64((p-1)*pageNum + pageNum) - if curCount > count { - p = int(count) / pageNum - } else if count > curCount { - ctx.Data["NextPageNum"] = p + 1 - } - if p > 1 { - ctx.Data["LastPageNum"] = p - 1 - } - - var err error - ctx.Data["Repos"], err = models.GetRepositoriesWithUsers(pageNum, (p-1)*pageNum) - if err != nil { - ctx.Handle(500, "admin.Repositories", err) - return - } - ctx.HTML(200, REPOS) -} - -func Auths(ctx *middleware.Context) { - ctx.Data["Title"] = "Auth Sources" - ctx.Data["PageIsAuths"] = true - - var err error - ctx.Data["Sources"], err = models.GetAuths() - if err != nil { - ctx.Handle(500, "admin.Auths", err) - return - } - ctx.HTML(200, AUTHS) -} - func Config(ctx *middleware.Context) { ctx.Data["Title"] = "Server Configuration" ctx.Data["PageIsConfig"] = true diff --git a/routers/admin/auth.go b/routers/admin/auths.go index 44af962751..6fbeab354e 100644 --- a/routers/admin/auth.go +++ b/routers/admin/auths.go @@ -5,8 +5,6 @@ package admin import ( - "strings" - "github.com/Unknwon/com" "github.com/go-xorm/core" @@ -19,21 +17,38 @@ import ( ) const ( + AUTHS base.TplName = "admin/auth/list" AUTH_NEW base.TplName = "admin/auth/new" AUTH_EDIT base.TplName = "admin/auth/edit" ) +func Authentications(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("admin.authentication") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminAuthentications"] = true + + var err error + ctx.Data["Sources"], err = models.GetAuths() + if err != nil { + ctx.Handle(500, "GetAuths", err) + return + } + ctx.HTML(200, AUTHS) +} + func NewAuthSource(ctx *middleware.Context) { - ctx.Data["Title"] = "New Authentication" - ctx.Data["PageIsAuths"] = true + ctx.Data["Title"] = ctx.Tr("admin.auths.new") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminAuthentications"] = true ctx.Data["LoginTypes"] = models.LoginTypes ctx.Data["SMTPAuths"] = models.SMTPAuths ctx.HTML(200, AUTH_NEW) } func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { - ctx.Data["Title"] = "New Authentication" - ctx.Data["PageIsAuths"] = true + ctx.Data["Title"] = ctx.Tr("admin.auths.new") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminAuthentications"] = true ctx.Data["LoginTypes"] = models.LoginTypes ctx.Data["SMTPAuths"] = models.SMTPAuths @@ -79,30 +94,29 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { } if err := models.CreateSource(source); err != nil { - ctx.Handle(500, "admin.auths.NewAuth(CreateSource)", err) + ctx.Handle(500, "CreateSource", err) return } - log.Trace("%s Authentication created by admin(%s): %s", ctx.Req.RequestURI, - ctx.User.LowerName, strings.ToLower(form.AuthName)) - + log.Trace("Authentication created by admin(%s): %s", ctx.User.Name, form.AuthName) ctx.Redirect("/admin/auths") } func EditAuthSource(ctx *middleware.Context) { - ctx.Data["Title"] = "Edit Authentication" - ctx.Data["PageIsAuths"] = true + ctx.Data["Title"] = ctx.Tr("admin.auths.edit") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminAuthentications"] = true ctx.Data["LoginTypes"] = models.LoginTypes ctx.Data["SMTPAuths"] = models.SMTPAuths - id, err := com.StrTo(ctx.Params(":authid")).Int64() - if err != nil { - ctx.Handle(404, "admin.auths.EditAuthSource", err) + id := com.StrTo(ctx.Params(":authid")).MustInt64() + if id == 0 { + ctx.Handle(404, "EditAuthSource", nil) return } u, err := models.GetLoginSourceById(id) if err != nil { - ctx.Handle(500, "admin.user.EditUser(GetLoginSourceById)", err) + ctx.Handle(500, "GetLoginSourceById", err) return } ctx.Data["Source"] = u @@ -110,7 +124,9 @@ func EditAuthSource(ctx *middleware.Context) { } func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { - ctx.Data["Title"] = "Edit Authentication" + ctx.Data["Title"] = ctx.Tr("admin.auths.edit") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminAuthentications"] = true ctx.Data["PageIsAuths"] = true ctx.Data["LoginTypes"] = models.LoginTypes ctx.Data["SMTPAuths"] = models.SMTPAuths @@ -158,44 +174,38 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { } if err := models.UpdateSource(&u); err != nil { - ctx.Handle(500, "admin.auths.EditAuth(UpdateSource)", err) + ctx.Handle(500, "UpdateSource", err) return } - log.Trace("%s Authentication changed by admin(%s): %s", ctx.Req.RequestURI, - ctx.User.LowerName, form.AuthName) - - ctx.Redirect("/admin/auths") + log.Trace("Authentication changed by admin(%s): %s", ctx.User.Name, form.AuthName) + ctx.Flash.Success(ctx.Tr("admin.auths.update_success")) + ctx.Redirect("/admin/auths/" + ctx.Params(":authid")) } func DeleteAuthSource(ctx *middleware.Context) { - ctx.Data["Title"] = "Delete Authentication" - ctx.Data["PageIsAuths"] = true - - id, err := com.StrTo(ctx.Params(":authid")).Int64() - if err != nil { - ctx.Handle(404, "admin.auths.DeleteAuth", err) + id := com.StrTo(ctx.Params(":authid")).MustInt64() + if id == 0 { + ctx.Handle(404, "DeleteAuthSource", nil) return } a, err := models.GetLoginSourceById(id) if err != nil { - ctx.Handle(500, "admin.auths.DeleteAuth(GetLoginSourceById)", err) + ctx.Handle(500, "GetLoginSourceById", err) return } if err = models.DelLoginSource(a); err != nil { switch err { case models.ErrAuthenticationUserUsed: - ctx.Flash.Error("This authentication still has used by some users, you should move them and then delete again.") + ctx.Flash.Error("form.still_own_user") ctx.Redirect("/admin/auths/" + ctx.Params(":authid")) default: - ctx.Handle(500, "admin.auths.DeleteAuth(DelLoginSource)", err) + ctx.Handle(500, "DelLoginSource", err) } return } - log.Trace("%s Authentication deleted by admin(%s): %s", ctx.Req.RequestURI, - ctx.User.LowerName, ctx.User.LowerName) - + log.Trace("Authentication deleted by admin(%s): %s", ctx.User.Name, a.Name) ctx.Redirect("/admin/auths") } diff --git a/routers/admin/orgs.go b/routers/admin/orgs.go new file mode 100644 index 0000000000..e813e47420 --- /dev/null +++ b/routers/admin/orgs.go @@ -0,0 +1,32 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package admin + +import ( + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/middleware" +) + +const ( + ORGS base.TplName = "admin/org/list" +) + +func Organizations(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("admin.orgs") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminOrganizations"] = true + + pageNum := 50 + p := pagination(ctx, models.CountOrganizations(), pageNum) + + var err error + ctx.Data["Orgs"], err = models.GetOrganizations(pageNum, (p-1)*pageNum) + if err != nil { + ctx.Handle(500, "GetUsers", err) + return + } + ctx.HTML(200, ORGS) +} diff --git a/routers/admin/repos.go b/routers/admin/repos.go new file mode 100644 index 0000000000..6d9169f94d --- /dev/null +++ b/routers/admin/repos.go @@ -0,0 +1,32 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package admin + +import ( + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/middleware" +) + +const ( + REPOS base.TplName = "admin/repo/list" +) + +func Repositories(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("admin.repositories") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminRepositories"] = true + + pageNum := 50 + p := pagination(ctx, models.CountRepositories(), pageNum) + + var err error + ctx.Data["Repos"], err = models.GetRepositoriesWithUsers(pageNum, (p-1)*pageNum) + if err != nil { + ctx.Handle(500, "GetRepositoriesWithUsers", err) + return + } + ctx.HTML(200, REPOS) +} diff --git a/routers/admin/users.go b/routers/admin/users.go index 5f98a64be6..3f14e48f04 100644 --- a/routers/admin/users.go +++ b/routers/admin/users.go @@ -22,17 +22,11 @@ const ( USER_EDIT base.TplName = "admin/user/edit" ) -func Users(ctx *middleware.Context) { - ctx.Data["Title"] = ctx.Tr("admin.users") - ctx.Data["PageIsAdmin"] = true - ctx.Data["PageIsAdminUsers"] = true - +func pagination(ctx *middleware.Context, count int64, pageNum int) int { p := com.StrTo(ctx.Query("p")).MustInt() if p < 1 { p = 1 } - pageNum := 50 - count := models.CountUsers() curCount := int64((p-1)*pageNum + pageNum) if curCount > count { p = int(count) / pageNum @@ -42,11 +36,21 @@ func Users(ctx *middleware.Context) { if p > 1 { ctx.Data["LastPageNum"] = p - 1 } + return p +} + +func Users(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("admin.users") + ctx.Data["PageIsAdmin"] = true + ctx.Data["PageIsAdminUsers"] = true + + pageNum := 50 + p := pagination(ctx, models.CountUsers(), pageNum) var err error ctx.Data["Users"], err = models.GetUsers(pageNum, (p-1)*pageNum) if err != nil { - ctx.Handle(500, "admin.Users(GetUsers)", err) + ctx.Handle(500, "GetUsers", err) return } ctx.HTML(200, USERS) diff --git a/templates/.VERSION b/templates/.VERSION index 102c742960..6b8f7aafd2 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.4.7.0829 Alpha
\ No newline at end of file +0.4.8.0829 Alpha
\ No newline at end of file diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl index a2c2ddc698..400a4cebe3 100644 --- a/templates/admin/auth/edit.tmpl +++ b/templates/admin/auth/edit.tmpl @@ -1,165 +1,113 @@ -{{template "base/head" .}} -{{template "base/navbar" .}} -<div id="body" class="container" data-page="admin"> - {{template "admin/nav" .}} - <div id="admin-container" class="col-md-9"> - <div class="panel panel-default"> - <div class="panel-heading"> - Edit Authentication - </div> - - <div class="panel-body"> - <br/> - <form action="/admin/auths/{{.Source.Id}}" method="post" class="form-horizontal"> - {{.CsrfTokenHtml}} - {{template "base/alert" .}} - <input type="hidden" value="{{.Source.Id}}" name="id"/> - {{$type := .Source.Type}} - <div class="form-group"> - <label class="col-md-3 control-label">Auth Type: </label> - <input type="hidden" name="type" value="{{.Source.Type}}"/> - <label class="control-label"> - {{range $key, $val := .LoginTypes}} - {{if eq $key $type}}{{$val}}{{end}} - {{end}} - </label> - </div> - <div class="form-group {{if .Err_AuthName}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Name: </label> - <div class="col-md-7"> - <input name="name" class="form-control" placeholder="Type authentication's name" value="{{.Source.Name}}" required="required"> - </div> - </div> - - {{if eq $type 2}} - <div class="form-group {{if .Err_Domain}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Domain: </label> - <div class="col-md-7"> - <input name="domain" class="form-control" placeholder="Type domain name" value="{{.Source.LDAP.Name}}" required="required"> - </div> - </div> - - <div class="form-group {{if .Err_Host}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Host: </label> - <div class="col-md-7"> - <input name="host" class="form-control" placeholder="Type host address" value="{{.Source.LDAP.Host}}" required="required"> - </div> - </div> - - <div class="form-group {{if .Err_Port}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Port: </label> - <div class="col-md-7"> - <input name="port" class="form-control" placeholder="Type port number" value="{{.Source.LDAP.Port}}" required="required"> - </div> - </div> - - <div class="form-group {{if .Err_UseSSL}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Use SSL: </label> - <div class="col-md-7"> - <input name="usessl" class="form-control" type="checkbox" {{if .Source.LDAP.UseSSL}}checked{{end}}> - </div> - </div> - - - <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Base DN: </label> - <div class="col-md-7"> - <input name="base_dn" class="form-control" placeholder="Type base DN" value="{{.Source.LDAP.BaseDN}}" required="required"> - </div> - </div> - - <div class="form-group {{if .Err_Attributes}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Search Attributes: </label> - <div class="col-md-7"> - <input name="attributes" class="form-control" placeholder="Type search attributes" value="{{.Source.LDAP.Attributes}}"> - </div> - </div> - - <div class="form-group {{if .Err_Filter}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Search Filter: </label> - <div class="col-md-7"> - <input name="filter" class="form-control" placeholder="Type search filter" value="{{.Source.LDAP.Filter}}"> - </div> - </div> - - <div class="form-group {{if .Err_MsAdSA}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Ms Ad SA: </label> - <div class="col-md-7"> - <input name="ms_ad_sa" class="form-control" placeholder="Type Ms Ad SA" value="{{.Source.LDAP.MsAdSAFormat}}"> - </div> - </div> - {{else if eq $type 3}} - <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">SMTP Auth: </label> - <div class="col-md-7"> - <select name="smtpauth" class="form-control"> - {{$auth := .Source.SMTP.Auth}} - {{range .SMTPAuths}} - <option value="{{.}}" - {{if eq . $auth}} selected{{end}}>{{.}}</option> - {{end}} - </select> - </div> - </div> - - <div class="form-group {{if .Err_SmtpHost}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Host: </label> - <div class="col-md-7"> - <input name="smtphost" class="form-control" placeholder="Type host address" value="{{.Source.SMTP.Host}}"> - </div> - </div> - - <div class="form-group {{if .Err_SmtpPort}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Port: </label> - <div class="col-md-7"> - <input name="smtpport" class="form-control" placeholder="Type port number" value="{{.Source.SMTP.Port}}"> - </div> - </div> - {{end}} - - <div class="form-group"> - {{if eq $type 3}} - <div class="col-md-offset-3 col-md-7"> - <div class="checkbox"> - <label> - <input name="tls" type="checkbox" class="form-control" {{if .Source.SMTP.TLS}}checked{{end}}> - <strong>Enable TLS Encryption</strong> - </label> +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="admin-wrapper"> + <div id="setting-wrapper" class="main-wrapper"> + <div id="admin-setting" class="container clear"> + {{template "admin/nav" .}} + <div class="grid-4-5 left"> + <div class="setting-content"> + {{template "ng/base/alert" .}} + <div id="setting-content"> + <div class="panel panel-radius"> + <div class="panel-header"> + <strong>{{.i18n.Tr "admin.auths.edit"}}</strong> </div> - </div> - {{end}} + <form class="form form-align panel-body" id="auth-setting-form" action="/admin/auths/{{.Source.Id}}" data-delete-url="/admin/auths/{{.Source.Id}}/delete" method="post"> + {{.CsrfTokenHtml}} + <input type="hidden" value="{{.Source.Id}}" name="id"/> + {{$type := .Source.Type}} + <div class="field"> + <label>{{.i18n.Tr "admin.auths.auth_type"}}</label> + <input type="hidden" name="type" value="{{.Source.Type}}"/> + <label class="control-label"> + {{range $key, $val := .LoginTypes}} + {{if eq $key $type}}{{$val}}{{end}} + {{end}} + </label> + </div> + <div class="field"> + <label class="req" for="name">{{.i18n.Tr "admin.auths.auth_name"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_AuthName}}ipt-error{{end}}" id="name" name="name" value="{{.Source.Name}}" required /> + </div> + + {{if eq $type 2}} + <div class="field"> + <label class="req" for="domain">{{.i18n.Tr "admin.auths.domain"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Domain}}ipt-error{{end}}" id="domain" name="domain" value="{{.Source.LDAP.Name}}" required /> + </div> + <div class="field"> + <label class="req" for="host">{{.i18n.Tr "admin.auths.host"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Host}}ipt-error{{end}}" id="host" name="host" value="{{.Source.LDAP.Host}}" required /> + </div> + <div class="field"> + <label class="req" for="port">{{.i18n.Tr "admin.auths.port"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Port}}ipt-error{{end}}" id="port" name="port" value="{{.Source.LDAP.Port}}" required /> + </div> + <div class="field"> + <label class="req" for="base_dn">{{.i18n.Tr "admin.auths.base_dn"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_BaseDN}}ipt-error{{end}}" id="base_dn" name="base_dn" value="{{.Source.LDAP.BaseDN}}" /> + </div> + <div class="field"> + <label class="req" for="attributes">{{.i18n.Tr "admin.auths.attributes"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Attributes}}ipt-error{{end}}" id="attributes" name="attributes" value="{{.Source.LDAP.Attributes}}" /> + </div> + <div class="field"> + <label class="req" for="filter">{{.i18n.Tr "admin.auths.filter"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Filter}}ipt-error{{end}}" id="filter" name="filter" value="{{.Source.LDAP.Filter}}" /> + </div> + <div class="field"> + <label class="req" for="ms_ad_sa">{{.i18n.Tr "admin.auths.ms_ad_sa"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_MsAdSA}}ipt-error{{end}}" id="ms_ad_sa" name="ms_ad_sa" value="{{.Source.LDAP.MsAdSAFormat}}" /> + </div> + + {{else if eq $type 3}} + <div class="field"> + <label class="req">{{.i18n.Tr "admin.auths.smtp_auth"}}</label> + <select name="smtpauth"> + {{$auth := .Source.SMTP.Auth}} + {{range .SMTPAuths}} + <option value="{{.}}" + {{if eq . $auth}} selected{{end}}>{{.}}</option> + {{end}} + </select> + </div> + <div class="field"> + <label class="req" for="smtphost">{{.i18n.Tr "admin.auths.smtphost"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_SmtpHost}}ipt-error{{end}}" id="smtphost" name="smtphost" value="{{.Source.SMTP.Host}}" /> + </div> + <div class="field"> + <label class="req" for="smtpport">{{.i18n.Tr "admin.auths.smtpport"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_SmtpPort}}ipt-error{{end}}" id="smtpport" name="smtpport" value="{{.Source.SMTP.Port}}" /> + </div> + {{end}} - <div class="col-md-offset-3 col-md-7"> - <div class="checkbox"> - <label> + <div class="field"> + {{if eq $type 3}} + <label></label> + <input name="tls" type="checkbox" {{if .Source.SMTP.TLS}}checked{{end}}> + <strong>{{.i18n.Tr "admin.auths.enable_tls"}}</strong> + <br> + {{end}} + <label></label> <input name="allowautoregister" type="checkbox" {{if .Source.AllowAutoRegister}}checked{{end}}> - <strong>Enable Auto Registration</strong> - </label> - </div> - </div> - - <div class="col-md-7 col-md-offset-3"> - <div class="checkbox"> - <label> - <input type="checkbox" name="is_actived" {{if .Source.IsActived}}checked{{end}}> - <strong>This authentication has activated.</strong> - </label> - </div> - </div> - </div> - - <hr/> - - <div class="form-group"> - <div class="col-md-offset-3 col-md-6"> - <button type="submit" class="btn btn-lg btn-primary btn-block">Update authentication config</button> - <a type="button" href="/admin/auths/{{.Source.Id}}/delete" class="btn btn-lg btn-danger btn-block">Delete this authentication</a> + <strong>{{.i18n.Tr "admin.auths.enable_auto_register"}}</strong> + <br> + <label></label> + <input name="is_actived" type="checkbox" {{if .Source.IsActived}}checked{{end}}> + <strong>{{.i18n.Tr "admin.auths.activated"}}</strong> + </div> + <div class="field"> + <label></label> + <button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "admin.auths.update"}}</button> + + <button class="btn btn-large btn-red btn-radius" id="auth-delete">{{.i18n.Tr "admin.auths.delete"}}</button> + </div> + </form> </div> </div> - </form> + </div> </div> </div> - </div> </div> -{{template "base/footer" .}} +{{template "ng/base/footer" .}} diff --git a/templates/admin/auth/list.tmpl b/templates/admin/auth/list.tmpl new file mode 100644 index 0000000000..591d2ed4c3 --- /dev/null +++ b/templates/admin/auth/list.tmpl @@ -0,0 +1,59 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="admin-wrapper"> + <div id="setting-wrapper" class="main-wrapper"> + <div id="admin-setting" class="container clear"> + {{template "admin/nav" .}} + <div class="grid-4-5 left"> + <div class="setting-content"> + {{template "ng/base/alert" .}} + <div id="setting-content"> + <div class="panel panel-radius"> + <div class="panel-header"> + <strong>{{.i18n.Tr "admin.auths.auth_manage_panel"}}</strong> + </div> + <div class="panel-body admin-panel"> + <a class="btn-blue btn-medium btn-link btn-radius" href="/admin/auths/new">{{.i18n.Tr "admin.auths.new"}}</a> + <div class="admin-table"> + <table class="table table-striped"> + <thead> + <tr> + <th>Id</th> + <th>{{.i18n.Tr "admin.auths.name"}}</th> + <th>{{.i18n.Tr "admin.auths.type"}}</th> + <th>{{.i18n.Tr "admin.auths.enabled"}}</th> + <th>{{.i18n.Tr "admin.auths.updated"}}</th> + <th>{{.i18n.Tr "admin.users.created"}}</th> + <th>{{.i18n.Tr "admin.users.edit"}}</th> + </tr> + </thead> + <tbody> + {{range .Sources}} + <tr> + <td>{{.Id}}</td> + <td><a href="/admin/auths/{{.Id}}">{{.Name}}</a></td> + <td>{{.TypeString}}</td> + <td><i class="fa fa{{if .IsActived}}-check{{end}}-square-o"></i></td> + <td>{{DateFormat .Updated "M d, Y"}}</td> + <td>{{DateFormat .Created "M d, Y"}}</td> + <td><a href="/admin/auths/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> + </tr> + {{end}} + </tbody> + </table> + {{if or .LastPageNum .NextPageNum}} + <ul class="pagination"> + {{if .LastPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/auths?p={{.LastPageNum}}">« Prev.</a></li>{{end}} + {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/auths?p={{.NextPageNum}}">» Next</a></li>{{end}} + </ul> + {{end}} + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/admin/auth/new.tmpl b/templates/admin/auth/new.tmpl index abb88043ee..12d47d2869 100644 --- a/templates/admin/auth/new.tmpl +++ b/templates/admin/auth/new.tmpl @@ -1,178 +1,110 @@ -{{template "base/head" .}} -{{template "base/navbar" .}} -<div id="body" class="container" data-page="admin"> - {{template "admin/nav" .}} - <div id="admin-container" class="col-md-9"> - <div class="panel panel-default"> - <div class="panel-heading"> - New Authentication - </div> - - <div class="panel-body"> - <br/> - <form action="/admin/auths/new" method="post" class="form-horizontal"> - {{.CsrfTokenHtml}} - {{template "base/alert" .}} - <div class="form-group"> - <label class="col-md-3 control-label">Auth Type: </label> - <div class="col-md-7"> - <select name="type" class="form-control" id="auth-type"> - {{range $key, $val := .LoginTypes}} - <option value="{{$key}}">{{$val}}</option> - {{end}} - </select> - </div> - </div> - <div class="form-group {{if .Err_AuthName}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Name: </label> - <div class="col-md-7"> - <input name="name" class="form-control" placeholder="Type authentication's name" value="{{.name}}"> - </div> - </div> - <div class="ldap"> - <div class="form-group {{if .Err_Domain}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Domain: </label> - <div class="col-md-7"> - <input name="domain" class="form-control" placeholder="Type domain name" value="{{.domain}}"> - </div> - </div> - - <div class="form-group {{if .Err_Host}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Host: </label> - <div class="col-md-7"> - <input name="host" class="form-control" placeholder="Type host address" value="{{.host}}"> - </div> - </div> - - <div class="form-group {{if .Err_Port}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Port: </label> - <div class="col-md-7"> - <input name="port" class="form-control" placeholder="Type port number" value="{{.port}}"> - </div> - </div> - - <div class="form-group {{if .Err_UseSSL}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Use SSL: </label> - <div class="col-md-7"> - <input name="usessl" class="form-control" type="checkbox" {{if .usessl}}checked{{end}}> - </div> - </div> - - <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Base DN: </label> - <div class="col-md-7"> - <input name="base_dn" class="form-control" placeholder="Type base DN" value="{{.base_dn}}"> - </div> - </div> - - <div class="form-group {{if .Err_Attributes}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Search Attributes: </label> - <div class="col-md-7"> - <input name="attributes" class="form-control" placeholder="Type search attributes" value="{{.attributes}}"> - </div> - </div> - - <div class="form-group {{if .Err_Filter}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Search Filter: </label> - <div class="col-md-7"> - <input name="filter" class="form-control" placeholder="Type search filter" value="{{.filter}}"> - </div> - </div> - - <div class="form-group {{if .Err_MsAdSA}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Ms Ad SA: </label> - <div class="col-md-7"> - <input name="ms_ad_sa" class="form-control" placeholder="Type Ms Ad SA" value="{{.ms_ad_sa}}"> - </div> - </div> - - </div> - - <div class="smtp hidden"> - <div class="form-group"> - <label class="col-md-3 control-label">SMTP Auth: </label> - <div class="col-md-7"> - <select name="smtpauth" class="form-control"> - {{range .SMTPAuths}} - <option value="{{.}}">{{.}}</option> - {{end}} - </select> +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="admin-wrapper"> + <div id="setting-wrapper" class="main-wrapper"> + <div id="admin-setting" class="container clear"> + {{template "admin/nav" .}} + <div class="grid-4-5 left"> + <div class="setting-content"> + {{template "ng/base/alert" .}} + <div id="setting-content"> + <div class="panel panel-radius"> + <div class="panel-header"> + <strong>{{.i18n.Tr "admin.auths.new"}}</strong> </div> - </div> - - <div class="form-group {{if .Err_SmtpHost}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Host: </label> - <div class="col-md-7"> - <input name="smtphost" class="form-control" placeholder="Type host address" value="{{.smtphost}}"> - </div> - </div> - - <div class="form-group {{if .Err_SmtpPort}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">Port: </label> - <div class="col-md-7"> - <input name="smtpport" class="form-control" placeholder="Type port number" value="{{.smtpport}}"> - </div> - </div> - - <div class="form-group"> - <div class="col-md-offset-3 col-md-7"> - <div class="checkbox"> - <label> + <form class="form form-align panel-body" id="repo-setting-form" action="/admin/auths/new" method="post"> + {{.CsrfTokenHtml}} + <div class="field"> + <label class="req">{{.i18n.Tr "admin.auths.auth_type"}}</label> + <select id="auth-type" name="type"> + {{range $key, $val := .LoginTypes}} + <option value="{{$key}}">{{$val}}</option> + {{end}} + </select> + </div> + <div class="field"> + <label class="req" for="name">{{.i18n.Tr "admin.auths.auth_name"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_AuthName}}ipt-error{{end}}" id="name" name="name" value="{{.name}}" required /> + </div> + <div class="ldap"> + <div class="field"> + <label class="req" for="domain">{{.i18n.Tr "admin.auths.domain"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Domain}}ipt-error{{end}}" id="domain" name="domain" value="{{.domain}}" /> + </div> + <div class="field"> + <label class="req" for="host">{{.i18n.Tr "admin.auths.host"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Host}}ipt-error{{end}}" id="host" name="host" value="{{.host}}" /> + </div> + <div class="field"> + <label class="req" for="port">{{.i18n.Tr "admin.auths.port"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Port}}ipt-error{{end}}" id="port" name="port" value="{{.port}}" /> + </div> + <div class="field"> + <label class="req" for="base_dn">{{.i18n.Tr "admin.auths.base_dn"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_BaseDN}}ipt-error{{end}}" id="base_dn" name="base_dn" value="{{.base_dn}}" /> + </div> + <div class="field"> + <label class="req" for="attributes">{{.i18n.Tr "admin.auths.attributes"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Attributes}}ipt-error{{end}}" id="attributes" name="attributes" value="{{.attributes}}" /> + </div> + <div class="field"> + <label class="req" for="filter">{{.i18n.Tr "admin.auths.filter"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_Filter}}ipt-error{{end}}" id="filter" name="filter" value="{{.filter}}" /> + </div> + <div class="field"> + <label class="req" for="ms_ad_sa">{{.i18n.Tr "admin.auths.ms_ad_sa"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_MsAdSA}}ipt-error{{end}}" id="ms_ad_sa" name="ms_ad_sa" value="{{.ms_ad_sa}}" /> + </div> + </div> + <div class="smtp hidden"> + <div class="field"> + <label class="req">{{.i18n.Tr "admin.auths.smtp_auth"}}</label> + <select name="smtpauth"> + {{range .SMTPAuths}} + <option value="{{.}}">{{.}}</option> + {{end}} + </select> + </div> + <div class="field"> + <label class="req" for="smtphost">{{.i18n.Tr "admin.auths.smtphost"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_SmtpHost}}ipt-error{{end}}" id="smtphost" name="smtphost" value="{{.smtphost}}" /> + </div> + <div class="field"> + <label class="req" for="smtpport">{{.i18n.Tr "admin.auths.smtpport"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_SmtpPort}}ipt-error{{end}}" id="smtpport" name="smtpport" value="{{.smtpport}}" /> + </div> + </div> + <div class="field"> + <div class="smtp hidden"> + <label></label> <input name="tls" type="checkbox" {{if .tls}}checked{{end}}> - <strong>Enable TLS Encryption</strong> - </label> + <strong>{{.i18n.Tr "admin.auths.enable_tls"}}</strong> + <br> + </div> + <label></label> + <input name="allowautoregister" type="checkbox" {{if .allowautoregister}}checked{{end}}> + <strong>{{.i18n.Tr "admin.auths.enable_auto_register"}}</strong> </div> - </div> + <div class="field"> + <label></label> + <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "admin.auths.new"}}</button> + </div> + </form> </div> - </div> - - <div class="form-group"> - <div class="col-md-offset-3 col-md-7"> - <div class="checkbox"> - <label> - <input name="allowautoregister" type="checkbox" {{if .allowautoregister}}checked{{end}}> - <strong>Enable Auto Registration</strong> - </label> + <br> + <div class="panel panel-radius"> + <div class="panel-header"> + {{.i18n.Tr "admin.auths.tips"}} + </div> + <div class="panel-body admin-panel"> + <h5>GMail Setting:</h5> + <p>Host: smtp.gmail.com, Post: 587, Enable TLS Encryption: true</p> </div> </div> </div> - - <hr/> - - <div class="form-group"> - <div class="col-md-offset-3 col-md-7"> - <button type="submit" class="btn btn-lg btn-primary">Create new authentication</button> - </div> - </div> - </form> - </div> - </div> - - <div class="panel panel-info"> - <div class="panel-heading"> - Tips - </div> - - <div class="panel-body"> - <h5>GMail Setting:</h5> - <p>Host: smtp.gmail.com, Post: 587, Enable TLS Encryption: true</p> + </div> </div> </div> </div> </div> -<script> - $(function () { - $('#auth-type').on("change", function () { - var v = $(this).val(); - if (v == 2) { - $('.ldap').toggleShow(); - $('.smtp').toggleHide(); - } - if (v == 3) { - $('.smtp').toggleShow(); - $('.ldap').toggleHide(); - } - }); - }); -</script> -{{template "base/footer" .}} +{{template "ng/base/footer" .}} diff --git a/templates/admin/auths.tmpl b/templates/admin/auths.tmpl deleted file mode 100644 index a0f7ba9790..0000000000 --- a/templates/admin/auths.tmpl +++ /dev/null @@ -1,43 +0,0 @@ -{{template "base/head" .}} -{{template "base/navbar" .}} -<div id="body" class="container" data-page="admin"> - {{template "admin/nav" .}} - <div id="admin-container" class="col-md-10"> - <div class="panel panel-default"> - <div class="panel-heading"> - Authentication Management - </div> - - <div class="panel-body"> - <a href="/admin/auths/new" class="btn btn-primary">New Auth Source</a> - <table class="table table-striped"> - <thead> - <tr> - <th>Id</th> - <th>Name</th> - <th>Type</th> - <th>Actived</th> - <th>Updated</th> - <th>Created</th> - <th>Edit</th> - </tr> - </thead> - <tbody> - {{range .Sources}} - <tr> - <td>{{.Id}}</td> - <td><a href="/admin/auths/{{.Id}}">{{.Name}}</a></td> - <td>{{.TypeString}}</td> - <td><i class="fa fa{{if .IsActived}}-check{{end}}-square-o"></i></td> - <td>{{DateFormat .Updated "M d, Y"}}</td> - <td>{{DateFormat .Created "M d, Y"}}</td> - <td><a href="/admin/auths/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> - </tr> - {{end}} - </tbody> - </table> - </div> - </div> - </div> -</div> -{{template "base/footer" .}}
\ No newline at end of file diff --git a/templates/admin/nav.tmpl b/templates/admin/nav.tmpl index fa9b173e02..ccb250c250 100644 --- a/templates/admin/nav.tmpl +++ b/templates/admin/nav.tmpl @@ -6,7 +6,7 @@ <li {{if .PageIsAdminUsers}}class="current"{{end}}><a href="/admin/users">{{.i18n.Tr "admin.users"}}</a></li> <li {{if .PageIsAdminOrganizations}}class="current"{{end}}><a href="/admin/orgs">{{.i18n.Tr "admin.organizations"}}</a></li> <li {{if .PageIsAdminRepositories}}class="current"{{end}}><a href="/admin/repos">{{.i18n.Tr "admin.repositories"}}</a></li> - <li {{if .PageIsAdminAuthentication}}class="current"{{end}}><a href="/admin/auths">{{.i18n.Tr "admin.authentication"}}</a></li> + <li {{if .PageIsAdminAuthentications}}class="current"{{end}}><a href="/admin/auths">{{.i18n.Tr "admin.authentication"}}</a></li> <li {{if .PageIsAdminConfig}}class="current"{{end}}><a href="/admin/config">{{.i18n.Tr "admin.config"}}</a></li> <li {{if .PageIsAdminMonitor}}class="current"{{end}}><a href="/admin/monitor">{{.i18n.Tr "admin.monitor"}}</a></li> </ul> diff --git a/templates/admin/org/list.tmpl b/templates/admin/org/list.tmpl new file mode 100644 index 0000000000..ea9167c0c4 --- /dev/null +++ b/templates/admin/org/list.tmpl @@ -0,0 +1,58 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="admin-wrapper"> + <div id="setting-wrapper" class="main-wrapper"> + <div id="admin-setting" class="container clear"> + {{template "admin/nav" .}} + <div class="grid-4-5 left"> + <div class="setting-content"> + {{template "ng/base/alert" .}} + <div id="setting-content"> + <div class="panel panel-radius"> + <div class="panel-header"> + <strong>{{.i18n.Tr "admin.orgs.org_manage_panel"}}</strong> + </div> + <div class="panel-body admin-panel"> + <div class="admin-table"> + <table class="table table-striped"> + <thead> + <tr> + <th>Id</th> + <th>{{.i18n.Tr "admin.orgs.name"}}</th> + <th>{{.i18n.Tr "email"}}</th> + <th>{{.i18n.Tr "admin.orgs.teams"}}</th> + <th>{{.i18n.Tr "admin.orgs.members"}}</th> + <th>{{.i18n.Tr "admin.users.repos"}}</th> + <th>{{.i18n.Tr "admin.users.created"}}</th> + </tr> + </thead> + <tbody> + {{range .Orgs}} + <tr> + <td>{{.Id}}</td> + <td><a href="/org/{{.Name}}">{{.Name}}</a></td> + <td>{{.Email}}</td> + <td>{{.NumTeams}}</td> + <td>{{.NumMembers}}</td> + <td>{{.NumRepos}}</td> + <td>{{DateFormat .Created "M d, Y"}}</td> + </tr> + {{end}} + </tbody> + </table> + {{if or .LastPageNum .NextPageNum}} + <ul class="pagination"> + {{if .LastPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/orgs?p={{.LastPageNum}}">« {{.i18n.Tr "admin.prev"}}</a></li>{{end}} + {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/orgs?p={{.NextPageNum}}">» {{.i18n.Tr "admin.next"}}</a></li>{{end}} + </ul> + {{end}} + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl new file mode 100644 index 0000000000..3f35715833 --- /dev/null +++ b/templates/admin/repo/list.tmpl @@ -0,0 +1,60 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="admin-wrapper"> + <div id="setting-wrapper" class="main-wrapper"> + <div id="admin-setting" class="container clear"> + {{template "admin/nav" .}} + <div class="grid-4-5 left"> + <div class="setting-content"> + {{template "ng/base/alert" .}} + <div id="setting-content"> + <div class="panel panel-radius"> + <div class="panel-header"> + <strong>{{.i18n.Tr "admin.repos.repo_manage_panel"}}</strong> + </div> + <div class="panel-body admin-panel"> + <div class="admin-table"> + <table class="table table-striped"> + <thead> + <tr> + <th>Id</th> + <th>{{.i18n.Tr "admin.repos.owner"}}</th> + <th>{{.i18n.Tr "admin.repos.name"}}</th> + <th>{{.i18n.Tr "admin.repos.private"}}</th> + <th>{{.i18n.Tr "admin.repos.watches"}}</th> + <th>{{.i18n.Tr "admin.repos.stars"}}</th> + <th>{{.i18n.Tr "admin.repos.issues"}}</th> + <th>{{.i18n.Tr "admin.users.created"}}</th> + </tr> + </thead> + <tbody> + {{range .Repos}} + <tr> + <td>{{.Id}}</td> + <td><a href="/user/{{.Owner.Name}}">{{.Owner.Name}}</a></td> + <td><a href="/{{.Owner.Name}}/{{.Name}}">{{.Name}}</a></td> + <td><i class="fa fa{{if .IsPrivate}}-check{{end}}-square-o"></i></td> + <td>{{.NumWatches}}</td> + <td>{{.NumIssues}}</td> + <td>{{.NumStars}}</td> + <td>{{DateFormat .Created "M d, Y"}}</td> + </tr> + {{end}} + </tbody> + </table> + {{if or .LastPageNum .NextPageNum}} + <ul class="pagination"> + {{if .LastPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/repos?p={{.LastPageNum}}">« Prev.</a></li>{{end}} + {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/repos?p={{.NextPageNum}}">» Next</a></li>{{end}} + </ul> + {{end}} + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/admin/repos.tmpl b/templates/admin/repos.tmpl deleted file mode 100644 index 373348b9d1..0000000000 --- a/templates/admin/repos.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -{{template "base/head" .}} -{{template "base/navbar" .}} -<div id="body" class="container" data-page="admin"> - {{template "admin/nav" .}} - <div id="admin-container" class="col-md-10"> - <div class="panel panel-default"> - <div class="panel-heading"> - Repository Management - </div> - - <div class="panel-body"> - <table class="table table-striped"> - <thead> - <tr> - <th>Id</th> - <th>Owner</th> - <th>Name</th> - <th>Private</th> - <th>Watches</th> - <th>Issues</th> - <th>Forks</th> - <th>Created</th> - </tr> - </thead> - <tbody> - {{range .Repos}} - <tr> - <td>{{.Id}}</td> - <th>{{.Owner.Name}}</th> - <td><a href="/{{.Owner.Name}}/{{.Name}}">{{.Name}}</a></td> - <td><i class="fa fa{{if .IsPrivate}}-check{{end}}-square-o"></i></td> - <td>{{.NumWatches}}</td> - <td>{{.NumIssues}}</td> - <td>{{.NumForks}}</td> - <td>{{DateFormat .Created "M d, Y"}}</td> - </tr> - {{end}} - </tbody> - </table> - <ul class="pagination"> - {{if .LastPageNum}}<li><a href="/admin/repos?p={{.LastPageNum}}">« Prev.</a></li>{{end}} - {{if .NextPageNum}}<li><a href="/admin/repos?p={{.NextPageNum}}">» Next</a></li>{{end}} - </ul> - </div> - </div> - </div> -</div> -{{template "base/footer" .}}
\ No newline at end of file diff --git a/templates/admin/user/list.tmpl b/templates/admin/user/list.tmpl index 39e348fdf0..51e6604fac 100644 --- a/templates/admin/user/list.tmpl +++ b/templates/admin/user/list.tmpl @@ -20,7 +20,7 @@ <tr> <th>Id</th> <th>{{.i18n.Tr "admin.users.name"}}</th> - <th>{{.i18n.Tr "admin.users.email"}}</th> + <th>{{.i18n.Tr "email"}}</th> <th>{{.i18n.Tr "admin.users.activated"}}</th> <th>{{.i18n.Tr "admin.users.admin"}}</th> <th>{{.i18n.Tr "admin.users.repos"}}</th> @@ -51,7 +51,6 @@ {{end}} </div> </div> - </div> </div> </div> diff --git a/templates/admin/user/new.tmpl b/templates/admin/user/new.tmpl index 19126ee0c4..0c4ad603ac 100644 --- a/templates/admin/user/new.tmpl +++ b/templates/admin/user/new.tmpl @@ -44,7 +44,7 @@ <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="re-type" name="retype" type="password" required/> </div> <div class="field"> - <span class="form-label"></span> + <label></label> <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "admin.users.new_account"}}</button> </div> </form> |