diff options
Diffstat (limited to 'src/main/scala/reading/component/index/BookDetail.scala')
-rw-r--r-- | src/main/scala/reading/component/index/BookDetail.scala | 81 |
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(", ")) + ) + } } |