2012-07-31 05:11:32 +00:00
|
|
|
{- git-annex assistant webapp dashboard
|
|
|
|
-
|
|
|
|
- Copyright 2012 Joey Hess <joey@kitenet.net>
|
|
|
|
-
|
2012-09-24 18:48:47 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2012-07-31 05:11:32 +00:00
|
|
|
-}
|
|
|
|
|
2012-08-03 13:44:43 +00:00
|
|
|
{-# LANGUAGE CPP, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings, RankNTypes #-}
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
module Assistant.WebApp.DashBoard where
|
|
|
|
|
|
|
|
import Assistant.Common
|
|
|
|
import Assistant.WebApp
|
2012-09-02 04:27:48 +00:00
|
|
|
import Assistant.WebApp.Types
|
2012-10-12 05:09:28 +00:00
|
|
|
import Assistant.WebApp.Utility
|
2012-07-31 05:11:32 +00:00
|
|
|
import Assistant.WebApp.SideBar
|
|
|
|
import Assistant.WebApp.Notifications
|
|
|
|
import Assistant.WebApp.Configurators
|
|
|
|
import Assistant.TransferQueue
|
|
|
|
import Utility.NotificationBroadcaster
|
|
|
|
import Utility.Yesod
|
|
|
|
import Logs.Transfer
|
|
|
|
import Utility.Percentage
|
|
|
|
import Utility.DataUnits
|
|
|
|
import Types.Key
|
|
|
|
import qualified Remote
|
2012-08-03 13:44:43 +00:00
|
|
|
import qualified Git
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
import Yesod
|
|
|
|
import Text.Hamlet
|
|
|
|
import qualified Data.Map as M
|
2012-08-03 14:18:57 +00:00
|
|
|
import Control.Concurrent
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
{- A display of currently running and queued transfers.
|
|
|
|
-
|
|
|
|
- Or, if there have never been any this run, an intro display. -}
|
|
|
|
transfersDisplay :: Bool -> Widget
|
|
|
|
transfersDisplay warnNoScript = do
|
|
|
|
webapp <- lift getYesod
|
2012-08-12 16:11:20 +00:00
|
|
|
current <- lift $ M.toList <$> getCurrentTransfers
|
2012-10-30 21:14:26 +00:00
|
|
|
queued <- lift $ liftAssistant getTransferQueue
|
2012-07-31 05:11:32 +00:00
|
|
|
autoUpdate ident NotifierTransfersR (10 :: Int) (10 :: Int)
|
2012-08-29 17:41:47 +00:00
|
|
|
let transfers = simplifyTransfers $ current ++ queued
|
2012-07-31 05:11:32 +00:00
|
|
|
if null transfers
|
|
|
|
then ifM (lift $ showIntro <$> getWebAppState)
|
|
|
|
( introDisplay ident
|
2012-07-31 05:24:49 +00:00
|
|
|
, $(widgetFile "dashboard/transfers")
|
2012-07-31 05:11:32 +00:00
|
|
|
)
|
2012-07-31 05:24:49 +00:00
|
|
|
else $(widgetFile "dashboard/transfers")
|
2012-10-31 06:34:03 +00:00
|
|
|
where
|
|
|
|
ident = "transfers"
|
|
|
|
isrunning info = not $
|
|
|
|
transferPaused info || isNothing (startedTime info)
|
2012-07-31 05:11:32 +00:00
|
|
|
|
2012-08-29 19:24:09 +00:00
|
|
|
{- Simplifies a list of transfers, avoiding display of redundant
|
|
|
|
- equivilant transfers. -}
|
2012-08-29 17:41:47 +00:00
|
|
|
simplifyTransfers :: [(Transfer, TransferInfo)] -> [(Transfer, TransferInfo)]
|
|
|
|
simplifyTransfers [] = []
|
|
|
|
simplifyTransfers (x:[]) = [x]
|
|
|
|
simplifyTransfers (v@(t1, _):r@((t2, _):l))
|
2012-08-29 19:24:09 +00:00
|
|
|
| equivilantTransfer t1 t2 = simplifyTransfers (v:l)
|
2012-08-29 17:41:47 +00:00
|
|
|
| otherwise = v : (simplifyTransfers r)
|
|
|
|
|
2012-07-31 05:11:32 +00:00
|
|
|
{- Called by client to get a display of currently in process transfers.
|
|
|
|
-
|
|
|
|
- Returns a div, which will be inserted into the calling page.
|
|
|
|
-
|
|
|
|
- Note that the head of the widget is not included, only its
|
|
|
|
- body is. To get the widget head content, the widget is also
|
|
|
|
- inserted onto the getHomeR page.
|
|
|
|
-}
|
|
|
|
getTransfersR :: NotificationId -> Handler RepHtml
|
|
|
|
getTransfersR nid = do
|
2012-11-03 01:13:06 +00:00
|
|
|
waitNotifier getTransferBroadcaster nid
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
page <- widgetToPageContent $ transfersDisplay False
|
|
|
|
hamletToRepHtml $ [hamlet|^{pageBody page}|]
|
|
|
|
|
|
|
|
{- The main dashboard. -}
|
|
|
|
dashboard :: Bool -> Widget
|
|
|
|
dashboard warnNoScript = do
|
2012-08-04 00:40:34 +00:00
|
|
|
sideBarDisplay
|
2012-07-31 05:11:32 +00:00
|
|
|
let content = transfersDisplay warnNoScript
|
2012-07-31 05:24:49 +00:00
|
|
|
$(widgetFile "dashboard/main")
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
getHomeR :: Handler RepHtml
|
2012-07-31 18:23:17 +00:00
|
|
|
getHomeR = ifM (inFirstRun)
|
|
|
|
( redirect ConfigR
|
|
|
|
, bootstrap (Just DashBoard) $ dashboard True
|
|
|
|
)
|
2012-07-31 06:30:26 +00:00
|
|
|
|
2012-09-18 21:50:07 +00:00
|
|
|
{- Used to test if the webapp is running. -}
|
|
|
|
headHomeR :: Handler ()
|
|
|
|
headHomeR = noop
|
|
|
|
|
2012-07-31 06:30:26 +00:00
|
|
|
{- Same as HomeR, except no autorefresh at all (and no noscript warning). -}
|
|
|
|
getNoScriptR :: Handler RepHtml
|
2012-07-31 18:23:17 +00:00
|
|
|
getNoScriptR = bootstrap (Just DashBoard) $ dashboard False
|
2012-07-31 05:11:32 +00:00
|
|
|
|
|
|
|
{- Same as HomeR, except with autorefreshing via meta refresh. -}
|
|
|
|
getNoScriptAutoR :: Handler RepHtml
|
2012-07-31 06:30:26 +00:00
|
|
|
getNoScriptAutoR = bootstrap (Just DashBoard) $ do
|
2012-07-31 05:11:32 +00:00
|
|
|
let ident = NoScriptR
|
|
|
|
let delayseconds = 3 :: Int
|
|
|
|
let this = NoScriptAutoR
|
2012-07-31 05:24:49 +00:00
|
|
|
toWidgetHead $(hamletFile $ hamletTemplate "dashboard/metarefresh")
|
2012-07-31 05:11:32 +00:00
|
|
|
dashboard False
|
2012-08-03 13:44:43 +00:00
|
|
|
|
|
|
|
{- The javascript code does a post. -}
|
|
|
|
postFileBrowserR :: Handler ()
|
|
|
|
postFileBrowserR = void openFileBrowser
|
|
|
|
|
|
|
|
{- Used by non-javascript browsers, where clicking on the link actually
|
|
|
|
- opens this page, so we redirect back to the referrer. -}
|
|
|
|
getFileBrowserR :: Handler ()
|
2012-08-08 20:06:01 +00:00
|
|
|
getFileBrowserR = whenM openFileBrowser $ redirectBack
|
|
|
|
|
2012-08-03 13:44:43 +00:00
|
|
|
{- Opens the system file browser on the repo, or, as a fallback,
|
|
|
|
- goes to a file:// url. Returns True if it's ok to redirect away
|
2012-08-03 14:18:57 +00:00
|
|
|
- from the page (ie, the system file browser was opened).
|
|
|
|
-
|
|
|
|
- Note that the command is opened using a different thread, to avoid
|
|
|
|
- blocking the response to the browser on it. -}
|
2012-08-03 13:44:43 +00:00
|
|
|
openFileBrowser :: Handler Bool
|
|
|
|
openFileBrowser = do
|
|
|
|
path <- runAnnex (error "no configured repository") $
|
|
|
|
fromRepo Git.repoPath
|
2012-08-03 14:18:57 +00:00
|
|
|
ifM (liftIO $ inPath cmd <&&> inPath cmd)
|
|
|
|
( do
|
|
|
|
void $ liftIO $ forkIO $ void $
|
|
|
|
boolSystem cmd [Param path]
|
|
|
|
return True
|
2012-08-03 13:44:43 +00:00
|
|
|
, do
|
|
|
|
clearUltDest
|
|
|
|
setUltDest $ "file://" ++ path
|
|
|
|
void $ redirectUltDest HomeR
|
|
|
|
return False
|
|
|
|
)
|
2012-10-31 06:34:03 +00:00
|
|
|
where
|
2012-09-29 18:49:15 +00:00
|
|
|
#ifdef darwin_HOST_OS
|
2012-10-31 06:34:03 +00:00
|
|
|
cmd = "open"
|
2012-08-03 13:44:43 +00:00
|
|
|
#else
|
2012-10-31 06:34:03 +00:00
|
|
|
cmd = "xdg-open"
|
2012-08-03 13:44:43 +00:00
|
|
|
#endif
|
2012-08-08 20:06:01 +00:00
|
|
|
|
|
|
|
{- Transfer controls. The GET is done in noscript mode and redirects back
|
|
|
|
- to the referring page. The POST is called by javascript. -}
|
|
|
|
getPauseTransferR :: Transfer -> Handler ()
|
|
|
|
getPauseTransferR t = pauseTransfer t >> redirectBack
|
|
|
|
postPauseTransferR :: Transfer -> Handler ()
|
|
|
|
postPauseTransferR t = pauseTransfer t
|
|
|
|
getStartTransferR :: Transfer -> Handler ()
|
|
|
|
getStartTransferR t = startTransfer t >> redirectBack
|
|
|
|
postStartTransferR :: Transfer -> Handler ()
|
|
|
|
postStartTransferR t = startTransfer t
|
|
|
|
getCancelTransferR :: Transfer -> Handler ()
|
2012-08-10 22:42:44 +00:00
|
|
|
getCancelTransferR t = cancelTransfer False t >> redirectBack
|
2012-08-08 20:06:01 +00:00
|
|
|
postCancelTransferR :: Transfer -> Handler ()
|
2012-08-10 22:42:44 +00:00
|
|
|
postCancelTransferR t = cancelTransfer False t
|