diff --git a/app/Traits/Charts.php b/app/Traits/Charts.php index 7c6fd9d11..d5ec38550 100644 --- a/app/Traits/Charts.php +++ b/app/Traits/Charts.php @@ -109,12 +109,68 @@ trait Charts 'position' => 'nearest', 'callbacks' => [ 'label' => new Raw("function(tooltipItem, data) { - ". config('money.' . setting('default.currency') . '.symbol_first' ) . " === 1 - ? - '" . config('money.' . setting('default.currency') . '.symbol' ) . "' + tooltipItem.yLabel; - : - tooltipItem.yLabel + '" . config('money.' . setting('default.currency') . '.symbol') . "'; - }"), + const isPrefix = '" . config('money.' . setting('default.currency') . '.symbol_first') . "' + + const money = { + decimal: '" . config('money.' . setting('default.currency') . '.decimal_mark') . "', + thousands: '". config('money.' . setting('default.currency') . '.thousands_separator') . "', + prefix: '" . config('money.' . setting('default.currency') . '.symbol') . "', + suffix: '" . config('money.' . setting('default.currency') . '.symbol') . "', + precision: '" . config('money.' . setting('default.currency') . '.precision') . "', + } + + const format = function (input, opt = { + decimal: '" . config('money.' . setting('default.currency') . '.decimal_mark') . "', + thousands: '" . config('money.' . setting('default.currency') . '.thousands_separator') . "', + prefix: '" . config('money.' . setting('default.currency') . '.symbol') . "', + suffix: '" . config('money.' . setting('default.currency') . '.symbol') . "', + precision: '" . config('money.' . setting('default.currency') . '.precision') . "', + }) { + 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, 2); + var parts = toStr(currency).split('.'); + var integer = parts[0]; + var decimal = parts[1]; + + integer.replace(/(\d)(?=(?:\d{3})+\b)/gm, `,`); + + return opt.prefix + negative + joinIntegerAndDecimal(integer, decimal, opt.decimal) + opt.suffix; + } + + const fixed = function (precision) { + return between(0, precision, 20) + } + + const joinIntegerAndDecimal = function (integer, decimal, separator) { + return decimal ? integer + separator + decimal : integer; + } + + const toStr = function (value) { + return value ? value.toString() : ''; + } + + const numbersToCurrency = function (numbers, precision) { + var exp = Math.pow(10, precision); + var float = parseFloat(numbers) / exp; + + return float.toFixed(fixed(precision)); + } + + const between = function (min, n, max) { + return Math.max(min, Math.min(n, max)); + } + + if ('" . config('money.' . setting('default.currency') . '.symbol_first') . "' === 1) { + return format(tooltipItem.yLabel); + } + + return format(tooltipItem.yLabel); + }") ], ], 'scales' => [