diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala index 1e2c30d..362ad5f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala @@ -7,8 +7,10 @@ type ViewModel = SeznamKriterii.Kriterium def render($m: Signal[ViewModel]): HtmlElement = div( - h3(cls := "text-l font-bold text-gray-900"), - child.text <-- $m.map(_.nazev), + h3( + cls := "text-l font-bold text-gray-900", + child.text <-- $m.map(_.nazev) + ), div( cls := "bg-white shadow overflow-hidden sm:rounded-lg", div( diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala index 1e2c30d..362ad5f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala @@ -7,8 +7,10 @@ type ViewModel = SeznamKriterii.Kriterium def render($m: Signal[ViewModel]): HtmlElement = div( - h3(cls := "text-l font-bold text-gray-900"), - child.text <-- $m.map(_.nazev), + h3( + cls := "text-l font-bold text-gray-900", + child.text <-- $m.map(_.nazev) + ), div( cls := "bg-white shadow overflow-hidden sm:rounded-lg", div( diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala index 8fff452..2fd5fc0 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -6,6 +6,13 @@ type ViewModel = SeznamParametru.Parametr def render($m: Signal[ViewModel]): HtmlElement = div( - h2(cls := "text-xl font-bold text-gray-900"), - child.text <-- $m.map(_.nazev) + cls := "pb-5 border-b border-gray-200", + h2( + cls := "text-lg leading-6 font-medium text-gray-900", + child.text <-- $m.map(_.nazev) + ), + p( + cls := "mt-2 max-w-4xl text-sm text-gray-500", + child.text <-- $m.map(_.popis) + ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala index 1e2c30d..362ad5f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala @@ -7,8 +7,10 @@ type ViewModel = SeznamKriterii.Kriterium def render($m: Signal[ViewModel]): HtmlElement = div( - h3(cls := "text-l font-bold text-gray-900"), - child.text <-- $m.map(_.nazev), + h3( + cls := "text-l font-bold text-gray-900", + child.text <-- $m.map(_.nazev) + ), div( cls := "bg-white shadow overflow-hidden sm:rounded-lg", div( diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala index 8fff452..2fd5fc0 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -6,6 +6,13 @@ type ViewModel = SeznamParametru.Parametr def render($m: Signal[ViewModel]): HtmlElement = div( - h2(cls := "text-xl font-bold text-gray-900"), - child.text <-- $m.map(_.nazev) + cls := "pb-5 border-b border-gray-200", + h2( + cls := "text-lg leading-6 font-medium text-gray-900", + child.text <-- $m.map(_.nazev) + ), + p( + cls := "mt-2 max-w-4xl text-sm text-gray-500", + child.text <-- $m.map(_.popis) + ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index ad3c67b..51fb8d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -16,6 +16,7 @@ case class Parametr( id: String, nazev: String, + popis: String, status: String, statusColor: Color, a: Anchor diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala index 1e2c30d..362ad5f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala @@ -7,8 +7,10 @@ type ViewModel = SeznamKriterii.Kriterium def render($m: Signal[ViewModel]): HtmlElement = div( - h3(cls := "text-l font-bold text-gray-900"), - child.text <-- $m.map(_.nazev), + h3( + cls := "text-l font-bold text-gray-900", + child.text <-- $m.map(_.nazev) + ), div( cls := "bg-white shadow overflow-hidden sm:rounded-lg", div( diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala index 8fff452..2fd5fc0 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -6,6 +6,13 @@ type ViewModel = SeznamParametru.Parametr def render($m: Signal[ViewModel]): HtmlElement = div( - h2(cls := "text-xl font-bold text-gray-900"), - child.text <-- $m.map(_.nazev) + cls := "pb-5 border-b border-gray-200", + h2( + cls := "text-lg leading-6 font-medium text-gray-900", + child.text <-- $m.map(_.nazev) + ), + p( + cls := "mt-2 max-w-4xl text-sm text-gray-500", + child.text <-- $m.map(_.popis) + ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index ad3c67b..51fb8d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -16,6 +16,7 @@ case class Parametr( id: String, nazev: String, + popis: String, status: String, statusColor: Color, a: Anchor diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala index 39ecf09..642046f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala @@ -12,6 +12,8 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.Parameter import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.UserFunction +import cz.e_bs.cmi.mdr.pdb.UserContract trait AppState extends connectors.DetailPageConnector.AppState @@ -26,6 +28,8 @@ extends AppState: given JsonDecoder[OsobniCislo] = JsonDecoder.string.map(OsobniCislo.apply) + given JsonDecoder[UserFunction] = DeriveJsonDecoder.gen + given JsonDecoder[UserContract] = DeriveJsonDecoder.gen given JsonDecoder[UserInfo] = DeriveJsonDecoder.gen given JsonDecoder[ParameterCriteria] = DeriveJsonDecoder.gen @@ -43,7 +47,11 @@ .asInstanceOf[js.Dictionary[js.Object]] .values // TODO: is there a more efficient way to parse from JS object directly? - .map(o => JSON.stringify(o).fromJson[UserInfo]) + .map { o => + val parsed = JSON.stringify(o).fromJson[UserInfo] + parsed.left.foreach(org.scalajs.dom.console.log(_)) + parsed + } .collect { case Right(u) => u } diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala index 1e2c30d..362ad5f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala @@ -7,8 +7,10 @@ type ViewModel = SeznamKriterii.Kriterium def render($m: Signal[ViewModel]): HtmlElement = div( - h3(cls := "text-l font-bold text-gray-900"), - child.text <-- $m.map(_.nazev), + h3( + cls := "text-l font-bold text-gray-900", + child.text <-- $m.map(_.nazev) + ), div( cls := "bg-white shadow overflow-hidden sm:rounded-lg", div( diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala index 8fff452..2fd5fc0 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -6,6 +6,13 @@ type ViewModel = SeznamParametru.Parametr def render($m: Signal[ViewModel]): HtmlElement = div( - h2(cls := "text-xl font-bold text-gray-900"), - child.text <-- $m.map(_.nazev) + cls := "pb-5 border-b border-gray-200", + h2( + cls := "text-lg leading-6 font-medium text-gray-900", + child.text <-- $m.map(_.nazev) + ), + p( + cls := "mt-2 max-w-4xl text-sm text-gray-500", + child.text <-- $m.map(_.popis) + ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index ad3c67b..51fb8d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -16,6 +16,7 @@ case class Parametr( id: String, nazev: String, + popis: String, status: String, statusColor: Color, a: Anchor diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala index 39ecf09..642046f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala @@ -12,6 +12,8 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.Parameter import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.UserFunction +import cz.e_bs.cmi.mdr.pdb.UserContract trait AppState extends connectors.DetailPageConnector.AppState @@ -26,6 +28,8 @@ extends AppState: given JsonDecoder[OsobniCislo] = JsonDecoder.string.map(OsobniCislo.apply) + given JsonDecoder[UserFunction] = DeriveJsonDecoder.gen + given JsonDecoder[UserContract] = DeriveJsonDecoder.gen given JsonDecoder[UserInfo] = DeriveJsonDecoder.gen given JsonDecoder[ParameterCriteria] = DeriveJsonDecoder.gen @@ -43,7 +47,11 @@ .asInstanceOf[js.Dictionary[js.Object]] .values // TODO: is there a more efficient way to parse from JS object directly? - .map(o => JSON.stringify(o).fromJson[UserInfo]) + .map { o => + val parsed = JSON.stringify(o).fromJson[UserInfo] + parsed.left.foreach(org.scalajs.dom.console.log(_)) + parsed + } .collect { case Right(u) => u } diff --git a/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala b/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala index 1bdfd5d..455a445 100644 --- a/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala +++ b/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala @@ -1,5 +1,7 @@ package cz.e_bs.cmi.mdr.pdb +import java.time.LocalDate + opaque type OsobniCislo = String object OsobniCislo: @@ -8,6 +10,13 @@ extension (osc: OsobniCislo) def toString: String = osc +case class UserContract( + rel: String, + startDate: LocalDate, + endDate: Option[LocalDate] +) +case class UserFunction(name: String, dept: String, ou: String) + case class UserInfo( personalNumber: OsobniCislo, username: String, @@ -17,8 +26,8 @@ titlesAfterName: Option[String] = None, email: Option[String] = None, phone: Option[String] = None, - organizationalUnit: Option[String] = None, - mainFunction: Option[String] = None, + mainFunction: Option[UserFunction] = None, + userContracts: List[UserContract] = Nil, img: Option[String] = None ) { val name = diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala index 7d51cbb..c637d35 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/AppPage.scala @@ -6,6 +6,7 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.app.Action import cz.e_bs.cmi.mdr.pdb.app.NavigateTo +import cz.e_bs.cmi.mdr.pdb.UserFunction object AppPage: // TODO: pages by logged in user @@ -39,8 +40,10 @@ None, Some("tom@example.com"), Some("+420 222 866 180"), - Some("ČMI Medical"), - Some("ředitel"), + Some( + UserFunction("administrátor zakázek", "ředitelství", "ČMI Medical") + ), + Nil, None ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala index cf123e0..c397cff 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -18,8 +18,12 @@ o.email, o.phone, o.img, - None, - None + o.mainFunction.map(f => + DetailOsoby.Funkce.ViewModel(f.name, f.dept, f.ou) + ), + o.userContracts.headOption.map(c => + DetailOsoby.PracovniPomer.ViewModel(c.rel, c.startDate, c.endDate) + ) ) extension (param: Parameter) @@ -27,6 +31,7 @@ SeznamParametru.Parametr( id = param.id, nazev = param.name, + popis = param.description, status = "Nesplněno", statusColor = Color.red, a = container(param) @@ -54,7 +59,7 @@ osobniCislo = user.personalNumber.toString, celeJmeno = user.name, prijmeni = user.surname, - hlavniFunkce = user.mainFunction, + hlavniFunkce = user.mainFunction.map(_.name), img = user.img, container = container(user) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala index 1e2c30d..362ad5f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailKriteria.scala @@ -7,8 +7,10 @@ type ViewModel = SeznamKriterii.Kriterium def render($m: Signal[ViewModel]): HtmlElement = div( - h3(cls := "text-l font-bold text-gray-900"), - child.text <-- $m.map(_.nazev), + h3( + cls := "text-l font-bold text-gray-900", + child.text <-- $m.map(_.nazev) + ), div( cls := "bg-white shadow overflow-hidden sm:rounded-lg", div( diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala index 8fff452..2fd5fc0 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -6,6 +6,13 @@ type ViewModel = SeznamParametru.Parametr def render($m: Signal[ViewModel]): HtmlElement = div( - h2(cls := "text-xl font-bold text-gray-900"), - child.text <-- $m.map(_.nazev) + cls := "pb-5 border-b border-gray-200", + h2( + cls := "text-lg leading-6 font-medium text-gray-900", + child.text <-- $m.map(_.nazev) + ), + p( + cls := "mt-2 max-w-4xl text-sm text-gray-500", + child.text <-- $m.map(_.popis) + ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index ad3c67b..51fb8d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -16,6 +16,7 @@ case class Parametr( id: String, nazev: String, + popis: String, status: String, statusColor: Color, a: Anchor diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala index 39ecf09..642046f 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala @@ -12,6 +12,8 @@ import com.raquo.waypoint.Router import cz.e_bs.cmi.mdr.pdb.Parameter import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.UserFunction +import cz.e_bs.cmi.mdr.pdb.UserContract trait AppState extends connectors.DetailPageConnector.AppState @@ -26,6 +28,8 @@ extends AppState: given JsonDecoder[OsobniCislo] = JsonDecoder.string.map(OsobniCislo.apply) + given JsonDecoder[UserFunction] = DeriveJsonDecoder.gen + given JsonDecoder[UserContract] = DeriveJsonDecoder.gen given JsonDecoder[UserInfo] = DeriveJsonDecoder.gen given JsonDecoder[ParameterCriteria] = DeriveJsonDecoder.gen @@ -43,7 +47,11 @@ .asInstanceOf[js.Dictionary[js.Object]] .values // TODO: is there a more efficient way to parse from JS object directly? - .map(o => JSON.stringify(o).fromJson[UserInfo]) + .map { o => + val parsed = JSON.stringify(o).fromJson[UserInfo] + parsed.left.foreach(org.scalajs.dom.console.log(_)) + parsed + } .collect { case Right(u) => u } diff --git a/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala b/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala index 1bdfd5d..455a445 100644 --- a/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala +++ b/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/UserProfile.scala @@ -1,5 +1,7 @@ package cz.e_bs.cmi.mdr.pdb +import java.time.LocalDate + opaque type OsobniCislo = String object OsobniCislo: @@ -8,6 +10,13 @@ extension (osc: OsobniCislo) def toString: String = osc +case class UserContract( + rel: String, + startDate: LocalDate, + endDate: Option[LocalDate] +) +case class UserFunction(name: String, dept: String, ou: String) + case class UserInfo( personalNumber: OsobniCislo, username: String, @@ -17,8 +26,8 @@ titlesAfterName: Option[String] = None, email: Option[String] = None, phone: Option[String] = None, - organizationalUnit: Option[String] = None, - mainFunction: Option[String] = None, + mainFunction: Option[UserFunction] = None, + userContracts: List[UserContract] = Nil, img: Option[String] = None ) { val name = diff --git a/project/MockDataExport.scala b/project/MockDataExport.scala index 9649884..71e4acb 100644 --- a/project/MockDataExport.scala +++ b/project/MockDataExport.scala @@ -70,7 +70,7 @@ fce: Option[List[(String, Option[String])]], pp: List[List[(String, Option[String])]] ): String = { - val contracts = pp.map(p => s"{${renderParams(p)}").mkString(", ") + val contracts = pp.map(p => s"{${renderParams(p)}}").mkString(", ") val mainF = fce .map(renderParams) .map(p => s""", "mainFunction": {$p}""") @@ -92,10 +92,11 @@ .find(n => (n \ "hlavniFunkce").text == "true") .flatMap(str(a)) - def mainContract(a: String) = (z: scala.xml.Node) => - (z \\ "ExportPracovniPomer") - .find(n => (n \ "datumUkonceni").text.isEmpty) - .flatMap(str(a)) + def mainContract(f: String => scala.xml.Node => Option[String])(a: String) = + (z: scala.xml.Node) => + (z \\ "ExportPracovniPomer") + .find(n => (n \ "datumUkonceni").text.isEmpty) + .flatMap(f(a)) def id = str("osobniCislo").andThen(_.get) @@ -135,9 +136,13 @@ ): (String, List[(String, Option[String])]) = parseRecord( List( - "rel" -> mainContract("druh"), - "startDate" -> mainContract("datumNastupu"), - "endDate" -> mainContract("datumUkonceni") + "rel" -> mainContract(str)("druh"), + "startDate" -> mainContract(str)("datumNastupu").andThen( + _.map(_.take(10)) + ), + "endDate" -> mainContract(optstr)("datumUkonceni").andThen( + _.map(_.take(10)) + ) ) )(record)