MiniDigger/Hangar

View on GitHub
ore/app/views/projects/versions/view.scala.html

Summary

Maintainability
Test Coverage
@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">&times;</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">&times;</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">&times;</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>
        }
    }
}