ore/app/views/projects/versions/view.scala.html
@import controllers.sugar.Requests.OreRequest
@import ore.models.project.{ReviewState, Visibility}
@import models.viewhelper.{ScopedProjectData, VersionData}
@import ore.OreConfig
@import util.StringFormatterUtils._
@import views.html.helper.{CSRF, form}
@import views.html.utils.editor
@import ore.permission.Permission
@import ore.markdown.MarkdownRenderer
@import ore.data.Platform
@import util.syntax._
@import ore.models.project.io.ProjectFiles
@(v: VersionData, sp: ScopedProjectData)(implicit messages: Messages, request: OreRequest[_], flash: Flash, config: OreConfig, renderer: MarkdownRenderer, projectFiles: ProjectFiles)
@projectRoutes = @{controllers.project.routes.Projects}
@versionRoutes = @{controllers.project.routes.Versions}
@appRoutes = @{controllers.routes.Application}
@projects.view(v.p, sp, "#versions", noButtons = true) {
<!-- Version header -->
<div class="row">
<div class="col-md-12 version-header">
<!-- Title -->
<div class="clearfix">
<h1 class="pull-left">@v.v.versionString</h1>
<span class="channel channel-head" style="background-color: @v.c.color.hex;">@v.c.name</span>
</div>
<!-- User info -->
<p class="user date pull-left">
<a href="@routes.Users.showProjects(v.p.project.ownerName, None)">
<strong>@v.p.project.ownerName</strong>
</a>
released this version on @prettifyDate(v.v.createdAt)
</p>
<!-- Buttons -->
<div class="pull-right version-actions">
<div class="version-icons">
<div>
@if(v.isRecommended) {
<i data-toggle="tooltip" data-placement="left"
title="@messages("version.recommended")"
class="recommended far fa-lg fa-gem pull-right"></i>
}
@if(v.v.reviewState.isChecked) {
@if(request.headerData.globalPerm(Permission.Reviewer)) {
@v.approvedBy.zip(v.v.approvedAt).map { t =>
<i class="minor">
@Html(messages("version.approved.info", t._1, prettifyDate(t._2)))
</i>
}
}
@if(v.v.reviewState == ReviewState.PartiallyReviewed) {
<i data-toggle="tooltip" data-placement="left" title="@messages("version.approvedPartial")"
class="far fa-lg fa-check-circle"></i>
} else {
<i data-toggle="tooltip" data-placement="left" title="@messages("version.approved")"
class="far fa-lg fa-check-circle"></i>
}
}
</div>
</div>
<div class="version-buttons pull-right">
<div><span class="date">@v.v.humanFileSize</span></div>
<div>
@if(!v.isRecommended && sp.perms(Permission.EditVersion) && v.v.visibility != Visibility.SoftDelete) {
@form(action = versionRoutes.setRecommended(
v.p.project.ownerName, v.p.project.slug, v.v.versionString), 'class -> "form-inline") {
@CSRF.formField
<button type="submit" class="btn btn-info">
<i class="fas fa-gem"></i> Set recommended
</button>
}
}
@if(request.headerData.globalPerm(Permission.Reviewer)) {
@if(v.v.reviewState.isChecked) {
<a href="@v.fullSlug/reviews" class="btn btn-info">@messages("review.log")</a>
} else {
<a href="@v.fullSlug/reviews" class="btn btn-success">
<i class="fas fa-play"></i> @messages("review.start")
</a>
}
}
@if(v.v.visibility == Visibility.SoftDelete) {
<a class="btn btn-danger" disabled data-toggle="tooltip" data-placement="top"
title="@messages("version.delete.alreadyDeleted")">
<i class="fas fa-trash"></i> @messages("general.delete")
</a>
} else {
@if(sp.perms(Permission.DeleteVersion)) {
@if(v.p.publicVersions == 1) {
<a class="btn btn-danger" disabled data-toggle="tooltip" data-placement="top"
title="@messages("version.delete.cannotLast")">
<i class="fas fa-trash"></i> @messages("general.delete")
</a>
} else {
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#modal-delete">
<i class="fas fa-trash"></i> @messages("general.delete")
</button>
}
}
}
<div class="btn-group btn-download">
<a href="@versionRoutes.download(v.p.project.ownerName, v.p.project.slug, v.v.versionString, None)"
title="@messages("project.download.recommend")" data-toggle="tooltip"
data-placement="bottom" class="btn btn-primary">
<i class="fas fa-download"></i> @messages("general.download")
</a>
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu dropdown-menu-right">
<li><a href="@versionRoutes.download(v.p.project.ownerName, v.p.project.slug, v.v.versionString, None)">@messages("general.download")</a></li>
<li><a href="#" class="copy-url" data-clipboard-text="@config.app.baseUrl@versionRoutes.download(v.p.project.ownerName, v.p.project.slug, v.v.versionString, None)">Copy URL</a></li>
</ul>
</div>
@if(request.hasUser && request.headerData.globalPerm(Permission.ViewLogs)) {
<div class="dropdown dropdown-menu-right" style="display: inline-block">
<button class="btn btn-alert dropdown-toggle" type="button" id="admin-version-actions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
Admin actions
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="admin-version-actions">
<li><a href="@appRoutes.showLog(None, None, None, Some(v.v.id), None, None, None)">User Action Logs</a></li>
@if(request.headerData.globalPerm(Permission.Reviewer)) {
@if(v.v.visibility == Visibility.SoftDelete) {
<li><a href="#" data-toggle="modal" data-target="#modal-restore">Undo delete</a></li>
}
@if(request.headerData.globalPerm(Permission.HardDeleteVersion) && !v.isRecommended) {
<li><a href="#" data-toggle="modal" data-target="#modal-harddelete" style="color: darkred">Hard delete</a></li>
}
}
</ul>
</div>
}
</div>
</div>
</div>
</div>
</div>
<!-- Description -->
<div class="row version-description">
<div id="description" class="col-md-8">
<div class="row">
@if(!v.v.reviewState.isChecked) {
<div class="col-md-12">
<div class="alert-review alert alert-info" role="alert">
<i class="fas fa-info-circle"></i>
@messages("project.download.warn")
</div>
</div>
}
<div class="col-md-12">
@editor(
saveCall = versionRoutes.saveDescription(
v.p.project.ownerName, v.p.project.slug, v.v.versionString
),
enabled = sp.perms(Permission.EditPage),
raw = v.v.description.getOrElse(""),
cooked = v.v.obj.render,
subject = "Version"
)
</div>
</div>
</div>
@if(v.v.dependencies.nonEmpty) {
<!-- Dependencies -->
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Dependencies</h3>
</div>
<ul class="list-group">
@for(platform <- Platform.getPlatforms(v.dependencies.map(_._1.pluginId).toList)) {
@v.v.dependencies.find(_.pluginId == platform.dependencyId).map { dependency =>
<li class="list-group-item">
<a href="@{platform.url}">
<strong>@{platform.name}</strong>
</a>
<p class="version-string">@dependency.version</p>
</li>
}
}
@v.filteredDependencies.map { case (depend, project)=>
<li class="list-group-item">
@if(project.isDefined) {
<a href="@projectRoutes.show(
project.get.ownerName, project.get.slug)">
<strong>@project.get.name</strong>
</a>
} else {
<div class="minor">
@depend.pluginId
<i class="fas fa-question-circle"
title="@messages("version.dependency.notOnOre")"
data-toggle="tooltip" data-placement="right"></i>
</div>
}
<p class="version-string">@depend.version</p>
</li>
}
</ul>
</div>
</div>
} else {
<p class="minor text-center"><i>@messages("version.dependency.no")</i></p>
}
</div>
@if(sp.perms(Permission.DeleteVersion) && v.p.publicVersions != 1) {
<div class="modal fade" id="modal-delete" tabindex="-1" role="dialog" aria-labelledby="label-delete">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Cancel">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="label-delete">@messages("version.delete.title")</h4>
</div>
@form(action = versionRoutes.softDelete(v.p.project.ownerName, v.p.project.slug, v.v.versionString)) {
<div class="modal-body">
@messages("version.delete.info")
<textarea name="comment" class="textarea-delete-comment form-control" rows="3"></textarea>
</div>
<div class="modal-footer">
<div class="form-inline">
@CSRF.formField
<button type="button" class="btn btn-default" data-dismiss="modal">
@messages("channel.edit.close")
</button>
<input type="submit" name="delete" value="@messages("general.delete")" class="btn btn-danger">
</div>
</div>
}
</div>
</div>
</div>
}
@if(request.headerData.globalPerm(Permission.Reviewer)) {
@if(v.v.visibility == Visibility.SoftDelete) {
<div class="modal fade" id="modal-restore" tabindex="-1" role="dialog" aria-labelledby="label-delete">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Cancel">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="label-delete">@messages("general.restore")</h4>
</div>
@form(action = versionRoutes.restore(v.p.project.ownerName, v.p.project.slug, v.v.versionString)) {
<div class="modal-body">
<textarea name="comment" class="textarea-delete-comment form-control" rows="3"></textarea>
</div>
<div class="modal-footer">
<div class="form-inline">
@CSRF.formField
<button type="button" class="btn btn-default" data-dismiss="modal">
@messages("channel.edit.close")
</button>
<input type="submit" name="delete" value="@messages("general.restore")" class="btn btn-success">
</div>
</div>
}
</div>
</div>
</div>
}
@if(request.headerData.globalPerm(Permission.HardDeleteVersion)) {
<div class="modal fade" id="modal-harddelete" tabindex="-1" role="dialog" aria-labelledby="label-delete">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Cancel">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="label-delete">@messages("general.harddelete")</h4>
</div>
@form(action = versionRoutes.delete(v.p.project.ownerName, v.p.project.slug, v.v.versionString)) {
<div class="modal-body">
<textarea name="comment" class="textarea-delete-comment form-control" rows="3"></textarea>
</div>
<div class="modal-footer">
<div class="form-inline">
@CSRF.formField
<button type="button" class="btn btn-default" data-dismiss="modal">
@messages("channel.edit.close")
</button>
<input type="submit" name="delete" value="@messages("general.harddelete")" class="btn btn-danger">
</div>
</div>
}
</div>
</div>
</div>
}
}
}