diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index eb0cbb4..954fa33 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -26,38 +26,51 @@ ) ) + def backIcon = + Icons.solid + .`arrow-narrow-left`() + .amend( + svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" + ) + object Link: case class ViewModel( page: Page, icon: Option[SvgElement], + extraClasses: String, text: String, - extraClasses: String + textClasses: Option[String] = None ) + + val baseClasses = "text-sm font-medium text-gray-500 hover:text-gray-700" + + def shortHome(p: Page) = ViewModel( + p, + Some(backIcon), + "group inline-flex space-x-3 text-gray-400 hover:text-gray-500", + "Zpět na úvodní stránku", + None + ) + + def fullHome(p: Page) = ViewModel( + p, + Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), + "text-gray-400 hover:text-gray-500", + "Domů", + Some("sr-only") + ) + def apply($m: Signal[ViewModel], actionBus: Observer[Action])(using Router[Page] ): HtmlElement = - inline def alt[T]( - homeVariant: => T, - pageVariant: ViewModel => T - ): Signal[T] = - $m.map { m => - if (m.page.isRoot) then homeVariant else pageVariant(m) - } PageLink .container($m.map(_.page), actionBus) .amend( - cls <-- alt( - "text-gray-400 hover:text-gray-500", - m => - s"${m.extraClasses} text-sm font-medium text-gray-500 hover:text-gray-700" - ), - child.maybe <-- alt( - Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), - _.icon - ), - child <-- alt( - span(cls := "sr-only", "Domů"), - m => span(m.text) + cls <-- $m.map(_.extraClasses), + child.maybe <-- $m.map(_.icon), + span( + cls <-- $m.map(_.textClasses.getOrElse("")), + child.text <-- $m.map(_.text) ) ) @@ -76,12 +89,14 @@ child.maybe <-- $p.map(_.isRoot).switch(None, Some(slash)), Link( $p.map(p => - Link.ViewModel( - p, - None, - p.title, - "ml-4 max-w-xs truncate" - ) + if (p.isRoot) then Link.fullHome(p) + else + Link.ViewModel( + p, + None, + s"ml-4 max-w-xs truncate ${Link.baseClasses}", + p.title + ) ), actionBus ) @@ -98,18 +113,14 @@ Link( $m.map { p => val target = p.parent.getOrElse(p) - Link.ViewModel( - target, - Some( - Icons.solid - .`arrow-narrow-left`() - .amend( - svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" - ) - ), - s"Zpět na ${target.title}", - "group inline-flex space-x-3" - ) + if target.isRoot then Link.shortHome(target) + else + Link.ViewModel( + target, + Some(backIcon), + "group inline-flex space-x-3 text-gray-500 hover:text-gray-700", + s"Zpět na ${target.title}" + ) }, actionBus ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index eb0cbb4..954fa33 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -26,38 +26,51 @@ ) ) + def backIcon = + Icons.solid + .`arrow-narrow-left`() + .amend( + svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" + ) + object Link: case class ViewModel( page: Page, icon: Option[SvgElement], + extraClasses: String, text: String, - extraClasses: String + textClasses: Option[String] = None ) + + val baseClasses = "text-sm font-medium text-gray-500 hover:text-gray-700" + + def shortHome(p: Page) = ViewModel( + p, + Some(backIcon), + "group inline-flex space-x-3 text-gray-400 hover:text-gray-500", + "Zpět na úvodní stránku", + None + ) + + def fullHome(p: Page) = ViewModel( + p, + Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), + "text-gray-400 hover:text-gray-500", + "Domů", + Some("sr-only") + ) + def apply($m: Signal[ViewModel], actionBus: Observer[Action])(using Router[Page] ): HtmlElement = - inline def alt[T]( - homeVariant: => T, - pageVariant: ViewModel => T - ): Signal[T] = - $m.map { m => - if (m.page.isRoot) then homeVariant else pageVariant(m) - } PageLink .container($m.map(_.page), actionBus) .amend( - cls <-- alt( - "text-gray-400 hover:text-gray-500", - m => - s"${m.extraClasses} text-sm font-medium text-gray-500 hover:text-gray-700" - ), - child.maybe <-- alt( - Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), - _.icon - ), - child <-- alt( - span(cls := "sr-only", "Domů"), - m => span(m.text) + cls <-- $m.map(_.extraClasses), + child.maybe <-- $m.map(_.icon), + span( + cls <-- $m.map(_.textClasses.getOrElse("")), + child.text <-- $m.map(_.text) ) ) @@ -76,12 +89,14 @@ child.maybe <-- $p.map(_.isRoot).switch(None, Some(slash)), Link( $p.map(p => - Link.ViewModel( - p, - None, - p.title, - "ml-4 max-w-xs truncate" - ) + if (p.isRoot) then Link.fullHome(p) + else + Link.ViewModel( + p, + None, + s"ml-4 max-w-xs truncate ${Link.baseClasses}", + p.title + ) ), actionBus ) @@ -98,18 +113,14 @@ Link( $m.map { p => val target = p.parent.getOrElse(p) - Link.ViewModel( - target, - Some( - Icons.solid - .`arrow-narrow-left`() - .amend( - svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" - ) - ), - s"Zpět na ${target.title}", - "group inline-flex space-x-3" - ) + if target.isRoot then Link.shortHome(target) + else + Link.ViewModel( + target, + Some(backIcon), + "group inline-flex space-x-3 text-gray-500 hover:text-gray-700", + s"Zpět na ${target.title}" + ) }, actionBus ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala index 8200bda..7147460 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala @@ -4,6 +4,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Page import cz.e_bs.cmi.mdr.pdb.app.Action +import io.laminext.syntax.core.* object PageLayout: case class ViewModel( @@ -13,12 +14,13 @@ def apply(actionBus: Observer[Action])( $m: Signal[ViewModel], mods: Modifier[HtmlElement]* - )(using Router[Page]): HtmlElement = + )(using router: Router[Page]): HtmlElement = val $maybeContent = $m.map(_.content).split(_ => ())((_, c, _) => c) div( cls := "h-full flex flex-col", NavigationBar($m.map(_.navigation)), - PageHeader(actionBus), + child.maybe <-- router.$currentPage.map(_.isRoot) + .switch(None, Some(PageHeader(actionBus))), main( cls := "flex-grow-1 overflow-y-auto", mods, diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index eb0cbb4..954fa33 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -26,38 +26,51 @@ ) ) + def backIcon = + Icons.solid + .`arrow-narrow-left`() + .amend( + svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" + ) + object Link: case class ViewModel( page: Page, icon: Option[SvgElement], + extraClasses: String, text: String, - extraClasses: String + textClasses: Option[String] = None ) + + val baseClasses = "text-sm font-medium text-gray-500 hover:text-gray-700" + + def shortHome(p: Page) = ViewModel( + p, + Some(backIcon), + "group inline-flex space-x-3 text-gray-400 hover:text-gray-500", + "Zpět na úvodní stránku", + None + ) + + def fullHome(p: Page) = ViewModel( + p, + Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), + "text-gray-400 hover:text-gray-500", + "Domů", + Some("sr-only") + ) + def apply($m: Signal[ViewModel], actionBus: Observer[Action])(using Router[Page] ): HtmlElement = - inline def alt[T]( - homeVariant: => T, - pageVariant: ViewModel => T - ): Signal[T] = - $m.map { m => - if (m.page.isRoot) then homeVariant else pageVariant(m) - } PageLink .container($m.map(_.page), actionBus) .amend( - cls <-- alt( - "text-gray-400 hover:text-gray-500", - m => - s"${m.extraClasses} text-sm font-medium text-gray-500 hover:text-gray-700" - ), - child.maybe <-- alt( - Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), - _.icon - ), - child <-- alt( - span(cls := "sr-only", "Domů"), - m => span(m.text) + cls <-- $m.map(_.extraClasses), + child.maybe <-- $m.map(_.icon), + span( + cls <-- $m.map(_.textClasses.getOrElse("")), + child.text <-- $m.map(_.text) ) ) @@ -76,12 +89,14 @@ child.maybe <-- $p.map(_.isRoot).switch(None, Some(slash)), Link( $p.map(p => - Link.ViewModel( - p, - None, - p.title, - "ml-4 max-w-xs truncate" - ) + if (p.isRoot) then Link.fullHome(p) + else + Link.ViewModel( + p, + None, + s"ml-4 max-w-xs truncate ${Link.baseClasses}", + p.title + ) ), actionBus ) @@ -98,18 +113,14 @@ Link( $m.map { p => val target = p.parent.getOrElse(p) - Link.ViewModel( - target, - Some( - Icons.solid - .`arrow-narrow-left`() - .amend( - svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" - ) - ), - s"Zpět na ${target.title}", - "group inline-flex space-x-3" - ) + if target.isRoot then Link.shortHome(target) + else + Link.ViewModel( + target, + Some(backIcon), + "group inline-flex space-x-3 text-gray-500 hover:text-gray-700", + s"Zpět na ${target.title}" + ) }, actionBus ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala index 8200bda..7147460 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala @@ -4,6 +4,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Page import cz.e_bs.cmi.mdr.pdb.app.Action +import io.laminext.syntax.core.* object PageLayout: case class ViewModel( @@ -13,12 +14,13 @@ def apply(actionBus: Observer[Action])( $m: Signal[ViewModel], mods: Modifier[HtmlElement]* - )(using Router[Page]): HtmlElement = + )(using router: Router[Page]): HtmlElement = val $maybeContent = $m.map(_.content).split(_ => ())((_, c, _) => c) div( cls := "h-full flex flex-col", NavigationBar($m.map(_.navigation)), - PageHeader(actionBus), + child.maybe <-- router.$currentPage.map(_.isRoot) + .switch(None, Some(PageHeader(actionBus))), main( cls := "flex-grow-1 overflow-y-auto", mods, diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala index e1b3a56..7f30d46 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -43,7 +43,7 @@ def apply: HtmlElement = AppPage(state.actionBus)( $merged.map(_.map(buildModel)) - .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + .split(_ => ())((_, _, s) => DetailParametruPage(s)), $pageChangeSignal --> state.actionBus ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index eb0cbb4..954fa33 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -26,38 +26,51 @@ ) ) + def backIcon = + Icons.solid + .`arrow-narrow-left`() + .amend( + svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" + ) + object Link: case class ViewModel( page: Page, icon: Option[SvgElement], + extraClasses: String, text: String, - extraClasses: String + textClasses: Option[String] = None ) + + val baseClasses = "text-sm font-medium text-gray-500 hover:text-gray-700" + + def shortHome(p: Page) = ViewModel( + p, + Some(backIcon), + "group inline-flex space-x-3 text-gray-400 hover:text-gray-500", + "Zpět na úvodní stránku", + None + ) + + def fullHome(p: Page) = ViewModel( + p, + Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), + "text-gray-400 hover:text-gray-500", + "Domů", + Some("sr-only") + ) + def apply($m: Signal[ViewModel], actionBus: Observer[Action])(using Router[Page] ): HtmlElement = - inline def alt[T]( - homeVariant: => T, - pageVariant: ViewModel => T - ): Signal[T] = - $m.map { m => - if (m.page.isRoot) then homeVariant else pageVariant(m) - } PageLink .container($m.map(_.page), actionBus) .amend( - cls <-- alt( - "text-gray-400 hover:text-gray-500", - m => - s"${m.extraClasses} text-sm font-medium text-gray-500 hover:text-gray-700" - ), - child.maybe <-- alt( - Some(Icons.solid.home().amend(svg.cls := "flex-shrink-0")), - _.icon - ), - child <-- alt( - span(cls := "sr-only", "Domů"), - m => span(m.text) + cls <-- $m.map(_.extraClasses), + child.maybe <-- $m.map(_.icon), + span( + cls <-- $m.map(_.textClasses.getOrElse("")), + child.text <-- $m.map(_.text) ) ) @@ -76,12 +89,14 @@ child.maybe <-- $p.map(_.isRoot).switch(None, Some(slash)), Link( $p.map(p => - Link.ViewModel( - p, - None, - p.title, - "ml-4 max-w-xs truncate" - ) + if (p.isRoot) then Link.fullHome(p) + else + Link.ViewModel( + p, + None, + s"ml-4 max-w-xs truncate ${Link.baseClasses}", + p.title + ) ), actionBus ) @@ -98,18 +113,14 @@ Link( $m.map { p => val target = p.parent.getOrElse(p) - Link.ViewModel( - target, - Some( - Icons.solid - .`arrow-narrow-left`() - .amend( - svg.cls := "flex-shrink-0 text-gray-400 group-hover:text-gray-600" - ) - ), - s"Zpět na ${target.title}", - "group inline-flex space-x-3" - ) + if target.isRoot then Link.shortHome(target) + else + Link.ViewModel( + target, + Some(backIcon), + "group inline-flex space-x-3 text-gray-500 hover:text-gray-700", + s"Zpět na ${target.title}" + ) }, actionBus ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala index 8200bda..7147460 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/PageLayout.scala @@ -4,6 +4,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Page import cz.e_bs.cmi.mdr.pdb.app.Action +import io.laminext.syntax.core.* object PageLayout: case class ViewModel( @@ -13,12 +14,13 @@ def apply(actionBus: Observer[Action])( $m: Signal[ViewModel], mods: Modifier[HtmlElement]* - )(using Router[Page]): HtmlElement = + )(using router: Router[Page]): HtmlElement = val $maybeContent = $m.map(_.content).split(_ => ())((_, c, _) => c) div( cls := "h-full flex flex-col", NavigationBar($m.map(_.navigation)), - PageHeader(actionBus), + child.maybe <-- router.$currentPage.map(_.isRoot) + .switch(None, Some(PageHeader(actionBus))), main( cls := "flex-grow-1 overflow-y-auto", mods, diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala index e1b3a56..7f30d46 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -43,7 +43,7 @@ def apply: HtmlElement = AppPage(state.actionBus)( $merged.map(_.map(buildModel)) - .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + .split(_ => ())((_, _, s) => DetailParametruPage(s)), $pageChangeSignal --> state.actionBus ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala index bc2316d..17224cc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -12,7 +12,7 @@ kriteria: SeznamKriterii.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def apply($m: Signal[ViewModel]): HtmlElement = div( cls := "h-full overflow-y-auto max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div(