diff --git a/reflex-dom-core/reflex-dom-core.cabal b/reflex-dom-core/reflex-dom-core.cabal index 091d0519..37834386 100644 --- a/reflex-dom-core/reflex-dom-core.cabal +++ b/reflex-dom-core/reflex-dom-core.cabal @@ -56,7 +56,7 @@ library dependent-sum-template >= 0.0.0.4 && < 0.1, directory >= 1.2 && < 1.4, exception-transformers == 0.4.*, - ghcjs-dom >= 0.9.1.0 && < 0.10, + ghcjs-dom >= 0.9.4.0 && < 0.10, jsaddle >=0.9.0.0 && <0.10, -- keycode-0.2 has a bug on firefox keycode >= 0.2.1 && < 0.3, diff --git a/reflex-dom-core/src/Reflex/Dom/Builder/Class.hs b/reflex-dom-core/src/Reflex/Dom/Builder/Class.hs index a860a479..fe274cd7 100644 --- a/reflex-dom-core/src/Reflex/Dom/Builder/Class.hs +++ b/reflex-dom-core/src/Reflex/Dom/Builder/Class.hs @@ -59,6 +59,7 @@ import Data.String import Data.Text (Text) import Data.Type.Coercion import GHCJS.DOM.Types (JSM) +import GHCJS.DOM.Debug (DomHasCallStack) class Default (EventSpec d EventResult) => DomSpace d where type EventSpec d :: (EventTag -> *) -> * @@ -74,68 +75,75 @@ class Default (EventSpec d EventResult) => DomSpace d where -- dynamic DOM in the 'Reflex' timeline @t@ class (Monad m, Reflex t, DomSpace (DomBuilderSpace m), NotReady t m, Adjustable t m) => DomBuilder t m | m -> t where type DomBuilderSpace m :: * - textNode :: TextNodeConfig t -> m (TextNode (DomBuilderSpace m) t) + textNode :: DomHasCallStack => TextNodeConfig t -> m (TextNode (DomBuilderSpace m) t) default textNode :: ( MonadTrans f , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => TextNodeConfig t -> m (TextNode (DomBuilderSpace m) t) textNode = lift . textNode {-# INLINABLE textNode #-} - element :: Text -> ElementConfig er t (DomBuilderSpace m) -> m a -> m (Element er (DomBuilderSpace m) t, a) + element :: DomHasCallStack => Text -> ElementConfig er t (DomBuilderSpace m) -> m a -> m (Element er (DomBuilderSpace m) t, a) default element :: ( MonadTransControl f , StT f a ~ a , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => Text -> ElementConfig er t (DomBuilderSpace m) -> m a -> m (Element er (DomBuilderSpace m) t, a) element t cfg child = liftWith $ \run -> element t cfg $ run child {-# INLINABLE element #-} - inputElement :: InputElementConfig er t (DomBuilderSpace m) -> m (InputElement er (DomBuilderSpace m) t) + inputElement :: DomHasCallStack => InputElementConfig er t (DomBuilderSpace m) -> m (InputElement er (DomBuilderSpace m) t) default inputElement :: ( MonadTransControl f , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => InputElementConfig er t (DomBuilderSpace m) -> m (InputElement er (DomBuilderSpace m) t) inputElement = lift . inputElement {-# INLINABLE inputElement #-} - textAreaElement :: TextAreaElementConfig er t (DomBuilderSpace m) -> m (TextAreaElement er (DomBuilderSpace m) t) + textAreaElement :: DomHasCallStack => TextAreaElementConfig er t (DomBuilderSpace m) -> m (TextAreaElement er (DomBuilderSpace m) t) default textAreaElement :: ( MonadTransControl f , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => TextAreaElementConfig er t (DomBuilderSpace m) -> m (TextAreaElement er (DomBuilderSpace m) t) textAreaElement = lift . textAreaElement {-# INLINABLE textAreaElement #-} - selectElement :: SelectElementConfig er t (DomBuilderSpace m) -> m a -> m (SelectElement er (DomBuilderSpace m) t, a) + selectElement :: DomHasCallStack => SelectElementConfig er t (DomBuilderSpace m) -> m a -> m (SelectElement er (DomBuilderSpace m) t, a) default selectElement :: ( MonadTransControl f , StT f a ~ a , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => SelectElementConfig er t (DomBuilderSpace m) -> m a -> m (SelectElement er (DomBuilderSpace m) t, a) selectElement cfg child = do liftWith $ \run -> selectElement cfg $ run child {-# INLINABLE selectElement #-} - placeRawElement :: RawElement (DomBuilderSpace m) -> m () + placeRawElement :: DomHasCallStack => RawElement (DomBuilderSpace m) -> m () default placeRawElement :: ( MonadTrans f , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => RawElement (DomBuilderSpace m) -> m () placeRawElement = lift . placeRawElement {-# INLINABLE placeRawElement #-} - wrapRawElement :: RawElement (DomBuilderSpace m) -> RawElementConfig er t (DomBuilderSpace m) -> m (Element er (DomBuilderSpace m) t) + wrapRawElement :: DomHasCallStack => RawElement (DomBuilderSpace m) -> RawElementConfig er t (DomBuilderSpace m) -> m (Element er (DomBuilderSpace m) t) default wrapRawElement :: ( MonadTrans f , m ~ f m' , DomBuilderSpace m' ~ DomBuilderSpace m , DomBuilder t m' + , DomHasCallStack ) => RawElement (DomBuilderSpace m) -> RawElementConfig er t (DomBuilderSpace m) -> m (Element er (DomBuilderSpace m) t) wrapRawElement e cfg = lift $ wrapRawElement e $ cfg @@ -145,8 +153,8 @@ class (Monad m, Reflex t, DomSpace (DomBuilderSpace m), NotReady t m, Adjustable class DomBuilder t m => MountableDomBuilder t m where type DomFragment m :: * - buildDomFragment :: m a -> m (DomFragment m, a) - mountDomFragment :: DomFragment m -> Event t (DomFragment m) -> m () + buildDomFragment :: DomHasCallStack => m a -> m (DomFragment m, a) + mountDomFragment :: DomHasCallStack => DomFragment m -> Event t (DomFragment m) -> m () type Namespace = Text diff --git a/reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs b/reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs index b0a806ee..931a5b10 100644 --- a/reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs +++ b/reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs @@ -135,6 +135,7 @@ import qualified Data.Some as Some import Data.Text (Text) import qualified Data.Text as T import qualified GHCJS.DOM as DOM +import GHCJS.DOM.Debug (DomHasCallStack) import GHCJS.DOM.RequestAnimationFrameCallback import GHCJS.DOM.Document (Document, createDocumentFragment, createElement, createElementNS, createTextNode) import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS) @@ -377,7 +378,7 @@ wrap e cfg = do } {-# INLINABLE makeElement #-} -makeElement :: forall er t m a. (MonadJSM m, MonadFix m, MonadReflexCreateTrigger t m, Adjustable t m) => Text -> ElementConfig er t GhcjsDomSpace -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.Element) +makeElement :: forall er t m a. (MonadJSM m, MonadFix m, MonadReflexCreateTrigger t m, Adjustable t m, DomHasCallStack) => Text -> ElementConfig er t GhcjsDomSpace -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.Element) makeElement elementTag cfg child = do doc <- askDocument e <- liftJSM $ uncheckedCastTo DOM.Element <$> case cfg ^. namespace of diff --git a/reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs b/reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs index 8b26918c..b976b836 100644 --- a/reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs +++ b/reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs @@ -68,6 +68,7 @@ import Reflex.Network import Reflex.NotReady.Class import Reflex.PostBuild.Class import Reflex.Workflow +import GHCJS.DOM.Debug (DomHasCallStack) import Control.Arrow import Control.Lens hiding (children, element) @@ -108,11 +109,11 @@ partitionMapBySetLT s m0 = Map.fromDistinctAscList $ go (Set.toAscList s) m0 newtype ChildResult t k a = ChildResult { unChildResult :: (a, Event t (Map k (Maybe (ChildResult t k a)))) } -text :: DomBuilder t m => Text -> m () +text :: (DomBuilder t m, DomHasCallStack) => Text -> m () text t = void $ textNode $ def & textNodeConfig_initialContents .~ t {-# INLINABLE dynText #-} -dynText :: forall t m. (PostBuild t m, DomBuilder t m) => Dynamic t Text -> m () +dynText :: forall t m. (PostBuild t m, DomBuilder t m, DomHasCallStack) => Dynamic t Text -> m () dynText t = do postBuild <- getPostBuild void $ textNode $ (def :: TextNodeConfig t) & textNodeConfig_setContents .~ leftmost @@ -121,10 +122,10 @@ dynText t = do ] notReadyUntil postBuild -display :: (PostBuild t m, DomBuilder t m, Show a) => Dynamic t a -> m () +display :: (PostBuild t m, DomBuilder t m, Show a, DomHasCallStack) => Dynamic t a -> m () display = dynText . fmap (T.pack . show) -button :: DomBuilder t m => Text -> m (Event t ()) +button :: (DomBuilder t m, DomHasCallStack) => Text -> m (Event t ()) button t = do (e, _) <- element "button" def $ text t return $ domEvent Click e @@ -154,67 +155,67 @@ widgetHold_ z = void . widgetHold z -- > el "div" (text "Hello World") -- <div>Hello World</div> {-# INLINABLE el #-} -el :: forall t m a. DomBuilder t m => Text -> m a -> m a +el :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> m a -> m a el elementTag child = snd <$> el' elementTag child -- | Create a DOM element with attributes -- > elAttr "a" ("href" =: "http://google.com") (text "Google!") -- <a href="http://google.com">Google!</a> {-# INLINABLE elAttr #-} -elAttr :: forall t m a. DomBuilder t m => Text -> Map Text Text -> m a -> m a +elAttr :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> Map Text Text -> m a -> m a elAttr elementTag attrs child = snd <$> elAttr' elementTag attrs child -- | Create a DOM element with classes -- > elClass "div" "row" (return ()) -- <div class="row"></div> {-# INLINABLE elClass #-} -elClass :: forall t m a. DomBuilder t m => Text -> Text -> m a -> m a +elClass :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> Text -> m a -> m a elClass elementTag c child = snd <$> elClass' elementTag c child -- | Create a DOM element with Dynamic Attributes -- > elClass "div" (constDyn ("class" =: "row")) (return ()) -- <div class="row"></div> {-# INLINABLE elDynAttr #-} -elDynAttr :: forall t m a. (DomBuilder t m, PostBuild t m) => Text -> Dynamic t (Map Text Text) -> m a -> m a +elDynAttr :: forall t m a. (DomBuilder t m, PostBuild t m, DomHasCallStack) => Text -> Dynamic t (Map Text Text) -> m a -> m a elDynAttr elementTag attrs child = snd <$> elDynAttr' elementTag attrs child -- | Create a DOM element with a Dynamic Class -- > elDynClass "div" (constDyn "row") (return ()) -- <div class="row"></div> {-# INLINABLE elDynClass #-} -elDynClass :: forall t m a. (DomBuilder t m, PostBuild t m) => Text -> Dynamic t Text -> m a -> m a +elDynClass :: forall t m a. (DomBuilder t m, PostBuild t m, DomHasCallStack) => Text -> Dynamic t Text -> m a -> m a elDynClass elementTag c child = snd <$> elDynClass' elementTag c child -- | Create a DOM element and return the element -- > do (e, _) <- el' "div" (text "Click") -- > return $ domEvent Click e {-# INLINABLE el' #-} -el' :: forall t m a. DomBuilder t m => Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) +el' :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) el' elementTag = element elementTag def -- | Create a DOM element with attributes and return the element {-# INLINABLE elAttr' #-} -elAttr' :: forall t m a. DomBuilder t m => Text -> Map Text Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) +elAttr' :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> Map Text Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) elAttr' elementTag attrs = element elementTag $ def & initialAttributes .~ Map.mapKeys (AttributeName Nothing) attrs -- | Create a DOM element with a class and return the element {-# INLINABLE elClass' #-} -elClass' :: forall t m a. DomBuilder t m => Text -> Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) +elClass' :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) elClass' elementTag c = elAttr' elementTag ("class" =: c) -- | Create a DOM element with Dynamic Attributes and return the element {-# INLINABLE elDynAttr' #-} -elDynAttr' :: forall t m a. (DomBuilder t m, PostBuild t m) => Text -> Dynamic t (Map Text Text) -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) +elDynAttr' :: forall t m a. (DomBuilder t m, PostBuild t m, DomHasCallStack) => Text -> Dynamic t (Map Text Text) -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) elDynAttr' = elDynAttrNS' Nothing -- | Create a DOM element with a Dynamic class and return the element {-# INLINABLE elDynClass' #-} -elDynClass' :: forall t m a. (DomBuilder t m, PostBuild t m) => Text -> Dynamic t Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) +elDynClass' :: forall t m a. (DomBuilder t m, PostBuild t m, DomHasCallStack) => Text -> Dynamic t Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) elDynClass' elementTag c = elDynAttr' elementTag (fmap ("class" =:) c) {-# INLINABLE elDynAttrNS' #-} -elDynAttrNS' :: forall t m a. (DomBuilder t m, PostBuild t m) => Maybe Text -> Text -> Dynamic t (Map Text Text) -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) +elDynAttrNS' :: forall t m a. (DomBuilder t m, PostBuild t m, DomHasCallStack) => Maybe Text -> Text -> Dynamic t (Map Text Text) -> m a -> m (Element EventResult (DomBuilderSpace m) t, a) elDynAttrNS' mns elementTag attrs child = do modifyAttrs <- dynamicAttributesToModifyAttributes attrs let cfg = def @@ -226,7 +227,7 @@ elDynAttrNS' mns elementTag attrs child = do return result {-# INLINABLE elDynAttrNS #-} -elDynAttrNS :: forall t m a. (DomBuilder t m, PostBuild t m) => Maybe Text -> Text -> Dynamic t (Map Text Text) -> m a -> m a +elDynAttrNS :: forall t m a. (DomBuilder t m, PostBuild t m, DomHasCallStack) => Maybe Text -> Text -> Dynamic t (Map Text Text) -> m a -> m a elDynAttrNS mns elementTag attrs child = fmap snd $ elDynAttrNS' mns elementTag attrs child dynamicAttributesToModifyAttributes :: (Ord k, PostBuild t m) => Dynamic t (Map k Text) -> m (Event t (Map k (Maybe Text))) @@ -273,18 +274,18 @@ newtype Link t = Link { _link_clicked :: Event t () } -linkClass :: DomBuilder t m => Text -> Text -> m (Link t) +linkClass :: (DomBuilder t m, DomHasCallStack) => Text -> Text -> m (Link t) linkClass s c = do (l,_) <- elAttr' "a" ("class" =: c) $ text s return $ Link $ domEvent Click l -link :: DomBuilder t m => Text -> m (Link t) +link :: (DomBuilder t m, DomHasCallStack) => Text -> m (Link t) link s = linkClass s "" -divClass :: forall t m a. DomBuilder t m => Text -> m a -> m a +divClass :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> m a -> m a divClass = elClass "div" -dtdd :: forall t m a. DomBuilder t m => Text -> m a -> m a +dtdd :: forall t m a. (DomBuilder t m, DomHasCallStack) => Text -> m a -> m a dtdd h w = do el "dt" $ text h el "dd" w @@ -293,7 +294,7 @@ blank :: forall m. Monad m => m () blank = return () -- | A widget to display a table with static columns and dynamic rows. -tableDynAttr :: forall t m r k v. (Ord k, DomBuilder t m, MonadHold t m, PostBuild t m, MonadFix m) +tableDynAttr :: forall t m r k v. (Ord k, DomBuilder t m, MonadHold t m, PostBuild t m, MonadFix m, DomHasCallStack) => Text -- ^ Class applied to <table> element -> [(Text, k -> Dynamic t r -> m v)] -- ^ Columns of (header, row key -> row value -> child widget) -> Dynamic t (Map k r) -- ^ Map from row key to row value @@ -311,7 +312,7 @@ tableDynAttr klass cols dRows rowAttrs = elAttr "div" (Map.singleton "style" "zo -- | A widget to construct a tabbed view that shows only one of its child widgets at a time. -- Creates a header bar containing a <ul> with one <li> per child; clicking a <li> displays -- the corresponding child and hides all others. -tabDisplay :: forall t m k. (MonadFix m, DomBuilder t m, MonadHold t m, PostBuild t m, Ord k) +tabDisplay :: forall t m k. (MonadFix m, DomBuilder t m, MonadHold t m, PostBuild t m, Ord k, DomHasCallStack) => Text -- ^ Class applied to <ul> element -> Text -- ^ Class applied to currently active <li> element -> Map k (Text, m ()) -- ^ Map from (arbitrary) key to (tab label, child widget) diff --git a/reflex-dom-core/src/Reflex/Dom/Widget/Input.hs b/reflex-dom-core/src/Reflex/Dom/Widget/Input.hs index aa75dd18..8e528a3c 100644 --- a/reflex-dom-core/src/Reflex/Dom/Widget/Input.hs +++ b/reflex-dom-core/src/Reflex/Dom/Widget/Input.hs @@ -40,6 +40,7 @@ import GHCJS.DOM.HTMLInputElement (HTMLInputElement) import GHCJS.DOM.HTMLTextAreaElement (HTMLTextAreaElement) import GHCJS.DOM.Types (MonadJSM, File, uncheckedCastTo) import qualified GHCJS.DOM.Types as DOM (HTMLElement(..), EventTarget(..)) +import GHCJS.DOM.Debug (DomHasCallStack) import Reflex.Class import Reflex.Collection import Reflex.Dom.Builder.Class @@ -88,7 +89,7 @@ instance Reflex t => Default (TextInputConfig t) where -- | Create an input whose value is a string. By default, the "type" attribute is set to "text", but it can be changed using the _textInputConfig_inputType field. Note that only types for which the value is always a string will work - types whose value may be null will not work properly with this widget. {-# INLINABLE textInput #-} -textInput :: (DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace) => TextInputConfig t -> m (TextInput t) +textInput :: (DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace, DomHasCallStack) => TextInputConfig t -> m (TextInput t) textInput (TextInputConfig inputType initial eSetValue dAttrs) = do modifyAttrs <- dynamicAttributesToModifyAttributes $ fmap (Map.insert "type" inputType) dAttrs i <- inputElement $ def @@ -146,7 +147,7 @@ data RangeInput t -- | Create an input whose value is a float. -- https://www.w3.org/wiki/HTML/Elements/input/range {-# INLINABLE rangeInput #-} -rangeInput :: (DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace) => RangeInputConfig t -> m (RangeInput t) +rangeInput :: (DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace, DomHasCallStack) => RangeInputConfig t -> m (RangeInput t) rangeInput (RangeInputConfig initial eSetValue dAttrs) = do modifyAttrs <- dynamicAttributesToModifyAttributes $ fmap (Map.insert "type" "range") dAttrs i <- inputElement $ def @@ -183,7 +184,7 @@ data TextArea t } {-# INLINABLE textArea #-} -textArea :: (DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace) => TextAreaConfig t -> m (TextArea t) +textArea :: (DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace, DomHasCallStack) => TextAreaConfig t -> m (TextArea t) textArea (TextAreaConfig initial eSet attrs) = do modifyAttrs <- dynamicAttributesToModifyAttributes attrs i <- textAreaElement $ def @@ -217,7 +218,7 @@ data Checkbox t -- | Create an editable checkbox -- Note: if the "type" or "checked" attributes are provided as attributes, they will be ignored {-# INLINABLE checkbox #-} -checkbox :: (DomBuilder t m, PostBuild t m) => Bool -> CheckboxConfig t -> m (Checkbox t) +checkbox :: (DomBuilder t m, PostBuild t m, DomHasCallStack) => Bool -> CheckboxConfig t -> m (Checkbox t) checkbox checked config = do let permanentAttrs = "type" =: "checkbox" dAttrs = Map.delete "checked" . Map.union permanentAttrs <$> _checkboxConfig_attributes config @@ -289,7 +290,7 @@ newtype CheckboxViewEventResult en = CheckboxViewEventResult { unCheckboxViewEve --TODO {-# INLINABLE checkboxView #-} -checkboxView :: forall t m. (DomBuilder t m, DomBuilderSpace m ~ GhcjsDomSpace, PostBuild t m, MonadHold t m) => Dynamic t (Map Text Text) -> Dynamic t Bool -> m (Event t Bool) +checkboxView :: forall t m. (DomBuilder t m, DomBuilderSpace m ~ GhcjsDomSpace, PostBuild t m, MonadHold t m, DomHasCallStack) => Dynamic t (Map Text Text) -> Dynamic t Bool -> m (Event t Bool) checkboxView dAttrs dValue = do let permanentAttrs = "type" =: "checkbox" modifyAttrs <- dynamicAttributesToModifyAttributes $ fmap (Map.union permanentAttrs) dAttrs @@ -334,7 +335,7 @@ instance Reflex t => Default (FileInputConfig t) where def = FileInputConfig { _fileInputConfig_attributes = constDyn mempty } -fileInput :: forall t m. (MonadIO m, MonadJSM m, MonadFix m, MonadHold t m, TriggerEvent t m, DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace) +fileInput :: forall t m. (MonadIO m, MonadJSM m, MonadFix m, MonadHold t m, TriggerEvent t m, DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace, DomHasCallStack) => FileInputConfig t -> m (FileInput (DomBuilderSpace m) t) fileInput config = do let insertType = Map.insert "type" "file" @@ -431,7 +432,7 @@ regularToDropdownViewEventType en r = case en of --TODO: We should allow the user to specify an ordering instead of relying on the ordering of the Map -- | Create a dropdown box -- The first argument gives the initial value of the dropdown; if it is not present in the map of options provided, it will be added with an empty string as its text -dropdown :: forall k t m. (DomBuilder t m, MonadFix m, MonadHold t m, PostBuild t m, Ord k) => k -> Dynamic t (Map k Text) -> DropdownConfig t k -> m (Dropdown t k) +dropdown :: forall k t m. (DomBuilder t m, MonadFix m, MonadHold t m, PostBuild t m, Ord k, DomHasCallStack) => k -> Dynamic t (Map k Text) -> DropdownConfig t k -> m (Dropdown t k) dropdown k0 options (DropdownConfig setK attrs) = do optionsWithAddedKeys <- fmap (zipDynWith Map.union options) $ foldDyn Map.union (k0 =: "") $ fmap (=: "") setK defaultKey <- holdDyn k0 setK