diff options
author | Joris | 2016-12-23 09:52:20 +0100 |
---|---|---|
committer | Joris | 2016-12-23 09:52:20 +0100 |
commit | 555b621b618e4810324a2658d33315b05157e6be (patch) | |
tree | 4594d114b0a1df6f24beee1b31d62e00cbc42180 /src/main/scala/reading/component | |
parent | 322adace29630c3a3f2f04e7e58075a1c57f335a (diff) | |
download | reading-555b621b618e4810324a2658d33315b05157e6be.tar.gz reading-555b621b618e4810324a2658d33315b05157e6be.tar.bz2 reading-555b621b618e4810324a2658d33315b05157e6be.zip |
Add programs grouped by level
Diffstat (limited to 'src/main/scala/reading/component')
-rw-r--r-- | src/main/scala/reading/component/index/Books.scala | 4 | ||||
-rw-r--r-- | src/main/scala/reading/component/index/FiltersMenu.scala | 111 | ||||
-rw-r--r-- | src/main/scala/reading/component/index/style/Books.scala | 5 |
3 files changed, 93 insertions, 27 deletions
diff --git a/src/main/scala/reading/component/index/Books.scala b/src/main/scala/reading/component/index/Books.scala index 39c0e67..dacfe4e 100644 --- a/src/main/scala/reading/component/index/Books.scala +++ b/src/main/scala/reading/component/index/Books.scala @@ -36,6 +36,10 @@ object Books { s"thème: ${book.themes.mkString(", ")}" ), div( + BooksStyle.program, + s"programme: ${book.program}" + ), + div( BooksStyle.pages, s"${book.pages} pages" ) 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)") + ) + } + ) } } diff --git a/src/main/scala/reading/component/index/style/Books.scala b/src/main/scala/reading/component/index/style/Books.scala index c023e66..69e1c55 100644 --- a/src/main/scala/reading/component/index/style/Books.scala +++ b/src/main/scala/reading/component/index/style/Books.scala @@ -41,6 +41,11 @@ object Books extends StyleSheet.Inline { marginBottom(10.px) ) + val program = style( + marginLeft(20.px), + marginBottom(10.px) + ) + val pages = style( marginLeft(20.px) ) |