diff --git a/app/Traits/Charts.php b/app/Traits/Charts.php index e21e2eeda..2eb56585a 100644 --- a/app/Traits/Charts.php +++ b/app/Traits/Charts.php @@ -2,8 +2,12 @@ namespace App\Traits; +use Akaunting\Money\Money; + use App\Utilities\Chartjs; +use Balping\JsonRaw\Raw; + trait Charts { public $donut = [ @@ -103,6 +107,113 @@ trait Charts 'mode' => 'nearest', 'intersect' => 0, 'position' => 'nearest', + 'callbacks' => [ + 'label' => new Raw("function(tooltipItem, data) { + const moneySettings = { + decimal: '" . config('money.' . setting('default.currency') . '.decimal_mark') . "', + thousands: '". config('money.' . setting('default.currency') . '.thousands_separator') . "', + symbol: '" . config('money.' . setting('default.currency') . '.symbol') . "', + isPrefix: '" . config('money.' . setting('default.currency') . '.symbol_first') . "', + precision: '" . config('money.' . setting('default.currency') . '.precision') . "', + }; + + const formattedCurrency = function (input, opt = moneySettings) { + function fixed (precision) { + return Math.max(0, Math.min(precision, 20)); + }; + + function toStr(value) { + return value ? value.toString() : ''; + }; + + function numbersToCurrency(numbers, precision) { + var exp = Math.pow(10, precision); + var float = parseFloat(numbers) / exp; + + return float.toFixed(fixed(precision)); + }; + + function joinIntegerAndDecimal (integer, decimal, separator) { + return decimal ? integer + separator + decimal : integer; + }; + + if (typeof input === 'number') { + input = input.toFixed(fixed(opt.precision)); + }; + + var negative = input.indexOf('-') >= 0 ? '-' : ''; + var numbers = toStr(input).replace(/\D+/g, '') || '0'; + var currency = numbersToCurrency(numbers, opt.precision); + var parts = toStr(currency).split('.'); + var integer = parts[0].replace(/(\d)(?=(?:\d{3})+\b)/gm, opt.thousands);; + var decimal = parts[1]; + + if(opt.isPrefix == 1) { + return opt.symbol + negative + joinIntegerAndDecimal(integer, decimal, opt.decimal) + } + + return negative + joinIntegerAndDecimal(integer, decimal, opt.decimal) + opt.symbol; + }; + + return formattedCurrency(tooltipItem.yLabel, moneySettings); + }") + ], + ], + 'scales' => [ + 'yAxes' => [[ + 'ticks' => [ + 'beginAtZero' => true, + 'callback' => new Raw("function(value, index, values) { + const moneySettings = { + decimal: '" . config('money.' . setting('default.currency') . '.decimal_mark') . "', + thousands: '". config('money.' . setting('default.currency') . '.thousands_separator') . "', + symbol: '" . config('money.' . setting('default.currency') . '.symbol') . "', + isPrefix: '" . config('money.' . setting('default.currency') . '.symbol_first') . "', + precision: '" . config('money.' . setting('default.currency') . '.precision') . "', + }; + + const formattedCurrency = function (input, opt = moneySettings) { + function fixed (precision) { + return Math.max(0, Math.min(precision, 20)); + }; + + function toStr(value) { + return value ? value.toString() : ''; + }; + + function numbersToCurrency(numbers, precision) { + var exp = Math.pow(10, precision); + var float = parseFloat(numbers) / exp; + + return float.toFixed(fixed(precision)); + }; + + function joinIntegerAndDecimal (integer, decimal, separator) { + return decimal ? integer + separator + decimal : integer; + }; + + if (typeof input === 'number') { + input = input.toFixed(fixed(opt.precision)); + }; + + var negative = input.indexOf('-') >= 0 ? '-' : ''; + var numbers = toStr(input).replace(/\D+/g, '') || '0'; + var currency = numbersToCurrency(numbers, opt.precision); + var parts = toStr(currency).split('.'); + var integer = parts[0].replace(/(\d)(?=(?:\d{3})+\b)/gm, opt.thousands);; + var decimal = parts[1]; + + if(opt.isPrefix == 1) { + return opt.symbol + negative + joinIntegerAndDecimal(integer, decimal, opt.decimal) + } else { + return negative + joinIntegerAndDecimal(integer, decimal, opt.decimal) + opt.symbol; + } + }; + + return formattedCurrency(value, moneySettings); + }"), + ], + ] ], 'responsive' => true, 'scales' => [ @@ -111,7 +222,7 @@ trait Charts 'ticks' => [ 'padding' => 10, 'fontColor' => '#9e9e9e', - ], + ]], 'gridLines' => [ 'drawBorder' => false, 'color' => 'rgba(29,140,248,0.1)',