@@ -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)
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
300 {-# INLINABLE textAreaElement #-}
308 {-# INLINABLE textAreaElement #-}
301 textAreaElement cfg = do --TODO
309 textAreaElement cfg = do --TODO