ui: preserve forecast txns (& period) when reloading journal (#1204)
This commit is contained in:
		
							parent
							
								
									6158d16443
								
							
						
					
					
						commit
						15dc638a07
					
				| @ -30,6 +30,7 @@ import Hledger.UI.UITypes | ||||
| import Hledger.UI.UIState | ||||
| import Hledger.UI.UIUtils | ||||
| import Hledger.UI.Editor | ||||
| import Data.Foldable (asum) | ||||
| 
 | ||||
| errorScreen :: Screen | ||||
| errorScreen = ErrorScreen{ | ||||
| @ -137,37 +138,61 @@ hledgerparseerrorpositionp = do | ||||
|       ] | ||||
| 
 | ||||
| 
 | ||||
| -- Unconditionally reload the journal, regenerating the current screen | ||||
| -- and all previous screens in the history. | ||||
| -- | Unconditionally reload the journal, regenerating the current screen | ||||
| -- and all previous screens in the history as of the provided today-date. | ||||
| -- If reloading fails, enter the error screen, or if we're already | ||||
| -- on the error screen, update the error displayed. | ||||
| -- The provided CliOpts are used for reloading, and then saved | ||||
| -- in the UIState if reloading is successful (otherwise the | ||||
| -- ui state keeps its old cli opts.) | ||||
| -- Defined here so it can reference the error screen. | ||||
| -- | ||||
| -- The provided CliOpts are used for reloading, and then saved in the | ||||
| -- UIState if reloading is successful (otherwise the UIState keeps its old | ||||
| -- CliOpts.) (XXX needed for.. ?) | ||||
| -- | ||||
| -- Forecasted transactions are always generated, as at hledger-ui startup. | ||||
| -- If a forecast period is specified in the provided opts, or was specified | ||||
| -- at startup, it is preserved. | ||||
| -- | ||||
| uiReloadJournal :: CliOpts -> Day -> UIState -> IO UIState | ||||
| uiReloadJournal copts d ui = do | ||||
|   ej <- journalReload copts | ||||
|   ej <- | ||||
|     let copts' = enableForecastPreservingPeriod ui copts | ||||
|     in journalReload copts' | ||||
|   return $ case ej of | ||||
|     Right j  -> regenerateScreens j d ui{aopts=(aopts ui){cliopts_=copts}} | ||||
|     Right j  -> regenerateScreens j d ui | ||||
|     Left err -> | ||||
|       case ui of | ||||
|         UIState{aScreen=s@ErrorScreen{}} -> ui{aScreen=s{esError=err}} | ||||
|         _                                -> screenEnter d errorScreen{esError=err} ui | ||||
| 
 | ||||
| -- Like uiReloadJournal, but does not bother re-parsing the journal if | ||||
| -- the file(s) have not changed since last loaded. Always regenerates | ||||
| -- the current and previous screens though, since opts or date may have changed. | ||||
| -- | Like uiReloadJournal, but does not re-parse the journal if the file(s) | ||||
| -- have not changed since last loaded. Always regenerates the screens though, | ||||
| -- since the provided options or today-date may have changed. | ||||
| uiReloadJournalIfChanged :: CliOpts -> Day -> Journal -> UIState -> IO UIState | ||||
| uiReloadJournalIfChanged copts d j ui = do | ||||
|   (ej, _changed) <- journalReloadIfChanged copts d j | ||||
|   (ej, _changed) <- | ||||
|     let copts' = enableForecastPreservingPeriod ui copts | ||||
|     in journalReloadIfChanged copts' d j | ||||
|   return $ case ej of | ||||
|     Right j' -> regenerateScreens j' d ui{aopts=(aopts ui){cliopts_=copts}} | ||||
|     Right j' -> regenerateScreens j' d ui | ||||
|     Left err -> | ||||
|       case ui of | ||||
|         UIState{aScreen=s@ErrorScreen{}} -> ui{aScreen=s{esError=err}} | ||||
|         _                                -> screenEnter d errorScreen{esError=err} ui | ||||
| 
 | ||||
| -- | Ensure this CliOpts enables forecasted transactions. | ||||
| -- If a forecast period was specified in the old CliOpts, | ||||
| -- or in the provided UIState's startup options, | ||||
| -- it is preserved. | ||||
| enableForecastPreservingPeriod :: UIState -> CliOpts -> CliOpts | ||||
| enableForecastPreservingPeriod ui copts@CliOpts{reportspec_=rspec@ReportSpec{rsOpts=ropts}} = | ||||
|   copts{reportspec_=rspec{rsOpts=ropts{forecast_=mforecast}}} | ||||
|   where | ||||
|     mforecast = asum [mprovidedforecastperiod, mstartupforecastperiod, mdefaultforecastperiod] | ||||
|       where | ||||
|         mprovidedforecastperiod = forecast_ ropts | ||||
|         mstartupforecastperiod  = forecast_ $ rsOpts $ reportspec_ $ cliopts_ $ astartupopts ui | ||||
|         mdefaultforecastperiod  = Just nulldatespan | ||||
| 
 | ||||
| -- Re-check any balance assertions in the current journal, and if any | ||||
| -- fail, enter (or update) the error screen. Or if balance assertions | ||||
| -- are disabled, do nothing. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user