From 38ade1af70a08d278a56bcec4f7a9e32b09f4336 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 29 Jul 2012 00:55:22 -0400 Subject: better noscript UI --- Assistant/Threads/WebApp.hs | 44 +++++++++++++++++++++----------------------- templates/longpolling.julius | 6 +++--- templates/metarefresh.hamlet | 2 +- templates/transfers.hamlet | 13 +++++++++++++ 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/Assistant/Threads/WebApp.hs b/Assistant/Threads/WebApp.hs index d9d98e1bf..e47ee9fda 100644 --- a/Assistant/Threads/WebApp.hs +++ b/Assistant/Threads/WebApp.hs @@ -51,6 +51,7 @@ staticFiles "static" mkYesod "WebApp" [parseRoutes| / HomeR GET /noscript NoScriptR GET +/noscriptauto NoScriptAutoR GET /transfers/#NotificationId TransfersR GET /config ConfigR GET /static StaticR Static getStatic @@ -86,7 +87,7 @@ instance Yesod WebApp where makeSessionBackend = webAppSessionBackend jsLoader _ = BottomOfHeadBlocking -{- Add to any widget to make it auto-update. +{- Add to any widget to make it auto-update using long polling. - - The widget should have a html element with an id=ident, which will be - replaced when it's updated. @@ -97,25 +98,16 @@ instance Yesod WebApp where - - ms_delay is how long to delay between AJAX updates - ms_startdelay is how long to delay before updating with AJAX at the start - - ms_refreshdelay is how long to delay between refreshes, when not using AJAX -} -autoUpdate :: Text -> Route WebApp -> Route WebApp -> Int -> Int -> Int -> Widget -autoUpdate ident gethtml home ms_delay ms_startdelay ms_refreshdelay = do - {- Fallback refreshing is provided for non-javascript browsers. -} - let delayseconds = ms_to_seconds ms_refreshdelay - toWidgetHead $(hamletFile $ hamletTemplate "metarefresh") - - {- Use long polling to update the transfers display. -} +autoUpdate :: Text -> Route WebApp -> Route WebApp -> Int -> Int -> Widget +autoUpdate ident gethtml home ms_delay ms_startdelay = do let delay = show ms_delay let startdelay = show ms_startdelay $(widgetFile "longpolling") - where - ms_to_seconds :: Int -> Int - ms_to_seconds ms = ceiling ((fromIntegral ms :: Double) / 1000) {- A display of currently running and queued transfers. -} -transfersDisplay :: Widget -transfersDisplay = do +transfersDisplay :: Bool -> Widget +transfersDisplay warnNoScript = do webapp <- lift getYesod current <- liftIO $ runThreadState (threadState webapp) $ M.toList . currentTransfers @@ -132,8 +124,8 @@ getNotificationBroadcaster :: WebApp -> IO NotificationBroadcaster getNotificationBroadcaster webapp = notificationBroadcaster <$> getDaemonStatus (daemonStatus webapp) -dashboard :: Widget -dashboard = transfersDisplay +dashboard :: Bool -> Widget +dashboard warnNoScript = transfersDisplay warnNoScript getHomeR :: Handler RepHtml getHomeR = defaultLayout $ do @@ -142,18 +134,24 @@ getHomeR = defaultLayout $ do nid <- liftIO $ notificationHandleToId <$> (newNotificationHandle =<< getNotificationBroadcaster webapp) autoUpdate transfersDisplayIdent (TransfersR nid) HomeR - (10 :: Int) (10 :: Int) (3000 :: Int) + (10 :: Int) (10 :: Int) - dashboard + dashboard True {- Same as HomeR, except with no javascript, so it doesn't allocate - - new resources each time the page is refreshed. -} -getNoScriptR :: Handler RepHtml -getNoScriptR = defaultLayout $ do + - new resources each time the page is refreshed, and with autorefreshing + - via meta refresh. -} +getNoScriptAutoR :: Handler RepHtml +getNoScriptAutoR = defaultLayout $ do let ident = NoScriptR let delayseconds = 3 :: Int + let this = NoScriptAutoR toWidgetHead $(hamletFile $ hamletTemplate "metarefresh") - dashboard + dashboard False + +getNoScriptR :: Handler RepHtml +getNoScriptR = defaultLayout $ + dashboard True {- Called by client to get a display of currently in process transfers. - @@ -170,7 +168,7 @@ getTransfersR nid = do b <- liftIO $ getNotificationBroadcaster webapp liftIO $ waitNotification $ notificationHandleFromId b nid - page <- widgetToPageContent transfersDisplay + page <- widgetToPageContent $ transfersDisplay False hamletToRepHtml $ [hamlet|^{pageBody page}|] getConfigR :: Handler RepHtml diff --git a/templates/longpolling.julius b/templates/longpolling.julius index 945ef1251..926249a35 100644 --- a/templates/longpolling.julius +++ b/templates/longpolling.julius @@ -17,7 +17,7 @@ $.LongPoll = (function() { 'dataType': 'html', 'success': function(data, status, jqxhr) { $('##{ident}').replaceWith(data); - setTimeout($.LongPoll.send, #{delay}); + setTimeout($.LongPoll.send, #{show delay}); numerrs=0; }, 'error': function(jqxhr, msg, e) { @@ -26,7 +26,7 @@ $.LongPoll = (function() { window.close(); } else { - setTimeout($.LongPoll.send, #{delay}); + setTimeout($.LongPoll.send, #{show delay}); } }, }); @@ -35,7 +35,7 @@ $.LongPoll = (function() { }()); $(document).bind('ready.app', function() { - setTimeout($.LongPoll.send, #{startdelay}); + setTimeout($.LongPoll.send, #{show startdelay}); }); })( jQuery ); diff --git a/templates/metarefresh.hamlet b/templates/metarefresh.hamlet index ddbd225fe..89a2e0b2c 100644 --- a/templates/metarefresh.hamlet +++ b/templates/metarefresh.hamlet @@ -1,2 +1,2 @@