231 lines
6.7 KiB
Elm
231 lines
6.7 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 eventInstances model
|
|
]
|
|
)
|
|
|
|
|
|
eventMetaDataSidebar : Event -> List EventInstance -> Model -> Html Msg
|
|
eventMetaDataSidebar event eventInstances model =
|
|
let
|
|
( showVideoRecoring, videoRecording ) =
|
|
case event.videoState of
|
|
"to-be-recorded" ->
|
|
( True, "Yes" )
|
|
|
|
"not-to-be-recorded" ->
|
|
( True, "No" )
|
|
|
|
_ ->
|
|
( False, "" )
|
|
|
|
eventInstanceMetaData =
|
|
case eventInstances of
|
|
[ instance ] ->
|
|
eventInstanceItem instance model
|
|
|
|
instances ->
|
|
[ h4 []
|
|
[ text "Multiple occurences:" ]
|
|
, ul
|
|
[]
|
|
(List.map (\ei -> li [] <| eventInstanceItem ei model) instances)
|
|
]
|
|
|
|
feedbackUrl =
|
|
[a [href <| "https://bornhack.dk/" ++ model.flags.camp_slug ++ "/program/" ++ event.slug ++ "/feedback/create/" ] [text "Give feedback"]]
|
|
in
|
|
div []
|
|
([ h4 [] [ text "Metadata" ]
|
|
, ul []
|
|
([ li [] [ strong [] [ text "Type: " ], text event.eventType ]
|
|
]
|
|
++ (case showVideoRecoring of
|
|
True ->
|
|
[ li [] [ strong [] [ text "Recording: " ], text videoRecording ] ]
|
|
|
|
False ->
|
|
[]
|
|
)
|
|
)
|
|
]
|
|
++ eventInstanceMetaData
|
|
++ feedbackUrl
|
|
)
|
|
|
|
|
|
eventInstanceItem : EventInstance -> Model -> List (Html Msg)
|
|
eventInstanceItem eventInstance model =
|
|
let
|
|
toFormat =
|
|
if Date.day eventInstance.from == Date.day eventInstance.to then
|
|
"HH:mm"
|
|
else
|
|
"E HH:mm"
|
|
|
|
( locationName, _ ) =
|
|
model.eventLocations
|
|
|> List.map unpackFilterType
|
|
|> List.filter
|
|
(\( _, locationSlug ) ->
|
|
locationSlug == eventInstance.location
|
|
)
|
|
|> List.head
|
|
|> Maybe.withDefault ( "Unknown", "" )
|
|
in
|
|
[ p []
|
|
[ strong [] [ text "When: " ]
|
|
, text
|
|
((Date.Extra.toFormattedString "E HH:mm" eventInstance.from)
|
|
++ " to "
|
|
++ (Date.Extra.toFormattedString toFormat eventInstance.to)
|
|
)
|
|
]
|
|
, p []
|
|
[ strong [] [ text "Where: " ]
|
|
, text <| locationName ++ " "
|
|
, i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ) ] ] []
|
|
]
|
|
]
|
|
|
|
|
|
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 ]
|
|
]
|