web: add a runtime-reloaded add form for testing
This commit is contained in:
parent
8c8395778c
commit
041dfac11c
@ -1,4 +1,5 @@
|
||||
{-# LANGUAGE CPP, TypeFamilies, QuasiQuotes, TemplateHaskell #-}
|
||||
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-}
|
||||
{-|
|
||||
A web-based UI.
|
||||
-}
|
||||
@ -7,11 +8,14 @@ module Hledger.Cli.Commands.Web
|
||||
where
|
||||
import Control.Concurrent (forkIO, threadDelay)
|
||||
import Control.Applicative ((<$>), (<*>))
|
||||
import Control.Failure
|
||||
import Data.Either
|
||||
import System.FilePath ((</>), takeFileName)
|
||||
import System.IO.Storage (withStore, putValue, getValue)
|
||||
import Text.ParserCombinators.Parsec (parse)
|
||||
import Yesod
|
||||
import Yesod hiding (defaultHamletSettings)
|
||||
import Text.Hamlet.Parse (defaultHamletSettings)
|
||||
import Text.Hamlet.RT
|
||||
import Yesod.Helpers.Static
|
||||
|
||||
import Hledger.Cli.Commands.Add (journalAddTransaction)
|
||||
@ -29,7 +33,6 @@ import Paths_hledger_make (getDataFileName)
|
||||
#else
|
||||
import Paths_hledger (getDataFileName)
|
||||
#endif
|
||||
-- import Hledger.Cli.Commands.Web.Templates
|
||||
|
||||
|
||||
defhost = "localhost"
|
||||
@ -55,6 +58,7 @@ mkYesod "HledgerWebApp" [$parseRoutes|
|
||||
/accounts AccountsOnlyR GET
|
||||
/journal JournalR GET POST
|
||||
/register RegisterR GET POST
|
||||
/addformrt AddformRTR GET
|
||||
|]
|
||||
|
||||
style_css = StaticRoute ["style.css"]
|
||||
@ -660,6 +664,87 @@ getEditR = do
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
-- | Get the add form from template files reloaded at run-time.
|
||||
getAddformRTR :: Handler HledgerWebApp RepHtml
|
||||
getAddformRTR = do
|
||||
(a, p, _, _, j, msg, here) <- getHandlerParameters
|
||||
today <- liftIO getCurrentDay
|
||||
let td = mktd{here=here, title="hledger add transaction", msg=msg, a=a, p=p, j=j, today=today}
|
||||
descriptions = sort $ nub $ map tdescription $ jtxns j
|
||||
acctnames = sort $ journalAccountNamesUsed j
|
||||
postingData n = HDMap [
|
||||
("acctlabel", hdstring acctlabel)
|
||||
,("acctvar", hdstring acctvar)
|
||||
,("acctnames", HDList $ map hdstring acctnames)
|
||||
,("amtfield", HDHtml $ renderHamlet' amtfield)
|
||||
,("accthelp", hdstring accthelp)
|
||||
,("amthelp", hdstring amthelp)
|
||||
] :: HamletData HledgerWebAppRoute
|
||||
where
|
||||
numbered = (++ show n)
|
||||
acctvar = numbered "account"
|
||||
amtvar = numbered "amount"
|
||||
(acctlabel, accthelp, amtfield, amthelp)
|
||||
| n == 1 = ("To account"
|
||||
,"eg: expenses:food"
|
||||
,[$hamlet|
|
||||
%td!style=padding-left:1em;
|
||||
Amount:
|
||||
%td
|
||||
%input.textinput!size=15!name=$amtvar$!value=""
|
||||
|]
|
||||
,"eg: $6"
|
||||
)
|
||||
| otherwise = ("From account"
|
||||
,"eg: assets:bank:checking"
|
||||
,nulltemplate
|
||||
,""
|
||||
)
|
||||
pfields1 <- renderHamletFile "addformpostingfields.hamlet" (postingData 1)
|
||||
pfields2 <- renderHamletFile "addformpostingfields.hamlet" (postingData 2)
|
||||
addform <- renderHamletFile "addform.hamlet" (HDMap [
|
||||
("date", hdstring "today")
|
||||
,("desc", hdstring "")
|
||||
,("descriptions", HDList $ map hdstring descriptions)
|
||||
,("datehelp", hdstring "eg: 2010/7/20")
|
||||
,("deschelp", hdstring "eg: supermarket (optional)")
|
||||
,("postingfields1", HDHtml pfields1)
|
||||
,("postingfields2", HDHtml pfields2)
|
||||
])
|
||||
hamletToRepHtml $ pageLayout td $ htmlAsHamlet addform
|
||||
|
||||
hdstring = HDHtml . string
|
||||
|
||||
instance Failure HamletException (Handler HledgerWebApp)
|
||||
where failure = error . show
|
||||
|
||||
renderHamletFile :: FilePath -> HamletData HledgerWebAppRoute -> Handler HledgerWebApp (Html ())
|
||||
renderHamletFile hfile hdata = do
|
||||
hrt <- readHamletFile hfile >>= parseHamletRT defaultHamletSettings
|
||||
renderHamletRT hrt hdata show
|
||||
|
||||
readHamletFile :: FilePath -> Handler HledgerWebApp String
|
||||
readHamletFile hfile = do
|
||||
dir <- ((</> "templates") . appDir) `fmap` getYesod
|
||||
liftIO $ readFile $ dir </> hfile
|
||||
|
||||
htmlAsHamlet :: Html () -> Hamlet HledgerWebAppRoute
|
||||
htmlAsHamlet h = [$hamlet|$h$|]
|
||||
|
||||
parseHamletRT' :: Failure HamletException m => String -> m HamletRT
|
||||
parseHamletRT' s = parseHamletRT defaultHamletSettings s
|
||||
|
||||
renderHamletRT' :: Failure HamletException m => HamletData HledgerWebAppRoute -> HamletRT -> m (Html ())
|
||||
renderHamletRT' d h = renderHamletRT h d show
|
||||
|
||||
renderHamlet' :: Hamlet HledgerWebAppRoute -> Html ()
|
||||
renderHamlet' h = h show
|
||||
|
||||
-- hamletToHamletRT :: Failure HamletException m => Hamlet HledgerWebAppRoute -> m HamletRT
|
||||
-- hamletToHamletRT h = stringToHamletRT $ show $ unsafeByteString $ renderHamlet show h
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
-- | Wrap a template with the standard hledger web ui page layout.
|
||||
pageLayout :: TemplateData -> Hamlet HledgerWebAppRoute -> Hamlet HledgerWebAppRoute
|
||||
pageLayout td@TD{title=title, msg=msg} content = [$hamlet|
|
||||
|
||||
45
data/web/templates/addform.hamlet
Normal file
45
data/web/templates/addform.hamlet
Normal file
@ -0,0 +1,45 @@
|
||||
%script!type=text/javascript
|
||||
$$(document).ready(function() {
|
||||
/* dhtmlxcombo setup */
|
||||
window.dhx_globalImgPath="../static/images/";
|
||||
var desccombo = new dhtmlXCombo("description");
|
||||
var acct1combo = new dhtmlXCombo("account1");
|
||||
var acct2combo = new dhtmlXCombo("account2");
|
||||
desccombo.enableFilteringMode(true);
|
||||
acct1combo.enableFilteringMode(true);
|
||||
acct2combo.enableFilteringMode(true);
|
||||
desccombo.setSize(300);
|
||||
acct1combo.setSize(300);
|
||||
acct2combo.setSize(300);
|
||||
});
|
||||
|
||||
%form#addform!method=POST;
|
||||
%table.form
|
||||
%tr
|
||||
%td!colspan=4
|
||||
%table
|
||||
%tr#descriptionrow
|
||||
%td
|
||||
Date:
|
||||
%td
|
||||
%input.textinput!size=15!name=date!value=$date$
|
||||
%td!style=padding-left:1em;
|
||||
Description:
|
||||
%td
|
||||
%select!id=description!name=description
|
||||
%option
|
||||
$forall descriptions d
|
||||
%option!value=$d$ $d$
|
||||
%tr.helprow
|
||||
%td
|
||||
%td
|
||||
.help $datehelp$ $
|
||||
%td
|
||||
%td
|
||||
.help $deschelp$
|
||||
$postingfields1$
|
||||
$postingfields2$
|
||||
%tr#addbuttonrow
|
||||
%td!colspan=4
|
||||
%input!type=hidden!name=action!value=add
|
||||
%input!type=submit!name=submit!value="add transaction"
|
||||
15
data/web/templates/addformpostingfields.hamlet
Normal file
15
data/web/templates/addformpostingfields.hamlet
Normal file
@ -0,0 +1,15 @@
|
||||
%tr#postingrow
|
||||
%td!align=right $acctlabel$:
|
||||
%td
|
||||
%select!id=$acctvar$!name=$acctvar$
|
||||
%option
|
||||
$forall acctnames a
|
||||
%option!value=$a$ $a$
|
||||
$amtfield$
|
||||
%tr.helprow
|
||||
%td
|
||||
%td
|
||||
.help $accthelp$
|
||||
%td
|
||||
%td
|
||||
.help $amthelp$
|
||||
Loading…
Reference in New Issue
Block a user