plzwrk-0.0.0.4: src/Web/Framework/Plzwrk/Util.hs
module Web.Framework.Plzwrk.Util
( pT
, pF
, eventTargetValue
, eventPreventDefault
, eventTargetBlur
, elementSetAttribute
, elementTagName
, eventTargetAddEventListener
, eventTargetRemoveEventListener
, getPropertyAsBool
, getPropertyAsDouble
, getPropertyAsInt
, getPropertyAsString
, htmlElemenetClick
, consoleLogS
, nodeAppendChild
, nodeChildNodes
, nodeInsertBefore
, nodeRemoveChild
, nodeTextContent
)
where
import Control.Monad
import Data.HashMap.Strict as HM
import Data.Set as S
import Web.Framework.Plzwrk.Base ( dats
, dats'
, PwAttribute(..)
)
import Web.Framework.Plzwrk.Browserful
-- | Creates a text attribute wrapped in an applicative functor
pT :: String -> (s -> PwAttribute s opq)
pT t = (\_ -> PwTextAttribute t)
-- | Creates a callback attribute wrapped in an applicative functor
pF :: (opq -> s -> IO s) -> (s -> PwAttribute s opq)
pF f = (\_ -> PwFunctionAttribute f)
-- |From an event, gets the target's value.
eventTargetValue
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the event
-> IO (Maybe String) -- ^ the target value, or nothing if it doesn't exist
eventTargetValue browser e = do
opq <- (getPropertyAsOpaque browser) e "target"
maybe (pure Nothing) (\y -> (getPropertyAsString browser) y "value") opq
-- |From an event, takes the target and blurs it.
eventTargetBlur
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the event
-> IO () -- ^ returns nothing
eventTargetBlur browser e = do
opq <- (getPropertyAsOpaque browser) e "target"
maybe (pure ()) (\y -> void $ (invokeOn0 browser) y "blur") opq
-- |Take an event and prevent the default.
eventPreventDefault
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the event
-> IO () -- ^ returns nothing
eventPreventDefault browser e = do
void $ (invokeOn0 browser) e "preventDefault"
-----------
-- | Sets on an element an attribute. See [Element.setAttribute](https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute)
elementSetAttribute
:: Browserful jsval -- ^ The browser
-> jsval -- ^ the node
-> String -- ^ the attribute name
-> String -- ^ the attribute
-> IO () -- ^ returns nothing
elementSetAttribute b e k v = do
_k <- (jsValFromString b) k
_v <- (jsValFromString b) v
void $ (invokeOn2 b) e "setAttribute" _k _v
-- | Gets the tag name of an element. See [Element.tagName](https://developer.mozilla.org/en-US/docs/Web/API/Element/tagName)
elementTagName
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the element
-> IO (Maybe String) -- ^ Returns the tag name
elementTagName b v = do
_o <- (getPropertyAsOpaque b) v "tagName"
maybe (pure Nothing) (\x -> (castToString b) x) _o
-- | Takes a target and an event name and adds a listener. See [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
eventTargetAddEventListener
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the element
-> String -- ^ the listener name. note that this should be "click" or "input", not "onclick" nor "oninput"
-> jsval -- ^ the listener
-> IO () -- ^ returns nothing
eventTargetAddEventListener b e k v = do
_k <- (jsValFromString b) k
void $ (invokeOn2 b) e "addEventListener" _k v
-- | Takes a target and an event name and removes a listener. See [EventTarget.removeEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener)
eventTargetRemoveEventListener
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the element
-> String -- ^ the listener name. note that this should be "click" or "input", not "onclick" nor "oninput"
-> jsval -- ^ the listener
-> IO () -- ^ returns nothing
eventTargetRemoveEventListener b e k v = do
_k <- (jsValFromString b) k
void $ (invokeOn2 b) e "removeEventListener" _k v
-- | Gets a JavaScript property as a bool, returning @Nothing@ if the object being called is null or undefined or the property cannot be cast to a bool.
getPropertyAsBool
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the object containing the property
-> String -- ^ the property name
-> IO (Maybe Bool) -- ^ the response if the property is a bool, else Nothing
getPropertyAsBool b o k = do
_v <- (getPropertyAsOpaque b) o k
maybe (pure Nothing) (\x -> (castToBool b) x) _v
-- | Gets a JavaScript property as a double, returning @Nothing@ if the object being called is null or undefined or the property cannot be cast to a double.
getPropertyAsDouble
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the object containing the property
-> String -- ^ the property name
-> IO (Maybe Double) -- ^ the response if the property is a double, else Nothing
getPropertyAsDouble b o k = do
_v <- (getPropertyAsOpaque b) o k
maybe (pure Nothing) (\x -> (castToDouble b) x) _v
-- | Gets a JavaScript property as an int, returning @Nothing@ if the object being called is null or undefined or the property cannot be cast to an int.
getPropertyAsInt
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the object containing the property
-> String -- ^ the property name
-> IO (Maybe Int) -- ^ the response if the property is an int, else Nothing
getPropertyAsInt b o k = do
_v <- (getPropertyAsOpaque b) o k
maybe (pure Nothing) (\x -> (castToInt b) x) _v
-- | Gets a JavaScript property as an string, returning @Nothing@ if the object being called is null or undefined.
getPropertyAsString
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the object containing the property
-> String -- ^ the property name
-> IO (Maybe String) -- ^ the response
getPropertyAsString b o k = do
_v <- (getPropertyAsOpaque b) o k
maybe (pure Nothing) (\x -> (castToString b) x) _v
-- | Takes an element and clicks it. Useful for testing. See [HTMLElement.click](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click)
htmlElemenetClick :: Browserful jsval -> jsval -> IO ()
htmlElemenetClick b e = void $ (invokeOn0 b) e "click"
-- | Logs a string. See [Console.log](https://developer.mozilla.org/en-US/docs/Web/API/Console/log)
consoleLogS :: Browserful jsval -> String -> IO ()
consoleLogS b s = do
_s <- (jsValFromString b) s
(consoleLog b) _s
-- | Takes a node and appends a child. See [Node.appendChild](https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild)
nodeAppendChild
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the node
-> jsval -- ^ the child to append
-> IO () -- ^ returns nothing
nodeAppendChild b e v = void $ (invokeOn1 b) e "appendChild" v
-- | Get the children of a node. See [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes)
nodeChildNodes
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the node
-> IO (Maybe [jsval])
nodeChildNodes b v = do
_cn <- (getPropertyAsOpaque b) v "childNodes"
maybe (pure Nothing) (\x -> (castToArray b) x) _cn
-- | Inserts a node into an element before another node. See [Node.insertBefore](https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore)
nodeInsertBefore
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the parent element
-> jsval -- ^ the new node
-> jsval -- ^ the pre-existing node
-> IO () -- ^ returns nothing
nodeInsertBefore b e k v = void $ (invokeOn2 b) e "insertBefore" k v
-- | Removes a child from a parent node. See [Node.removeChild](https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild)
nodeRemoveChild
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the parent element
-> jsval -- ^ the child to remove
-> IO () -- ^ returns nothing
nodeRemoveChild b e v = void $ (invokeOn1 b) e "removeChild" v
-- | Gets the text content of a node. See [Node.textContent](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent)
nodeTextContent
:: Browserful jsval -- ^ the browser
-> jsval -- ^ the node
-> IO (Maybe String) -- ^ the text content as a string
nodeTextContent b e = do
_tc <- (getPropertyAsOpaque b) e "textContent"
maybe (pure Nothing) (\x -> (castToString b) x) _tc