Last active
January 12, 2017 17:59
-
-
Save gdotdesign/31cde4cd3fd12fbac89341415fc5101a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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