207 lines
5.6 KiB
Elm
207 lines
5.6 KiB
Elm
module Views.EventDetail exposing (eventDetailView)
|
|
|
|
-- Local modules
|
|
|
|
import Messages exposing (Msg(..))
|
|
import Models exposing (..)
|
|
import Routing exposing (routeToString)
|
|
|
|
|
|
-- Core modules
|
|
|
|
import Date
|
|
|
|
|
|
-- External modules
|
|
|
|
import Html exposing (Html, text, div, ul, li, span, i, h3, h4, a, p, hr, strong)
|
|
import Html.Attributes exposing (class, classList, href)
|
|
import Html.Events exposing (onClick)
|
|
import Markdown
|
|
import Date.Extra
|
|
|
|
|
|
eventDetailView : EventSlug -> Model -> Html Msg
|
|
eventDetailView eventSlug model =
|
|
let
|
|
event =
|
|
model.events
|
|
|> List.filter (\e -> e.slug == eventSlug)
|
|
|> List.head
|
|
in
|
|
case event of
|
|
Just event ->
|
|
div [ class "row" ]
|
|
[ eventDetailContent event
|
|
, eventDetailSidebar event model
|
|
]
|
|
|
|
Nothing ->
|
|
div [ class "row" ]
|
|
[ h4 [] [ text "Event not found." ]
|
|
, a [ href "#" ] [ text "Click here to go the schedule overview." ]
|
|
]
|
|
|
|
|
|
eventDetailContent : Event -> Html Msg
|
|
eventDetailContent event =
|
|
div [ class "col-sm-9" ]
|
|
[ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ]
|
|
[ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] []
|
|
, text " Back"
|
|
]
|
|
, h3 [] [ text event.title ]
|
|
, div [] [ Markdown.toHtml [] event.abstract ]
|
|
]
|
|
|
|
|
|
getSpeakersFromSlugs : List Speaker -> List SpeakerSlug -> List Speaker -> List Speaker
|
|
getSpeakersFromSlugs speakers slugs collectedSpeakers =
|
|
case speakers of
|
|
[] ->
|
|
collectedSpeakers
|
|
|
|
speaker :: rest ->
|
|
let
|
|
foundSlug =
|
|
slugs
|
|
|> List.filter (\slug -> slug == speaker.slug)
|
|
|> List.head
|
|
|
|
foundSpeaker =
|
|
case foundSlug of
|
|
Just slug ->
|
|
[ speaker ]
|
|
|
|
Nothing ->
|
|
[]
|
|
|
|
newSlugs =
|
|
case foundSlug of
|
|
Just slug ->
|
|
List.filter (\x -> x /= slug) slugs
|
|
|
|
Nothing ->
|
|
slugs
|
|
|
|
newCollectedSpeakers =
|
|
collectedSpeakers ++ foundSpeaker
|
|
in
|
|
case slugs of
|
|
[] ->
|
|
collectedSpeakers
|
|
|
|
_ ->
|
|
getSpeakersFromSlugs rest newSlugs newCollectedSpeakers
|
|
|
|
|
|
eventDetailSidebar : Event -> Model -> Html Msg
|
|
eventDetailSidebar event model =
|
|
let
|
|
videoRecordingLink =
|
|
case event.videoUrl of
|
|
Nothing ->
|
|
[]
|
|
|
|
Just url ->
|
|
[ a [ href url, classList [ ( "btn", True ), ( "btn-success", True ) ] ]
|
|
[ i [ classList [ ( "fa", True ), ( "fa-film", True ) ] ] []
|
|
, text " Watch recording here!"
|
|
]
|
|
]
|
|
|
|
eventInstances =
|
|
List.filter (\instance -> instance.eventSlug == event.slug) model.eventInstances
|
|
|
|
speakers =
|
|
getSpeakersFromSlugs model.speakers event.speakerSlugs []
|
|
in
|
|
div
|
|
[ classList
|
|
[ ( "col-sm-3", True )
|
|
]
|
|
]
|
|
(videoRecordingLink
|
|
++ [ speakerSidebar speakers
|
|
, eventMetaDataSidebar event
|
|
, eventInstancesSidebar eventInstances
|
|
]
|
|
)
|
|
|
|
|
|
eventMetaDataSidebar : Event -> Html Msg
|
|
eventMetaDataSidebar event =
|
|
let
|
|
( showVideoRecoring, videoRecording ) =
|
|
case event.videoState of
|
|
"to-be-recorded" ->
|
|
( True, "Yes" )
|
|
|
|
"not-to-be-recorded" ->
|
|
( True, "No" )
|
|
|
|
_ ->
|
|
( False, "" )
|
|
in
|
|
div []
|
|
[ h4 [] [ text "Metadata" ]
|
|
, ul []
|
|
([ li [] [ strong [] [ text "Type: " ], text event.eventType ]
|
|
]
|
|
++ (case showVideoRecoring of
|
|
True ->
|
|
[ li [] [ strong [] [ text "Recording: " ], text videoRecording ] ]
|
|
|
|
False ->
|
|
[]
|
|
)
|
|
)
|
|
]
|
|
|
|
|
|
speakerSidebar : List Speaker -> Html Msg
|
|
speakerSidebar speakers =
|
|
div []
|
|
[ h4 []
|
|
[ text "Speakers" ]
|
|
, ul
|
|
[]
|
|
(List.map speakerDetail speakers)
|
|
]
|
|
|
|
|
|
speakerDetail : Speaker -> Html Msg
|
|
speakerDetail speaker =
|
|
li []
|
|
[ a [ href <| routeToString <| SpeakerRoute speaker.slug ] [ text speaker.name ]
|
|
]
|
|
|
|
|
|
eventInstancesSidebar : List EventInstance -> Html Msg
|
|
eventInstancesSidebar eventInstances =
|
|
div []
|
|
[ h4 []
|
|
[ text "This event will occur at:" ]
|
|
, ul
|
|
[]
|
|
(List.map eventInstanceItem eventInstances)
|
|
]
|
|
|
|
|
|
eventInstanceItem : EventInstance -> Html Msg
|
|
eventInstanceItem eventInstance =
|
|
let
|
|
toFormat =
|
|
if Date.day eventInstance.from == Date.day eventInstance.to then
|
|
"HH:mm"
|
|
else
|
|
"E HH:mm"
|
|
in
|
|
li []
|
|
[ text
|
|
((Date.Extra.toFormattedString "E HH:mm" eventInstance.from)
|
|
++ " to "
|
|
++ (Date.Extra.toFormattedString toFormat eventInstance.to)
|
|
)
|
|
]
|