fix #1960
This commit is contained in:
parent
134d8e7681
commit
5dc3dd1704
13 changed files with 173 additions and 136 deletions
|
@ -5,7 +5,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra
|
||||||
|
|
||||||
![](public/img/gogs-large-resize.png)
|
![](public/img/gogs-large-resize.png)
|
||||||
|
|
||||||
##### Current version: 0.7.12 Beta
|
##### Current version: 0.7.13 Beta
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
@ -515,10 +515,13 @@ func runWeb(ctx *cli.Context) {
|
||||||
m.Group("", func() {
|
m.Group("", func() {
|
||||||
m.Get("/releases", repo.Releases)
|
m.Get("/releases", repo.Releases)
|
||||||
m.Get("/^:type(issues|pulls)$", repo.RetrieveLabels, repo.Issues)
|
m.Get("/^:type(issues|pulls)$", repo.RetrieveLabels, repo.Issues)
|
||||||
m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue)
|
|
||||||
m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
|
m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
|
||||||
m.Get("/milestones", repo.Milestones)
|
m.Get("/milestones", repo.Milestones)
|
||||||
}, middleware.RepoRef())
|
}, middleware.RepoRef(),
|
||||||
|
func(ctx *middleware.Context) {
|
||||||
|
ctx.Data["PageIsList"] = true
|
||||||
|
})
|
||||||
|
m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue)
|
||||||
|
|
||||||
m.Get("/branches", repo.Branches)
|
m.Get("/branches", repo.Branches)
|
||||||
m.Get("/archive/*", repo.Download)
|
m.Get("/archive/*", repo.Download)
|
||||||
|
|
2
gogs.go
2
gogs.go
|
@ -17,7 +17,7 @@ import (
|
||||||
"github.com/gogits/gogs/modules/setting"
|
"github.com/gogits/gogs/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
const APP_VER = "0.7.12.1116 Beta"
|
const APP_VER = "0.7.13.1116 Beta"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||||
|
|
|
@ -265,7 +265,7 @@ func (u *User) UploadAvatar(data []byte) error {
|
||||||
return fmt.Errorf("Decode: %v", err)
|
return fmt.Errorf("Decode: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
m := resize.Resize(234, 234, img, resize.NearestNeighbor)
|
m := resize.Resize(290, 290, img, resize.NearestNeighbor)
|
||||||
|
|
||||||
sess := x.NewSession()
|
sess := x.NewSession()
|
||||||
defer sessionRelease(sess)
|
defer sessionRelease(sess)
|
||||||
|
|
|
@ -104,7 +104,7 @@ func New(hash string, cacheDir string) *Avatar {
|
||||||
expireDuration: time.Minute * 10,
|
expireDuration: time.Minute * 10,
|
||||||
reqParams: url.Values{
|
reqParams: url.Values{
|
||||||
"d": {"retro"},
|
"d": {"retro"},
|
||||||
"size": {"200"},
|
"size": {"290"},
|
||||||
"r": {"pg"}}.Encode(),
|
"r": {"pg"}}.Encode(),
|
||||||
imagePath: filepath.Join(cacheDir, hash+".image"), //maybe png or jpeg
|
imagePath: filepath.Join(cacheDir, hash+".image"), //maybe png or jpeg
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ func (this *service) mustInt(r *http.Request, defaultValue int, keys ...string)
|
||||||
func (this *service) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (this *service) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
urlPath := r.URL.Path
|
urlPath := r.URL.Path
|
||||||
hash := urlPath[strings.LastIndex(urlPath, "/")+1:]
|
hash := urlPath[strings.LastIndex(urlPath, "/")+1:]
|
||||||
size := this.mustInt(r, 80, "s", "size") // default size = 80*80
|
size := this.mustInt(r, 290, "s", "size") // default size = 290*290
|
||||||
|
|
||||||
avatar := New(hash, this.cacheDir)
|
avatar := New(hash, this.cacheDir)
|
||||||
avatar.AlterImage = this.altImage
|
avatar.AlterImage = this.altImage
|
||||||
|
|
|
@ -848,6 +848,9 @@ pre.raw {
|
||||||
.ui .text.yellow {
|
.ui .text.yellow {
|
||||||
color: #FBBD08 !important;
|
color: #FBBD08 !important;
|
||||||
}
|
}
|
||||||
|
.ui .text.gold {
|
||||||
|
color: #a1882b !important;
|
||||||
|
}
|
||||||
.ui .text.left {
|
.ui .text.left {
|
||||||
text-align: left !important;
|
text-align: left !important;
|
||||||
}
|
}
|
||||||
|
@ -2688,6 +2691,23 @@ footer .container .links > *:first-child {
|
||||||
.user.settings .email.list .item:not(:first-child) .button {
|
.user.settings .email.list .item:not(:first-child) .button {
|
||||||
margin-top: -10px;
|
margin-top: -10px;
|
||||||
}
|
}
|
||||||
|
.user.profile .ui.card .username {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.user.profile .ui.card .extra.content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.user.profile .ui.card .extra.content ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.user.profile .ui.card .extra.content ul li {
|
||||||
|
padding: 10px;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
.user.profile .ui.card .extra.content ul li:not(:last-child) {
|
||||||
|
border-bottom: 1px solid #eaeaea;
|
||||||
|
}
|
||||||
.dashboard {
|
.dashboard {
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
padding-bottom: 80px;
|
padding-bottom: 80px;
|
||||||
|
@ -2820,24 +2840,26 @@ footer .container .links > *:first-child {
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
padding-bottom: 80px;
|
padding-bottom: 80px;
|
||||||
}
|
}
|
||||||
.explore.repositories .ui.repository.list .item {
|
.ui.repository.list .item {
|
||||||
border-top: 1px solid #eee;
|
|
||||||
padding-top: 25px;
|
|
||||||
padding-bottom: 25px;
|
padding-bottom: 25px;
|
||||||
}
|
}
|
||||||
.explore.repositories .ui.repository.list .item .ui.header {
|
.ui.repository.list .item:not(:first-child) {
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
padding-top: 25px;
|
||||||
|
}
|
||||||
|
.ui.repository.list .item .ui.header {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
.explore.repositories .ui.repository.list .item .ui.header .metas {
|
.ui.repository.list .item .ui.header .metas {
|
||||||
color: #888;
|
color: #888;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
.explore.repositories .ui.repository.list .item .ui.header .metas span:not(:last-child) {
|
.ui.repository.list .item .ui.header .metas span:not(:last-child) {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
.explore.repositories .ui.repository.list .item .time {
|
.ui.repository.list .item .time {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #808080;
|
color: #808080;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,9 @@ pre {
|
||||||
&.yellow {
|
&.yellow {
|
||||||
color: #FBBD08 !important;
|
color: #FBBD08 !important;
|
||||||
}
|
}
|
||||||
|
&.gold {
|
||||||
|
color: #a1882b !important;
|
||||||
|
}
|
||||||
|
|
||||||
&.left {
|
&.left {
|
||||||
text-align: left !important;
|
text-align: left !important;
|
||||||
|
|
|
@ -1,30 +1,32 @@
|
||||||
.explore {
|
.explore {
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
padding-bottom: @footer-margin * 2;
|
padding-bottom: @footer-margin * 2;
|
||||||
|
}
|
||||||
|
|
||||||
&.repositories {
|
.ui.repository.list {
|
||||||
.ui.repository.list {
|
.item {
|
||||||
.item {
|
padding-bottom: 25px;
|
||||||
border-top: 1px solid #eee;
|
|
||||||
padding-top: 25px;
|
&:not(:first-child) {
|
||||||
padding-bottom: 25px;
|
border-top: 1px solid #eee;
|
||||||
.ui.header {
|
padding-top: 25px;
|
||||||
font-size: 1.5rem;
|
}
|
||||||
padding-bottom: 10px;
|
|
||||||
.metas {
|
.ui.header {
|
||||||
color: #888;
|
font-size: 1.5rem;
|
||||||
font-size: 13px;
|
padding-bottom: 10px;
|
||||||
font-weight: normal;
|
.metas {
|
||||||
span:not(:last-child) {
|
color: #888;
|
||||||
margin-right: 5px;
|
font-size: 13px;
|
||||||
}
|
font-weight: normal;
|
||||||
}
|
span:not(:last-child) {
|
||||||
}
|
margin-right: 5px;
|
||||||
.time {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #808080;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.time {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #808080;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -18,4 +18,29 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.profile {
|
||||||
|
.ui.card {
|
||||||
|
.username {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.extra.content {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 10px;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid #eaeaea;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1 +1 @@
|
||||||
0.7.12.1116 Beta
|
0.7.13.1116 Beta
|
|
@ -5,7 +5,7 @@
|
||||||
{{template "explore/navbar" .}}
|
{{template "explore/navbar" .}}
|
||||||
<div class="twelve wide column content">
|
<div class="twelve wide column content">
|
||||||
<div class="ui repository list">
|
<div class="ui repository list">
|
||||||
{{range $i, $v := .Repos}}
|
{{range .Repos}}
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="ui header">
|
<div class="ui header">
|
||||||
<a href="{{AppSubUrl}}/{{.Owner.Name}}/{{.Name}}">{{.Owner.Name}} / {{.Name}}</a>
|
<a href="{{AppSubUrl}}/{{.Owner.Name}}/{{.Name}}">{{.Owner.Name}} / {{.Name}}</a>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<div class="ui compact small menu">
|
<div class="ui compact small menu">
|
||||||
{{if not .CommitsCount}}
|
{{if not .PageIsList}}
|
||||||
<a class="{{if .PageIsIssueList}}active{{end}} item" href="{{.RepoLink}}/issues">{{.i18n.Tr "repo.issues"}}</a>
|
<a class="{{if .PageIsIssueList}}active{{end}} item" href="{{.RepoLink}}/issues">{{.i18n.Tr "repo.issues"}}</a>
|
||||||
<a class="{{if .PageIsPullList}}active{{end}} item" href="{{.RepoLink}}/pulls">{{.i18n.Tr "repo.pulls"}}</a>
|
<a class="{{if .PageIsPullList}}active{{end}} item" href="{{.RepoLink}}/pulls">{{.i18n.Tr "repo.pulls"}}</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
@ -1,104 +1,86 @@
|
||||||
{{template "ng/base/head" .}}
|
{{template "base/head" .}}
|
||||||
{{template "ng/base/header" .}}
|
<div class="user profile">
|
||||||
<div class="main-wrapper">
|
<div class="ui container">
|
||||||
<div id="user-profile-page" class="container clear">
|
<div class="ui grid">
|
||||||
<div class="grid-1-5 left">
|
<div class="ui five wide column">
|
||||||
<div>
|
<div class="ui card">
|
||||||
{{if and (.Owner.UseCustomAvatar) (eq .SignedUserName .Owner.Name)}}
|
{{if and (.Owner.UseCustomAvatar) (eq .SignedUserName .Owner.Name)}}
|
||||||
<a href="{{AppSubUrl}}/user/settings" id="profile-avatar" original-title="{{.i18n.Tr "user.change_custom_avatar"}}">
|
<a class="image poping up" href="{{AppSubUrl}}/user/settings" id="profile-avatar" data-content="{{.i18n.Tr "user.change_custom_avatar"}}" data-variation="inverted tiny" data-position="bottom center">
|
||||||
{{else if eq .SignedUserName .Owner.Name}}
|
<img src="{{.Owner.AvatarLink}}?s=290" title="{{.Owner.Name}}"/>
|
||||||
<a href="http://gravatar.com/emails/" id="profile-avatar" original-title="{{.i18n.Tr "user.change_avatar"}}">
|
</a>
|
||||||
{{else}}
|
{{else if eq .SignedUserName .Owner.Name}}
|
||||||
<a id="profile-avatar">
|
<a class="image poping up" href="http://gravatar.com/emails/" id="profile-avatar" data-content="{{.i18n.Tr "user.change_avatar"}}" data-variation="inverted tiny" data-position="bottom center">
|
||||||
|
<img src="{{.Owner.AvatarLink}}?s=290" title="{{.Owner.Name}}"/>
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
<span class="image">
|
||||||
|
<img src="{{.Owner.AvatarLink}}?s=290" title="{{.Owner.Name}}"/>
|
||||||
|
</span>
|
||||||
|
{{end}}
|
||||||
|
<div class="content">
|
||||||
|
{{if .Owner.FullName}}<span class="header text center">{{.Owner.FullName}}</span>{{end}}
|
||||||
|
<span class="username text center">{{.Owner.Name}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="extra content">
|
||||||
|
<ul class="text black">
|
||||||
|
{{if .Owner.Location}}
|
||||||
|
<li><i class="icon octicon octicon-location"></i> {{.Owner.Location}}</li>
|
||||||
|
{{end}}
|
||||||
|
{{if and .Owner.Email .IsSigned}}
|
||||||
|
<li>
|
||||||
|
<i class="icon octicon octicon-mail"></i>
|
||||||
|
<a href="mailto:{{.Owner.Email}}" rel="nofollow">{{.Owner.Email}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{if .Owner.Website}}
|
||||||
|
<li>
|
||||||
|
<i class="icon octicon octicon-link"></i>
|
||||||
|
<a target="_blank" href="{{.Owner.Website}}">{{.Owner.Website}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
<li><i class="icon octicon octicon-clock"></i> {{.i18n.Tr "user.join_on"}} {{DateFmtShort .Owner.Created}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui eleven wide column">
|
||||||
|
<div class="ui secondary pointing menu">
|
||||||
|
<a class="{{if ne .TabName "activity"}}active{{end}} item" href="{{.Owner.HomeLink}}">
|
||||||
|
<i class="icon octicon octicon-repo"></i> {{.i18n.Tr "user.repositories"}}
|
||||||
|
</a>
|
||||||
|
<a class="item">
|
||||||
|
<a class="{{if eq .TabName "activity"}}active{{end}} item" href="{{.Owner.HomeLink}}?tab=activity">
|
||||||
|
<i class="icon octicon octicon-rss"></i> {{.i18n.Tr "user.activity"}}
|
||||||
|
</a>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{if ne .TabName "activity"}}
|
||||||
|
<div class="ui repository list">
|
||||||
|
{{range .Repos}}
|
||||||
|
{{if or (not .IsPrivate) (.HasAccess $.SignedUser)}}
|
||||||
|
<div class="item">
|
||||||
|
<div class="ui header">
|
||||||
|
<a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a>
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="text gold"><i class="icon octicon octicon-lock"></i></span>
|
||||||
{{end}}
|
{{end}}
|
||||||
<img class="profile-avatar" src="{{.Owner.AvatarLink}}?s=234" title="{{.Owner.Name}}"/>
|
|
||||||
</a>
|
<div class="ui right metas">
|
||||||
<div class="text-center" id="profile-name">
|
<span class="text grey"><i class="octicon octicon-star"></i> {{.NumStars}}</span>
|
||||||
{{if .Owner.FullName}}<span id="profile-fullname" class="center-block">{{.Owner.FullName}}</span><br>{{end}}
|
<span class="text grey"><i class="octicon octicon-git-branch"></i> {{.NumForks}}</span>
|
||||||
<span class="center-block" id="profile-username">{{.Owner.Name}}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="profile-info">
|
|
||||||
<hr>
|
|
||||||
<ul class="list-no-style">
|
|
||||||
{{if .Owner.Location}}
|
|
||||||
<li class="list-group-item"><i class="octicon octicon-location"></i> {{.Owner.Location}}</li>
|
|
||||||
{{end}}
|
|
||||||
{{if and .Owner.Email .IsSigned}}
|
|
||||||
<li class="list-group-item"><i class="octicon octicon-mail"></i> <a href="mailto:{{.Owner.Email}}" rel="nofollow">{{.Owner.Email}}</a></li>
|
|
||||||
{{end}}
|
|
||||||
{{if .Owner.Website}}
|
|
||||||
<li class="list-group-item"><i class="octicon octicon-link"></i> <a target="_blank" href="{{.Owner.Website}}">{{.Owner.Website}}</a></li>
|
|
||||||
{{end}}
|
|
||||||
<li class="list-group-item"><i class="octicon octicon-clock"></i> {{.i18n.Tr "user.join_on"}} {{DateFmtShort .Owner.Created}}</li>
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
<ul class="list-no-style">
|
|
||||||
<li class="list-group-item profile-rel">
|
|
||||||
<a class="text-black" href="">
|
|
||||||
<strong>{{.Owner.NumFollowers}}</strong>
|
|
||||||
<p>{{.i18n.Tr "user.followers"}}</p>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item profile-rel">
|
|
||||||
<a class="text-black" href="">
|
|
||||||
<strong>{{.Owner.NumStars}}</strong>
|
|
||||||
<p>{{.i18n.Tr "user.starred"}}</p>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item profile-rel">
|
|
||||||
<a class="text-black" href="">
|
|
||||||
<strong>{{.Owner.NumFollowings}}</strong>
|
|
||||||
<p>{{.i18n.Tr "user.following"}}</p>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<hr>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="grid-4-5 left">
|
|
||||||
<div id="profile-body">
|
|
||||||
<ul class="menu menu-line" id="profile-header">
|
|
||||||
<li>
|
|
||||||
<a {{if not .TabName}}class="current"{{end}} href="{{.Owner.HomeLink}}"><i class="octicon octicon-repo"></i> {{.i18n.Tr "user.repositories"}}</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a {{if eq .TabName "activity"}}class="current"{{end}} href="{{.Owner.HomeLink}}?tab=activity"><i class="octicon octicon-repo"></i> {{.i18n.Tr "user.activity"}}</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="tab-content">
|
|
||||||
{{if eq .TabName "activity"}}
|
|
||||||
<div class="tab-pane active" id="dashboard-news">
|
|
||||||
<br>
|
|
||||||
{{template "user/dashboard/feeds" .}}
|
|
||||||
</div>
|
|
||||||
{{else}}
|
|
||||||
<div class="tab-pane active">
|
|
||||||
<div id="org-repo-list">
|
|
||||||
{{range .Repos}}
|
|
||||||
{{if or (not .IsPrivate) (.HasAccess $.SignedUser)}}
|
|
||||||
<div class="org-repo-item">
|
|
||||||
<ul class="org-repo-status right">
|
|
||||||
<li><i class="octicon octicon-star"></i> {{.NumStars}}</li>
|
|
||||||
<li><i class="octicon octicon-git-branch"></i> {{.NumForks}}</li>
|
|
||||||
</ul>
|
|
||||||
<h2>
|
|
||||||
<a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a>
|
|
||||||
{{if .IsPrivate}}
|
|
||||||
<span class="text-gold"><i class="octicon octicon-lock"></i></span>
|
|
||||||
{{end}}
|
|
||||||
</h2>
|
|
||||||
<p class="org-repo-description">{{.Description}}</p>
|
|
||||||
<p class="org-repo-updated">{{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}</p>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
{{if .Description}}<p>{{.Description}}</p>{{end}}
|
||||||
|
<p class="time">{{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}</p>
|
||||||
</div>
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<br>
|
||||||
|
{{template "user/dashboard/feeds" .}}
|
||||||
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "ng/base/footer" .}}
|
{{template "base/footer" .}}
|
Loading…
Add table
Reference in a new issue