7 | import Web.Raw.Geometry
8 | import public Text.HTML.Ref
9 | import public Text.HTML.Tag
15 | 0 ElemType : Ref t -> Type
16 | ElemType (Id _) = Element
17 | ElemType (Elem _) = Element
18 | ElemType Body = HTMLElement
19 | ElemType Document = Document
20 | ElemType Window = Window
31 | strictGetElementById : SafeCast t => Maybe String -> (id : String) -> JSIO t
32 | strictGetElementById mtag id = do
33 | Nothing <- castElementById t id | Just t => pure t
34 | liftJSIO $
throwError $
35 | let tag := fromMaybe "element" mtag
36 | in Caught "Web.MVC.Output.strictGetElementById: Could not find \{tag} with id \{id}"
43 | strictGetHTMLElementById : (tag,id : String) -> JSIO HTMLElement
44 | strictGetHTMLElementById = strictGetElementById . Just
51 | getElementByRef : (r : Ref t) -> JSIO (ElemType r)
52 | getElementByRef (Id {tag} id) = strictGetElementById (Just tag) id
53 | getElementByRef (Elem id) = strictGetElementById Nothing id
54 | getElementByRef Body = body
55 | getElementByRef Document = document
56 | getElementByRef Window = window
59 | err = "Web.MVC.Output.castElementByRef"
66 | castElementByRef : {0 x : k} -> SafeCast t => Ref x -> JSIO t
67 | castElementByRef (Id {tag} id) = strictGetElementById (Just tag) id
68 | castElementByRef (Elem id) = strictGetElementById Nothing id
69 | castElementByRef Body = body >>= tryCast err
70 | castElementByRef Document = document >>= tryCast err
71 | castElementByRef Window = window >>= tryCast err
73 | setVM : Ref t -> ValidityTag t -> String -> JSIO ()
74 | setVM r SVButton s = castElementByRef r >>= \x => HTMLButtonElement.setCustomValidity x s
75 | setVM r SVFieldSet s = castElementByRef r >>= \x => HTMLFieldSetElement.setCustomValidity x s
76 | setVM r SVInput s = castElementByRef r >>= \x => HTMLInputElement.setCustomValidity x s
77 | setVM r SVObject s = castElementByRef r >>= \x => HTMLObjectElement.setCustomValidity x s
78 | setVM r SVOutput s = castElementByRef r >>= \x => HTMLOutputElement.setCustomValidity x s
79 | setVM r SVSelect s = castElementByRef r >>= \x => HTMLSelectElement.setCustomValidity x s
80 | setVM r SVTextArea s = castElementByRef r >>= \x => HTMLTextAreaElement.setCustomValidity x s
82 | setVal : Ref t -> ValueTag t -> String -> JSIO ()
83 | setVal r VButton s = castElementByRef r >>= (HTMLButtonElement.value =. s)
84 | setVal r VData s = castElementByRef r >>= (HTMLDataElement.value =. s)
85 | setVal r VInput s = castElementByRef r >>= (HTMLInputElement.value =. s)
86 | setVal r VOption s = castElementByRef r >>= (HTMLOptionElement.value =. s)
87 | setVal r VOutput s = castElementByRef r >>= (HTMLOutputElement.value =. s)
88 | setVal r VParam s = castElementByRef r >>= (HTMLParamElement.value =. s)
89 | setVal r VSelect s = castElementByRef r >>= (HTMLSelectElement.value =. s)
90 | setVal r VTextArea s = castElementByRef r >>= (HTMLTextAreaElement.value =. s)
93 | setValidityMessage : Ref t -> ValidityTag t => String -> JSIO ()
94 | setValidityMessage r = setVM r %search
97 | setValue : Ref t -> ValueTag t => String -> JSIO ()
98 | setValue r = setVal r %search
104 | nodeList : DocumentFragment -> List (HSum [Node,String])
105 | nodeList df = [inject $
df :> Node]
109 | replaceChildren : Element -> DocumentFragment -> JSIO ()
110 | replaceChildren elem = replaceChildren elem . nodeList
114 | appendDF : Element -> DocumentFragment -> JSIO ()
115 | appendDF elem = append elem . nodeList
119 | prependDF : Element -> DocumentFragment -> JSIO ()
120 | prependDF elem = prepend elem . nodeList
124 | afterDF : Element -> DocumentFragment -> JSIO ()
125 | afterDF elem = after elem . nodeList
129 | beforeDF : Element -> DocumentFragment -> JSIO ()
130 | beforeDF elem = before elem . nodeList
134 | replaceDF : Element -> DocumentFragment -> JSIO ()
135 | replaceDF elem = replaceWith elem . nodeList
142 | toRect : DOMRect -> JSIO Rect
145 | (DOMRectReadOnly.x r)
146 | (DOMRectReadOnly.y r)
147 | (DOMRectReadOnly.height r)
148 | (DOMRectReadOnly.width r)
149 | (DOMRectReadOnly.top r)
150 | (DOMRectReadOnly.bottom r)
151 | (DOMRectReadOnly.left r)
152 | (DOMRectReadOnly.right r)
156 | boundingRect : {0 x : k} -> Ref x -> JSIO Rect
157 | boundingRect ref = do
158 | el <- castElementByRef {t = Element} ref
159 | r <- Element.getBoundingClientRect el