]> source.dussan.org Git - gitea.git/commitdiff
new create webhook UI
authorUnknwon <u@gogs.io>
Wed, 26 Aug 2015 16:30:06 +0000 (00:30 +0800)
committerUnknwon <u@gogs.io>
Wed, 26 Aug 2015 16:30:06 +0000 (00:30 +0800)
22 files changed:
cmd/web.go
config.codekit
gogs.go
models/slack.go [deleted file]
models/webhook_slack.go [new file with mode: 0644]
modules/auth/repo_form.go
modules/middleware/context.go
modules/setting/setting.go
public/css/gogs.min.css
public/img/slack.png [new file with mode: 0644]
public/less/_form.less
routers/repo/setting.go
templates/.VERSION
templates/org/settings/hook_new.tmpl
templates/repo/settings/hook_delete_modal.tmpl [new file with mode: 0644]
templates/repo/settings/hook_gogs.tmpl
templates/repo/settings/hook_history.tmpl [new file with mode: 0644]
templates/repo/settings/hook_list.tmpl
templates/repo/settings/hook_new.tmpl
templates/repo/settings/hook_settings.tmpl
templates/repo/settings/hook_slack.tmpl
templates/repo/settings/hook_types.tmpl [deleted file]

index c661c13063b758ce77a153d2fd0c019691590c17..03b34befaa1c952fca824f692e1608493d65ec4f 100644 (file)
@@ -411,11 +411,11 @@ func runWeb(ctx *cli.Context) {
                                m.Group("/hooks", func() {
                                        m.Get("", org.Webhooks)
                                        m.Post("/delete", org.DeleteWebhook)
+                                       m.Get("/:type/new", repo.WebhooksNew)
+                                       m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
+                                       m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
                                })
 
-                               m.Get("/hooks/new", repo.WebHooksNew)
-                               m.Post("/hooks/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
-                               m.Post("/hooks/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
                                m.Get("/hooks/:id", repo.WebHooksEdit)
                                m.Post("/hooks/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
                                m.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost)
@@ -449,10 +449,11 @@ func runWeb(ctx *cli.Context) {
                        m.Group("/hooks", func() {
                                m.Get("", repo.Webhooks)
                                m.Post("/delete", repo.DeleteWebhook)
+                               m.Get("/:type/new", repo.WebhooksNew)
+                               m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
+                               m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
                        })
-                       m.Get("/hooks/new", repo.WebHooksNew)
-                       m.Post("/hooks/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
-                       m.Post("/hooks/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
+
                        m.Get("/hooks/:id", repo.WebHooksEdit)
                        m.Post("/hooks/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
                        m.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost)
index 34b4f2ad29cc766a1b1221dd88e9c8de56b6c809..b425de26580591d2d90702cc67115465d1b943fc 100644 (file)
                "outputPathIsSetByUser": 0,
                "processed": 1
                },
+       "\/public\/img\/slack.png": {
+               "fileType": 32768,
+               "ignore": 0,
+               "ignoreWasSetByUser": 0,
+               "initialSize": 1633,
+               "inputAbbreviatedPath": "\/public\/img\/slack.png",
+               "outputAbbreviatedPath": "\/public\/img\/slack.png",
+               "outputPathIsOutsideProject": 0,
+               "outputPathIsSetByUser": 0,
+               "processed": 0
+               },
        "\/public\/less\/_admin.less": {
                "allowInsecureImports": 0,
                "createSourceMap": 0,
diff --git a/gogs.go b/gogs.go
index 39d8967745d130e827cb52b6c314a7fe918f231d..f661dc77db34de5e51898faf90fe7cd98aaa6d9d 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
        "github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.6.6.0826 Beta"
+const APP_VER = "0.6.6.0827 Beta"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/slack.go b/models/slack.go
deleted file mode 100644 (file)
index 0b1b579..0000000
+++ /dev/null
@@ -1,115 +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 models
-
-import (
-       "encoding/json"
-       "errors"
-       "fmt"
-       "strings"
-)
-
-const (
-       SLACK_COLOR string = "#dd4b39"
-)
-
-type Slack struct {
-       Channel string `json:"channel"`
-}
-
-type SlackPayload struct {
-       Channel     string            `json:"channel"`
-       Text        string            `json:"text"`
-       Username    string            `json:"username"`
-       IconUrl     string            `json:"icon_url"`
-       UnfurlLinks int               `json:"unfurl_links"`
-       LinkNames   int               `json:"link_names"`
-       Attachments []SlackAttachment `json:"attachments"`
-}
-
-type SlackAttachment struct {
-       Color string `json:"color"`
-       Text  string `json:"text"`
-}
-
-func (p SlackPayload) GetJSONPayload() ([]byte, error) {
-       data, err := json.Marshal(p)
-       if err != nil {
-               return []byte{}, err
-       }
-       return data, nil
-}
-
-func GetSlackPayload(p *Payload, meta string) (*SlackPayload, error) {
-       slack := &Slack{}
-       slackPayload := &SlackPayload{}
-       if err := json.Unmarshal([]byte(meta), &slack); err != nil {
-               return slackPayload, errors.New("GetSlackPayload meta json:" + err.Error())
-       }
-
-       // TODO: handle different payload types: push, new branch, delete branch etc.
-       // when they are added to gogs. Only handles push now
-       return getSlackPushPayload(p, slack)
-}
-
-func getSlackPushPayload(p *Payload, slack *Slack) (*SlackPayload, error) {
-       // n new commits
-       refSplit := strings.Split(p.Ref, "/")
-       branchName := refSplit[len(refSplit)-1]
-       var commitString string
-
-       if len(p.Commits) == 1 {
-               commitString = "1 new commit"
-               if p.CompareUrl != "" {
-                       commitString = SlackLinkFormatter(p.CompareUrl, commitString)
-               }
-       } else {
-               commitString = fmt.Sprintf("%d new commits", len(p.Commits))
-               if p.CompareUrl != "" {
-                       commitString = SlackLinkFormatter(p.CompareUrl, commitString)
-               }
-       }
-
-       repoLink := SlackLinkFormatter(p.Repo.Url, p.Repo.Name)
-       branchLink := SlackLinkFormatter(p.Repo.Url+"/src/"+branchName, branchName)
-       text := fmt.Sprintf("[%s:%s] %s pushed by %s", repoLink, branchLink, commitString, p.Pusher.Name)
-       var attachmentText string
-
-       // for each commit, generate attachment text
-       for i, commit := range p.Commits {
-               attachmentText += fmt.Sprintf("%s: %s - %s", SlackLinkFormatter(commit.Url, commit.Id[:7]), SlackTextFormatter(commit.Message), SlackTextFormatter(commit.Author.Name))
-               // add linebreak to each commit but the last
-               if i < len(p.Commits)-1 {
-                       attachmentText += "\n"
-               }
-       }
-
-       slackAttachments := []SlackAttachment{{Color: SLACK_COLOR, Text: attachmentText}}
-
-       return &SlackPayload{
-               Channel:     slack.Channel,
-               Text:        text,
-               Username:    "gogs",
-               IconUrl:     "https://raw.githubusercontent.com/gogits/gogs/master/public/img/favicon.png",
-               UnfurlLinks: 0,
-               LinkNames:   0,
-               Attachments: slackAttachments,
-       }, nil
-}
-
-// see: https://api.slack.com/docs/formatting
-func SlackTextFormatter(s string) string {
-       // take only first line of commit
-       first := strings.Split(s, "\n")[0]
-       // replace & < >
-       first = strings.Replace(first, "&", "&amp;", -1)
-       first = strings.Replace(first, "<", "&lt;", -1)
-       first = strings.Replace(first, ">", "&gt;", -1)
-       return first
-}
-
-func SlackLinkFormatter(url string, text string) string {
-       return fmt.Sprintf("<%s|%s>", url, SlackTextFormatter(text))
-}
diff --git a/models/webhook_slack.go b/models/webhook_slack.go
new file mode 100644 (file)
index 0000000..0b1b579
--- /dev/null
@@ -0,0 +1,115 @@
+// 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 models
+
+import (
+       "encoding/json"
+       "errors"
+       "fmt"
+       "strings"
+)
+
+const (
+       SLACK_COLOR string = "#dd4b39"
+)
+
+type Slack struct {
+       Channel string `json:"channel"`
+}
+
+type SlackPayload struct {
+       Channel     string            `json:"channel"`
+       Text        string            `json:"text"`
+       Username    string            `json:"username"`
+       IconUrl     string            `json:"icon_url"`
+       UnfurlLinks int               `json:"unfurl_links"`
+       LinkNames   int               `json:"link_names"`
+       Attachments []SlackAttachment `json:"attachments"`
+}
+
+type SlackAttachment struct {
+       Color string `json:"color"`
+       Text  string `json:"text"`
+}
+
+func (p SlackPayload) GetJSONPayload() ([]byte, error) {
+       data, err := json.Marshal(p)
+       if err != nil {
+               return []byte{}, err
+       }
+       return data, nil
+}
+
+func GetSlackPayload(p *Payload, meta string) (*SlackPayload, error) {
+       slack := &Slack{}
+       slackPayload := &SlackPayload{}
+       if err := json.Unmarshal([]byte(meta), &slack); err != nil {
+               return slackPayload, errors.New("GetSlackPayload meta json:" + err.Error())
+       }
+
+       // TODO: handle different payload types: push, new branch, delete branch etc.
+       // when they are added to gogs. Only handles push now
+       return getSlackPushPayload(p, slack)
+}
+
+func getSlackPushPayload(p *Payload, slack *Slack) (*SlackPayload, error) {
+       // n new commits
+       refSplit := strings.Split(p.Ref, "/")
+       branchName := refSplit[len(refSplit)-1]
+       var commitString string
+
+       if len(p.Commits) == 1 {
+               commitString = "1 new commit"
+               if p.CompareUrl != "" {
+                       commitString = SlackLinkFormatter(p.CompareUrl, commitString)
+               }
+       } else {
+               commitString = fmt.Sprintf("%d new commits", len(p.Commits))
+               if p.CompareUrl != "" {
+                       commitString = SlackLinkFormatter(p.CompareUrl, commitString)
+               }
+       }
+
+       repoLink := SlackLinkFormatter(p.Repo.Url, p.Repo.Name)
+       branchLink := SlackLinkFormatter(p.Repo.Url+"/src/"+branchName, branchName)
+       text := fmt.Sprintf("[%s:%s] %s pushed by %s", repoLink, branchLink, commitString, p.Pusher.Name)
+       var attachmentText string
+
+       // for each commit, generate attachment text
+       for i, commit := range p.Commits {
+               attachmentText += fmt.Sprintf("%s: %s - %s", SlackLinkFormatter(commit.Url, commit.Id[:7]), SlackTextFormatter(commit.Message), SlackTextFormatter(commit.Author.Name))
+               // add linebreak to each commit but the last
+               if i < len(p.Commits)-1 {
+                       attachmentText += "\n"
+               }
+       }
+
+       slackAttachments := []SlackAttachment{{Color: SLACK_COLOR, Text: attachmentText}}
+
+       return &SlackPayload{
+               Channel:     slack.Channel,
+               Text:        text,
+               Username:    "gogs",
+               IconUrl:     "https://raw.githubusercontent.com/gogits/gogs/master/public/img/favicon.png",
+               UnfurlLinks: 0,
+               LinkNames:   0,
+               Attachments: slackAttachments,
+       }, nil
+}
+
+// see: https://api.slack.com/docs/formatting
+func SlackTextFormatter(s string) string {
+       // take only first line of commit
+       first := strings.Split(s, "\n")[0]
+       // replace & < >
+       first = strings.Replace(first, "&", "&amp;", -1)
+       first = strings.Replace(first, "<", "&lt;", -1)
+       first = strings.Replace(first, ">", "&gt;", -1)
+       return first
+}
+
+func SlackLinkFormatter(url string, text string) string {
+       return fmt.Sprintf("<%s|%s>", url, SlackTextFormatter(text))
+}
index cbabbb46683acf9b2e8d70a5ebf654b3df38ba6c..a0700e821ae5e3e53175df64d6ad6289d2380bf6 100644 (file)
@@ -65,13 +65,17 @@ func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) bi
 //   \__/\  /  \___  >___  /___|  /___|  /\____/|__|_ \
 //        \/       \/    \/     \/     \/            \/
 
+type WebhookForm struct {
+       HookType string `binding:"Required"`
+       PushOnly bool
+       Active   bool
+}
+
 type NewWebhookForm struct {
-       HookTaskType string `form:"hook_type" binding:"Required"`
-       PayloadUrl   string `form:"payload_url" binding:"Required;Url"`
-       ContentType  string `form:"content_type" binding:"Required"`
-       Secret       string `form:"secret"`
-       PushOnly     bool   `form:"push_only"`
-       Active       bool   `form:"active"`
+       PayloadURL  string `binding:"Required;Url"`
+       ContentType int    `binding:"Required"`
+       Secret      string
+       WebhookForm
 }
 
 func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
@@ -79,11 +83,9 @@ func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs binding.Errors) bin
 }
 
 type NewSlackHookForm struct {
-       HookTaskType string `form:"hook_type" binding:"Required"`
-       PayloadUrl   string `form:"payload_url" binding:"Required`
-       Channel      string `form:"channel" binding:"Required"`
-       PushOnly     bool   `form:"push_only"`
-       Active       bool   `form:"active"`
+       PayloadURL string `binding:"Required`
+       Channel    string `binding:"Required"`
+       WebhookForm
 }
 
 func (f *NewSlackHookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
index 8a8867da4d1c0c646f5c9e3a4f088c783ad14016..b25674f60f8e13842df5e9a36f1296835fe12ed8 100644 (file)
@@ -26,6 +26,27 @@ import (
        "github.com/gogits/gogs/modules/setting"
 )
 
+type RepoContext struct {
+       AccessMode   models.AccessMode
+       IsWatching   bool
+       IsBranch     bool
+       IsTag        bool
+       IsCommit     bool
+       Repository   *models.Repository
+       Owner        *models.User
+       Commit       *git.Commit
+       Tag          *git.Tag
+       GitRepo      *git.Repository
+       BranchName   string
+       TagName      string
+       TreeName     string
+       CommitId     string
+       RepoLink     string
+       CloneLink    models.CloneLink
+       CommitsCount int
+       Mirror       *models.Mirror
+}
+
 // Context represents context of a request.
 type Context struct {
        *macaron.Context
@@ -51,27 +72,6 @@ type Context struct {
        }
 }
 
-type RepoContext struct {
-       AccessMode   models.AccessMode
-       IsWatching   bool
-       IsBranch     bool
-       IsTag        bool
-       IsCommit     bool
-       Repository   *models.Repository
-       Owner        *models.User
-       Commit       *git.Commit
-       Tag          *git.Tag
-       GitRepo      *git.Repository
-       BranchName   string
-       TagName      string
-       TreeName     string
-       CommitId     string
-       RepoLink     string
-       CloneLink    models.CloneLink
-       CommitsCount int
-       Mirror       *models.Mirror
-}
-
 // IsOwner returns true if current user is the owner of repository.
 func (r RepoContext) IsOwner() bool {
        return r.AccessMode >= models.ACCESS_MODE_OWNER
index bb78201500a47612cb351cfd7d2e0f261770557c..f008f81a076bc516e3b7ad281a2b6de87ee81abf 100644 (file)
@@ -81,6 +81,7 @@ var (
                QueueLength    int
                DeliverTimeout int
                SkipTLSVerify  bool
+               Types          []string
        }
 
        // Repository settings.
@@ -599,6 +600,7 @@ func newWebhookService() {
        Webhook.QueueLength = sec.Key("QUEUE_LENGTH").MustInt(1000)
        Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5)
        Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool()
+       Webhook.Types = []string{"gogs", "slack"}
 }
 
 func NewServices() {
index b383202410c954326a3c0ae1bb05d9b8f430a4db..0abb7db43bf1850ea99eb80395e321824040aafc 100644 (file)
@@ -1 +1 @@
-@font-face{font-family:octicons;src:url(../fonts/octicons.eot?#iefix&v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d) format('embedded-opentype'),url(../fonts/octicons.woff?v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d) format('woff'),url(../fonts/octicons.ttf?v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d) format('truetype'),url(../fonts/octicons.svg?v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d#octicons) format('svg');font-weight:400;font-style:normal}.mega-octicon,.octicon{font:normal normal normal 16px/1 octicons;display:inline-block;text-decoration:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mega-octicon{font-size:32px}.octicon-alert:before{content:'\f02d'}.octicon-arrow-down:before{content:'\f03f'}.octicon-arrow-left:before{content:'\f040'}.octicon-arrow-right:before{content:'\f03e'}.octicon-arrow-small-down:before{content:'\f0a0'}.octicon-arrow-small-left:before{content:'\f0a1'}.octicon-arrow-small-right:before{content:'\f071'}.octicon-arrow-small-up:before{content:'\f09f'}.octicon-arrow-up:before{content:'\f03d'}.octicon-beaker:before,.octicon-microscope:before{content:'\f0dd'}.octicon-bell:before{content:'\f0de'}.octicon-book:before{content:'\f007'}.octicon-bookmark:before{content:'\f07b'}.octicon-briefcase:before{content:'\f0d3'}.octicon-broadcast:before{content:'\f048'}.octicon-browser:before{content:'\f0c5'}.octicon-bug:before{content:'\f091'}.octicon-calendar:before{content:'\f068'}.octicon-check:before{content:'\f03a'}.octicon-checklist:before{content:'\f076'}.octicon-chevron-down:before{content:'\f0a3'}.octicon-chevron-left:before{content:'\f0a4'}.octicon-chevron-right:before{content:'\f078'}.octicon-chevron-up:before{content:'\f0a2'}.octicon-circle-slash:before{content:'\f084'}.octicon-circuit-board:before{content:'\f0d6'}.octicon-clippy:before{content:'\f035'}.octicon-clock:before{content:'\f046'}.octicon-cloud-download:before{content:'\f00b'}.octicon-cloud-upload:before{content:'\f00c'}.octicon-code:before{content:'\f05f'}.octicon-color-mode:before{content:'\f065'}.octicon-comment-add:before,.octicon-comment:before{content:'\f02b'}.octicon-comment-discussion:before{content:'\f04f'}.octicon-credit-card:before{content:'\f045'}.octicon-dash:before{content:'\f0ca'}.octicon-dashboard:before{content:'\f07d'}.octicon-database:before{content:'\f096'}.octicon-clone:before,.octicon-desktop-download:before{content:'\f0dc'}.octicon-device-camera:before{content:'\f056'}.octicon-device-camera-video:before{content:'\f057'}.octicon-device-desktop:before{content:'\f27c'}.octicon-device-mobile:before{content:'\f038'}.octicon-diff:before{content:'\f04d'}.octicon-diff-added:before{content:'\f06b'}.octicon-diff-ignored:before{content:'\f099'}.octicon-diff-modified:before{content:'\f06d'}.octicon-diff-removed:before{content:'\f06c'}.octicon-diff-renamed:before{content:'\f06e'}.octicon-ellipsis:before{content:'\f09a'}.octicon-eye-unwatch:before,.octicon-eye-watch:before,.octicon-eye:before{content:'\f04e'}.octicon-file-binary:before{content:'\f094'}.octicon-file-code:before{content:'\f010'}.octicon-file-directory:before{content:'\f016'}.octicon-file-media:before{content:'\f012'}.octicon-file-pdf:before{content:'\f014'}.octicon-file-submodule:before{content:'\f017'}.octicon-file-symlink-directory:before{content:'\f0b1'}.octicon-file-symlink-file:before{content:'\f0b0'}.octicon-file-text:before{content:'\f011'}.octicon-file-zip:before{content:'\f013'}.octicon-flame:before{content:'\f0d2'}.octicon-fold:before{content:'\f0cc'}.octicon-gear:before{content:'\f02f'}.octicon-gift:before{content:'\f042'}.octicon-gist:before{content:'\f00e'}.octicon-gist-secret:before{content:'\f08c'}.octicon-git-branch-create:before,.octicon-git-branch-delete:before,.octicon-git-branch:before{content:'\f020'}.octicon-git-commit:before{content:'\f01f'}.octicon-git-compare:before{content:'\f0ac'}.octicon-git-merge:before{content:'\f023'}.octicon-git-pull-request-abandoned:before,.octicon-git-pull-request:before{content:'\f009'}.octicon-globe:before{content:'\f0b6'}.octicon-graph:before{content:'\f043'}.octicon-heart:before{content:'\2665'}.octicon-history:before{content:'\f07e'}.octicon-home:before{content:'\f08d'}.octicon-horizontal-rule:before{content:'\f070'}.octicon-hubot:before{content:'\f09d'}.octicon-inbox:before{content:'\f0cf'}.octicon-info:before{content:'\f059'}.octicon-issue-closed:before{content:'\f028'}.octicon-issue-opened:before{content:'\f026'}.octicon-issue-reopened:before{content:'\f027'}.octicon-jersey:before{content:'\f019'}.octicon-key:before{content:'\f049'}.octicon-keyboard:before{content:'\f00d'}.octicon-law:before{content:'\f0d8'}.octicon-light-bulb:before{content:'\f000'}.octicon-link:before{content:'\f05c'}.octicon-link-external:before{content:'\f07f'}.octicon-list-ordered:before{content:'\f062'}.octicon-list-unordered:before{content:'\f061'}.octicon-location:before{content:'\f060'}.octicon-gist-private:before,.octicon-git-fork-private:before,.octicon-lock:before,.octicon-mirror-private:before{content:'\f06a'}.octicon-logo-github:before{content:'\f092'}.octicon-mail:before{content:'\f03b'}.octicon-mail-read:before{content:'\f03c'}.octicon-mail-reply:before{content:'\f051'}.octicon-mark-github:before{content:'\f00a'}.octicon-markdown:before{content:'\f0c9'}.octicon-megaphone:before{content:'\f077'}.octicon-mention:before{content:'\f0be'}.octicon-milestone:before{content:'\f075'}.octicon-mirror-public:before,.octicon-mirror:before{content:'\f024'}.octicon-mortar-board:before{content:'\f0d7'}.octicon-mute:before{content:'\f080'}.octicon-no-newline:before{content:'\f09c'}.octicon-octoface:before{content:'\f008'}.octicon-organization:before{content:'\f037'}.octicon-package:before{content:'\f0c4'}.octicon-paintcan:before{content:'\f0d1'}.octicon-pencil:before{content:'\f058'}.octicon-person-add:before,.octicon-person-follow:before,.octicon-person:before{content:'\f018'}.octicon-pin:before{content:'\f041'}.octicon-plug:before{content:'\f0d4'}.octicon-file-add:before,.octicon-file-directory-create:before,.octicon-gist-new:before,.octicon-plus:before,.octicon-repo-create:before{content:'\f05d'}.octicon-primitive-dot:before{content:'\f052'}.octicon-primitive-square:before{content:'\f053'}.octicon-pulse:before{content:'\f085'}.octicon-question:before{content:'\f02c'}.octicon-quote:before{content:'\f063'}.octicon-radio-tower:before{content:'\f030'}.octicon-repo-delete:before,.octicon-repo:before{content:'\f001'}.octicon-repo-clone:before{content:'\f04c'}.octicon-repo-force-push:before{content:'\f04a'}.octicon-gist-fork:before,.octicon-repo-forked:before{content:'\f002'}.octicon-repo-pull:before{content:'\f006'}.octicon-repo-push:before{content:'\f005'}.octicon-rocket:before{content:'\f033'}.octicon-rss:before{content:'\f034'}.octicon-ruby:before{content:'\f047'}.octicon-screen-full:before{content:'\f066'}.octicon-screen-normal:before{content:'\f067'}.octicon-search-save:before,.octicon-search:before{content:'\f02e'}.octicon-server:before{content:'\f097'}.octicon-settings:before{content:'\f07c'}.octicon-shield:before{content:'\f0e1'}.octicon-log-in:before,.octicon-sign-in:before{content:'\f036'}.octicon-log-out:before,.octicon-sign-out:before{content:'\f032'}.octicon-squirrel:before{content:'\f0b2'}.octicon-star-add:before,.octicon-star-delete:before,.octicon-star:before{content:'\f02a'}.octicon-stop:before{content:'\f08f'}.octicon-repo-sync:before,.octicon-sync:before{content:'\f087'}.octicon-tag-add:before,.octicon-tag-remove:before,.octicon-tag:before{content:'\f015'}.octicon-telescope:before{content:'\f088'}.octicon-terminal:before{content:'\f0c8'}.octicon-three-bars:before{content:'\f05e'}.octicon-thumbsdown:before{content:'\f0db'}.octicon-thumbsup:before{content:'\f0da'}.octicon-tools:before{content:'\f031'}.octicon-trashcan:before{content:'\f0d0'}.octicon-triangle-down:before{content:'\f05b'}.octicon-triangle-left:before{content:'\f044'}.octicon-triangle-right:before{content:'\f05a'}.octicon-triangle-up:before{content:'\f0aa'}.octicon-unfold:before{content:'\f039'}.octicon-unmute:before{content:'\f0ba'}.octicon-versions:before{content:'\f064'}.octicon-watch:before{content:'\f0e0'}.octicon-remove-close:before,.octicon-x:before{content:'\f081'}.octicon-zap:before{content:'\26A1'}body{font-family:'Helvetica Neue',Arial,Helvetica,sans-serif,'微软雅黑';background-color:#FAFAFA}img{border-radius:3px}.full.height{padding:0;margin:0 0 -80px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .head.link.item{padding-right:0!important}.following.bar .head.link.item .dropdown.icon,.following.bar .head.link.item .menu .octicon{margin-right:5px}.following.bar .avatar>.ui.image{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .octicon{width:16px;text-align:center}.ui.left{float:left}.ui.right{float:right}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.green{color:#6cc644!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.header{background-color:#d9edf7!important;border-color:#85c5e5}.ui .info.segment{border-color:#85c5e5}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}footer{margin-top:54px!important;height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .ui.language.dropdown{z-index:10000}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}.mega-octicon.icon,.octicon.icon{font-family:octicons}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.markdown{overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;word-wrap:break-word}.markdown>:first-child{margin-top:0!important}.markdown>:last-child{margin-bottom:0!important}.markdown a:not([href]){color:inherit;text-decoration:none}.markdown .absent{color:#c00}.markdown .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown .anchor:focus{outline:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown h1 .octicon-link,.markdown h2 .octicon-link,.markdown h3 .octicon-link,.markdown h4 .octicon-link,.markdown h5 .octicon-link,.markdown h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown h1:hover .anchor,.markdown h2:hover .anchor,.markdown h3:hover .anchor,.markdown h4:hover .anchor,.markdown h5:hover .anchor,.markdown h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown h1:hover .anchor .octicon-link,.markdown h2:hover .anchor .octicon-link,.markdown h3:hover .anchor .octicon-link,.markdown h4:hover .anchor .octicon-link,.markdown h5:hover .anchor .octicon-link,.markdown h6:hover .anchor .octicon-link{display:inline-block}.markdown h1 code,.markdown h1 tt,.markdown h2 code,.markdown h2 tt,.markdown h3 code,.markdown h3 tt,.markdown h4 code,.markdown h4 tt,.markdown h5 code,.markdown h5 tt,.markdown h6 code,.markdown h6 tt{font-size:inherit}.markdown h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown h1 .anchor{line-height:1}.markdown h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown h2 .anchor{line-height:1}.markdown h3{font-size:1.5em;line-height:1.43}.markdown h3 .anchor{line-height:1.2}.markdown h4{font-size:1.25em}.markdown h4 .anchor{line-height:1.2}.markdown h5{font-size:1em}.markdown h5 .anchor{line-height:1.1}.markdown h6{font-size:1em;color:#777}.markdown h6 .anchor{line-height:1.1}.markdown blockquote,.markdown dl,.markdown ol,.markdown p,.markdown pre,.markdown table,.markdown ul{margin-top:0;margin-bottom:16px}.markdown hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown ol,.markdown ul{padding-left:2em}.markdown ol.no-list,.markdown ul.no-list{padding:0;list-style-type:none}.markdown ol ol,.markdown ol ul,.markdown ul ol,.markdown ul ul{margin-top:0;margin-bottom:0}.markdown ol ol,.markdown ul ol{list-style-type:lower-roman}.markdown li>p{margin-top:16px}.markdown dl{padding:0}.markdown dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown dl dd{padding:0 16px;margin-bottom:16px}.markdown blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown blockquote>:first-child{margin-top:0}.markdown blockquote>:last-child{margin-bottom:0}.markdown table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown table th{font-weight:700}.markdown table td,.markdown table th{padding:6px 13px!important;border:1px solid #ddd}.markdown table tr{background-color:#fff;border-top:1px solid #ccc}.markdown table tr:nth-child(2n){background-color:#f8f8f8}.markdown img{max-width:100%;box-sizing:border-box}.markdown .emoji{max-width:none}.markdown span.frame{display:block;overflow:hidden}.markdown span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown span.frame span img{display:block;float:left}.markdown span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown span.align-center{display:block;overflow:hidden;clear:both}.markdown span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown span.align-center span img{margin:0 auto;text-align:center}.markdown span.align-right{display:block;overflow:hidden;clear:both}.markdown span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown span.align-right span img{margin:0;text-align:right}.markdown span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown span.float-left span{margin:13px 0 0}.markdown span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown code,.markdown tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown code:after,.markdown code:before,.markdown tt:after,.markdown tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown code br,.markdown tt br{display:none}.markdown del code{text-decoration:inherit}.markdown pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown .highlight{margin-bottom:16px}.markdown .highlight pre,.markdown pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown .highlight pre{margin-bottom:0;word-break:normal}.markdown pre{word-wrap:normal}.markdown pre code,.markdown pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown pre code:after,.markdown pre code:before,.markdown pre tt:after,.markdown pre tt:before{content:normal}.markdown kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown .csv-data td,.markdown .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown .csv-data tr{border-top:0}.markdown .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.pln{color:#333}@media screen{.str{color:#d14}.kwd{color:#333}.com{color:#998;font-style:italic}.typ{color:#458}.lit{color:#458}.pun{color:#333}.opn{color:#333}.clo{color:#333}.tag{color:navy}.atn{color:teal}.atv{color:#d14}.dec{color:#333}.var{color:teal}.fun{color:#900}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:700}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:700}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006;font-weight:700}.atn{color:#404}.atv{color:#060}}ol.linenums{margin-top:0;margin-bottom:0}.home{padding-bottom:80px}.home .logo{max-width:250px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif}.home .hero h1{font-size:7em}.home .hero h2{font-size:4em}.home .hero .octicon{color:#d9453d;font-size:60px;margin-right:10px}.home .hero.header{font-size:24px}.home p.large{font-size:20px}.home .stackable{padding-top:30px}.home a{color:#d9453d}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}.repository.new.fork form,.repository.new.migrate form{margin:auto;width:800px!important}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message{text-align:center}.repository.new.fork form .header,.repository.new.migrate form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help{margin-left:265px!important}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i{margin-right:0!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea{width:50%!important}.repository.edit.githook form .inline.field>label{text-align:right;width:25%!important;word-wrap:break-word}.repository.edit.githook form input,.repository.edit.githook form textarea{width:50%!important}.repository.edit.githook form textarea{width:70%!important}.repository{padding-top:15px;padding-bottom:80px}.repository .head .column{padding-top:5px!important;padding-bottom:5px!important}.repository .head .ui.compact.menu{margin-left:1rem}.repository .head .ui.header{margin-top:0}.repository .head .mega-octicon{width:30px;font-size:30px}.repository .head .ui.huge.breadcrumb{font-weight:300;font-size:1.7rem}.repository .head .fork-flag{margin-left:38px;display:block;font-size:11px;line-height:10px;white-space:nowrap}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{padding-top:5px;padding-right:10px}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .filter.menu .label.color{margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin-left:-5px;margin-right:-7px}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions a.item{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content .header{font-weight:400;padding:auto 15px;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content .header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:150px}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;margin-left:-36px;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{font-size:35px;color:#6cc644}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .ui.right .search input{font-weight:400;padding:5px 10px}.repository.commits .header .ui.right .button{float:right;margin-left:5px;margin-top:1px}.repository .commits.table{font-size:13px}.repository .commits.table td:first-child,.repository .commits.table th:first-child{padding-left:15px}.repository .commits.table td{line-height:15px}.repository .commits.table .author{min-width:180px}.repository .commits.table .message span{max-width:500px}.repository .commits.table .date{width:120px}.repository .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:14px;padding:6px 10px 4px 10px;font-weight:400}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-box .count{margin-right:12px}.repository .diff-box .count .bar{background-color:#e75316;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .count .bar .add{background-color:#77c64a;height:12px}.repository .diff-box .file{color:#888}.repository .diff-file-box .header{border-bottom:1px solid #d4d4d5!important}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#999;background:#fafafa;width:1%}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:13px}.repository .diff-file-box .code-diff td{padding:0;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-right:1px solid #d4d4d5;padding:0 5px}.repository .diff-file-box .code-diff tbody tr.tag-code pre,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#E0E0E0!important;border-color:#ADADAD!important}.repository .diff-file-box .code-diff tbody tr.del-code pre,.repository .diff-file-box .code-diff tbody tr.del-code td{background-color:#ffe2dd!important;border-color:#e9aeae!important}.repository .diff-file-box .code-diff tbody tr.add-code pre,.repository .diff-file-box .code-diff tbody tr.add-code td{background-color:#d1ffd6!important;border-color:#b4e2b4!important}.repository .diff-file-box .code-diff tbody tr:hover td{background-color:#FFF8D2!important;border-color:#F0DB88!important}.repository .diff-file-box .code-diff tbody tr:hover pre{background-color:transparent!important}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.page.buttons{padding-top:15px}.ui.comments .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.comments .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .header,.settings .content .segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .key.list .item:not(:first-child){border-top:1px solid #eaeaea}.settings .key.list .ssh-key-state-indicator{float:left;color:gray;padding-left:10px;padding-top:10px}.settings .key.list .ssh-key-state-indicator.active{color:#6cc644}.settings .key.list .meta{padding-top:5px}.settings .key.list .print{color:#767676}.settings .key.list .activity{color:#666}.settings .hook.list .item:not(:first-child){border-top:1px solid #eaeaea}.settings .hook.list .item{padding:10px 20px}.settings .hook.list .item .fa,.settings .hook.list .item .octicon{width:20px}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.user{padding-top:15px;padding-bottom:80px}.user.settings .key.list .item.ui.grid{margin-top:15px}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.issues .context.user.menu{min-width:200px}.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.issues .filter.menu .item.active{background-color:#4183c4;color:#FFF}.dashboard.issues .ui.right .head.menu{margin-top:-5px}.dashboard.issues .ui.right .head.menu .item.active{color:#d9453d}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment td:first-child,.admin .table.segment th:first-child{padding-left:15px}
\ No newline at end of file
+@font-face{font-family:octicons;src:url(../fonts/octicons.eot?#iefix&v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d) format('embedded-opentype'),url(../fonts/octicons.woff?v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d) format('woff'),url(../fonts/octicons.ttf?v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d) format('truetype'),url(../fonts/octicons.svg?v=396334ee3da78f4302d25c758ae3e3ce5dc3c97d#octicons) format('svg');font-weight:400;font-style:normal}.mega-octicon,.octicon{font:normal normal normal 16px/1 octicons;display:inline-block;text-decoration:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mega-octicon{font-size:32px}.octicon-alert:before{content:'\f02d'}.octicon-arrow-down:before{content:'\f03f'}.octicon-arrow-left:before{content:'\f040'}.octicon-arrow-right:before{content:'\f03e'}.octicon-arrow-small-down:before{content:'\f0a0'}.octicon-arrow-small-left:before{content:'\f0a1'}.octicon-arrow-small-right:before{content:'\f071'}.octicon-arrow-small-up:before{content:'\f09f'}.octicon-arrow-up:before{content:'\f03d'}.octicon-beaker:before,.octicon-microscope:before{content:'\f0dd'}.octicon-bell:before{content:'\f0de'}.octicon-book:before{content:'\f007'}.octicon-bookmark:before{content:'\f07b'}.octicon-briefcase:before{content:'\f0d3'}.octicon-broadcast:before{content:'\f048'}.octicon-browser:before{content:'\f0c5'}.octicon-bug:before{content:'\f091'}.octicon-calendar:before{content:'\f068'}.octicon-check:before{content:'\f03a'}.octicon-checklist:before{content:'\f076'}.octicon-chevron-down:before{content:'\f0a3'}.octicon-chevron-left:before{content:'\f0a4'}.octicon-chevron-right:before{content:'\f078'}.octicon-chevron-up:before{content:'\f0a2'}.octicon-circle-slash:before{content:'\f084'}.octicon-circuit-board:before{content:'\f0d6'}.octicon-clippy:before{content:'\f035'}.octicon-clock:before{content:'\f046'}.octicon-cloud-download:before{content:'\f00b'}.octicon-cloud-upload:before{content:'\f00c'}.octicon-code:before{content:'\f05f'}.octicon-color-mode:before{content:'\f065'}.octicon-comment-add:before,.octicon-comment:before{content:'\f02b'}.octicon-comment-discussion:before{content:'\f04f'}.octicon-credit-card:before{content:'\f045'}.octicon-dash:before{content:'\f0ca'}.octicon-dashboard:before{content:'\f07d'}.octicon-database:before{content:'\f096'}.octicon-clone:before,.octicon-desktop-download:before{content:'\f0dc'}.octicon-device-camera:before{content:'\f056'}.octicon-device-camera-video:before{content:'\f057'}.octicon-device-desktop:before{content:'\f27c'}.octicon-device-mobile:before{content:'\f038'}.octicon-diff:before{content:'\f04d'}.octicon-diff-added:before{content:'\f06b'}.octicon-diff-ignored:before{content:'\f099'}.octicon-diff-modified:before{content:'\f06d'}.octicon-diff-removed:before{content:'\f06c'}.octicon-diff-renamed:before{content:'\f06e'}.octicon-ellipsis:before{content:'\f09a'}.octicon-eye-unwatch:before,.octicon-eye-watch:before,.octicon-eye:before{content:'\f04e'}.octicon-file-binary:before{content:'\f094'}.octicon-file-code:before{content:'\f010'}.octicon-file-directory:before{content:'\f016'}.octicon-file-media:before{content:'\f012'}.octicon-file-pdf:before{content:'\f014'}.octicon-file-submodule:before{content:'\f017'}.octicon-file-symlink-directory:before{content:'\f0b1'}.octicon-file-symlink-file:before{content:'\f0b0'}.octicon-file-text:before{content:'\f011'}.octicon-file-zip:before{content:'\f013'}.octicon-flame:before{content:'\f0d2'}.octicon-fold:before{content:'\f0cc'}.octicon-gear:before{content:'\f02f'}.octicon-gift:before{content:'\f042'}.octicon-gist:before{content:'\f00e'}.octicon-gist-secret:before{content:'\f08c'}.octicon-git-branch-create:before,.octicon-git-branch-delete:before,.octicon-git-branch:before{content:'\f020'}.octicon-git-commit:before{content:'\f01f'}.octicon-git-compare:before{content:'\f0ac'}.octicon-git-merge:before{content:'\f023'}.octicon-git-pull-request-abandoned:before,.octicon-git-pull-request:before{content:'\f009'}.octicon-globe:before{content:'\f0b6'}.octicon-graph:before{content:'\f043'}.octicon-heart:before{content:'\2665'}.octicon-history:before{content:'\f07e'}.octicon-home:before{content:'\f08d'}.octicon-horizontal-rule:before{content:'\f070'}.octicon-hubot:before{content:'\f09d'}.octicon-inbox:before{content:'\f0cf'}.octicon-info:before{content:'\f059'}.octicon-issue-closed:before{content:'\f028'}.octicon-issue-opened:before{content:'\f026'}.octicon-issue-reopened:before{content:'\f027'}.octicon-jersey:before{content:'\f019'}.octicon-key:before{content:'\f049'}.octicon-keyboard:before{content:'\f00d'}.octicon-law:before{content:'\f0d8'}.octicon-light-bulb:before{content:'\f000'}.octicon-link:before{content:'\f05c'}.octicon-link-external:before{content:'\f07f'}.octicon-list-ordered:before{content:'\f062'}.octicon-list-unordered:before{content:'\f061'}.octicon-location:before{content:'\f060'}.octicon-gist-private:before,.octicon-git-fork-private:before,.octicon-lock:before,.octicon-mirror-private:before{content:'\f06a'}.octicon-logo-github:before{content:'\f092'}.octicon-mail:before{content:'\f03b'}.octicon-mail-read:before{content:'\f03c'}.octicon-mail-reply:before{content:'\f051'}.octicon-mark-github:before{content:'\f00a'}.octicon-markdown:before{content:'\f0c9'}.octicon-megaphone:before{content:'\f077'}.octicon-mention:before{content:'\f0be'}.octicon-milestone:before{content:'\f075'}.octicon-mirror-public:before,.octicon-mirror:before{content:'\f024'}.octicon-mortar-board:before{content:'\f0d7'}.octicon-mute:before{content:'\f080'}.octicon-no-newline:before{content:'\f09c'}.octicon-octoface:before{content:'\f008'}.octicon-organization:before{content:'\f037'}.octicon-package:before{content:'\f0c4'}.octicon-paintcan:before{content:'\f0d1'}.octicon-pencil:before{content:'\f058'}.octicon-person-add:before,.octicon-person-follow:before,.octicon-person:before{content:'\f018'}.octicon-pin:before{content:'\f041'}.octicon-plug:before{content:'\f0d4'}.octicon-file-add:before,.octicon-file-directory-create:before,.octicon-gist-new:before,.octicon-plus:before,.octicon-repo-create:before{content:'\f05d'}.octicon-primitive-dot:before{content:'\f052'}.octicon-primitive-square:before{content:'\f053'}.octicon-pulse:before{content:'\f085'}.octicon-question:before{content:'\f02c'}.octicon-quote:before{content:'\f063'}.octicon-radio-tower:before{content:'\f030'}.octicon-repo-delete:before,.octicon-repo:before{content:'\f001'}.octicon-repo-clone:before{content:'\f04c'}.octicon-repo-force-push:before{content:'\f04a'}.octicon-gist-fork:before,.octicon-repo-forked:before{content:'\f002'}.octicon-repo-pull:before{content:'\f006'}.octicon-repo-push:before{content:'\f005'}.octicon-rocket:before{content:'\f033'}.octicon-rss:before{content:'\f034'}.octicon-ruby:before{content:'\f047'}.octicon-screen-full:before{content:'\f066'}.octicon-screen-normal:before{content:'\f067'}.octicon-search-save:before,.octicon-search:before{content:'\f02e'}.octicon-server:before{content:'\f097'}.octicon-settings:before{content:'\f07c'}.octicon-shield:before{content:'\f0e1'}.octicon-log-in:before,.octicon-sign-in:before{content:'\f036'}.octicon-log-out:before,.octicon-sign-out:before{content:'\f032'}.octicon-squirrel:before{content:'\f0b2'}.octicon-star-add:before,.octicon-star-delete:before,.octicon-star:before{content:'\f02a'}.octicon-stop:before{content:'\f08f'}.octicon-repo-sync:before,.octicon-sync:before{content:'\f087'}.octicon-tag-add:before,.octicon-tag-remove:before,.octicon-tag:before{content:'\f015'}.octicon-telescope:before{content:'\f088'}.octicon-terminal:before{content:'\f0c8'}.octicon-three-bars:before{content:'\f05e'}.octicon-thumbsdown:before{content:'\f0db'}.octicon-thumbsup:before{content:'\f0da'}.octicon-tools:before{content:'\f031'}.octicon-trashcan:before{content:'\f0d0'}.octicon-triangle-down:before{content:'\f05b'}.octicon-triangle-left:before{content:'\f044'}.octicon-triangle-right:before{content:'\f05a'}.octicon-triangle-up:before{content:'\f0aa'}.octicon-unfold:before{content:'\f039'}.octicon-unmute:before{content:'\f0ba'}.octicon-versions:before{content:'\f064'}.octicon-watch:before{content:'\f0e0'}.octicon-remove-close:before,.octicon-x:before{content:'\f081'}.octicon-zap:before{content:'\26A1'}body{font-family:'Helvetica Neue',Arial,Helvetica,sans-serif,'微软雅黑';background-color:#FAFAFA}img{border-radius:3px}.full.height{padding:0;margin:0 0 -80px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .head.link.item{padding-right:0!important}.following.bar .head.link.item .dropdown.icon,.following.bar .head.link.item .menu .octicon{margin-right:5px}.following.bar .avatar>.ui.image{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .octicon{width:16px;text-align:center}.ui.left{float:left}.ui.right{float:right}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.green{color:#6cc644!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.header{background-color:#d9edf7!important;border-color:#85c5e5}.ui .info.segment{border-color:#85c5e5}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}footer{margin-top:54px!important;height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .ui.language.dropdown{z-index:10000}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}.mega-octicon.icon,.octicon.icon{font-family:octicons}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.markdown{overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;word-wrap:break-word}.markdown>:first-child{margin-top:0!important}.markdown>:last-child{margin-bottom:0!important}.markdown a:not([href]){color:inherit;text-decoration:none}.markdown .absent{color:#c00}.markdown .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown .anchor:focus{outline:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown h1 .octicon-link,.markdown h2 .octicon-link,.markdown h3 .octicon-link,.markdown h4 .octicon-link,.markdown h5 .octicon-link,.markdown h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown h1:hover .anchor,.markdown h2:hover .anchor,.markdown h3:hover .anchor,.markdown h4:hover .anchor,.markdown h5:hover .anchor,.markdown h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown h1:hover .anchor .octicon-link,.markdown h2:hover .anchor .octicon-link,.markdown h3:hover .anchor .octicon-link,.markdown h4:hover .anchor .octicon-link,.markdown h5:hover .anchor .octicon-link,.markdown h6:hover .anchor .octicon-link{display:inline-block}.markdown h1 code,.markdown h1 tt,.markdown h2 code,.markdown h2 tt,.markdown h3 code,.markdown h3 tt,.markdown h4 code,.markdown h4 tt,.markdown h5 code,.markdown h5 tt,.markdown h6 code,.markdown h6 tt{font-size:inherit}.markdown h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown h1 .anchor{line-height:1}.markdown h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown h2 .anchor{line-height:1}.markdown h3{font-size:1.5em;line-height:1.43}.markdown h3 .anchor{line-height:1.2}.markdown h4{font-size:1.25em}.markdown h4 .anchor{line-height:1.2}.markdown h5{font-size:1em}.markdown h5 .anchor{line-height:1.1}.markdown h6{font-size:1em;color:#777}.markdown h6 .anchor{line-height:1.1}.markdown blockquote,.markdown dl,.markdown ol,.markdown p,.markdown pre,.markdown table,.markdown ul{margin-top:0;margin-bottom:16px}.markdown hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown ol,.markdown ul{padding-left:2em}.markdown ol.no-list,.markdown ul.no-list{padding:0;list-style-type:none}.markdown ol ol,.markdown ol ul,.markdown ul ol,.markdown ul ul{margin-top:0;margin-bottom:0}.markdown ol ol,.markdown ul ol{list-style-type:lower-roman}.markdown li>p{margin-top:16px}.markdown dl{padding:0}.markdown dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown dl dd{padding:0 16px;margin-bottom:16px}.markdown blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown blockquote>:first-child{margin-top:0}.markdown blockquote>:last-child{margin-bottom:0}.markdown table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown table th{font-weight:700}.markdown table td,.markdown table th{padding:6px 13px!important;border:1px solid #ddd}.markdown table tr{background-color:#fff;border-top:1px solid #ccc}.markdown table tr:nth-child(2n){background-color:#f8f8f8}.markdown img{max-width:100%;box-sizing:border-box}.markdown .emoji{max-width:none}.markdown span.frame{display:block;overflow:hidden}.markdown span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown span.frame span img{display:block;float:left}.markdown span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown span.align-center{display:block;overflow:hidden;clear:both}.markdown span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown span.align-center span img{margin:0 auto;text-align:center}.markdown span.align-right{display:block;overflow:hidden;clear:both}.markdown span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown span.align-right span img{margin:0;text-align:right}.markdown span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown span.float-left span{margin:13px 0 0}.markdown span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown code,.markdown tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown code:after,.markdown code:before,.markdown tt:after,.markdown tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown code br,.markdown tt br{display:none}.markdown del code{text-decoration:inherit}.markdown pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown .highlight{margin-bottom:16px}.markdown .highlight pre,.markdown pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown .highlight pre{margin-bottom:0;word-break:normal}.markdown pre{word-wrap:normal}.markdown pre code,.markdown pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown pre code:after,.markdown pre code:before,.markdown pre tt:after,.markdown pre tt:before{content:normal}.markdown kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown .csv-data td,.markdown .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown .csv-data tr{border-top:0}.markdown .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.pln{color:#333}@media screen{.str{color:#d14}.kwd{color:#333}.com{color:#998;font-style:italic}.typ{color:#458}.lit{color:#458}.pun{color:#333}.opn{color:#333}.clo{color:#333}.tag{color:navy}.atn{color:teal}.atv{color:#d14}.dec{color:#333}.var{color:teal}.fun{color:#900}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:700}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:700}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006;font-weight:700}.atn{color:#404}.atv{color:#060}}ol.linenums{margin-top:0;margin-bottom:0}.home{padding-bottom:80px}.home .logo{max-width:250px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif}.home .hero h1{font-size:7em}.home .hero h2{font-size:4em}.home .hero .octicon{color:#d9453d;font-size:60px;margin-right:10px}.home .hero.header{font-size:24px}.home p.large{font-size:20px}.home .stackable{padding-top:30px}.home a{color:#d9453d}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}.repository.new.fork form,.repository.new.migrate form{margin:auto;width:800px!important}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message{text-align:center}.repository.new.fork form .header,.repository.new.migrate form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help{margin-left:265px!important}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i{margin-right:0!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea{width:50%!important}.repository.edit.githook form .inline.field>label{text-align:right;width:25%!important;word-wrap:break-word}.repository.edit.githook form input,.repository.edit.githook form textarea{width:50%!important}.repository.edit.githook form textarea{width:70%!important}.new.webhook form .help{margin-left:25px}.repository{padding-top:15px;padding-bottom:80px}.repository .head .column{padding-top:5px!important;padding-bottom:5px!important}.repository .head .ui.compact.menu{margin-left:1rem}.repository .head .ui.header{margin-top:0}.repository .head .mega-octicon{width:30px;font-size:30px}.repository .head .ui.huge.breadcrumb{font-weight:300;font-size:1.7rem}.repository .head .fork-flag{margin-left:38px;display:block;font-size:11px;line-height:10px;white-space:nowrap}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{padding-top:5px;padding-right:10px}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .filter.menu .label.color{margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin-left:-5px;margin-right:-7px}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions a.item{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content .header{font-weight:400;padding:auto 15px;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content .header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:150px}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;margin-left:-36px;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{font-size:35px;color:#6cc644}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .ui.right .search input{font-weight:400;padding:5px 10px}.repository.commits .header .ui.right .button{float:right;margin-left:5px;margin-top:1px}.repository .commits.table{font-size:13px}.repository .commits.table td:first-child,.repository .commits.table th:first-child{padding-left:15px}.repository .commits.table td{line-height:15px}.repository .commits.table .author{min-width:180px}.repository .commits.table .message span{max-width:500px}.repository .commits.table .date{width:120px}.repository .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:14px;padding:6px 10px 4px 10px;font-weight:400}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-box .count{margin-right:12px}.repository .diff-box .count .bar{background-color:#e75316;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .count .bar .add{background-color:#77c64a;height:12px}.repository .diff-box .file{color:#888}.repository .diff-file-box .header{border-bottom:1px solid #d4d4d5!important}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#999;background:#fafafa;width:1%}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:13px}.repository .diff-file-box .code-diff td{padding:0;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-right:1px solid #d4d4d5;padding:0 5px}.repository .diff-file-box .code-diff tbody tr.tag-code pre,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#E0E0E0!important;border-color:#ADADAD!important}.repository .diff-file-box .code-diff tbody tr.del-code pre,.repository .diff-file-box .code-diff tbody tr.del-code td{background-color:#ffe2dd!important;border-color:#e9aeae!important}.repository .diff-file-box .code-diff tbody tr.add-code pre,.repository .diff-file-box .code-diff tbody tr.add-code td{background-color:#d1ffd6!important;border-color:#b4e2b4!important}.repository .diff-file-box .code-diff tbody tr:hover td{background-color:#FFF8D2!important;border-color:#F0DB88!important}.repository .diff-file-box .code-diff tbody tr:hover pre{background-color:transparent!important}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.page.buttons{padding-top:15px}.ui.comments .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.comments .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .header,.settings .content .segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .key.list .item:not(:first-child){border-top:1px solid #eaeaea}.settings .key.list .ssh-key-state-indicator{float:left;color:gray;padding-left:10px;padding-top:10px}.settings .key.list .ssh-key-state-indicator.active{color:#6cc644}.settings .key.list .meta{padding-top:5px}.settings .key.list .print{color:#767676}.settings .key.list .activity{color:#666}.settings .hook.list .item:not(:first-child){border-top:1px solid #eaeaea}.settings .hook.list .item{padding:10px 20px}.settings .hook.list .item .fa,.settings .hook.list .item .octicon{width:20px}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.user{padding-top:15px;padding-bottom:80px}.user.settings .key.list .item.ui.grid{margin-top:15px}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.issues .context.user.menu{min-width:200px}.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.issues .filter.menu .item.active{background-color:#4183c4;color:#FFF}.dashboard.issues .ui.right .head.menu{margin-top:-5px}.dashboard.issues .ui.right .head.menu .item.active{color:#d9453d}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment td:first-child,.admin .table.segment th:first-child{padding-left:15px}
\ No newline at end of file
diff --git a/public/img/slack.png b/public/img/slack.png
new file mode 100644 (file)
index 0000000..eddb480
Binary files /dev/null and b/public/img/slack.png differ
index 65d973afed7b5ac7ef659050cbd0de6a712cb6de..92c1ad76da9263a746474665757a6a0e6532f1bb 100644 (file)
                        width: 70%!important;
                }
        }
+}
+
+.new.webhook {
+       form {
+               .help {
+                       margin-left: 25px;
+               }
+       }
 }
\ No newline at end of file
index 8031135ec64adf7b6a2e7ff07b4baf3bb1c99ec4..3e5f167b24b91ae7ad4ab1b71a77ecfc22729cfe 100644 (file)
@@ -247,7 +247,7 @@ func Collaboration(ctx *middleware.Context) {
 }
 
 func Webhooks(ctx *middleware.Context) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.hooks")
        ctx.Data["PageIsSettingsHooks"] = true
        ctx.Data["BaseLink"] = ctx.Repo.RepoLink
        ctx.Data["Description"] = ctx.Tr("repo.settings.hooks_desc", "http://gogs.io/docs/features/webhook.html")
@@ -262,65 +262,100 @@ func Webhooks(ctx *middleware.Context) {
        ctx.HTML(200, HOOKS)
 }
 
-func renderHookTypes(ctx *middleware.Context) {
-       ctx.Data["HookTypes"] = []string{"Gogs", "Slack"}
-       ctx.Data["HookType"] = "Gogs"
+type OrgRepoCtx struct {
+       OrgID       int64
+       RepoID      int64
+       Link        string
+       NewTemplate base.TplName
 }
 
-func WebHooksNew(ctx *middleware.Context) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+// getOrgRepoCtx determines whether this is a repo context or organization context.
+func getOrgRepoCtx(ctx *middleware.Context) (*OrgRepoCtx, error) {
+       if len(ctx.Repo.RepoLink) > 0 {
+               return &OrgRepoCtx{
+                       RepoID:      ctx.Repo.Repository.ID,
+                       Link:        ctx.Repo.RepoLink,
+                       NewTemplate: HOOK_NEW,
+               }, nil
+       }
+
+       if len(ctx.Org.OrgLink) > 0 {
+               return &OrgRepoCtx{
+                       OrgID:       ctx.Org.Organization.Id,
+                       Link:        ctx.Org.OrgLink,
+                       NewTemplate: ORG_HOOK_NEW,
+               }, nil
+       }
+
+       return nil, errors.New("Unable to set OrgRepo context")
+}
+
+func checkHookType(ctx *middleware.Context) string {
+       hookType := strings.ToLower(ctx.Params(":type"))
+       if !com.IsSliceContainsStr(setting.Webhook.Types, hookType) {
+               ctx.Handle(404, "checkHookType", nil)
+               return ""
+       }
+       return hookType
+}
+
+func WebhooksNew(ctx *middleware.Context) {
+       ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook")
        ctx.Data["PageIsSettingsHooks"] = true
        ctx.Data["PageIsSettingsHooksNew"] = true
        ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
-       renderHookTypes(ctx)
 
        orCtx, err := getOrgRepoCtx(ctx)
        if err != nil {
-               ctx.Handle(500, "WebHooksNew(getOrgRepoCtx)", err)
+               ctx.Handle(500, "getOrgRepoCtx", err)
+               return
+       }
+
+       ctx.Data["HookType"] = checkHookType(ctx)
+       if ctx.Written() {
                return
        }
+       ctx.Data["BaseLink"] = orCtx.Link
 
        ctx.HTML(200, orCtx.NewTemplate)
 }
 
 func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook")
        ctx.Data["PageIsSettingsHooks"] = true
        ctx.Data["PageIsSettingsHooksNew"] = true
        ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
-       renderHookTypes(ctx)
+       ctx.Data["HookType"] = "gogs"
 
        orCtx, err := getOrgRepoCtx(ctx)
        if err != nil {
-               ctx.Handle(500, "WebHooksNewPost(getOrgRepoCtx)", err)
+               ctx.Handle(500, "getOrgRepoCtx", err)
                return
        }
+       ctx.Data["BaseLink"] = orCtx.Link
 
        if ctx.HasError() {
                ctx.HTML(200, orCtx.NewTemplate)
                return
        }
 
-       // FIXME: code too old here, sync with APIs
-       ct := models.JSON
-       if form.ContentType == "2" {
-               ct = models.FORM
+       contentType := models.JSON
+       if models.HookContentType(form.ContentType) == models.FORM {
+               contentType = models.FORM
        }
 
        w := &models.Webhook{
-               RepoID:      orCtx.RepoId,
-               URL:         form.PayloadUrl,
-               ContentType: ct,
+               RepoID:      orCtx.RepoID,
+               URL:         form.PayloadURL,
+               ContentType: contentType,
                Secret:      form.Secret,
                HookEvent: &models.HookEvent{
                        PushOnly: form.PushOnly,
                },
                IsActive:     form.Active,
                HookTaskType: models.GOGS,
-               Meta:         "",
-               OrgID:        orCtx.OrgId,
+               OrgID:        orCtx.OrgID,
        }
-
        if err := w.UpdateEvent(); err != nil {
                ctx.Handle(500, "UpdateEvent", err)
                return
@@ -334,17 +369,18 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) {
 }
 
 func WebHooksEdit(ctx *middleware.Context) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.update_webhook")
        ctx.Data["PageIsSettingsHooks"] = true
        ctx.Data["PageIsSettingsHooksEdit"] = true
 
-       hookId := com.StrTo(ctx.Params(":id")).MustInt64()
-       if hookId == 0 {
-               ctx.Handle(404, "setting.WebHooksEdit", nil)
+       orCtx, err := getOrgRepoCtx(ctx)
+       if err != nil {
+               ctx.Handle(500, "getOrgRepoCtx", err)
                return
        }
+       ctx.Data["BaseLink"] = orCtx.Link
 
-       w, err := models.GetWebhookById(hookId)
+       w, err := models.GetWebhookById(ctx.ParamsInt64(":id"))
        if err != nil {
                if err == models.ErrWebhookNotExist {
                        ctx.Handle(404, "GetWebhookById", nil)
@@ -354,36 +390,25 @@ func WebHooksEdit(ctx *middleware.Context) {
                return
        }
 
-       // set data per HookTaskType
        switch w.HookTaskType {
        case models.SLACK:
                ctx.Data["SlackHook"] = w.GetSlackHook()
-               ctx.Data["HookType"] = "Slack"
+               ctx.Data["HookType"] = "slack"
        default:
-               ctx.Data["HookType"] = "Gogs"
+               ctx.Data["HookType"] = "gogs"
        }
        w.GetEvent()
        ctx.Data["Webhook"] = w
-       orCtx, err := getOrgRepoCtx(ctx)
-       if err != nil {
-               ctx.Handle(500, "WebHooksEdit(getOrgRepoCtx)", err)
-               return
-       }
+
        ctx.HTML(200, orCtx.NewTemplate)
 }
 
 func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.update_webhook")
        ctx.Data["PageIsSettingsHooks"] = true
        ctx.Data["PageIsSettingsHooksEdit"] = true
 
-       hookId := com.StrTo(ctx.Params(":id")).MustInt64()
-       if hookId == 0 {
-               ctx.Handle(404, "setting.WebHooksEditPost", nil)
-               return
-       }
-
-       w, err := models.GetWebhookById(hookId)
+       w, err := models.GetWebhookById(ctx.ParamsInt64(":id"))
        if err != nil {
                if err == models.ErrWebhookNotExist {
                        ctx.Handle(404, "GetWebhookById", nil)
@@ -406,20 +431,22 @@ func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) {
 
        orCtx, err := getOrgRepoCtx(ctx)
        if err != nil {
-               ctx.Handle(500, "WebHooksEditPost(getOrgRepoCtx)", err)
+               ctx.Handle(500, "getOrgRepoCtx", err)
                return
        }
+       ctx.Data["BaseLink"] = orCtx.Link
+
        if ctx.HasError() {
                ctx.HTML(200, orCtx.NewTemplate)
                return
        }
 
        ct := models.JSON
-       if form.ContentType == "2" {
+       if models.HookContentType(form.ContentType) == models.FORM {
                ct = models.FORM
        }
 
-       w.URL = form.PayloadUrl
+       w.URL = form.PayloadURL
        w.ContentType = ct
        w.Secret = form.Secret
        w.HookEvent = &models.HookEvent{
@@ -435,7 +462,7 @@ func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) {
        }
 
        ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
-       ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, hookId))
+       ctx.Redirect(orCtx.Link + "/settings/hooks")
 }
 
 func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
@@ -464,8 +491,8 @@ func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
        }
 
        w := &models.Webhook{
-               RepoID:      orCtx.RepoId,
-               URL:         form.PayloadUrl,
+               RepoID:      orCtx.RepoID,
+               URL:         form.PayloadURL,
                ContentType: models.JSON,
                Secret:      "",
                HookEvent: &models.HookEvent{
@@ -474,7 +501,7 @@ func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
                IsActive:     form.Active,
                HookTaskType: models.SLACK,
                Meta:         string(meta),
-               OrgID:        orCtx.OrgId,
+               OrgID:        orCtx.OrgID,
        }
        if err := w.UpdateEvent(); err != nil {
                ctx.Handle(500, "UpdateEvent", err)
@@ -529,7 +556,7 @@ func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
                return
        }
 
-       w.URL = form.PayloadUrl
+       w.URL = form.PayloadURL
        w.Meta = string(meta)
        w.HookEvent = &models.HookEvent{
                PushOnly: form.PushOnly,
@@ -559,34 +586,6 @@ func DeleteWebhook(ctx *middleware.Context) {
        })
 }
 
-type OrgRepoCtx struct {
-       OrgId       int64
-       RepoId      int64
-       Link        string
-       NewTemplate base.TplName
-}
-
-// determines whether this is a repo context or organization context
-func getOrgRepoCtx(ctx *middleware.Context) (*OrgRepoCtx, error) {
-       if _, ok := ctx.Data["RepoLink"]; ok {
-               return &OrgRepoCtx{
-                       OrgId:       int64(0),
-                       RepoId:      ctx.Repo.Repository.ID,
-                       Link:        ctx.Repo.RepoLink,
-                       NewTemplate: HOOK_NEW,
-               }, nil
-       } else if _, ok := ctx.Data["OrgLink"]; ok {
-               return &OrgRepoCtx{
-                       OrgId:       ctx.Org.Organization.Id,
-                       RepoId:      int64(0),
-                       Link:        ctx.Org.OrgLink,
-                       NewTemplate: ORG_HOOK_NEW,
-               }, nil
-       } else {
-               return &OrgRepoCtx{}, errors.New("Unable to set OrgRepo context")
-       }
-}
-
 func TriggerHook(ctx *middleware.Context) {
        u, err := models.GetUserByName(ctx.Params(":username"))
        if err != nil {
@@ -611,7 +610,7 @@ func TriggerHook(ctx *middleware.Context) {
 }
 
 func GitHooks(ctx *middleware.Context) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.githooks")
        ctx.Data["PageIsSettingsGitHooks"] = true
 
        hooks, err := ctx.Repo.GitRepo.Hooks()
@@ -625,7 +624,7 @@ func GitHooks(ctx *middleware.Context) {
 }
 
 func GitHooksEdit(ctx *middleware.Context) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.githooks")
        ctx.Data["PageIsSettingsGitHooks"] = true
 
        name := ctx.Params(":name")
@@ -662,7 +661,7 @@ func GitHooksEditPost(ctx *middleware.Context) {
 }
 
 func DeployKeys(ctx *middleware.Context) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys")
        ctx.Data["PageIsSettingsKeys"] = true
 
        keys, err := models.ListDeployKeys(ctx.Repo.Repository.ID)
@@ -676,7 +675,7 @@ func DeployKeys(ctx *middleware.Context) {
 }
 
 func DeployKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
-       ctx.Data["Title"] = ctx.Tr("repo.settings")
+       ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys")
        ctx.Data["PageIsSettingsKeys"] = true
 
        keys, err := models.ListDeployKeys(ctx.Repo.Repository.ID)
index 491ce60841bc98d22f6982b527459e384d3843d7..a82682d43e1f84c9077c8fc7afb1bca53ee00adb 100644 (file)
@@ -1 +1 @@
-0.6.6.0826 Beta
\ No newline at end of file
+0.6.6.0827 Beta
\ No newline at end of file
index 6e7ee53604a50bd4aabed34dabfe2099f800b368..d9a9b16928ad3f08deff4d5c86b6046a33484520 100644 (file)
@@ -1,37 +1,29 @@
-{{template "ng/base/head" .}}
-{{template "ng/base/header" .}}
-{{template "org/base/header" .}}
-<div id="setting-wrapper" class="main-wrapper">
-    <div id="org-setting" class="container clear">
-        {{template "org/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">
-                          <strong>{{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}</strong>
-                        </div>
-                        {{template "repo/settings/hook_types" .}}
-                        {{template "repo/settings/hook_gogs" .}}
-                        {{template "repo/settings/hook_slack" .}}
-                    </div>
-                </div>
-                {{if .PageIsSettingsHooksEdit}}
-              <br>
-                <div id="setting-content">
-                    <div id="repo-hooks-history-panel" class="panel panel-radius">
-                        <div class="panel-header">
-                          <strong>{{.i18n.Tr "repo.settings.recent_deliveries"}}</strong>
-                        </div>
-                        <ul class="panel-body setting-list">
-                            <li>Coming soon!</li>
-                        </ul>
-                    </div>
-              </div>
-              {{end}}
-            </div>
+{{template "base/head" .}}
+<div class="organization settings new webhook">
+  {{template "org/header" .}}
+  <div class="ui container">
+    <div class="ui grid">
+      {{template "org/settings/navbar" .}}
+      <div class="twelve wide column content">
+        {{template "base/alert" .}}
+        <h4 class="ui top attached header">
+          {{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}
+          <div class="ui right">
+            {{if eq .HookType "gogs"}}
+            <img class="img-13" src="{{AppSubUrl}}/img/favicon.png">
+            {{else if eq .HookType "slack"}}
+            <img class="img-13" src="{{AppSubUrl}}/img/slack.png">
+            {{end}}
+          </div>
+        </h4>
+        <div class="ui attached segment">
+          {{template "repo/settings/hook_gogs" .}}
+          {{template "repo/settings/hook_slack" .}}
         </div>
+
+        {{template "repo/settings/hook_history" .}}
+      </div>
+    </div>
   </div>
 </div>
-{{template "ng/base/footer" .}}
+{{template "base/footer" .}}
diff --git a/templates/repo/settings/hook_delete_modal.tmpl b/templates/repo/settings/hook_delete_modal.tmpl
new file mode 100644 (file)
index 0000000..bafd1ce
--- /dev/null
@@ -0,0 +1,19 @@
+<div class="ui small basic delete modal">
+  <div class="ui icon header">
+    <i class="trash icon"></i>
+    {{.i18n.Tr "repo.settings.webhook_deletion"}}
+  </div>
+  <div class="content">
+    <p>{{.i18n.Tr "repo.settings.webhook_deletion_desc"}}</p>
+  </div>
+  <div class="actions">
+    <div class="ui red basic inverted cancel button">
+      <i class="remove icon"></i>
+      {{.i18n.Tr "modal.no"}}
+    </div>
+    <div class="ui green basic inverted ok button">
+      <i class="checkmark icon"></i>
+      {{.i18n.Tr "modal.yes"}}
+    </div>
+  </div>
+</div>
\ No newline at end of file
index e4ece412b97994036d2f6500b44c634eb5a27a9f..f172cabe957ce5f0ba50dddc22ec8555c1222235 100644 (file)
@@ -1,23 +1,28 @@
-<div id="gogs" class="{{if (and .PageIsSettingsHooksEdit (not (eq .HookType "Gogs")))}}hidden{{end}}">
-  <form class="form form-align panel-body repo-setting-form" id="repo-setting-form-gogs" action="{{if .RepoLink}}{{.RepoLink}}{{else if .OrgLink}}{{.OrgLink}}{{end}}/settings/hooks/gogs/{{if .PageIsSettingsHooksNew}}new{{else}}{{.Webhook.ID}}{{end}}" method="post">
-    {{.CsrfTokenHtml}}
-    <input type="hidden" name="hook_type" value="gogs">
-    <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_webhook_desc" "http://gogs.io/docs/features/webhook.html" | Str2html}}</div>
-    <div class="field">
-        <label class="req" for="payload-url">{{.i18n.Tr "repo.settings.payload_url"}}</label>
-        <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="payload-url" name="payload_url" type="url" value="{{.Webhook.URL}}" required />
+{{if eq .HookType "gogs"}}
+<p>{{.i18n.Tr "repo.settings.add_webhook_desc" "http://gogs.io/docs/features/webhook.html" | Str2html}}</p>
+<form class="ui form" action="{{.BaseLink}}/settings/hooks/{{if .PageIsSettingsHooksNew}}gogs/new{{else}}{{.Webhook.ID}}{{end}}" method="post">
+  {{.CsrfTokenHtml}}
+  <div class="required field {{if .Err_PayloadURL}}error{{end}}">
+    <label for="payload_url">{{.i18n.Tr "repo.settings.payload_url"}}</label>
+    <input id="payload_url" name="payload_url" type="url" value="{{.Webhook.URL}}" autofocus required>
+  </div>
+  <div class="field">
+    <label>{{.i18n.Tr "repo.settings.content_type"}}</label>
+    <div class="ui selection dropdown">
+      <input type="hidden" id="content_type" name="content_type" value="{{if .Webhook.ContentType}}{{.Webhook.ContentType}}{{else}}application/json{{end}}">
+      <div class="default text"></div>
+      <i class="dropdown icon"></i>
+      <div class="menu">
+        <div class="item" data-value="1">application/json</div>
+        <div class="item" data-value="2">application/x-www-form-urlencoded</div>
+      </div>
     </div>
-    <div class="field">
-      <label class="req">{{.i18n.Tr "repo.settings.content_type"}}</label>
-      <select name="content_type">
-          <option value="1" {{if or .PageIsSettingsHooksNew (eq .Webhook.ContentType 1)}}selected{{end}}>application/json</option>
-          <option value="2" {{if eq .Webhook.ContentType 2}}selected{{end}}>application/x-www-form-urlencoded</option>
-      </select>
-    </div>
-    <div class="field">
-        <label for="secret">{{.i18n.Tr "repo.settings.secret"}}</label>
-        <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="secret" name="secret" type="password" value="{{.Webhook.Secret}}" autocomplete="off" />
-    </div>
-    {{template "repo/settings/hook_settings" .}}
-  </form>
-</div>
+  </div>
+  <input class="fake" type="password">
+  <div class="field {{if .Err_Secret}}error{{end}}">
+    <label for="secret">{{.i18n.Tr "repo.settings.secret"}}</label>
+    <input id="secret" name="secret" type="password" value="{{.Webhook.Secret}}" autocomplete="off">
+  </div>
+  {{template "repo/settings/hook_settings" .}}
+</form>
+{{end}}
diff --git a/templates/repo/settings/hook_history.tmpl b/templates/repo/settings/hook_history.tmpl
new file mode 100644 (file)
index 0000000..be837cc
--- /dev/null
@@ -0,0 +1,12 @@
+{{if .PageIsSettingsHooksEdit}}
+<div id="setting-content">
+      <div id="repo-hooks-history-panel" class="panel panel-radius">
+          <div class="panel-header">
+               <strong>{{.i18n.Tr "repo.settings.recent_deliveries"}}</strong>
+          </div>
+          <ul class="panel-body setting-list">
+               <li>Coming soon!</li>
+          </ul>
+      </div>
+</div>
+{{end}}
\ No newline at end of file
index b04d86367ea840042d5ab5ba53667d9304d4f08a..b5c086bb84cd7d7b0070c5b836694bacde19e2c9 100644 (file)
@@ -3,7 +3,17 @@
        <h4 class="ui top attached header">
          {{.i18n.Tr "repo.settings.hooks"}}
          <div class="ui right">
-               <a class="ui blue tiny button" href="{{.BaseLink}}/settings/hooks/new">{{.i18n.Tr "repo.settings.add_webhook"}}</a>
+      <div class="ui floating1 jump dropdown">
+        <div class="ui blue tiny button">{{.i18n.Tr "repo.settings.add_webhook"}}</div>
+        <div class="menu">
+          <a class="item" href="{{.BaseLink}}/settings/hooks/gogs/new">
+            <img class="img-10" src="{{AppSubUrl}}/img/favicon.png">Gogs
+          </a>
+          <a class="item" href="{{.BaseLink}}/settings/hooks/slack/new">
+            <img class="img-10" src="{{AppSubUrl}}/img/slack.png">Slack
+          </a>
+        </div>
+      </div>
          </div>
        </h4>
        <div class="ui attached table segment">
   </div>
 </div>
 
-<div class="ui small basic delete modal">
-  <div class="ui icon header">
-    <i class="trash icon"></i>
-    {{.i18n.Tr "repo.settings.webhook_deletion"}}
-  </div>
-  <div class="content">
-    <p>{{.i18n.Tr "repo.settings.webhook_deletion_desc"}}</p>
-  </div>
-  <div class="actions">
-    <div class="ui red basic inverted cancel button">
-      <i class="remove icon"></i>
-      {{.i18n.Tr "modal.no"}}
-    </div>
-    <div class="ui green basic inverted ok button">
-      <i class="checkmark icon"></i>
-      {{.i18n.Tr "modal.yes"}}
-    </div>
-  </div>
-</div>
\ No newline at end of file
+{{template "repo/settings/hook_delete_modal" .}}
\ No newline at end of file
index e4534a6468517ec7aa8591379eb83d4a5a1acee5..7c9a5de1f0b309047b239814f98f4066da3ff37f 100644 (file)
@@ -1,39 +1,29 @@
-{{template "ng/base/head" .}}
-{{template "ng/base/header" .}}
-<div id="repo-wrapper">
-    {{template "repo/header_old" .}}
-       <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">
-                                       <strong>{{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}</strong>
-                               </div>
-                          {{template "repo/settings/hook_types" .}}
-                          {{template "repo/settings/hook_gogs" .}}
-                          {{template "repo/settings/hook_slack" .}}
-                           </div>
-                       </div>
-                       {{if .PageIsSettingsHooksEdit}}
-                           <br>
-                       <div id="setting-content">
-                           <div id="repo-hooks-history-panel" class="panel panel-radius">
-                               <div class="panel-header">
-                                       <strong>{{.i18n.Tr "repo.settings.recent_deliveries"}}</strong>
-                               </div>
-                               <ul class="panel-body setting-list">
-                               <li>Coming soon!</li>
-                               </ul>
-                           </div>
-                           </div>
-                           {{end}}
-                   </div>
-               </div>
+{{template "base/head" .}}
+<div class="repository settings new webhook">
+       {{template "repo/header" .}}
+       <div class="ui container">
+               <div class="ui grid">
+                       {{template "repo/settings/navbar" .}}
+                       <div class="twelve wide column content">
+                               {{template "base/alert" .}}
+                               <h4 class="ui top attached header">
+                                 {{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}
+                                 <div class="ui right">
+                                       {{if eq .HookType "gogs"}}
+                                       <img class="img-13" src="{{AppSubUrl}}/img/favicon.png">
+                                       {{else if eq .HookType "slack"}}
+                                       <img class="img-13" src="{{AppSubUrl}}/img/slack.png">
+                                       {{end}}
+                                 </div>
+                               </h4>
+                               <div class="ui attached segment">
+          {{template "repo/settings/hook_gogs" .}}
+          {{template "repo/settings/hook_slack" .}}
+                   </div>
+
+                               {{template "repo/settings/hook_history" .}}
+      </div>
                </div>
        </div>
 </div>
-{{template "ng/base/footer" .}}
+{{template "base/footer" .}}
index bf465c83054da6e3cb1c1d4c29bdc974021da0af..c1435acca16f8a5a2a01f2de92bbcd18c9b20ed3 100644 (file)
@@ -1,15 +1,28 @@
 <div class="field">
-  <h4 class="text-center">{{.i18n.Tr "repo.settings.event_desc"}}</h4>
-  <label></label>
-  <input name="push_only" type="radio" {{if or .PageIsSettingsHooksNew .Webhook.PushOnly}}checked{{end}}> {{.i18n.Tr "repo.settings.event_push_only" | Str2html}}
+  <h4>{{.i18n.Tr "repo.settings.event_desc"}}</h4>
+       <div class="grouped fields">
+               <div class="field">
+                 <div class="ui radio checkbox checked">
+                   <input class="hidden" name="push_only" type="radio" {{if or .PageIsSettingsHooksNew .Webhook.PushOnly}}checked{{end}}>
+                   <label>{{.i18n.Tr "repo.settings.event_push_only" | Str2html}}</label>
+                 </div>
+               </div>
+       </div>
 </div>
-<div class="field">
-  <label for="active">{{.i18n.Tr "repo.settings.active"}}</label>
-  <input class="ipt-chk" id="active" name="active" type="checkbox" {{if or .PageIsSettingsHooksNew .Webhook.IsActive}}checked{{end}} />
-<span>{{.i18n.Tr "repo.settings.active_helper"}}</span>
+<div class="inline field">
+  <div class="ui checkbox">
+    <input class="hidden" name="active" type="checkbox" tabindex="0" {{if or .PageIsSettingsHooksNew .Webhook.IsActive}}checked{{end}}>
+    <label>{{.i18n.Tr "repo.settings.active"}}</label>
+    <span class="help">{{.i18n.Tr "repo.settings.active_helper"}}</span>
+  </div>
 </div>
 <div class="field">
-    <label></label>
-    <button class="btn btn-green btn-large btn-radius">{{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}</button>
-    {{if .PageIsSettingsHooksEdit}}<a class="btn btn-red btn-large btn-link btn-radius" href="{{.RepoLink}}/settings/hooks?remove={{.Webhook.ID}}"><strong>{{.i18n.Tr "repo.settings.delete_webhook"}}</strong></a>{{end}}
+       {{if .PageIsSettingsHooksNew}}
+  <button class="ui green button">{{.i18n.Tr "repo.settings.add_webhook"}}</button>
+  {{else}}
+  <button class="ui green button">{{.i18n.Tr "repo.settings.update_webhook"}}</button>
+  <a class="ui red delete-button button" data-url="{{.BaseLink}}/settings/hooks/delete" data-id="{{.Webhook.ID}}">{{.i18n.Tr "repo.settings.delete_webhook"}}</a>
+  {{end}}
 </div>
+
+{{template "repo/settings/hook_delete_modal" .}}
index 82439c432367595533d1b3b55adab4e4b16ac8f1..b787131bec09944a7d6ecb9fea8fbd51aca290ed 100644 (file)
@@ -1,16 +1,15 @@
-<div id="slack" class="{{if or .PageIsSettingsHooksNew (and .PageIsSettingsHooksEdit (not (eq .HookType "Slack")))}}hidden{{end}}">
-  <form class="form form-align panel-body repo-setting-form" id="repo-setting-form-slack" action="{{if .RepoLink}}{{.RepoLink}}{{else if .OrgLink}}{{.OrgLink}}{{end}}/settings/hooks/slack/{{if .PageIsSettingsHooksNew}}new{{else}}{{.Webhook.ID}}{{end}}" method="post">
-    {{.CsrfTokenHtml}}
-    <input type="hidden" name="hook_type" value="slack">
-    <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_slack_hook_desc" "http://slack.com" | Str2html}}</div>
-    <div class="field">
-        <label class="req" for="payload-url">{{.i18n.Tr "repo.settings.payload_url"}}</label>
-        <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="payload-url" name="payload_url" type="url" value="{{.Webhook.URL}}" required />
-    </div>
-    <div class="field">
-        <label class="req" for="channel">{{.i18n.Tr "repo.settings.slack_channel"}}</label>
-        <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="channel" name="channel" type="text" value="{{.SlackHook.Channel}}" placeholder="#general" required />
-    </div>
-    {{template "repo/settings/hook_settings" .}}
-  </form>
-</div>
+{{if eq .HookType "slack"}}
+<p>{{.i18n.Tr "repo.settings.add_slack_hook_desc" "http://slack.com" | Str2html}}</p>
+<form class="ui form" action="{{.BaseLink}}/settings/hooks/{{if .PageIsSettingsHooksNew}}slack/new{{else}}{{.Webhook.ID}}{{end}}" method="post">
+       {{.CsrfTokenHtml}}
+  <div class="required field {{if .Err_PayloadURL}}error{{end}}">
+    <label for="payload_url">{{.i18n.Tr "repo.settings.payload_url"}}</label>
+    <input id="payload_url" name="payload_url" type="url" value="{{.Webhook.URL}}" autofocus required>
+  </div>
+  <div class="required field {{if .Err_Channel}}error{{end}}">
+    <label for="channel">{{.i18n.Tr "repo.settings.slack_channel"}}</label>
+    <input id="channel" name="channel" value="{{.SlackHook.Channel}}" placeholder="#general" required>
+  </div>
+       {{template "repo/settings/hook_settings" .}}
+</form>
+{{end}}
diff --git a/templates/repo/settings/hook_types.tmpl b/templates/repo/settings/hook_types.tmpl
deleted file mode 100644 (file)
index 782e2a4..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{{if .PageIsSettingsHooksNew}}
-<div id="hook-type" class="form-align">
-  <label class="req">{{.i18n.Tr "repo.settings.hook_type"}}</label>
-  <select name="hook_type" id="hook-type" class="form-control">
-    {{if .HookType}}<option value="{{.HookType}}">{{.HookType}}</option>{{end}}
-    {{range .HookTypes}}
-    {{if not (eq $.HookType .)}}<option value="{{.}}" >{{.}}</option>{{end}}
-    {{end}}
-  </select>
-</div>
-{{end}}