fix:ui:transaction screen: update on data changes, first fix [#2288]

Make the transaction screen refresh properly after running an editor
with E, or reloading with g or --watch.
This commit is contained in:
Simon Michael 2025-09-11 16:46:08 +01:00
parent c906788334
commit c7c196caa6

View File

@ -12,7 +12,7 @@ module Hledger.UI.TransactionScreen
,tsHandle ,tsHandle
) where ) where
import Control.Monad import Brick.Widgets.Edit (editorText, renderEditor)
import Control.Monad.IO.Class (liftIO) import Control.Monad.IO.Class (liftIO)
import Data.List import Data.List
import Data.Maybe import Data.Maybe
@ -29,8 +29,10 @@ import Hledger.UI.UIState
import Hledger.UI.UIUtils import Hledger.UI.UIUtils
import Hledger.UI.UIScreens import Hledger.UI.UIScreens
import Hledger.UI.Editor import Hledger.UI.Editor
import Brick.Widgets.Edit (editorText, renderEditor)
import Hledger.UI.ErrorScreen (uiReloadJournalIfChanged, uiCheckBalanceAssertions, uiReloadJournal) import Hledger.UI.ErrorScreen (uiReloadJournalIfChanged, uiCheckBalanceAssertions, uiReloadJournal)
import Hledger.UI.RegisterScreen (rsHandle)
import System.Exit (ExitCode(..))
import Data.Function ((&))
tsDraw :: UIState -> [Widget Name] tsDraw :: UIState -> [Widget Name]
tsDraw UIState{aopts=UIOpts{uoCliOpts=copts@CliOpts{reportspec_=rspec@ReportSpec{_rsReportOpts=ropts}}} tsDraw UIState{aopts=UIOpts{uoCliOpts=copts@CliOpts{reportspec_=rspec@ReportSpec{_rsReportOpts=ropts}}}
@ -137,23 +139,35 @@ tsHandle ev = do
VtyEvent (EvKey (KChar 'q') []) -> halt VtyEvent (EvKey (KChar 'q') []) -> halt
VtyEvent (EvKey KEsc []) -> put' $ resetScreens d ui VtyEvent (EvKey KEsc []) -> put' $ resetScreens d ui
VtyEvent (EvKey (KChar c) []) | c == '?' -> put' $ setMode Help ui VtyEvent (EvKey (KChar c) []) | c == '?' -> put' $ setMode Help ui
VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui
where -- g or file change: reload the journal.
(pos,f) = case tsourcepos t of e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] -> do
(SourcePos f' l1 c1,_) -> (Just (unPos l1, Just $ unPos c1),f') -- To update all state: exit to register screen, regenerate screens, re-enter transaction screen.
-- Anywhere else here that we need to be this thorough ?
put' =<< liftIO (popScreen ui & uiReloadJournal copts d)
rsHandle (VtyEvent (EvKey KEnter []))
--
-- for debugging; leaving these here because they were hard to find
-- \u -> dbguiEv (pshow u) >> put' u -- doesn't log
-- \UIState{aScreen=TS tss} -> error' $ pshow $ _tssTransaction tss
-- E: run editor, reload the journal.
VtyEvent (EvKey (KChar 'E') []) -> do
suspendAndResume' $ do
exitcode <- runEditor pos f
case exitcode of
ExitSuccess -> return ()
ExitFailure c -> error' $ "running the text editor failed with exit code " ++ show c
-- Like above: exit to register screen, regenerate screens (if file has changed), re-enter transaction screen.
put' =<< liftIO (popScreen ui & uiReloadJournalIfChanged copts d j)
rsHandle (VtyEvent (EvKey KEnter []))
where (pos,f) = case tsourcepos t of (SourcePos f' l1 c1,_) -> (Just (unPos l1, Just $ unPos c1),f')
AppEvent (DateChange old _) | isStandardPeriod p && p `periodContainsDate` old -> AppEvent (DateChange old _) | isStandardPeriod p && p `periodContainsDate` old ->
put' $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui put' $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui
where where
p = reportPeriod ui p = reportPeriod ui
-- Reload. Warning, this updates parent screens but not the transaction screen itself (see tsUpdate).
-- To see the updated transaction, one must exit and re-enter the transaction screen.
e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] ->
liftIO (uiReloadJournal copts d ui) >>= put'
-- debugging.. leaving these here because they were hard to find
-- \u -> dbguiEv (pshow u) >> put' u -- doesn't log
-- \UIState{aScreen=TS tss} -> error' $ pshow $ _tssTransaction tss
VtyEvent (EvKey (KChar 'I') []) -> put' $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui) VtyEvent (EvKey (KChar 'I') []) -> put' $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)
-- for toggles that may change the current/prev/next transactions, -- for toggles that may change the current/prev/next transactions,