balcmds: elide amounts with 3 or more commodities, unless --no-elide
Multicolumn balance reports showing many commodities tend to become unreadably wide, especially in tree mode. Now by default we show at most two commodities, and a count of the rest if there are more than two. This should help keep reports somewhat readable by default.
This commit is contained in:
		
							parent
							
								
									1a321c9ae0
								
							
						
					
					
						commit
						2739a70a38
					
				| @ -121,8 +121,10 @@ module Hledger.Data.Amount ( | ||||
|   showMixedAmountDebug, | ||||
|   showMixedAmountWithoutPrice, | ||||
|   showMixedAmountOneLineWithoutPrice, | ||||
|   showMixedAmountElided, | ||||
|   cshowMixedAmountWithoutPrice, | ||||
|   cshowMixedAmountOneLineWithoutPrice, | ||||
|   cshowMixedAmountElided, | ||||
|   showMixedAmountWithZeroCommodity, | ||||
|   showMixedAmountWithPrecision, | ||||
|   setMixedAmountPrecision, | ||||
| @ -736,6 +738,39 @@ cshowMixedAmountOneLineWithoutPrice m = intercalate ", " $ map cshowAmountWithou | ||||
|       (Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m | ||||
|       stripPrices (Mixed as) = Mixed $ map stripprice as where stripprice a = a{aprice=Nothing} | ||||
| 
 | ||||
| -- | Like showMixedAmountOneLineWithoutPrice, but show at most two commodities, | ||||
| -- with a elision indicator if there are more. | ||||
| showMixedAmountElided :: MixedAmount -> String | ||||
| showMixedAmountElided m = intercalate ", " $ take 2 astrs ++ elisionstr | ||||
|   where | ||||
|     astrs = map showAmountWithoutPrice as | ||||
|       where | ||||
|         (Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m | ||||
|           where | ||||
|             stripPrices (Mixed as) = Mixed $ map stripprice as | ||||
|               where | ||||
|                 stripprice a = a{aprice=Nothing} | ||||
|     elisionstr | n > 2     = [show (n - 2) ++ " more.."] | ||||
|                | otherwise = [] | ||||
|       where | ||||
|         n = length astrs | ||||
| 
 | ||||
| -- | Colour version. | ||||
| cshowMixedAmountElided :: MixedAmount -> String | ||||
| cshowMixedAmountElided m = intercalate ", " $ take 2 astrs ++ elisionstr | ||||
|   where | ||||
|     astrs = map cshowAmountWithoutPrice as | ||||
|       where | ||||
|         (Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m | ||||
|           where | ||||
|             stripPrices (Mixed as) = Mixed $ map stripprice as | ||||
|               where | ||||
|                 stripprice a = a{aprice=Nothing} | ||||
|     elisionstr | n > 2     = [show (n - 2) ++ " more.."] | ||||
|                | otherwise = [] | ||||
|       where | ||||
|         n = length astrs | ||||
| 
 | ||||
| -- | Canonicalise a mixed amount's display styles using the provided commodity style map. | ||||
| canonicaliseMixedAmount :: M.Map CommoditySymbol AmountStyle -> MixedAmount -> MixedAmount | ||||
| canonicaliseMixedAmount styles (Mixed as) = Mixed $ map (canonicaliseAmount styles) as | ||||
|  | ||||
| @ -629,12 +629,16 @@ balanceReportAsTable opts@ReportOpts{average_, row_total_, balancetype_} | ||||
| 
 | ||||
| -- | Given a table representing a multi-column balance report (for example, | ||||
| -- made using 'balanceReportAsTable'), render it in a format suitable for | ||||
| -- console output. | ||||
| -- console output. Amounts with more than two commodities will be elided | ||||
| -- unless --no-elide is used. | ||||
| balanceReportTableAsText :: ReportOpts -> Table String String MixedAmount -> String | ||||
| balanceReportTableAsText ropts = tableAsText ropts showamt | ||||
| balanceReportTableAsText ropts@ReportOpts{..} = tableAsText ropts showamt | ||||
|   where | ||||
|     showamt | color_ ropts = cshowMixedAmountOneLineWithoutPrice | ||||
|             | otherwise    =  showMixedAmountOneLineWithoutPrice | ||||
|     showamt | ||||
|       | no_elide_ && color_ = cshowMixedAmountOneLineWithoutPrice | ||||
|       | no_elide_           =  showMixedAmountOneLineWithoutPrice | ||||
|       | color_              = cshowMixedAmountElided | ||||
|       | otherwise           =  showMixedAmountElided | ||||
| 
 | ||||
| 
 | ||||
| tests_Balance = tests "Balance" [ | ||||
|  | ||||
| @ -316,6 +316,17 @@ supported. | ||||
| The `--transpose` flag can be used to exchange the rows and columns of | ||||
| a multicolumn report. | ||||
|       | ||||
| When showing multicommodity amounts, multicolumn balance reports will | ||||
| elide any amounts which have more than two commodities, since | ||||
| otherwise columns could get very wide. The `--no-elide` flag disables | ||||
| this. Hiding totals with the `-N/--no-total` flag can also help reduce | ||||
| the width of multicommodity reports.  | ||||
| 
 | ||||
| When the report is still too wide, a good workaround is to pipe it | ||||
| into `less -RS` (-R for colour, -S to chop long lines).  | ||||
| Eg: `hledger bal -D | less -RS`. | ||||
| 
 | ||||
| 
 | ||||
| ### Budget report | ||||
| 
 | ||||
| With `--budget`, extra columns are displayed showing budget goals for each account and period, if any. | ||||
|  | ||||
							
								
								
									
										26
									
								
								tests/balance/multicommodity.test
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								tests/balance/multicommodity.test
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| # 1. In tabular balance reports, amounts with more than two commodities are elided. | ||||
| < | ||||
| 2020-01-01 | ||||
|   (a)  1A | ||||
|   (a)  1B | ||||
|   (a)  1C | ||||
|   (a)  1D | ||||
| 
 | ||||
| $ hledger -f- bal -Y | ||||
| Balance changes in 2020: | ||||
| 
 | ||||
|    ||             2020  | ||||
| ===++================== | ||||
|  a || 1A, 1B, 2 more..  | ||||
| ---++------------------ | ||||
|    || 1A, 1B, 2 more..  | ||||
| 
 | ||||
| # 2. Unless --no-elide is used. | ||||
| $ hledger -f- bal -Y --no-elide | ||||
| Balance changes in 2020: | ||||
| 
 | ||||
|    ||           2020  | ||||
| ===++================ | ||||
|  a || 1A, 1B, 1C, 1D  | ||||
| ---++---------------- | ||||
|    || 1A, 1B, 1C, 1D  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user