noredink-ui/styleguide-app/Examples/TextArea.elm
2019-05-03 09:56:43 -07:00

194 lines
5.6 KiB
Elm

module Examples.TextArea exposing (Msg, State, example, init, update)
{-|
@docs Msg, State, example, init, update
-}
import Assets exposing (assets)
import Dict exposing (Dict)
import Html.Styled as Html
import ModuleExample as ModuleExample exposing (Category(..), ModuleExample)
import Nri.Ui.AssetPath exposing (Asset(..))
import Nri.Ui.Checkbox.V3 as Checkbox
import Nri.Ui.Text.V2 as Text
import Nri.Ui.TextArea.V4 as TextArea
{-| -}
type Msg
= InputGiven Id String
| ToggleLabel Bool
| ToggleAutoResize Bool
| ToggleErrorState Bool
| NoOp
{-| -}
type alias State =
{ textValues : Dict Int String
, showLabel : Checkbox.IsSelected
, isInError : Checkbox.IsSelected
, autoResize : Checkbox.IsSelected
}
{-| -}
example : (Msg -> msg) -> State -> ModuleExample msg
example parentMessage state =
{ name = "Nri.Ui.TextArea.V4"
, category = Inputs
, content =
[ Text.heading [ Html.text "Textarea controls" ]
, Html.div []
[ Checkbox.viewWithLabel assets
{ identifier = "show-textarea-label"
, label = "Show Label"
, setterMsg = ToggleLabel
, selected = state.showLabel
, disabled = False
, theme = Checkbox.Square
, noOpMsg = NoOp
}
, Checkbox.viewWithLabel assets
{ identifier = "textarea-autoresize"
, label = "Autoresize"
, setterMsg = ToggleAutoResize
, selected = state.autoResize
, disabled = False
, theme = Checkbox.Square
, noOpMsg = NoOp
}
, Checkbox.viewWithLabel assets
{ identifier = "textarea-isInError"
, label = "Show Error State"
, setterMsg = ToggleErrorState
, selected = state.isInError
, disabled = False
, theme = Checkbox.Square
, noOpMsg = NoOp
}
]
, TextArea.view
{ value = Maybe.withDefault "" <| Dict.get 1 state.textValues
, autofocus = False
, onInput = InputGiven 1
, onBlur = Nothing
, isInError = state.isInError == Checkbox.Selected
, label = "TextArea.view"
, height =
if state.autoResize == Checkbox.Selected then
TextArea.AutoResize TextArea.SingleLine
else
TextArea.Fixed
, placeholder = "Placeholder"
, showLabel = state.showLabel == Checkbox.Selected
}
, TextArea.writing
{ value = Maybe.withDefault "" <| Dict.get 2 state.textValues
, autofocus = False
, onInput = InputGiven 2
, onBlur = Nothing
, isInError = state.isInError == Checkbox.Selected
, label = "TextArea.writing"
, height =
if state.autoResize == Checkbox.Selected then
TextArea.AutoResize TextArea.DefaultHeight
else
TextArea.Fixed
, placeholder = "Placeholder"
, showLabel = state.showLabel == Checkbox.Selected
}
, TextArea.contentCreation
{ value = Maybe.withDefault "" <| Dict.get 3 state.textValues
, autofocus = False
, onInput = InputGiven 3
, onBlur = Nothing
, isInError = state.isInError == Checkbox.Selected
, label = "TextArea.contentCreation"
, height =
if state.autoResize == Checkbox.Selected then
TextArea.AutoResize TextArea.DefaultHeight
else
TextArea.Fixed
, placeholder = "Placeholder"
, showLabel = state.showLabel == Checkbox.Selected
}
, TextArea.writing
{ value = Maybe.withDefault "" <| Dict.get 4 state.textValues
, autofocus = False
, onInput = InputGiven 4
, onBlur = Just (InputGiven 4 "Neener neener Blur happened")
, isInError = state.isInError == Checkbox.Selected
, label = "TextArea.writing onBlur demonstration"
, height =
if state.autoResize == Checkbox.Selected then
TextArea.AutoResize TextArea.DefaultHeight
else
TextArea.Fixed
, placeholder = "Placeholder"
, showLabel = state.showLabel == Checkbox.Selected
}
]
|> List.map (Html.map parentMessage)
}
{-| -}
init : State
init =
{ textValues = Dict.empty
, showLabel = Checkbox.Selected
, isInError = Checkbox.NotSelected
, autoResize = Checkbox.NotSelected
}
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
let
toggle bool =
if bool then
Checkbox.Selected
else
Checkbox.NotSelected
in
case msg of
InputGiven id newValue ->
( { state | textValues = Dict.insert id newValue state.textValues }
, Cmd.none
)
ToggleLabel bool ->
( { state | showLabel = toggle bool }
, Cmd.none
)
ToggleErrorState bool ->
( { state | isInError = toggle bool }
, Cmd.none
)
ToggleAutoResize bool ->
( { state | autoResize = toggle bool }
, Cmd.none
)
NoOp ->
( state, Cmd.none )
-- INTERNAL
type alias Id =
Int