{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -F -pgmFtrhsx #-}
module Text.Digestive.HSP.Html4 where
import Control.Applicative ((<$>))
import Data.Maybe (fromMaybe)
import Data.Monoid (Monoid(mempty), mconcat)
import Data.Text (Text)
import qualified Data.Text as Text
import HSP (XMLGenerator, XMLGenT, EmbedAsChild(..), EmbedAsAttr(..), Attr(..), genElement, genEElement, set)
import qualified HSX.XMLGenerator as HSX
import Text.Digestive -- (Form, mapViews)
import Text.Digestive.Common as Common -- (Form, mapViews)
import Text.Digestive.Forms as Forms -- (inputString, inputRead, inputBool, inputChoice)
showFormId :: FormId -> String
showFormId id' = show id'
inputString :: (Monad m, Functor m, XMLGenerator x, FormInput i f)
=> Maybe String
-> Form m i e [XMLGenT x (HSX.XML x)] String
inputString =
Forms.inputString $ \id' inp ->
[]
-- FIMXE: we really need a inputText primitive on Common. or maybe inputByteString?
inputText :: (Monad m, Functor m, XMLGenerator x, FormInput i f)
=> Maybe Text
-> Form m i e [XMLGenT x (HSX.XML x)] Text
inputText v =
Text.pack <$>
((Forms.inputString $ \id' inp ->
[]) (Text.unpack <$> v))
inputTextArea :: (Monad m, Functor m, XMLGenerator x, FormInput i f) =>
Maybe Int
-> Maybe Int
-> Maybe String
-> Form m i e [XMLGenT x (HSX.XML x)] String
inputTextArea r c =
Forms.inputString $ \id' inp ->
[]
where
rows Nothing = []
rows (Just n) = [("rows" := n)]
cols Nothing = []
cols (Just n) = [("cols" := n)]
inputTextRead :: (Monad m, Functor m, Show a, Read a, XMLGenerator x, FormInput i f)
=> String
-> Maybe a
-> Form m i String [XMLGenT x (HSX.XML x)] a
inputTextRead error' =
flip inputRead error' $ \id' inp ->
[]
inputPassword :: (Monad m, Functor m, XMLGenerator x, FormInput i f)
=> Form m i e [XMLGenT x (HSX.XML x)] String
inputPassword =
flip Forms.inputString Nothing $ \id' inp ->
[]
inputCheckBox :: (Monad m, Functor m, XMLGenerator x, FormInput i f)
=> Bool
-> Form m i e [XMLGenT x (HSX.XML x)] Bool
inputCheckBox inp =
flip inputBool inp $ \id' inp ->
[]
where
checked =
if inp
then [("checked" := "checked")]
else []
inputRadio :: (Monad m, Functor m, Eq a, XMLGenerator x, EmbedAsChild x c, Monoid c, FormInput i f)
=> Bool -- ^ Use @
@ tags
-> a -- ^ Default option
-> [(a, c)] -- ^ Choices with their names
-> Form m i e [XMLGenT x (HSX.XML x)] a -- ^ Resulting form
inputRadio br def choices =
inputChoice toView def (map fst choices)
where
toView group' id' sel val =
[
,
] ++ if br then [
] else []
submit :: (Monad m, Functor m, XMLGenerator x, FormInput i f)
=> String
-> Form m i e [XMLGenT x (HSX.XML x)] String
submit v =
Forms.inputString (\id' inp ->
[]) (Just v)
label :: (Monad m, XMLGenerator x, EmbedAsChild x c, EmbedAsAttr x (Attr String String))
=> c
-> Form m i e [XMLGenT x (HSX.XML x)] ()
label string =
Common.label $ \id' ->
[]
errorList :: (XMLGenerator x, EmbedAsChild x c, EmbedAsChild x [HSX.XML x]) => [c] -> [XMLGenT x (HSX.XML x)]
errorList [] = []
errorList children =
[