github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/web/elm/src/SubPage/SubPage.elm (about)

     1  module SubPage.SubPage exposing
     2      ( Model(..)
     3      , handleCallback
     4      , handleDelivery
     5      , handleNotFound
     6      , init
     7      , subscriptions
     8      , tooltip
     9      , update
    10      , urlUpdate
    11      , view
    12      )
    13  
    14  import Application.Models exposing (Session)
    15  import Build.Build as Build
    16  import Build.Header.Models
    17  import Build.Models
    18  import Dashboard.Dashboard as Dashboard
    19  import Dashboard.Models
    20  import EffectTransformer exposing (ET)
    21  import FlySuccess.FlySuccess as FlySuccess
    22  import FlySuccess.Models
    23  import HoverState
    24  import Html exposing (Html)
    25  import Job.Job as Job
    26  import Login.Login as Login
    27  import Message.Callback exposing (Callback(..))
    28  import Message.Effects exposing (Effect(..))
    29  import Message.Message exposing (Message(..))
    30  import Message.Subscription exposing (Delivery(..), Interval(..), Subscription)
    31  import Message.TopLevelMessage exposing (TopLevelMessage(..))
    32  import NotFound.Model
    33  import NotFound.NotFound as NotFound
    34  import Pipeline.Pipeline as Pipeline
    35  import Resource.Models
    36  import Resource.Resource as Resource
    37  import Routes
    38  import Tooltip
    39  import UpdateMsg exposing (UpdateMsg)
    40  
    41  
    42  type Model
    43      = BuildModel Build.Models.Model
    44      | JobModel Job.Model
    45      | ResourceModel Resource.Models.Model
    46      | PipelineModel Pipeline.Model
    47      | NotFoundModel NotFound.Model.Model
    48      | DashboardModel Dashboard.Models.Model
    49      | FlySuccessModel FlySuccess.Models.Model
    50  
    51  
    52  init : Session -> Routes.Route -> ( Model, List Effect )
    53  init session route =
    54      case route of
    55          Routes.Build { id, highlight } ->
    56              Build.init
    57                  { highlight = highlight
    58                  , pageType = Build.Header.Models.JobBuildPage id
    59                  , fromBuildPage = Nothing
    60                  }
    61                  |> Tuple.mapFirst BuildModel
    62  
    63          Routes.OneOffBuild { id, highlight } ->
    64              Build.init
    65                  { highlight = highlight
    66                  , pageType = Build.Header.Models.OneOffBuildPage id
    67                  , fromBuildPage = Nothing
    68                  }
    69                  |> Tuple.mapFirst BuildModel
    70  
    71          Routes.Resource { id, page } ->
    72              Resource.init
    73                  { resourceId = id
    74                  , paging = page
    75                  }
    76                  |> Tuple.mapFirst ResourceModel
    77  
    78          Routes.Job { id, page } ->
    79              Job.init
    80                  { jobId = id
    81                  , paging = page
    82                  }
    83                  |> Tuple.mapFirst JobModel
    84  
    85          Routes.Pipeline { id, groups } ->
    86              Pipeline.init
    87                  { pipelineLocator = id
    88                  , turbulenceImgSrc = session.turbulenceImgSrc
    89                  , selectedGroups = groups
    90                  }
    91                  |> Tuple.mapFirst PipelineModel
    92  
    93          Routes.Dashboard { searchType, dashboardView } ->
    94              Dashboard.init
    95                  { searchType = searchType
    96                  , dashboardView = dashboardView
    97                  }
    98                  |> Tuple.mapFirst DashboardModel
    99  
   100          Routes.FlySuccess noop flyPort ->
   101              FlySuccess.init
   102                  { authToken = session.authToken
   103                  , flyPort = flyPort
   104                  , noop = noop
   105                  }
   106                  |> Tuple.mapFirst FlySuccessModel
   107  
   108  
   109  handleNotFound : String -> Routes.Route -> ET Model
   110  handleNotFound notFound route ( model, effects ) =
   111      case getUpdateMessage model of
   112          UpdateMsg.NotFound ->
   113              let
   114                  ( newModel, newEffects ) =
   115                      NotFound.init { notFoundImgSrc = notFound, route = route }
   116              in
   117              ( NotFoundModel newModel, effects ++ newEffects )
   118  
   119          UpdateMsg.AOK ->
   120              ( model, effects )
   121  
   122  
   123  getUpdateMessage : Model -> UpdateMsg
   124  getUpdateMessage model =
   125      case model of
   126          BuildModel mdl ->
   127              Build.getUpdateMessage mdl
   128  
   129          JobModel mdl ->
   130              Job.getUpdateMessage mdl
   131  
   132          ResourceModel mdl ->
   133              Resource.getUpdateMessage mdl
   134  
   135          PipelineModel mdl ->
   136              Pipeline.getUpdateMessage mdl
   137  
   138          _ ->
   139              UpdateMsg.AOK
   140  
   141  
   142  genericUpdate :
   143      ET Build.Models.Model
   144      -> ET Job.Model
   145      -> ET Resource.Models.Model
   146      -> ET Pipeline.Model
   147      -> ET Dashboard.Models.Model
   148      -> ET NotFound.Model.Model
   149      -> ET FlySuccess.Models.Model
   150      -> ET Model
   151  genericUpdate fBuild fJob fRes fPipe fDash fNF fFS ( model, effects ) =
   152      case model of
   153          BuildModel buildModel ->
   154              fBuild ( buildModel, effects )
   155                  |> Tuple.mapFirst BuildModel
   156  
   157          JobModel jobModel ->
   158              fJob ( jobModel, effects )
   159                  |> Tuple.mapFirst JobModel
   160  
   161          PipelineModel pipelineModel ->
   162              fPipe ( pipelineModel, effects )
   163                  |> Tuple.mapFirst PipelineModel
   164  
   165          ResourceModel resourceModel ->
   166              fRes ( resourceModel, effects )
   167                  |> Tuple.mapFirst ResourceModel
   168  
   169          DashboardModel dashboardModel ->
   170              fDash ( dashboardModel, effects )
   171                  |> Tuple.mapFirst DashboardModel
   172  
   173          FlySuccessModel flySuccessModel ->
   174              fFS ( flySuccessModel, effects )
   175                  |> Tuple.mapFirst FlySuccessModel
   176  
   177          NotFoundModel notFoundModel ->
   178              fNF ( notFoundModel, effects )
   179                  |> Tuple.mapFirst NotFoundModel
   180  
   181  
   182  handleCallback : Callback -> Session -> ET Model
   183  handleCallback callback session =
   184      genericUpdate
   185          (Build.handleCallback callback)
   186          (Job.handleCallback callback)
   187          (Resource.handleCallback callback session)
   188          (Pipeline.handleCallback callback)
   189          (Dashboard.handleCallback callback)
   190          identity
   191          identity
   192          >> (case callback of
   193                  LoggedOut (Ok ()) ->
   194                      genericUpdate
   195                          handleLoggedOut
   196                          handleLoggedOut
   197                          handleLoggedOut
   198                          handleLoggedOut
   199                          handleLoggedOut
   200                          handleLoggedOut
   201                          handleLoggedOut
   202  
   203                  _ ->
   204                      identity
   205             )
   206  
   207  
   208  handleLoggedOut : ET { a | isUserMenuExpanded : Bool }
   209  handleLoggedOut ( m, effs ) =
   210      ( { m | isUserMenuExpanded = False }
   211      , effs
   212          ++ [ NavigateTo <|
   213                  Routes.toString <|
   214                      Routes.Dashboard
   215                          { searchType = Routes.Normal ""
   216                          , dashboardView = Routes.ViewNonArchivedPipelines
   217                          }
   218             ]
   219      )
   220  
   221  
   222  handleDelivery : { a | hovered : HoverState.HoverState } -> Delivery -> ET Model
   223  handleDelivery session delivery =
   224      genericUpdate
   225          (Build.handleDelivery session delivery)
   226          (Job.handleDelivery delivery)
   227          (Resource.handleDelivery session delivery)
   228          (Pipeline.handleDelivery delivery)
   229          (Dashboard.handleDelivery delivery)
   230          (NotFound.handleDelivery delivery)
   231          (FlySuccess.handleDelivery delivery)
   232  
   233  
   234  update : Session -> Message -> ET Model
   235  update session msg =
   236      genericUpdate
   237          (Login.update msg >> Build.update msg)
   238          (Login.update msg >> Job.update msg)
   239          (Login.update msg >> Resource.update msg)
   240          (Login.update msg >> Pipeline.update msg)
   241          (Login.update msg >> Dashboard.update session msg)
   242          (Login.update msg)
   243          (Login.update msg >> FlySuccess.update msg)
   244          >> (case msg of
   245                  GoToRoute route ->
   246                      handleGoToRoute route
   247  
   248                  _ ->
   249                      identity
   250             )
   251  
   252  
   253  handleGoToRoute : Routes.Route -> ET a
   254  handleGoToRoute route ( a, effs ) =
   255      ( a, effs ++ [ NavigateTo <| Routes.toString route ] )
   256  
   257  
   258  urlUpdate : Routes.Transition -> ET Model
   259  urlUpdate routes =
   260      genericUpdate
   261          (case routes.to of
   262              Routes.Build { id, highlight } ->
   263                  Build.changeToBuild
   264                      { pageType = Build.Header.Models.JobBuildPage id
   265                      , highlight = highlight
   266                      , fromBuildPage =
   267                          case routes.from of
   268                              Routes.Build params ->
   269                                  Just <| Build.Header.Models.JobBuildPage params.id
   270  
   271                              _ ->
   272                                  Nothing
   273                      }
   274  
   275              Routes.OneOffBuild { id, highlight } ->
   276                  Build.changeToBuild
   277                      { pageType = Build.Header.Models.OneOffBuildPage id
   278                      , highlight = highlight
   279                      , fromBuildPage =
   280                          case routes.from of
   281                              Routes.OneOffBuild params ->
   282                                  Just <| Build.Header.Models.OneOffBuildPage params.id
   283  
   284                              _ ->
   285                                  Nothing
   286                      }
   287  
   288              _ ->
   289                  identity
   290          )
   291          (case routes.to of
   292              Routes.Job { id, page } ->
   293                  Job.changeToJob { jobId = id, paging = page }
   294  
   295              _ ->
   296                  identity
   297          )
   298          (case routes.to of
   299              Routes.Resource { id, page } ->
   300                  Resource.changeToResource { resourceId = id, paging = page }
   301  
   302              _ ->
   303                  identity
   304          )
   305          (case routes.to of
   306              Routes.Pipeline { id, groups } ->
   307                  Pipeline.changeToPipelineAndGroups
   308                      { pipelineLocator = id
   309                      , selectedGroups = groups
   310                      }
   311  
   312              _ ->
   313                  identity
   314          )
   315          (case routes.to of
   316              Routes.Dashboard { searchType, dashboardView } ->
   317                  Tuple.mapFirst
   318                      (\dm ->
   319                          { dm
   320                              | highDensity = searchType == Routes.HighDensity
   321                              , dashboardView = dashboardView
   322                          }
   323                      )
   324  
   325              _ ->
   326                  identity
   327          )
   328          identity
   329          identity
   330  
   331  
   332  view : Session -> Model -> ( String, Html Message )
   333  view ({ userState } as session) mdl =
   334      case mdl of
   335          BuildModel model ->
   336              ( Build.documentTitle model
   337              , Build.view session model
   338              )
   339  
   340          JobModel model ->
   341              ( Job.documentTitle model
   342              , Job.view session model
   343              )
   344  
   345          PipelineModel model ->
   346              ( Pipeline.documentTitle model
   347              , Pipeline.view session model
   348              )
   349  
   350          ResourceModel model ->
   351              ( Resource.documentTitle model
   352              , Resource.view session model
   353              )
   354  
   355          DashboardModel model ->
   356              ( Dashboard.documentTitle
   357              , Dashboard.view session model
   358              )
   359  
   360          NotFoundModel model ->
   361              ( NotFound.documentTitle
   362              , NotFound.view session model
   363              )
   364  
   365          FlySuccessModel model ->
   366              ( FlySuccess.documentTitle
   367              , FlySuccess.view userState model
   368              )
   369  
   370  
   371  tooltip : Model -> Session -> Maybe Tooltip.Tooltip
   372  tooltip mdl =
   373      case mdl of
   374          BuildModel model ->
   375              Build.tooltip model
   376  
   377          JobModel model ->
   378              Job.tooltip model
   379  
   380          PipelineModel model ->
   381              Pipeline.tooltip model
   382  
   383          ResourceModel model ->
   384              Resource.tooltip model
   385  
   386          DashboardModel model ->
   387              Dashboard.tooltip model
   388  
   389          NotFoundModel model ->
   390              NotFound.tooltip model
   391  
   392          FlySuccessModel model ->
   393              FlySuccess.tooltip model
   394  
   395  
   396  subscriptions : Model -> List Subscription
   397  subscriptions mdl =
   398      case mdl of
   399          BuildModel model ->
   400              Build.subscriptions model
   401  
   402          JobModel _ ->
   403              Job.subscriptions
   404  
   405          PipelineModel _ ->
   406              Pipeline.subscriptions
   407  
   408          ResourceModel model ->
   409              Resource.subscriptions model
   410  
   411          DashboardModel _ ->
   412              Dashboard.subscriptions
   413  
   414          NotFoundModel _ ->
   415              NotFound.subscriptions
   416  
   417          FlySuccessModel _ ->
   418              FlySuccess.subscriptions