on develop help sign in
Add access to files for inputElement.
4c028dcLuigy Leon
src/Reflex/Dom/Builder/Class.hs+2
@@ -46,6 +46,7 @@ import Data.Text (Text)
46import Data.Traversable
46import Data.Traversable
47import Data.Type.Coercion
47import Data.Type.Coercion
48import GHC.Exts (Constraint)
48import GHC.Exts (Constraint)
49+import GHCJS.DOM.File (File)
49
50
50class Default (EventSpec d EventResult) => DomSpace d where
51class Default (EventSpec d EventResult) => DomSpace d where
51 type EventSpec d :: (EventTag -> *) -> *
52 type EventSpec d :: (EventTag -> *) -> *
@@ -261,6 +262,7 @@ data InputElement er d t
261 , _inputElement_hasFocus :: Dynamic t Bool
262 , _inputElement_hasFocus :: Dynamic t Bool
262 , _inputElement_element :: Element er d t
263 , _inputElement_element :: Element er d t
263 , _inputElement_raw :: RawInputElement d
264 , _inputElement_raw :: RawInputElement d
265+ , _inputElement_files :: Event t [File]
264 }
266 }
265
267
266data TextAreaElementConfig er t m
268data TextAreaElementConfig er t m
src/Reflex/Dom/Builder/Immediate.hs+8
@@ -46,6 +46,7 @@ import qualified GHCJS.DOM.Element as Element
46import qualified GHCJS.DOM.Event as Event
46import qualified GHCJS.DOM.Event as Event
47import GHCJS.DOM.EventM (EventM, event, on)
47import GHCJS.DOM.EventM (EventM, event, on)
48import qualified GHCJS.DOM.EventM as DOM
48import qualified GHCJS.DOM.EventM as DOM
49+import qualified GHCJS.DOM.FileList as File
49import qualified GHCJS.DOM.HTMLInputElement as Input
50import qualified GHCJS.DOM.HTMLInputElement as Input
50import qualified GHCJS.DOM.HTMLSelectElement as Select
51import qualified GHCJS.DOM.HTMLSelectElement as Select
51import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
52import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
@@ -288,6 +289,12 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
288 [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
289 [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
289 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
290 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
290 ]
291 ]
292+ files <- wrapDomEvent domInputElement (`on` Element.change) $ do
293+ -- TODO emit files only for `file` input type
294+ -- ghcjs-dom > 0.3 exposes Input.getType
295+ mfiles <- Input.getFiles domInputElement
296+ let getMyFiles xs = fmap catMaybes . mapM (File.item xs) . flip take [0..] . fromIntegral =<< File.getLength xs
297+ maybe (return []) getMyFiles mfiles
291 return $ InputElement
298 return $ InputElement
292 { _inputElement_value = v
299 { _inputElement_value = v
293 , _inputElement_checked = uniqDyn c
300 , _inputElement_checked = uniqDyn c
@@ -296,6 +303,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
296 , _inputElement_hasFocus = hasFocus
303 , _inputElement_hasFocus = hasFocus
297 , _inputElement_element = e
304 , _inputElement_element = e
298 , _inputElement_raw = domInputElement
305 , _inputElement_raw = domInputElement
306+ , _inputElement_files = files
299 }
307 }
300 {-# INLINABLE textAreaElement #-}
308 {-# INLINABLE textAreaElement #-}
301 textAreaElement cfg = do --TODO
309 textAreaElement cfg = do --TODO
src/Reflex/Dom/Builder/Static.hs+1
@@ -176,6 +176,7 @@ instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) wh
176 , _inputElement_hasFocus = hasFocus
176 , _inputElement_hasFocus = hasFocus
177 , _inputElement_element = e
177 , _inputElement_element = e
178 , _inputElement_raw = ()
178 , _inputElement_raw = ()
179+ , _inputElement_files = never
179 }
180 }
180 {-# INLINABLE textAreaElement #-}
181 {-# INLINABLE textAreaElement #-}
181 textAreaElement cfg = do
182 textAreaElement cfg = do