Migrate to Yesod 0.4
This commit is contained in:
parent
dbe575d5fc
commit
edad75ae4b
@ -12,6 +12,7 @@ hledger is brought to you by:
|
||||
- Sergey Astanin - utf8 support
|
||||
- Nick Ingolia - parser improvements
|
||||
- Roman Cheplyaka - "chart" command, "add" command improvements
|
||||
- Michael Snoyman - some additions to the Yesod web interface
|
||||
|
||||
Developers who have not yet signed the contributor agreement:
|
||||
|
||||
|
||||
@ -6,11 +6,10 @@ A web-based UI.
|
||||
module Hledger.Cli.Commands.Web
|
||||
where
|
||||
import Control.Concurrent (forkIO, threadDelay)
|
||||
import Control.Applicative ((<$>), (<*>))
|
||||
import Data.Either
|
||||
import Network.Wai.Handler.SimpleServer (run)
|
||||
import System.FilePath ((</>))
|
||||
import System.IO.Storage (withStore, putValue, getValue)
|
||||
import Text.Hamlet
|
||||
import Text.ParserCombinators.Parsec (parse)
|
||||
import Yesod
|
||||
|
||||
@ -64,7 +63,7 @@ server baseurl port opts args j = do
|
||||
}
|
||||
withStore "hledger" $ do
|
||||
putValue "hledger" "journal" j
|
||||
toWaiApp app >>= run port
|
||||
basicHandler port app
|
||||
|
||||
data HledgerWebApp = HledgerWebApp {
|
||||
appOpts::[Opt]
|
||||
@ -74,8 +73,6 @@ data HledgerWebApp = HledgerWebApp {
|
||||
,appRoot::String
|
||||
}
|
||||
|
||||
instance Yesod HledgerWebApp where approot = appRoot
|
||||
|
||||
mkYesod "HledgerWebApp" [$parseRoutes|
|
||||
/ IndexPage GET
|
||||
/style.css StyleCss GET
|
||||
@ -85,6 +82,8 @@ mkYesod "HledgerWebApp" [$parseRoutes|
|
||||
/balance BalancePage GET
|
||||
|]
|
||||
|
||||
instance Yesod HledgerWebApp where approot = appRoot
|
||||
|
||||
getIndexPage :: Handler HledgerWebApp ()
|
||||
getIndexPage = redirect RedirectTemporary JournalPage
|
||||
|
||||
@ -108,12 +107,10 @@ getBalancePage = withLatestJournalRender showBalanceReport
|
||||
withLatestJournalRender :: ([Opt] -> FilterSpec -> Journal -> String) -> Handler HledgerWebApp RepHtml
|
||||
withLatestJournalRender reportfn = do
|
||||
app <- getYesod
|
||||
params <- getParams
|
||||
t <- liftIO $ getCurrentLocalTime
|
||||
let head' x = if null x then "" else head x
|
||||
a = head' $ params "a"
|
||||
p = head' $ params "p"
|
||||
opts = appOpts app ++ [Period p]
|
||||
a <- fromMaybe "" <$> lookupGetParam "a"
|
||||
p <- fromMaybe "" <$> lookupGetParam "p"
|
||||
let opts = appOpts app ++ [Period p]
|
||||
args = appArgs app ++ [a]
|
||||
fspec = optsToFilterSpec opts args t
|
||||
-- reload journal if changed, displaying any error as a message
|
||||
@ -129,11 +126,11 @@ withLatestJournalRender reportfn = do
|
||||
msg' <- getMessage
|
||||
-- XXX work around a bug, can't get the message we set above
|
||||
let msg = if null err then msg' else Just $ string $ printf "Error while reading %s" (filepath j')
|
||||
Just here <- getRoute
|
||||
Just here <- getCurrentRoute
|
||||
hamletToRepHtml $ template here msg a p "hledger" s
|
||||
|
||||
template :: HledgerWebAppRoutes -> Maybe (Html ()) -> String -> String
|
||||
-> String -> String -> Hamlet HledgerWebAppRoutes
|
||||
template :: HledgerWebAppRoute -> Maybe (Html ()) -> String -> String
|
||||
-> String -> String -> Hamlet HledgerWebAppRoute
|
||||
template here msg a p title content = [$hamlet|
|
||||
!!!
|
||||
%html
|
||||
@ -157,7 +154,7 @@ template here msg a p title content = [$hamlet|
|
||||
|
||||
nulltemplate = [$hamlet||]
|
||||
|
||||
navbar :: HledgerWebAppRoutes -> String -> String -> Hamlet HledgerWebAppRoutes
|
||||
navbar :: HledgerWebAppRoute -> String -> String -> Hamlet HledgerWebAppRoute
|
||||
navbar here a p = [$hamlet|
|
||||
#navbar
|
||||
%a.toprightlink!href=$string.hledgerurl$ hledger.org
|
||||
@ -168,7 +165,7 @@ navbar here a p = [$hamlet|
|
||||
where navlinks' = navlinks here a p
|
||||
searchform' = searchform here a p
|
||||
|
||||
navlinks :: HledgerWebAppRoutes -> String -> String -> Hamlet HledgerWebAppRoutes
|
||||
navlinks :: HledgerWebAppRoute -> String -> String -> Hamlet HledgerWebAppRoute
|
||||
navlinks here a p = [$hamlet|
|
||||
#navlinks
|
||||
^journallink^ $
|
||||
@ -186,7 +183,7 @@ navlinks here a p = [$hamlet|
|
||||
style | here == dest = string "navlinkcurrent"
|
||||
| otherwise = string "navlink"
|
||||
|
||||
searchform :: HledgerWebAppRoutes -> String -> String -> Hamlet HledgerWebAppRoutes
|
||||
searchform :: HledgerWebAppRoute -> String -> String -> Hamlet HledgerWebAppRoute
|
||||
searchform here a p = [$hamlet|
|
||||
%form#searchform
|
||||
filter by: $
|
||||
@ -209,10 +206,10 @@ searchform here a p = [$hamlet|
|
||||
helplink topic label = [$hamlet|%a!href=$string.u$ $string.label$|]
|
||||
where u = manualurl ++ if null topic then "" else '#':topic
|
||||
|
||||
addform :: Hamlet HledgerWebAppRoutes
|
||||
addform :: Hamlet HledgerWebAppRoute
|
||||
addform = [$hamlet|
|
||||
%form!method=POST
|
||||
%table.form#addform!cellpadding=0!cellspacing=0!!border=0
|
||||
%table.form#addform!cellpadding=0!cellspacing=0!border=0
|
||||
%tr.formheading
|
||||
%td!colspan=4
|
||||
%span#formheading Add a transaction:
|
||||
@ -291,26 +288,29 @@ transactionfields n = [$hamlet|
|
||||
postJournalPage :: Handler HledgerWebApp RepPlain
|
||||
postJournalPage = do
|
||||
today <- liftIO getCurrentDay
|
||||
-- get form input values, or basic validation errors. E means an Either value.
|
||||
dateE <- runFormPost $ catchFormError $ notEmpty $ required $ input "date"
|
||||
descE <- runFormPost $ catchFormError $ required $ input "description"
|
||||
acct1E <- runFormPost $ catchFormError $ notEmpty $ required $ input "accountname1"
|
||||
amt1E <- runFormPost $ catchFormError $ notEmpty $ required $ input "amount1"
|
||||
acct2E <- runFormPost $ catchFormError $ notEmpty $ required $ input "accountname2"
|
||||
amt2E <- runFormPost $ catchFormError $ input "amount2"
|
||||
-- get form input values. M means a Maybe value.
|
||||
(dateM, descM, acct1M, amt1M, acct2M, amt2M) <- runFormPost'
|
||||
$ (,,,,,)
|
||||
<$> maybeStringInput "date"
|
||||
<*> maybeStringInput "descritpion"
|
||||
<*> maybeStringInput "accountname1"
|
||||
<*> maybeStringInput "amount1"
|
||||
<*> maybeStringInput "accountname2"
|
||||
<*> maybeStringInput "amount2"
|
||||
-- supply defaults and parse date and amounts, or get errors.
|
||||
let dateE' = either Left (either (\e -> Left [("date", showDateParseError e)]) Right . fixSmartDateStrEither today) dateE
|
||||
amt1E' = either Left (either (const (Right missingamt)) Right . parse someamount "") amt1E -- XXX missingamt only when missing/empty
|
||||
amt2E' = case amt2E of Right [] -> Right missingamt
|
||||
_ -> either Left (either (const (Right missingamt)) Right . parse someamount "" . head) amt2E
|
||||
strEs = [dateE', descE, acct1E, acct2E]
|
||||
let dateE' = maybe (Left "No date provided") (either (\e -> Left ("date: " ++ showDateParseError e)) Right . fixSmartDateStrEither today) dateM
|
||||
amt1E' = maybe (Left "No amount provided") (either (const (Right missingamt)) Right . parse someamount "") amt1M -- XXX missingamt only when missing/empty
|
||||
amt2E' = case amt2M of Nothing -> Right missingamt
|
||||
Just amt -> (either (const (Right missingamt)) Right . parse someamount "") amt
|
||||
toEither = maybe (Left "") Right
|
||||
strEs = [dateE', Right $ fromMaybe "" descM, toEither acct1M, toEither acct2M]
|
||||
amtEs = [amt1E', amt2E']
|
||||
errs = lefts strEs ++ lefts amtEs
|
||||
[date,desc,acct1,acct2] = rights strEs
|
||||
[amt1,amt2] = rights amtEs
|
||||
-- if no errors so far, generate a transaction and balance it or get the error.
|
||||
tE | not $ null errs = Left errs
|
||||
| otherwise = either (\e -> Left [[("unbalanced postings", head $ lines e)]]) Right
|
||||
| otherwise = either (\e -> Left ["unbalanced postings: " ++ (head $ lines e)]) Right
|
||||
(balanceTransaction $ nulltransaction {
|
||||
tdate=parsedate date
|
||||
,teffectivedate=Nothing
|
||||
@ -328,7 +328,7 @@ postJournalPage = do
|
||||
case tE of
|
||||
Left errs -> do
|
||||
-- save current form values in session
|
||||
setMessage $ string $ intercalate "; " $ map (intercalate ", " . map (\(a,b) -> a++": "++b)) errs
|
||||
setMessage $ string $ intercalate "; " errs
|
||||
redirect RedirectTemporary JournalPage
|
||||
|
||||
Right t -> do
|
||||
@ -341,11 +341,9 @@ postJournalPage = do
|
||||
getEditPage :: Handler HledgerWebApp RepHtml
|
||||
getEditPage = do
|
||||
-- app <- getYesod
|
||||
params <- getParams
|
||||
-- t <- liftIO $ getCurrentLocalTime
|
||||
let head' x = if null x then "" else head x
|
||||
a = head' $ params "a"
|
||||
p = head' $ params "p"
|
||||
a <- fromMaybe "" <$> lookupGetParam "a"
|
||||
p <- fromMaybe "" <$> lookupGetParam "p"
|
||||
-- opts = appOpts app ++ [Period p]
|
||||
-- args = appArgs app ++ [a]
|
||||
-- fspec = optsToFilterSpec opts args t
|
||||
@ -356,7 +354,7 @@ getEditPage = do
|
||||
s <- liftIO $ if changed then readFile (filepath j) else return (jtext j)
|
||||
-- render the page
|
||||
msg <- getMessage
|
||||
Just here <- getRoute
|
||||
Just here <- getCurrentRoute
|
||||
hamletToRepHtml $ template' here msg a p "hledger" s
|
||||
|
||||
template' here msg a p title content = [$hamlet|
|
||||
@ -377,10 +375,10 @@ template' here msg a p title content = [$hamlet|
|
||||
metacontent = "text/html; charset=utf-8"
|
||||
editform' = editform content
|
||||
|
||||
editform :: String -> Hamlet HledgerWebAppRoutes
|
||||
editform :: String -> Hamlet HledgerWebAppRoute
|
||||
editform t = [$hamlet|
|
||||
%form!method=POST
|
||||
%table.form#editform!cellpadding=0!cellspacing=0!!border=0
|
||||
%table.form#editform!cellpadding=0!cellspacing=0!border=0
|
||||
%tr.formheading
|
||||
%td!colspan=2
|
||||
%span!style=float:right; ^formhelp^
|
||||
@ -407,12 +405,13 @@ editform t = [$hamlet|
|
||||
postEditPage :: Handler HledgerWebApp RepPlain
|
||||
postEditPage = do
|
||||
-- get form input values, or basic validation errors. E means an Either value.
|
||||
textE <- runFormPost $ catchFormError $ required $ input "text"
|
||||
textM <- runFormPost' $ maybeStringInput "text"
|
||||
let textE = maybe (Left "No value provided") Right textM
|
||||
-- display errors or add transaction
|
||||
case textE of
|
||||
Left errs -> do
|
||||
-- XXX should save current form values in session
|
||||
setMessage $ string $ intercalate "; " $ map (intercalate ", " . map (\(a,b) -> a++": "++b)) [errs]
|
||||
setMessage $ string errs
|
||||
redirect RedirectTemporary JournalPage
|
||||
|
||||
Right t' -> do
|
||||
|
||||
@ -104,10 +104,8 @@ executable hledger
|
||||
cpp-options: -DWEB
|
||||
other-modules:Hledger.Cli.Commands.Web
|
||||
build-depends:
|
||||
hamlet >= 0.3.1 && < 0.4
|
||||
,io-storage >= 0.3 && < 0.4
|
||||
,wai-extra >= 0.1 && < 0.2
|
||||
,yesod >= 0.3.1 && < 0.4
|
||||
io-storage >= 0.3 && < 0.4
|
||||
,yesod >= 0.4.0 && < 0.5
|
||||
|
||||
if flag(web610)
|
||||
cpp-options: -DWEB610
|
||||
|
||||
Loading…
Reference in New Issue
Block a user