module Demo.Textfields where import Html exposing (Html) import Effects exposing (Effects) import Regex import Material.Textfield as Textfield import Material.Grid as Grid exposing (..) import Material.Helpers exposing (map1st) import Material import Demo.Page as Page -- MODEL type alias Model = { mdl : Material.Model , rx : (String, Regex.Regex) } rx0 : String rx0 = "[0-9]*" setRegex : String -> (String, Regex.Regex) setRegex str = (str, Regex.regex str) model : Model model = { mdl = Material.model , rx = setRegex rx0 } -- ACTION, UPDATE type Action = MDL (Material.Action Action) | Upd0 String | Upd4 String transferToDisabled : String -> Mdl -> Mdl transferToDisabled str = field3.map (\m -> { m | value = if str == "" then "" else "\"" ++ str ++ "\" (still disabled, though)" }) {- Check that rx matches all of str. -} match : String -> Regex.Regex -> Bool match str rx = Regex.find Regex.All rx str |> List.any (.match >> (==) str) checkRegex : String -> (String, Regex.Regex) -> Mdl -> Mdl checkRegex str (rx', rx) mdl = let value4 = field4.get mdl |> .value in mdl |> field4.map (\m -> { m | error = if match value4 rx then Nothing else "Doesn't match regex ' " ++ rx' ++ "'" |> Just }) update : Action -> Model -> (Model, Effects Action) update action model = case action of MDL action' -> Material.update MDL action' model.mdl |> map1st (\mdl' -> { model | mdl = mdl' }) Upd0 str -> ( { model | mdl = transferToDisabled str model.mdl } , Effects.none ) Upd4 str -> ( { model | mdl = checkRegex str model.rx model.mdl } , Effects.none ) -- VIEW m0 : Textfield.Model m0 = Textfield.model type alias Mdl = Material.Model field0 : Textfield.Instance Mdl Action field0 = Textfield.instance 0 MDL m0 [ Textfield.fwdInput Upd0 ] field1 : Textfield.Instance Mdl Action field1 = Textfield.instance 1 MDL { m0 | label = Just { text = "Labelled", float = False } } [] field2 : Textfield.Instance Mdl Action field2 = Textfield.instance 2 MDL { m0 | label = Just { text = "Floating label", float = True } } [] field3 : Textfield.Instance Mdl Action field3 = Textfield.instance 3 MDL { m0 | label = Just { text = "Disabled", float = False } , isDisabled = True } [] field4 : Textfield.Instance Mdl Action field4 = Textfield.instance 4 MDL { m0 | label = Just { text = "With error checking", float = False } } [ Textfield.fwdInput Upd4 ] view : Signal.Address Action -> Model -> Html view addr model = [ field0 , field1 , field2 , field3 , field4 ] |> List.map (\c -> cell [size All 4, offset Desktop 1] [c.view addr model.mdl] ) |> List.intersperse (cell [size All 1] []) |> grid [] |> flip (::) [] |> (::) (Html.text "Try entering text into some of the textfields below.") |> Page.body "Textfields" srcUrl intro references intro : Html intro = Page.fromMDL "http://www.getmdl.io/components/#textfields-section" """ > The Material Design Lite (MDL) text field component is an enhanced version of > the standard HTML `` and `` elements. > A text field consists of a horizontal line indicating where keyboard input > can occur and, typically, text that clearly communicates the intended > contents of the text field. The MDL text field component provides various > types of text fields, and allows you to add both display and click effects. > > Text fields are a common feature of most user interfaces, regardless of a > site's content or function. Their design and use is therefore an important > factor in the overall user experience. See the text field component's > [Material Design specifications page](https://www.google.com/design/spec/components/text-fields.html) > for details. > > The enhanced text field component has a more vivid visual look than a standard > text field, and may be initially or programmatically disabled. There are three > main types of text fields in the text field component, each with its own basic > coding requirements. The types are single-line, multi-line, and expandable. This implementation provides only single-line. """ srcUrl : String srcUrl = "https://github.com/debois/elm-mdl/blob/master/examples/Demo/Textfields.elm" references : List (String, String) references = [ Page.package "http://package.elm-lang.org/packages/debois/elm-mdl/latest/Material-Textfield" , Page.mds "https://www.google.com/design/spec/components/text-fields.html" , Page.mdl "https://www.getmdl.io/components/#textfields-section" ]