module Reflex.Dom.Contrib.Widgets.CheckboxList where
import Control.Monad
import Data.Set (Set)
import qualified Data.Set as S
import Reflex
import Reflex.Dom
import Reflex.Dom.Contrib.Widgets.Common
checkboxList
:: forall t m a. (MonadWidget t m, Ord a, Show a)
=> (a -> String)
-> (String -> a -> Bool)
-> Event t Bool
-> Dynamic t String
-> Set a
-> [a]
-> m (HtmlWidget t [a])
checkboxList showFunc filterFunc blanketEvent searchString onItems items = do
el "ul" $ do
es <- forM items $ \item -> do
let shown = showFunc item
mkAttrs search =
if filterFunc search item
then mempty
else "style" =: "display:none"
attrs <- liftM nubDyn $ mapDyn mkAttrs searchString
elDynAttr "li" attrs $ el "label" $ do
cb <- htmlCheckbox $ WidgetConfig
(leftmost [blanketEvent])
(S.member item onItems)
(constDyn mempty)
text shown
mapWidget (\b -> if b then [item] else []) cb
wconcat es
checkboxListView
:: forall t m a b. (MonadWidget t m, Ord a, Show a)
=> (a -> String)
-> (String -> a -> Bool)
-> (a -> Bool -> b)
-> Event t Bool
-> Dynamic t String
-> Set a
-> [a]
-> m (Event t b)
checkboxListView showFunc filterFunc updateFunc blanketEvent searchString
onItems items = do
el "ul" $ do
es <- forM items $ \item -> do
let shown = showFunc item
mkAttrs search =
if filterFunc search item
then mempty
else "style" =: "display:none"
attrs <- liftM nubDyn $ mapDyn mkAttrs searchString
elDynAttr "li" attrs $ el "label" $ do
cb <- htmlCheckbox $ WidgetConfig
(leftmost [blanketEvent])
(S.member item onItems)
(constDyn mempty)
text shown
return $ updateFunc item <$> _hwidget_change cb
return $ leftmost es