mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-12 08:25:50 +01:00
Merge branch 'wiki-sidebar' of https://github.com/viliamjr/gitbucket into viliamjr-wiki-sidebar
# Conflicts: # src/main/twirl/gitbucket/core/wiki/page.scala.html
This commit is contained in:
@@ -38,7 +38,9 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
get("/:owner/:repository/wiki")(referrersOnly { repository =>
|
get("/:owner/:repository/wiki")(referrersOnly { repository =>
|
||||||
getWikiPage(repository.owner, repository.name, "Home").map { page =>
|
getWikiPage(repository.owner, repository.name, "Home").map { page =>
|
||||||
html.page("Home", page, getWikiPageList(repository.owner, repository.name),
|
html.page("Home", page, getWikiPageList(repository.owner, repository.name),
|
||||||
repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
repository, hasWritePermission(repository.owner, repository.name, context.loginAccount),
|
||||||
|
getWikiPage(repository.owner, repository.name, "_Sidebar"),
|
||||||
|
getWikiPage(repository.owner, repository.name, "_Footer"))
|
||||||
} getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit")
|
} getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit")
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -47,7 +49,9 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
getWikiPage(repository.owner, repository.name, pageName).map { page =>
|
getWikiPage(repository.owner, repository.name, pageName).map { page =>
|
||||||
html.page(pageName, page, getWikiPageList(repository.owner, repository.name),
|
html.page(pageName, page, getWikiPageList(repository.owner, repository.name),
|
||||||
repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
repository, hasWritePermission(repository.owner, repository.name, context.loginAccount),
|
||||||
|
getWikiPage(repository.owner, repository.name, "_Sidebar"),
|
||||||
|
getWikiPage(repository.owner, repository.name, "_Footer"))
|
||||||
} getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}/_edit")
|
} getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}/_edit")
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -124,7 +128,11 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
updateLastActivityDate(repository.owner, repository.name)
|
updateLastActivityDate(repository.owner, repository.name)
|
||||||
recordEditWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName, commitId)
|
recordEditWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName, commitId)
|
||||||
}
|
}
|
||||||
redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
|
if(notReservedPageName(form.pageName)) {
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
|
||||||
|
} else {
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/wiki")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -140,7 +148,11 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
updateLastActivityDate(repository.owner, repository.name)
|
updateLastActivityDate(repository.owner, repository.name)
|
||||||
recordCreateWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
|
recordCreateWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
|
||||||
|
|
||||||
redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
|
if(notReservedPageName(form.pageName)) {
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
|
||||||
|
} else {
|
||||||
|
redirect(s"/${repository.owner}/${repository.name}/wiki")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -186,13 +198,15 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
override def validate(name: String, value: String, messages: Messages): Option[String] =
|
override def validate(name: String, value: String, messages: Messages): Option[String] =
|
||||||
if(value.exists("\\/:*?\"<>|".contains(_))){
|
if(value.exists("\\/:*?\"<>|".contains(_))){
|
||||||
Some(s"${name} contains invalid character.")
|
Some(s"${name} contains invalid character.")
|
||||||
} else if(value.startsWith("_") || value.startsWith("-")){
|
} else if(notReservedPageName(value) && (value.startsWith("_") || value.startsWith("-"))){
|
||||||
Some(s"${name} starts with invalid character.")
|
Some(s"${name} starts with invalid character.")
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private def notReservedPageName(value: String) = ! (Array[String]("_Sidebar","_Footer") contains value)
|
||||||
|
|
||||||
private def conflictForNew: Constraint = new Constraint(){
|
private def conflictForNew: Constraint = new Constraint(){
|
||||||
override def validate(name: String, value: String, messages: Messages): Option[String] = {
|
override def validate(name: String, value: String, messages: Messages): Option[String] = {
|
||||||
targetWikiPage.map { _ =>
|
targetWikiPage.map { _ =>
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ trait WikiService {
|
|||||||
def getWikiPageList(owner: String, repository: String): List[String] = {
|
def getWikiPageList(owner: String, repository: String): List[String] = {
|
||||||
using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git =>
|
using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git =>
|
||||||
JGitUtil.getFileList(git, "master", ".")
|
JGitUtil.getFileList(git, "master", ".")
|
||||||
.filter(_.name.endsWith(".md"))
|
.filter(_.name.endsWith(".md")).filterNot(_.name.startsWith("_"))
|
||||||
.map(_.name.stripSuffix(".md"))
|
.map(_.name.stripSuffix(".md"))
|
||||||
.sortBy(x => x)
|
.sortBy(x => x)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
page: gitbucket.core.service.WikiService.WikiPageInfo,
|
page: gitbucket.core.service.WikiService.WikiPageInfo,
|
||||||
pages: List[String],
|
pages: List[String],
|
||||||
repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
|
repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
|
||||||
hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context)
|
hasWritePermission: Boolean,
|
||||||
|
sidebar: Option[gitbucket.core.service.WikiService.WikiPageInfo],
|
||||||
|
footer: Option[gitbucket.core.service.WikiService.WikiPageInfo])(implicit context: gitbucket.core.controller.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import gitbucket.core.view.helpers._
|
@import gitbucket.core.view.helpers._
|
||||||
@import gitbucket.core.service.WikiService._
|
@import gitbucket.core.service.WikiService._
|
||||||
@@ -28,9 +30,13 @@
|
|||||||
@defining(15){ max =>
|
@defining(15){ max =>
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading strong">
|
<div class="panel-heading strong">
|
||||||
Pages <span class="badge">@pages.length</span>
|
<a id="show-pages-index" href="javascript:void(0);">
|
||||||
|
<span id="triangle-down" class="octicon octicon-triangle-down"></span>
|
||||||
|
<span id="triangle-right" class="octicon octicon-triangle-right" style="display: none;"></span>
|
||||||
|
<span class="strong">Pages</span> <span class="badge">@pages.length</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group list-group-flush">
|
<ul id="pages-index" class="list-group list-group-flush">
|
||||||
@pages.zipWithIndex.map { case (page, i) =>
|
@pages.zipWithIndex.map { case (page, i) =>
|
||||||
<li class="list-group-item page-link" style="border: none; @if(i > max - 1){display:none;}">
|
<li class="list-group-item page-link" style="border: none; @if(i > max - 1){display:none;}">
|
||||||
<a href="@url(repository)/wiki/@urlEncode(page)" class="strong">@page</a>
|
<a href="@url(repository)/wiki/@urlEncode(page)" class="strong">@page</a>
|
||||||
@@ -44,6 +50,20 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@sidebar.map { sidebarPage =>
|
||||||
|
<div class="wiki-sidebar">
|
||||||
|
@if(hasWritePermission){
|
||||||
|
<a href="@url(repository)/wiki/_Sidebar/_edit" style="text-decoration: none;"><span class="octicon octicon-pencil pull-right"></span></a>
|
||||||
|
}
|
||||||
|
@markdown(sidebarPage.content, repository, true, false, false, false, pages)
|
||||||
|
</div>
|
||||||
|
}.getOrElse{
|
||||||
|
@if(hasWritePermission){
|
||||||
|
<a class="button-link" href="@url(repository)/wiki/_Sidebar/_edit" style="text-decoration: none;">
|
||||||
|
<div class="wiki-sidebar-dotted text-center"><i class="octicon octicon-plus"></i> Add a custom sidebar</div>
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
}
|
||||||
<div class="small">
|
<div class="small">
|
||||||
<strong>Clone this wiki locally</strong>
|
<strong>Clone this wiki locally</strong>
|
||||||
</div>
|
</div>
|
||||||
@@ -69,6 +89,20 @@
|
|||||||
pages = pages
|
pages = pages
|
||||||
)
|
)
|
||||||
</div>
|
</div>
|
||||||
|
@footer.map { footerPage =>
|
||||||
|
<div class="wiki-sidebar wiki-footer">
|
||||||
|
@if(hasWritePermission){
|
||||||
|
<a href="@url(repository)/wiki/_Footer/_edit" style="text-decoration: none;"><span class="octicon octicon-pencil pull-right"></span></a>
|
||||||
|
}
|
||||||
|
@markdown(footerPage.content, repository, true, false, false, false, pages)
|
||||||
|
</div>
|
||||||
|
}.getOrElse{
|
||||||
|
@if(hasWritePermission){
|
||||||
|
<a class="button-link" href="@url(repository)/wiki/_Footer/_edit" style="text-decoration: none;">
|
||||||
|
<div class="wiki-sidebar-dotted text-center"><i class="octicon octicon-plus"></i> Add a custom footer</div>
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,6 +113,24 @@ $(function(){
|
|||||||
$(e.target).parents('div.show-more').remove();
|
$(e.target).parents('div.show-more').remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#show-pages-index').click(function(e){
|
||||||
|
if($('#pages-index').is(":visible")){
|
||||||
|
$('#triangle-down').hide();
|
||||||
|
$('#triangle-right').show();
|
||||||
|
$('#pages-index').hide();
|
||||||
|
} else {
|
||||||
|
$('#triangle-right').hide();
|
||||||
|
$('#triangle-down').show();
|
||||||
|
$('#pages-index').show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
@sidebar.map { sidebarPage =>
|
||||||
|
$('#pages-index').hide();
|
||||||
|
$('#triangle-down').hide();
|
||||||
|
$('#triangle-right').show();
|
||||||
|
}
|
||||||
|
|
||||||
@if(settings.ssh && loginAccount.isDefined){
|
@if(settings.ssh && loginAccount.isDefined){
|
||||||
$('#repository-url-http').click(function(){
|
$('#repository-url-http').click(function(){
|
||||||
$('#repository-url').val('@httpUrl(repository)');
|
$('#repository-url').val('@httpUrl(repository)');
|
||||||
|
|||||||
@@ -613,6 +613,11 @@ ul.nav-stacked.side-menu li {
|
|||||||
margin-bottom: -3px;
|
margin-bottom: -3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a#show-pages-index {
|
||||||
|
color: #333;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ul.nav-stacked.side-menu li span.header {
|
ul.nav-stacked.side-menu li span.header {
|
||||||
border-top-right-radius: 3px;
|
border-top-right-radius: 3px;
|
||||||
@@ -1331,6 +1336,55 @@ a.absent {
|
|||||||
color: #c00;
|
color: #c00;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
div.wiki-index-header {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
color: #333333;
|
||||||
|
margin: 0;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
border: 1px solid #d8d8d8;
|
||||||
|
padding: 8px 8px 8px 8px;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.wiki-sidebar {
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid #d8d8d8;
|
||||||
|
padding: 8px 10px 0px 10px;
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.wiki-sidebar-dotted {
|
||||||
|
background-color: white;
|
||||||
|
border: 1px dashed #ddd;
|
||||||
|
padding: 10px 15px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.wiki-footer {
|
||||||
|
margin-top: 50px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
color: gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
div.wiki-index-content {
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid #d8d8d8;
|
||||||
|
padding: 0px;
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/* Commit */
|
/* Commit */
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user