ore/app/views/projects/settings.scala.html
@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">×</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">×</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">×</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>
}