github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/web/elm/src/Login/Login.elm (about) 1 module Login.Login exposing (Model, update, userDisplayName, view) 2 3 import Concourse 4 import EffectTransformer exposing (ET) 5 import Html exposing (Html) 6 import Html.Attributes exposing (attribute, href, id) 7 import Html.Events exposing (onClick) 8 import Login.Styles as Styles 9 import Message.Effects exposing (Effect(..)) 10 import Message.Message exposing (DomID(..), Message(..)) 11 import UserState exposing (UserState(..)) 12 13 14 type alias Model r = 15 { r | isUserMenuExpanded : Bool } 16 17 18 update : Message -> ET (Model r) 19 update msg ( model, effects ) = 20 case msg of 21 Click LoginButton -> 22 ( model, effects ++ [ RedirectToLogin ] ) 23 24 Click LogoutButton -> 25 ( model, effects ++ [ SendLogOutRequest ] ) 26 27 Click UserMenu -> 28 ( { model | isUserMenuExpanded = not model.isUserMenuExpanded } 29 , effects 30 ) 31 32 _ -> 33 ( model, effects ) 34 35 36 view : UserState -> Model r -> Html Message 37 view userState model = 38 Html.div 39 (id "login-component" :: Styles.loginComponent) 40 (viewLoginState userState model.isUserMenuExpanded) 41 42 43 viewLoginState : UserState -> Bool -> List (Html Message) 44 viewLoginState userState isUserMenuExpanded = 45 case userState of 46 UserStateUnknown -> 47 [] 48 49 UserStateLoggedOut -> 50 [ Html.div 51 ([ href "/sky/login" 52 , attribute "aria-label" "Log In" 53 , id "login-container" 54 , onClick <| Click LoginButton 55 ] 56 ++ Styles.loginContainer 57 ) 58 [ Html.div 59 (id "login-item" :: Styles.loginItem) 60 [ Html.a 61 [ href "/sky/login" ] 62 [ Html.text "login" ] 63 ] 64 ] 65 ] 66 67 UserStateLoggedIn user -> 68 [ Html.div 69 ([ id "login-container" 70 , onClick <| Click UserMenu 71 ] 72 ++ Styles.loginContainer 73 ) 74 [ Html.div (id "user-id" :: Styles.loginItem) 75 (Html.div 76 Styles.loginText 77 [ Html.text (userDisplayName user) ] 78 :: (if isUserMenuExpanded then 79 [ Html.div 80 ([ id "logout-button" 81 , onClick <| Click LogoutButton 82 ] 83 ++ Styles.logoutButton 84 ) 85 [ Html.text "logout" ] 86 ] 87 88 else 89 [] 90 ) 91 ) 92 ] 93 ] 94 95 96 userDisplayName : Concourse.User -> String 97 userDisplayName user = 98 Maybe.withDefault user.id <| 99 List.head <| 100 List.filter 101 (not << String.isEmpty) 102 [ user.userName, user.name, user.email ]