ore/app/views/home.scala.html
@*
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 }">
@p.name
</a>
}
}
}
}
</ul>
</div>
</div>
</div>
}