2020-07-30 21:12:30 +03:00
|
|
|
module Examples.RadioButton exposing
|
|
|
|
( example
|
|
|
|
, State, Msg
|
|
|
|
)
|
|
|
|
|
|
|
|
{-|
|
|
|
|
|
|
|
|
@docs example
|
|
|
|
@docs State, Msg
|
|
|
|
|
|
|
|
-}
|
|
|
|
|
2021-11-09 23:40:10 +03:00
|
|
|
import Browser.Dom as Dom
|
2020-07-30 21:12:30 +03:00
|
|
|
import Category exposing (Category(..))
|
|
|
|
import Css exposing (..)
|
2020-07-30 21:28:18 +03:00
|
|
|
import Debug.Control as Control exposing (Control)
|
2021-11-22 21:31:17 +03:00
|
|
|
import Debug.Control.Extra as ControlExtra
|
2020-07-30 21:12:30 +03:00
|
|
|
import Example exposing (Example)
|
2020-07-30 21:28:18 +03:00
|
|
|
import Html.Styled as Html exposing (..)
|
2021-11-19 20:01:42 +03:00
|
|
|
import Html.Styled.Attributes as Attributes exposing (css)
|
2020-07-30 21:12:30 +03:00
|
|
|
import KeyboardSupport exposing (Direction(..), Key(..))
|
2020-07-30 21:39:16 +03:00
|
|
|
import Nri.Ui.Button.V10 as Button
|
2020-07-30 21:28:18 +03:00
|
|
|
import Nri.Ui.Data.PremiumLevel as PremiumLevel exposing (PremiumLevel)
|
2020-07-30 21:12:30 +03:00
|
|
|
import Nri.Ui.Heading.V2 as Heading
|
2021-11-09 23:40:10 +03:00
|
|
|
import Nri.Ui.Modal.V11 as Modal
|
2021-11-16 22:05:59 +03:00
|
|
|
import Nri.Ui.RadioButton.V3 as RadioButton
|
2021-10-27 20:42:23 +03:00
|
|
|
import Nri.Ui.Text.V6 as Text
|
2021-11-09 23:40:10 +03:00
|
|
|
import Task
|
2020-07-30 21:12:30 +03:00
|
|
|
|
|
|
|
|
|
|
|
{-| -}
|
|
|
|
example : Example State Msg
|
|
|
|
example =
|
2020-09-09 21:43:10 +03:00
|
|
|
{ name = "RadioButton"
|
2021-11-16 22:05:59 +03:00
|
|
|
, version = 3
|
2020-07-30 21:12:30 +03:00
|
|
|
, state = init
|
|
|
|
, update = update
|
2020-07-30 21:39:16 +03:00
|
|
|
, subscriptions = subscriptions
|
2021-11-05 21:19:08 +03:00
|
|
|
, preview = []
|
2020-07-30 21:12:30 +03:00
|
|
|
, view = view
|
2021-09-04 18:47:56 +03:00
|
|
|
, categories = [ Inputs ]
|
2020-07-30 21:47:32 +03:00
|
|
|
, keyboardSupport =
|
2020-11-20 21:42:26 +03:00
|
|
|
[ { keys = [ Arrow Left ]
|
2020-11-07 02:57:10 +03:00
|
|
|
, result = "Move the focus & select the radio button to the left"
|
|
|
|
}
|
2020-11-20 21:42:26 +03:00
|
|
|
, { keys = [ Arrow Right ]
|
2020-11-07 02:57:10 +03:00
|
|
|
, result = "Move the focus & select the radio button to the right"
|
|
|
|
}
|
2020-11-20 21:42:26 +03:00
|
|
|
, { keys = [ Space ]
|
2020-11-07 02:57:10 +03:00
|
|
|
, result = "Select the current radio button"
|
|
|
|
}
|
|
|
|
]
|
2020-07-30 21:12:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{-| -}
|
|
|
|
view : State -> List (Html Msg)
|
2021-11-22 21:31:17 +03:00
|
|
|
view state =
|
|
|
|
let
|
|
|
|
selectionSettings =
|
|
|
|
Control.currentValue state.selectionSettings
|
|
|
|
in
|
|
|
|
[ Control.view SetSelectionSettings state.selectionSettings |> fromUnstyled
|
|
|
|
, Html.code [ css [ Css.display Css.block, Css.margin2 (Css.px 20) Css.zero ] ]
|
|
|
|
[ text <|
|
|
|
|
"RadioButton.view [ "
|
|
|
|
--++ String.join ", " (List.map Tuple.first selectionSettings)
|
|
|
|
++ "TODO: Example code!"
|
|
|
|
++ " ] "
|
|
|
|
]
|
|
|
|
, viewRadioButtons selectionSettings state.selectedValue
|
2021-11-09 23:40:10 +03:00
|
|
|
, Modal.view
|
2020-08-12 17:15:23 +03:00
|
|
|
{ title = "Go Premium!"
|
2020-07-30 21:39:16 +03:00
|
|
|
, wrapMsg = ModalMsg
|
2021-11-22 21:06:38 +03:00
|
|
|
, content = [ Text.mediumBody [ Text.plaintext "Often, we'll launch a modal showing the benefits of premium when a Premium pennant is clicked." ] ]
|
2021-11-09 23:40:10 +03:00
|
|
|
, footer =
|
|
|
|
[ Button.button "Okay"
|
|
|
|
[ Button.modal
|
|
|
|
, Button.onClick CloseModal
|
|
|
|
, Button.id "close-premium-modal"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
, focusTrap =
|
|
|
|
{ focus = Focus
|
|
|
|
, firstId = Modal.closeButtonId
|
|
|
|
, lastId = "close-premium-modal"
|
|
|
|
}
|
2020-07-30 21:39:16 +03:00
|
|
|
}
|
2021-11-09 23:40:10 +03:00
|
|
|
[ Modal.closeButton ]
|
2021-11-22 21:31:17 +03:00
|
|
|
state.modal
|
2020-07-30 21:12:30 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
|
2021-11-22 21:31:17 +03:00
|
|
|
viewRadioButtons : SelectionSettings -> Maybe Selection -> Html Msg
|
|
|
|
viewRadioButtons selectionSettings selectedValue =
|
2021-09-04 18:49:10 +03:00
|
|
|
div []
|
2020-07-30 21:28:18 +03:00
|
|
|
[ RadioButton.view
|
2021-11-19 02:18:50 +03:00
|
|
|
(selectionToString Dogs)
|
2021-11-22 21:36:22 +03:00
|
|
|
([ RadioButton.value Dogs
|
|
|
|
, RadioButton.name "pets"
|
|
|
|
, RadioButton.selectedValue selectedValue
|
|
|
|
, RadioButton.onSelect Select
|
|
|
|
, RadioButton.valueToString selectionToString
|
|
|
|
, RadioButton.describedBy [ "dogs-description" ]
|
|
|
|
, RadioButton.block
|
|
|
|
]
|
|
|
|
++ List.map Tuple.second selectionSettings.dogs
|
|
|
|
)
|
2020-07-30 21:28:18 +03:00
|
|
|
, RadioButton.view
|
2021-11-19 02:18:50 +03:00
|
|
|
(selectionToString Cats)
|
2021-11-22 21:36:22 +03:00
|
|
|
([ RadioButton.value Cats
|
|
|
|
, RadioButton.name "pets"
|
|
|
|
, RadioButton.selectedValue selectedValue
|
|
|
|
, RadioButton.onSelect Select
|
|
|
|
, RadioButton.valueToString selectionToString
|
|
|
|
, if selectedValue == Just Cats then
|
2021-11-21 17:57:38 +03:00
|
|
|
RadioButton.batch
|
|
|
|
[ RadioButton.describedBy [ "cats-description" ]
|
|
|
|
, RadioButton.hiddenLabel
|
|
|
|
]
|
2021-11-19 20:01:42 +03:00
|
|
|
|
2021-11-22 21:36:22 +03:00
|
|
|
else
|
2021-11-19 20:01:42 +03:00
|
|
|
RadioButton.none
|
2021-11-22 21:36:22 +03:00
|
|
|
, RadioButton.disclosure
|
2021-11-19 20:01:42 +03:00
|
|
|
[ span
|
|
|
|
[ Attributes.id "cats-description" ]
|
2021-11-21 20:23:24 +03:00
|
|
|
[ Text.smallBody [ Text.plaintext "Cats kind of do their own thing" ] ]
|
2021-11-19 20:01:42 +03:00
|
|
|
]
|
2021-11-22 21:36:22 +03:00
|
|
|
, RadioButton.block
|
|
|
|
]
|
|
|
|
++ List.map Tuple.second selectionSettings.cats
|
|
|
|
)
|
2021-11-19 18:05:16 +03:00
|
|
|
, RadioButton.view
|
|
|
|
(selectionToString Robots)
|
2021-11-22 21:36:22 +03:00
|
|
|
([ RadioButton.premium
|
2021-11-19 18:05:16 +03:00
|
|
|
{ teacherPremiumLevel = PremiumLevel.Premium
|
|
|
|
, contentPremiumLevel = PremiumLevel.PremiumWithWriting
|
|
|
|
}
|
2021-11-22 21:36:22 +03:00
|
|
|
, RadioButton.value Robots
|
|
|
|
, RadioButton.name "pets"
|
|
|
|
, RadioButton.selectedValue selectedValue
|
|
|
|
, RadioButton.onSelect Select
|
|
|
|
, RadioButton.valueToString selectionToString
|
|
|
|
, RadioButton.showPennant <| OpenModal ""
|
|
|
|
, RadioButton.block
|
|
|
|
]
|
|
|
|
++ List.map Tuple.second selectionSettings.robots
|
|
|
|
)
|
2021-11-19 20:01:42 +03:00
|
|
|
, p
|
|
|
|
[ Attributes.id "dogs-description" ]
|
|
|
|
[ text "Dogs are gregarious" ]
|
2020-07-30 21:28:18 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
|
2021-11-19 02:14:44 +03:00
|
|
|
type Selection
|
|
|
|
= Dogs
|
|
|
|
| Cats
|
|
|
|
| Robots
|
|
|
|
|
|
|
|
|
|
|
|
selectionToString : Selection -> String
|
|
|
|
selectionToString selection =
|
|
|
|
case selection of
|
|
|
|
Dogs ->
|
|
|
|
"Dogs"
|
|
|
|
|
|
|
|
Cats ->
|
|
|
|
"Cats"
|
|
|
|
|
|
|
|
Robots ->
|
|
|
|
"Robots"
|
|
|
|
|
|
|
|
|
2020-07-30 21:28:18 +03:00
|
|
|
{-| -}
|
|
|
|
type alias State =
|
2021-11-19 02:14:44 +03:00
|
|
|
{ selectedValue : Maybe Selection
|
2020-07-30 21:39:16 +03:00
|
|
|
, modal : Modal.Model
|
2021-11-22 21:31:17 +03:00
|
|
|
, selectionSettings : Control SelectionSettings
|
2020-07-30 21:28:18 +03:00
|
|
|
}
|
2020-07-30 21:12:30 +03:00
|
|
|
|
|
|
|
|
|
|
|
{-| -}
|
|
|
|
init : State
|
|
|
|
init =
|
2020-07-30 21:28:18 +03:00
|
|
|
{ selectedValue = Nothing
|
2020-07-30 21:39:16 +03:00
|
|
|
, modal = Modal.init
|
2021-11-22 21:31:17 +03:00
|
|
|
, selectionSettings = initSelectionSettings
|
2020-07-30 21:28:18 +03:00
|
|
|
}
|
2020-07-30 21:12:30 +03:00
|
|
|
|
|
|
|
|
2021-11-22 21:31:17 +03:00
|
|
|
type alias SelectionSettings =
|
|
|
|
{ dogs : List ( String, RadioButton.Attribute Selection Msg )
|
|
|
|
, cats : List ( String, RadioButton.Attribute Selection Msg )
|
|
|
|
, robots : List ( String, RadioButton.Attribute Selection Msg )
|
2020-07-30 21:28:18 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-11-22 21:31:17 +03:00
|
|
|
initSelectionSettings : Control SelectionSettings
|
|
|
|
initSelectionSettings =
|
|
|
|
Control.record SelectionSettings
|
|
|
|
|> Control.field "Dogs" controlAttributes
|
|
|
|
|> Control.field "Cats" controlAttributes
|
|
|
|
|> Control.field "Robots" controlAttributes
|
|
|
|
|
|
|
|
|
|
|
|
controlAttributes : Control (List ( String, RadioButton.Attribute Selection Msg ))
|
|
|
|
controlAttributes =
|
|
|
|
ControlExtra.list
|
2021-11-22 21:36:22 +03:00
|
|
|
|> ControlExtra.listItem "disabled" disabledOrEnabled
|
|
|
|
|
|
|
|
|
|
|
|
disabledOrEnabled : Control ( String, RadioButton.Attribute Selection Msg )
|
|
|
|
disabledOrEnabled =
|
|
|
|
Control.map
|
|
|
|
(\isDisabled ->
|
|
|
|
if isDisabled then
|
|
|
|
( "RadioButton.disabled", RadioButton.disabled )
|
|
|
|
|
|
|
|
else
|
|
|
|
( "RadioButton.enabled", RadioButton.enabled )
|
|
|
|
)
|
|
|
|
(Control.bool False)
|
2020-07-30 21:28:18 +03:00
|
|
|
|
|
|
|
|
|
|
|
type Msg
|
2021-11-09 23:40:10 +03:00
|
|
|
= OpenModal String
|
|
|
|
| ModalMsg Modal.Msg
|
|
|
|
| CloseModal
|
2021-11-19 02:14:44 +03:00
|
|
|
| Select Selection
|
2021-11-22 21:31:17 +03:00
|
|
|
| SetSelectionSettings (Control SelectionSettings)
|
2021-11-09 23:40:10 +03:00
|
|
|
| Focus String
|
|
|
|
| Focused (Result Dom.Error ())
|
2020-07-30 21:12:30 +03:00
|
|
|
|
|
|
|
|
|
|
|
{-| -}
|
|
|
|
update : Msg -> State -> ( State, Cmd Msg )
|
|
|
|
update msg model =
|
2020-07-30 21:28:18 +03:00
|
|
|
case msg of
|
2021-11-09 23:40:10 +03:00
|
|
|
OpenModal returnFocusTo ->
|
|
|
|
let
|
|
|
|
( modal, cmd ) =
|
|
|
|
Modal.open
|
|
|
|
{ startFocusOn = Modal.closeButtonId
|
|
|
|
, returnFocusTo = returnFocusTo
|
|
|
|
}
|
|
|
|
in
|
|
|
|
( { model | modal = modal }, Cmd.map ModalMsg cmd )
|
|
|
|
|
2020-07-30 21:39:16 +03:00
|
|
|
ModalMsg modalMsg ->
|
|
|
|
let
|
|
|
|
( modal, cmd ) =
|
|
|
|
Modal.update { dismissOnEscAndOverlayClick = True }
|
|
|
|
modalMsg
|
|
|
|
model.modal
|
|
|
|
in
|
|
|
|
( { model | modal = modal }, Cmd.map ModalMsg cmd )
|
2020-07-30 21:28:18 +03:00
|
|
|
|
2021-11-09 23:40:10 +03:00
|
|
|
CloseModal ->
|
|
|
|
let
|
|
|
|
( modal, cmd ) =
|
|
|
|
Modal.close model.modal
|
|
|
|
in
|
|
|
|
( { model | modal = modal }, Cmd.map ModalMsg cmd )
|
|
|
|
|
2020-07-30 21:28:18 +03:00
|
|
|
Select value ->
|
|
|
|
( { model | selectedValue = Just value }, Cmd.none )
|
|
|
|
|
2021-11-22 21:31:17 +03:00
|
|
|
SetSelectionSettings selectionSettings ->
|
|
|
|
( { model | selectionSettings = selectionSettings }
|
|
|
|
, Cmd.none
|
|
|
|
)
|
2020-07-30 21:28:18 +03:00
|
|
|
|
2021-11-09 23:40:10 +03:00
|
|
|
Focus focus ->
|
|
|
|
( model, Task.attempt Focused (Dom.focus focus) )
|
|
|
|
|
|
|
|
Focused _ ->
|
2020-07-30 21:28:18 +03:00
|
|
|
( model, Cmd.none )
|
2020-07-30 21:39:16 +03:00
|
|
|
|
|
|
|
|
|
|
|
subscriptions : State -> Sub Msg
|
|
|
|
subscriptions { modal } =
|
|
|
|
Sub.map ModalMsg (Modal.subscriptions modal)
|