]> source.dussan.org Git - gitea.git/commitdiff
Finish new hooks list page
authorUnknwon <joe2010xtmf@163.com>
Sat, 9 Aug 2014 17:29:51 +0000 (10:29 -0700)
committerUnknwon <joe2010xtmf@163.com>
Sat, 9 Aug 2014 17:29:51 +0000 (10:29 -0700)
17 files changed:
cmd/web.go
conf/locale/locale_en-US.ini
conf/locale/locale_zh-CN.ini
gogs.go
public/ng/css/gogs.css
public/ng/css/ui.css
public/ng/less/gogs/base.less
public/ng/less/gogs/repository.less
public/ng/less/gogs/settings.less
public/ng/less/ui/form.less
public/ng/less/ui/reset.less
routers/repo/setting.go
templates/.VERSION
templates/repo/hooks.tmpl [deleted file]
templates/repo/settings/hooks.tmpl [new file with mode: 0644]
templates/user/settings/profile.tmpl
templates/user/settings/sshkeys.tmpl

index 40ae760280178637085f709345c8f6dc6d47b0ba..474e86b3e3b54e06693c073807267c8ce8c6cb4e 100644 (file)
@@ -255,8 +255,8 @@ func runWeb(*cli.Context) {
                r.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingsPost)
                m.Group("/settings", func(r *macaron.Router) {
                        r.Route("/collaboration", "GET,POST", repo.SettingsCollaboration)
-                       r.Get("/hooks", repo.WebHooks)
-                       r.Get("/hooks/add", repo.WebHooksAdd)
+                       r.Get("/hooks", repo.Webhooks)
+                       r.Get("/hooks/new", repo.WebHooksAdd)
                        r.Post("/hooks/add", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksAddPost)
                        r.Get("/hooks/:id", repo.WebHooksEdit)
                        r.Post("/hooks/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
index 5ecf9139000d0605c26e28c4ed4768c4710c3193..5e6974d2eb5fa2edae25af8afd6ffc303ec54c1a 100644 (file)
@@ -178,6 +178,9 @@ settings.confirm_delete = Confirm Deletion
 settings.add_collaborator = Add New Collaborator
 settings.add_collaborator_success = New collaborator has been added.
 settings.remove_collaborator_success = Collaborator has been removed.
+settings.add_webhook = Add Webhook
+settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>.
+settings.remove_hook_success = Webhook has been removed.
 
 [org]
 org_name_holder = Organization Name
index 4c658125233c2b34b95c1d8d58f2586b4b59c517..2bacaa5a7eff797918a1560ed1cab1a2ad699cbc 100644 (file)
@@ -178,6 +178,9 @@ settings.confirm_delete = 确认删除仓库
 settings.add_collaborator = 增加新的协作者
 settings.add_collaborator_success = 成功添加新的协作者!
 settings.remove_collaborator_success = 被操作的协作者已经被收回权限!
+settings.add_webhook = 添加 Web 钩子
+settings.hooks_desc = Web 钩子允许您设定在 Gogs 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文档</a> 获取更多信息。
+settings.remove_hook_success = Web 钩子删除成功!
 
 [org]
 org_name_holder = 组织名称
diff --git a/gogs.go b/gogs.go
index d40f1a02d1fa8aec5668acbac04acc8a0ec78bf9..b8a4ec6cfd930d5b7b13c50ba180cb66a550baa2 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.0807 Alpha"
+const APP_VER = "0.4.7.0809 Alpha"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
index 244d6531d6c2e0ddd3604c8ff41f9dba8c10aaaa..e3eb4c88079e016e2b7ac5aabf6d8af7f54fcad2 100644 (file)
@@ -214,6 +214,15 @@ img.avatar-48 {
   cursor: pointer;
   font-weight: bold;
 }
+.text-success {
+  color: #3c763d;
+}
+.text-blue {
+  color: #15c;
+}
+.text-red {
+  color: #DD4B39;
+}
 .markdown {
   background-color: white;
   font-size: 16px;
@@ -1297,6 +1306,10 @@ The register and sign-in page style
   position: relative;
   top: 5px;
 }
+.setting-list {
+  width: 100%;
+  list-style: none;
+}
 #setting-wrapper {
   padding-bottom: 100px;
 }
@@ -1347,18 +1360,28 @@ The register and sign-in page style
 #user-profile-form .field {
   margin-bottom: 24px;
 }
+#repo-hooks-panel,
 #user-ssh-panel {
   margin-bottom: 20px;
 }
-#user-ssh-panel .switching-list {
+#repo-hooks-panel .setting-list,
+#user-ssh-panel .setting-list {
   background-color: #FFF;
 }
-#user-ssh-panel .switching-list li {
+#repo-hooks-panel .setting-list li,
+#user-ssh-panel .setting-list li {
   padding: 8px 20px;
+  border-bottom: 1px solid #eaeaea;
 }
-#user-ssh-panel .switching-list li.ssh:hover {
+#repo-hooks-panel .setting-list li.ssh:hover,
+#user-ssh-panel .setting-list li.ssh:hover {
   background-color: #ffffEE;
 }
+#repo-hooks-panel .setting-list li i,
+#user-ssh-panel .setting-list li i {
+  padding-right: 5px;
+}
+#repo-hooks-panel .active-icon,
 #user-ssh-panel .active-icon {
   width: 10px;
   height: 10px;
@@ -1367,16 +1390,21 @@ The register and sign-in page style
   margin-right: 20px;
   margin-top: 10px;
 }
+#repo-hooks-panel .ssh-content,
 #user-ssh-panel .ssh-content {
   margin-left: 24px;
 }
+#repo-hooks-panel .ssh-content .octicon,
 #user-ssh-panel .ssh-content .octicon {
   margin-right: 4px;
 }
+#repo-hooks-panel .ssh-content .print,
 #user-ssh-panel .ssh-content .print,
+#repo-hooks-panel .ssh-content .activity,
 #user-ssh-panel .ssh-content .activity {
   color: #888;
 }
+#repo-hooks-panel .ssh-delete-btn,
 #user-ssh-panel .ssh-delete-btn {
   margin-top: 6px;
 }
index d30e137dbc1c0805bcbad11ef4079cf8be6ba55f..df03818b71f3aea5695a77605d3cad37af1da3a7 100644 (file)
@@ -427,6 +427,11 @@ dt {
 .btn-active {
   box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset, 0 0 4px rgba(0, 0, 0, 0.15) inset;
 }
+.btn-header {
+  margin-top: -1px;
+  color: white;
+  padding: 0 10px;
+}
 .btn-radius {
   border-radius: .25em;
 }
index 0cadabe8691410c8a13367da04fe0f20ee2abd48..8d22557a6616775c4aee8c40bacd1c973aa45f2c 100644 (file)
@@ -230,4 +230,13 @@ clear: both;
         cursor: pointer;
         font-weight: bold;
     }
+}
+.text-success {
+    color: #3c763d;
+}
+.text-blue {
+    color: #15c;
+}
+.text-red {
+    color: #DD4B39;
 }
\ No newline at end of file
index 1847c44e53c3b097c8858a7af805db9c847691fb..abc2f9387460ed4cd5ec6689e494eb837790da28 100644 (file)
 .repo-user-list-block {
     position: relative;
     top: 5px;
+}
+.setting-list {
+    width: 100%;
+    list-style: none;
 }
\ No newline at end of file
index 076c30bb6bb8d5e0112887436b0b72707c750c18..c908af3b63a609b4fbdfde9e2a96ed62ee181fa5 100644 (file)
     }
 }
 
+#repo-hooks-panel,
 #user-ssh-panel {
-  margin-bottom: 20px;
-  .switching-list {
-    background-color: #FFF;
-    li {
-      padding: 8px 20px;
-      &.ssh:hover {
-        background-color: #ffffEE;
-      }
+    margin-bottom: 20px;
+    .setting-list {
+        background-color: #FFF;
+        li {
+            padding: 8px 20px;
+            border-bottom: 1px solid #eaeaea;
+            &.ssh:hover {
+                background-color: #ffffEE;
+            }
+            i {
+                padding-right: 5px;
+            }
+        }
     }
-  }
-  .active-icon {
-    width: 10px;
-    height: 10px;
-    border-radius: 6px;
-    padding: 0;
-    margin-right: 20px;
-    margin-top: 10px;
-  }
-  .ssh-content {
-    margin-left: 24px;
-    .octicon {
-      margin-right: 4px;
+    .active-icon {
+        width: 10px;
+        height: 10px;
+        border-radius: 6px;
+        padding: 0;
+        margin-right: 20px;
+        margin-top: 10px;
     }
-    .print,
-    .activity {
-      color: #888;
+    .ssh-content {
+        margin-left: 24px;
+        .octicon {
+            margin-right: 4px;
+        }
+        .print,
+        .activity {
+            color: #888;
+        }
+    }
+    .ssh-delete-btn {
+        margin-top: 6px;
     }
-  }
-  .ssh-delete-btn {
-    margin-top: 6px;
-  }
 }
 
 #user-ssh-add-form {
index 017432935f83e74e5a87ee223814af8edfb625c1..268baea8820068739ee5ab44fd1997fd6ea62704 100644 (file)
 .btn-active {
   box-shadow: 0 0 0 1px rgba(0, 0, 0, .1) inset, 0 0 4px rgba(0, 0, 0, .15) inset
 }
+.btn-header {
+    margin-top: -1px;
+    color: white;
+    padding: 0 10px;
+}
 
 .btn-radius {
   border-radius: .25em;
index 04d1198969b2125254fe079d6d330059a63ccfe8..af497ca14d022df7fa97b345c043da59ab898433 100644 (file)
@@ -360,11 +360,11 @@ p {
 // truncate element
 
 .text-truncate {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  display: inline-block;
-  vertical-align: top;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    display: inline-block;
+    vertical-align: top;
 }
 
 // code elements
index 484cefb6211b77e893cb25e6514ec4eac1589da4..5867d161e4c39f93e0c639245aad870d6af297f4 100644 (file)
@@ -23,8 +23,8 @@ import (
 const (
        SETTINGS_OPTIONS base.TplName = "repo/settings/options"
        COLLABORATION    base.TplName = "repo/settings/collaboration"
+       HOOKS            base.TplName = "repo/settings/hooks"
 
-       HOOKS     base.TplName = "repo/hooks"
        HOOK_ADD  base.TplName = "repo/hook_add"
        HOOK_EDIT base.TplName = "repo/hook_edit"
 )
@@ -215,69 +215,25 @@ func SettingsCollaboration(ctx *middleware.Context) {
        ctx.HTML(200, COLLABORATION)
 }
 
-func SettingsCollaborationPost(ctx *middleware.Context) {
-       repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/")
-       name := strings.ToLower(ctx.Query("collaborator"))
-       if len(name) == 0 || ctx.Repo.Owner.LowerName == name {
-               ctx.Redirect(ctx.Req.RequestURI)
-               return
-       }
-       has, err := models.HasAccess(name, repoLink, models.WRITABLE)
-       if err != nil {
-               ctx.Handle(500, "setting.CollaborationPost(HasAccess)", err)
-               return
-       } else if has {
-               ctx.Redirect(ctx.Req.RequestURI)
-               return
-       }
-
-       u, err := models.GetUserByName(name)
-       if err != nil {
-               if err == models.ErrUserNotExist {
-                       ctx.Flash.Error("Given user does not exist.")
-                       ctx.Redirect(ctx.Req.RequestURI)
-               } else {
-                       ctx.Handle(500, "setting.CollaborationPost(GetUserByName)", err)
-               }
-               return
-       }
-
-       if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink,
-               Mode: models.WRITABLE}); err != nil {
-               ctx.Handle(500, "setting.CollaborationPost(AddAccess)", err)
-               return
-       }
-
-       if setting.Service.EnableNotifyMail {
-               if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
-                       ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err)
-                       return
-               }
-       }
-
-       ctx.Flash.Success("New collaborator has been added.")
-       ctx.Redirect(ctx.Req.RequestURI)
-}
-
-func WebHooks(ctx *middleware.Context) {
-       ctx.Data["IsRepoToolbarWebHooks"] = true
-       ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Webhooks"
+func Webhooks(ctx *middleware.Context) {
+       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["PageIsSettingsHooks"] = true
 
-       // Delete webhook.
+       // Delete web hook.
        remove := com.StrTo(ctx.Query("remove")).MustInt64()
        if remove > 0 {
                if err := models.DeleteWebhook(remove); err != nil {
-                       ctx.Handle(500, "setting.WebHooks(DeleteWebhook)", err)
+                       ctx.Handle(500, "DeleteWebhook", err)
                        return
                }
-               ctx.Flash.Success("Webhook has been removed.")
+               ctx.Flash.Success(ctx.Tr("repo.settings.remove_hook_success"))
                ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks")
                return
        }
 
        ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
        if err != nil {
-               ctx.Handle(500, "setting.WebHooks(GetWebhooksByRepoId)", err)
+               ctx.Handle(500, "GetWebhooksByRepoId", err)
                return
        }
 
index 0621825f4bcc6e6611bae48d1d2fd2685af25c28..760339a99761cc8f6ba264b31a3b58f81c19ae32 100644 (file)
@@ -1 +1 @@
-0.4.7.0807 Alpha
\ No newline at end of file
+0.4.7.0809 Alpha
\ No newline at end of file
diff --git a/templates/repo/hooks.tmpl b/templates/repo/hooks.tmpl
deleted file mode 100644 (file)
index 85132e4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-{{template "base/head" .}}
-{{template "base/navbar" .}}
-{{template "repo/nav" .}}
-{{template "repo/toolbar" .}}
-<div id="body" class="container">
-    {{template "repo/setting_nav" .}}
-    <div id="repo-setting-container" class="col-md-10">
-        {{template "base/alert" .}}
-        <div class="panel panel-default">
-            <div class="panel-heading">
-                Webhooks
-            </div>
-            <div class="panel-body">
-                <p>Webhooks allow external services to be notified when certain events happen on GitHub. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our Webhooks Guide.<br/>&nbsp;</p>
-                <ul id="repo-hooks-list" class="list-unstyled">
-                    {{range .Webhooks}}
-                    <li>
-                        {{if .IsActive}}<span class="pull-left status text-success"><i class="fa fa-check"></i></span>{{else}}<span class="pull-left status"><i class="fa fa-times"></i></span>{{end}}
-                        <a class="link" href="{{$.RepoLink}}/settings/hooks/{{.Id}}">{{.Url}}</a>
-                        <a href="{{$.RepoLink}}/settings/hooks?remove={{.Id}}" class="remove-hook pull-right"><i class="fa fa-times"></i></a>
-                        <a href="{{$.RepoLink}}/settings/hooks/{{.Id}}" class="edit-hook pull-right"><i class="fa fa-pencil"></i></a>
-                    </li>
-                    {{end}}
-                </ul>
-            </div>
-            <div class="panel-footer">
-                <a href="{{.RepoLink}}/settings/hooks/add"><button class="btn btn-primary">Add Webhook</button></a>
-            </div>
-        </div>
-
-    </div>
-</div>
-{{template "base/footer" .}}
\ No newline at end of file
diff --git a/templates/repo/settings/hooks.tmpl b/templates/repo/settings/hooks.tmpl
new file mode 100644 (file)
index 0000000..7081e78
--- /dev/null
@@ -0,0 +1,35 @@
+{{template "ng/base/head" .}}
+{{template "ng/base/header" .}}
+<div id="repo-wrapper">
+    {{template "repo/header" .}}
+       <div id="setting-wrapper" class="main-wrapper">
+           <div id="repo-setting" class="container clear">
+               {{template "repo/settings/nav" .}}
+               <div class="grid-4-5 left">
+                   <div class="setting-content">
+                       {{template "ng/base/alert" .}}
+                       <div id="setting-content">
+                           <div id="repo-hooks-panel" class="panel panel-radius">
+                               <div class="panel-header">
+                               <a class="btn btn-small btn-black btn-header btn-radius right" href="{{.RepoLink}}/settings/hooks/new">{{.i18n.Tr "repo.settings.add_webhook"}}</a>
+                                       <strong>{{.i18n.Tr "repo.settings.hooks"}}</strong>
+                               </div>
+                               <ul class="panel-body setting-list">
+                               <li>{{.i18n.Tr "repo.settings.hooks_desc" | Str2html}}</li>
+                               {{range .Webhooks}}
+                                                               <li>
+                                                                       {{if .IsActive}}<span class="left text-success"><i class="fa fa-check"></i></span>{{else}}<span class="pull-left status"><i class="fa fa-times"></i></span>{{end}}
+                                                                       <a class="link" href="{{$.RepoLink}}/settings/hooks/{{.Id}}">{{.Url}}</a>
+                                                                       <a href="{{$.RepoLink}}/settings/hooks?remove={{.Id}}" class="text-red right"><i class="fa fa-times"></i></a>
+                                               <a href="{{$.RepoLink}}/settings/hooks/{{.Id}}" class="text-blue right"><i class="fa fa-pencil"></i></a>
+                                                               </li>
+                               {{end}}
+                               </ul>
+                           </div>
+                       </div>
+                   </div>
+               </div>
+           </div>
+       </div>
+</div>
+{{template "ng/base/footer" .}}
\ No newline at end of file
index 2d09975f4d6e4e634390f27ae9df5e88c660a9f6..33e6a944d7155e147e33dbe381986dfc771a7bb8 100644 (file)
@@ -8,38 +8,40 @@
                 {{template "ng/base/alert" .}}
                 <div id="setting-content">
                     <div id="user-profile-setting-content" class="panel panel-radius">
-                        <p class="panel-header"><strong>{{.i18n.Tr "settings.public_profile"}}</strong></p>
+                        <div class="panel-header">
+                            <strong>{{.i18n.Tr "settings.public_profile"}}</strong>
+                        </div>
                         <form class="form form-align panel-body" id="user-profile-form" action="/user/settings" method="post">
                             {{.CsrfTokenHtml}}
-                               <p class="text-center panel-desc">{{.i18n.Tr "settings.profile_desc"}}</p>
-                            <p class="field">
+                               <div class="text-center panel-desc">{{.i18n.Tr "settings.profile_desc"}}</div>
+                            <div class="field">
                                 <label class="req" for="username">{{.i18n.Tr "username"}}</label>
                                 <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="username" name="uname" type="text" value="{{.SignedUser.Name}}" data-uname="{{.SignedUser.Name}}" required />
-                            </p>
-                            <p class="field">
+                            </div>
+                            <div class="field">
                                 <label for="full-name">{{.i18n.Tr "settings.full_name"}}</label>
                                 <input class="ipt ipt-large ipt-radius {{if .Err_FullName}}ipt-error{{end}}" id="full-name" name="fullname" type="text" value="{{.SignedUser.FullName}}" />
-                            </p>
-                            <p class="field">
+                            </div>
+                            <div class="field">
                                 <label class="req" for="email">{{.i18n.Tr "email"}}</label>
                                 <input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email" value="{{.SignedUser.Email}}" required />
-                            </p>
-                            <p class="field">
+                            </div>
+                            <div class="field">
                                 <label for="website">{{.i18n.Tr "settings.website"}}</label>
                                 <input class="ipt ipt-large ipt-radius {{if .Err_Website}}ipt-error{{end}}" id="website" name="website" type="url" value="{{.SignedUser.Website}}" />
-                            </p>
-                            <p class="field">
+                            </div>
+                            <div class="field">
                                 <label for="location">{{.i18n.Tr "settings.location"}}</label>
                                 <input class="ipt ipt-large ipt-radius {{if .Err_Location}}ipt-error{{end}}" id="location" name="location" type="text" value="{{.SignedUser.Location}}" />
-                            </p>
-                            <p class="field">
+                            </div>
+                            <div class="field">
                                 <label for="gravatar-email">Gravatar {{.i18n.Tr "email"}}</label>
                                 <input class="ipt ipt-large ipt-radius {{if .Err_Avatar}}ipt-error{{end}}" id="gravatar-email" name="avatar" type="text" value="{{.SignedUser.AvatarEmail}}" />
-                            </p>
-                            <p class="field">
+                            </div>
+                            <div class="field">
                                 <span class="form-label"></span>
                                 <button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "settings.update_profile"}}</button>
-                            </p>
+                            </div>
                         </form>
                     </div>
                 </div>
index 43dfb66e261010a4f0c7c2a22fbb798f23cea853..ed54cbf5b6ecdf5ec2953c8a01e4b91781784238 100644 (file)
@@ -8,11 +8,11 @@
                 {{template "ng/base/alert" .}}
                 <div id="user-ssh-setting-content">
                     <div id="user-ssh-panel" class="panel panel-radius">
-                        <p class="panel-header">
-                            <button class="btn btn-small btn-black btn-radius right" id="ssh-add">{{.i18n.Tr "settings.add_key"}}</button>
+                        <div class="panel-header">
+                            <a class="btn btn-small btn-black btn-header btn-radius right" id="ssh-add">{{.i18n.Tr "settings.add_key"}}</a>
                             <strong>{{.i18n.Tr "settings.manage_ssh_keys"}}</strong>
-                        </p>
-                        <ul class="panel-body menu menu-vertical switching-list">
+                        </div>
+                        <ul class="panel-body setting-list">
                             <li>{{.i18n.Tr "settings.ssh_desc"}}</li>
                             {{range .Keys}}
                             <li class="ssh clear">