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

216 lines
6.2 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 21:26:24 +03:00
, dismissOnEscAndOverlayClick : Bool
2019-06-11 00:28:38 +03:00
}
{-| -}
init : State
init =
2019-06-12 21:12:37 +03:00
{ infoModal = Modal.init
, warningModal = Modal.init
2019-06-11 00:28:38 +03:00
, visibleTitle = True
2019-06-11 03:33:53 +03:00
, showX = True
, showContinue = True
2019-06-11 04:32:54 +03:00
, showSecondary = False
2019-06-11 21:26:24 +03:00
, dismissOnEscAndOverlayClick = True
}
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-12 21:12:37 +03:00
[ Modal.launchButton InfoModalMsg [] "Launch Info Modal"
, Modal.launchButton WarningModalMsg [] "Launch Warning Modal"
2019-06-11 20:23:13 +03:00
, Modal.info
2019-06-12 21:12:37 +03:00
{ title = { title = "Modal.info", visibleTitle = state.visibleTitle }
2019-06-11 20:23:13 +03:00
, wrapMsg = InfoModalMsg
2019-06-12 21:12:37 +03:00
, content =
viewContent
state
InfoModalMsg
(Modal.primaryButton ForceClose "Continue")
}
state.infoModal
, Modal.warning
2019-06-12 21:12:37 +03:00
{ title = { title = "Modal.warning", visibleTitle = state.visibleTitle }
2019-06-11 20:23:13 +03:00
, wrapMsg = WarningModalMsg
2019-06-12 21:12:37 +03:00
, content =
viewContent
state
WarningModalMsg
(Modal.dangerButton ForceClose "Have no fear")
}
state.warningModal
2018-08-29 22:09:22 +03:00
]
|> List.map (Html.map parentMessage)
}
2019-06-12 21:12:37 +03:00
viewContent state wrapMsg primaryButton { firstFocusableElement, lastFocusableElement } =
div []
[ if state.showX then
2019-06-12 21:12:37 +03:00
Modal.closeButton wrapMsg firstFocusableElement
else
text ""
, Modal.viewContent [ viewSettings state ]
, if state.showContinue then
2019-06-11 04:32:54 +03:00
if state.showSecondary then
Modal.viewFooter
2019-06-12 21:12:37 +03:00
[ primaryButton []
, Modal.secondaryButton
2019-06-11 04:32:54 +03:00
ForceClose
"Close"
2019-06-12 21:12:37 +03:00
lastFocusableElement
2019-06-11 04:32:54 +03:00
]
else
Modal.viewFooter
2019-06-12 21:12:37 +03:00
[ primaryButton lastFocusableElement
2019-06-11 04:32:54 +03:00
]
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-12 21:12:37 +03:00
, Checkbox.viewWithLabel
{ identifier = "dismiss-on-click"
, label = "Dismiss on ESC and on backdrop click"
, selected = Checkbox.selectedFromBool state.dismissOnEscAndOverlayClick
, setterMsg = SetDismissOnEscAndOverlayClick
, 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
2019-06-11 21:26:24 +03:00
| SetDismissOnEscAndOverlayClick Bool
2018-08-29 22:09:22 +03:00
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
2019-06-12 21:12:37 +03:00
let
updateConfig =
{ dismissOnEscAndOverlayClick = state.dismissOnEscAndOverlayClick }
in
2018-08-29 22:09:22 +03:00
case msg of
InfoModalMsg modalMsg ->
2019-06-12 21:12:37 +03:00
case Modal.update updateConfig modalMsg state.infoModal of
( newState, cmds ) ->
( { state | infoModal = newState }
, Cmd.map InfoModalMsg cmds
)
WarningModalMsg modalMsg ->
2019-06-12 21:12:37 +03:00
case Modal.update updateConfig 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
2019-06-12 21:12:37 +03:00
| infoModal = Modal.init
, warningModal = Modal.init
2019-06-11 03:12:35 +03:00
}
, 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 )
2019-06-11 21:26:24 +03:00
SetDismissOnEscAndOverlayClick value ->
2019-06-12 21:12:37 +03:00
( { state | dismissOnEscAndOverlayClick = value }, Cmd.none )
2019-06-11 21:26:24 +03:00
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)
]