MiniDigger/Hangar

View on GitHub
ore/app/views/home.scala.html

Summary

Maintainability
Test Coverage
@*
The main entry point of Ore. This page displays a list of Projects that can be
sorted according to different criteria.
*@
@import scala.util.Random

@import controllers.sugar.Requests.OreRequest
@import ore.models.project.{Project, Version, VersionTag}
@import ore.models.user.User
@import ore.models.project.ProjectSortingStrategy._
@import ore.models.project.ProjectSortingStrategy
@import ore.OreConfig
@import models.querymodels.ProjectListEntry
@import views.html.utils.alert
@import views.html.helper.CSPNonce
@import ore.data.Platform
@import ore.data.PlatformCategory
@import ore.data.project.Category
@import ore.models.project.io.ProjectFiles
@(models: Seq[ProjectListEntry], visibleCategories: Option[Seq[Category]], query: Option[String], page: Int,
        sort: ProjectSortingStrategy, platformCategory: Option[PlatformCategory], platform: Option[Platform],
        orderWithRelevance: Boolean, totalProjects: Int)(implicit messages: Messages, flash: Flash,
        request: OreRequest[_], config: OreConfig, projectFiles: ProjectFiles)

@randomSponsor = @{
    val logos = config.sponge.sponsors

    val index = new Random().nextInt(logos.size)
    logos(index)
}

@generateCategoryStrings(categories: Seq[Category]) = @{
    categories.map(_.apiName)
}

@generateModifiedQueryString(categories: Seq[Category], modifiedCategory: Category) = @{
    if (categories.isEmpty) {
        generateCategoryStrings(Seq(modifiedCategory))
    } else if (categories.contains(modifiedCategory)) {
        generateCategoryStrings((categories.toSet - modifiedCategory).toSeq)
    } else if (categories.size + 1 == Category.visible.size) {
        Nil
    } else {
        generateCategoryStrings((categories.toSet + modifiedCategory).toSeq)
    }
}

@categoryStrings = @{
    generateCategoryStrings(visibleCategories.getOrElse(Nil))
}

@orderingOption = @{
    sort match {
        case ProjectSortingStrategy.Default => None
        case _ => Some(sort.apiName)
    }
}

@relevanceOption = @{
    Some(orderWithRelevance).filterNot(identity)
}

@scripts = {
    <script type="text/javascript" src="@routes.Assets.versioned("javascripts/home.js")"></script>
    <script @CSPNonce.attr>
    @if(visibleCategories.isDefined) {
    CATEGORY_STRING = "@visibleCategories.get.map(_.value).mkString(",")";
    }
    @if(!sort.equals(ProjectSortingStrategy.Default)) {
    SORT_STRING = "@sort.id";
    }
    @if(request.getQueryString("q").isDefined) {
    QUERY_STRING = "@request.getQueryString("q").get";
    }
    @if(!orderWithRelevance) {
    ORDER_WITH_RELEVANCE = "@orderWithRelevance";
    }
    currentlyLoaded = @models.size;
    </script>
}

@meta = {
    <meta property="og:title" content="@messages("general.appName")">
    <meta property="og:type" content="website" />
    <meta property="og:url" content="@config.app.baseUrl">
    <meta property="og:image" content="@routes.Assets.versioned("images/ore-dark.png")" />
    <meta property="og:description" content="@messages("general.description")" />
}

@layout.base(messages("general.title"), scripts, additionalMeta = meta) {

    <!-- Header -->
    <div class="index-header">
        <div class="row centered-content-row">
            <div class="col-md-9 ore-banner">
                <div class="row aligned-row">
                    <div class="col-xs-2 ore-logo">
                        <img src="@routes.Assets.versioned("images/ore-colored.svg")" />
                    </div>
                    <div class="col-xs-10 text">
                        <div class="headline">Ore</div>
                        <div>A Minecraft package repository</div>
                    </div>
                </div>
            </div>
            <div class="col-md-3 sponsor">
                <div class="panel sponsor-panel">
                    <span>Sponsored by</span>
                    <div class="panel-body">
                    @defining(randomSponsor) { sponsor =>
                        <a href="@sponsor.link">
                            <img class="logo" src="@routes.Assets.versioned(sponsor.image)" />
                        </a>
                    }
                    </div>
                </div>
            </div>
        </div>
    </div>

   <!-- Main content -->
    <div class="row project-content">
        <!-- Project table -->
        <div class="col-md-9">
            <div class="project-search input-group">
                <input type="text" class="form-control" placeholder="Search in @totalProjects projects, proudly made by the community...">
                <span class="input-group-btn">
                    <button class="btn yellow" type="button">Search</button>
                </span>
            </div>

            @if(query.isDefined) {
                <li class="list-group-item minor search-header">
                    <span class="pull-left">Showing results for: <i>@query</i></span>
                    <span class="dismiss pull-right"><i class="fas fa-times fa-1x"></i></span>
                    <div class="clearfix"></div>
                </li>
            }

            @projects.list(
                models = models,
                page = page,
                pageSize = config.ore.projects.initLoad,
                call = page => routes.Application.showHome(
                    categoryStrings, query, orderingOption, Some(page),
                    platformCategory.map(_.name) ,platform.map(_.name), relevanceOption)
            )
        </div>

        <!-- Sidebar -->
        <div class="col-md-3">
            <!-- Ordering selection -->
            <select class="form-control select-sort">
                <option selected value="@sort.id">@sort.title</option>
                @ProjectSortingStrategy.values.filterNot(_.equals(sort)).map { strategy =>
                    <option value="@strategy.apiName">@strategy.title</option>
                }
            </select>

            <div>
                <input type="checkbox" id="relevanceBox" name="orderWithRelevance" @if(orderWithRelevance) { checked="checked" }>
                <label for="relevanceBox">Sort with relevance</label>
            </div>

            <!-- Category table -->
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">@messages("project.category.plural")</h3>
                    @if(visibleCategories.isDefined) {
                        <a href="@routes.Application.showHome(
                            Nil, None, None, None,
                            platformCategory.map(_.name),
                            platform.map(_.name), relevanceOption)">
                            <i class="category-reset fas fa-times white"></i>
                        </a>
                    }
                </div>

                <div class="list-group category-list">
                @for(category <- Category.visible) {
                    <a class="list-group-item @if(visibleCategories.isDefined && visibleCategories.get.contains(category)){active}"
                    href="@routes.Application.showHome(generateModifiedQueryString(visibleCategories.getOrElse(Seq()), category), None, None, None, platformCategory.map(_.name), platform.map(_.name), relevanceOption)">
                        <i class="fas fa-fw @category.icon"></i>
                        <strong>@category.title</strong>
                    </a>
                }
                </div>
            </div>

            <!-- Platform list -->
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">@messages("general.platform")</h3>
                </div>

                <ul class="list-group">

                    <a href="@routes.Application.showHome(
                        categoryStrings,
                        query,
                        orderingOption,
                        None,
                        None, None,
                        relevanceOption)"
                    class="list-group-item @if(platform.isEmpty && platformCategory.isEmpty) { active }">
                        <strong>@messages("general.any")</strong>
                    </a>

                    @for(pc <- PlatformCategory.getPlatformCategories) {
                        <a href="@routes.Application.showHome(
                            categoryStrings,
                            query,
                            orderingOption,
                            None,
                            Some(pc.name),
                            None,
                            relevanceOption)"
                        class="list-group-item @if(platformCategory.map(_.name).getOrElse("") == pc.name) { active }">
                            <strong>@pc.name</strong>
                        </a>

                        @defining(pc.getPlatforms) { platforms =>
                            @if(platforms.size > 1) {
                                @for(p <- platforms) {
                                    <a href="@routes.Application.showHome(
                                        categoryStrings,
                                        query,
                                        orderingOption,
                                        None,
                                        None,
                                        Some(p.name),
                                        relevanceOption)"
                                    class="list-group-item @if(platform.map(_.name).getOrElse("") == p.name) { active }">
                                            &nbsp;@p.name
                                    </a>
                                }
                            }
                        }
                    }
                </ul>
            </div>

        </div>
    </div>

}