diff --git a/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip new file mode 100644 index 0000000..f437e39 --- /dev/null +++ b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip Binary files differ diff --git a/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip new file mode 100644 index 0000000..f437e39 --- /dev/null +++ b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip Binary files differ diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 76fe6ac..6e6dc61 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -7,6 +7,7 @@ import org.scalajs.dom import com.raquo.laminar.api.L.{*, given} import cz.e_bs.cmi.mdr.pdb.app.components.{Navigation, Layout} +import cz.e_bs.cmi.mdr.pdb.app.pages.errors.PageNotFound import scala.scalajs.js.Date import com.raquo.waypoint.Router @@ -48,6 +49,9 @@ ) ) .collectStatic(Page.Dashboard)(pages.DashboardPage) + .collect[Page.NotFound](pg => + pages.errors.PageNotFound(pg.url, pg.baseUrl) + ) .collectStatic(Page.Directory)( pages.DirectoryPage( EventStream.fromValue(List(ExampleData.persons.jmeistrova)) diff --git a/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip new file mode 100644 index 0000000..f437e39 --- /dev/null +++ b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip Binary files differ diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 76fe6ac..6e6dc61 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -7,6 +7,7 @@ import org.scalajs.dom import com.raquo.laminar.api.L.{*, given} import cz.e_bs.cmi.mdr.pdb.app.components.{Navigation, Layout} +import cz.e_bs.cmi.mdr.pdb.app.pages.errors.PageNotFound import scala.scalajs.js.Date import com.raquo.waypoint.Router @@ -48,6 +49,9 @@ ) ) .collectStatic(Page.Dashboard)(pages.DashboardPage) + .collect[Page.NotFound](pg => + pages.errors.PageNotFound(pg.url, pg.baseUrl) + ) .collectStatic(Page.Directory)( pages.DirectoryPage( EventStream.fromValue(List(ExampleData.persons.jmeistrova)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala @@ -0,0 +1 @@ + diff --git a/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip new file mode 100644 index 0000000..f437e39 --- /dev/null +++ b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip Binary files differ diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 76fe6ac..6e6dc61 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -7,6 +7,7 @@ import org.scalajs.dom import com.raquo.laminar.api.L.{*, given} import cz.e_bs.cmi.mdr.pdb.app.components.{Navigation, Layout} +import cz.e_bs.cmi.mdr.pdb.app.pages.errors.PageNotFound import scala.scalajs.js.Date import com.raquo.waypoint.Router @@ -48,6 +49,9 @@ ) ) .collectStatic(Page.Dashboard)(pages.DashboardPage) + .collect[Page.NotFound](pg => + pages.errors.PageNotFound(pg.url, pg.baseUrl) + ) .collectStatic(Page.Directory)( pages.DirectoryPage( EventStream.fromValue(List(ExampleData.persons.jmeistrova)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala @@ -0,0 +1 @@ + diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index c5c49d7..d590720 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -13,6 +13,7 @@ case object Directory extends Page("Directory") case object Dashboard extends Page("Dashboard") case class Detail(osobniCislo: String) extends Page("Detail") + case class NotFound(url: String, baseUrl: String) extends Page("404") object Routes: given JsonEncoder[Page] = DeriveJsonEncoder.gen[Page] @@ -42,7 +43,7 @@ deserializePage = _.fromJson[Page] .fold(s => throw IllegalStateException(s), identity), getPageTitle = _.title, - routeFallback = _ => Page.Dashboard, + routeFallback = url => Page.NotFound(url, base), deserializeFallback = _ => Page.Dashboard )( $popStateEvent = windowEvents.onPopState, diff --git a/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip new file mode 100644 index 0000000..f437e39 --- /dev/null +++ b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip Binary files differ diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 76fe6ac..6e6dc61 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -7,6 +7,7 @@ import org.scalajs.dom import com.raquo.laminar.api.L.{*, given} import cz.e_bs.cmi.mdr.pdb.app.components.{Navigation, Layout} +import cz.e_bs.cmi.mdr.pdb.app.pages.errors.PageNotFound import scala.scalajs.js.Date import com.raquo.waypoint.Router @@ -48,6 +49,9 @@ ) ) .collectStatic(Page.Dashboard)(pages.DashboardPage) + .collect[Page.NotFound](pg => + pages.errors.PageNotFound(pg.url, pg.baseUrl) + ) .collectStatic(Page.Directory)( pages.DirectoryPage( EventStream.fromValue(List(ExampleData.persons.jmeistrova)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala @@ -0,0 +1 @@ + diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index c5c49d7..d590720 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -13,6 +13,7 @@ case object Directory extends Page("Directory") case object Dashboard extends Page("Dashboard") case class Detail(osobniCislo: String) extends Page("Detail") + case class NotFound(url: String, baseUrl: String) extends Page("404") object Routes: given JsonEncoder[Page] = DeriveJsonEncoder.gen[Page] @@ -42,7 +43,7 @@ deserializePage = _.fromJson[Page] .fold(s => throw IllegalStateException(s), identity), getPageTitle = _.title, - routeFallback = _ => Page.Dashboard, + routeFallback = url => Page.NotFound(url, base), deserializeFallback = _ => Page.Dashboard )( $popStateEvent = windowEvents.onPopState, diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/errors/PageNotFound.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/errors/PageNotFound.scala new file mode 100644 index 0000000..f356dea --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/errors/PageNotFound.scala @@ -0,0 +1,97 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.errors + +import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.api.L.{*, given} + +def PageNotFound(url: String, basePath: String): HtmlElement = + div( + cls := "bg-white min-h-full flex flex-col lg:relative", + div( + cls := "flex-grow flex flex-col", + main( + cls := "flex-grow flex flex-col bg-white", + div( + cls := "flex-grow mx-auto max-w-7xl w-full flex flex-col px-4 sm:px-6 lg:px-8", + div( + cls := "flex-shrink-0 pt-10 sm:pt-16", + a( + href := "/", + cls := "inline-flex", + span( + cls := "sr-only", + """Workflow""" + ), + img( + cls := "h-12 w-auto", + src := "https://tailwindui.com/img/logos/workflow-mark.svg?color=indigo&shade=600", + alt := "" + ) + ) + ), + div( + cls := "flex-shrink-0 my-auto py-16 sm:py-32", + p( + cls := "text-sm font-semibold text-indigo-600 uppercase tracking-wide", + """404 error""" + ), + h1( + cls := "mt-2 text-4xl font-extrabold text-gray-900 tracking-tight sm:text-5xl", + s"Page not found" + ), + p( + cls := "mt-2 text-base text-gray-500", + s"Sorry, but page ${url} doesn't exist." + ), + div( + cls := "mt-6", + a( + href := basePath, + cls := "text-base font-medium text-indigo-600 hover:text-indigo-500", + """Go back home""" + ) + ) + ) + ) + ), + footer( + cls := "flex-shrink-0 bg-gray-50", + div( + cls := "mx-auto max-w-7xl w-full px-4 py-16 sm:px-6 lg:px-8", + nav( + cls := "flex space-x-4", + a( + href := "#", + cls := "text-sm font-medium text-gray-500 hover:text-gray-600", + """Contact Support""" + ), + span( + cls := "inline-block border-l border-gray-300", + aria.hidden := true + ), + a( + href := "#", + cls := "text-sm font-medium text-gray-500 hover:text-gray-600", + """Status""" + ), + span( + cls := "inline-block border-l border-gray-300", + aria.hidden := true + ), + a( + href := "#", + cls := "text-sm font-medium text-gray-500 hover:text-gray-600", + """Twitter""" + ) + ) + ) + ) + ), + div( + cls := "hidden lg:block lg:absolute lg:inset-y-0 lg:right-0 lg:w-1/2", + img( + cls := "absolute inset-0 h-full w-full object-cover", + src := "https://images.unsplash.com/photo-1470847355775-e0e3c35a9a2c?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1825&q=80", + alt := "" + ) + ) + ) diff --git a/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip new file mode 100644 index 0000000..f437e39 --- /dev/null +++ b/app/.yarn/cache/esbuild-windows-64-npm-0.14.21-c7afb76ffe-8.zip Binary files differ diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 76fe6ac..6e6dc61 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -7,6 +7,7 @@ import org.scalajs.dom import com.raquo.laminar.api.L.{*, given} import cz.e_bs.cmi.mdr.pdb.app.components.{Navigation, Layout} +import cz.e_bs.cmi.mdr.pdb.app.pages.errors.PageNotFound import scala.scalajs.js.Date import com.raquo.waypoint.Router @@ -48,6 +49,9 @@ ) ) .collectStatic(Page.Dashboard)(pages.DashboardPage) + .collect[Page.NotFound](pg => + pages.errors.PageNotFound(pg.url, pg.baseUrl) + ) .collectStatic(Page.Directory)( pages.DirectoryPage( EventStream.fromValue(List(ExampleData.persons.jmeistrova)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Page.scala @@ -0,0 +1 @@ + diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index c5c49d7..d590720 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -13,6 +13,7 @@ case object Directory extends Page("Directory") case object Dashboard extends Page("Dashboard") case class Detail(osobniCislo: String) extends Page("Detail") + case class NotFound(url: String, baseUrl: String) extends Page("404") object Routes: given JsonEncoder[Page] = DeriveJsonEncoder.gen[Page] @@ -42,7 +43,7 @@ deserializePage = _.fromJson[Page] .fold(s => throw IllegalStateException(s), identity), getPageTitle = _.title, - routeFallback = _ => Page.Dashboard, + routeFallback = url => Page.NotFound(url, base), deserializeFallback = _ => Page.Dashboard )( $popStateEvent = windowEvents.onPopState, diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/errors/PageNotFound.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/errors/PageNotFound.scala new file mode 100644 index 0000000..f356dea --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/errors/PageNotFound.scala @@ -0,0 +1,97 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.errors + +import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.api.L.{*, given} + +def PageNotFound(url: String, basePath: String): HtmlElement = + div( + cls := "bg-white min-h-full flex flex-col lg:relative", + div( + cls := "flex-grow flex flex-col", + main( + cls := "flex-grow flex flex-col bg-white", + div( + cls := "flex-grow mx-auto max-w-7xl w-full flex flex-col px-4 sm:px-6 lg:px-8", + div( + cls := "flex-shrink-0 pt-10 sm:pt-16", + a( + href := "/", + cls := "inline-flex", + span( + cls := "sr-only", + """Workflow""" + ), + img( + cls := "h-12 w-auto", + src := "https://tailwindui.com/img/logos/workflow-mark.svg?color=indigo&shade=600", + alt := "" + ) + ) + ), + div( + cls := "flex-shrink-0 my-auto py-16 sm:py-32", + p( + cls := "text-sm font-semibold text-indigo-600 uppercase tracking-wide", + """404 error""" + ), + h1( + cls := "mt-2 text-4xl font-extrabold text-gray-900 tracking-tight sm:text-5xl", + s"Page not found" + ), + p( + cls := "mt-2 text-base text-gray-500", + s"Sorry, but page ${url} doesn't exist." + ), + div( + cls := "mt-6", + a( + href := basePath, + cls := "text-base font-medium text-indigo-600 hover:text-indigo-500", + """Go back home""" + ) + ) + ) + ) + ), + footer( + cls := "flex-shrink-0 bg-gray-50", + div( + cls := "mx-auto max-w-7xl w-full px-4 py-16 sm:px-6 lg:px-8", + nav( + cls := "flex space-x-4", + a( + href := "#", + cls := "text-sm font-medium text-gray-500 hover:text-gray-600", + """Contact Support""" + ), + span( + cls := "inline-block border-l border-gray-300", + aria.hidden := true + ), + a( + href := "#", + cls := "text-sm font-medium text-gray-500 hover:text-gray-600", + """Status""" + ), + span( + cls := "inline-block border-l border-gray-300", + aria.hidden := true + ), + a( + href := "#", + cls := "text-sm font-medium text-gray-500 hover:text-gray-600", + """Twitter""" + ) + ) + ) + ) + ), + div( + cls := "hidden lg:block lg:absolute lg:inset-y-0 lg:right-0 lg:w-1/2", + img( + cls := "absolute inset-0 h-full w-full object-cover", + src := "https://images.unsplash.com/photo-1470847355775-e0e3c35a9a2c?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1825&q=80", + alt := "" + ) + ) + ) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..3ff608a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +