aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/component/index/Menu.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/reading/component/index/Menu.scala')
-rw-r--r--src/main/scala/reading/component/index/Menu.scala104
1 files changed, 54 insertions, 50 deletions
diff --git a/src/main/scala/reading/component/index/Menu.scala b/src/main/scala/reading/component/index/Menu.scala
index 4c118bd..cfeb6d4 100644
--- a/src/main/scala/reading/component/index/Menu.scala
+++ b/src/main/scala/reading/component/index/Menu.scala
@@ -2,9 +2,9 @@ package reading.component.index
import rx._
-import scalatags.JsDom.all._
import scalacss.Defaults._
import scalacss.ScalatagsCss._
+import scalatags.JsDom.all._
import reading.component.index.style.{ Menu => MenuStyle }
import reading.models._
@@ -14,6 +14,7 @@ object Menu {
def apply(
books: Rx[Seq[Book]],
filters: Var[Seq[Filter]],
+ detail: Var[Option[Book]],
search: Var[String],
showFiltersMenu: Var[Boolean]
)(
@@ -25,40 +26,34 @@ object Menu {
Rx(if (showFiltersMenu()) MenuStyle.show else MenuStyle.empty),
MenuStyle.menu,
- div(MenuStyle.background),
+ Rx(header(showFiltersMenu, filters().length)),
div(
- MenuStyle.content,
-
- Rx(header(showFiltersMenu, filters().length)),
-
- div(
- MenuStyle.groups,
- Rx {
- filters().find(_.kind == FilterKind.Grade) match {
- case Some(grade) =>
- val programs = Program.values.filter(p => Program.grade(p).toString() == grade.nonFormattedName)
- group(books, filters, search, grade.name, programs.map(Filter.apply(_)), Some(grade))
- case None =>
- group(books, filters, search, "Classe", Grade.values.map(Filter.apply(_)))
- }
- },
- Rx {
- filters().find(_.kind == FilterKind.GroupedTheme) match {
- case Some(groupedTheme) =>
- val themes = Theme.values.filter(t => Theme.groupedTheme(t).toString() == groupedTheme.nonFormattedName)
- group(books, filters, search, groupedTheme.name, themes.map(Filter.apply(_)), Some(groupedTheme))
- case None =>
- group(books, filters, search, "Theme", GroupedTheme.values.map(Filter.apply(_)))
- }
- },
- group(books, filters, search, "Genre", Genre.values.sorted.map(Filter.apply(_))),
- group(books, filters, search, "Niveau", Level.values.map(Filter.apply(_))),
- group(books, filters, search, "Période", Period.values.map(Filter.apply(_)))
- ),
+ MenuStyle.groups,
+ Rx {
+ filters().find(_.kind == FilterKind.Grade) match {
+ case Some(grade) =>
+ val programs = Program.values.filter(p => Program.grade(p).toString() == grade.nonFormattedName).sorted
+ group(books, filters, detail, search, grade.name, grade.name, programs.map(Filter.apply(_)), Some(grade))
+ case None =>
+ group(books, filters, detail, search, "classe", "classes", Grade.values.sorted.map(Filter.apply(_)))
+ }
+ },
+ Rx {
+ filters().find(_.kind == FilterKind.GroupedTheme) match {
+ case Some(groupedTheme) =>
+ val themes = Theme.values.filter(t => Theme.grouped(t).toString() == groupedTheme.nonFormattedName).sorted
+ group(books, filters, detail, search, groupedTheme.name, groupedTheme.name, themes.map(Filter.apply(_)), Some(groupedTheme))
+ case None =>
+ group(books, filters, detail, search, "thème", "thèmes", GroupedTheme.values.sorted.map(Filter.apply(_)))
+ }
+ },
+ group(books, filters, detail, search, "genre", "genres", Genre.values.sorted.map(Filter.apply(_))),
+ group(books, filters, detail, search, "niveau", "niveaux", Level.values.sorted.map(Filter.apply(_))),
+ group(books, filters, detail, search, "période", "périodes", Period.values.sorted.map(Filter.apply(_)))
+ ),
- footer(books, filters, search, showFiltersMenu)
- )
+ footer(books, filters, detail, search, showFiltersMenu)
)
def header(showFiltersMenu: Var[Boolean], count: Int): Frag =
@@ -71,8 +66,10 @@ object Menu {
def group(
books: Rx[Seq[Book]],
filters: Var[Seq[Filter]],
+ detail: Var[Option[Book]],
search: Var[String],
name: String,
+ pluralName: String,
groupFilters: Seq[Filter],
parentFilter: Option[Filter] = None
)(
@@ -84,19 +81,20 @@ object Menu {
.map(filter => (filter, Filter.add(books(), filter).length))
.filter(_._2 > 0)
}
+ val filtersCount = filtersWithCount.map(_.length)
Rx {
- if (filtersWithCount().isEmpty)
+ if (filtersCount() == 0)
span("")
else
div(
div(
MenuStyle.filterTitle,
parentFilter.map { filter =>
- onclick := (() => FilterUtils.remove(filters, search, filter))
+ onclick := (() => FilterUtils.remove(filters, detail, search, filter))
}.getOrElse(""),
if (parentFilter.isDefined) MenuStyle.activeFilter else "",
- name,
+ if (filtersCount() > 1) pluralName else name,
Rx {
val count = filters().filter(f => groupFilters.exists(f == _)).length
if (count > 0) span(MenuStyle.filterTitleCount, count) else span("")
@@ -112,9 +110,9 @@ object Menu {
if (isActive) MenuStyle.activeFilter else "",
onclick := (() =>
if (isActive)
- FilterUtils.remove(filters, search, filter)
+ FilterUtils.remove(filters, detail, search, filter)
else
- FilterUtils.add(filters, search, filter)),
+ FilterUtils.add(filters, detail, search, filter)),
span(
span(filter.name.capitalize),
span(MenuStyle.filterCount, count)
@@ -130,26 +128,32 @@ object Menu {
def footer(
books: Rx[Seq[Book]],
filters: Var[Seq[Filter]],
+ detail: Var[Option[Book]],
search: Var[String],
showFiltersMenu: Var[Boolean]
)(
implicit
ctx: Ctx.Owner
): Frag =
- div(
- MenuStyle.footer,
- div(
- MenuStyle.clear,
- onclick := (() => FilterUtils.removeAll(filters, search)),
- "Effacer"
- ),
+ Rx {
div(
- MenuStyle.returnToBooks,
- onclick := (() => showFiltersMenu() = false),
- "Afficher",
- Rx {
+ MenuStyle.footer,
+
+ if (filters().nonEmpty)
+ div(
+ MenuStyle.clear,
+ onclick := (() => if (filters.now.nonEmpty) FilterUtils.removeAll(filters, detail, search)),
+ "Effacer"
+ )
+ else
+ span(""),
+
+ div(
+ MenuStyle.returnToBooks,
+ onclick := (() => showFiltersMenu() = false),
+ "Afficher",
span(MenuStyle.bookCount, books().length)
- }
+ )
)
- )
+ }
}