Copyright | (c) Mike Solomon 2020 |
---|---|
License | GPL-3 |
Maintainer | mike@meeshkan.com |
Stability | experimental |
Portability | POSIX, Windows |
Safe Haskell | None |
Language | Haskell2010 |
This module contains the base functions for plzwrk, notably the family of plzwrk functions needed for plzwrk to work. It also exports most of the utility functions used for building web applications, like event handling and attribute wrangling.
Synopsis
- plzwrk :: (state -> Node state jsval) -> state -> Browserful jsval -> String -> IO ()
- plzwrk' :: (state -> Node state jsval) -> state -> Browserful jsval -> IO ()
- plzwrk'_ :: (() -> Node () jsval) -> Browserful jsval -> IO ()
- plzwrkSSR :: (state -> Node state jsval) -> state -> Browserful jsval -> String -> IO ()
- toHTML :: (state -> Node state jsval) -> state -> String
- data Node s opq
- = Element {
- _elt_tag :: String
- _elt_attrs :: s -> Attributes s opq
- _elt_children :: [s -> Node s opq]
- | TextNode { }
- = Element {
- data Attributes s opq = MkAttributes {}
- data Browserful jsval = Browserful {
- castToArray :: jsval -> IO (Maybe [jsval])
- castToBool :: jsval -> IO (Maybe Bool)
- castToByteString :: jsval -> IO (Maybe ByteString)
- castToDouble :: jsval -> IO (Maybe Double)
- castToInt :: jsval -> IO (Maybe Int)
- castToString :: jsval -> IO (Maybe String)
- consoleLog :: jsval -> IO ()
- defaultRequestInit :: RequestInit jsval
- documentBody :: IO jsval
- documentCreateElement :: String -> IO jsval
- documentCreateTextNode :: String -> IO jsval
- documentGetElementById :: String -> IO (Maybe jsval)
- documentHead :: IO jsval
- fetch :: String -> RequestInit jsval -> IO jsval
- getPropertyAsOpaque :: jsval -> String -> IO (Maybe jsval)
- invokeOn0 :: jsval -> String -> IO jsval
- invokeOn1 :: jsval -> String -> jsval -> IO jsval
- invokeOn2 :: jsval -> String -> jsval -> jsval -> IO jsval
- jsValFromArray :: [jsval] -> IO jsval
- jsValFromBool :: Bool -> IO jsval
- jsValFromByteString :: ByteString -> IO jsval
- jsValFromDouble :: Double -> IO jsval
- jsValFromInt :: Int -> IO jsval
- jsValFromString :: String -> IO jsval
- makeObject :: IO jsval
- mathRandom :: IO Double
- setValue :: jsval -> String -> jsval -> IO ()
- _freeCallback :: jsval -> IO ()
- _makeHaskellCallback :: (jsval -> IO ()) -> IO jsval
- (<.>) :: (s -> Attributes s opq) -> (s -> Attributes s opq) -> s -> Attributes s opq
- wStyle :: String -> String -> s -> Attributes s opq
- wStyle' :: String -> String -> Attributes s opq
- wStyles :: [(String, String)] -> s -> Attributes s opq
- wStyles' :: [(String, String)] -> Attributes s opq
- wClass :: String -> s -> Attributes s opq
- wClass' :: String -> Attributes s opq
- wClasses :: [String] -> s -> Attributes s opq
- wClasses' :: [String] -> Attributes s opq
- wOnClick :: (opq -> s -> IO s) -> s -> Attributes s opq
- wOnClick' :: (opq -> s -> IO s) -> Attributes s opq
- wId :: String -> s -> Attributes s opq
- wId' :: String -> Attributes s opq
- wOnInput :: (opq -> s -> IO s) -> s -> Attributes s opq
- wOnInput' :: (opq -> s -> IO s) -> Attributes s opq
- wAttr :: String -> String -> s -> Attributes s opq
- wAttr' :: String -> String -> Attributes s opq
- wAttrs :: [(String, String)] -> s -> Attributes s opq
- wAttrs' :: [(String, String)] -> Attributes s opq
- eventPreventDefault :: Browserful jsval -> jsval -> IO ()
- eventTargetBlur :: Browserful jsval -> jsval -> IO ()
- eventTargetValue :: Browserful jsval -> jsval -> IO (Maybe String)
- elementSetAttribute :: Browserful jsval -> jsval -> String -> String -> IO ()
- elementTagName :: Browserful jsval -> jsval -> IO (Maybe String)
- eventTargetAddEventListener :: Browserful jsval -> jsval -> String -> jsval -> IO ()
- eventTargetRemoveEventListener :: Browserful jsval -> jsval -> String -> jsval -> IO ()
- getPropertyAsBool :: Browserful jsval -> jsval -> String -> IO (Maybe Bool)
- getPropertyAsDouble :: Browserful jsval -> jsval -> String -> IO (Maybe Double)
- getPropertyAsInt :: Browserful jsval -> jsval -> String -> IO (Maybe Int)
- getPropertyAsString :: Browserful jsval -> jsval -> String -> IO (Maybe String)
- htmlElemenetClick :: Browserful jsval -> jsval -> IO ()
- consoleLogS :: Browserful jsval -> String -> IO ()
- nodeAppendChild :: Browserful jsval -> jsval -> jsval -> IO ()
- nodeChildNodes :: Browserful jsval -> jsval -> IO (Maybe [jsval])
- nodeInsertBefore :: Browserful jsval -> jsval -> jsval -> jsval -> IO ()
- nodeRemoveChild :: Browserful jsval -> jsval -> jsval -> IO ()
- nodeTextContent :: Browserful jsval -> jsval -> IO (Maybe String)
Documentation
:: (state -> Node state jsval) | A function that takes a state and produces a DOM |
-> state | An initial state |
-> Browserful jsval | A browser implementation, ie Asterius or the mock browser |
-> String | The id of the element into which the DOM is inserted. Note that plzwrk manages all children under this element. Touching the managed elements can break plzwrk. |
-> IO () | Returns nothing |
The main function that makes a web app.
plzwrk' :: (state -> Node state jsval) -> state -> Browserful jsval -> IO () Source #
A variation of plzwrk that inserts the node as a child of the document's body.
plzwrk'_ :: (() -> Node () jsval) -> Browserful jsval -> IO () Source #
A variation of plzwrk that takes no state.
:: (state -> Node state jsval) | A function that takes a state and produces a DOM |
-> state | An initial state |
-> Browserful jsval | A browser implementation, ie Asterius or the mock browser |
-> String | The id of the element into which the DOM is inserted. Note that plzwrk manages all children under this element. Touching the managed elements can break plzwrk. |
-> IO () | Returns nothing |
A variant of plzwrk that acts on a node already rendered to the DOM, ie by server-side rendering. It assumes the node has been rendered with the same state-to-node function as well as the same state.
:: (state -> Node state jsval) | A function that takes a state and produces a DOM |
-> state | An initial state |
-> String | The resulting HTML |
Converts a Node to HTML.
A DOM node.
The easiest way to create nodes is using tags such as
span
or br
.
Nodes can be created for arbitrary tags using the Element
constructor.
Node is parameterized by two types
* s
- the type of the state
* opq
- the type of an opaque object in JavaScript
Note that nodes, when passed as an arguemnt to plzwrk
, need
to be Applicative Functors in the form (s -> Node s opq)
.
Element | |
| |
TextNode | |
data Attributes s opq Source #
Attributes for a DOM Node.
Attributes are parameterized by two types
* s
- the type of the state
* opq
- the type of an opaque object in JavaScript
You will rarely need to instantiate Attributes
yourself,
as it is easier to work with utility functions like wId
,
wStyle
etc that produce Applicative Functors with signature
(s -> Attributes s opq)
. These AFs are used in the Node
data.
Instances
Show (Attributes s opq) Source # | |
Defined in Web.Framework.Plzwrk.Base showsPrec :: Int -> Attributes s opq -> ShowS # show :: Attributes s opq -> String # showList :: [Attributes s opq] -> ShowS # |
data Browserful jsval Source #
A data class holding functions that operate on opaque
JavaScript types, parameterized by jsval
. When possible,
the real names of browser functions like addEventListener
and appendChild
are used.
Browserful is currently implemented as data instead of as
a typeclass because it is unclear what type of additional
monadic transformer around IO would be most appropriate to
retain the state of jsval
objects, whereas when part of
a dataclass, the state retention is abstracted away.
Browserful | |
|
(<.>) :: (s -> Attributes s opq) -> (s -> Attributes s opq) -> s -> Attributes s opq Source #
Merges two Attributes
wStyle :: String -> String -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from a single style.
wStyle' :: String -> String -> Attributes s opq Source #
Constrcts an Attributes
from a single style.
wStyles :: [(String, String)] -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from a list of styles.
wStyles' :: [(String, String)] -> Attributes s opq Source #
Constrcts an Attributes
from a list of styles.
wClass :: String -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from a single class.
wClass' :: String -> Attributes s opq Source #
Constrcts an Attributes
from a single class.
wClasses :: [String] -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from a list of clases.
wClasses' :: [String] -> Attributes s opq Source #
Constrcts an Attributes
from a list of classes.
wOnClick :: (opq -> s -> IO s) -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from an onClick
callback.
wOnClick' :: (opq -> s -> IO s) -> Attributes s opq Source #
Constrcts an Attributes
from an onClick
callback.
wId :: String -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor with a given id.
wId' :: String -> Attributes s opq Source #
Constrcts an Attributes
with a given id.
wOnInput :: (opq -> s -> IO s) -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from an onInput
callback.
wOnInput' :: (opq -> s -> IO s) -> Attributes s opq Source #
Constrcts an Attributes
from an onInput
callback.
wAttr :: String -> String -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from a single attribute.
wAttr' :: String -> String -> Attributes s opq Source #
Constrcts an Attributes
from a single attribute.
wAttrs :: [(String, String)] -> s -> Attributes s opq Source #
Constrcts a stateful Attributes
applicative functor from a list of attributes.
wAttrs' :: [(String, String)] -> Attributes s opq Source #
Constrcts an Attributes
from a list of attributes.
:: Browserful jsval | the browser |
-> jsval | the event |
-> IO () | returns nothing |
Take an event and prevent the default.
:: Browserful jsval | the browser |
-> jsval | the event |
-> IO () | returns nothing |
From an event, takes the target and blurs it.
:: Browserful jsval | the browser |
-> jsval | the event |
-> IO (Maybe String) | the target value, or nothing if it doesn't exist |
From an event, gets the target's value.
:: Browserful jsval | The browser |
-> jsval | the node |
-> String | the attribute name |
-> String | the attribute |
-> IO () | returns nothing |
Sets on an element an attribute. See Element.setAttribute
:: Browserful jsval | the browser |
-> jsval | the element |
-> IO (Maybe String) | Returns the tag name |
Gets the tag name of an element. See Element.tagName
eventTargetAddEventListener Source #
:: 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 |
Takes a target and an event name and adds a listener. See EventTarget.addEventListener
eventTargetRemoveEventListener Source #
:: 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 |
Takes a target and an event name and removes a listener. See EventTarget.removeEventListener
:: 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 |
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.
:: 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 |
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.
:: 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 |
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.
:: Browserful jsval | the browser |
-> jsval | the object containing the property |
-> String | the property name |
-> IO (Maybe String) | the response |
Gets a JavaScript property as an string, returning Nothing
if the object being called is null or undefined.
htmlElemenetClick :: Browserful jsval -> jsval -> IO () Source #
Takes an element and clicks it. Useful for testing. See HTMLElement.click
consoleLogS :: Browserful jsval -> String -> IO () Source #
Logs a string. See Console.log
:: Browserful jsval | the browser |
-> jsval | the node |
-> jsval | the child to append |
-> IO () | returns nothing |
Takes a node and appends a child. See Node.appendChild
:: Browserful jsval | the browser |
-> jsval | the node |
-> IO (Maybe [jsval]) |
Get the children of a node. See Node.childNodes
:: Browserful jsval | the browser |
-> jsval | the parent element |
-> jsval | the new node |
-> jsval | the pre-existing node |
-> IO () | returns nothing |
Inserts a node into an element before another node. See Node.insertBefore
:: Browserful jsval | the browser |
-> jsval | the parent element |
-> jsval | the child to remove |
-> IO () | returns nothing |
Removes a child from a parent node. See Node.removeChild
:: Browserful jsval | the browser |
-> jsval | the node |
-> IO (Maybe String) | the text content as a string |
Gets the text content of a node. See Node.textContent