noredink-ui/styleguide-app/CommonControls.elm

333 lines
10 KiB
Elm
Raw Normal View History

module CommonControls exposing
( css, mobileCss, quizEngineMobileCss, notMobileCss
2022-03-05 04:04:56 +03:00
, choice
2022-03-10 02:01:06 +03:00
, icon, iconNotCheckedByDefault, uiIcon
2022-03-10 02:07:57 +03:00
, content
2022-03-22 03:12:15 +03:00
, httpError
2022-03-15 21:06:13 +03:00
, disabledListItem, premiumDisplay
)
{-|
@docs css, mobileCss, quizEngineMobileCss, notMobileCss
2022-03-05 04:04:56 +03:00
@docs choice
2022-03-10 02:01:06 +03:00
@docs icon, iconNotCheckedByDefault, uiIcon
### Content
2022-03-10 02:07:57 +03:00
@docs content
2022-03-22 03:12:15 +03:00
@docs httpError
-}
import Css
import Debug.Control as Control exposing (Control)
2022-03-05 00:51:31 +03:00
import Debug.Control.Extra as ControlExtra
import Html.Styled as Html exposing (Html)
import Http
2022-03-10 02:26:42 +03:00
import Nri.Ui.ClickableText.V3 as ClickableText
import Nri.Ui.Colors.V1 as Colors
2022-03-10 22:18:14 +03:00
import Nri.Ui.Data.PremiumDisplay as PremiumDisplay exposing (PremiumDisplay)
import Nri.Ui.Svg.V1 exposing (Svg)
import Nri.Ui.UiIcon.V1 as UiIcon
premiumDisplay : Control ( String, PremiumDisplay )
premiumDisplay =
Control.choice
2022-03-12 00:54:18 +03:00
[ ( "Free", Control.value ( "PremiumDisplay.Free", PremiumDisplay.Free ) )
, ( "Premium Locked", Control.value ( "PremiumDisplay.PremiumLocked", PremiumDisplay.PremiumLocked ) )
, ( "Premium Unlocked", Control.value ( "PremiumDisplay.PremiumUnlocked", PremiumDisplay.PremiumUnlocked ) )
]
httpError : Control Http.Error
httpError =
Control.choice
[ ( "Bad Url", Control.value (Http.BadUrl "/request-url") )
, ( "Timeout", Control.value Http.Timeout )
, ( "Network Error", Control.value Http.NetworkError )
, ( "Bad Status: 401", Control.value (Http.BadStatus 401) )
, ( "Bad Status: 404", Control.value (Http.BadStatus 404) )
, ( "Bad Status: ???", Control.value (Http.BadStatus 500) )
, ( "Bad Body (often, a JSON decoding problem)"
, Control.value
(Http.BadBody
"""
The Json.Decode.oneOf at json.draft failed in the following 2 ways:
(1) Problem with the given value:
null
Expecting an OBJECT with a field named `content`
(2) Problem with the given value:
null
Expecting an OBJECT with a field named `code`
"""
)
)
]
2022-03-10 02:07:57 +03:00
content :
{ moduleName : String
, plaintext : String -> attribute
2022-03-18 03:30:50 +03:00
, markdown : Maybe (String -> attribute)
2022-03-10 02:07:57 +03:00
, html : List (Html msg) -> attribute
2022-03-10 02:59:41 +03:00
, httpError : Maybe (Http.Error -> attribute)
2022-03-10 02:07:57 +03:00
}
-> Control ( String, attribute )
content ({ moduleName } as config) =
Control.choice
2022-03-10 02:59:41 +03:00
([ ( "plain text (short)"
, Control.string quickBrownFox
2022-03-10 02:07:57 +03:00
|> Control.map
(\str ->
( moduleName ++ ".plaintext \"" ++ str ++ "\""
, config.plaintext str
)
)
2022-03-10 02:59:41 +03:00
)
, ( "plain text (long, no newlines)"
, Control.string longPangrams
2022-03-10 02:07:57 +03:00
|> Control.map
(\str ->
( moduleName ++ ".plaintext \"" ++ str ++ "\""
, config.plaintext str
)
)
2022-03-10 02:59:41 +03:00
)
, ( "plain text (long, with newlines)"
, Control.stringTextarea romeoAndJulietQuotation
2022-03-10 02:07:57 +03:00
|> Control.map
(\str ->
( moduleName ++ ".plaintext\n\t\t\"\"\"" ++ str ++ "\t\t\"\"\""
, config.plaintext str
)
)
2022-03-10 02:59:41 +03:00
)
]
2022-03-18 03:30:50 +03:00
++ (case config.markdown of
Just markdown_ ->
[ ( "markdown"
, Control.string markdown
|> Control.map
(\str ->
( moduleName ++ ".markdown \"" ++ str ++ "\""
, markdown_ str
)
)
)
]
Nothing ->
[]
)
++ ( "HTML"
, Control.value
( moduleName ++ ".html [ ... ]"
, config.html exampleHtml
)
)
:: (case config.httpError of
2022-03-10 02:59:41 +03:00
Just httpError_ ->
[ ( "httpError"
, Control.map
(\error ->
( moduleName ++ ".httpError error"
, httpError_ error
)
)
httpError
)
]
Nothing ->
[]
)
)
2022-03-10 02:07:57 +03:00
quickBrownFox : String
quickBrownFox =
"The quick brown fox jumps over the lazy dog."
2022-03-10 02:01:06 +03:00
longPangrams : String
longPangrams =
"Waltz, bad nymph, for quick jigs vex. Glib jocks quiz nymph to vex dwarf. Sphinx of black quartz, judge my vow. How vexingly quick daft zebras jump!"
romeoAndJulietQuotation : String
romeoAndJulietQuotation =
"""
Two households, both alike in dignity,
In fair Verona, where we lay our scene,
From ancient grudge break to new mutiny,
Where civil blood makes civil hands unclean.
From forth the fatal loins of these two foes
A pair of star-crossd lovers take their life;
Whose misadventured piteous overthrows
Do with their death bury their parents strife.
The fearful passage of their death-markd love,
And the continuance of their parents rage,
Which, but their childrens end, nought could remove,
Is now the two hours traffic of our stage;
The which if you with patient ears attend,
What here shall miss, our toil shall strive to mend.
"""
2022-03-10 02:01:06 +03:00
markdown : String
markdown =
"_Katie's dad suggests:_ Don't tip too much, or your waitress will **fall over**!"
exampleHtml : List (Html msg)
exampleHtml =
[ Html.text "This is a "
, Html.strong [] [ Html.text "bolded phrase" ]
, Html.text ". "
2022-03-10 02:26:42 +03:00
, ClickableText.link quickBrownFox
[ ClickableText.small
, ClickableText.icon UiIcon.starFilled
, ClickableText.href "http://www.noredink.com"
]
, Html.text " When I stepped out, into the bright sunlight from the darkness of the movie house, I had only two things on my mind: Paul Newman, and a ride home."
]
icon :
String
-> (Svg -> value)
-> Control (List ( String, value ))
-> Control (List ( String, value ))
icon moduleName f =
ControlExtra.optionalListItemDefaultChecked "icon"
(Control.map
(\( iconName, iconValue ) ->
( moduleName ++ ".icon " ++ iconName, f iconValue )
)
uiIcon
)
2022-03-10 02:01:06 +03:00
iconNotCheckedByDefault :
String
-> (Svg -> value)
-> Control (List ( String, value ))
-> Control (List ( String, value ))
iconNotCheckedByDefault moduleName f =
ControlExtra.optionalListItem "icon"
(Control.map
(\( iconName, iconValue ) ->
( moduleName ++ ".icon " ++ iconName, f iconValue )
)
uiIcon
)
uiIcon : Control ( String, Svg )
uiIcon =
[ ( "arrowLeft", UiIcon.arrowLeft )
, ( "unarchive", UiIcon.unarchive )
, ( "share", UiIcon.share )
, ( "preview", UiIcon.preview )
, ( "skip", UiIcon.skip )
, ( "copyToClipboard", UiIcon.copyToClipboard )
, ( "gift", UiIcon.gift )
, ( "home", UiIcon.home )
, ( "library", UiIcon.library )
, ( "searchInCicle", UiIcon.searchInCicle )
]
2022-03-05 04:04:56 +03:00
|> choice "UiIcon"
choice : String -> List ( String, value ) -> Control ( String, value )
choice moduleName options =
options
|> List.map
(\( name, value ) ->
2022-03-05 04:04:56 +03:00
( name, Control.value ( moduleName ++ "." ++ name, value ) )
)
|> Control.choice
2022-03-05 00:51:31 +03:00
disabledListItem : String -> (Bool -> b) -> Control (List ( String, b )) -> Control (List ( String, b ))
disabledListItem moduleName disabled =
2022-03-05 00:51:31 +03:00
ControlExtra.optionalBoolListItem "disabled"
( moduleName ++ ".disabled True"
, disabled True
2022-03-05 00:51:31 +03:00
)
css :
{ moduleName : String, use : List Css.Style -> b }
-> Control (List ( String, b ))
-> Control (List ( String, b ))
css =
css_ "css"
( "[ Css.border3 (Css.px 4) Css.dashed Colors.red ]"
, [ Css.border3 (Css.px 4) Css.dashed Colors.red ]
)
mobileCss :
{ moduleName : String, use : List Css.Style -> b }
-> Control (List ( String, b ))
-> Control (List ( String, b ))
mobileCss =
css_ "mobileCss"
( "[ Css.border3 (Css.px 4) Css.dotted Colors.orange ]"
, [ Css.border3 (Css.px 4) Css.dotted Colors.orange ]
)
quizEngineMobileCss :
{ moduleName : String, use : List Css.Style -> b }
-> Control (List ( String, b ))
-> Control (List ( String, b ))
quizEngineMobileCss =
css_ "quizEngineMobileCss"
( "[ Css.border3 (Css.px 4) Css.solid Colors.aqua |> Css.important ]"
, [ Css.border3 (Css.px 4) Css.solid Colors.aqua |> Css.important ]
)
notMobileCss :
{ moduleName : String, use : List Css.Style -> b }
-> Control (List ( String, b ))
-> Control (List ( String, b ))
notMobileCss =
css_ "notMobileCss"
( "[ Css.backgroundColor Colors.purple ]"
, [ Css.backgroundColor Colors.purple ]
)
css_ :
String
-> ( String, List Css.Style )
->
{ moduleName : String
, use : List Css.Style -> b
}
-> Control (List ( String, b ))
-> Control (List ( String, b ))
css_ helperName ( styles, default ) { moduleName, use } =
ControlExtra.optionalListItem helperName
(Control.value
( moduleName ++ "." ++ helperName ++ " " ++ styles
, use default
)
)