Skip to content

Instantly share code, notes, and snippets.

@Leon2xiaowu
Last active February 23, 2025 10:03
Show Gist options
  • Select an option

  • Save Leon2xiaowu/6409ed93cad024d90167358db0fefc1d to your computer and use it in GitHub Desktop.

Select an option

Save Leon2xiaowu/6409ed93cad024d90167358db0fefc1d to your computer and use it in GitHub Desktop.
Fava Dashboards Sunburst Support SubClass
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