diff --git a/package.json b/package.json
index 7dfb26c..cdb6474 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
},
"dependencies": {
"angular": "^1.6",
+ "angular-chart.js": "^1.1.1",
"angular-http-auth": "^1.5",
"angular-messages": "^1.6",
"angular-resource": "^1.6",
@@ -46,6 +47,7 @@
"bootbox": "^4.4.0",
"bootstrap": "^3.3.7",
"bootstrap-additions": "^0.3.1",
+ "chartjs-plugin-annotation": "^0.5.5",
"font-awesome": "^4.7.0",
"highcharts-ng": "^1.1",
"highstock-release": "^5.0.12",
diff --git a/src/operations/balance-chart.component.js b/src/operations/balance-chart.component.js
new file mode 100644
index 0000000..e60782b
--- /dev/null
+++ b/src/operations/balance-chart.component.js
@@ -0,0 +1,171 @@
+// 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';
+
+var moment = require('moment');
+
+var angular = require('angular');
+
+var balanceChartTmpl = require('./balance-chart.tmpl.html');
+
+var ngResource = require('angular-resource'),
+ ngChartJs = require('angular-chart.js'),
+ chartJs = require('chart.js'),
+ chartJsAnnotation = require('chartjs-plugin-annotation');
+
+chartJs.plugins.register([
+ 'annotation'
+]);
+
+var balanceChartModule = angular.module('balanceChartModule', [
+ ngResource,
+ ngChartJs
+])
+
+.component('balanceChart', {
+ templateUrl: balanceChartTmpl,
+ bindings: {
+ minDate: '<',
+ maxDate: '<'
+ },
+ controller: function($routeParams, $log, Balances) {
+ var vm = this;
+
+ vm.options = {
+ scales: {
+ yAxes: [{
+ id: 'y-axis-left',
+ type: 'linear',
+ display: true,
+ position: 'left'
+ }, {
+ id: 'y-axis-right',
+ type: 'linear',
+ display: true,
+ position: 'right',
+ stacked: false
+ }],
+ xAxes: [{
+ type: 'time',
+ time: {
+ unit: 'day',
+ },
+ stacked: true,
+ ticks: {
+ autoSkippadding: 10
+ }
+ }]
+ },
+ annotation: {
+ annotations: [{
+ type: 'line',
+ scaleID: 'y-axis-left',
+ value: -200,
+ borderColor: '#FF0000',
+ borderWidth: 4
+ }]
+ }
+ };
+
+ vm.colors = [
+ '#4e74ff', '#ff6363', '#268c26'
+ ];
+
+ vm.datasetOverride = [{
+ label: "Balance",
+ borderWidth: 3,
+ type: 'line',
+ yAxisID: 'y-axis-left'
+ }, {
+ label: "Expenses",
+ borderWidth: 3,
+ barThickness: 3,
+ type: 'bar',
+ yAxisID: 'y-axis-right'
+ }, {
+ label: "Revenues",
+ type: 'bar',
+ yAxisID: 'y-axis-right'
+ }];
+
+ vm.data = {
+ data: [[], [], []],
+ labels: []
+ };
+
+ vm.loadData = function() {
+ $log.log(vm.minDate, vm.maxDate);
+
+ vm.data = Balances.query({
+ id: $routeParams.accountId,
+ begin: vm.minDate.format('YYYY-MM-DD'),
+ end: vm.maxDate.format('YYYY-MM-DD')
+ }).$promise.then(function(results) {
+ var labels = [],
+ balances = [],
+ expenses = [],
+ revenues = [];
+
+ angular.forEach(results, function(result) {
+ labels.push(result.operation_date);
+ balances.push(result.balance);
+ expenses.push(result.expenses);
+ revenues.push(result.revenues);
+ });
+
+ vm.data = {
+ data: [
+ balances,
+ expenses,
+ revenues
+ ],
+ labels: labels
+ };
+
+ return vm.data;
+ });
+ };
+
+ vm.$onInit = function() {
+ vm.loadData();
+ };
+
+ vm.$onChange = function(changes) {
+ vm.loadData();
+ };
+ }
+}).factory('Balances', function($resource) {
+ return $resource(
+ '/api/account/:id/daily_balances', {
+ id: '@id'
+ }
+ );
+})
+
+.config(function (ChartJsProvider) {
+ ChartJsProvider.setOptions({
+ colors : [
+ '#803690', '#00ADF9', '#DCDCDC',
+ '#46BFBD', '#FDB45C', '#949FB1', '#4D5360'
+ ],
+ responsive: true
+ });
+});
+
+module.exports = balanceChartModule;
diff --git a/src/operations/balance-chart.tmpl.html b/src/operations/balance-chart.tmpl.html
new file mode 100644
index 0000000..13aa9ee
--- /dev/null
+++ b/src/operations/balance-chart.tmpl.html
@@ -0,0 +1,10 @@
+
+
+
diff --git a/src/operations/index.js b/src/operations/index.js
index 250d94e..a9f94f2 100644
--- a/src/operations/index.js
+++ b/src/operations/index.js
@@ -25,6 +25,8 @@ var angular = require('angular');
var operationFormTmpl = require('./operation.form.tmpl.html'),
operationDeleteTmpl = require('./operation.delete.tmpl.html');
+var balanceChartModule = require('./balance-chart.component.js');
+
var ngResource = require('angular-resource'),
ngMessages = require('angular-messages'),
ngUiBootstrap = require('angular-ui-bootstrap'),
@@ -36,7 +38,8 @@ var operationModule = angular.module('accountant.operations', [
ngMessages,
ngUiBootstrap,
ngUiNotification,
- ngStrap
+ ngStrap,
+ balanceChartModule.name
])
.config(function($resourceProvider) {
diff --git a/src/operations/operations.html b/src/operations/operations.html
index 8bbb938..c9707ef 100644
--- a/src/operations/operations.html
+++ b/src/operations/operations.html
@@ -16,6 +16,15 @@
along with Accountant. If not, see .
-->