]> source.dussan.org Git - gitea.git/commitdiff
Continue working on new admin pages
authorUnknwon <joe2010xtmf@163.com>
Fri, 29 Aug 2014 12:50:43 +0000 (20:50 +0800)
committerUnknwon <joe2010xtmf@163.com>
Fri, 29 Aug 2014 12:50:43 +0000 (20:50 +0800)
28 files changed:
README.md
README_ZH.md
cmd/web.go
conf/locale/locale_en-US.ini
conf/locale/locale_zh-CN.ini
gogs.go
models/org.go
models/user.go
public/ng/css/gogs.css
public/ng/js/gogs.js
public/ng/less/gogs/settings.less
routers/admin/admin.go
routers/admin/auth.go [deleted file]
routers/admin/auths.go [new file with mode: 0644]
routers/admin/orgs.go [new file with mode: 0644]
routers/admin/repos.go [new file with mode: 0644]
routers/admin/users.go
templates/.VERSION
templates/admin/auth/edit.tmpl
templates/admin/auth/list.tmpl [new file with mode: 0644]
templates/admin/auth/new.tmpl
templates/admin/auths.tmpl [deleted file]
templates/admin/nav.tmpl
templates/admin/org/list.tmpl [new file with mode: 0644]
templates/admin/repo/list.tmpl [new file with mode: 0644]
templates/admin/repos.tmpl [deleted file]
templates/admin/user/list.tmpl
templates/admin/user/new.tmpl

index 78f8c40cad5a70ed00abe2cbd45dd488c93ad451..0d9e7338460ba286b37a9cbe8eb3573044b72f6d 100644 (file)
--- a/README.md
+++ b/README.md
@@ -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
 
index fd78922ab70f45ff8a1c7b0d45232a12cc5df3c2..3bf67f38d803d33361407433aed930c6372369fc 100644 (file)
@@ -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
 
 ## 开发目的
 
index de1aa03cc209e02b1503602490c20332485da447..2bc9be457a1c557a7bf2cf7de0fffd451f4c0613 100644 (file)
@@ -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)
index 106e765cb8c767becfd075cbf9aa3a0e5a7abb76..8fbf42ca8b86486fef0df8b71dca0215209fecf8 100644 (file)
@@ -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>
index 2254f370ba72ee164482571433e089fc655a62e2..310bc8c96859efd6ef007ff4ae8b7598723e391b 100644 (file)
@@ -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 = æ\8c\87å®\9aå\9b¢é\98\9få·²ç»\8f被æ\88\90å\8a\9få\88 é\99¤
+teams.delete_team_success = æ\8c\87å®\9aå\9b¢é\98\9få\88 é\99¤æ\88\90å\8a\9f
 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 = æ\9d\83é\99\90认证管理
+authentication = æ\8e\88æ\9d\83认证管理
 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>
diff --git a/gogs.go b/gogs.go
index bd1ea621f6ba906aaf628f8f21c5f4b59239b743..2e23ecfc40b6532793254d346a82d8486566f2ba 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -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())
index 18ed68e6f47ea0015dccfc494fa418994373e1f0..ce50670582b1bcd1ae2a6bd88b1685c78f8a018b 100644 (file)
@@ -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) {
index 661fb1c220993c4ed12b6ad54ffca64486aecde3..96881ea355444eea403410386459b29ab8ac0c02 100644 (file)
@@ -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
 }
index 34d71028e7f96e9258e4bf84808dbe101245c82f..d81d6f31493b59e744516fa08430c257e58f086e 100644 (file)
@@ -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 {
index 69ac380fd9687d5424343967704126d69da35a74..9fe0655528f17a4cf2e41f1c46afe506af9e4bd2 100644 (file)
@@ -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 () {
index cc922e3ffe3fd64dfbe29ac7dc9efce7f68b59d3..b246a947eced82e7b718a9db29a4e44da6e92b28 100644 (file)
@@ -31,6 +31,7 @@
   margin-left: 32px;
 }
 
+#auth-setting-form,
 #org-setting-form,
 #repo-setting-form,
 #user-profile-form {
index 75dbf2712b9c9e67b94420dc5038398e86e9fd91..b2c932c98f7b0c92a65cc494552b28e4dd7baa3a 100644 (file)
@@ -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/auth.go
deleted file mode 100644 (file)
index 44af962..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-// 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 (
-       "strings"
-
-       "github.com/Unknwon/com"
-       "github.com/go-xorm/core"
-
-       "github.com/gogits/gogs/models"
-       "github.com/gogits/gogs/modules/auth"
-       "github.com/gogits/gogs/modules/auth/ldap"
-       "github.com/gogits/gogs/modules/base"
-       "github.com/gogits/gogs/modules/log"
-       "github.com/gogits/gogs/modules/middleware"
-)
-
-const (
-       AUTH_NEW  base.TplName = "admin/auth/new"
-       AUTH_EDIT base.TplName = "admin/auth/edit"
-)
-
-func NewAuthSource(ctx *middleware.Context) {
-       ctx.Data["Title"] = "New Authentication"
-       ctx.Data["PageIsAuths"] = 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["LoginTypes"] = models.LoginTypes
-       ctx.Data["SMTPAuths"] = models.SMTPAuths
-
-       if ctx.HasError() {
-               ctx.HTML(200, AUTH_NEW)
-               return
-       }
-
-       var u core.Conversion
-       switch models.LoginType(form.Type) {
-       case models.LDAP:
-               u = &models.LDAPConfig{
-                       Ldapsource: ldap.Ldapsource{
-                               Host:         form.Host,
-                               Port:         form.Port,
-                               UseSSL:       form.UseSSL,
-                               BaseDN:       form.BaseDN,
-                               Attributes:   form.Attributes,
-                               Filter:       form.Filter,
-                               MsAdSAFormat: form.MsAdSA,
-                               Enabled:      true,
-                               Name:         form.AuthName,
-                       },
-               }
-       case models.SMTP:
-               u = &models.SMTPConfig{
-                       Auth: form.SmtpAuth,
-                       Host: form.SmtpHost,
-                       Port: form.SmtpPort,
-                       TLS:  form.Tls,
-               }
-       default:
-               ctx.Error(400)
-               return
-       }
-
-       var source = &models.LoginSource{
-               Type:              models.LoginType(form.Type),
-               Name:              form.AuthName,
-               IsActived:         true,
-               AllowAutoRegister: form.AllowAutoRegister,
-               Cfg:               u,
-       }
-
-       if err := models.CreateSource(source); err != nil {
-               ctx.Handle(500, "admin.auths.NewAuth(CreateSource)", err)
-               return
-       }
-
-       log.Trace("%s Authentication created by admin(%s): %s", ctx.Req.RequestURI,
-               ctx.User.LowerName, strings.ToLower(form.AuthName))
-
-       ctx.Redirect("/admin/auths")
-}
-
-func EditAuthSource(ctx *middleware.Context) {
-       ctx.Data["Title"] = "Edit Authentication"
-       ctx.Data["PageIsAuths"] = 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)
-               return
-       }
-       u, err := models.GetLoginSourceById(id)
-       if err != nil {
-               ctx.Handle(500, "admin.user.EditUser(GetLoginSourceById)", err)
-               return
-       }
-       ctx.Data["Source"] = u
-       ctx.HTML(200, AUTH_EDIT)
-}
-
-func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
-       ctx.Data["Title"] = "Edit Authentication"
-       ctx.Data["PageIsAuths"] = true
-       ctx.Data["LoginTypes"] = models.LoginTypes
-       ctx.Data["SMTPAuths"] = models.SMTPAuths
-
-       if ctx.HasError() {
-               ctx.HTML(200, AUTH_EDIT)
-               return
-       }
-
-       var config core.Conversion
-       switch models.LoginType(form.Type) {
-       case models.LDAP:
-               config = &models.LDAPConfig{
-                       Ldapsource: ldap.Ldapsource{
-                               Host:         form.Host,
-                               Port:         form.Port,
-                               UseSSL:       form.UseSSL,
-                               BaseDN:       form.BaseDN,
-                               Attributes:   form.Attributes,
-                               Filter:       form.Filter,
-                               MsAdSAFormat: form.MsAdSA,
-                               Enabled:      true,
-                               Name:         form.AuthName,
-                       },
-               }
-       case models.SMTP:
-               config = &models.SMTPConfig{
-                       Auth: form.SmtpAuth,
-                       Host: form.SmtpHost,
-                       Port: form.SmtpPort,
-                       TLS:  form.Tls,
-               }
-       default:
-               ctx.Error(400)
-               return
-       }
-
-       u := models.LoginSource{
-               Id:                form.Id,
-               Name:              form.AuthName,
-               IsActived:         form.IsActived,
-               Type:              models.LoginType(form.Type),
-               AllowAutoRegister: form.AllowAutoRegister,
-               Cfg:               config,
-       }
-
-       if err := models.UpdateSource(&u); err != nil {
-               ctx.Handle(500, "admin.auths.EditAuth(UpdateSource)", err)
-               return
-       }
-
-       log.Trace("%s Authentication changed by admin(%s): %s", ctx.Req.RequestURI,
-               ctx.User.LowerName, form.AuthName)
-
-       ctx.Redirect("/admin/auths")
-}
-
-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)
-               return
-       }
-
-       a, err := models.GetLoginSourceById(id)
-       if err != nil {
-               ctx.Handle(500, "admin.auths.DeleteAuth(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.Redirect("/admin/auths/" + ctx.Params(":authid"))
-               default:
-                       ctx.Handle(500, "admin.auths.DeleteAuth(DelLoginSource)", err)
-               }
-               return
-       }
-       log.Trace("%s Authentication deleted by admin(%s): %s", ctx.Req.RequestURI,
-               ctx.User.LowerName, ctx.User.LowerName)
-
-       ctx.Redirect("/admin/auths")
-}
diff --git a/routers/admin/auths.go b/routers/admin/auths.go
new file mode 100644 (file)
index 0000000..6fbeab3
--- /dev/null
@@ -0,0 +1,211 @@
+// 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/Unknwon/com"
+       "github.com/go-xorm/core"
+
+       "github.com/gogits/gogs/models"
+       "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/auth/ldap"
+       "github.com/gogits/gogs/modules/base"
+       "github.com/gogits/gogs/modules/log"
+       "github.com/gogits/gogs/modules/middleware"
+)
+
+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"] = 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"] = ctx.Tr("admin.auths.new")
+       ctx.Data["PageIsAdmin"] = true
+       ctx.Data["PageIsAdminAuthentications"] = true
+       ctx.Data["LoginTypes"] = models.LoginTypes
+       ctx.Data["SMTPAuths"] = models.SMTPAuths
+
+       if ctx.HasError() {
+               ctx.HTML(200, AUTH_NEW)
+               return
+       }
+
+       var u core.Conversion
+       switch models.LoginType(form.Type) {
+       case models.LDAP:
+               u = &models.LDAPConfig{
+                       Ldapsource: ldap.Ldapsource{
+                               Host:         form.Host,
+                               Port:         form.Port,
+                               UseSSL:       form.UseSSL,
+                               BaseDN:       form.BaseDN,
+                               Attributes:   form.Attributes,
+                               Filter:       form.Filter,
+                               MsAdSAFormat: form.MsAdSA,
+                               Enabled:      true,
+                               Name:         form.AuthName,
+                       },
+               }
+       case models.SMTP:
+               u = &models.SMTPConfig{
+                       Auth: form.SmtpAuth,
+                       Host: form.SmtpHost,
+                       Port: form.SmtpPort,
+                       TLS:  form.Tls,
+               }
+       default:
+               ctx.Error(400)
+               return
+       }
+
+       var source = &models.LoginSource{
+               Type:              models.LoginType(form.Type),
+               Name:              form.AuthName,
+               IsActived:         true,
+               AllowAutoRegister: form.AllowAutoRegister,
+               Cfg:               u,
+       }
+
+       if err := models.CreateSource(source); err != nil {
+               ctx.Handle(500, "CreateSource", err)
+               return
+       }
+
+       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"] = ctx.Tr("admin.auths.edit")
+       ctx.Data["PageIsAdmin"] = true
+       ctx.Data["PageIsAdminAuthentications"] = true
+       ctx.Data["LoginTypes"] = models.LoginTypes
+       ctx.Data["SMTPAuths"] = models.SMTPAuths
+
+       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, "GetLoginSourceById", err)
+               return
+       }
+       ctx.Data["Source"] = u
+       ctx.HTML(200, AUTH_EDIT)
+}
+
+func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
+       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
+
+       if ctx.HasError() {
+               ctx.HTML(200, AUTH_EDIT)
+               return
+       }
+
+       var config core.Conversion
+       switch models.LoginType(form.Type) {
+       case models.LDAP:
+               config = &models.LDAPConfig{
+                       Ldapsource: ldap.Ldapsource{
+                               Host:         form.Host,
+                               Port:         form.Port,
+                               UseSSL:       form.UseSSL,
+                               BaseDN:       form.BaseDN,
+                               Attributes:   form.Attributes,
+                               Filter:       form.Filter,
+                               MsAdSAFormat: form.MsAdSA,
+                               Enabled:      true,
+                               Name:         form.AuthName,
+                       },
+               }
+       case models.SMTP:
+               config = &models.SMTPConfig{
+                       Auth: form.SmtpAuth,
+                       Host: form.SmtpHost,
+                       Port: form.SmtpPort,
+                       TLS:  form.Tls,
+               }
+       default:
+               ctx.Error(400)
+               return
+       }
+
+       u := models.LoginSource{
+               Id:                form.Id,
+               Name:              form.AuthName,
+               IsActived:         form.IsActived,
+               Type:              models.LoginType(form.Type),
+               AllowAutoRegister: form.AllowAutoRegister,
+               Cfg:               config,
+       }
+
+       if err := models.UpdateSource(&u); err != nil {
+               ctx.Handle(500, "UpdateSource", err)
+               return
+       }
+
+       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) {
+       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, "GetLoginSourceById", err)
+               return
+       }
+
+       if err = models.DelLoginSource(a); err != nil {
+               switch err {
+               case models.ErrAuthenticationUserUsed:
+                       ctx.Flash.Error("form.still_own_user")
+                       ctx.Redirect("/admin/auths/" + ctx.Params(":authid"))
+               default:
+                       ctx.Handle(500, "DelLoginSource", err)
+               }
+               return
+       }
+       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 (file)
index 0000000..e813e47
--- /dev/null
@@ -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 (file)
index 0000000..6d9169f
--- /dev/null
@@ -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)
+}
index 5f98a64be6b7001c58db12bf3a96da10fd83b954..3f14e48f047a444c32b44c866087a7add133fdcb 100644 (file)
@@ -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)
index 102c742960cea8dee57ce47bc6112a83ac377ea3..6b8f7aafd27ce75f6dc7a20b883ccfcfdffac533 100644 (file)
@@ -1 +1 @@
-0.4.7.0829 Alpha
\ No newline at end of file
+0.4.8.0829 Alpha
\ No newline at end of file
index a2c2ddc698c03024dcd5463b1bd7b8a76c0932e1..400a4cebe3960b14d7fbb854160d978d8d8d0c49 100644 (file)
-{{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>
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    <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 (file)
index 0000000..591d2ed
--- /dev/null
@@ -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}}">&laquo; Prev.</a></li>{{end}}
+                                                           {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/auths?p={{.NextPageNum}}">&raquo; 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
index abb88043ee711ced7bd0831752645eff92da009e..12d47d2869ef3e63adc33a3c8b3c54d8969dd631 100644 (file)
-{{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 (file)
index a0f7ba9..0000000
+++ /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
index fa9b173e020e971b1c4cd071f277f40e7f1d3866..ccb250c250ffdca731ceaa22ba22c12e24a79fc0 100644 (file)
@@ -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 (file)
index 0000000..ea9167c
--- /dev/null
@@ -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}}">&laquo; {{.i18n.Tr "admin.prev"}}</a></li>{{end}}
+                                                           {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/orgs?p={{.NextPageNum}}">&raquo; {{.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 (file)
index 0000000..3f35715
--- /dev/null
@@ -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}}">&laquo; Prev.</a></li>{{end}}
+                                                           {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/repos?p={{.NextPageNum}}">&raquo; 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 (file)
index 373348b..0000000
+++ /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}}">&laquo; Prev.</a></li>{{end}}
-                    {{if .NextPageNum}}<li><a href="/admin/repos?p={{.NextPageNum}}">&raquo; Next</a></li>{{end}}
-                </ul>
-            </div>
-        </div>
-    </div>
-</div>
-{{template "base/footer" .}}
\ No newline at end of file
index 39e348fdf01a500a62c2f83fcc14e92fa4498c8c..51e6604facd1f497d90d410f24716792a01478ff 100644 (file)
@@ -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>
index 19126ee0c4a2194acb4b9acf10c7056a9b46c048..0c4ad603ac2e68c288d90c0253003aef725877ed 100644 (file)
@@ -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>