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

310 lines
9.9 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
import Html as Root
2018-08-29 22:09:22 +03:00
import Html.Styled.Attributes exposing (css)
import ModuleExample exposing (Category(..), ModuleExample)
import Nri.Ui.Button.V9 as Button
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
import Nri.Ui.Modal.V7 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 =
{ name = "Nri.Ui.Modal.V7"
2018-08-29 22:09:22 +03:00
, category = Modals
, content =
[ Button.button "Launch Info Modal"
[ Button.onClick (InfoModalMsg (Modal.open "launch-info-modal"))
, Button.custom
[ Html.Styled.Attributes.id "launch-info-modal"
, css [ Css.marginRight (Css.px 16) ]
]
, Button.secondary
, Button.medium
]
, Button.button "Launch Warning Modal"
[ Button.onClick (WarningModalMsg (Modal.open "launch-warning-modal"))
, Button.custom [ Html.Styled.Attributes.id "launch-warning-modal" ]
, Button.secondary
, Button.medium
]
2019-06-11 20:23:13 +03:00
, Modal.info
{ title = "Modal.info"
, visibleTitle = state.visibleTitle
2019-06-11 20:23:13 +03:00
, wrapMsg = InfoModalMsg
, content =
viewContent state
InfoModalMsg
Button.primary
Button.secondary
}
state.infoModal
, Modal.warning
{ title = "Modal.warning"
, visibleTitle = state.visibleTitle
2019-06-11 20:23:13 +03:00
, wrapMsg = WarningModalMsg
, content =
viewContent state
WarningModalMsg
Button.danger
Button.secondary
}
state.warningModal
2018-08-29 22:09:22 +03:00
]
|> List.map (Html.map parentMessage)
}
viewContent :
State
-> (Modal.Msg -> Msg)
-> Button.Attribute Msg
-> Button.Attribute Msg
-> Modal.FocusableElementAttrs Msg
-> Html Msg
viewContent state wrapMsg firstButtonStyle secondButtonStyle focusableElementAttrs =
case ( state.showX, state.showContinue, state.showSecondary ) of
( True, True, True ) ->
div []
[ Modal.closeButton wrapMsg focusableElementAttrs.firstFocusableElement
, Modal.viewContent [ viewSettings state ]
, Modal.viewFooter
[ Button.button "Continue"
[ firstButtonStyle
, Button.onClick ForceClose
]
, Button.button "Close"
[ secondButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.lastFocusableElement
]
]
]
( True, False, True ) ->
div []
[ Modal.closeButton wrapMsg focusableElementAttrs.firstFocusableElement
, Modal.viewContent [ viewSettings state ]
, Modal.viewFooter
[ Button.button "Close"
[ secondButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.lastFocusableElement
]
]
]
( True, False, False ) ->
div []
[ Modal.closeButton wrapMsg focusableElementAttrs.firstFocusableElement
, Modal.viewContent [ viewSettings state ]
]
( True, True, False ) ->
div []
[ Modal.closeButton wrapMsg focusableElementAttrs.firstFocusableElement
, Modal.viewContent [ viewSettings state ]
, Modal.viewFooter
[ Button.button "Continue"
[ firstButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.lastFocusableElement
]
]
]
( False, True, True ) ->
div []
[ Modal.viewContent [ viewSettings state ]
, Modal.viewFooter
[ Button.button "Continue"
[ firstButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.firstFocusableElement
]
, Button.button "Close"
[ secondButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.lastFocusableElement
]
]
]
2019-06-11 03:45:21 +03:00
( False, False, True ) ->
div []
[ Modal.viewContent [ viewSettings state ]
, Modal.viewFooter
[ Button.button "Close"
[ secondButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.lastFocusableElement
]
]
]
( False, True, False ) ->
div []
[ Modal.viewContent [ viewSettings state ]
, Modal.viewFooter
[ Button.button "Continue"
[ firstButtonStyle
, Button.onClick ForceClose
, Button.custom focusableElementAttrs.lastFocusableElement
]
]
]
( False, False, False ) ->
div []
[ Modal.viewContent [ viewSettings state ]
]
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)
]