2019-06-10 23:58:12 +03:00
|
|
|
module Examples.Modal exposing (Msg, State, example, init, update, subscriptions)
|
2018-08-29 22:09:22 +03:00
|
|
|
|
|
|
|
{-|
|
|
|
|
|
2019-06-10 23:58:12 +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 =
|
2019-06-10 23:58:12 +03:00
|
|
|
{ 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
|
2019-06-10 23:58:12 +03:00
|
|
|
}
|
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
|
2019-06-11 03:20:22 +03:00
|
|
|
{ launchButton =
|
|
|
|
Modal.launchButton [] "Launch Info Modal"
|
|
|
|
|> Html.map InfoModalMsg
|
|
|
|
|> Just
|
2019-06-11 00:28:38 +03:00
|
|
|
, title =
|
|
|
|
Modal.viewTitle
|
|
|
|
{ title = "Modal.info"
|
2019-06-11 03:20:22 +03:00
|
|
|
, visibleTitle = state.visibleTitle
|
2019-06-11 00:28:38 +03:00
|
|
|
}
|
2019-06-11 03:45:21 +03:00
|
|
|
, content = viewInfoContent InfoModalMsg state
|
2019-06-10 23:58:12 +03:00
|
|
|
}
|
|
|
|
state.infoModal
|
|
|
|
, Modal.warning
|
2019-06-11 03:20:22 +03:00
|
|
|
{ launchButton =
|
|
|
|
Modal.launchButton [] "Launch Warning Modal"
|
|
|
|
|> Html.map WarningModalMsg
|
|
|
|
|> Just
|
2019-06-11 00:28:38 +03:00
|
|
|
, title =
|
|
|
|
Modal.viewTitle
|
|
|
|
{ title = "Modal.warning"
|
2019-06-11 03:20:22 +03:00
|
|
|
, visibleTitle = state.visibleTitle
|
2019-06-11 00:28:38 +03:00
|
|
|
}
|
2019-06-11 03:45:21 +03:00
|
|
|
, content = viewWarningContent WarningModalMsg state
|
2019-06-10 23:58:12 +03:00
|
|
|
}
|
|
|
|
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 =
|
2019-06-11 04:27:54 +03:00
|
|
|
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
|
|
|
|
2019-06-11 04:27:54 +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
|
2019-06-10 23:58:12 +03:00
|
|
|
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
|
|
|
|
2019-06-10 23:58:12 +03:00
|
|
|
{-| -}
|
|
|
|
subscriptions : State -> Sub Msg
|
|
|
|
subscriptions model =
|
|
|
|
Sub.batch
|
|
|
|
[ Sub.map InfoModalMsg (Modal.subscriptions model.infoModal)
|
|
|
|
, Sub.map WarningModalMsg (Modal.subscriptions model.warningModal)
|
|
|
|
]
|