{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
module Reflex.Dom.Widget.Ionic
  (ionInputElement,
  ionSelectElement,
  ionTextAreaElement)
where

import Control.Lens (Identity(..), imapM_, iforM_, (^.), makeLenses)
import Control.Monad.Ref
import Data.Maybe
import Data.IORef
import Control.Monad
import Data.Functor.Misc
import Control.Monad.Fix
import GHCJS.DOM.Document (Document, createDocumentFragment, createElement, createElementNS, createTextNode, createComment)
import GHCJS.DOM.Types (liftJSM, askJSM, runJSM, JSM, MonadJSM, FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node, TouchEvent, WheelEvent, uncheckedCastTo, ClipboardEvent)
import Reflex.Class as Reflex
import Reflex.Host.Class

import qualified GHCJS.DOM as DOM

import qualified GHCJS.DOM.EventM as DOM
import qualified GHCJS.DOM.FileList as FileList
import qualified GHCJS.DOM.GlobalEventHandlers as Events
import qualified GHCJS.DOM.HTMLInputElement as Input
import qualified GHCJS.DOM.HTMLSelectElement as Select
import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea


import qualified GHCJS.DOM.EventTargetClosures as DOM (EventName, unsafeEventName, unsafeEventNameAsync)
--import qualified GHCJS.DOM.Types as DOM
--import qualified GHCJS.DOM.EventM as DOM
import qualified GHCJS.DOM.Text as DOM
import qualified GHCJS.DOM.Types as DOM

import Reflex.Dom.Widget.Basic
import Reflex.Dom.Widget.Input

import Reflex.Dom.Builder.Class
import Reflex.Dom.Builder.Immediate
import Reflex.Dom.Builder.Class.Events
import Reflex.Dom.Class
import Reflex.Dom.Old
import Reflex.Dynamic
import Data.Text(Text)
import qualified Data.Map as Map
import Data.Map (Map)
import Reflex.TriggerEvent.Class (TriggerEvent)

default (Text)

ionInputElement
  :: (MonadWidget t m, DomRenderHook t m)
  => Text -> InputElementConfig EventResult t (DomBuilderSpace m) -> m (InputElement EventResult  (DomBuilderSpace m) t)
ionInputElement :: Text
-> InputElementConfig EventResult t (DomBuilderSpace m)
-> m (InputElement EventResult (DomBuilderSpace m) t)
ionInputElement Text
tag InputElementConfig EventResult t (DomBuilderSpace m)
cfg  = do
  (Element EventResult GhcjsDomSpace t
e, ()) <- Text
-> ElementConfig EventResult t (DomBuilderSpace m)
-> m ()
-> m (Element EventResult (DomBuilderSpace m) t, ())
forall t (m :: * -> *) (er :: EventTag -> *) a.
DomBuilder t m =>
Text
-> ElementConfig er t (DomBuilderSpace m)
-> m a
-> m (Element er (DomBuilderSpace m) t, a)
element Text
tag  (InputElementConfig EventResult t GhcjsDomSpace
InputElementConfig EventResult t (DomBuilderSpace m)
cfg InputElementConfig EventResult t GhcjsDomSpace
-> Getting
     (ElementConfig EventResult t GhcjsDomSpace)
     (InputElementConfig EventResult t GhcjsDomSpace)
     (ElementConfig EventResult t GhcjsDomSpace)
-> ElementConfig EventResult t GhcjsDomSpace
forall s a. s -> Getting a s a -> a
^. Getting
  (ElementConfig EventResult t GhcjsDomSpace)
  (InputElementConfig EventResult t GhcjsDomSpace)
  (ElementConfig EventResult t GhcjsDomSpace)
forall k1 k2 k3 (er1 :: EventTag -> *) (t :: k1) (s1 :: k2)
       (er2 :: EventTag -> *) (s2 :: k3).
Lens
  (InputElementConfig er1 t s1)
  (InputElementConfig er2 t s2)
  (ElementConfig er1 t s1)
  (ElementConfig er2 t s2)
inputElementConfig_elementConfig)  (m () -> m (Element EventResult (DomBuilderSpace m) t, ()))
-> m () -> m (Element EventResult (DomBuilderSpace m) t, ())
forall a b. (a -> b) -> a -> b
$ () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
  let domInputElement :: HTMLInputElement
domInputElement = (JSVal -> HTMLInputElement) -> Element -> HTMLInputElement
forall obj obj'.
(Coercible obj JSVal, IsGObject obj') =>
(JSVal -> obj') -> obj -> obj'
uncheckedCastTo JSVal -> HTMLInputElement
DOM.HTMLInputElement (Element -> HTMLInputElement) -> Element -> HTMLInputElement
forall a b. (a -> b) -> a -> b
$ Element EventResult GhcjsDomSpace t -> RawElement GhcjsDomSpace
forall (er :: EventTag -> *) k1 (d :: k1) k2 (t :: k2).
Element er d t -> RawElement d
_element_raw Element EventResult GhcjsDomSpace t
e
      eventSelector :: EventSelector t (WrapArg EventResult EventName)
eventSelector = Element EventResult GhcjsDomSpace t
-> EventSelector t (WrapArg EventResult EventName)
forall (er :: EventTag -> *) k1 (d :: k1) k2 (t :: k2).
Element er d t -> EventSelector t (WrapArg er EventName)
_element_events Element EventResult GhcjsDomSpace t
e
  HTMLInputElement -> Text -> m ()
forall (m :: * -> *) val.
(MonadDOM m, ToJSString val) =>
HTMLInputElement -> val -> m ()
Input.setValue HTMLInputElement
domInputElement (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ InputElementConfig EventResult t GhcjsDomSpace
InputElementConfig EventResult t (DomBuilderSpace m)
cfg InputElementConfig EventResult t GhcjsDomSpace
-> Getting
     Text (InputElementConfig EventResult t GhcjsDomSpace) Text
-> Text
forall s a. s -> Getting a s a -> a
^. Getting Text (InputElementConfig EventResult t GhcjsDomSpace) Text
forall k1 k2 (er :: EventTag -> *) (t :: k1) (s :: k2).
Lens' (InputElementConfig er t s) Text
inputElementConfig_initialValue
  Text
v0 <- HTMLInputElement -> m Text
forall (m :: * -> *) result.
(MonadDOM m, FromJSString result) =>
HTMLInputElement -> m result
Input.getValue HTMLInputElement
domInputElement
  let getMyValue :: JSM Text
getMyValue = HTMLInputElement -> JSM Text
forall (m :: * -> *) result.
(MonadDOM m, FromJSString result) =>
HTMLInputElement -> m result
Input.getValue HTMLInputElement
domInputElement
  Event t Text
valueChangedByUI <- Event t (JSM Text) -> m (Event t Text)
forall k (t :: k) (m :: * -> *) a.
DomRenderHook t m =>
Event t (JSM a) -> m (Event t a)
requestDomAction (Event t (JSM Text) -> m (Event t Text))
-> Event t (JSM Text) -> m (Event t Text)
forall a b. (a -> b) -> a -> b
$ JSM Text -> JSM Text
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM JSM Text
getMyValue JSM Text -> Event t (EventResult 'InputTag) -> Event t (JSM Text)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ EventSelector t (WrapArg EventResult EventName)
-> WrapArg EventResult EventName (EventResult 'InputTag)
-> Event t (EventResult 'InputTag)
forall k1 (t :: k1) (k2 :: * -> *).
EventSelector t k2 -> forall a. k2 a -> Event t a
Reflex.select EventSelector t (WrapArg EventResult EventName)
eventSelector (EventName 'InputTag
-> WrapArg EventResult EventName (EventResult 'InputTag)
forall k (b :: k -> *) (a1 :: k) (a :: k -> *).
b a1 -> WrapArg a b (a a1)
WrapArg EventName 'InputTag
Input)
  Event t Text
valueChangedBySetValue <- case InputElementConfig EventResult t GhcjsDomSpace
-> Maybe (Event t Text)
forall (er :: EventTag -> *) k1 (t :: k1) k2 (s :: k2).
InputElementConfig er t s -> Maybe (Event t Text)
_inputElementConfig_setValue InputElementConfig EventResult t GhcjsDomSpace
InputElementConfig EventResult t (DomBuilderSpace m)
cfg of
    Maybe (Event t Text)
Nothing -> Event t Text -> m (Event t Text)
forall (m :: * -> *) a. Monad m => a -> m a
return Event t Text
forall k (t :: k) a. Reflex t => Event t a
never
    Just Event t Text
eSetValue -> Event t (JSM Text) -> m (Event t Text)
forall k (t :: k) (m :: * -> *) a.
DomRenderHook t m =>
Event t (JSM a) -> m (Event t a)
requestDomAction (Event t (JSM Text) -> m (Event t Text))
-> Event t (JSM Text) -> m (Event t Text)
forall a b. (a -> b) -> a -> b
$ Event t Text -> (Text -> JSM Text) -> Event t (JSM Text)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
ffor Event t Text
eSetValue ((Text -> JSM Text) -> Event t (JSM Text))
-> (Text -> JSM Text) -> Event t (JSM Text)
forall a b. (a -> b) -> a -> b
$ \Text
v' -> do
      HTMLInputElement -> Text -> JSM ()
forall (m :: * -> *) val.
(MonadDOM m, ToJSString val) =>
HTMLInputElement -> val -> m ()
Input.setValue HTMLInputElement
domInputElement Text
v'
      JSM Text
getMyValue 
  Dynamic t Text
v <- Text -> Event t Text -> m (Dynamic t Text)
forall k (t :: k) (m :: * -> *) a.
MonadHold t m =>
a -> Event t a -> m (Dynamic t a)
holdDyn Text
v0 (Event t Text -> m (Dynamic t Text))
-> Event t Text -> m (Dynamic t Text)
forall a b. (a -> b) -> a -> b
$ [Event t Text] -> Event t Text
forall k (t :: k) a. Reflex t => [Event t a] -> Event t a
leftmost
    [ Event t Text
valueChangedBySetValue
    , Event t Text
valueChangedByUI
    ]
  HTMLInputElement -> Bool -> m ()
forall (m :: * -> *).
MonadDOM m =>
HTMLInputElement -> Bool -> m ()
Input.setChecked HTMLInputElement
domInputElement (Bool -> m ()) -> Bool -> m ()
forall a b. (a -> b) -> a -> b
$ InputElementConfig EventResult t GhcjsDomSpace -> Bool
forall (er :: EventTag -> *) k1 (t :: k1) k2 (s :: k2).
InputElementConfig er t s -> Bool
_inputElementConfig_initialChecked InputElementConfig EventResult t GhcjsDomSpace
InputElementConfig EventResult t (DomBuilderSpace m)
cfg
  Event t Bool
checkedChangedByUI <- HTMLInputElement
-> (HTMLInputElement
    -> EventM HTMLInputElement MouseEvent () -> JSM (JSM ()))
-> EventM HTMLInputElement MouseEvent Bool
-> m (Event t Bool)
forall t (m :: * -> *) e event a.
(TriggerEvent t m, MonadJSM m) =>
e
-> (e -> EventM e event () -> JSM (JSM ()))
-> EventM e event a
-> m (Event t a)
wrapDomEvent HTMLInputElement
domInputElement (HTMLInputElement
-> EventName HTMLInputElement MouseEvent
-> EventM HTMLInputElement MouseEvent ()
-> JSM (JSM ())
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> EventM t e () -> JSM (JSM ())
`DOM.on` EventName HTMLInputElement MouseEvent
forall self.
(IsGlobalEventHandlers self, IsEventTarget self) =>
EventName self MouseEvent
Events.click) (EventM HTMLInputElement MouseEvent Bool -> m (Event t Bool))
-> EventM HTMLInputElement MouseEvent Bool -> m (Event t Bool)
forall a b. (a -> b) -> a -> b
$ do
    HTMLInputElement -> EventM HTMLInputElement MouseEvent Bool
forall (m :: * -> *). MonadDOM m => HTMLInputElement -> m Bool
Input.getChecked HTMLInputElement
domInputElement
  Event t (Maybe Bool)
checkedChangedBySetChecked <- case InputElementConfig EventResult t GhcjsDomSpace
-> Maybe (Event t Bool)
forall (er :: EventTag -> *) k1 (t :: k1) k2 (s :: k2).
InputElementConfig er t s -> Maybe (Event t Bool)
_inputElementConfig_setChecked InputElementConfig EventResult t GhcjsDomSpace
InputElementConfig EventResult t (DomBuilderSpace m)
cfg of
    Maybe (Event t Bool)
Nothing -> Event t (Maybe Bool) -> m (Event t (Maybe Bool))
forall (m :: * -> *) a. Monad m => a -> m a
return Event t (Maybe Bool)
forall k (t :: k) a. Reflex t => Event t a
never
    Just Event t Bool
eNewchecked -> Event t (JSM (Maybe Bool)) -> m (Event t (Maybe Bool))
forall k (t :: k) (m :: * -> *) a.
DomRenderHook t m =>
Event t (JSM a) -> m (Event t a)
requestDomAction (Event t (JSM (Maybe Bool)) -> m (Event t (Maybe Bool)))
-> Event t (JSM (Maybe Bool)) -> m (Event t (Maybe Bool))
forall a b. (a -> b) -> a -> b
$ Event t Bool
-> (Bool -> JSM (Maybe Bool)) -> Event t (JSM (Maybe Bool))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
ffor Event t Bool
eNewchecked ((Bool -> JSM (Maybe Bool)) -> Event t (JSM (Maybe Bool)))
-> (Bool -> JSM (Maybe Bool)) -> Event t (JSM (Maybe Bool))
forall a b. (a -> b) -> a -> b
$ \Bool
newChecked -> do
      Bool
oldChecked <- HTMLInputElement -> JSM Bool
forall (m :: * -> *). MonadDOM m => HTMLInputElement -> m Bool
Input.getChecked HTMLInputElement
domInputElement
      HTMLInputElement -> Bool -> JSM ()
forall (m :: * -> *).
MonadDOM m =>
HTMLInputElement -> Bool -> m ()
Input.setChecked HTMLInputElement
domInputElement Bool
newChecked
      Maybe Bool -> JSM (Maybe Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Bool -> JSM (Maybe Bool)) -> Maybe Bool -> JSM (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ if Bool
newChecked Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
oldChecked
                  then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
newChecked
                  else Maybe Bool
forall a. Maybe a
Nothing
  Dynamic t Bool
c <- Bool -> Event t Bool -> m (Dynamic t Bool)
forall k (t :: k) (m :: * -> *) a.
MonadHold t m =>
a -> Event t a -> m (Dynamic t a)
holdDyn (InputElementConfig EventResult t GhcjsDomSpace -> Bool
forall (er :: EventTag -> *) k1 (t :: k1) k2 (s :: k2).
InputElementConfig er t s -> Bool
_inputElementConfig_initialChecked InputElementConfig EventResult t GhcjsDomSpace
InputElementConfig EventResult t (DomBuilderSpace m)
cfg) (Event t Bool -> m (Dynamic t Bool))
-> Event t Bool -> m (Dynamic t Bool)
forall a b. (a -> b) -> a -> b
$ [Event t Bool] -> Event t Bool
forall k (t :: k) a. Reflex t => [Event t a] -> Event t a
leftmost
    [ (Maybe Bool -> Maybe Bool) -> Event t (Maybe Bool) -> Event t Bool
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
fmapMaybe Maybe Bool -> Maybe Bool
forall a. a -> a
id Event t (Maybe Bool)
checkedChangedBySetChecked
    , Event t Bool
checkedChangedByUI
    ]
  Dynamic t Bool
hasFocus <- Element EventResult GhcjsDomSpace t -> m (Dynamic t Bool)
forall k1 k2 (m :: * -> *) (d :: k1) (t :: k2)
       (er :: EventTag -> *).
(HasDocument m, MonadJSM m, IsNode (RawElement d), MonadHold t m,
 Reflex t,
 IsDocumentOrShadowRoot (RawDocument (DomBuilderSpace m))) =>
Element er d t -> m (Dynamic t Bool)
mkHasFocus Element EventResult GhcjsDomSpace t
e
  Dynamic t [File]
files <- [File] -> Event t [File] -> m (Dynamic t [File])
forall k (t :: k) (m :: * -> *) a.
MonadHold t m =>
a -> Event t a -> m (Dynamic t a)
holdDyn [File]
forall a. Monoid a => a
mempty (Event t [File] -> m (Dynamic t [File]))
-> (EventM HTMLInputElement Event [File] -> m (Event t [File]))
-> EventM HTMLInputElement Event [File]
-> m (Dynamic t [File])
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< HTMLInputElement
-> (HTMLInputElement
    -> EventM HTMLInputElement Event () -> JSM (JSM ()))
-> EventM HTMLInputElement Event [File]
-> m (Event t [File])
forall t (m :: * -> *) e event a.
(TriggerEvent t m, MonadJSM m) =>
e
-> (e -> EventM e event () -> JSM (JSM ()))
-> EventM e event a
-> m (Event t a)
wrapDomEvent HTMLInputElement
domInputElement (HTMLInputElement
-> EventName HTMLInputElement Event
-> EventM HTMLInputElement Event ()
-> JSM (JSM ())
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> EventM t e () -> JSM (JSM ())
`DOM.on` EventName HTMLInputElement Event
forall self.
(IsGlobalEventHandlers self, IsEventTarget self) =>
EventName self Event
Events.change) (EventM HTMLInputElement Event [File] -> m (Dynamic t [File]))
-> EventM HTMLInputElement Event [File] -> m (Dynamic t [File])
forall a b. (a -> b) -> a -> b
$ do
    Maybe FileList
mfiles <- HTMLInputElement -> ReaderT Event DOM (Maybe FileList)
forall (m :: * -> *).
MonadDOM m =>
HTMLInputElement -> m (Maybe FileList)
Input.getFiles HTMLInputElement
domInputElement
    let getMyFiles :: FileList -> m [File]
getMyFiles FileList
xs = ([Maybe File] -> [File]) -> m [Maybe File] -> m [File]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Maybe File] -> [File]
forall a. [Maybe a] -> [a]
catMaybes (m [Maybe File] -> m [File])
-> (Word -> m [Maybe File]) -> Word -> m [File]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> m (Maybe File)) -> [Word] -> m [Maybe File]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (FileList -> Word -> m (Maybe File)
forall (m :: * -> *).
MonadDOM m =>
FileList -> Word -> m (Maybe File)
FileList.item FileList
xs) ([Word] -> m [Maybe File])
-> (Word -> [Word]) -> Word -> m [Maybe File]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> [Word] -> [Word]) -> [Word] -> Int -> [Word]
forall a b c. (a -> b -> c) -> b -> a -> c
flip Int -> [Word] -> [Word]
forall a. Int -> [a] -> [a]
take [Word
0..] (Int -> [Word]) -> (Word -> Int) -> Word -> [Word]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word -> m [File]) -> m Word -> m [File]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< FileList -> m Word
forall (m :: * -> *). MonadDOM m => FileList -> m Word
FileList.getLength FileList
xs
    EventM HTMLInputElement Event [File]
-> (FileList -> EventM HTMLInputElement Event [File])
-> Maybe FileList
-> EventM HTMLInputElement Event [File]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([File] -> EventM HTMLInputElement Event [File]
forall (m :: * -> *) a. Monad m => a -> m a
return []) FileList -> EventM HTMLInputElement Event [File]
forall (m :: * -> *). MonadJSM m => FileList -> m [File]
getMyFiles Maybe FileList
mfiles
  Dynamic t Bool
checked <- Dynamic t Bool -> m (Dynamic t Bool)
forall k (t :: k) (m :: * -> *) a.
(Reflex t, MonadHold t m, MonadFix m, Eq a) =>
Dynamic t a -> m (Dynamic t a)
holdUniqDyn Dynamic t Bool
c
  InputElement EventResult GhcjsDomSpace t
-> m (InputElement EventResult GhcjsDomSpace t)
forall (m :: * -> *) a. Monad m => a -> m a
return (InputElement EventResult GhcjsDomSpace t
 -> m (InputElement EventResult GhcjsDomSpace t))
-> InputElement EventResult GhcjsDomSpace t
-> m (InputElement EventResult GhcjsDomSpace t)
forall a b. (a -> b) -> a -> b
$ InputElement :: forall k k1 (er :: EventTag -> *) (d :: k) (t :: k1).
Dynamic t Text
-> Dynamic t Bool
-> Event t Bool
-> Event t Text
-> Dynamic t Bool
-> Element er d t
-> RawInputElement d
-> Dynamic t [File]
-> InputElement er d t
InputElement
    { _inputElement_value :: Dynamic t Text
_inputElement_value = Dynamic t Text
v
    , _inputElement_checked :: Dynamic t Bool
_inputElement_checked = Dynamic t Bool
checked
    , _inputElement_checkedChange :: Event t Bool
_inputElement_checkedChange =  Event t Bool
checkedChangedByUI
    , _inputElement_input :: Event t Text
_inputElement_input = Event t Text
valueChangedByUI
    , _inputElement_hasFocus :: Dynamic t Bool
_inputElement_hasFocus = Dynamic t Bool
hasFocus
    , _inputElement_element :: Element EventResult GhcjsDomSpace t
_inputElement_element = Element EventResult GhcjsDomSpace t
e
    , _inputElement_raw :: RawInputElement GhcjsDomSpace
_inputElement_raw = HTMLInputElement
RawInputElement GhcjsDomSpace
domInputElement
    , _inputElement_files :: Dynamic t [File]
_inputElement_files = Dynamic t [File]
files
    }


ionSelectElement :: (MonadWidget t m, DomRenderHook t m, TriggerEvent t m )
  => Text -> SelectElementConfig EventResult t (DomBuilderSpace m) ->
  m r ->
  m (SelectElement EventResult  (DomBuilderSpace m) t, r)
ionSelectElement :: Text
-> SelectElementConfig EventResult t (DomBuilderSpace m)
-> m r
-> m (SelectElement EventResult (DomBuilderSpace m) t, r)
ionSelectElement Text
tag SelectElementConfig EventResult t (DomBuilderSpace m)
cfg m r
child = do
  (e :: Element EventResult GhcjsDomSpace t
e@(Element EventSelector t (WrapArg EventResult EventName)
eventSelector RawElement GhcjsDomSpace
domElement), r
result) <- Text
-> ElementConfig EventResult t (DomBuilderSpace m)
-> m r
-> m (Element EventResult (DomBuilderSpace m) t, r)
forall t (m :: * -> *) (er :: EventTag -> *) a.
DomBuilder t m =>
Text
-> ElementConfig er t (DomBuilderSpace m)
-> m a
-> m (Element er (DomBuilderSpace m) t, a)
element Text
tag  (SelectElementConfig EventResult t GhcjsDomSpace
SelectElementConfig EventResult t (DomBuilderSpace m)
cfg SelectElementConfig EventResult t GhcjsDomSpace
-> Getting
     (ElementConfig EventResult t GhcjsDomSpace)
     (SelectElementConfig EventResult t GhcjsDomSpace)
     (ElementConfig EventResult t GhcjsDomSpace)
-> ElementConfig EventResult t GhcjsDomSpace
forall s a. s -> Getting a s a -> a
^. Getting
  (ElementConfig EventResult t GhcjsDomSpace)
  (SelectElementConfig EventResult t GhcjsDomSpace)
  (ElementConfig EventResult t GhcjsDomSpace)
forall k1 k2 k3 (er1 :: EventTag -> *) (t :: k1) (m1 :: k2)
       (er2 :: EventTag -> *) (m2 :: k3).
Lens
  (SelectElementConfig er1 t m1)
  (SelectElementConfig er2 t m2)
  (ElementConfig er1 t m1)
  (ElementConfig er2 t m2)
selectElementConfig_elementConfig) (m r -> m (Element EventResult (DomBuilderSpace m) t, r))
-> m r -> m (Element EventResult (DomBuilderSpace m) t, r)
forall a b. (a -> b) -> a -> b
$ m r
child
  let domSelectElement :: HTMLSelectElement
domSelectElement = (JSVal -> HTMLSelectElement) -> Element -> HTMLSelectElement
forall obj obj'.
(Coercible obj JSVal, IsGObject obj') =>
(JSVal -> obj') -> obj -> obj'
uncheckedCastTo JSVal -> HTMLSelectElement
DOM.HTMLSelectElement Element
RawElement GhcjsDomSpace
domElement
  HTMLSelectElement -> Text -> m ()
forall (m :: * -> *) val.
(MonadDOM m, ToJSString val) =>
HTMLSelectElement -> val -> m ()
Select.setValue HTMLSelectElement
domSelectElement (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ SelectElementConfig EventResult t GhcjsDomSpace
SelectElementConfig EventResult t (DomBuilderSpace m)
cfg SelectElementConfig EventResult t GhcjsDomSpace
-> Getting
     Text (SelectElementConfig EventResult t GhcjsDomSpace) Text
-> Text
forall s a. s -> Getting a s a -> a
^. Getting Text (SelectElementConfig EventResult t GhcjsDomSpace) Text
forall k1 k2 (er :: EventTag -> *) (t :: k1) (m :: k2).
Lens' (SelectElementConfig er t m) Text
selectElementConfig_initialValue
  Text
v0 <- HTMLSelectElement -> m Text
forall (m :: * -> *) result.
(MonadDOM m, FromJSString result) =>
HTMLSelectElement -> m result
Select.getValue HTMLSelectElement
domSelectElement
  let getMyValue :: JSM Text
getMyValue = HTMLSelectElement -> JSM Text
forall (m :: * -> *) result.
(MonadDOM m, FromJSString result) =>
HTMLSelectElement -> m result
Select.getValue HTMLSelectElement
domSelectElement
      ionChange :: (DOM.IsGlobalEventHandlers self, DOM.IsEventTarget self) => DOM.EventName self DOM.Event
      ionChange :: EventName self Event
ionChange = DOMString -> EventName self Event
forall t e. DOMString -> EventName t e
DOM.unsafeEventName (Text -> DOMString
forall a. ToJSString a => a -> DOMString
DOM.toJSString (Text
"ionChange" :: Text))
  Event t Text
valueChangedByUI <- HTMLElement
-> (HTMLElement
    -> EventM HTMLInputElement Event () -> JSM (JSM ()))
-> EventM HTMLElement Event Text
-> m (Event t Text)
forall t (m :: * -> *) e event a.
(TriggerEvent t m, MonadJSM m) =>
e
-> (e -> EventM e event () -> JSM (JSM ()))
-> EventM e event a
-> m (Event t a)
wrapDomEvent ((JSVal -> HTMLElement) -> Element -> HTMLElement
forall obj obj'.
(Coercible obj JSVal, IsGObject obj') =>
(JSVal -> obj') -> obj -> obj'
DOM.uncheckedCastTo JSVal -> HTMLElement
DOM.HTMLElement (Element -> HTMLElement) -> Element -> HTMLElement
forall a b. (a -> b) -> a -> b
$ Element
RawElement GhcjsDomSpace
domElement) (HTMLElement
-> EventName HTMLElement Event
-> EventM HTMLInputElement Event ()
-> JSM (JSM ())
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> EventM t e () -> JSM (JSM ())
`DOM.on` EventName HTMLElement Event
forall self.
(IsGlobalEventHandlers self, IsEventTarget self) =>
EventName self Event
ionChange) (EventM HTMLElement Event Text -> m (Event t Text))
-> EventM HTMLElement Event Text -> m (Event t Text)
forall a b. (a -> b) -> a -> b
$ do
    JSM Text -> EventM HTMLElement Event Text
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM JSM Text
getMyValue
  Event t Text
valueChangedBySetValue <- case SelectElementConfig EventResult t GhcjsDomSpace
-> Maybe (Event t Text)
forall (er :: EventTag -> *) k1 (t :: k1) k2 (m :: k2).
SelectElementConfig er t m -> Maybe (Event t Text)
_selectElementConfig_setValue SelectElementConfig EventResult t GhcjsDomSpace
SelectElementConfig EventResult t (DomBuilderSpace m)
cfg of
    Maybe (Event t Text)
Nothing -> Event t Text -> m (Event t Text)
forall (m :: * -> *) a. Monad m => a -> m a
return Event t Text
forall k (t :: k) a. Reflex t => Event t a
never
    Just Event t Text
eSetValue -> Event t (JSM Text) -> m (Event t Text)
forall k (t :: k) (m :: * -> *) a.
DomRenderHook t m =>
Event t (JSM a) -> m (Event t a)
requestDomAction (Event t (JSM Text) -> m (Event t Text))
-> Event t (JSM Text) -> m (Event t Text)
forall a b. (a -> b) -> a -> b
$ Event t Text -> (Text -> JSM Text) -> Event t (JSM Text)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
ffor Event t Text
eSetValue ((Text -> JSM Text) -> Event t (JSM Text))
-> (Text -> JSM Text) -> Event t (JSM Text)
forall a b. (a -> b) -> a -> b
$ \Text
v' -> do
      HTMLSelectElement -> Text -> JSM ()
forall (m :: * -> *) val.
(MonadDOM m, ToJSString val) =>
HTMLSelectElement -> val -> m ()
Select.setValue HTMLSelectElement
domSelectElement Text
v'
      JSM Text
getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
  Dynamic t Text
v <- Text -> Event t Text -> m (Dynamic t Text)
forall k (t :: k) (m :: * -> *) a.
MonadHold t m =>
a -> Event t a -> m (Dynamic t a)
holdDyn Text
v0 (Event t Text -> m (Dynamic t Text))
-> Event t Text -> m (Dynamic t Text)
forall a b. (a -> b) -> a -> b
$ [Event t Text] -> Event t Text
forall k (t :: k) a. Reflex t => [Event t a] -> Event t a
leftmost
    [ Event t Text
valueChangedBySetValue
    , Event t Text
valueChangedByUI
    ]
  Dynamic t Bool
hasFocus <- Element EventResult GhcjsDomSpace t -> m (Dynamic t Bool)
forall k1 k2 (m :: * -> *) (d :: k1) (t :: k2)
       (er :: EventTag -> *).
(HasDocument m, MonadJSM m, IsNode (RawElement d), MonadHold t m,
 Reflex t,
 IsDocumentOrShadowRoot (RawDocument (DomBuilderSpace m))) =>
Element er d t -> m (Dynamic t Bool)
mkHasFocus Element EventResult GhcjsDomSpace t
e
  let wrapped :: SelectElement EventResult GhcjsDomSpace t
wrapped = SelectElement :: forall k k1 (er :: EventTag -> *) (d :: k) (t :: k1).
Element er d t
-> Dynamic t Text
-> Event t Text
-> Dynamic t Bool
-> RawSelectElement d
-> SelectElement er d t
SelectElement
        { _selectElement_value :: Dynamic t Text
_selectElement_value = Dynamic t Text
v
        , _selectElement_change :: Event t Text
_selectElement_change = Event t Text
valueChangedByUI
        , _selectElement_hasFocus :: Dynamic t Bool
_selectElement_hasFocus = Dynamic t Bool
hasFocus
        , _selectElement_element :: Element EventResult GhcjsDomSpace t
_selectElement_element = Element EventResult GhcjsDomSpace t
e
        , _selectElement_raw :: RawSelectElement GhcjsDomSpace
_selectElement_raw = HTMLSelectElement
RawSelectElement GhcjsDomSpace
domSelectElement
        }
  (SelectElement EventResult GhcjsDomSpace t, r)
-> m (SelectElement EventResult GhcjsDomSpace t, r)
forall (m :: * -> *) a. Monad m => a -> m a
return (SelectElement EventResult GhcjsDomSpace t
wrapped, r
result)


ionTextAreaElement
  :: (MonadWidget t m, DomRenderHook t m, TriggerEvent t m )
  => TextAreaElementConfig EventResult t (DomBuilderSpace m) ->
  m (TextAreaElement EventResult  (DomBuilderSpace m) t)
ionTextAreaElement :: TextAreaElementConfig EventResult t (DomBuilderSpace m)
-> m (TextAreaElement EventResult (DomBuilderSpace m) t)
ionTextAreaElement TextAreaElementConfig EventResult t (DomBuilderSpace m)
cfg = do
  (e :: Element EventResult GhcjsDomSpace t
e@(Element EventSelector t (WrapArg EventResult EventName)
eventSelector RawElement GhcjsDomSpace
domElement), ()
_) <- Text
-> ElementConfig EventResult t (DomBuilderSpace m)
-> m ()
-> m (Element EventResult (DomBuilderSpace m) t, ())
forall t (m :: * -> *) (er :: EventTag -> *) a.
DomBuilder t m =>
Text
-> ElementConfig er t (DomBuilderSpace m)
-> m a
-> m (Element er (DomBuilderSpace m) t, a)
element Text
"ion-textarea" (TextAreaElementConfig EventResult t GhcjsDomSpace
TextAreaElementConfig EventResult t (DomBuilderSpace m)
cfg TextAreaElementConfig EventResult t GhcjsDomSpace
-> Getting
     (ElementConfig EventResult t GhcjsDomSpace)
     (TextAreaElementConfig EventResult t GhcjsDomSpace)
     (ElementConfig EventResult t GhcjsDomSpace)
-> ElementConfig EventResult t GhcjsDomSpace
forall s a. s -> Getting a s a -> a
^. Getting
  (ElementConfig EventResult t GhcjsDomSpace)
  (TextAreaElementConfig EventResult t GhcjsDomSpace)
  (ElementConfig EventResult t GhcjsDomSpace)
forall k1 k2 k3 (er1 :: EventTag -> *) (t :: k1) (m1 :: k2)
       (er2 :: EventTag -> *) (m2 :: k3).
Lens
  (TextAreaElementConfig er1 t m1)
  (TextAreaElementConfig er2 t m2)
  (ElementConfig er1 t m1)
  (ElementConfig er2 t m2)
textAreaElementConfig_elementConfig) (m () -> m (Element EventResult (DomBuilderSpace m) t, ()))
-> m () -> m (Element EventResult (DomBuilderSpace m) t, ())
forall a b. (a -> b) -> a -> b
$ () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
  let domTextAreaElement :: HTMLTextAreaElement
domTextAreaElement = (JSVal -> HTMLTextAreaElement) -> Element -> HTMLTextAreaElement
forall obj obj'.
(Coercible obj JSVal, IsGObject obj') =>
(JSVal -> obj') -> obj -> obj'
uncheckedCastTo JSVal -> HTMLTextAreaElement
DOM.HTMLTextAreaElement Element
RawElement GhcjsDomSpace
domElement
  HTMLTextAreaElement -> Text -> m ()
forall (m :: * -> *) val.
(MonadDOM m, ToJSString val) =>
HTMLTextAreaElement -> val -> m ()
TextArea.setValue HTMLTextAreaElement
domTextAreaElement (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ TextAreaElementConfig EventResult t GhcjsDomSpace
TextAreaElementConfig EventResult t (DomBuilderSpace m)
cfg TextAreaElementConfig EventResult t GhcjsDomSpace
-> Getting
     Text (TextAreaElementConfig EventResult t GhcjsDomSpace) Text
-> Text
forall s a. s -> Getting a s a -> a
^. Getting
  Text (TextAreaElementConfig EventResult t GhcjsDomSpace) Text
forall k1 k2 (er :: EventTag -> *) (t :: k1) (m :: k2).
Lens' (TextAreaElementConfig er t m) Text
textAreaElementConfig_initialValue
  Text
v0 <- HTMLTextAreaElement -> m Text
forall (m :: * -> *) result.
(MonadDOM m, FromJSString result) =>
HTMLTextAreaElement -> m result
TextArea.getValue HTMLTextAreaElement
domTextAreaElement
  let getMyValue :: JSM Text
getMyValue = HTMLTextAreaElement -> JSM Text
forall (m :: * -> *) result.
(MonadDOM m, FromJSString result) =>
HTMLTextAreaElement -> m result
TextArea.getValue HTMLTextAreaElement
domTextAreaElement
  Event t Text
valueChangedByUI <- Event t (JSM Text) -> m (Event t Text)
forall k (t :: k) (m :: * -> *) a.
DomRenderHook t m =>
Event t (JSM a) -> m (Event t a)
requestDomAction (Event t (JSM Text) -> m (Event t Text))
-> Event t (JSM Text) -> m (Event t Text)
forall a b. (a -> b) -> a -> b
$ JSM Text -> JSM Text
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM JSM Text
getMyValue JSM Text -> Event t (EventResult 'InputTag) -> Event t (JSM Text)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ EventSelector t (WrapArg EventResult EventName)
-> WrapArg EventResult EventName (EventResult 'InputTag)
-> Event t (EventResult 'InputTag)
forall k1 (t :: k1) (k2 :: * -> *).
EventSelector t k2 -> forall a. k2 a -> Event t a
Reflex.select EventSelector t (WrapArg EventResult EventName)
eventSelector (EventName 'InputTag
-> WrapArg EventResult EventName (EventResult 'InputTag)
forall k (b :: k -> *) (a1 :: k) (a :: k -> *).
b a1 -> WrapArg a b (a a1)
WrapArg EventName 'InputTag
Input)
  Event t Text
valueChangedBySetValue <- case TextAreaElementConfig EventResult t GhcjsDomSpace
-> Maybe (Event t Text)
forall (er :: EventTag -> *) k1 (t :: k1) k2 (m :: k2).
TextAreaElementConfig er t m -> Maybe (Event t Text)
_textAreaElementConfig_setValue TextAreaElementConfig EventResult t GhcjsDomSpace
TextAreaElementConfig EventResult t (DomBuilderSpace m)
cfg of
    Maybe (Event t Text)
Nothing -> Event t Text -> m (Event t Text)
forall (m :: * -> *) a. Monad m => a -> m a
return Event t Text
forall k (t :: k) a. Reflex t => Event t a
never
    Just Event t Text
eSetValue -> Event t (JSM Text) -> m (Event t Text)
forall k (t :: k) (m :: * -> *) a.
DomRenderHook t m =>
Event t (JSM a) -> m (Event t a)
requestDomAction (Event t (JSM Text) -> m (Event t Text))
-> Event t (JSM Text) -> m (Event t Text)
forall a b. (a -> b) -> a -> b
$ Event t Text -> (Text -> JSM Text) -> Event t (JSM Text)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
ffor Event t Text
eSetValue ((Text -> JSM Text) -> Event t (JSM Text))
-> (Text -> JSM Text) -> Event t (JSM Text)
forall a b. (a -> b) -> a -> b
$ \Text
v' -> do
      HTMLTextAreaElement -> Text -> JSM ()
forall (m :: * -> *) val.
(MonadDOM m, ToJSString val) =>
HTMLTextAreaElement -> val -> m ()
TextArea.setValue HTMLTextAreaElement
domTextAreaElement Text
v'
      JSM Text
getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
  Dynamic t Text
v <- Text -> Event t Text -> m (Dynamic t Text)
forall k (t :: k) (m :: * -> *) a.
MonadHold t m =>
a -> Event t a -> m (Dynamic t a)
holdDyn Text
v0 (Event t Text -> m (Dynamic t Text))
-> Event t Text -> m (Dynamic t Text)
forall a b. (a -> b) -> a -> b
$ [Event t Text] -> Event t Text
forall k (t :: k) a. Reflex t => [Event t a] -> Event t a
leftmost
    [ Event t Text
valueChangedBySetValue
    , Event t Text
valueChangedByUI
    ]
  Dynamic t Bool
hasFocus <- Element EventResult GhcjsDomSpace t -> m (Dynamic t Bool)
forall k1 k2 (m :: * -> *) (d :: k1) (t :: k2)
       (er :: EventTag -> *).
(HasDocument m, MonadJSM m, IsNode (RawElement d), MonadHold t m,
 Reflex t,
 IsDocumentOrShadowRoot (RawDocument (DomBuilderSpace m))) =>
Element er d t -> m (Dynamic t Bool)
mkHasFocus Element EventResult GhcjsDomSpace t
e
  TextAreaElement EventResult GhcjsDomSpace t
-> m (TextAreaElement EventResult GhcjsDomSpace t)
forall (m :: * -> *) a. Monad m => a -> m a
return (TextAreaElement EventResult GhcjsDomSpace t
 -> m (TextAreaElement EventResult GhcjsDomSpace t))
-> TextAreaElement EventResult GhcjsDomSpace t
-> m (TextAreaElement EventResult GhcjsDomSpace t)
forall a b. (a -> b) -> a -> b
$ TextAreaElement :: forall k k1 (er :: EventTag -> *) (d :: k) (t :: k1).
Dynamic t Text
-> Event t Text
-> Dynamic t Bool
-> Element er d t
-> RawTextAreaElement d
-> TextAreaElement er d t
TextAreaElement
    { _textAreaElement_value :: Dynamic t Text
_textAreaElement_value = Dynamic t Text
v
    , _textAreaElement_input :: Event t Text
_textAreaElement_input = Event t Text
valueChangedByUI
    , _textAreaElement_hasFocus :: Dynamic t Bool
_textAreaElement_hasFocus = Dynamic t Bool
hasFocus
    , _textAreaElement_element :: Element EventResult GhcjsDomSpace t
_textAreaElement_element = Element EventResult GhcjsDomSpace t
e
    , _textAreaElement_raw :: RawTextAreaElement GhcjsDomSpace
_textAreaElement_raw = HTMLTextAreaElement
RawTextAreaElement GhcjsDomSpace
domTextAreaElement
    }