From 05f751dd21061c4911249aa073c0ef997d2f36af Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Sat, 8 Jul 2023 05:41:41 +0200 Subject: [PATCH] Actual navigation WIP. --- src/App/Container.purs | 35 +++++++++++++++++++++++++++++------ src/App/Nav.purs | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/App/Container.purs b/src/App/Container.purs index f8e922d..a610869 100644 --- a/src/App/Container.purs +++ b/src/App/Container.purs @@ -18,15 +18,19 @@ import Halogen.HTML as HH import Type.Proxy (Proxy(..)) import Effect.Aff.Class (class MonadAff) +data Page = Home | LoginRegister | DomainList | Zone | AuthAdmin + data Action = AuthenticationComponentEvent AF.Output | AuthenticationDaemonAdminComponentEvent AAI.Output -- Admin interface for authd. | DomainListComponentEvent DomainListInterface.Output | AuthenticationDaemonEvent WS.Output | DNSManagerDaemonEvent WS.Output + | Routing Page type State = { token :: Maybe String , uid :: Maybe Int + , current_page :: Page } type ChildSlots = @@ -56,22 +60,39 @@ component = initialState :: forall i. i -> State initialState _ = { token: Nothing , uid: Nothing + , current_page: Home } render :: forall m. MonadAff m => State -> H.ComponentHTML Action ChildSlots m render state = HH.div_ $ - [ render_nav - , render_header - , render_auth_form - , render_newdomain_interface + [ render_header + , render_nav + , case state.current_page of + Home -> render_home + LoginRegister -> render_auth_form + DomainList -> render_newdomain_interface + Zone -> render_zone + AuthAdmin -> render_authd_admin_interface , Bulma.columns_ [ Bulma.column_ [ render_logs ], Bulma.column_ [ render_auth_WS, render_dnsmanager_WS ] ] - , render_authd_admin_interface ] where + -- TODO + render_home = render_nothing + + -- TODO + render_zone = render_nothing + + authenticated = case state.token of + Nothing -> false + Just _ -> true + + -- TODO: this is needed to show the authd admin button + admin = true + render_nav :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad - render_nav = Nav.netlibre_navbar + render_nav = Nav.netlibre_navbar authenticated admin (Routing Home) (Routing DomainList) (Routing AuthAdmin) (Routing LoginRegister) (Routing LoginRegister) render_header :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad render_header = case state.token of @@ -113,6 +134,8 @@ render state handleAction :: forall o monad. MonadAff monad => Action -> H.HalogenM State Action ChildSlots o monad Unit handleAction = case _ of + Routing page -> H.modify_ _ { current_page = page } + AuthenticationComponentEvent ev -> case ev of AF.AuthToken (Tuple uid token) -> H.modify_ _ { uid = Just uid, token = Just token } AF.MessageToSend message -> H.tell _ws_auth unit (WS.ToSend message) diff --git a/src/App/Nav.purs b/src/App/Nav.purs index 071e003..af1ad49 100644 --- a/src/App/Nav.purs +++ b/src/App/Nav.purs @@ -3,30 +3,37 @@ module App.Nav where import Prelude import CSSClasses as C import Halogen.HTML as HH +import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP import Halogen.HTML.Properties.ARIA as ARIA import Bulma as Bulma -netlibre_navbar :: forall w i. HH.HTML w i -netlibre_navbar = +netlibre_navbar :: forall w i. Boolean -> Boolean -> i -> i -> i -> i -> i -> HH.HTML w i +netlibre_navbar authenticated admin actionHome actionDomainList actionAuthdAdmin actionRegister actionLogin = main_nav [ nav_brand [ logo, burger_menu ] , nav_menu [ navbar_start - [ link_domains - , dropdown "List of something" - [ dropdown_element "something 1" - , dropdown_element "something 2" - , dropdown_element "something 3" - , dropdown_separator - , dropdown_element "something 4" - ] + [ link_home + , case authenticated of + false -> HH.div_ [] + true -> link_domains + , case authenticated, admin of + true, true -> link_authd_admin + _, _ -> HH.div_ [] + --, dropdown "List of something" + -- [ dropdown_element "something 1" + -- , dropdown_element "something 2" + -- , dropdown_element "something 3" + -- , dropdown_separator + -- , dropdown_element "something 4" + -- ] ] , navbar_end [ navbar_item [ HH.div [HP.classes C.buttons] - [ nav_button_strong "Register" - , nav_button_light "Login" + [ nav_button_strong "Register" actionRegister + , nav_button_light "Login" actionLogin ] ] ] @@ -45,13 +52,17 @@ netlibre_navbar = nav_menu = HH.div [HP.id "navbarExample", HP.classes C.navbar_menu] navbar_start = HH.div [HP.classes C.navbar_start] navbar_end = HH.div [HP.classes C.navbar_end] - link_domains = HH.a [HP.classes C.navbar_item] [HH.text "My Domains"] + link_home = HH.a [HP.classes C.navbar_item, HE.onClick (\_ -> actionHome)] [HH.text "Home"] + link_domains = HH.a [HP.classes C.navbar_item, HE.onClick (\_ -> actionDomainList)] [HH.text "Domain List"] + link_authd_admin = HH.a [HP.classes C.navbar_item, HE.onClick (\_ -> actionAuthdAdmin)] [HH.text "Authd Admin"] dropdown title dropdown_elements = HH.div [HP.classes (C.navbar_item <> C.has_dropdown <> C.is_hoverable)] [ dropdown_title title, HH.div [HP.classes C.navbar_dropdown] dropdown_elements ] dropdown_title str = HH.a [HP.classes C.navbar_link] [HH.text str] dropdown_element str = HH.a [HP.classes C.navbar_item] [HH.text str] dropdown_separator = HH.hr [HP.classes C.navbar_divider] - nav_button_strong str = HH.a [HP.classes (C.button <> C.is_primary)] [HH.strong [] [HH.text str]] - nav_button_light str = HH.a [HP.classes (C.button <> C.is_light)] [HH.text str] + nav_button_strong str action + = HH.a [HP.classes (C.button <> C.is_primary), HE.onClick (\_ -> action)] [HH.strong [] [HH.text str]] + nav_button_light str action + = HH.a [HP.classes (C.button <> C.is_light), HE.onClick (\_ -> action)] [HH.text str] navbar_item = HH.div [HP.classes C.navbar_item]