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.UIState | ||||||
| import Hledger.UI.UIUtils | import Hledger.UI.UIUtils | ||||||
| import Hledger.UI.Editor | import Hledger.UI.Editor | ||||||
|  | import Data.Foldable (asum) | ||||||
| 
 | 
 | ||||||
| errorScreen :: Screen | errorScreen :: Screen | ||||||
| errorScreen = ErrorScreen{ | errorScreen = ErrorScreen{ | ||||||
| @ -137,37 +138,61 @@ hledgerparseerrorpositionp = do | |||||||
|       ] |       ] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| -- Unconditionally reload the journal, regenerating the current screen | -- | Unconditionally reload the journal, regenerating the current screen | ||||||
| -- and all previous screens in the history. | -- 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 | -- If reloading fails, enter the error screen, or if we're already | ||||||
| -- on the error screen, update the error displayed. | -- 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. | -- 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 :: CliOpts -> Day -> UIState -> IO UIState | ||||||
| uiReloadJournal copts d ui = do | uiReloadJournal copts d ui = do | ||||||
|   ej <- journalReload copts |   ej <- | ||||||
|  |     let copts' = enableForecastPreservingPeriod ui copts | ||||||
|  |     in journalReload copts' | ||||||
|   return $ case ej of |   return $ case ej of | ||||||
|     Right j  -> regenerateScreens j d ui{aopts=(aopts ui){cliopts_=copts}} |     Right j  -> regenerateScreens j d ui | ||||||
|     Left err -> |     Left err -> | ||||||
|       case ui of |       case ui of | ||||||
|         UIState{aScreen=s@ErrorScreen{}} -> ui{aScreen=s{esError=err}} |         UIState{aScreen=s@ErrorScreen{}} -> ui{aScreen=s{esError=err}} | ||||||
|         _                                -> screenEnter d errorScreen{esError=err} ui |         _                                -> screenEnter d errorScreen{esError=err} ui | ||||||
| 
 | 
 | ||||||
| -- Like uiReloadJournal, but does not bother re-parsing the journal if | -- | Like uiReloadJournal, but does not re-parse the journal if the file(s) | ||||||
| -- the file(s) have not changed since last loaded. Always regenerates | -- have not changed since last loaded. Always regenerates the screens though, | ||||||
| -- the current and previous screens though, since opts or date may have changed. | -- since the provided options or today-date may have changed. | ||||||
| uiReloadJournalIfChanged :: CliOpts -> Day -> Journal -> UIState -> IO UIState | uiReloadJournalIfChanged :: CliOpts -> Day -> Journal -> UIState -> IO UIState | ||||||
| uiReloadJournalIfChanged copts d j ui = do | 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 |   return $ case ej of | ||||||
|     Right j' -> regenerateScreens j' d ui{aopts=(aopts ui){cliopts_=copts}} |     Right j' -> regenerateScreens j' d ui | ||||||
|     Left err -> |     Left err -> | ||||||
|       case ui of |       case ui of | ||||||
|         UIState{aScreen=s@ErrorScreen{}} -> ui{aScreen=s{esError=err}} |         UIState{aScreen=s@ErrorScreen{}} -> ui{aScreen=s{esError=err}} | ||||||
|         _                                -> screenEnter d errorScreen{esError=err} ui |         _                                -> 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 | -- Re-check any balance assertions in the current journal, and if any | ||||||
| -- fail, enter (or update) the error screen. Or if balance assertions | -- fail, enter (or update) the error screen. Or if balance assertions | ||||||
| -- are disabled, do nothing. | -- are disabled, do nothing. | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user