noredink-ui/styleguide-app/Examples/SegmentedControl.elm

153 lines
3.8 KiB
Elm
Raw Normal View History

2018-09-26 17:02:10 +03:00
module Examples.SegmentedControl exposing
( Msg
, State
, example
, init
, update
)
2018-03-24 05:05:34 +03:00
{-|
@docs Msg
@docs State
@docs example
@docs init
@docs update
2018-03-24 05:05:34 +03:00
-}
import Accessibility.Styled
import Debug.Control as Control exposing (Control)
import Html.Styled as Html exposing (Html)
import Html.Styled.Attributes as Attr
import Html.Styled.Events as Events
2018-03-24 05:05:34 +03:00
import ModuleExample exposing (Category(..), ModuleExample)
import Nri.Ui.Colors.V1 as Colors
2019-10-24 21:08:28 +03:00
import Nri.Ui.SegmentedControl.V8 as SegmentedControl
import Nri.Ui.Svg.V1 as Svg exposing (Svg)
import Nri.Ui.UiIcon.V1 as UiIcon
2018-03-24 05:05:34 +03:00
{-| -}
type Msg
= Select ExampleOption
| ChangeOptions (Control Options)
type ExampleOption
= A
| B
| C
2018-03-24 05:05:34 +03:00
{-| -}
type alias State =
{ selected : ExampleOption
, optionsControl : Control Options
}
type alias Options =
{ width : SegmentedControl.Width
2019-10-24 21:08:28 +03:00
, icon : Maybe Svg
, useSpa : Bool
}
2018-03-24 05:05:34 +03:00
{-| -}
example : (Msg -> msg) -> State -> ModuleExample msg
example parentMessage state =
let
options =
Control.currentValue state.optionsControl
in
2019-10-24 21:08:28 +03:00
{ name = "Nri.Ui.SegmentedControl.V8"
2019-05-03 19:30:02 +03:00
, category = Widgets
2018-03-24 05:05:34 +03:00
, content =
[ Control.view ChangeOptions state.optionsControl
|> Html.fromUnstyled
, let
viewFn =
if options.useSpa then
SegmentedControl.viewSpa Debug.toString
else
SegmentedControl.view
in
viewFn
{ onClick = Select
, options =
[ A, B, C ]
|> List.map
(\i ->
{ icon = options.icon
, label = "Option " ++ Debug.toString i
, value = i
}
)
, selected = state.selected
, width = options.width
, content = Html.text ("[Content for " ++ Debug.toString state.selected ++ "]")
}
, Html.h3 [] [ Html.text "Toggle only view" ]
, Html.p [] [ Html.text "Used when you only need the ui element and not a page control." ]
, SegmentedControl.viewToggle
{ onClick = Select
, options =
[ A, B, C ]
|> List.map
(\i ->
{ icon = options.icon
2019-09-17 02:08:08 +03:00
, label = "Choice " ++ Debug.toString i
, value = i
}
)
, selected = state.selected
, width = options.width
}
]
|> List.map (Html.map parentMessage)
2018-03-24 05:05:34 +03:00
}
{-| -}
2019-10-24 21:08:28 +03:00
init : State
init =
{ selected = A
, optionsControl =
Control.record Options
|> Control.field "width"
(Control.choice
2019-07-30 22:55:55 +03:00
[ ( "FitContent", Control.value SegmentedControl.FitContent )
, ( "FillContainer", Control.value SegmentedControl.FillContainer )
]
)
|> Control.field "icon" (Control.maybe False redFlagControl)
|> Control.field "which view function"
(Control.choice
2019-07-30 22:55:55 +03:00
[ ( "view", Control.value False )
, ( "viewSpa", Control.value True )
]
)
2018-03-24 05:05:34 +03:00
}
redFlagControl : Control Svg
redFlagControl =
Control.value (Svg.withColor Colors.red UiIcon.flag)
2018-03-24 05:05:34 +03:00
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
case msg of
Select id ->
( { state | selected = id }
, Cmd.none
)
ChangeOptions newOptions ->
( { state | optionsControl = newOptions }
, Cmd.none
)