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

218 lines
6.1 KiB
Elm
Raw Normal View History

module Examples.Modal exposing (Msg, State, example, init, update, subscriptions)
2018-08-29 22:09:22 +03:00
{-|
@docs Msg, State, example, init, update, subscriptions
2018-08-29 22:09:22 +03:00
-}
2019-06-11 00:28:38 +03:00
import Accessibility.Styled as Html exposing (Html, div, h3, h4, p, text)
2018-08-29 22:09:22 +03:00
import Css exposing (..)
2019-06-11 04:24:09 +03:00
import Css.Global
2018-08-29 22:09:22 +03:00
import Html.Styled.Attributes exposing (css)
import ModuleExample exposing (Category(..), ModuleExample)
2019-06-11 00:28:38 +03:00
import Nri.Ui.Checkbox.V5 as Checkbox
2018-08-29 22:09:22 +03:00
import Nri.Ui.Colors.V1 as Colors
2019-06-04 03:32:10 +03:00
import Nri.Ui.Modal.V5 as Modal
2018-08-29 22:09:22 +03:00
{-| -}
type alias State =
{ infoModal : Modal.Model
, warningModal : Modal.Model
2019-06-11 00:28:38 +03:00
, visibleTitle : Bool
2019-06-11 00:53:38 +03:00
, showX : Bool
2019-06-11 03:12:35 +03:00
, showContinue : Bool
2019-06-11 04:32:54 +03:00
, showSecondary : Bool
2019-06-11 00:28:38 +03:00
}
{-| -}
init : State
init =
{ infoModal = Modal.init
, warningModal = Modal.init
, visibleTitle = True
2019-06-11 03:33:53 +03:00
, showX = True
, showContinue = True
2019-06-11 04:32:54 +03:00
, showSecondary = False
}
2018-08-29 22:09:22 +03:00
{-| -}
example : (Msg -> msg) -> State -> ModuleExample msg
example parentMessage state =
2019-06-04 03:32:10 +03:00
{ name = "Nri.Ui.Modal.V5"
2018-08-29 22:09:22 +03:00
, category = Modals
, content =
2019-06-11 03:52:19 +03:00
[ Modal.info
{ launchButton =
Modal.launchButton [] "Launch Info Modal"
|> Html.map InfoModalMsg
|> Just
2019-06-11 00:28:38 +03:00
, title =
Modal.viewTitle
{ title = "Modal.info"
, visibleTitle = state.visibleTitle
2019-06-11 00:28:38 +03:00
}
2019-06-11 03:45:21 +03:00
, content = viewInfoContent InfoModalMsg state
}
state.infoModal
, Modal.warning
{ launchButton =
Modal.launchButton [] "Launch Warning Modal"
|> Html.map WarningModalMsg
|> Just
2019-06-11 00:28:38 +03:00
, title =
Modal.viewTitle
{ title = "Modal.warning"
, visibleTitle = state.visibleTitle
2019-06-11 00:28:38 +03:00
}
2019-06-11 03:45:21 +03:00
, content = viewWarningContent WarningModalMsg state
}
state.warningModal
2018-08-29 22:09:22 +03:00
]
|> List.map (Html.map parentMessage)
}
2019-06-11 03:45:21 +03:00
viewInfoContent : (Modal.Msg -> Msg) -> State -> Html Msg
viewInfoContent wrapMsg state =
2019-06-11 03:50:39 +03:00
viewContent wrapMsg
2019-06-11 04:24:09 +03:00
(\f -> Modal.primaryButton f ForceClose wrapMsg "Continue")
2019-06-11 03:50:39 +03:00
state
2019-06-11 00:53:38 +03:00
2019-06-11 03:45:21 +03:00
viewWarningContent : (Modal.Msg -> Msg) -> State -> Html Msg
viewWarningContent wrapMsg state =
2019-06-11 03:50:39 +03:00
viewContent wrapMsg
2019-06-11 04:24:09 +03:00
(\f -> Modal.dangerButton f ForceClose wrapMsg "Have no fear")
2019-06-11 03:50:39 +03:00
state
viewContent : (Modal.Msg -> Msg) -> (Modal.FocusableElement -> Html Msg) -> State -> Html Msg
viewContent wrapMsg mainButton state =
div []
[ if state.showX then
Modal.closeButton Modal.FirstFocusableElement
|> Html.map wrapMsg
else
text ""
, Modal.viewContent [ viewSettings state ]
, if state.showContinue then
2019-06-11 04:32:54 +03:00
if state.showSecondary then
Modal.viewFooter
[ mainButton Modal.MiddleFocusableElement
, Modal.secondaryButton Modal.LastFocusableElement
ForceClose
wrapMsg
"Close"
]
else
Modal.viewFooter
[ mainButton Modal.LastFocusableElement
]
2019-06-11 03:45:21 +03:00
else
text ""
]
2019-06-11 03:52:19 +03:00
viewSettings : State -> Html Msg
viewSettings state =
div []
[ Checkbox.viewWithLabel
{ identifier = "visible-title"
, label = "Visible title"
, selected = Checkbox.selectedFromBool state.visibleTitle
, setterMsg = SetVisibleTitle
, disabled = False
, theme = Checkbox.Square
}
, Checkbox.viewWithLabel
{ identifier = "show-x"
, label = "Show X button"
, selected = Checkbox.selectedFromBool state.showX
, setterMsg = SetShowX
, disabled = False
, theme = Checkbox.Square
}
, Checkbox.viewWithLabel
{ identifier = "show-continue"
, label = "Show main button"
, selected = Checkbox.selectedFromBool state.showContinue
, setterMsg = SetShowContinue
, disabled = False
, theme = Checkbox.Square
}
2019-06-11 04:32:54 +03:00
, Checkbox.viewWithLabel
{ identifier = "show-secondary"
, label = "Show secondary button"
, selected = Checkbox.selectedFromBool state.showSecondary
, setterMsg = SetShowSecondary
, disabled = False
, theme = Checkbox.Square
}
2019-06-11 03:52:19 +03:00
]
2019-06-11 03:45:21 +03:00
2018-08-29 22:09:22 +03:00
{-| -}
2019-06-11 00:28:38 +03:00
type Msg
= InfoModalMsg Modal.Msg
| WarningModalMsg Modal.Msg
2019-06-11 03:12:35 +03:00
| ForceClose
2019-06-11 00:28:38 +03:00
| SetVisibleTitle Bool
2019-06-11 00:53:38 +03:00
| SetShowX Bool
2019-06-11 03:12:35 +03:00
| SetShowContinue Bool
2019-06-11 04:32:54 +03:00
| SetShowSecondary Bool
2018-08-29 22:09:22 +03:00
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
case msg of
InfoModalMsg modalMsg ->
case Modal.update modalMsg state.infoModal of
( newState, cmds ) ->
( { state | infoModal = newState }
, Cmd.map InfoModalMsg cmds
)
WarningModalMsg modalMsg ->
case Modal.update modalMsg state.warningModal of
( newState, cmds ) ->
( { state | warningModal = newState }
, Cmd.map WarningModalMsg cmds
)
2018-08-29 22:09:22 +03:00
2019-06-11 03:12:35 +03:00
ForceClose ->
( { state
| infoModal = Modal.init
, warningModal = Modal.init
}
, Cmd.none
)
2019-06-11 00:28:38 +03:00
SetVisibleTitle value ->
( { state | visibleTitle = value }, Cmd.none )
2019-06-11 00:53:38 +03:00
SetShowX value ->
( { state | showX = value }, Cmd.none )
2019-06-11 03:12:35 +03:00
SetShowContinue value ->
( { state | showContinue = value }, Cmd.none )
2019-06-11 04:32:54 +03:00
SetShowSecondary value ->
( { state | showSecondary = value }, Cmd.none )
2018-08-29 22:09:22 +03:00
{-| -}
subscriptions : State -> Sub Msg
subscriptions model =
Sub.batch
[ Sub.map InfoModalMsg (Modal.subscriptions model.infoModal)
, Sub.map WarningModalMsg (Modal.subscriptions model.warningModal)
]