MiniDigger/Hangar

View on GitHub
ore/app/views/users/admin/userAdmin.scala.html

Summary

Maintainability
Test Coverage
@import controllers.sugar.Requests.OreRequest
@import ore.models.project.Project
@import ore.models.user.role.{OrganizationUserRole, ProjectUserRole, UserRoleModel}
@import ore.models.user.User
@import models.viewhelper.{OrganizationData, UserData}
@import ore.OreConfig
@import ore.db.Model
@import ore.permission.role.Role
@import ore.models.organization.Organization
@(user: UserData, orga: Option[OrganizationData], userProjectRoles: Seq[(Project, Model[ProjectUserRole])])(implicit messages: Messages, request: OreRequest[_], config: OreConfig, flash: Flash)

@prefix = @{"Edit " + (if(user.isOrga) "Organization" else "User") + ": "}

@orgRoles = @{Role.organizationRoles.filter(r => r.isAssignable || r == Role.OrganizationOwner)}
@projectRoles = @{Role.projectRoles.filter(r => r.isAssignable || r == Role.ProjectOwner)}

@panel(title: String, size: Int = 12)(content: Html) = {
    <div class="col-md-@size">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4 class="panel-title">@title</h4>
            </div>
            @content
        </div>
    </div>
}

@roleTable[T, M <: UserRoleModel[M]](keyName: String, tableType: String, withOwner: Boolean, roles: Set[(T, Model[M], String)], roleTypes: IndexedSeq[Role])(showKey: (T, M) => Html) = {
    <table class="table role-table">
        <tr><th>@keyName</th>@if(withOwner) {<th>Owner</th>}<th>Role</th><th>Accepted</th></tr>
        @roles.map { case (t, role, owner) =>
        <tr data-role-type="@tableType" data-role-id="@role.id">
            <td>@showKey(t, role)</td>
            @if(withOwner) {
                <td><a href="@routes.Application.userAdmin(owner)">@{owner}</a></td>
            }
            @if(!role.role.isAssignable) {
                <td colspan="3">
                @role.role.title
                </td>
            } else {
                <td><select class="select-role">
                @for(roleType <- roleTypes) {
                    <option value="@roleType.value" @if(role.role == roleType) {selected}
                    @if(roleType == Role.ProjectOwner || roleType == Role.OrganizationOwner) {data-refresh="true"}>@roleType.title</option>
                }
                </select></td>
                <td><input type="checkbox" class="role-accepted" @if(role.isAccepted) {checked}></td>
                <td><a href="#" class="delete-role"><i class="fas fa-trash"></i></a></td>
            }
        </tr>
        }
    </table>
}

@scripts = {
    <script type="text/javascript" src="@routes.Assets.versioned("javascripts/userAdmin.js")"></script>
}

@layout.base(prefix + user.user.name, scripts) {

    <div class="row">
        <div class="col-md-12">
            <h1>@prefix<a href="@routes.Users.showProjects(user.user.name, None)">@user.user.name</a></h1>
        </div>
    </div>

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

            <div class="row">
            @if(!user.isOrga) {
                @panel("Organizations") {
                    @roleTable[Model[Organization], OrganizationUserRole]("Organization", "orgRole", withOwner = true, user.orgas.map(t => (t._1, t._3, t._4.name)).toSet, orgRoles) { (org, _) =>
                        <a href="@routes.Application.userAdmin(org.name)">
                        @org.name
                        </a>
                    }
                }
            } else {
                @panel("Members") {
                    @roleTable[Model[User], OrganizationUserRole]("User", "memberRole", withOwner = false, orga.get.members.map(t => (t._2, t._1, null)).toSet, orgRoles) { (user, _) =>
                        <a href="@routes.Application.userAdmin(user.name)">
                        @user.name
                        </a>
                    }
                }
            }
            </div>
            @if(!user.isOrga) {
                <div class="row">
                @panel("Projects") {
                    @roleTable[Project, ProjectUserRole]("Project", "projectRole", withOwner = true, userProjectRoles.map(t => (t._1, t._2, t._1.ownerName)).toSet, projectRoles) { (project, _) =>
                        <a href="@controllers.project.routes.Projects.show(project.ownerName, project.slug)">
                        @project.name
                        </a>
                    }
                }
                </div>
            }
        </div>

        @panel("Other Administration", size=3) {
            <div class="list-group">
                <div class="list-group-item">
                    <a href="@config.security.api.url/admin/accounts/user/@user.user.id/change/">SpongeAuth Profile</a>
                </div>
                <div class="list-group-item">
                    <a href="https://forums.spongepowered.org/users/@user.user.name">Forum Profile</a>
                </div>
            </div>
        }

    </div>

}