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 ]