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.scala160
1 files changed, 90 insertions, 70 deletions
diff --git a/src/main/scala/reading/component/index/Menu.scala b/src/main/scala/reading/component/index/Menu.scala
index a0aabd1..4c118bd 100644
--- a/src/main/scala/reading/component/index/Menu.scala
+++ b/src/main/scala/reading/component/index/Menu.scala
@@ -1,7 +1,6 @@
package reading.component.index
import rx._
-import Ctx.Owner.Unsafe._
import scalatags.JsDom.all._
import scalacss.Defaults._
@@ -9,45 +8,60 @@ import scalacss.ScalatagsCss._
import reading.component.index.style.{ Menu => MenuStyle }
import reading.models._
-import reading.utils.{ RxTag, RxAttr }
-import reading.Route
+import reading.utils.RxUtils._
object Menu {
- def apply(books: Rx[Seq[Book]], filters: Var[Seq[Filter]], showFiltersMenu: Var[Boolean]): Frag =
- RxTag { implicit context =>
+ def apply(
+ books: Rx[Seq[Book]],
+ filters: Var[Seq[Filter]],
+ search: Var[String],
+ showFiltersMenu: Var[Boolean]
+ )(
+ implicit
+ ctx: Ctx.Owner
+ ): Frag =
+ div(
+ MenuStyle.render,
+ Rx(if (showFiltersMenu()) MenuStyle.show else MenuStyle.empty),
+ MenuStyle.menu,
+
+ div(MenuStyle.background),
+
div(
- MenuStyle.render,
- if (showFiltersMenu()) MenuStyle.show else "",
- MenuStyle.menu,
+ MenuStyle.content,
- header(showFiltersMenu, filters().length),
+ Rx(header(showFiltersMenu, filters().length)),
div(
MenuStyle.groups,
- filters().find(_.kind == FilterKind.Grade) match {
- case Some(grade) => {
- val programs = Program.values.filter(p => Program.grade(p).toString() == grade.nonFormattedName)
- group(books, filters, grade.name, programs.map(Filter.apply(_)), Some(grade))
+ 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(_)))
}
- case None => group(books, filters, "Classe", Grade.values.map(Filter.apply(_)))
},
- filters().find(_.kind == FilterKind.GroupedTheme) match {
- case Some(groupedTheme) => {
- val themes = Theme.values.filter(t => Theme.groupedTheme(t).toString() == groupedTheme.nonFormattedName)
- group(books, filters, groupedTheme.name, themes.map(Filter.apply(_)), Some(groupedTheme))
+ 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(_)))
}
- case None => group(books, filters, "Theme", GroupedTheme.values.map(Filter.apply(_)))
},
- group(books, filters, "Genre", Genre.values.sorted.map(Filter.apply(_))),
- group(books, filters, "Niveau", Level.values.map(Filter.apply(_))),
- group(books, filters, "Période", Period.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(_)))
),
- footer(Rx(books().length), filters, showFiltersMenu)
+ footer(books, filters, search, showFiltersMenu)
)
- }
+ )
- def header(showFiltersMenu: Var[Boolean], count: Int): HtmlTag =
+ def header(showFiltersMenu: Var[Boolean], count: Int): Frag =
div(
MenuStyle.header,
"Filtrer",
@@ -57,78 +71,84 @@ object Menu {
def group(
books: Rx[Seq[Book]],
filters: Var[Seq[Filter]],
+ search: Var[String],
name: String,
groupFilters: Seq[Filter],
parentFilter: Option[Filter] = None
)(
implicit
- context: Ctx.Data
+ ctx: Ctx.Owner
): Frag = {
val filtersWithCount = Rx {
groupFilters
- .map(filter => (filter, Book.filter(books(), Seq(filter)).length))
+ .map(filter => (filter, Filter.add(books(), filter).length))
.filter(_._2 > 0)
}
- if (filtersWithCount().isEmpty)
- span("")
- else
- div(
- MenuStyle.filterGroup,
+ Rx {
+ if (filtersWithCount().isEmpty)
+ span("")
+ else
div(
- MenuStyle.filterTitle,
- parentFilter.map { filter =>
- RxAttr(onclick, Rx(() => updateFilters(filters, Filter.remove(filters(), filter))))
- }.getOrElse(""),
- if (parentFilter.isDefined) MenuStyle.activeFilter else "",
- name,
- RxTag { implicit context =>
- val count = filters().filter(f => groupFilters.exists(Filter.equals(f, _))).length
- if (count > 0) span(MenuStyle.filterTitleCount, count) else span("")
- }
- ),
- div(
- filtersWithCount().map {
- case (filter, count) => {
- val isActive = Filter.contains(filters(), filter)
+ div(
+ MenuStyle.filterTitle,
+ parentFilter.map { filter =>
+ onclick := (() => FilterUtils.remove(filters, search, filter))
+ }.getOrElse(""),
+ if (parentFilter.isDefined) MenuStyle.activeFilter else "",
+ name,
+ Rx {
+ val count = filters().filter(f => groupFilters.exists(f == _)).length
+ if (count > 0) span(MenuStyle.filterTitleCount, count) else span("")
+ }
+ ),
+ div(
+ filtersWithCount().map {
+ case (filter, count) => {
+ val isActive = Filter.contains(filters(), filter)
- button(
- MenuStyle.filter,
- if (isActive) MenuStyle.activeFilter else "",
- RxAttr(onclick, Rx(() => updateFilters(
- filters,
- if (isActive) Filter.remove(filters(), filter) else filter +: filters()
- ))),
- span(
- span(filter.name.capitalize),
- span(MenuStyle.filterCount, count)
+ button(
+ MenuStyle.filter,
+ if (isActive) MenuStyle.activeFilter else "",
+ onclick := (() =>
+ if (isActive)
+ FilterUtils.remove(filters, search, filter)
+ else
+ FilterUtils.add(filters, search, filter)),
+ span(
+ span(filter.name.capitalize),
+ span(MenuStyle.filterCount, count)
+ )
)
- )
+ }
}
- }
+ )
)
- )
- }
-
- private def updateFilters(filters: Var[Seq[Filter]], newFilters: Seq[Filter]): Unit = {
- filters() = newFilters
- Route.push(Route.Books(newFilters))
+ }
}
- def footer(bookCount: Rx[Int], filters: Var[Seq[Filter]], showFiltersMenu: Var[Boolean]): HtmlTag =
+ def footer(
+ books: Rx[Seq[Book]],
+ filters: Var[Seq[Filter]],
+ search: Var[String],
+ showFiltersMenu: Var[Boolean]
+ )(
+ implicit
+ ctx: Ctx.Owner
+ ): Frag =
div(
MenuStyle.footer,
div(
MenuStyle.clear,
- RxAttr(onclick, Rx(() => filters() = Nil)),
+ onclick := (() => FilterUtils.removeAll(filters, search)),
"Effacer"
),
div(
MenuStyle.returnToBooks,
- RxAttr(onclick, Rx(() => showFiltersMenu() = false)),
+ onclick := (() => showFiltersMenu() = false),
"Afficher",
- RxTag { implicit context =>
- span(MenuStyle.bookCount, bookCount())
+ Rx {
+ span(MenuStyle.bookCount, books().length)
}
)
)