fix: ui: Make sure RegisterScreen (and consequently TransactionScreen)

only display forecast transactions when the appropriate flag is set.
This commit is contained in:
Stephen Morgan 2021-08-24 15:50:32 +10:00 committed by Simon Michael
parent 90fd2a9aaf
commit a3cacca71d
3 changed files with 22 additions and 13 deletions

View File

@ -19,7 +19,7 @@ import Control.Monad.IO.Class (liftIO)
import Data.List
import Data.Maybe
import qualified Data.Text as T
import Data.Time.Calendar (Day, addDays)
import Data.Time.Calendar (Day)
import qualified Data.Vector as V
import Graphics.Vty (Event(..),Key(..),Modifier(..))
import Lens.Micro.Platform
@ -77,16 +77,7 @@ asInit d reset ui@UIState{
as = map asItemAccountName displayitems
-- Further restrict the query based on the current period and future/forecast mode.
rspec' = rspec{_rsQuery=simplifyQuery $ And [_rsQuery rspec, periodq, excludeforecastq (forecast_ $ inputopts_ copts)]}
where
periodq = Date $ periodAsDateSpan $ period_ ropts
-- Except in forecast mode, exclude future/forecast transactions.
excludeforecastq (Just _) = Any
excludeforecastq Nothing = -- not:date:tomorrow- not:tag:generated-transaction
And [
Not (Date $ DateSpan (Just $ addDays 1 d) Nothing)
,Not generatedTransactionTag
]
rspec' = reportSpecSetFutureAndForecast d (forecast_ $ inputopts_ copts) rspec
-- run the report
(items,_total) = balanceReport rspec' j

View File

@ -56,7 +56,7 @@ rsSetAccount a forceinclusive scr@RegisterScreen{} =
rsSetAccount _ _ scr = scr
rsInit :: Day -> Bool -> UIState -> UIState
rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportspec_=rspec@ReportSpec{_rsReportOpts=ropts}}}, ajournal=j, aScreen=s@RegisterScreen{..}} =
rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec@ReportSpec{_rsReportOpts=ropts}}}, ajournal=j, aScreen=s@RegisterScreen{..}} =
ui{aScreen=s{rsList=newitems'}}
where
-- gather arguments and queries
@ -72,7 +72,7 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportspec_=rspec
-- always show historical balance
-- , balanceaccum_= Historical
}
rspec' =
rspec' = reportSpecSetFutureAndForecast d (forecast_ $ inputopts_ copts) .
either (error "rsInit: adjusting the query for register, should not have failed") id $ -- PARTIAL:
updateReportSpec ropts' rspec{_rsDay=d}
items = accountTransactionsReport rspec' j thisacctq

View File

@ -24,6 +24,7 @@ module Hledger.UI.UIUtils (
,scrollSelectionToMiddle
,suspend
,redraw
,reportSpecSetFutureAndForecast
)
where
@ -36,6 +37,7 @@ import Brick.Widgets.List (List, listSelectedL, listNameL, listItemHeightL)
import Control.Monad.IO.Class
import Data.List
import qualified Data.Text as T
import Data.Time (Day, addDays)
import Graphics.Vty
(Event(..),Key(..),Modifier(..),Vty(..),Color,Attr,currentAttr,refresh
-- ,Output(displayBounds,mkDisplayContext),DisplayContext(..)
@ -342,3 +344,19 @@ normaliseMovementKeys ev
| ev `elem` moveLeftEvents = EvKey KLeft []
| ev `elem` moveRightEvents = EvKey KRight []
| otherwise = ev
-- | Update the ReportSpec's query to exclude future transactions (later than the given day)
-- and forecast transactions (generated by --forecast), if the given forecast DateSpan is Nothing,
-- and include them otherwise.
reportSpecSetFutureAndForecast :: Day -> Maybe DateSpan -> ReportSpec -> ReportSpec
reportSpecSetFutureAndForecast d forecast rspec =
rspec{_rsQuery=simplifyQuery $ And [_rsQuery rspec, periodq, excludeforecastq forecast]}
where
periodq = Date . periodAsDateSpan . period_ $ _rsReportOpts rspec
-- Except in forecast mode, exclude future/forecast transactions.
excludeforecastq (Just _) = Any
excludeforecastq Nothing = -- not:date:tomorrow- not:tag:generated-transaction
And [
Not (Date $ DateSpan (Just $ addDays 1 d) Nothing)
,Not generatedTransactionTag
]