diff options
author | Joris | 2016-11-27 18:38:58 +0100 |
---|---|---|
committer | Joris | 2016-12-20 23:05:43 +0100 |
commit | b780f6f660cc5b2ff2b1ca3884871002823256a1 (patch) | |
tree | c530166206743be1925688f8b3319c630208a695 /src/main/scala/reading/component | |
parent | 0aab7be2cf2cf73c62b305450902cdc3fe77cd4a (diff) | |
download | reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.tar.gz reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.tar.bz2 reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.zip |
Init
Diffstat (limited to 'src/main/scala/reading/component')
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) + ) +} |