lib,ui: Store the original query string in ReportOpts, provide a function for regenerating ReportOpts.

This commit is contained in:
Stephen Morgan 2020-09-11 16:45:59 +10:00 committed by Simon Michael
parent 64e3e5c54d
commit ff0c5bc743
6 changed files with 55 additions and 46 deletions

View File

@ -15,6 +15,7 @@ module Hledger.Reports.ReportOptions (
ValuationType(..), ValuationType(..),
defreportopts, defreportopts,
rawOptsToReportOpts, rawOptsToReportOpts,
regenerateReportOpts,
flat_, flat_,
tree_, tree_,
reportOptsToggleStatus, reportOptsToggleStatus,
@ -96,6 +97,7 @@ data ReportOpts = ReportOpts {
,format_ :: StringFormat ,format_ :: StringFormat
,query_ :: Query ,query_ :: Query
,queryopts_ :: [QueryOpt] ,queryopts_ :: [QueryOpt]
,querystring_ :: T.Text
-- --
,average_ :: Bool ,average_ :: Bool
-- for posting reports (register) -- for posting reports (register)
@ -133,36 +135,38 @@ instance Default ReportOpts where def = defreportopts
defreportopts :: ReportOpts defreportopts :: ReportOpts
defreportopts = ReportOpts defreportopts = ReportOpts
nulldate { today_ = nulldate
def , period_ = PeriodAll
def , interval_ = NoInterval
def , statuses_ = []
def , value_ = Nothing
def , infer_value_ = False
def , depth_ = Nothing
def , date2_ = False
def , empty_ = False
def , no_elide_ = False
def , real_ = False
def , format_ = def
def , query_ = Any
def , queryopts_ = []
def , querystring_ = ""
def , average_ = False
def , related_ = False
def , txn_dates_ = False
def , balancetype_ = def
def , accountlistmode_ = ALFlat
def , drop_ = 0
def , row_total_ = False
def , no_total_ = False
def , pretty_tables_ = False
def , sort_amount_ = False
def , percent_ = False
def , invert_ = False
def , normalbalance_ = Nothing
def , color_ = False
def , forecast_ = Nothing
, transpose_ = False
}
rawOptsToReportOpts :: RawOpts -> IO ReportOpts rawOptsToReportOpts :: RawOpts -> IO ReportOpts
rawOptsToReportOpts rawopts = do rawOptsToReportOpts rawopts = do
@ -197,6 +201,7 @@ rawOptsToReportOpts rawopts = do
,format_ = format ,format_ = format
,query_ = simplifyQuery $ And [queryFromFlags reportopts, argsquery] ,query_ = simplifyQuery $ And [queryFromFlags reportopts, argsquery]
,queryopts_ = queryopts ,queryopts_ = queryopts
,querystring_ = querystring
,average_ = boolopt "average" rawopts ,average_ = boolopt "average" rawopts
,related_ = boolopt "related" rawopts ,related_ = boolopt "related" rawopts
,txn_dates_ = boolopt "txn-dates" rawopts ,txn_dates_ = boolopt "txn-dates" rawopts
@ -216,9 +221,14 @@ rawOptsToReportOpts rawopts = do
,forecast_ = forecastPeriodFromRawOpts d rawopts ,forecast_ = forecastPeriodFromRawOpts d rawopts
,transpose_ = boolopt "transpose" rawopts ,transpose_ = boolopt "transpose" rawopts
} }
return reportopts return reportopts
-- | Regenerate a ReportOpts on a different day with a different query string.
regenerateReportOpts :: Day -> T.Text -> ReportOpts -> Either String ReportOpts
regenerateReportOpts d querystring ropts = do
(q,o) <- parseQuery d querystring
return ropts{today_=d, query_=q, queryopts_=o, querystring_=querystring}
accountlistmodeopt :: RawOpts -> AccountListMode accountlistmodeopt :: RawOpts -> AccountListMode
accountlistmodeopt = accountlistmodeopt =
fromMaybe ALFlat . choiceopt parse where fromMaybe ALFlat . choiceopt parse where

View File

@ -117,7 +117,7 @@ asInit d reset ui@UIState{
asInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL: asInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
asDraw :: UIState -> [Widget Name] asDraw :: UIState -> [Widget Name]
asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystring_=query} asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
,ajournal=j ,ajournal=j
,aScreen=s@AccountsScreen{} ,aScreen=s@AccountsScreen{}
,aMode=mode ,aMode=mode
@ -172,7 +172,7 @@ asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},que
<+> toggles <+> toggles
<+> str (" account " ++ if ishistorical then "balances" else "changes") <+> str (" account " ++ if ishistorical then "balances" else "changes")
<+> borderPeriodStr (if ishistorical then "at end of" else "in") (period_ ropts) <+> borderPeriodStr (if ishistorical then "at end of" else "in") (period_ ropts)
<+> borderQueryStr query <+> borderQueryStr (T.unpack $ querystring_ ropts)
<+> borderDepthStr mdepth <+> borderDepthStr mdepth
<+> str (" ("++curidx++"/"++totidx++")") <+> str (" ("++curidx++"/"++totidx++")")
<+> (if ignore_assertions_ $ inputopts_ copts <+> (if ignore_assertions_ $ inputopts_ copts

View File

@ -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: rsInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
rsDraw :: UIState -> [Widget Name] rsDraw :: UIState -> [Widget Name]
rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystring_=query} rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
,aScreen=RegisterScreen{..} ,aScreen=RegisterScreen{..}
,aMode=mode ,aMode=mode
} = } =
@ -201,7 +201,7 @@ rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},que
<+> togglefilters <+> togglefilters
<+> str " transactions" <+> str " transactions"
-- <+> str (if ishistorical then " historical total" else " period total") -- <+> str (if ishistorical then " historical total" else " period total")
<+> borderQueryStr query <+> borderQueryStr (T.unpack $ querystring_ ropts)
-- <+> str " and subs" -- <+> str " and subs"
<+> borderPeriodStr "in" (period_ ropts) <+> borderPeriodStr "in" (period_ ropts)
<+> str " (" <+> str " ("

View File

@ -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: tsInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
tsDraw :: UIState -> [Widget Name] tsDraw :: UIState -> [Widget Name]
tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystring_=query} tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
,ajournal=j ,ajournal=j
,aScreen=TransactionScreen{tsTransaction=(i,t) ,aScreen=TransactionScreen{tsTransaction=(i,t)
,tsTransactions=nts ,tsTransactions=nts
@ -97,7 +97,7 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystrin
<+> withAttr ("border" <> "bold") (str $ show i) <+> withAttr ("border" <> "bold") (str $ show i)
<+> str (" of "++show (length nts)) <+> str (" of "++show (length nts))
<+> togglefilters <+> togglefilters
<+> borderQueryStr query <+> borderQueryStr (T.unpack $ querystring_ ropts)
<+> str (" in "++T.unpack (replaceHiddenAccountsNameWith "All" acct)++")") <+> str (" in "++T.unpack (replaceHiddenAccountsNameWith "All" acct)++")")
<+> (if ignore_assertions_ $ inputopts_ copts then withAttr ("border" <> "query") (str " ignoring balance assertions") else str "") <+> (if ignore_assertions_ $ inputopts_ copts then withAttr ("border" <> "query") (str " ignoring balance assertions") else str "")
where where

View File

@ -61,14 +61,13 @@ data UIOpts = UIOpts {
watch_ :: Bool watch_ :: Bool
,change_ :: Bool ,change_ :: Bool
,cliopts_ :: CliOpts ,cliopts_ :: CliOpts
,querystring_ :: String
} deriving (Show) } deriving (Show)
defuiopts = UIOpts defuiopts = UIOpts
def { watch_ = False
def , change_ = False
def , cliopts_ = def
"" }
-- instance Default CliOpts where def = defcliopts -- instance Default CliOpts where def = defcliopts
@ -79,7 +78,6 @@ rawOptsToUIOpts rawopts = checkUIOpts <$> do
watch_ = boolopt "watch" rawopts watch_ = boolopt "watch" rawopts
,change_ = boolopt "change" rawopts ,change_ = boolopt "change" rawopts
,cliopts_ = cliopts ,cliopts_ = cliopts
,querystring_ = unwords . map quoteIfNeeded $ listofstringopt "args" rawopts
} }
checkUIOpts :: UIOpts -> UIOpts checkUIOpts :: UIOpts -> UIOpts

View File

@ -240,8 +240,9 @@ resetReportPeriod = setReportPeriod PeriodAll
-- | Apply a new filter query. -- | Apply a new filter query.
setFilter :: String -> UIState -> UIState setFilter :: String -> UIState -> UIState
setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} = setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{query_=q}},querystring_=s}} ui{aopts=uopts{cliopts_=copts{reportopts_=newRopts}}}
where q = either (const None) fst . parseQuery undefined $ T.pack s where
newRopts = either (const ropts) id $ regenerateReportOpts (today_ ropts) (T.pack s) ropts
-- | Reset some filters & toggles. -- | Reset some filters & toggles.
resetFilter :: UIState -> UIState resetFilter :: UIState -> UIState
@ -307,7 +308,7 @@ showMinibuffer :: UIState -> UIState
showMinibuffer ui = setMode (Minibuffer e) ui showMinibuffer ui = setMode (Minibuffer e) ui
where where
e = applyEdit gotoEOL $ editor MinibufferEditor (Just 1) oldq e = applyEdit gotoEOL $ editor MinibufferEditor (Just 1) oldq
oldq = querystring_ $ aopts ui oldq = T.unpack . querystring_ . reportopts_ . cliopts_ $ aopts ui
-- | Close the minibuffer, discarding any edit in progress. -- | Close the minibuffer, discarding any edit in progress.
closeMinibuffer :: UIState -> UIState closeMinibuffer :: UIState -> UIState