From e0cec851962a07e9eadfcf9acd2ea89f528b5b21 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Fri, 26 Jul 2024 09:48:32 -0400 Subject: [PATCH] Fix currency formatting in pie chart visualization --- app/helpers/value_groups_helper.rb | 22 ++++++------- .../controllers/pie_chart_controller.js | 32 ++++--------------- .../dashboard/_allocation_chart.html.erb | 8 ++--- 3 files changed, 19 insertions(+), 43 deletions(-) diff --git a/app/helpers/value_groups_helper.rb b/app/helpers/value_groups_helper.rb index c8e96d073c7..5362ed0c7d4 100644 --- a/app/helpers/value_groups_helper.rb +++ b/app/helpers/value_groups_helper.rb @@ -1,17 +1,13 @@ module ValueGroupsHelper def value_group_pie_data(value_group) - value_group.children - .map do |child| - { - label: to_accountable_title(Accountable.from_type(child.name)), - percent_of_total: child.percent_of_total.round(1).to_f, - value: child.sum.amount.to_f, - currency: child.sum.currency.iso_code, - bg_color: accountable_bg_class(child.name), - fill_color: accountable_fill_class(child.name) - } - end - .filter { |child| child[:value] > 0 } - .to_json + value_group.children.filter { |c| c.sum > 0 }.map do |child| + { + label: to_accountable_title(Accountable.from_type(child.name)), + percent_of_total: child.percent_of_total.round(1).to_f, + formatted_value: format_money(child.sum, precision: 0), + bg_color: accountable_bg_class(child.name), + fill_color: accountable_fill_class(child.name) + } + end.to_json end end diff --git a/app/javascript/controllers/pie_chart_controller.js b/app/javascript/controllers/pie_chart_controller.js index f68fe5be52a..1bb41447594 100644 --- a/app/javascript/controllers/pie_chart_controller.js +++ b/app/javascript/controllers/pie_chart_controller.js @@ -5,6 +5,7 @@ import * as d3 from "d3"; export default class extends Controller { static values = { data: Array, + total: String, label: String, }; @@ -38,7 +39,7 @@ export default class extends Controller { #draw() { this.#d3Container.attr("class", "relative"); - this.#d3Content.html(this.#contentSummaryTemplate(this.dataValue)); + this.#d3Content.html(this.#contentSummaryTemplate()); const pie = d3 .pie() @@ -75,23 +76,17 @@ export default class extends Controller { this.#d3Svg .selectAll(".arc path") .attr("class", (d) => d.data.fill_color); - this.#d3ContentMemo.html(this.#contentSummaryTemplate(this.dataValue)); + this.#d3ContentMemo.html(this.#contentSummaryTemplate()); }); } - #contentSummaryTemplate(data) { - const total = data.reduce((acc, cur) => acc + cur.value, 0); - const currency = data[0].currency; - - return `${this.#currencyValue({ - value: total, - currency, - })} ${this.labelValue}`; + #contentSummaryTemplate() { + return `${this.totalValue} ${this.labelValue}`; } #contentDetailTemplate(datum) { return ` - ${this.#currencyValue(datum)} + ${datum.formatted_value}
${datum.label} @@ -100,21 +95,6 @@ export default class extends Controller { `; } - #currencyValue(datum) { - const formattedValue = Intl.NumberFormat(undefined, { - style: "currency", - currency: datum.currency, - currencyDisplay: "narrowSymbol", - }).format(datum.value); - - const firstDigitIndex = formattedValue.search(/\d/); - const currencyPrefix = formattedValue.substring(0, firstDigitIndex); - const mainPart = formattedValue.substring(firstDigitIndex); - const [integerPart, fractionalPart] = mainPart.split("."); - - return `

${currencyPrefix}${integerPart}.${fractionalPart}

`; - } - get #radius() { return Math.min(this.#d3ViewboxWidth, this.#d3ViewboxHeight) / 2; } diff --git a/app/views/pages/dashboard/_allocation_chart.html.erb b/app/views/pages/dashboard/_allocation_chart.html.erb index 4c665afb267..f61573b6569 100644 --- a/app/views/pages/dashboard/_allocation_chart.html.erb +++ b/app/views/pages/dashboard/_allocation_chart.html.erb @@ -10,8 +10,8 @@
+ data-pie-chart-data-value="<%= value_group_pie_data(account_groups[:assets]) %>" + data-pie-chart-total-value="<%= format_money(account_groups[:assets].sum, precision: 0) %>">
@@ -20,8 +20,8 @@
+ data-pie-chart-data-value="<%= value_group_pie_data(account_groups[:liabilities]) %>" + data-pie-chart-total-value="<%= format_money(account_groups[:liabilities].sum, precision: 0) %>">