aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/component
diff options
context:
space:
mode:
authorJoris2016-12-23 09:52:20 +0100
committerJoris2016-12-23 09:52:20 +0100
commit555b621b618e4810324a2658d33315b05157e6be (patch)
tree4594d114b0a1df6f24beee1b31d62e00cbc42180 /src/main/scala/reading/component
parent322adace29630c3a3f2f04e7e58075a1c57f335a (diff)
downloadreading-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.scala4
-rw-r--r--src/main/scala/reading/component/index/FiltersMenu.scala111
-rw-r--r--src/main/scala/reading/component/index/style/Books.scala5
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)
)