ui,web: Adopt new ReportOptions interface, store literal query string in UIOpts.
This commit is contained in:
parent
efc9758f82
commit
fcbe511d42
@ -81,9 +81,7 @@ asInit d reset ui@UIState{
|
||||
as = map asItemAccountName displayitems
|
||||
|
||||
uopts' = uopts{cliopts_=copts{reportopts_=ropts'}}
|
||||
ropts' = ropts{accountlistmode_=if tree_ ropts then ALTree else ALFlat}
|
||||
|
||||
q = And [queryFromOpts d ropts, excludeforecastq (forecast_ ropts)]
|
||||
ropts' = ropts{query_=simplifyQuery $ And [query_ ropts, excludeforecastq (forecast_ ropts)]}
|
||||
where
|
||||
-- Except in forecast mode, exclude future/forecast transactions.
|
||||
excludeforecastq (Just _) = Any
|
||||
@ -94,7 +92,7 @@ asInit d reset ui@UIState{
|
||||
]
|
||||
|
||||
-- run the report
|
||||
(items,_total) = balanceReport ropts' q j
|
||||
(items,_total) = balanceReport ropts' j
|
||||
|
||||
-- pre-render the list items
|
||||
displayitem (fullacct, shortacct, indent, bal) =
|
||||
@ -119,7 +117,7 @@ asInit d reset ui@UIState{
|
||||
asInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
|
||||
|
||||
asDraw :: UIState -> [Widget Name]
|
||||
asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystring_=query}
|
||||
,ajournal=j
|
||||
,aScreen=s@AccountsScreen{}
|
||||
,aMode=mode
|
||||
@ -174,7 +172,7 @@ asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
<+> toggles
|
||||
<+> str (" account " ++ if ishistorical then "balances" else "changes")
|
||||
<+> borderPeriodStr (if ishistorical then "at end of" else "in") (period_ ropts)
|
||||
<+> borderQueryStr querystr
|
||||
<+> borderQueryStr query
|
||||
<+> borderDepthStr mdepth
|
||||
<+> str (" ("++curidx++"/"++totidx++")")
|
||||
<+> (if ignore_assertions_ $ inputopts_ copts
|
||||
@ -192,7 +190,6 @@ asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
,uiShowStatus copts $ statuses_ ropts
|
||||
,if real_ ropts then ["real"] else []
|
||||
]
|
||||
querystr = query_ ropts
|
||||
mdepth = depth_ ropts
|
||||
curidx = case _asList s ^. listSelectedL of
|
||||
Nothing -> "-"
|
||||
|
||||
@ -17,7 +17,6 @@ import Control.Concurrent.Async
|
||||
import Control.Monad
|
||||
-- import Control.Monad.IO.Class (liftIO)
|
||||
-- import Data.Monoid --
|
||||
import Data.List
|
||||
import Data.List.Extra (nubSort)
|
||||
import Data.Maybe
|
||||
-- import Data.Text (Text)
|
||||
@ -83,10 +82,9 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=rop
|
||||
reportopts_= ropts{
|
||||
-- incorporate any depth: query args into depth_,
|
||||
-- any date: query args into period_
|
||||
depth_ =queryDepth q,
|
||||
depth_ =queryDepth $ query_ ropts,
|
||||
period_=periodfromoptsandargs,
|
||||
query_ =unwords -- as in ReportOptions, with same limitations
|
||||
$ collectopts filteredQueryArg (rawopts_ copts),
|
||||
query_ =filteredQuery $ query_ ropts, -- as in ReportOptions, with same limitations
|
||||
-- always disable boring account name eliding, unlike the CLI, for a more regular tree
|
||||
no_elide_=True,
|
||||
-- flip the default for items with zero amounts, show them by default
|
||||
@ -97,16 +95,11 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=rop
|
||||
}
|
||||
}
|
||||
where
|
||||
q = queryFromOpts d ropts
|
||||
datespanfromargs = queryDateSpan (date2_ ropts) $ fst $
|
||||
either error' id $ parseQuery d (T.pack $ query_ ropts) -- PARTIAL:
|
||||
datespanfromargs = queryDateSpan (date2_ ropts) $ query_ ropts
|
||||
periodfromoptsandargs =
|
||||
dateSpanAsPeriod $ spansIntersect [periodAsDateSpan $ period_ ropts, datespanfromargs]
|
||||
filteredQueryArg = \case
|
||||
("args", v)
|
||||
| not $ any (`isPrefixOf` v) ["depth:", "date:"] -- skip depth/date passed as query
|
||||
-> Just (quoteIfNeeded v)
|
||||
_ -> Nothing
|
||||
filteredQuery q = simplifyQuery $ And [queryFromFlags ropts, filtered q]
|
||||
where filtered = filterQuery (\x -> not $ queryIsDepth x || queryIsDate x)
|
||||
|
||||
-- XXX move this stuff into Options, UIOpts
|
||||
theme = maybe defaultTheme (fromMaybe defaultTheme . getTheme) $
|
||||
|
||||
@ -69,7 +69,7 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportopts_=ropts
|
||||
ropts' = ropts{
|
||||
depth_=Nothing
|
||||
}
|
||||
q = And [queryFromOpts d ropts', excludeforecastq (forecast_ ropts)]
|
||||
q = And [query_ ropts', excludeforecastq (forecast_ ropts)]
|
||||
where
|
||||
-- Except in forecast mode, exclude future/forecast transactions.
|
||||
excludeforecastq (Just _) = Any
|
||||
@ -138,7 +138,7 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportopts_=ropts
|
||||
rsInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
|
||||
|
||||
rsDraw :: UIState -> [Widget Name]
|
||||
rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystring_=query}
|
||||
,aScreen=RegisterScreen{..}
|
||||
,aMode=mode
|
||||
} =
|
||||
@ -201,7 +201,7 @@ rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
<+> togglefilters
|
||||
<+> str " transactions"
|
||||
-- <+> str (if ishistorical then " historical total" else " period total")
|
||||
<+> borderQueryStr (query_ ropts)
|
||||
<+> borderQueryStr query
|
||||
-- <+> str " and subs"
|
||||
<+> borderPeriodStr "in" (period_ ropts)
|
||||
<+> str " ("
|
||||
|
||||
@ -58,7 +58,7 @@ tsInit _d _reset ui@UIState{aopts=UIOpts{cliopts_=CliOpts{reportopts_=_ropts}}
|
||||
tsInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
|
||||
|
||||
tsDraw :: UIState -> [Widget Name]
|
||||
tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystring_=query}
|
||||
,ajournal=j
|
||||
,aScreen=TransactionScreen{tsTransaction=(i,t)
|
||||
,tsTransactions=nts
|
||||
@ -98,7 +98,7 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
<+> withAttr ("border" <> "bold") (str $ show i)
|
||||
<+> str (" of "++show (length nts))
|
||||
<+> togglefilters
|
||||
<+> borderQueryStr (query_ ropts)
|
||||
<+> borderQueryStr query
|
||||
<+> str (" in "++T.unpack (replaceHiddenAccountsNameWith "All" acct)++")")
|
||||
<+> (if ignore_assertions_ $ inputopts_ copts then withAttr ("border" <> "query") (str " ignoring balance assertions") else str "")
|
||||
where
|
||||
@ -173,7 +173,7 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t)
|
||||
Right j' -> do
|
||||
continue $
|
||||
regenerateScreens j' d $
|
||||
regenerateTransactions ropts d j' s acct i $ -- added (inline) 201512 (why ?)
|
||||
regenerateTransactions ropts j' s acct i $ -- added (inline) 201512 (why ?)
|
||||
clearCostValue $
|
||||
ui
|
||||
VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)
|
||||
@ -208,13 +208,13 @@ tsHandle _ _ = error "event handler called with wrong screen type, should not ha
|
||||
|
||||
-- Got to redo the register screen's transactions report, to get the latest transactions list for this screen.
|
||||
-- XXX Duplicates rsInit. Why do we have to do this as well as regenerateScreens ?
|
||||
regenerateTransactions :: ReportOpts -> Day -> Journal -> Screen -> AccountName -> Integer -> UIState -> UIState
|
||||
regenerateTransactions ropts d j s acct i ui =
|
||||
regenerateTransactions :: ReportOpts -> Journal -> Screen -> AccountName -> Integer -> UIState -> UIState
|
||||
regenerateTransactions ropts j s acct i ui =
|
||||
let
|
||||
ropts' = ropts {depth_=Nothing
|
||||
,balancetype_=HistoricalBalance
|
||||
}
|
||||
q = filterQuery (not . queryIsDepth) $ queryFromOpts d ropts'
|
||||
q = filterQuery (not . queryIsDepth) $ query_ ropts'
|
||||
thisacctq = Acct $ accountNameToAccountRegex acct -- includes subs
|
||||
items = reverse $ snd $ accountTransactionsReport ropts j q thisacctq
|
||||
ts = map first6 items
|
||||
|
||||
@ -58,15 +58,17 @@ uimode = (mode "hledger-ui" (setopt "command" "ui" def)
|
||||
|
||||
-- hledger-ui options, used in hledger-ui and above
|
||||
data UIOpts = UIOpts {
|
||||
watch_ :: Bool
|
||||
,change_ :: Bool
|
||||
,cliopts_ :: CliOpts
|
||||
watch_ :: Bool
|
||||
,change_ :: Bool
|
||||
,cliopts_ :: CliOpts
|
||||
,querystring_ :: String
|
||||
} deriving (Show)
|
||||
|
||||
defuiopts = UIOpts
|
||||
def
|
||||
def
|
||||
def
|
||||
""
|
||||
|
||||
-- instance Default CliOpts where def = defcliopts
|
||||
|
||||
@ -74,9 +76,10 @@ rawOptsToUIOpts :: RawOpts -> IO UIOpts
|
||||
rawOptsToUIOpts rawopts = checkUIOpts <$> do
|
||||
cliopts <- rawOptsToCliOpts rawopts
|
||||
return defuiopts {
|
||||
watch_ = boolopt "watch" rawopts
|
||||
,change_ = boolopt "change" rawopts
|
||||
,cliopts_ = cliopts
|
||||
watch_ = boolopt "watch" rawopts
|
||||
,change_ = boolopt "change" rawopts
|
||||
,cliopts_ = cliopts
|
||||
,querystring_ = unwords . map quoteIfNeeded $ listofstringopt "args" rawopts
|
||||
}
|
||||
|
||||
checkUIOpts :: UIOpts -> UIOpts
|
||||
@ -94,4 +97,3 @@ getHledgerUIOpts = do
|
||||
let args' = replaceNumericFlags args
|
||||
let cmdargopts = either usageError id $ process uimode args'
|
||||
rawOptsToUIOpts cmdargopts
|
||||
|
||||
|
||||
@ -8,10 +8,11 @@ module Hledger.UI.UIState
|
||||
where
|
||||
|
||||
import Brick.Widgets.Edit
|
||||
import Data.List
|
||||
import Data.List ((\\), foldl', sort)
|
||||
import Data.Maybe (fromMaybe)
|
||||
import qualified Data.Text as T
|
||||
import Data.Text.Zipper (gotoEOL)
|
||||
import Data.Time.Calendar (Day)
|
||||
import Data.Maybe (fromMaybe)
|
||||
|
||||
import Hledger
|
||||
import Hledger.Cli.CliOptions
|
||||
@ -239,7 +240,8 @@ resetReportPeriod = setReportPeriod PeriodAll
|
||||
-- | Apply a new filter query.
|
||||
setFilter :: String -> UIState -> UIState
|
||||
setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{query_=s}}}}
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{query_=q}},querystring_=s}}
|
||||
where q = either (const None) fst . parseQuery undefined $ T.pack s
|
||||
|
||||
-- | Reset some filters & toggles.
|
||||
resetFilter :: UIState -> UIState
|
||||
@ -248,7 +250,7 @@ resetFilter ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=rop
|
||||
empty_=True
|
||||
,statuses_=[]
|
||||
,real_=False
|
||||
,query_=""
|
||||
,query_=Any
|
||||
--,period_=PeriodAll
|
||||
}}}}
|
||||
|
||||
@ -305,7 +307,7 @@ showMinibuffer :: UIState -> UIState
|
||||
showMinibuffer ui = setMode (Minibuffer e) ui
|
||||
where
|
||||
e = applyEdit gotoEOL $ editor MinibufferEditor (Just 1) oldq
|
||||
oldq = query_ $ reportopts_ $ cliopts_ $ aopts ui
|
||||
oldq = querystring_ $ aopts ui
|
||||
|
||||
-- | Close the minibuffer, discarding any edit in progress.
|
||||
closeMinibuffer :: UIState -> UIState
|
||||
|
||||
@ -130,7 +130,7 @@ instance Yesod App where
|
||||
}
|
||||
accounts =
|
||||
balanceReportAsHtml (JournalR, RegisterR) here hideEmptyAccts j q qopts $
|
||||
balanceReport ropts' m j
|
||||
balanceReport ropts'{query_=m} j
|
||||
|
||||
topShowmd = if showSidebar then "col-md-4" else "col-any-0" :: Text
|
||||
topShowsm = if showSidebar then "col-sm-4" else "" :: Text
|
||||
@ -265,7 +265,7 @@ getCurrentJournal jref opts d = do
|
||||
j <- liftIO (readIORef jref)
|
||||
(ej, changed) <- liftIO $ journalReloadIfChanged opts d j
|
||||
-- re-apply any initial filter specified at startup
|
||||
let initq = queryFromOpts d (reportopts_ opts)
|
||||
let initq = query_ $ reportopts_ opts
|
||||
case (changed, filterJournalTransactions initq <$> ej) of
|
||||
(False, _) -> return (j, Nothing)
|
||||
(True, Right j') -> do
|
||||
|
||||
@ -58,8 +58,7 @@ runWith opts
|
||||
-- | The web command.
|
||||
web :: WebOpts -> Journal -> IO ()
|
||||
web opts j = do
|
||||
d <- getCurrentDay
|
||||
let initq = queryFromOpts d $ reportopts_ $ cliopts_ opts
|
||||
let initq = query_ . reportopts_ $ cliopts_ opts
|
||||
j' = filterJournalTransactions initq j
|
||||
h = host_ opts
|
||||
p = port_ opts
|
||||
|
||||
Loading…
Reference in New Issue
Block a user