{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
{-# OPTIONS_GHC -Wall #-}

-- | Common web page input elements, often with bootstrap scaffolding.
module Web.Rep.Html.Input
  ( Input (..),
    InputType (..),
  )
where

import Data.Bool
import Data.Maybe
import Data.Text (Text, pack, split)
import GHC.Generics
import Lucid
import Lucid.Base
import Web.Rep.Html

-- | something that might exist on a web page and be a front-end input to computations.
data Input a = Input
  { -- | underlying value
    forall a. Input a -> a
inputVal :: a,
    -- | label suggestion
    forall a. Input a -> Maybe Text
inputLabel :: Maybe Text,
    -- | name//key//id of the Input
    forall a. Input a -> Text
inputId :: Text,
    -- | type of html input
    forall a. Input a -> InputType
inputType :: InputType
  }
  deriving (Input a -> Input a -> Bool
forall a. Eq a => Input a -> Input a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Input a -> Input a -> Bool
$c/= :: forall a. Eq a => Input a -> Input a -> Bool
== :: Input a -> Input a -> Bool
$c== :: forall a. Eq a => Input a -> Input a -> Bool
Eq, Int -> Input a -> ShowS
forall a. Show a => Int -> Input a -> ShowS
forall a. Show a => [Input a] -> ShowS
forall a. Show a => Input a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Input a] -> ShowS
$cshowList :: forall a. Show a => [Input a] -> ShowS
show :: Input a -> String
$cshow :: forall a. Show a => Input a -> String
showsPrec :: Int -> Input a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Input a -> ShowS
Show, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Input a) x -> Input a
forall a x. Input a -> Rep (Input a) x
$cto :: forall a x. Rep (Input a) x -> Input a
$cfrom :: forall a x. Input a -> Rep (Input a) x
Generic)

-- | Various types of web page inputs, encapsulating practical bootstrap class functionality
data InputType
  = Slider [Attribute]
  | SliderV [Attribute]
  | TextBox
  | TextBox'
  | TextArea Int
  | ColorPicker
  | ChooseFile
  | Dropdown [Text]
  | DropdownMultiple [Text] Char
  | DropdownSum [Text]
  | Datalist [Text] Text
  | Checkbox Bool
  | Toggle Bool (Maybe Text)
  | Button
  deriving (InputType -> InputType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InputType -> InputType -> Bool
$c/= :: InputType -> InputType -> Bool
== :: InputType -> InputType -> Bool
$c== :: InputType -> InputType -> Bool
Eq, Int -> InputType -> ShowS
[InputType] -> ShowS
InputType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InputType] -> ShowS
$cshowList :: [InputType] -> ShowS
show :: InputType -> String
$cshow :: InputType -> String
showsPrec :: Int -> InputType -> ShowS
$cshowsPrec :: Int -> InputType -> ShowS
Show, forall x. Rep InputType x -> InputType
forall x. InputType -> Rep InputType x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InputType x -> InputType
$cfrom :: forall x. InputType -> Rep InputType x
Generic)

instance (ToHtml a) => ToHtml (Input a) where
  toHtml :: forall (m :: * -> *). Monad m => Input a -> HtmlT m ()
toHtml (Input a
v Maybe Text
l Text
i (Slider [Attribute]
satts)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            ( [ Text -> Attribute
type_ Text
"range",
                Text -> Attribute
class__ Text
" form-control-range form-control-sm custom-range jsbClassEventChange",
                Text -> Attribute
id_ Text
i,
                Text -> Attribute
value_ (String -> Text
pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v)
              ]
                forall a. Semigroup a => a -> a -> a
<> [Attribute]
satts
            )
      )
  toHtml (Input a
v Maybe Text
l Text
i (SliderV [Attribute]
satts)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            ( [ Text -> Attribute
type_ Text
"range",
                Text -> Attribute
class__ Text
" form-control-range form-control-sm custom-range jsbClassEventChange",
                Text -> Attribute
id_ Text
i,
                Text -> Attribute
value_ (String -> Text
pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v),
                Text -> Attribute
oninput_ (Text
"$('#sliderv" forall a. Semigroup a => a -> a -> a
<> Text
i forall a. Semigroup a => a -> a -> a
<> Text
"').html($(this).val())")
              ]
                forall a. Semigroup a => a -> a -> a
<> [Attribute]
satts
            )
          forall a. Semigroup a => a -> a -> a
<> forall arg result. Term arg result => arg -> result
span_ [Text -> Attribute
id_ (Text
"sliderv" forall a. Semigroup a => a -> a -> a
<> Text
i)] (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v)
      )
  toHtml (Input a
v Maybe Text
l Text
i InputType
TextBox) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            [ Text -> Attribute
type_ Text
"text",
              Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventInput",
              Text -> Attribute
id_ Text
i,
              Text -> Attribute
value_ (String -> Text
pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtmlRaw a
v)
            ]
      )
  toHtml (Input a
v Maybe Text
l Text
i InputType
TextBox') =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            [ Text -> Attribute
type_ Text
"text",
              Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventFocusout",
              Text -> Attribute
id_ Text
i,
              Text -> Attribute
value_ (String -> Text
pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtmlRaw a
v)
            ]
      )
  toHtml (Input a
v Maybe Text
l Text
i (TextArea Int
rows)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall a. With a => a -> [Attribute] -> a
with
            forall arg result. Term arg result => arg -> result
textarea_
            [ Text -> Attribute
rows_ (String -> Text
pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show Int
rows),
              Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventInput",
              Text -> Attribute
id_ Text
i
            ]
            (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtmlRaw a
v)
      )
  toHtml (Input a
v Maybe Text
l Text
i InputType
ColorPicker) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            [ Text -> Attribute
type_ Text
"color",
              Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventInput",
              Text -> Attribute
id_ Text
i,
              Text -> Attribute
value_ (String -> Text
pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v)
            ]
      )
  toHtml (Input a
_ Maybe Text
l Text
i InputType
ChooseFile) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      (forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l)
      forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
        [ Text -> Attribute
type_ Text
"file",
          Text -> Attribute
class__ Text
"form-control-file form-control-sm jsbClassEventChooseFile",
          Text -> Attribute
id_ Text
i
        ]
  toHtml (Input a
v Maybe Text
l Text
i (Dropdown [Text]
opts)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall a. With a => a -> [Attribute] -> a
with
            forall arg result. Term arg result => arg -> result
select_
            [ Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventInput",
              Text -> Attribute
id_ Text
i
            ]
            HtmlT m ()
opts'
      )
    where
      opts' :: HtmlT m ()
opts' =
        forall a. Monoid a => [a] -> a
mconcat forall a b. (a -> b) -> a -> b
$
          ( \Text
o ->
              forall a. With a => a -> [Attribute] -> a
with
                forall arg result. Term arg result => arg -> result
option_
                ( forall a. a -> a -> Bool -> a
bool
                    []
                    [Text -> Attribute
selected_ Text
"selected"]
                    (forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o) forall a. Eq a => a -> a -> Bool
== forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v))
                )
                (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o)
          )
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Text]
opts
  toHtml (Input a
vs Maybe Text
l Text
i (DropdownMultiple [Text]
opts Char
sep)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall a. With a => a -> [Attribute] -> a
with
            forall arg result. Term arg result => arg -> result
select_
            [ Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventChangeMultiple",
              Text -> Attribute
multiple_ Text
"multiple",
              Text -> Attribute
id_ Text
i
            ]
            HtmlT m ()
opts'
      )
    where
      opts' :: HtmlT m ()
opts' =
        forall a. Monoid a => [a] -> a
mconcat forall a b. (a -> b) -> a -> b
$
          ( \Text
o ->
              forall a. With a => a -> [Attribute] -> a
with
                forall arg result. Term arg result => arg -> result
option_
                ( forall a. a -> a -> Bool -> a
bool
                    []
                    [Text -> Attribute
selected_ Text
"selected"]
                    (forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\Text
v -> forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o) forall a. Eq a => a -> a -> Bool
== forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
v)) ((Char -> Bool) -> Text -> [Text]
Data.Text.split (forall a. Eq a => a -> a -> Bool
== Char
sep) (forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
vs))))
                )
                (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o)
          )
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Text]
opts
  toHtml (Input a
v Maybe Text
l Text
i (DropdownSum [Text]
opts)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm sumtype-group"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall a. With a => a -> [Attribute] -> a
with
            forall arg result. Term arg result => arg -> result
select_
            [ Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventInput jsbClassEventShowSum",
              Text -> Attribute
id_ Text
i
            ]
            HtmlT m ()
opts'
      )
    where
      opts' :: HtmlT m ()
opts' =
        forall a. Monoid a => [a] -> a
mconcat forall a b. (a -> b) -> a -> b
$
          ( \Text
o ->
              forall a. With a => a -> [Attribute] -> a
with
                forall arg result. Term arg result => arg -> result
option_
                (forall a. a -> a -> Bool -> a
bool [] [Text -> Attribute
selected_ Text
"selected"] (forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o) forall a. Eq a => a -> a -> Bool
== forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v)))
                (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o)
          )
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Text]
opts
  toHtml (Input a
v Maybe Text
l Text
i (Datalist [Text]
opts Text
listId)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            [ Text -> Attribute
type_ Text
"text",
              Text -> Attribute
class__ Text
"form-control form-control-sm jsbClassEventInput",
              Text -> Attribute
id_ Text
i,
              Text -> Attribute
list_ Text
listId
              -- the datalist concept in html assumes initial state is a null
              -- and doesn't present the list if it has a value alreadyx
              -- , value_ (show $ toHtml v)
            ]
          forall a. Semigroup a => a -> a -> a
<> forall a. With a => a -> [Attribute] -> a
with
            forall arg result. Term arg result => arg -> result
datalist_
            [Text -> Attribute
id_ Text
listId]
            ( forall a. Monoid a => [a] -> a
mconcat forall a b. (a -> b) -> a -> b
$
                ( \Text
o ->
                    forall a. With a => a -> [Attribute] -> a
with
                      forall arg result. Term arg result => arg -> result
option_
                      ( forall a. a -> a -> Bool -> a
bool
                          []
                          [Text -> Attribute
selected_ Text
"selected"]
                          (forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o) forall a. Eq a => a -> a -> Bool
== forall a. Html a -> Text
toText (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml a
v))
                      )
                      (forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
o)
                )
                  forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Text]
opts
            )
      )
  -- FIXME: How can you refactor to eliminate this polymorphic wart?
  toHtml (Input a
_ Maybe Text
l Text
i (Checkbox Bool
checked)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-check form-check-sm"]
      ( forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
          ( [ Text -> Attribute
type_ Text
"checkbox",
              Text -> Attribute
class__ Text
"form-check-input jsbClassEventCheckbox",
              Text -> Attribute
id_ Text
i
            ]
              forall a. Semigroup a => a -> a -> a
<> forall a. a -> a -> Bool -> a
bool [] [Attribute
checked_] Bool
checked
          )
          forall a. Semigroup a => a -> a -> a
<> forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"form-check-label mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
      )
  toHtml (Input a
_ Maybe Text
l Text
i (Toggle Bool
pushed Maybe Text
lab)) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (forall a. With a => a -> [Attribute] -> a
with forall arg result. Term arg result => arg -> result
label_ [Text -> Attribute
for_ Text
i, Text -> Attribute
class__ Text
"mb-0"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml) Maybe Text
l
          forall a. Semigroup a => a -> a -> a
<> forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
            ( [ Text -> Attribute
type_ Text
"button",
                Text -> Attribute
class__ Text
"btn btn-primary btn-sm jsbClassEventToggle",
                Text -> Text -> Attribute
data_ Text
"bs-toggle" Text
"button",
                Text -> Attribute
id_ Text
i,
                Text -> Text -> Attribute
makeAttribute Text
"aria-pressed" (forall a. a -> a -> Bool -> a
bool Text
"false" Text
"true" Bool
pushed)
              ]
                forall a. Semigroup a => a -> a -> a
<> forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Text
l' -> [Text -> Attribute
value_ Text
l']) Maybe Text
lab
                forall a. Semigroup a => a -> a -> a
<> forall a. a -> a -> Bool -> a
bool [] [Attribute
checked_] Bool
pushed
            )
      )
  toHtml (Input a
_ Maybe Text
l Text
i InputType
Button) =
    forall a. With a => a -> [Attribute] -> a
with
      forall arg result. Term arg result => arg -> result
div_
      [Text -> Attribute
class__ Text
"form-group-sm"]
      ( forall (m :: * -> *). Monad m => [Attribute] -> HtmlT m ()
input_
          [ Text -> Attribute
type_ Text
"button",
            Text -> Attribute
id_ Text
i,
            Text -> Attribute
class__ Text
"btn btn-primary btn-sm jsbClassEventButton",
            Text -> Attribute
value_ (forall a. a -> Maybe a -> a
fromMaybe Text
"button" Maybe Text
l)
          ]
      )

  toHtmlRaw :: forall (m :: * -> *). Monad m => Input a -> HtmlT m ()
toHtmlRaw = forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml