implementation module PMHtml import StdList import HTML, Text, Maybe makePage :: String String [HtmlTag] -> HtmlTag makePage title message content = HtmlTag [] [HeadTag [] head, BodyTag [] body] where head = [ TitleTag [] [Text title] , LinkTag [RelAttr "stylesheet", HrefAttr "/PM.css", TypeAttr "text/css"] [] , ScriptTag [SrcAttr "/PM.js", TypeAttr "text/javascript"] [] ] body = [ DivTag [IdAttr "main-title"] [H1Tag [] [Text title]] , DivTag [IdAttr "main-menu"] makeMenu , DivTag [IdAttr "main-content"] (msg ++ content) ] msg = if (message <> "") [DivTag [IdAttr "main-message"] [ImgTag [SrcAttr "/icons/information.png"],Text message]] [] makeMenu :: [HtmlTag] makeMenu = [ATag [HrefAttr link] [Text title] \\ (title, link) <- items] where items = [("Projects","/projects"),("Employees","/employees")] makeForm :: String [HtmlTag] -> HtmlTag makeForm action content = FormTag [ActionAttr action, MethodAttr "post"] content makeTable :: [String] [[HtmlTag]] -> HtmlTag makeTable headers rows = TableTag [ClassAttr "pm-table"] [head:body] where head = TrTag [] [ThTag [] [Text th] \\ th <- headers] body = [TrTag [] [TdTag [] [td] \\ td <- row] \\ row <- rows ] makeFormLayout :: [(String,[HtmlTag])] -> HtmlTag makeFormLayout rows = TableTag [ClassAttr "pm-formlayout"] content where content = [TrTag [] [ThTag [] [Text label], TdTag [] field] \\ (label,field) <- rows] makeFieldSet :: String [HtmlTag] -> HtmlTag makeFieldSet title content = FieldsetTag [ClassAttr "pm-fieldset"] [LegendTag [] [Text title] : content] makeToolbar :: [HtmlTag] -> HtmlTag makeToolbar content = DivTag [ClassAttr "pm-toolbar"] content makeLinkButton :: String String (Maybe String) -> HtmlTag makeLinkButton label href icon = ButtonTag [OnclickAttr ("window.location='" +++ href +++ "'; return false;")] ((icontag icon)++ [Text label]) where icontag Nothing = [] icontag (Just file) = [ImgTag [SrcAttr ("/icons/" +++ file +++ ".png")]] makeSubmitButton :: String (Maybe String) -> HtmlTag makeSubmitButton label icon = ButtonTag [TypeAttr "submit"] ((icontag icon)++ [Text label]) where icontag Nothing = [] icontag (Just file) = [ImgTag [SrcAttr ("/icons/" +++ file +++ ".png")]] makeIntInput :: String Int -> HtmlTag makeIntInput name value = InputTag [ClassAttr "pm-int",NameAttr name, ValueAttr (toString value), SizeAttr "4"] makeBoolInput :: String Bool -> HtmlTag makeBoolInput name value = InputTag ([ClassAttr "pm-bool",NameAttr name, TypeAttr "checkbox", ValueAttr "True"] ++ (if value [CheckedAttr] [])) makeStringInput :: String String -> HtmlTag makeStringInput name value = InputTag [ClassAttr "pm-string",NameAttr name, ValueAttr value] makeHiddenInput :: String a -> HtmlTag | toString a makeHiddenInput name value = InputTag [NameAttr name, TypeAttr "hidden", ValueAttr (toString value)] makeSubsetInput :: String [String] [String] -> HtmlTag makeSubsetInput name full sub = DivTag [] [TableTag [ClassAttr "pm-subset"] [TrTag [] header, TrTag [] [left,buttons,right]],input] where header = [ThTag [] [Text "Available"],ThTag [] [], ThTag [] [Text "Selected"]] left = TdTag [] [SelectTag [IdAttr (name +++ "-left"),SizeAttr "5",MultipleAttr] [OptionTag [ValueAttr option] [Text option] \\ option <- (removeMembers full sub)]] right = TdTag [] [SelectTag [IdAttr (name +++ "-right"),SizeAttr "5",MultipleAttr] [OptionTag [ValueAttr option] [Text option] \\ option <- sub]] buttons = TdTag [] [ ButtonTag [OnclickAttr ("subset_select('" +++ name +++ "');return false;")] [ImgTag [SrcAttr "/icons/arrow_right.png",AltAttr ">"] ] , BrTag [] , ButtonTag [OnclickAttr ("subset_deselect('" +++ name +++ "');return false;")] [ImgTag [SrcAttr "/icons/arrow_left.png",AltAttr "<"]] ] input = InputTag [TypeAttr "hidden", NameAttr name, IdAttr (name +++ "-value"), ValueAttr (join "-" sub)] makeIntSelect :: String Int [(Int,String)] -> HtmlTag makeIntSelect name value options = SelectTag [ClassAttr "pm-int-sel", NameAttr name] [OptionTag [] [Text "Select..."] :[OptionTag ([ValueAttr (toString v)] ++ (if (v == value) [SelectedAttr] []) ) [Text l] \\ (v,l) <- options]] joinHtml :: HtmlTag [HtmlTag] -> [HtmlTag] joinHtml sep [] = [] joinHtml sep [x] = [x] joinHtml sep [x:xs] = [x,sep:joinHtml sep xs] makeDoneIcon :: Bool -> HtmlTag makeDoneIcon True = ImgTag [SrcAttr "/icons/tick.png", AltAttr "Done"] makeDoneIcon False = ImgTag [SrcAttr "/icons/cross.png", AltAttr "Not done"]