noredink-ui/styleguide-app/Examples/Button.elm
Luke Westby c1ff19f0d0
Add Html.Styled versions for everything (#139)
* make html.styled versions of remaining widgets

* upgrade all the examples

* change license name
2018-10-23 09:55:30 -07:00

251 lines
7.0 KiB
Elm

module Examples.Button exposing (Msg, State, example, init, update)
{- \
@docs Msg, State, example, init, update,
-}
import Css exposing (middle, verticalAlign)
import Debug.Control as Control exposing (Control)
import Headings
import Html.Styled exposing (..)
import Html.Styled.Attributes exposing (css)
import ModuleExample as ModuleExample exposing (Category(..), ModuleExample, ModuleMessages)
import Nri.Ui.AssetPath exposing (Asset)
import Nri.Ui.Button.V5 as Button
import Nri.Ui.Icon.V3 as Icon
{-| -}
type Msg
= SetState State
{-| -}
type State
= State (Control Model)
{-| -}
type ButtonType
= Button
| Link
| CopyToClipboard
{-| -}
example :
{ r | teach_assignments_copyWhite_svg : Asset, x : String }
-> (String -> ModuleMessages Msg parentMsg)
-> State
-> ModuleExample parentMsg
example assets unnamedMessages state =
let
messages =
unnamedMessages "ButtonExample"
in
{ filename = "Nri.Ui.Button.V5"
, category = Buttons
, content =
[ viewButtonExamples assets messages state ]
}
{-| -}
init : { r | performance : String, lock : String } -> State
init assets =
Control.record Model
|> Control.field "label" (Control.string "Button")
|> Control.field "icon (copyToClipboard has only one choice)"
(Control.maybe False <|
Control.choice
[ ( "Performance", Control.value (Icon.performance assets) )
, ( "Lock", Control.value (Icon.lock assets) )
]
)
|> Control.field "width"
(Control.choice
[ ( "Nri.Ui.Button.V5.WidthExact 120", Control.value <| Button.WidthExact 120 )
, ( "Nri.Ui.Button.V5.WidthExact 70", Control.value <| Button.WidthExact 70 )
, ( "Nri.Ui.Button.V5.WidthUnbounded", Control.value <| Button.WidthUnbounded )
]
)
|> Control.field "button type"
(Control.choice
[ ( "Nri.Ui.Button.V5.button", Control.value Button )
, ( "Nri.Ui.Button.V5.link", Control.value Link )
, ( "Nri.Ui.Button.V5.copyToClipboard", Control.value CopyToClipboard )
]
)
|> Control.field "state (button only)"
(Control.choice <|
List.map (\x -> ( toString x, Control.value x ))
[ Button.Enabled
, Button.Disabled
, Button.Error
, Button.Unfulfilled
, Button.Loading
, Button.Success
]
)
|> State
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
case msg of
SetState newState ->
( newState, Cmd.none )
-- INTERNAL
type alias Model =
{ label : String
, icon : Maybe Icon.IconType
, width : Button.ButtonWidth
, buttonType : ButtonType
, state : Button.ButtonState
}
viewButtonExamples :
{ r | teach_assignments_copyWhite_svg : Asset, x : String }
-> ModuleMessages Msg parentMsg
-> State
-> Html parentMsg
viewButtonExamples assets messages (State control) =
let
model =
Control.currentValue control
in
[ Control.view (State >> SetState >> messages.wrapper) control
|> fromUnstyled
, buttons assets messages sizes model
, toggleButtons messages
, Button.delete assets
{ label = "Delete Something"
, onClick = messages.showItWorked "delete"
}
, Button.linkExternalWithTracking
(messages.showItWorked "linkExternalWithTracking clicked")
{ size = Button.Medium
, style = Button.Secondary
, width = Button.WidthUnbounded
, label = "linkExternalWithTracking"
, icon = Nothing
, url = "#"
}
]
|> div []
sizes : List Button.ButtonSize
sizes =
[ Button.Small
, Button.Medium
, Button.Large
]
allStyles : List Button.ButtonStyle
allStyles =
[ Button.Primary
, Button.Secondary
, Button.Borderless
, Button.Danger
, Button.Premium
]
buttons :
{ r | teach_assignments_copyWhite_svg : Asset }
-> ModuleMessages Msg parentMsg
-> List Button.ButtonSize
-> Model
-> Html parentMsg
buttons assets messages sizes model =
let
exampleRow style =
List.concat
[ [ td
[ css
[ verticalAlign middle
]
]
[ text <| toString style ]
]
, sizes
|> List.map (exampleCell style)
]
|> tr []
exampleCell style size =
(case model.buttonType of
Link ->
Button.link
{ size = size
, style = style
, label = model.label
, icon = model.icon
, url = ""
, width = model.width
}
Button ->
Button.button
{ size = size
, style = style
, onClick = messages.showItWorked (toString ( style, size ))
, width = model.width
}
{ label = model.label
, icon = model.icon
, state = model.state
}
CopyToClipboard ->
Button.copyToClipboard
assets
{ size = size
, style = style
, copyText = "wire up in your coffee file with clipboard.js"
, buttonLabel = model.label
, withIcon = model.icon /= Nothing
, width = model.width
}
)
|> List.singleton
|> td [ css [ verticalAlign middle ] ]
in
List.concat
[ [ sizes
|> List.map (\size -> th [] [ text <| toString size ])
|> (\cells -> tr [] (th [] [] :: cells))
]
, allStyles
|> List.map exampleRow
]
|> table []
toggleButtons : ModuleMessages Msg parentMsg -> Html parentMsg
toggleButtons messages =
div []
[ Headings.h3 [ text "Button toggle" ]
, Button.toggleButton
{ onDeselect = messages.showItWorked "onDeselect"
, onSelect = messages.showItWorked "onSelect"
, label = "5"
, pressed = False
}
, Button.toggleButton
{ onDeselect = messages.showItWorked "onDeselect"
, onSelect = messages.showItWorked "onSelect"
, label = "5"
, pressed = True
}
]