diff options
Diffstat (limited to 'src/main/scala/reading/component/index/FiltersMenu.scala')
-rw-r--r-- | src/main/scala/reading/component/index/FiltersMenu.scala | 111 |
1 files changed, 84 insertions, 27 deletions
diff --git a/src/main/scala/reading/component/index/FiltersMenu.scala b/src/main/scala/reading/component/index/FiltersMenu.scala index 81220e3..02f591b 100644 --- a/src/main/scala/reading/component/index/FiltersMenu.scala +++ b/src/main/scala/reading/component/index/FiltersMenu.scala @@ -8,21 +8,31 @@ import scalacss.Defaults._ import scalacss.ScalatagsCss._ import reading.component.index.style.{FiltersMenu => FiltersMenuStyle} -import reading.models.{Book, Filter, Period, Genre, Theme, Difficulty} +import reading.models.{Book, Filter, Period, Genre, Theme, Program, Difficulty, FilterFactory} import reading.utils.{RxTag, RxAttr} object FiltersMenu { def apply(books: Rx[Seq[Book]], filters: Var[Seq[Filter]]): Frag = - div( - FiltersMenuStyle.render, - FiltersMenuStyle.groups, - group(books, filters, "Période", Period.values.map(Filter.apply(_))), - group(books, filters, "Genre", Genre.values.map(Filter.apply(_))), - group(books, filters, "Theme", Theme.values.map(Filter.apply(_))), - group(books, filters, "Difficulté", Difficulty.filters) - ) + RxTag { implicit context => + div( + FiltersMenuStyle.render, + FiltersMenuStyle.groups, + group(books, filters, "Période", Period.values.map(Filter.apply(_))), + group(books, filters, "Genre", Genre.values.map(Filter.apply(_))), + group(books, filters, "Theme", Theme.values.map(Filter.apply(_))), + multiGroup(books, filters, "Programme", Program.values, Program.level _), + group(books, filters, "Difficulté", Difficulty.filters) + ) + } - def group(books: Rx[Seq[Book]], filters: Var[Seq[Filter]], name: String, groupFilters: Seq[Filter]): Frag = { + def group( + books: Rx[Seq[Book]], + filters: Var[Seq[Filter]], + name: String, + groupFilters: Seq[Filter] + )( + implicit context: Ctx.Data + ): Frag = { val filtersWithCount = Rx { groupFilters .filter(filter => !Filter.contains(filters(), filter)) @@ -30,25 +40,72 @@ object FiltersMenu { .filter(_._2 > 0) } - RxTag { implicit context => - if(filtersWithCount().isEmpty) - span("") - else + if(filtersWithCount().isEmpty) + span("") + else + div( + FiltersMenuStyle.group, + div(FiltersMenuStyle.groupTitle, name), div( - FiltersMenuStyle.group, - - div(FiltersMenuStyle.groupTitle, name), - - div( - filtersWithCount().map { case (filter, count) => - button( - FiltersMenuStyle.filter, - RxAttr(onclick, Rx(() => filters() = filter +: filters())), - span(s"${filter.name} ($count)") - ) - } - ) + filtersWithCount().map { case (filter, count) => + button( + FiltersMenuStyle.filter, + RxAttr(onclick, Rx(() => filters() = filter +: filters())), + span(s"${filter.name} ($count)") + ) + } + ) + ) + } + + + + def multiGroup[A: FilterFactory, B: Ordering]( + books: Rx[Seq[Book]], + filters: Var[Seq[Filter]], + name: String, + groupFilters: Seq[A], + superGroup: A => B + )( + implicit context: Ctx.Data + ): Frag = + div( + FiltersMenuStyle.group, + div(FiltersMenuStyle.groupTitle, name), + groupFilters.groupBy(superGroup).toList.sortBy(_._1).map { case (superGroup, subGroupFilters) => + div( + superGroup.toString, + subGroup(books, filters, name, subGroupFilters.map(Filter(_))) ) + } + ) + + def subGroup( + books: Rx[Seq[Book]], + filters: Var[Seq[Filter]], + name: String, + groupFilters: Seq[Filter] + )( + implicit context: Ctx.Data + ): Frag = { + val filtersWithCount = Rx { + groupFilters + .filter(filter => !Filter.contains(filters(), filter)) + .map(filter => (filter, Book.filter(books(), filter +: filters()).length)) + .filter(_._2 > 0) } + + if(filtersWithCount().isEmpty) + span("") + else + div( + filtersWithCount().map { case (filter, count) => + button( + FiltersMenuStyle.filter, + RxAttr(onclick, Rx(() => filters() = filter +: filters())), + span(s"${filter.name} ($count)") + ) + } + ) } } |