fix: aregister: Make multicommodity amounts are properly aligned in
aregister. (#1656) This also switches to the renderTable interface for laying out aregister, just as in postingsReport.
This commit is contained in:
		
							parent
							
								
									06312c353a
								
							
						
					
					
						commit
						59b89947eb
					
				| @ -19,17 +19,19 @@ module Hledger.Cli.Commands.Aregister ( | |||||||
|  ,tests_Aregister |  ,tests_Aregister | ||||||
| ) where | ) where | ||||||
| 
 | 
 | ||||||
| import Data.List (find, intersperse) | import Data.Default (def) | ||||||
|  | import Data.List (find) | ||||||
| import Data.Maybe (fromMaybe) | import Data.Maybe (fromMaybe) | ||||||
| import qualified Data.Text as T | import qualified Data.Text as T | ||||||
| import qualified Data.Text.Lazy as TL | import qualified Data.Text.Lazy as TL | ||||||
| import qualified Data.Text.Lazy.Builder as TB | import qualified Data.Text.Lazy.Builder as TB | ||||||
| import System.Console.CmdArgs.Explicit (flagNone, flagReq) | import System.Console.CmdArgs.Explicit (flagNone, flagReq) | ||||||
| import Hledger.Read.CsvReader (CSV, CsvRecord, printCSV) |  | ||||||
| 
 | 
 | ||||||
| import Hledger | import Hledger | ||||||
|  | import Hledger.Read.CsvReader (CSV, CsvRecord, printCSV) | ||||||
| import Hledger.Cli.CliOptions | import Hledger.Cli.CliOptions | ||||||
| import Hledger.Cli.Utils | import Hledger.Cli.Utils | ||||||
|  | import Text.Tabular.AsciiWide | ||||||
| 
 | 
 | ||||||
| aregistermode = hledgerCommandMode | aregistermode = hledgerCommandMode | ||||||
|   $(embedFileRelative "Hledger/Cli/Commands/Aregister.txt") |   $(embedFileRelative "Hledger/Cli/Commands/Aregister.txt") | ||||||
| @ -123,17 +125,16 @@ accountTransactionsReportItemAsCsvRecord | |||||||
| 
 | 
 | ||||||
| -- | Render a register report as plain text suitable for console output. | -- | Render a register report as plain text suitable for console output. | ||||||
| accountTransactionsReportAsText :: CliOpts -> Query -> Query -> AccountTransactionsReport -> TL.Text | accountTransactionsReportAsText :: CliOpts -> Query -> Query -> AccountTransactionsReport -> TL.Text | ||||||
| accountTransactionsReportAsText copts reportq thisacctq items | accountTransactionsReportAsText copts reportq thisacctq items = TB.toLazyText $ | ||||||
|   = TB.toLazyText . unlinesB $ |     title <> TB.singleton '\n' <> lines | ||||||
|     title : |  | ||||||
|     map (accountTransactionsReportItemAsText copts reportq thisacctq amtwidth balwidth) items |  | ||||||
|   where |   where | ||||||
|     amtwidth = maximumStrict $ 12 : map (wbWidth . showamt . itemamt) items |     lines = foldMap (accountTransactionsReportItemAsText copts reportq thisacctq amtwidth balwidth) items | ||||||
|     balwidth = maximumStrict $ 12 : map (wbWidth . showamt . itembal) items |     amtwidth = maximumStrict $ 12 : widths (map itemamt items) | ||||||
|     showamt = showMixedAmountB oneLine{displayMinWidth=Just 12, displayMaxWidth=mmax}  -- color_ |     balwidth = maximumStrict $ 12 : widths (map itembal items) | ||||||
|       where mmax = if no_elide_ . _rsReportOpts . reportspec_ $ copts then Nothing else Just 32 |     widths = map wbWidth . concatMap (showMixedAmountLinesB oneLine) | ||||||
|     itemamt (_,_,_,_,a,_) = a |     itemamt (_,_,_,_,a,_) = a | ||||||
|     itembal (_,_,_,_,_,a) = a |     itembal (_,_,_,_,_,a) = a | ||||||
|  | 
 | ||||||
|     -- show a title indicating which account was picked, which can be confusing otherwise |     -- show a title indicating which account was picked, which can be confusing otherwise | ||||||
|     title = maybe mempty (\s -> foldMap TB.fromText ["Transactions in ", s, " and subaccounts:"]) macct |     title = maybe mempty (\s -> foldMap TB.fromText ["Transactions in ", s, " and subaccounts:"]) macct | ||||||
|       where |       where | ||||||
| @ -165,20 +166,23 @@ accountTransactionsReportItemAsText | |||||||
|     -- String      -- a display string describing the other account(s), if any |     -- String      -- a display string describing the other account(s), if any | ||||||
|     -- MixedAmount -- the amount posted to the current account(s) (or total amount posted) |     -- MixedAmount -- the amount posted to the current account(s) (or total amount posted) | ||||||
|     -- MixedAmount -- the register's running total or the current account(s)'s historical balance, after this transaction |     -- MixedAmount -- the register's running total or the current account(s)'s historical balance, after this transaction | ||||||
|     foldMap TB.fromText . concat . intersperse (["\n"]) $ |     table <> TB.singleton '\n' | ||||||
|       [ fitText (Just datewidth) (Just datewidth) True True date |  | ||||||
|       , " " |  | ||||||
|       , fitText (Just descwidth) (Just descwidth) True True tdescription |  | ||||||
|       , "  " |  | ||||||
|       , fitText (Just acctwidth) (Just acctwidth) True True accts |  | ||||||
|       , "  " |  | ||||||
|       , amtfirstline |  | ||||||
|       , "  " |  | ||||||
|       , balfirstline |  | ||||||
|       ] |  | ||||||
|       : |  | ||||||
|       [ [ spacer, a, "  ", b ] | (a,b) <- zip amtrest balrest ] |  | ||||||
|   where |   where | ||||||
|  |     table = renderRowB def{tableBorders=False, borderSpaces=False} . Group NoLine $ map Header | ||||||
|  |       [ textCell TopLeft $ fitText (Just datewidth) (Just datewidth) True True date | ||||||
|  |       , spacerCell | ||||||
|  |       , textCell TopLeft $ fitText (Just descwidth) (Just descwidth) True True tdescription | ||||||
|  |       , spacerCell2 | ||||||
|  |       , textCell TopLeft $ fitText (Just acctwidth) (Just acctwidth) True True accts | ||||||
|  |       , spacerCell2 | ||||||
|  |       , Cell TopRight $ map (pad amtwidth) amt | ||||||
|  |       , spacerCell2 | ||||||
|  |       , Cell BottomRight $ map (pad balwidth) bal | ||||||
|  |       ] | ||||||
|  |     spacerCell  = Cell BottomLeft [WideBuilder (TB.singleton ' ') 1] | ||||||
|  |     spacerCell2 = Cell BottomLeft [WideBuilder (TB.fromString "  ") 2] | ||||||
|  |     pad fullwidth amt = WideBuilder (TB.fromText $ T.replicate w " ") w <> amt | ||||||
|  |       where w = fullwidth - wbWidth amt | ||||||
|     -- calculate widths |     -- calculate widths | ||||||
|     (totalwidth,mdescwidth) = registerWidthsFromOpts copts |     (totalwidth,mdescwidth) = registerWidthsFromOpts copts | ||||||
|     (datewidth, date) = (10, showDate $ transactionRegisterDate reportq thisacctq t) |     (datewidth, date) = (10, showDate $ transactionRegisterDate reportq thisacctq t) | ||||||
| @ -200,18 +204,9 @@ accountTransactionsReportItemAsText | |||||||
|     -- gather content |     -- gather content | ||||||
|     accts = -- T.unpack $ elideAccountName acctwidth $ T.pack |     accts = -- T.unpack $ elideAccountName acctwidth $ T.pack | ||||||
|             otheracctsstr |             otheracctsstr | ||||||
|     amt = TL.toStrict . TB.toLazyText . wbBuilder $ showamt amtwidth change |     amt = showamt change | ||||||
|     bal = TL.toStrict . TB.toLazyText . wbBuilder $ showamt balwidth balance |     bal = showamt balance | ||||||
|     showamt w = showMixedAmountB noPrice{displayColour=color_, displayMinWidth=Just w, displayMaxWidth=Just w} |     showamt = showMixedAmountLinesB noPrice{displayColour=color_} | ||||||
|     -- alternate behaviour, show null amounts as 0 instead of blank |  | ||||||
|     -- amt = if null amt' then "0" else amt' |  | ||||||
|     -- bal = if null bal' then "0" else bal' |  | ||||||
|     (amtlines, ballines) = (T.lines amt, T.lines bal) |  | ||||||
|     (amtlen, ballen) = (length amtlines, length ballines) |  | ||||||
|     numlines = max 1 (max amtlen ballen) |  | ||||||
|     (amtfirstline:amtrest) = take numlines $ amtlines ++ repeat "" -- posting amount is top-aligned |  | ||||||
|     (balfirstline:balrest) = take numlines $ replicate (numlines - ballen) "" ++ ballines -- balance amount is bottom-aligned |  | ||||||
|     spacer = T.replicate (totalwidth - (amtwidth + 2 + balwidth)) " " |  | ||||||
| 
 | 
 | ||||||
| -- tests | -- tests | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -79,3 +79,24 @@ Transactions in a and subaccounts: | |||||||
| 2021-01-03 fifth                a                                5            15 | 2021-01-03 fifth                a                                5            15 | ||||||
| 2021-01-03 sixth, because fo..  a                                6            21 | 2021-01-03 sixth, because fo..  a                                6            21 | ||||||
| 2021-01-04 seventh, because ..  b                                7            28 | 2021-01-04 seventh, because ..  b                                7            28 | ||||||
|  | 
 | ||||||
|  | < | ||||||
|  | 2021-01-01 | ||||||
|  |   a    1 A | ||||||
|  |   a   -1 B | ||||||
|  |   b    1 B | ||||||
|  |   c   -1 A | ||||||
|  | 
 | ||||||
|  | 2021-01-02 | ||||||
|  |   a    1 C | ||||||
|  |   b   -1 C | ||||||
|  | 
 | ||||||
|  | # 6. aregister correctly aligns amounts when there are multiple commodities (#1656). | ||||||
|  | $ hledger -f- areg a | ||||||
|  | Transactions in a and subaccounts: | ||||||
|  | 2021-01-01                      b, c                           1 A           1 A | ||||||
|  |                                                               -1 B          -1 B | ||||||
|  | 2021-01-02                      b                              1 C           1 A | ||||||
|  |                                                                             -1 B | ||||||
|  |                                                                              1 C | ||||||
|  | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user