2021-10-23 14:33:24 +02:00

108 lines
2.1 KiB
Elm

{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Comp.DatePicker exposing
( Msg
, defaultSettings
, emptyModel
, endOfDay
, init
, midOfDay
, startOfDay
, update
, updateDefault
, view
, viewTime
, viewTimeDefault
)
import Date exposing (Date)
import DatePicker exposing (DateEvent, DatePicker, Settings)
import Html exposing (Html)
import Time exposing (Month(..), utc)
type alias Msg =
DatePicker.Msg
init : ( DatePicker, Cmd Msg )
init =
DatePicker.init
emptyModel : DatePicker
emptyModel =
DatePicker.initFromDate (Date.fromCalendarDate 2021 Oct 31)
defaultSettings : Settings
defaultSettings =
let
ds =
DatePicker.defaultSettings
in
{ ds
| changeYear = DatePicker.from 2010
, parser =
\str ->
ds.parser str
|> Result.mapError (\_ -> str)
}
update : Settings -> Msg -> DatePicker -> ( DatePicker, DateEvent )
update settings msg model =
DatePicker.update settings msg model
updateDefault : Msg -> DatePicker -> ( DatePicker, DateEvent )
updateDefault msg model =
DatePicker.update defaultSettings msg model
view : Maybe Date -> Settings -> DatePicker -> Html Msg
view md settings model =
DatePicker.view md settings model
viewTime : Maybe Int -> Settings -> DatePicker -> Html Msg
viewTime md settings model =
let
date =
Maybe.map Time.millisToPosix md
|> Maybe.map (Date.fromPosix Time.utc)
in
view date settings model
viewTimeDefault : Maybe Int -> DatePicker -> Html Msg
viewTimeDefault md model =
viewTime md defaultSettings model
startOfDay : Date -> Int
startOfDay date =
let
unix0 =
Date.fromPosix Time.utc (Time.millisToPosix 0)
days =
Date.diff Date.Days unix0 date
in
days * 24 * 60 * 60 * 1000
endOfDay : Date -> Int
endOfDay date =
startOfDay date + ((24 * 60) - 1) * 60 * 1000
midOfDay : Date -> Int
midOfDay date =
startOfDay date + (12 * 60 * 60 * 1000)