ore/app/views/projects/pages/view.scala.html
@*
Documentation page within Project overview.
*@
@import java.text.NumberFormat
@import controllers.project.routes
@import controllers.sugar.Requests.OreRequest
@import ore.models.project.Page
@import models.viewhelper.{ProjectData, ScopedProjectData}
@import ore.OreConfig
@import ore.db.Model
@import util.StringFormatterUtils._
@import views.html.utils.editor
@import views.html.helper.CSPNonce
@import ore.permission.Permission
@import ore.markdown.MarkdownRenderer
@import util.syntax._
@import ore.models.project.io.ProjectFiles
@(p: ProjectData,
sp: ScopedProjectData,
rootPages: Seq[(Model[Page], Seq[Page])],
page: Page,
parentPage: Option[Page],
pageCount: Int,
editorOpen: Boolean = false)(implicit messages: Messages, request: OreRequest[_], flash: Flash, config: OreConfig, renderer: MarkdownRenderer, projectFiles: ProjectFiles)
@canEditPages = @{
sp.perms(Permission.EditPage)
}
@scripts = {
<script type="text/javascript" src="@controllers.routes.Assets.versioned("javascripts/pageCollapse.js")"></script>
<script @CSPNonce.attr>
pluginId = '@p.project.pluginId';
namespace = '@p.project.namespace';
</script>
@if(editorOpen) {
<script @CSPNonce.attr>$(function() { $('.btn-edit').click(); });</script>
}
}
@projects.view(p, sp, "#docs", additionalScripts = scripts) {
<div class="row">
<div class="col-md-9">
<div class="row">
<div class="col-md-12">
@editor(
saveCall = routes.Pages.save(p.project.ownerName, p.project.slug, page.fullSlug(parentPage)),
deleteCall = routes.Pages.delete(p.project.ownerName, p.project.slug, page.fullSlug(parentPage)),
deletable = !page.isHome,
enabled = canEditPages,
raw = page.contents,
cooked = page.html(Some(p.project)),
subject = "Page",
extraFormValue = page.name)
</div>
</div>
</div>
<div class="col-md-3">
<div class="stats minor">
<p>@messages("project.category.info", p.project.category.title)</p>
<p>@messages("project.publishDate", prettifyDate(p.project.createdAt))</p>
<p>@p.project.viewCount views</p>
<p>@p.project.starCount <a href="@routes.Projects.showStargazers(p.project.ownerName, p.project.slug, None)">stars</a></p>
@* TODO Show count here too once API is released and we can start to break the old one *@
<p><a href="@routes.Projects.showWatchers(p.project.ownerName, p.project.slug, None)">watchers</a></p>
<p>@NumberFormat.getInstance.format(p.project.downloadCount) total downloads</p>
@p.settings.licenseName.map { licenseName =>
<p>
@Html(messages("project.license.link"))
<a target="_blank" rel="noopener" href="@p.settings.licenseUrl">@licenseName</a>
</p>
}
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="pull-left panel-title">@messages("page.plural")</h3>
@if(canEditPages && pageCount < config.ore.projects.maxPages) {
<button data-toggle="modal" data-target="#new-page" title="New"
class="new-page btn yellow btn-xs pull-right">
<i class="fas fa-plus"></i>
</button>
@projects.pages.modalPageCreate(p.project, rootPages.map(_._1))
}
</div>
<ul class="list-group">
<li class="list-group-item">
<a href="@routes.Pages.show(p.project.ownerName, p.project.slug, Page.homeName)">
@Page.homeName
</a>
</li>
@rootPages.filter(_._1.name != Page.homeName).map { case (pg, children) =>
<li class="list-group-item">
@if(children.nonEmpty) {
@if(!page.parentId.contains(pg.id.value)) {
<a class="page-expand" data-page-id="@pg.id">
<i class="far fa-plus-square"></i>
</a>
} else {
<a class="page-collapse" data-page-id="@pg.id">
<i class="far fa-minus-square"></i>
</a>
}
}
<a href="@routes.Pages.show(p.project.ownerName, p.project.slug, pg.fullSlug(None))">
@pg.name
</a>
</li>
@if(page.parentId.contains(pg.id)) {
<div class="page-children" data-page-id="@pg.id">
@children.map { child =>
<li class="list-group-item page-item-child">
<a href="@routes.Pages.show(p.project.ownerName, p.project.slug, child.fullSlug(Some(pg)))">
@child.name
</a>
</li>
}
</div>
}
}
</ul>
</div>
<!-- Member list -->
@users.memberList(
j = p,
perms = sp.permissions,
settingsCall = routes.Projects.showSettings(p.project.ownerName, p.project.slug)
)
</div>
</div>
}