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, |   showMixedAmountDebug, | ||||||
|   showMixedAmountWithoutPrice, |   showMixedAmountWithoutPrice, | ||||||
|   showMixedAmountOneLineWithoutPrice, |   showMixedAmountOneLineWithoutPrice, | ||||||
|  |   showMixedAmountElided, | ||||||
|   cshowMixedAmountWithoutPrice, |   cshowMixedAmountWithoutPrice, | ||||||
|   cshowMixedAmountOneLineWithoutPrice, |   cshowMixedAmountOneLineWithoutPrice, | ||||||
|  |   cshowMixedAmountElided, | ||||||
|   showMixedAmountWithZeroCommodity, |   showMixedAmountWithZeroCommodity, | ||||||
|   showMixedAmountWithPrecision, |   showMixedAmountWithPrecision, | ||||||
|   setMixedAmountPrecision, |   setMixedAmountPrecision, | ||||||
| @ -736,6 +738,39 @@ cshowMixedAmountOneLineWithoutPrice m = intercalate ", " $ map cshowAmountWithou | |||||||
|       (Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m |       (Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m | ||||||
|       stripPrices (Mixed as) = Mixed $ map stripprice as where stripprice a = a{aprice=Nothing} |       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. | -- | Canonicalise a mixed amount's display styles using the provided commodity style map. | ||||||
| canonicaliseMixedAmount :: M.Map CommoditySymbol AmountStyle -> MixedAmount -> MixedAmount | canonicaliseMixedAmount :: M.Map CommoditySymbol AmountStyle -> MixedAmount -> MixedAmount | ||||||
| canonicaliseMixedAmount styles (Mixed as) = Mixed $ map (canonicaliseAmount styles) as | 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, | -- | Given a table representing a multi-column balance report (for example, | ||||||
| -- made using 'balanceReportAsTable'), render it in a format suitable for | -- 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 :: ReportOpts -> Table String String MixedAmount -> String | ||||||
| balanceReportTableAsText ropts = tableAsText ropts showamt | balanceReportTableAsText ropts@ReportOpts{..} = tableAsText ropts showamt | ||||||
|   where |   where | ||||||
|     showamt | color_ ropts = cshowMixedAmountOneLineWithoutPrice |     showamt | ||||||
|             | otherwise    =  showMixedAmountOneLineWithoutPrice |       | no_elide_ && color_ = cshowMixedAmountOneLineWithoutPrice | ||||||
|  |       | no_elide_           =  showMixedAmountOneLineWithoutPrice | ||||||
|  |       | color_              = cshowMixedAmountElided | ||||||
|  |       | otherwise           =  showMixedAmountElided | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| tests_Balance = tests "Balance" [ | tests_Balance = tests "Balance" [ | ||||||
|  | |||||||
| @ -316,6 +316,17 @@ supported. | |||||||
| The `--transpose` flag can be used to exchange the rows and columns of | The `--transpose` flag can be used to exchange the rows and columns of | ||||||
| a multicolumn report. | 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 | ### Budget report | ||||||
| 
 | 
 | ||||||
| With `--budget`, extra columns are displayed showing budget goals for each account and period, if any. | 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