PHP/JavaScript webapp to analyse spending habits
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

index.html 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Spending Analyser</title>
  5. <script src="flot/jquery.min.js" type="text/javascript"></script>
  6. <script src="flot/jquery.flot.min.js" type="text/javascript"></script>
  7. <script src="flot/jquery.flot.pie.js" type="text/javascript"></script>
  8. <script src="data.php" type="text/javascript"></script>
  9. <script type="text/javascript">
  10. var previousPoint = null;
  11. var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  12. function showTooltip(x, y, contents) {
  13. $('<div id="tooltip">' + contents + '</div>').css( {
  14. position: 'absolute',
  15. display: 'none',
  16. top: y + 5,
  17. left: x + 5,
  18. border: '1px solid #fdd',
  19. padding: '2px',
  20. 'background-color': '#fee',
  21. }).appendTo("body").fadeIn(200);
  22. }
  23. $(function() {
  24. $.plot($('#history'), transData, {
  25. xaxis: { mode: 'time', timeformat: '%y/%m'},
  26. series: {
  27. lines: { show: true },
  28. points: { show: true }
  29. },
  30. grid: { hoverable: true, clickable: true },
  31. });
  32. $("#history").bind("plothover", function (event, pos, item) {
  33. if (item) {
  34. var id = {dataIndex: item.dataIndex, seriesIndex: item.seriesIndex};
  35. if (previousPoint == null || previousPoint.dataIndex != id.dataIndex || previousPoint.seriesIndex != id.seriesIndex) {
  36. previousPoint = id;
  37. $("#tooltip").remove();
  38. var x = item.datapoint[0],
  39. y = item.datapoint[1].toFixed(2);
  40. var date = new Date(x);
  41. showTooltip(item.pageX, item.pageY,
  42. (item.seriesIndex == 0 ? "Money in" : "Money out") + " during " + months[date.getMonth()] + " " + date.getFullYear() + " = " + y);
  43. }
  44. } else {
  45. $("#tooltip").remove();
  46. previousPoint = null;
  47. }
  48. });
  49. $('#history').bind('plotclick', function(event, pos, item) {
  50. if (item) {
  51. var incoming = item.seriesIndex == 0;
  52. var dateOb = new Date(item.datapoint[0]);
  53. var date = dateOb.getFullYear() + '-' + (dateOb.getMonth() < 9 ? '0' : '') + (dateOb.getMonth() + 1);
  54. $('#historytable tr.data').remove();
  55. $('#historytable').show();
  56. $('#historytable h3').text('Transactions for ' + months[dateOb.getMonth()] + ' ' + dateOb.getFullYear());
  57. var pieData = {};
  58. var table = $('#historytable table');
  59. $.each(monthData[date], function(index, trans) {
  60. if (incoming != trans.Amount > 0) { return; }
  61. var tr = $('<tr/>').addClass('data').appendTo(table);
  62. trans.Category && trans.Category == '(Ignored)' && tr.addClass('ignored');
  63. $('<td/>').text(trans.Date.date.split(' ')[0]).appendTo(tr);
  64. $('<td/>').text(trans.Type ? trans.Type : 'Other').appendTo(tr);
  65. $('<td/>').text(trans.Category ? trans.Category : '').appendTo(tr);
  66. $('<td/>').text(trans.Description).appendTo(tr);
  67. $('<td/>').text(trans.Amount).appendTo(tr);
  68. var category = trans.Category ? trans.Category : 'Unsorted';
  69. if (category != '(Ignored)') {
  70. if (!pieData[category]) { pieData[category] = 0; }
  71. pieData[category] += Math.abs(trans.Amount);
  72. }
  73. });
  74. var data = [];
  75. $.each(pieData, function(category, amount) {
  76. data.push({ label: category + ' (' + Math.round(amount) + ')', data: amount });
  77. });
  78. data.sort(function(a, b) { return b.data - a.data; });
  79. $.plot($('#expense'), data, {
  80. series: { pie: { show: true, innerRadius: 0.5 } }
  81. });
  82. }
  83. });
  84. });
  85. </script>
  86. <style type="text/css">
  87. .ignored td { color: gray; }
  88. .left { width: 45%; float: left; }
  89. .right { margin-left: 50%; }
  90. h2 { margin-top: 0; }
  91. </style>
  92. </head>
  93. <body>
  94. <div class="left">
  95. <h2>Transaction History</h2>
  96. <div id="history" style="width: 600px; height: 300px;"></div>
  97. <div id="historytable" style="display: none;"><h3>Transactions for ??</h3><table><tr><th>Date</th><th>Type</th><th>Category</th><th>Description</th><th>Amount</th></tr></table></div>
  98. </div>
  99. <div class="right">
  100. <h2>Categories</h2>
  101. <div id="expense" style="width: 600px; height: 300px;"></div>
  102. </div>
  103. </body>
  104. </html>