Skip to content

Commit 7890661

Browse files
committed
web: Handler.BalanceR: new handler that serves balance and multi-period balance reports as HTML pages
Journal page contains links to those reports.
1 parent f57cd63 commit 7890661

File tree

9 files changed

+90
-0
lines changed

9 files changed

+90
-0
lines changed

hledger-web/Hledger/Web/App.hs

+2
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ instance Yesod App where
144144
}
145145
rspec' = rspec{_rsQuery=q,_rsReportOpts=ropts'}
146146

147+
maybePeriod <- lookupGetParam "period"
148+
147149
hideEmptyAccts <- if empty_ ropts
148150
then return True
149151
else (== Just "1") . lookup "hideemptyaccts" . reqCookies <$> getRequest

hledger-web/Hledger/Web/Application.hs

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import Hledger.Web.Handler.EditR
2828
import Hledger.Web.Handler.UploadR
2929
import Hledger.Web.Handler.JournalR
3030
import Hledger.Web.Handler.RegisterR
31+
import Hledger.Web.Handler.BalanceR
3132
import Hledger.Web.Import
3233
import Hledger.Web.WebOptions (WebOpts(serve_,serve_api_), corsPolicy)
3334

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
-- | /balance handlers.
2+
3+
{-# LANGUAGE NamedFieldPuns #-}
4+
{-# LANGUAGE OverloadedStrings #-}
5+
6+
module Hledger.Web.Handler.BalanceR where
7+
8+
import Hledger
9+
import Hledger.Cli.CliOptions
10+
import Hledger.Write.Html.Blaze (printHtml)
11+
import Hledger.Web.Import
12+
import Hledger.Web.WebOptions
13+
import qualified Hledger.Cli.Commands.Balance as Balance
14+
import qualified Hledger.Query as Query
15+
16+
import Text.Megaparsec.Error (errorBundlePretty)
17+
import qualified Text.Blaze.Html4.Strict as Blaze
18+
import qualified Data.Text as Text
19+
import qualified Yesod
20+
21+
22+
-- | The balance or multi-period balance view, with sidebar.
23+
getBalanceR :: Handler Html
24+
getBalanceR = do
25+
checkServerSideUiEnabled
26+
VD{j, q, qparam, opts, today} <- getViewData
27+
require ViewPermission
28+
let title :: Text
29+
title = "Balance Report" <> if q /= Any then ", filtered" else ""
30+
rspecOrig = reportspec_ $ cliopts_ opts
31+
ropts =
32+
(_rsReportOpts rspecOrig) {
33+
balance_base_url_ = Just "",
34+
querystring_ = Query.words'' queryprefixes qparam
35+
}
36+
rspec =
37+
rspecOrig {
38+
_rsQuery = filterQuery (not . queryIsDepth) q,
39+
_rsReportOpts = ropts
40+
}
41+
42+
defaultLayout $ do
43+
mperiod <- lookupGetParam "period"
44+
case mperiod of
45+
Nothing -> do
46+
setTitle "balance - hledger-web"
47+
Yesod.toWidget .
48+
(Blaze.h2 (Blaze.toHtml title) >>) .
49+
printHtml . map (map (fmap Blaze.toHtml)) .
50+
Balance.balanceReportAsSpreadsheet ropts $
51+
balanceReport rspec j
52+
Just perStr -> do
53+
setTitle "multibalance - hledger-web"
54+
case parsePeriodExpr today perStr of
55+
Left msg -> Yesod.toWidget $ Text.pack $ errorBundlePretty msg
56+
Right (per_,_) ->
57+
Yesod.toWidget .
58+
(Blaze.h2 (Blaze.toHtml title) >>) .
59+
printHtml . map (map (fmap Blaze.toHtml)) .
60+
snd . Balance.multiBalanceReportAsSpreadsheet ropts $
61+
let rspec' = rspec{_rsReportOpts = ropts{interval_ = per_}} in
62+
multiBalanceReport rspec' j

hledger-web/Hledger/Web/Handler/JournalR.hs

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import Hledger.Web.Widget.Common
1616
(accountQuery, mixedAmountAsHtml,
1717
transactionFragment, replaceInacct)
1818

19+
import qualified Data.Text as Text
20+
1921
-- | The formatted journal view, with sidebar.
2022
getJournalR :: Handler Html
2123
getJournalR = do
@@ -27,6 +29,9 @@ getJournalR = do
2729
Just (a, inclsubs) -> "Transactions in " <> a <> if inclsubs then "" else " (excluding subaccounts)"
2830
title' = title <> if q /= Any then ", filtered" else ""
2931
acctlink a = (RegisterR, [("q", replaceInacct qparam $ accountQuery a)])
32+
qparamOpt = if Text.null qparam then [] else [("q",qparam)]
33+
ballink = (BalanceR, qparamOpt)
34+
multiballink per_ = (BalanceR, ("period",per_) : qparamOpt)
3035
rspec = (reportspec_ $ cliopts_ opts){_rsQuery = filterQuery (not . queryIsDepth) q}
3136
items = reverse $
3237
styleAmounts (journalCommodityStylesWith HardRounding j) $

hledger-web/config/routes

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
/ RootR GET
66
/journal JournalR GET
77
/register RegisterR GET
8+
/balance BalanceR GET
89
/add AddR GET POST PUT
910

1011
/manage ManageR GET

hledger-web/hledger-web.cabal

+2
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ library
143143
other-modules:
144144
Hledger.Web.App
145145
Hledger.Web.Handler.AddR
146+
Hledger.Web.Handler.BalanceR
146147
Hledger.Web.Handler.EditR
147148
Hledger.Web.Handler.JournalR
148149
Hledger.Web.Handler.MiscR
@@ -184,6 +185,7 @@ library
184185
, http-client
185186
, http-conduit
186187
, http-types
188+
, lucid
187189
, megaparsec >=7.0.0 && <9.7
188190
, mtl >=2.2.1
189191
, network

hledger-web/package.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ library:
130130
- http-conduit
131131
- http-client
132132
- http-types
133+
- lucid
133134
- megaparsec >=7.0.0 && <9.7
134135
- mtl >=2.2.1
135136
- network

hledger-web/templates/default-layout.hamlet

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ $if elem ViewPermission perms
1919
<form#searchform.input-group method=GET>
2020
<input .form-control name=q value=#{qparam} placeholder="Search"
2121
title="Enter hledger search patterns to filter the data below">
22+
$maybe period <- maybePeriod
23+
<input hidden name=period value=#{period}>
2224
<div .input-group-btn>
2325
$if not (T.null qparam)
2426
<a href=@{here} .btn .btn-default title="Clear search terms">

hledger-web/templates/journal.hamlet

+14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@ $if elem AddPermission perms
66
data-toggle="modal" data-target="#addmodal" title="Add a new transaction to the journal">
77
Add a transaction
88

9+
<p>
10+
Report:
11+
<a href=@?{ballink} title="Show balance report">Balance
12+
<a href=@?{multiballink "yearly"}
13+
title="Show daily multi-period balance report">Yearly
14+
<a href=@?{multiballink "quarterly"}
15+
title="Show daily multi-period balance report">Quarterly
16+
<a href=@?{multiballink "monthly"}
17+
title="Show daily multi-period balance report">Monthly
18+
<a href=@?{multiballink "weekly"}
19+
title="Show daily multi-period balance report">Weekly
20+
<a href=@?{multiballink "daily"}
21+
title="Show daily multi-period balance report">Daily
22+
923
<div .table-responsive>
1024
<table .transactionsreport .table .table-condensed>
1125
<thead>

0 commit comments

Comments
 (0)