MiniDigger/Hangar

View on GitHub
ore/app/views/projects/settings.scala.html

Summary

Maintainability
Test Coverage
@import controllers.sugar.Requests.OreRequest
@import models.viewhelper.{ProjectData, ScopedProjectData}
@import ore.OreConfig
@import ore.db.Model
@import views.html.helper.{CSRF, form}
@import views.html.utils
@import views.html.helper.CSPNonce
@import ore.permission.Permission
@import ore.markdown.MarkdownRenderer
@import ore.models.api.ProjectApiKey
@import ore.util.OreMDC
@import ore.models.project.io.ProjectFiles
@import util.syntax._

@(p: ProjectData, sp: ScopedProjectData, deploymentKey: Option[Model[ProjectApiKey]])(implicit messages: Messages, flash: Flash,
        request: OreRequest[_], config: OreConfig, renderer: MarkdownRenderer, projectFiles: ProjectFiles)

@projectRoutes = @{controllers.project.routes.Projects}

@scripts = {
    <script type="text/javascript" src="@routes.Assets.versioned("javascripts/hideProject.js")"></script>
    <script type="text/javascript" src="@routes.Assets.versioned("javascripts/iconUpload.js")"></script>
    <script type="text/javascript" src="@routes.Assets.versioned("javascripts/keyGen.js")"></script>
    <script @CSPNonce.attr>
            projectName = "@p.project.name";
            PROJECT_OWNER = "@p.project.ownerName";
            PROJECT_SLUG = "@p.project.slug";
            pluginId = "@p.project.pluginId";
            keyGenText = "@messages("project.settings.genKey")";
            keyRevokeText = "@messages("project.settings.revokeKey")";
    </script>
}

@projects.view(p, sp, "#settings", additionalScripts = scripts) {

    <div class="row">
        <div class="col-md-8">

            <!-- Main settings -->
            <div class="panel panel-default panel-settings">
                <div class="panel-heading">
                    <h3 class="panel-title pull-left">@messages("project.settings")</h3>
                    @if(request.headerData.globalPerm(Permission.SeeHidden)) {
                        @projects.helper.btnHide(p.project.namespace, p.project.visibility)

                        <div class="modal fade" id="modal-visibility-comment" tabindex="-1" role="dialog" aria-labelledby="modal-visibility-comment">
                            <div class="modal-dialog" role="document">
                                <div class="modal-content">
                                    <div class="modal-header">
                                        <button type="button" class="close" data-dismiss="modal" aria-label="@messages("general.close")">
                                            <span aria-hidden="true">&times;</span>
                                        </button>
                                        <h4 class="modal-title" style="color:black;">Comment</h4>
                                    </div>
                                    <div class="modal-body">
                                        <textarea class="textarea-visibility-comment form-control" rows="3"></textarea>
                                    </div>
                                    <div class="modal-footer">
                                        <button class="btn btn-default" data-dismiss="modal">@messages("general.close")</button>
                                        <button class="btn btn-visibility-comment-submit btn-primary"><i class="fas fa-pencil-alt"></i> Submit</button>
                                    </div>
                                </div>
                            </div>
                        </div>
                    }
                </div>

                <div class="panel-body">
                    @projects.helper.inputSettings(
                        form = "save",
                        homepage = p.settings.homepage,
                        issues = p.settings.issues,
                        source = p.settings.source,
                        support = p.settings.support,
                        licenseName = p.settings.licenseName,
                        licenseUrl = p.settings.licenseUrl,
                        selected = Some(p.project.category),
                        forumSync = p.settings.forumSync,
                        keywords = p.project.keywords
                    )

                        <!-- Description -->
                    @defining(config.ore.projects.maxDescLen) { maxLength =>
                        <div class="setting">
                            <div class="setting-description">
                                <h4>Description</h4>
                                <p>A short description of your project (max @maxLength).</p>
                            </div>
                            <input form="save" class="form-control" type="text" id="description"
                            name="description" maxlength="@maxLength"
                                @p.project.description.map { description =>
                                value="@description"
                                }.getOrElse {
                                    placeholder="@messages("version.create.noDescription")"
                            }
                            />
                            <div class="clearfix"></div>
                        </div>
                    }

                        <!-- Project icon -->
                    <div class="setting setting-icon">
                        <form id="form-icon" enctype="multipart/form-data">
                            @CSRF.formField
                            <div class="setting-description">
                                <h4>Icon</h4>

                                @utils.userAvatar(
                                    Some(p.projectOwner.name),
                                    p.projectOwner.avatarUrl,
                                    imgSrc = p.project.obj.iconUrl,
                                    clazz = "user-avatar-md")

                                <input class="form-control-static" type="file" id="icon" name="icon" />
                            </div>
                            <div class="setting-content">
                                <div class="icon-description">
                                    <p>Upload an image representative of your project.</p>
                                    <div class="btn-group pull-right">
                                        <button class="btn btn-default btn-reset">Reset</button>
                                        <button class="btn btn-info btn-upload pull-right" disabled>
                                            <i class="fas fa-upload"></i> Upload
                                        </button>
                                    </div>
                                </div>
                            </div>
                            <div class="clearfix"></div>
                        </form>
                    </div>

                    @if(sp.perms(Permission.EditApiKeys)) {
                        <div class="setting">
                            <div class="setting-description">
                                <h4>@messages("project.settings.deployKey")</h4>
                                <p>
                                    @messages("project.settings.deployKey.info")
                                    <a href="#"><i class="fas fa-question-circle"></i></a>
                                </p>
                                @deploymentKey.map { key =>
                                <input class="form-control input-key" type="text" value="@key.value" readonly />
                                }.getOrElse {
                                    <input class="form-control input-key" type="text" value="" readonly />
                                }
                            </div>
                            <div class="setting-content">
                            @deploymentKey.map { key =>
                            <button class="btn btn-danger btn-block btn-key-revoke" data-key-id="@key.id">
                                <span class="spinner" style="display: none;"><i class="fas fa-spinner fa-spin"></i></span>
                                <span class="text">@messages("project.settings.revokeKey")</span>
                            </button>
                            }.getOrElse {
                                <button class="btn btn-info btn-block btn-key-gen">
                                    <span class="spinner" style="display: none;"><i class="fas fa-spinner fa-spin"></i></span>
                                    <span class="text">@messages("project.settings.genKey")</span>
                                </button>
                            }
                            </div>
                            <div class="clearfix"></div>
                        </div>
                    }

                        <!-- Rename -->
                    <div class="setting">
                        <div class="setting-description">
                            <h4 class="danger">@messages("project.rename")</h4>
                            <p>@messages("project.rename.info")</p>
                        </div>
                        <div class="setting-content">
                            <input form="rename" id="name" name="name" class="form-control" type="text"
                            value="@p.project.name"
                            maxlength="@config.ore.projects.maxNameLen">
                            <button id="btn-rename" data-toggle="modal" data-target="#modal-rename"
                            class="btn btn-warning" disabled>
                            @messages("project.rename")
                            </button>
                        </div>
                        <div class="clearfix"></div>
                    </div>

                        <!-- Delete -->
                    @if(sp.perms(Permission.DeleteProject)) {
                        <div class="setting">
                            <div class="setting-description">
                                <h4 class="danger">Delete</h4>
                                <p>Once you delete a project, it cannot be recovered.</p>
                            </div>
                            <div class="setting-content">
                                <button class="btn btn-delete btn-danger" data-toggle="modal"
                                data-target="#modal-delete">
                                    Delete
                                </button>
                            </div>
                        <div class="clearfix"></div>
                    </div>
                    }

                    @if(request.headerData.globalPerm(Permission.HardDeleteProject)) {
                        <div class="setting striped">
                            <div class="setting-description">
                                <h4 class="danger">Hard Delete</h4>
                                <p>Once you delete a project, it cannot be recovered.</p>
                            </div>
                            <div class="setting-content">
                                <button class="btn btn-delete btn-danger btn-visibility-change" data-project="@p.project.ownerName/@p.project.slug" data-level="-99" data-modal="true">
                                    <strong>Hard Delete</strong>
                                </button>
                            </div>
                            <div class="clearfix"></div>
                        </div>
                    }

                    @form(action = projectRoutes.save(p.project.ownerName, p.project.slug), 'id -> "save",
                        'class -> "pull-right") {
                        @CSRF.formField
                        <input type="hidden" id="update-icon" name="update-icon" value="false" />
                        <button type="submit" name="save" class="btn btn-success btn-spinner" data-icon="fa-check">
                            <i class="fas fa-check"></i> Save changes
                        </button>
                    }
                </div>
            </div>
        </div>

            <!-- Side panel -->
        <div class="col-md-4">
            @users.memberList(p,
                editable = true,
                perms = sp.permissions,
                removeCall = projectRoutes.removeMember(p.project.ownerName, p.project.slug),
                settingsCall = projectRoutes.showSettings(p.project.ownerName, p.project.slug)
            )
        </div>
    </div>
    </div>

    <div class="modal fade" id="modal-rename" tabindex="-1" role="dialog" aria-labelledby="label-rename">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                    aria-label="@messages("general.cancel")">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="label-rename">@messages("project.rename.title")</h4>
                </div>
                <div class="modal-body">
                @messages("project.rename.info")
                </div>
                <div class="modal-footer">
                    <div class="form-inline">
                    @form(action = projectRoutes.rename(p.project.ownerName, p.project.slug), 'id -> "rename") {
                        @CSRF.formField
                        <button type="button" class="btn btn-default" data-dismiss="modal">
                        @messages("channel.edit.close")
                        </button>
                        <input type="submit" name="rename" value="@messages("project.rename")" class="btn btn-warning">
                        }
                    </div>
                </div>
            </div>
        </div>
    </div>

    <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("project.delete.title")</h4>
                </div>
                @form(action = projectRoutes.softDelete(p.project.ownerName, p.project.slug)) {
                    <div class="modal-body">
                        @messages("project.delete.info")
                        <br>
                        <textarea name="comment" class="textarea-delete-comment form-control" rows="3"></textarea>
                        <br>
                        <div class="alert alert-warning">
                        @messages("project.delete.info.uniqueid", p.project.name)
                        </div>
                    </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>

}