summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Assistant/Threads/WebApp.hs20
-rw-r--r--Utility/Yesod.hs4
-rw-r--r--templates/default-layout.hamlet1
-rw-r--r--templates/longpolling.julius25
-rw-r--r--templates/poll.hamlet2
5 files changed, 50 insertions, 2 deletions
diff --git a/Assistant/Threads/WebApp.hs b/Assistant/Threads/WebApp.hs
index d663b0cd5..2d78609e8 100644
--- a/Assistant/Threads/WebApp.hs
+++ b/Assistant/Threads/WebApp.hs
@@ -21,9 +21,11 @@ import Git
import Yesod
import Yesod.Static
import Text.Hamlet
+import Text.Julius
import Network.Socket (PortNumber)
import Text.Blaze.Renderer.String
import Data.Text
+import Data.Time.Clock
thisThread :: String
thisThread = "WebApp"
@@ -39,6 +41,7 @@ staticFiles "static"
mkYesod "WebApp" [parseRoutes|
/ HomeR GET
+/poll PollR GET
/config ConfigR GET
/static StaticR Static getStatic
|]
@@ -61,10 +64,25 @@ instance Yesod WebApp where
excludeStatic (p:_) = p /= "static"
makeSessionBackend = webAppSessionBackend
+ jsLoader _ = BottomOfHeadBlocking
getHomeR :: Handler RepHtml
getHomeR = defaultLayout $ do
- [whamlet|Hello, World<p><a href="@{ConfigR}">config|]
+ [whamlet|<div id="poll">Starting ...|]
+ addScriptRemote "http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"
+ toWidgetBody $(juliusFile $ juliusTemplate "longpolling")
+ [whamlet|<p><a href="@{ConfigR}">config|]
+
+{- Called by client to poll for a new webapp status display.
+ -
+ - Should block until the status has changed, and then return a div
+ - containing the new status, which will be inserted into the calling page.
+ -}
+getPollR :: Handler RepHtml
+getPollR = do
+ webapp <- getYesod
+ time <- show <$> liftIO getCurrentTime
+ hamletToRepHtml $(hamletFile $ hamletTemplate "poll")
getConfigR :: Handler RepHtml
getConfigR = defaultLayout $ do
diff --git a/Utility/Yesod.hs b/Utility/Yesod.hs
index 05f684490..a0dd3bdd2 100644
--- a/Utility/Yesod.hs
+++ b/Utility/Yesod.hs
@@ -16,3 +16,7 @@ template f = "templates" </> f
{- A hamlet template file. -}
hamletTemplate :: FilePath -> FilePath
hamletTemplate f = template f ++ ".hamlet"
+
+{- A julius template file. -}
+juliusTemplate :: FilePath -> FilePath
+juliusTemplate f = template f ++ ".julius"
diff --git a/templates/default-layout.hamlet b/templates/default-layout.hamlet
index e07addc8e..bd16969f9 100644
--- a/templates/default-layout.hamlet
+++ b/templates/default-layout.hamlet
@@ -3,7 +3,6 @@ $doctype 5
<head>
<title>#{baseTitle webapp} #{pageTitle page}
<link rel="icon" href=@{StaticR favicon_ico} type="image/x-icon">
-
^{pageHead page}
<body>
$maybe msg <- mmsg
diff --git a/templates/longpolling.julius b/templates/longpolling.julius
new file mode 100644
index 000000000..38ecbc77d
--- /dev/null
+++ b/templates/longpolling.julius
@@ -0,0 +1,25 @@
+// Uses long-polling to update a div with id=poll.
+// The PollR route should return a new div, also with id=poll.
+
+(function( $ ) {
+
+$.LongPoll = (function() {
+ return {
+ send : function() {
+ $.ajax({
+ 'url': '@{PollR}',
+ 'dataType': 'html',
+ 'success': function(data, status, jqxhr) {
+ $('#poll').replaceWith(data);
+ setTimeout($.LongPoll.send, 3000);
+ },
+ });
+ }
+ }
+}());
+
+$(document).bind('ready.app', function() {
+ setTimeout($.LongPoll.send, 40);
+});
+
+})( jQuery );
diff --git a/templates/poll.hamlet b/templates/poll.hamlet
new file mode 100644
index 000000000..fcdd705b6
--- /dev/null
+++ b/templates/poll.hamlet
@@ -0,0 +1,2 @@
+<div id="poll">
+ polled at #{time}