on develop help sign in
Implement textarea, fix textarea tests
commitd8ef9fff6586d1f1d3bfece50451d578b9344b50 authorTom Smalley <tfsmalley@gmail.com> dateTue 4 Dec 2018, 17:33 (8 years ago) parent334dddb
2 files changed+55−27
reflex-dom-core/src/Reflex/Dom/Builder/Hydration.hs+47−19 reflex-dom-core/test/hydration.hs+8−8
reflex-dom-core/src/Reflex/Dom/Builder/Hydration.hs+47−19
@@ -653,9 +653,8 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
653653 -- Watch for user interaction and trigger event accordingly
654654 requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Input)
655655
656− case _inputElementConfig_setValue cfg of
657− Nothing -> pure ()
658− Just eSetValue -> requestDomAction_ $ ffor eSetValue $ \v' -> do
656+ for_ (_inputElementConfig_setValue cfg) $ \eSetValue ->
657+ requestDomAction_ $ ffor eSetValue $ \v' -> do
659658 Input.setValue domInputElement v'
660659 v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
661660 liftIO $ triggerChangeBySetValue v
@@ -691,7 +690,7 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
691690 checked <- holdUniqDyn checked'
692691
693692 let initialFocus = False -- Assume it isn't focused, but we update the actual focus state at switchover
694− hasFocus <- holdDyn initialFocus focusChange
693+ hasFocus <- holdUniqDyn =<< holdDyn initialFocus focusChange
695694
696695 v <- holdDyn v0 $ leftmost
697696 [ valueChangedBySetValue
@@ -712,30 +711,59 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
712711 }
713712
714713 {-# INLINABLE textAreaElement #-}
715− textAreaElement cfg = do --TODO
716− ((e, _), _domElement') <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
717− let domElement = undefined :: DOM.HTMLTextAreaElement
718− let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
719− TextArea.setValue domTextAreaElement $ cfg ^. textAreaElementConfig_initialValue
720− v0 <- TextArea.getValue domTextAreaElement
721− let getMyValue = TextArea.getValue domTextAreaElement
722− valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
723− valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
724− Nothing -> return never
725− Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
726− TextArea.setValue domTextAreaElement v'
727− getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
714+ textAreaElement cfg = do
715+ ((e, _), domElementRef) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
716+
717+ (valueChangedByUI, triggerChangeByUI) <- newTriggerEvent
718+ (valueChangedBySetValue, triggerChangeBySetValue) <- newTriggerEvent
719+
720+ (focusChange, triggerFocusChange) <- newTriggerEvent
721+
722+ doc <- askDocument
723+
724+ -- Expected initial value from config
725+ let v0 = _textAreaElementConfig_initialValue cfg
726+
727+ addHydrationStep $ do
728+ domElement <- liftIO $ readIORef domElementRef
729+ let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
730+ getValue = TextArea.getValue domTextAreaElement
731+
732+ -- The browser might have messed with the value, or the user could have
733+ -- altered it before activation, so we set it if it isn't what we expect
734+ liftJSM getValue >>= \v0' -> do
735+ when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
736+
737+ -- Watch for user interaction and trigger event accordingly
738+ requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Input)
739+
740+ for_ (_textAreaElementConfig_setValue cfg) $ \eSetValue ->
741+ requestDomAction_ $ ffor eSetValue $ \v' -> do
742+ TextArea.setValue domTextAreaElement v'
743+ v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
744+ liftIO $ triggerChangeBySetValue v
745+
746+ let focusChange' = leftmost
747+ [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
748+ , True <$ Reflex.select (_element_events e) (WrapArg Focus)
749+ ]
750+ liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
751+ requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
752+
753+ let initialFocus = False -- Assume it isn't focused, but we update the actual focus state at switchover
754+ hasFocus <- holdUniqDyn =<< holdDyn initialFocus focusChange
755+
728756 v <- holdDyn v0 $ leftmost
729757 [ valueChangedBySetValue
730758 , valueChangedByUI
731759 ]
732− hasFocus <- mkHasFocus e
760+
733761 return $ TextAreaElement
734762 { _textAreaElement_value = v
735763 , _textAreaElement_input = valueChangedByUI
736764 , _textAreaElement_hasFocus = hasFocus
737765 , _textAreaElement_element = e
738− , _textAreaElement_raw = domTextAreaElement
766+ , _textAreaElement_raw = undefined -- TODO domTextAreaElement
739767 }
740768
741769 {-# INLINABLE selectElement #-}
reflex-dom-core/test/hydration.hs+8−8
@@ -438,7 +438,7 @@ main = hspec $ parallel $ do
438438 inputRef <- newIORef ""
439439 testWidget'
440440 (do
441− e <- WD.findElem $ WD.ByTag "input"
441+ e <- WD.findElem $ WD.ByTag "textarea"
442442 WD.sendKeys "hello world" e
443443 pure e)
444444 (\e -> do
@@ -454,7 +454,7 @@ main = hspec $ parallel $ do
454454 it "captures user input after switchover" $ do
455455 inputRef <- newIORef ""
456456 let checkValue = do
457− WD.sendKeys "hello world" <=< WD.findElem $ WD.ByTag "input"
457+ WD.sendKeys "hello world" <=< WD.findElem $ WD.ByTag "textarea"
458458 WD.click <=< WD.findElem $ WD.ByTag "button"
459459 input <- liftIO $ readIORef inputRef
460460 liftIO $ input `shouldBe` "hello world"
@@ -466,7 +466,7 @@ main = hspec $ parallel $ do
466466 focusRef <- newIORef False
467467 let checkValue = do
468468 liftIO $ readIORef focusRef >>= flip shouldBe False
469− e <- WD.findElem $ WD.ByTag "input"
469+ e <- WD.findElem $ WD.ByTag "textarea"
470470 WD.click e
471471 liftIO $ threadDelay 100000
472472 liftIO $ readIORef focusRef >>= flip shouldBe True
@@ -476,7 +476,7 @@ main = hspec $ parallel $ do
476476 it "sets focus when focus occurs before hydration" $ do
477477 focusRef <- newIORef False
478478 let setup = do
479− e <- WD.findElem $ WD.ByTag "input"
479+ e <- WD.findElem $ WD.ByTag "textarea"
480480 WD.click e
481481 hasFocus <- (== e) <$> WD.activeElem
482482 liftIO $ do
@@ -493,7 +493,7 @@ main = hspec $ parallel $ do
493493 let checkValue = do
494494 liftIO $ readIORef valueByUIRef >>= flip shouldBe ""
495495 liftIO $ readIORef valueRef >>= flip shouldBe ""
496− e <- WD.findElem $ WD.ByTag "input"
496+ e <- WD.findElem $ WD.ByTag "textarea"
497497 WD.sendKeys "hello" e
498498 liftIO $ do
499499 threadDelay 100000
@@ -515,7 +515,7 @@ main = hspec $ parallel $ do
515515 it "captures user input after switchover" $ do
516516 inputRef :: IORef Text <- newIORef ""
517517 let checkValue = do
518− WD.sendKeys "hello world" <=< WD.findElem $ WD.ByTag "input"
518+ WD.sendKeys "hello world" <=< WD.findElem $ WD.ByTag "textarea"
519519 WD.click <=< WD.findElem $ WD.ByTag "button"
520520 input <- liftIO $ readIORef inputRef
521521 liftIO $ input `shouldBe` "hello world"
@@ -527,7 +527,7 @@ main = hspec $ parallel $ do
527527 focusRef <- newIORef False
528528 let checkValue = do
529529 liftIO $ readIORef focusRef >>= flip shouldBe False
530− e <- WD.findElem $ WD.ByTag "input"
530+ e <- WD.findElem $ WD.ByTag "textarea"
531531 WD.click e
532532 liftIO $ threadDelay 100000
533533 liftIO $ readIORef focusRef >>= flip shouldBe True
@@ -541,7 +541,7 @@ main = hspec $ parallel $ do
541541 let checkValue = do
542542 liftIO $ readIORef valueByUIRef >>= flip shouldBe ""
543543 liftIO $ readIORef valueRef >>= flip shouldBe ""
544− e <- WD.findElem $ WD.ByTag "input"
544+ e <- WD.findElem $ WD.ByTag "textarea"
545545 WD.sendKeys "hello" e
546546 liftIO $ do
547547 threadDelay 100000