diff options
Diffstat (limited to 'src/main/scala/reading/component/index/Menu.scala')
-rw-r--r-- | src/main/scala/reading/component/index/Menu.scala | 104 |
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) - } + ) ) - ) + } } |