This module provides a material-style date picker for Elm.
You can check out the demo here.
Since this date picker
uses material-icons, you will need to have these included on your page.
Also include the DatePicker.css found in the root of this directory.
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="DatePicker.css" />To alter the color theme edit ./styl/Variables.styl, then run
npm install && npm run build-styles.
DatePicker.init returns an initialized record of DatePicker.Model. Do not throw out the returned command!
The command is used to get today's current date which the date picker uses as the default for display.
The string passed as the first argument must be a unique id for the date picker
import DatePicker
init : (Model, Cmd Msg)
init =
let
(datePickerData, datePickerInitCmd) =
DatePicker.init "my-datepicker-id"
in
( { datePickerData = datePickerData
, selectedDate = Nothing
}
, Cmd.map DatePickerMsg datePickerInitCmd
)DatePicker.update consumes the message you've mapped and a DatePicker.Model record to output ( DatePicker.Model, Cmd DatePicker.Msg).
You will need to alter your update function to handle any DatePicker.Msg that flows through.
import DatePicker exposing (Msg(SelectDate))
...
handleDatePickerMsg model datePickerMsg =
let
(datePickerData, datePickerCmd) =
DatePicker.update datePickerMsg model.datePickerData
in
( { model
| datePickerData = datePickerData
}
, Cmd.map DatePickerMsg datePickerCmd
)
...
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NoOp ->
( model, Cmd.none )
DatePickerMsg datePickerMsg ->
handleDatePickerMsg model datePickerMsgThe DatePicker.Model type needs to be added to any data structure that requires a picker instance
import DatePicker
...
type alias Model =
{ datePickerData : DatePicker.Model
}
}This is mostly an opaque type you don't have to worry about, though there are some important fields you will want to use:
today is the default "selected" day of the picker before the user has actually clicked to "select" a day.
This is needed so the head display isn't empty before the user has selected anything, without forcing there be a default selected date of "today".indexDate is a date used to track which month the calendar is currently showing. Do not set this directly. Use the setIndexDate helperselectedDate is the last date the user clicked on in the calendar that was selectableselectionMode determines whether the user sees the Calendar or the YearPickerThe main view for the date picker. Use Html.map so the returned type doesn't conflict with
your view's type.
import DatePicker
...
view : Model -> Html Msg
view model =
Html.map DatePickerMsg <|
DatePicker.view
model.datePickerData
DatePicker.defaultPropsThe second argument passed to DatePicker.view. These are configuration properties
that generally determine the range of selectable dates
Use the default props if you don't want to support any sort of configuration. These mostly center around limiting the user to a specific selection range of dates. By default, nothing is restricted.
defaultProps =
{ canSelectYear = \year -> True
, canSelectMonth = \year month -> True
, canSelectDate = \date -> True
, hideFooter = False
}Takes any of type DatePicker.Model and returns a new one with the given index date. It is
important to not just set indexDate directly as this will not refresh the data to completely
reflect this
Represents the current mode the picker is set to
type SelectionMode
= Calendar
| YearPicker
You will first need to add the
DatePicker.Msgto the type consumed by yourupdatefunction so it recognizes this type.