diff --git a/src/operations/balance-chart.component.ts b/src/operations/balance-chart.component.ts index 3ef68b6..0796503 100644 --- a/src/operations/balance-chart.component.ts +++ b/src/operations/balance-chart.component.ts @@ -1,30 +1,12 @@ -// vim: set tw=80 ts=4 sw=4 sts=4: -/* - This file is part of Accountant. - - Accountant is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Accountant is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Accountant. If not, see . - */ -/* jshint node: true */ -'use strict'; +// vim: set tw=80 ts=2 sw=2 sts=2: import * as moment from 'moment'; import * as c3 from 'c3'; import { - Component, ElementRef, - Inject, Input, Output, EventEmitter, - OnInit, OnChanges + Component, ElementRef, + Inject, Input, Output, EventEmitter, + OnInit, OnChanges } from '@angular/core'; import { Logger } from '@nsalaun/ng-logger'; @@ -33,185 +15,185 @@ import { Account } from '../accounts/account'; import { DailyBalanceService } from '../accounts/dailyBalance.service'; class DateRange { - minDate: Date; - maxDate: Date; + minDate: Date; + maxDate: Date; } class xAxis { - balances: Date[]; - expenses: Date[]; - revenues: Date[]; + balances: Date[]; + expenses: Date[]; + revenues: Date[]; } @Component({ - selector: 'balance-chart', - template: '
' + selector: 'balance-chart', + template: '
' }) export class BalanceChartComponent implements OnInit, OnChanges { - @Input() account: Account; - @Output() onUpdate: EventEmitter = new EventEmitter(); + @Input() account: Account; + @Output() onUpdate: EventEmitter = new EventEmitter(); - private chart: c3.ChartAPI; - private balances: number[]; + private chart: c3.ChartAPI; + private balances: number[]; - constructor( - private elementRef: ElementRef, - private logger: Logger, - private dailyBalanceService: DailyBalanceService, - @Inject('accountIdService') private accountIdService, - ) { - this.logger.log("Constructor BalanceChartComponent") + constructor( + private elementRef: ElementRef, + private logger: Logger, + private dailyBalanceService: DailyBalanceService, + @Inject('accountIdService') private accountIdService, + ) { + this.logger.log("Constructor BalanceChartComponent") + } + + loadData() { + this.dailyBalanceService.query( + this.accountIdService.get() + ).subscribe((results) => { + var headers: any[][] = [['date', 'balances', 'expenses', 'revenues']]; + + var rows = results.map(function(result) { + return [ + result.operation_date, + result.balance, + result.expenses, + result.revenues + ]; + }); + + this.chart.unload(); + + this.chart.load({ + rows: headers.concat(rows) + }); + + var x: any; + + x = this.chart.x(); + + this.logger.log("x", x); + + var balances = x.balances; + + this.onUpdate.emit({ + minDate: balances[0], + maxDate: balances[balances.length - 1] + }); + }); + }; + + $onInit() { + this.ngOnInit(); + } + + ngOnInit() { + var tomorrow = moment().endOf('day').valueOf(); + + this.chart = c3.generate({ + bindto: this.elementRef.nativeElement.children[0], + size: { + height: 450, + }, + data: { + x: 'date', + rows: [], + axes: { + expenses: 'y2', + revenues: 'y2' + }, + type: 'bar', + types: { + balances: 'area' + }, + groups: [ + ['expenses', 'revenues'] + ], + // Disable for the moment because there is an issue when + // using subchart line is not refreshed after subset + // selection. + //regions: { + // balances: [{ + // start: tomorrow, + // style: 'dashed' + // }] + //} + }, + regions: [{ + start: tomorrow, + }], + axis: { + x: { + type: 'timeseries', + tick: { + format: '%Y-%m-%d', + rotate: 50, + } + }, + y: { + label: { + text: 'Amount', + position: 'outer-middle' + } + }, + y2: { + show: true, + label: { + text: 'Amount', + position: 'outer-middle' + } + } + }, + grid: { + x: { + show: true, + }, + y: { + show: true, + } + }, + tooltip: { + format: { + value: function(value, ratio, id, index) { + return value + '€'; + } + } + }, + subchart: { + show: true, + onbrush: function(domain) { + this.onUpdate.emit({minDate: domain[0], maxDate: domain[1]}); + } + } + }); + + this.loadData(); + }; + + setLines(account: Account) { + if(this.chart) { + this.chart.ygrids([ + { value: 0, axis: 'y2' }, + { value: 0, axis: 'y', class: 'zeroline'}, + ]); + + if(account) { + this.chart.ygrids.add({ + value: account.authorized_overdraft, + axis: 'y', + class: 'overdraft' + }); + } } + }; - loadData() { - this.dailyBalanceService.query( - this.accountIdService.get() - ).subscribe((results) => { - var headers: any[][] = [['date', 'balances', 'expenses', 'revenues']]; + $onChanges(changes) { + this.ngOnChanges(changes); + } - var rows = results.map(function(result) { - return [ - result.operation_date, - result.balance, - result.expenses, - result.revenues - ]; - }); - - this.chart.unload(); - - this.chart.load({ - rows: headers.concat(rows) - }); - - var x: any; - - x = this.chart.x(); - - this.logger.log("x", x); - - var balances = x.balances; - - this.onUpdate.emit({ - minDate: balances[0], - maxDate: balances[balances.length - 1] - }); - }); - }; - - $onInit() { - this.ngOnInit(); - } - - ngOnInit() { - var tomorrow = moment().endOf('day').valueOf(); - - this.chart = c3.generate({ - bindto: this.elementRef.nativeElement.children[0], - size: { - height: 450, - }, - data: { - x: 'date', - rows: [], - axes: { - expenses: 'y2', - revenues: 'y2' - }, - type: 'bar', - types: { - balances: 'area' - }, - groups: [ - ['expenses', 'revenues'] - ], - // Disable for the moment because there is an issue when - // using subchart line is not refreshed after subset - // selection. - //regions: { - // balances: [{ - // start: tomorrow, - // style: 'dashed' - // }] - //} - }, - regions: [{ - start: tomorrow, - }], - axis: { - x: { - type: 'timeseries', - tick: { - format: '%Y-%m-%d', - rotate: 50, - } - }, - y: { - label: { - text: 'Amount', - position: 'outer-middle' - } - }, - y2: { - show: true, - label: { - text: 'Amount', - position: 'outer-middle' - } - } - }, - grid: { - x: { - show: true, - }, - y: { - show: true, - } - }, - tooltip: { - format: { - value: function(value, ratio, id, index) { - return value + '€'; - } - } - }, - subchart: { - show: true, - onbrush: function(domain) { - this.onUpdate.emit({minDate: domain[0], maxDate: domain[1]}); - } - } - }); - - this.loadData(); - }; - - setLines(account: Account) { - if(this.chart) { - this.chart.ygrids([ - { value: 0, axis: 'y2' }, - { value: 0, axis: 'y', class: 'zeroline'}, - ]); - - if(account) { - this.chart.ygrids.add({ - value: account.authorized_overdraft, - axis: 'y', - class: 'overdraft' - }); - } - } - }; - - $onChanges(changes) { - this.ngOnChanges(changes); - } - - ngOnChanges(changes) { - if('account' in changes) { - this.setLines(changes.account.currentValue); - } else { - this.setLines(this.account); - } - }; + ngOnChanges(changes) { + if('account' in changes) { + this.setLines(changes.account.currentValue); + } else { + this.setLines(this.account); + } + }; }