Skip to content

Instantly share code, notes, and snippets.

@gdotdesign
Last active January 12, 2017 17:59
Show Gist options
  • Save gdotdesign/31cde4cd3fd12fbac89341415fc5101a to your computer and use it in GitHub Desktop.
Save gdotdesign/31cde4cd3fd12fbac89341415fc5101a to your computer and use it in GitHub Desktop.
module Main exposing (..)
import Html exposing (div, span, strong, text)
import Date
import Time
import Debug
import Date.Extra.Format exposing (isoString)
import Ext.Date
import Ui.Container
import Ui.App
import Ui.DatePicker
import Ui
type alias Picker =
{ id : Int
, datePicker : Ui.DatePicker.Model
, iso8601 : String
}
type alias Model =
{ app : Ui.App.Model
, pickers : List Picker
}
type Msg
= UiAppMessage Ui.App.Msg
| UiDatePickerMessage Int Ui.DatePicker.Msg
| SetIso8601 Int Time.Time
init : Model
init =
let
datePicker : () -> Ui.DatePicker.Model
datePicker () =
Ui.DatePicker.init (Ext.Date.now ())
picker : Int -> Picker
picker id =
{ id = id
, datePicker = datePicker ()
, iso8601 = "Waiting for a date selection"
}
pickers : Int -> List Picker
pickers count =
count
|> List.range 1
|> List.map picker
in
{ app = Ui.App.init
, pickers = pickers 2
}
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
UiAppMessage subMsg ->
let
( app, effect ) = Ui.App.update subMsg model.app
in
( { model | app = app }, Cmd.map UiAppMessage effect )
UiDatePickerMessage id subMsg ->
let
replacePicker : Picker -> (Picker, Cmd Msg)
replacePicker ({ datePicker } as onPicker) =
if onPicker.id == id then
let
( updatedDatepicker, effect ) =
Ui.DatePicker.update subMsg datePicker
in
( { onPicker | datePicker = updatedDatepicker }
, Cmd.map (UiDatePickerMessage id) effect)
else
(onPicker, Cmd.none)
updatePickers : List (Picker, Cmd Msg)
updatePickers =
model.pickers
|> List.map replacePicker
in
( { model | pickers = List.map Tuple.first updatePickers }
, updatePickers
|> List.map Tuple.second
|> Cmd.batch
)
SetIso8601 id time ->
let
iso8601 : String
iso8601 =
time
|> Date.fromTime
|> isoString
replacePicker : Picker -> Picker
replacePicker onPicker =
if onPicker.id == id then
{ onPicker | iso8601 = iso8601 }
else
onPicker
updatePickers : List Picker
updatePickers =
model.pickers
|> List.map replacePicker
in
( { model | pickers = updatePickers }
, Cmd.none
)
view : Model -> Html.Html Msg
view model =
let
viewPicker : Picker -> Html.Html Msg
viewPicker picker =
div
[]
[ div [] [ text picker.iso8601 ]
-- Is the problem here?
, Html.map (UiDatePickerMessage picker.id) (Ui.DatePicker.render "en_gb" picker.datePicker)
]
viewPickers : List (Html.Html Msg)
viewPickers =
model.pickers
|> List.map viewPicker
in
Ui.App.view
UiAppMessage
model.app
[ Ui.Container.column [] viewPickers ]
subscriptions model =
let
subscriptionsToPickerDatePickers pickers =
let
-- Is the problem here?
subscribe picker =
Sub.map (UiDatePickerMessage picker.id) (Ui.DatePicker.subscriptions picker.datePicker)
in
pickers
|> List.map subscribe
|> Sub.batch
subscriptionsToPickerDatePickerChanges pickers =
let
-- Is the problem here?
subscribe picker =
Ui.DatePicker.subscribe (SetIso8601 picker.id) picker.datePicker
in
pickers
|> List.map subscribe
|> Sub.batch
in
Sub.batch
[ subscriptionsToPickerDatePickers model.pickers
, subscriptionsToPickerDatePickerChanges model.pickers
]
main =
Html.program
{ init = ( init, Cmd.none )
, view = view
, update = update
, subscriptions = subscriptions
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment