From 4fff38856e784cb1c2c8115a7c7e013f42f7d8d8 Mon Sep 17 00:00:00 2001
From: FuXiaoHei <fuxiaohei@hexiaz.com>
Date: Thu, 13 Mar 2014 12:15:58 +0800
Subject: [PATCH 1/2] single repository page ui preview

---
 public/css/gogs.css           | 81 +++++++++++++++++++++++++++++++++++
 routers/repo/single.go        | 56 ++++++++++++++++++++++++
 templates/repo/single.tmpl    | 38 ++++++++++++++++
 templates/repo/toolbar.tmpl   | 41 ++++++++++++++++++
 templates/user/dashboard.tmpl |  4 +-
 web.go                        |  1 +
 6 files changed, 220 insertions(+), 1 deletion(-)
 create mode 100644 routers/repo/single.go
 create mode 100644 templates/repo/single.tmpl
 create mode 100644 templates/repo/toolbar.tmpl

diff --git a/public/css/gogs.css b/public/css/gogs.css
index a8fa1daca537..3d8dc3fddb7e 100755
--- a/public/css/gogs.css
+++ b/public/css/gogs.css
@@ -372,8 +372,89 @@ body {
     line-height: 32px;
     border-bottom: 1px solid #DDD;
     padding-left: 15px;
+    clear: both;
+}
+
+#gogs-feed-right .repo-panel .list-group-item:last-child {
+    border-bottom: none;
 }
 
 #gogs-feed-right .repo-panel .list-group-item:hover {
     background-color: rgba(65, 131, 196, 0.1);
+}
+
+#gogs-feed-right .repo-panel span.stars {
+    color: #666;
+    line-height: 44px;
+    margin-right: 1em;
+}
+
+/* gogits repo single page */
+
+.gogs-repo-nav h3 .fa {
+    color: #BBB;
+}
+
+.gogs-repo-btns {
+    margin-top: 18px;
+}
+
+.gogs-repo-btns .btn-group {
+    margin-left: 1em;
+}
+
+.gogs-repo-btns .btn-group .btn {
+    padding-left: 6px;
+}
+
+#gogs-repo-watching .dropdown-menu {
+    width: 280px;
+    padding: 0;
+}
+
+#gogs-repo-watching .dropdown-menu .dropdown-item:hover .dropdown-header {
+    color: rgb(65, 131, 196);
+    cursor: pointer;
+}
+
+#gogs-repo-watching .dropdown-menu .description {
+    padding: 0 20px;
+    color: #888;
+}
+
+#gogs-repo-watching .dropdown-menu .dropdown-header {
+    color: #444;
+    font-weight: bold;
+    font-size: 14px;
+    margin-bottom: 4px;
+}
+
+
+#gogs-repo-toolbar{
+    margin-top: 51px;
+    margin-bottom: -50px;
+    border-bottom: 1px solid #BBB;
+    background-color: #FFF;
+    height: 40px;
+}
+
+#gogs-repo-toolbar .navbar-default{
+    border: none;
+    height: 39px;
+}
+
+#gogs-repo-toolbar .nav > li > a{
+    height: 39px;
+}
+
+#gogs-repo-toolbar .navbar-toolbar.navbar-default .navbar-nav>.active>a:after{
+    border-bottom-color: #999;
+}
+
+#gogs-repo-toolbar .navbar.nav-toolbar{
+    margin-bottom: 0;
+}
+
+#gogs-repo-toolbar .navbar-collapse{
+    padding: 0;
 }
\ No newline at end of file
diff --git a/routers/repo/single.go b/routers/repo/single.go
new file mode 100644
index 000000000000..be27db8e05ce
--- /dev/null
+++ b/routers/repo/single.go
@@ -0,0 +1,56 @@
+package repo
+
+import (
+	"github.com/codegangsta/martini"
+	"github.com/gogits/gogs/models"
+	"github.com/gogits/gogs/modules/auth"
+	"github.com/gogits/gogs/modules/base"
+	"github.com/martini-contrib/render"
+	"github.com/martini-contrib/sessions"
+	"net/http"
+)
+
+
+func Single(params martini.Params, req *http.Request, r render.Render, data base.TmplData, session sessions.Session) {
+	var (
+		user *models.User
+		err  error
+	)
+	// get repository owner
+	isOwner := (data["SignedUserName"] == params["username"])
+	if !isOwner {
+		user, err = models.GetUserByName(params["username"])
+		if err != nil {
+			data["ErrorMsg"] = err
+			//log.Error("repo.Single: %v", err)
+			r.HTML(200, "base/error", data)
+			return
+		}
+	} else {
+		user = auth.SignedInUser(session)
+	}
+	if user == nil {
+		data["ErrorMsg"] = "invliad user account for single repository"
+		//log.Error("repo.Single: %v", err)
+		r.HTML(200, "base/error", data)
+		return
+	}
+	data["IsRepositoryOwner"] = isOwner
+
+	// get repository
+	repo, err := models.GetRepositoryByName(user, params["reponame"])
+	if err != nil {
+		data["ErrorMsg"] = err
+		//log.Error("repo.Single: %v", err)
+		r.HTML(200, "base/error", data)
+		return
+	}
+
+	data["Repository"] = repo
+	data["Owner"] = user
+	data["Title"] = user.Name + "/" + repo.Name
+	data["RepositoryLink"] = data["Title"]
+	data["IsRepoToolbarSource"] = true
+
+	r.HTML(200, "repo/single", data)
+}
diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl
new file mode 100644
index 000000000000..ef812f82492b
--- /dev/null
+++ b/templates/repo/single.tmpl
@@ -0,0 +1,38 @@
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body-nav" class="gogs-repo-nav">
+    <div class="container">
+        <div class="gogs-repo-btns pull-right">
+            <div class="btn-group" id="gogs-repo-watching">
+                <button type="button" class="btn btn-default"><i class="fa fa-eye"></i>Watch {x}</button>
+                <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+                    <span class="caret"></span>
+                    <span class="sr-only">Toggle Dropdown</span>
+                </button>
+                <div class="dropdown-menu" role="menu">
+                    <div class="dropdown-item" data-val="not-watching">
+                        <h4 role="presentation" class="dropdown-header">Not Watching</h4>
+                        <p class="description">You only receive notifications for conversations in which you participate or are @mentioned.</p>
+                        <p class="divider"></p>
+                    </div>
+                    <div class="dropdown-item" data-val="watching">
+                        <h4 role="presentation" class="dropdown-header">Watching</h4>
+                        <p class="description">You receive notifications for all conversations in this repository.</p>
+                    </div>
+                </div>
+            </div>
+            <div class="btn-group">
+                <button type="button" class="btn btn-default"><i class="fa fa-star"></i>Star&nbsp;&nbsp;{{.Repository.NumStars}}</button>
+            </div>
+            <div class="btn-group">
+                <button type="button" class="btn btn-default"><i class="fa fa-code-fork"></i>Fork&nbsp;&nbsp;{{.Repository.NumForks}}</button>
+            </div>
+        </div>
+        <h3><i class="fa fa-book fa-lg"></i><a href="/{{.Owner.Name}}/">{{.Owner.Name}}</a> / {{.Repository.Name}}</h3>
+    </div>
+</div>
+{{template "repo/toolbar" .}}
+<div id="gogs-body" class="container">
+    repo single dashboard
+</div>
+{{template "base/footer" .}}
\ No newline at end of file
diff --git a/templates/repo/toolbar.tmpl b/templates/repo/toolbar.tmpl
new file mode 100644
index 000000000000..57408e18e821
--- /dev/null
+++ b/templates/repo/toolbar.tmpl
@@ -0,0 +1,41 @@
+<div id="gogs-repo-toolbar">
+    <div class="container">
+        <nav class="navbar navbar-toolbar navbar-default" role="navigation">
+            <div class="container-fluid">
+                <div class="collapse navbar-collapse">
+                    <ul class="nav navbar-nav">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Branches <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="#">master</a></li>
+                                <li><a href="#">develop</a></li>
+                            </ul>
+                        </li>
+                        <li class="{{if .IsRepoToolbarSource}}active{{end}}"><a href="#">Source</a></li>
+                        <li><a href="#">Commits</a></li>
+                        <li><a href="#">Issues <span class="badge">42</span></a></li>
+                        <li><a href="#">Pull Requests</a></li>
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">More <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="#">Release</a></li>
+                                <li><a href="#">Wiki</a></li>
+                            </ul>
+                        </li>
+                    </ul>
+                    <ul class="nav navbar-nav navbar-right">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Statics <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="#">Graphic</a></li>
+                                <li><a href="#">Pulse</a></li>
+                                <li><a href="#">Network</a></li>
+                            </ul>
+                        </li>{{if .IsRepositoryOwner}}
+                        <li class="{{if .IsRepoToolbarSetting}}active{{end}}"><a href="/{{.RepositoryLink}}/settings/">Settings</a></li>{{end}}
+                    </ul>
+                </div>
+            </div>
+        </nav>
+    </div>
+</div>
\ No newline at end of file
diff --git a/templates/user/dashboard.tmpl b/templates/user/dashboard.tmpl
index 6f2b4b371ee9..d422f8ffe426 100644
--- a/templates/user/dashboard.tmpl
+++ b/templates/user/dashboard.tmpl
@@ -22,7 +22,9 @@
             </div>
             <div class="panel-body">
                 <ul class="list-group">{{range .MyRepos}}
-                    <li class="list-group-item"><i class="fa fa-book"></i><a href="/{{$.SignedUserName}}/{{.Name}}/">{{.Name}}</a></li>{{end}}
+                    <li class="list-group-item"><i class="fa fa-book"></i><a href="/{{$.SignedUserName}}/{{.Name}}/">{{.Name}}</a>
+                        <span class="stars pull-right"><i class="fa fa-star"></i>{{.NumStars}}</span>
+                    </li>{{end}}
                 </ul>
             </div>
         </div>
diff --git a/web.go b/web.go
index c7c704c168c9..c204131662c5 100644
--- a/web.go
+++ b/web.go
@@ -73,6 +73,7 @@ func runWeb(*cli.Context) {
 	m.Any("/repo/create", auth.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create)
 	m.Any("/repo/delete", auth.SignInRequire(true), repo.Delete)
 	m.Any("/repo/list", auth.SignInRequire(false), repo.List)
+	m.Get("/:username/:reponame", auth.SignInRequire(false), repo.Single)
 
 	listenAddr := fmt.Sprintf("%s:%s",
 		base.Cfg.MustValue("server", "HTTP_ADDR"),

From fecafdca2ac5884a4dbcef2b937dfc3d2bf27ef2 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Thu, 13 Mar 2014 12:45:41 +0800
Subject: [PATCH 2/2] merge

---
 routers/repo/repo.go       | 16 ----------------
 routers/repo/single.go     | 14 ++++++++++++--
 templates/repo/repo.tmpl   | 10 ----------
 templates/repo/single.tmpl |  6 +++++-
 web.go                     |  2 --
 5 files changed, 17 insertions(+), 31 deletions(-)
 delete mode 100644 templates/repo/repo.tmpl

diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index 644403452576..5769aff7c3a5 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -6,8 +6,6 @@ package repo
 
 import (
 	"net/http"
-
-	"github.com/codegangsta/martini"
 	"github.com/martini-contrib/render"
 	"github.com/martini-contrib/sessions"
 
@@ -87,20 +85,6 @@ func Delete(req *http.Request, r render.Render, data base.TmplData, session sess
 	}
 }
 
-func Repo(params martini.Params, req *http.Request, r render.Render, data base.TmplData, session sessions.Session) {
-	data["Title"] = "Repository"
-	files, err := models.GetReposFiles(params["username"], params["reponame"], "HEAD", "/")
-	if err != nil {
-		data["ErrorMsg"] = err
-		log.Error("repo.List: %v", err)
-		r.HTML(200, "base/error", data)
-		return
-	}
-
-	data["Files"] = files
-	r.HTML(200, "repo/repo", data)
-}
-
 func List(req *http.Request, r render.Render, data base.TmplData, session sessions.Session) {
 	u := auth.SignedInUser(session)
 	if u != nil {
diff --git a/routers/repo/single.go b/routers/repo/single.go
index be27db8e05ce..811aed399338 100644
--- a/routers/repo/single.go
+++ b/routers/repo/single.go
@@ -1,16 +1,17 @@
 package repo
 
 import (
+	"net/http"
+
 	"github.com/codegangsta/martini"
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/auth"
 	"github.com/gogits/gogs/modules/base"
 	"github.com/martini-contrib/render"
 	"github.com/martini-contrib/sessions"
-	"net/http"
+	"github.com/qiniu/log"
 )
 
-
 func Single(params martini.Params, req *http.Request, r render.Render, data base.TmplData, session sessions.Session) {
 	var (
 		user *models.User
@@ -52,5 +53,14 @@ func Single(params martini.Params, req *http.Request, r render.Render, data base
 	data["RepositoryLink"] = data["Title"]
 	data["IsRepoToolbarSource"] = true
 
+	files, err := models.GetReposFiles(params["username"], params["reponame"], "HEAD", "/")
+	if err != nil {
+		data["ErrorMsg"] = err
+		log.Error("repo.List: %v", err)
+		r.HTML(200, "base/error", data)
+		return
+	}
+
+	data["Files"] = files
 	r.HTML(200, "repo/single", data)
 }
diff --git a/templates/repo/repo.tmpl b/templates/repo/repo.tmpl
deleted file mode 100644
index 5ae3f25c16df..000000000000
--- a/templates/repo/repo.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-{{template "base/head" .}}
-{{template "base/navbar" .}}
-<div class="container" id="gogs-body">
-	<ul>
-	{{range .Files}}
-		<li>{{.Name}} - {{.Type}}</li>
-	{{end}}
-	</ul>
-</div>
-{{template "base/footer" .}}
\ No newline at end of file
diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl
index ef812f82492b..9d4a24f851df 100644
--- a/templates/repo/single.tmpl
+++ b/templates/repo/single.tmpl
@@ -33,6 +33,10 @@
 </div>
 {{template "repo/toolbar" .}}
 <div id="gogs-body" class="container">
-    repo single dashboard
+    <ul>
+    {{range .Files}}
+        <li>{{.Name}} - {{.Type}}</li>
+    {{end}}
+    </ul>
 </div>
 {{template "base/footer" .}}
\ No newline at end of file
diff --git a/web.go b/web.go
index c8b7ed0d4909..c204131662c5 100644
--- a/web.go
+++ b/web.go
@@ -70,8 +70,6 @@ func runWeb(*cli.Context) {
 
 	m.Get("/user/:username", auth.SignInRequire(false), user.Profile)
 
-	m.Get("/:username/:reponame", repo.Repo)
-
 	m.Any("/repo/create", auth.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create)
 	m.Any("/repo/delete", auth.SignInRequire(true), repo.Delete)
 	m.Any("/repo/list", auth.SignInRequire(false), repo.List)