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 -> PwNode state jsval) -> state -> Browserful jsval -> String -> IO ()
- plzwrk' :: (state -> PwNode state jsval) -> state -> Browserful jsval -> IO ()
- plzwrk'_ :: (() -> PwNode () jsval) -> Browserful jsval -> IO ()
- plzwrkSSR :: (state -> PwNode state jsval) -> state -> Browserful jsval -> String -> IO ()
- toHTML :: (state -> PwNode state jsval) -> state -> String
- data PwNode s opq
- = PwElement {
- _elt_tag :: String
- _elt_attrs :: [(String, s -> PwAttribute s opq)]
- _elt_children :: [s -> PwNode s opq]
- | PwTextNode { }
- = PwElement {
- data PwAttribute s opq
- = PwTextAttribute String
- | PwFunctionAttribute (opq -> s -> IO s)
- 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
- hsx :: QuasiQuoter
- hsx' :: QuasiQuoter
- plusplus :: [a] -> [a] -> [a]
- pF :: (opq -> s -> IO s) -> s -> PwAttribute s opq
- pT :: String -> s -> PwAttribute 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 -> PwNode 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 -> PwNode state jsval) -> state -> Browserful jsval -> IO () Source #
A variation of plzwrk that inserts the node as a child of the document's body.
plzwrk'_ :: (() -> PwNode () jsval) -> Browserful jsval -> IO () Source #
A variation of plzwrk that takes no state.
:: (state -> PwNode 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,
:: (state -> PwNode state jsval) | A function that takes a state and produces a DOM |
-> state | An initial state |
-> String | The resulting HTML |
Converts a PwNode to HTML.
A DOM node.
The easiest way to create nodes is using tags such as
span
or br
.
PwNodes can be created for arbitrary tags using the PwElement
constructor.
PwNode 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 -> PwNode s opq)
.
PwElement | |
| |
PwTextNode | |
data PwAttribute s opq Source #
PwTextAttribute String | |
PwFunctionAttribute (opq -> s -> IO s) |
Instances
Show (PwAttribute s opq) Source # | |
Defined in Web.Framework.Plzwrk.Base showsPrec :: Int -> PwAttribute s opq -> ShowS # show :: PwAttribute s opq -> String # showList :: [PwAttribute 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 | |
|
hsx :: QuasiQuoter Source #
hsx' :: QuasiQuoter Source #
pF :: (opq -> s -> IO s) -> s -> PwAttribute s opq Source #
Creates a callback attribute wrapped in an applicative functor
pT :: String -> s -> PwAttribute s opq Source #
Creates a text attribute wrapped in an applicative functor
:: 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