@@ -20,6 +20,14 @@ import Data.Semigroup
2020import Control.Monad.Fix
2121import Control.Monad.IO.Class
2222
23+-- For fileInput
24+import GHCJS.DOM.EventM (on)
25+import GHCJS.DOM.Types (File)
26+import qualified GHCJS.DOM.Element as Element
27+import qualified GHCJS.DOM.File as File
28+import qualified GHCJS.DOM.FileList as FileList
29+
30+
2331import Reflex
2432import qualified Data.Map as Map
2533import Control.Lens hiding (ix, element)
@@ -300,11 +308,9 @@ checkboxView dAttrs dValue = do
300308 performEvent_ $ fmap (\v -> Input.setChecked e $! v) $ updated dValue
301309 return eClicked
302310-}
303−{-
304311
305312data FileInput t
306313 = FileInput { _fileInput_value :: Dynamic t [File]
307− , _fileInput_element :: HTMLInputElement
308314 }
309315
310316data FileInputConfig t
@@ -315,16 +321,27 @@ instance Reflex t => Default (FileInputConfig t) where
315321 def = FileInputConfig { _fileInputConfig_attributes = constDyn mempty
316322 }
317323
318−fileInput :: DomBuilder t m => FileInputConfig t -> m (FileInput t)
319−fileInput (FileInputConfig dAttrs) = do
320− e <- liftM castToHTMLInputElement $ buildEmptyElement "input" =<< mapDyn (Map.insert "type" "file") dAttrs
321− eChange <- wrapDomEvent e (flip on change) $ do
322− Just files <- getFiles e
323− len <- FileList.getLength files
324− mapM (liftM (fromMaybe (error "fileInput: fileListItem returned null")) . FileList.item files) $ init [0..len]
324+fileInput :: forall t m. (MonadIO m, MonadFix m, MonadHold t m, TriggerEvent t m, DomBuilder t m, PostBuild t m, DomBuilderSpace m ~ GhcjsDomSpace)
325+ => FileInputConfig t -> m (FileInput t)
326+fileInput config = do
327+ let insertType = Map.insert "type" "file"
328+ dAttrs = fmap insertType $ _fileInputConfig_attributes config
329+ modifyAttrs <- dynamicAttributesToModifyAttributes dAttrs
330+ let cfg = (def :: ElementConfig EventResult t m)
331+ { _elementConfig_modifyAttributes = modifyAttrs
332+ , _elementConfig_eventFilters = DMap.singleton Change . EventFilter . GhcjsDomHandler $ \(GhcjsDomEvent evt) -> do
333+ return . (,) mempty . GhcjsDomHandler $ \_ -> return . Just $ EventResult ()
334+ }
335+ (eRaw, _) <- element "input" cfg blank
336+ let e = castToHTMLInputElement (_element_raw eRaw)
337+ eChange <- wrapDomEvent e (`on` Element.change) $ do
338+ Just files <- Input.getFiles e
339+ len <- FileList.getLength files
340+ mapM (liftM (fromMaybe (error "fileInput: fileList.item returned null")) . FileList.item files) $ [0 .. len-1]
325341 dValue <- holdDyn [] eChange
326− return $ FileInput dValue e
327−-}
342+ return $ FileInput
343+ { _fileInput_value = dValue
344+ }
328345
329346data Dropdown t k
330347 = Dropdown { _dropdown_value :: Dynamic t k
@@ -505,11 +522,9 @@ instance HasValue (TextInput t) where
505522 type Value (TextInput t) = Dynamic t Text
506523 value = _textInput_value
507524
508−{-
509525instance HasValue (FileInput t) where
510526 type Value (FileInput t) = Dynamic t [File]
511527 value = _fileInput_value
512−-}
513528
514529instance HasValue (Dropdown t k) where
515530 type Value (Dropdown t k) = Dynamic t k