package reading.component.index import scala.util.Random import scalacss.Defaults._ import scalacss.ScalatagsCss._ import scalatags.JsDom.all._ import reading.component.index.style.{ BookDetail => BookStyle } import reading.component.widget.AnimateMethod import reading.models.{ Book, Program, Filter } import reading.Route object BookDetail { val componentId = s"books${Random.nextInt}" def apply( filters: Seq[Filter], 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.detailParent, id := componentId, div( BookStyle.detail, img( BookStyle.cover, src := s"cover/${book.title}.jpg", alt := s"${book.title}, ${book.author}" ), div( BookStyle.presentation, div(BookStyle.title, s"${book.title}$titleParts"), div(BookStyle.author, book.author), book.resume match { case Some(resume) => p(BookStyle.resume, raw(resume)) case _ => span("") }, dl( BookStyle.definitions, 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)) ), a( BookStyle.close, onclick := (() => onClose), href := Route.url(Route.Books(filters)), "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(", ")) ) } }