bulmex-1.0.0: src/Reflex/Bulmex/PreventDefault.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- | ripped from https://gist.github.com/3noch/134b1ee7fa48c347be9d164c3fac4ef7
module Reflex.Bulmex.PreventDefault where
import Control.Lens ((%~), (.~))
import Data.Map (Map)
import Data.Proxy (Proxy (..))
import Data.Text (Text)
import Reflex.Dom.Core
-- | Like 'elDynAttr'' but configures "prevent default" on the given event.
elDynAttrPrevDef ::
forall a en m t. (DomBuilder t m, PostBuild t m)
=> EventName en -- ^ Event on the element to configure with 'preventDefault'
-> Text -- ^ Element tag
-> Dynamic t (Map Text Text) -- ^ Element attributes
-> m a -- ^ Child of element
-> m (Element EventResult (DomBuilderSpace m) t, a) -- An element and the result of the child
elDynAttrPrevDef ev =
elDynAttrModConf
(\elCfg ->
elCfg &
elementConfig_eventSpec %~
addEventSpecFlags
(Proxy :: Proxy (DomBuilderSpace m))
ev
(const preventDefault))
-- | Like 'elDynAttr'' but allows you to modify the element configuration.
--
-- Special thanks to @luigy: https://gist.github.com/luigy/b49ce04de8462e594c9c2b5b455ae5a5#file-foo-hs
elDynAttrModConf ::
(DomBuilder t m, PostBuild t m)
=> (ElementConfig EventResult t (DomBuilderSpace m) -> ElementConfig EventResult t (DomBuilderSpace m))
-> Text
-> Dynamic t (Map Text Text)
-> m a
-> m (Element EventResult (DomBuilderSpace m) t, a)
elDynAttrModConf f elementTag attrs child = do
modifyAttrs <- dynamicAttributesToModifyAttributes attrs
let cfg =
def & modifyAttributes .~ fmapCheap mapKeysToAttributeName modifyAttrs
result <- element elementTag (f cfg) child
postBuild <- getPostBuild
notReadyUntil postBuild
pure result