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