aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/component/index/BookDetail.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/reading/component/index/BookDetail.scala')
-rw-r--r--src/main/scala/reading/component/index/BookDetail.scala81
1 files changed, 52 insertions, 29 deletions
diff --git a/src/main/scala/reading/component/index/BookDetail.scala b/src/main/scala/reading/component/index/BookDetail.scala
index c42029f..ed91211 100644
--- a/src/main/scala/reading/component/index/BookDetail.scala
+++ b/src/main/scala/reading/component/index/BookDetail.scala
@@ -1,17 +1,28 @@
package reading.component.index
-import scalatags.JsDom.all._
+import scala.util.Random
+
import scalacss.Defaults._
import scalacss.ScalatagsCss._
+import scalatags.JsDom.all._
import reading.component.index.style.{ BookDetail => BookStyle }
-import reading.models.{ Program, Book }
+import reading.component.widget.AnimateMethod
+import reading.models.{ Book, Program }
object BookDetail {
- def apply(book: Book): Frag =
+ val componentId = s"books${Random.nextInt}"
+
+ def apply(book: Book, parentId: String, onClose: => Unit): Frag = {
+ val titleParts = if (book.parts > 1) s", ${book.parts} volumes" else ""
+ val grades = book.programs.map(Program.grade(_)).distinct.sorted
+
+ AnimateMethod.fadeIn(componentId)
+
div(
BookStyle.render,
BookStyle.detail,
+ id := componentId,
img(
BookStyle.cover,
@@ -20,36 +31,48 @@ object BookDetail {
),
div(
- BookStyle.items,
+ BookStyle.presentation,
+ div(BookStyle.title, s"${book.title}$titleParts"),
+ div(BookStyle.author, book.author),
- if (book.programs.nonEmpty) {
- item("classe", book.programs.map(Program.grade(_).prettyPrint).distinct.sorted)
- },
- if (book.programs.nonEmpty) {
- item("programme", book.programs.map(p => "« " ++ p.prettyPrint ++ " »").sorted)
- },
- if (book.themes.nonEmpty) {
- item("thème", book.themes.sorted.map(_.prettyPrint))
+ book.resume match {
+ case Some(resume) =>
+ p(BookStyle.resume, raw(resume))
+ case _ =>
+ span("")
},
- if (book.genres.nonEmpty) {
- item("genre", book.genres.sorted.map(_.prettyPrint))
- },
- book.period.map { period =>
- item("période", period.prettyPrint)
- },
- item("niveau", book.level.prettyPrint)
- )
- )
- private def item(key: String, value: String): Frag = item(key, Seq(value))
+ dl(
+ BookStyle.definitions,
- private def item(key: String, values: Seq[String]): Frag =
- div(
- BookStyle.item,
- div(BookStyle.itemName, key),
- ul(
- BookStyle.itemValues,
- values.map(value => li(BookStyle.itemValue, value.capitalize))
+ grades.map { grade =>
+ val programs = book.programs.filter(p => Program.grade(p) == grade).sorted
+ val pp = grade.prettyPrint
+ definition(pp, pp, programs.map(p => s"« ${p.prettyPrint} »"))
+ },
+ if (book.themes.nonEmpty) {
+ definition("thème", "thèmes", book.themes.sorted.map(_.prettyPrint))
+ },
+ if (book.genres.nonEmpty) {
+ definition("genre", "genres", book.genres.sorted.map(_.prettyPrint))
+ },
+ definition("niveau", "niveaux", Seq(book.level.prettyPrint))
+ ),
+
+ button(
+ BookStyle.close,
+ onclick := (() => onClose),
+ "Fermer"
+ )
)
)
+ }
+
+ private def definition(key: String, pluralKey: String, values: Seq[String]): Seq[Frag] = {
+ val term = if (values.length > 1) pluralKey else key
+ Seq(
+ dt(BookStyle.definitionTerm, s"${term.capitalize} :"),
+ dd(BookStyle.definitionDescription, values.mkString(", "))
+ )
+ }
}