Last active
February 23, 2025 10:03
-
-
Save Leon2xiaowu/6409ed93cad024d90167358db0fefc1d to your computer and use it in GitHub Desktop.
Fava Dashboards Sunburst Support SubClass
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| dashboards: | |
| - name: Assets | |
| panels: | |
| - title: Asset Classes 🏦 | |
| width: 50% | |
| queries: | |
| - bql: &assets_bql | | |
| SELECT currency, CONVERT(SUM(position), '{{ledger.ccy}}') as market_value | |
| WHERE account_sortkey(account) ~ '^[01]' | |
| GROUP BY currency | |
| ORDER BY market_value | |
| type: echarts | |
| script: &asset_classes | | |
| const currencyFormatter = utils.currencyFormatter(ledger.ccy); | |
| let totalValue = 0; | |
| const assetClasses = {}; | |
| const subAssetClasses = {}; | |
| for (let row of panel.queries[0].result) { | |
| if (!row.market_value[ledger.ccy]) continue; | |
| const ccy = row.currency; | |
| const value = row.market_value[ledger.ccy]; | |
| const assetName = ledger.commodities[ccy]?.meta.name ?? ccy; | |
| const assetClass = ledger.commodities[ccy]?.meta.asset_class ?? "unknown"; | |
| const subAssetClass = ledger.commodities[ccy]?.meta.asset_subclass ?? assetClass; | |
| // 初始化大类 | |
| if (!(assetClass in assetClasses)) { | |
| assetClasses[assetClass] = { name: assetClass, children: [] }; | |
| } | |
| // 初始化小类 | |
| if (subAssetClass && !(subAssetClass in subAssetClasses)) { | |
| subAssetClasses[subAssetClass] = { name: subAssetClass, children: [] }; | |
| // 小类加入大类 | |
| assetClasses[assetClass].children.push(subAssetClasses[subAssetClass]); | |
| } | |
| if (subAssetClass) { | |
| // 小类加入具体资产 | |
| subAssetClasses[subAssetClass].children.push({ name: assetName, value }); | |
| } else { | |
| assetClasses[assetClass].children.push({ name: assetName, value }); | |
| } | |
| totalValue += value; | |
| } | |
| return { | |
| tooltip: { | |
| formatter: (params) => | |
| `${params.marker} ${params.name} <span style="padding-left: 15px; font-weight: bold;">${currencyFormatter( | |
| params.value, | |
| )}</span> (${((params.value / totalValue) * 100).toFixed(0)}%)`, | |
| }, | |
| series: [ | |
| { | |
| type: "sunburst", | |
| radius: "100%", | |
| label: { | |
| minAngle: 3, | |
| width: 170, | |
| overflow: "truncate", | |
| }, | |
| labelLayout: { | |
| hideOverlap: true, | |
| }, | |
| data: Object.values(assetClasses), | |
| }, | |
| ], | |
| }; | |
| # utils: | |
| # inline: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment