aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/component
diff options
context:
space:
mode:
authorJoris2016-11-27 18:38:58 +0100
committerJoris2016-12-20 23:05:43 +0100
commitb780f6f660cc5b2ff2b1ca3884871002823256a1 (patch)
treec530166206743be1925688f8b3319c630208a695 /src/main/scala/reading/component
parent0aab7be2cf2cf73c62b305450902cdc3fe77cd4a (diff)
downloadreading-b780f6f660cc5b2ff2b1ca3884871002823256a1.tar.gz
reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.tar.bz2
reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.zip
Init
Diffstat (limited to 'src/main/scala/reading/component')
-rw-r--r--src/main/scala/reading/component/Index.scala42
-rw-r--r--src/main/scala/reading/component/index/Books.scala33
-rw-r--r--src/main/scala/reading/component/index/Filters.scala33
-rw-r--r--src/main/scala/reading/component/index/FiltersMenu.scala48
-rw-r--r--src/main/scala/reading/component/index/style/Books.scala31
-rw-r--r--src/main/scala/reading/component/index/style/Filters.scala21
-rw-r--r--src/main/scala/reading/component/index/style/FiltersMenu.scala24
-rw-r--r--src/main/scala/reading/component/style/Color.scala16
-rw-r--r--src/main/scala/reading/component/style/Global.scala28
-rw-r--r--src/main/scala/reading/component/style/Index.scala26
10 files changed, 302 insertions, 0 deletions
diff --git a/src/main/scala/reading/component/Index.scala b/src/main/scala/reading/component/Index.scala
new file mode 100644
index 0000000..28d9081
--- /dev/null
+++ b/src/main/scala/reading/component/Index.scala
@@ -0,0 +1,42 @@
+package reading.component
+
+import rx._
+import Ctx.Owner.Unsafe._
+
+import scalatags.JsDom.all._
+import scalacss.Defaults._
+import scalacss.ScalatagsCss._
+
+import reading.component.style.{Index => IndexStyle}
+import reading.component.index.{FiltersMenu, Filters, Books}
+import reading.models.{Book, Filter}
+import reading.utils.RxAttr
+
+object Index {
+ def apply(): Frag = {
+ val filters: Var[Seq[Filter]] = Var(Nil)
+ val books: Rx[Seq[Book]] = Rx {
+ if(filters().isEmpty) Book.all else Book.filter(Book.all, filters())
+ }
+
+ div(
+ IndexStyle.render,
+
+ button(
+ IndexStyle.header,
+ RxAttr(onclick, Rx(() => filters() = Nil)),
+ "Conseils de lecture"
+ ),
+
+ div(
+ IndexStyle.page,
+ FiltersMenu(books, filters),
+ div(
+ IndexStyle.main,
+ Filters(filters),
+ Books(books)
+ )
+ )
+ )
+ }
+}
diff --git a/src/main/scala/reading/component/index/Books.scala b/src/main/scala/reading/component/index/Books.scala
new file mode 100644
index 0000000..6ce1b2b
--- /dev/null
+++ b/src/main/scala/reading/component/index/Books.scala
@@ -0,0 +1,33 @@
+package reading.component.index
+
+import rx._
+
+import scalatags.JsDom.all._
+import scalacss.Defaults._
+import scalacss.ScalatagsCss._
+
+import reading.component.index.style.{Books => BooksStyle}
+import reading.models.Book
+import reading.utils.RxTag
+
+object Books {
+ def apply(books: Rx[Seq[Book]]): Frag =
+ div(
+ BooksStyle.render,
+ BooksStyle.books,
+
+ RxTag { implicit context =>
+ div(
+ books().sortBy(_.title).map { book =>
+ div(
+ BooksStyle.book,
+ div(BooksStyle.title, book.title),
+ div(BooksStyle.author, book.author),
+ div(BooksStyle.genres, book.genres.mkString(", ")),
+ div(BooksStyle.themes, book.themes.mkString(", "))
+ )
+ }
+ )
+ }
+ )
+}
diff --git a/src/main/scala/reading/component/index/Filters.scala b/src/main/scala/reading/component/index/Filters.scala
new file mode 100644
index 0000000..1d9cc93
--- /dev/null
+++ b/src/main/scala/reading/component/index/Filters.scala
@@ -0,0 +1,33 @@
+package reading.component.index
+
+import rx._
+import Ctx.Owner.Unsafe._
+
+import scalatags.JsDom.all._
+import scalacss.Defaults._
+import scalacss.ScalatagsCss._
+
+import reading.component.index.style.{Filters => FiltersStyle}
+import reading.models.Filter
+import reading.utils.{RxTag, RxAttr}
+
+object Filters {
+ def apply(filters: Var[Seq[Filter]]): Frag =
+ RxTag { implicit context =>
+ if(filters().isEmpty)
+ span("")
+ else
+ div(
+ FiltersStyle.render,
+ FiltersStyle.filters,
+
+ filters().sortBy(_.name).map { filter =>
+ button(
+ FiltersStyle.filter,
+ RxAttr(onclick, Rx(() => filters() = filters().filter(!Filter.equals(_, filter)))),
+ filter.name
+ )
+ }
+ )
+ }
+}
diff --git a/src/main/scala/reading/component/index/FiltersMenu.scala b/src/main/scala/reading/component/index/FiltersMenu.scala
new file mode 100644
index 0000000..880c3e7
--- /dev/null
+++ b/src/main/scala/reading/component/index/FiltersMenu.scala
@@ -0,0 +1,48 @@
+package reading.component.index
+
+import rx._
+import Ctx.Owner.Unsafe._
+
+import scalatags.JsDom.all._
+import scalacss.Defaults._
+import scalacss.ScalatagsCss._
+
+import reading.component.index.style.{FiltersMenu => FiltersMenuStyle}
+import reading.models.{Book, Filter, Genre, Theme, FilterFactory}
+import reading.utils.{RxTag, RxAttr}
+
+object FiltersMenu {
+ def apply(books: Rx[Seq[Book]], filters: Var[Seq[Filter]]): Frag =
+ div(
+ FiltersMenuStyle.render,
+ group(books, filters, "Genre", Genre.values),
+ group(books, filters, "Theme", Theme.values)
+ )
+
+ def group[T: FilterFactory](books: Rx[Seq[Book]], filters: Var[Seq[Filter]], name: String, groupFilters: Seq[T]): Frag = {
+ val filtersWithCount = Rx {
+ groupFilters
+ .filter(filter => !Filter.contains(filters(), Filter(filter)))
+ .map(filter => (filter, Book.filter(books(), Filter(filter) +: filters()).length))
+ .filter(_._2 > 0)
+ }
+
+ div(
+ FiltersMenuStyle.group,
+
+ div(FiltersMenuStyle.groupTitle, name),
+
+ RxTag { implicit context =>
+ div(
+ filtersWithCount().map { case (filter, count) =>
+ button(
+ FiltersMenuStyle.filter,
+ RxAttr(onclick, Rx(() => filters() = Filter(filter) +: filters())),
+ span(s"${filter.toString} ($count)")
+ )
+ }
+ )
+ }
+ )
+ }
+}
diff --git a/src/main/scala/reading/component/index/style/Books.scala b/src/main/scala/reading/component/index/style/Books.scala
new file mode 100644
index 0000000..2c0dfc0
--- /dev/null
+++ b/src/main/scala/reading/component/index/style/Books.scala
@@ -0,0 +1,31 @@
+package reading.component.index.style
+
+import scalacss.Defaults._
+
+import reading.component.style.Col
+
+object Books extends StyleSheet.Inline {
+ import dsl._
+
+ val books = style(
+ )
+
+ val book = style(
+ marginBottom(30.px)
+ )
+
+ val title = style(
+ fontWeight.bold,
+ marginBottom(10.px),
+ color(Col.congoBrown)
+ )
+
+ val author = style(
+ )
+
+ val genres = style(
+ )
+
+ val themes = style(
+ )
+}
diff --git a/src/main/scala/reading/component/index/style/Filters.scala b/src/main/scala/reading/component/index/style/Filters.scala
new file mode 100644
index 0000000..c2d0aaf
--- /dev/null
+++ b/src/main/scala/reading/component/index/style/Filters.scala
@@ -0,0 +1,21 @@
+package reading.component.index.style
+
+import scalacss.Defaults._
+
+import reading.component.style.Col
+
+object Filters extends StyleSheet.Inline {
+ import dsl._
+
+ val filters = style(
+ marginBottom(30.px),
+ display.flex
+ )
+
+ val filter = style(
+ backgroundColor(Col.gray),
+ color(Col.white),
+ padding(5.px, 10.px),
+ marginRight(10.px)
+ )
+}
diff --git a/src/main/scala/reading/component/index/style/FiltersMenu.scala b/src/main/scala/reading/component/index/style/FiltersMenu.scala
new file mode 100644
index 0000000..9fd50f0
--- /dev/null
+++ b/src/main/scala/reading/component/index/style/FiltersMenu.scala
@@ -0,0 +1,24 @@
+package reading.component.index.style
+
+import scalacss.Defaults._
+
+import reading.component.style.Col
+
+object FiltersMenu extends StyleSheet.Inline {
+ import dsl._
+
+ val group = style(
+ marginBottom(30.px)
+ )
+
+ val groupTitle = style(
+ color(Col.congoBrown),
+ fontWeight.bold,
+ textTransform.uppercase,
+ padding(10.px, 30.px, 15.px)
+ )
+
+ val filter = style(
+ padding(10.px, 30.px)
+ )
+}
diff --git a/src/main/scala/reading/component/style/Color.scala b/src/main/scala/reading/component/style/Color.scala
new file mode 100644
index 0000000..b9f9cf4
--- /dev/null
+++ b/src/main/scala/reading/component/style/Color.scala
@@ -0,0 +1,16 @@
+package reading.component.style
+
+import scalacss.Defaults._
+
+// http://chir.ag/projects/name-that-color
+object Col extends StyleSheet.Inline {
+ import dsl._
+
+ val black = c"#000000"
+ val white = c"#FFFFFF"
+ val gray = c"#7E7E7E"
+ val eastBay = c"#505080"
+ val tawnyPort = c"#7F2447"
+ val cosmic = c"#683649"
+ val congoBrown = c"#57363E"
+}
diff --git a/src/main/scala/reading/component/style/Global.scala b/src/main/scala/reading/component/style/Global.scala
new file mode 100644
index 0000000..276a30d
--- /dev/null
+++ b/src/main/scala/reading/component/style/Global.scala
@@ -0,0 +1,28 @@
+package reading.component.style
+
+import scalacss.Defaults._
+
+object Global extends StyleSheet.Standalone {
+ import dsl._
+
+ "html" -
+ boxSizing.borderBox
+
+ "a" - (
+ color(Col.eastBay),
+ &.hover (
+ textDecoration := "underline"
+ )
+ )
+
+ "*, *:before, *:after" -
+ boxSizing.inherit
+
+ "button" - (
+ cursor.pointer,
+ display.flex,
+ backgroundColor(initial),
+ color(Col.black),
+ border.none
+ )
+}
diff --git a/src/main/scala/reading/component/style/Index.scala b/src/main/scala/reading/component/style/Index.scala
new file mode 100644
index 0000000..78e0630
--- /dev/null
+++ b/src/main/scala/reading/component/style/Index.scala
@@ -0,0 +1,26 @@
+package reading.component.style
+
+import scalacss.Defaults._
+
+object Index extends StyleSheet.Inline {
+ import dsl._
+
+ val header = style(
+ fontSize(40.px),
+ color(Col.congoBrown),
+ textAlign.center,
+ margin(10.px, auto),
+ padding(20.px),
+ &.hover (
+ textDecoration := "none"
+ )
+ )
+
+ val page = style(
+ display.flex
+ )
+
+ val main = style(
+ marginLeft(20.px)
+ )
+}