LIVE UPDATE WORKS YESSSS

This commit is contained in:
2023-10-25 23:54:31 +03:00
parent b63f156eb7
commit 163aee19e5
8 changed files with 185 additions and 69 deletions

View File

@@ -14,6 +14,7 @@
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"email-validator": "^2.0.4", "email-validator": "^2.0.4",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"stores": "^1.0.0",
"svelte-cookie": "^1.0.1", "svelte-cookie": "^1.0.1",
"svelte-fa": "^3.0.4", "svelte-fa": "^3.0.4",
"svelte-simple-modal": "^1.6.1", "svelte-simple-modal": "^1.6.1",
@@ -975,6 +976,11 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/curry": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/curry/-/curry-1.2.0.tgz",
"integrity": "sha512-PAdmqPH2DUYTCc/aknv6RxRxmqdRHclvbz+wP8t1Xpg2Nu13qg+oLb6/5iFoDmf4dbmC9loYoy9PwwGbFt/AqA=="
},
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -1485,6 +1491,11 @@
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
"dev": true "dev": true
}, },
"node_modules/graceful-fs-stream": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/graceful-fs-stream/-/graceful-fs-stream-0.0.1.tgz",
"integrity": "sha512-yZ9Lx4O/LbIQ0prZNtXOt97h8ICA2fwPcmSkrjZcOnXKrMzR8ao+kE78N76su0ffaawHLHyFYt75AkgHdVb41Q=="
},
"node_modules/graphemer": { "node_modules/graphemer": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -1785,6 +1796,25 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dependencies": {
"minimist": "^1.2.6"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/mri": { "node_modules/mri": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
@@ -1833,6 +1863,14 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true "dev": true
}, },
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": { "node_modules/once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -2281,6 +2319,17 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/stores": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/stores/-/stores-1.0.0.tgz",
"integrity": "sha512-aOWM422mpxSj37uo9R1aVKDF2sDRCzjdbn6CYT/H9BECxuuliALmAZcmRVI9/Wq6Pu/HKDY1xZ+ssSuvY6fLlA==",
"dependencies": {
"curry": "~1.2.0",
"graceful-fs-stream": "0.0.1",
"mkdirp": "^0.5.1",
"on-headers": "^1.0.1"
}
},
"node_modules/strip-ansi": { "node_modules/strip-ansi": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",

View File

@@ -30,6 +30,7 @@
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"email-validator": "^2.0.4", "email-validator": "^2.0.4",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"stores": "^1.0.0",
"svelte-cookie": "^1.0.1", "svelte-cookie": "^1.0.1",
"svelte-fa": "^3.0.4", "svelte-fa": "^3.0.4",
"svelte-simple-modal": "^1.6.1", "svelte-simple-modal": "^1.6.1",

View File

@@ -4,33 +4,52 @@
import QuickInfobar from "./other/QuickInfobar.svelte"; import QuickInfobar from "./other/QuickInfobar.svelte";
import { getCookie } from "svelte-cookie"; import { getCookie } from "svelte-cookie";
import {onMount} from "svelte"; import {onMount} from "svelte";
import {writable} from "svelte/store";
import {incomeData} from "../stores.js";
import {expenseData} from "../stores.js";
import {incomeTypes} from "../stores.js";
import axios from "axios"; import axios from "axios";
const incomeData = writable([]);
const expenseData = writable([]);
onMount(async () => { onMount(() => {
if (getCookie('access_token') === null ) { if (getCookie('access_token') === null) {
window.location.href = '/auth/login'; window.location.href = '/auth/login';
} }
try { const token = getCookie('access_token');
const response = await axios.get('http://localhost:8081/incomes/personal-incomes', config); const config = {
incomeData.set(response.data); headers: {
} catch (error) { 'Authorization': `Bearer ${token}`
console.error('Error fetching income data:', error); }
} };
try { const incomePromise = axios.get('http://localhost:8081/incomes/personal-incomes', config)
const response = await axios.get('http://localhost:8081/expenses/personal-expenses', config); .then(response => {
expenseData.set(response.data); incomeData.set(response.data);
} catch (error) { console.log("Received Income Data");
console.error('Error fetching expense data:', error); })
} .catch(error => console.error('Error fetching income data:', error));
console.log(getCookie('access_token')); const expensePromise = axios.get('http://localhost:8081/expenses/personal-expenses', config)
}) .then(response => {
expenseData.set(response.data);
console.log("Received Expense Data");
})
.catch(error => console.error('Error fetching expense data:', error));
const incomeTypesPromise = axios.get('http://localhost:8081/incomes/categories', config)
.then(response => {
incomeTypes.set(response.data);
console.log("Received Income Type Data");
})
.catch(error => console.error('Error:', error));
Promise.all([incomePromise, expensePromise, incomeTypesPromise])
.then(() => {
console.log(getCookie('access_token'));
});
});
</script> </script>
<div id="dashboard"> <div id="dashboard">

View File

@@ -1,62 +1,78 @@
<script> <script>
import Chart from 'chart.js/auto'; import Chart from 'chart.js/auto';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { incomeData } from '../Dashboard.svelte'; import { incomeData } from "../../stores.js";
let ctx; let ctx;
let chartCanvas; let chartCanvas;
let chart = null;
function groupAndSumByCategory(incomes) { function createGraph(data) {
const groupedData = new Map(); try {
incomes.forEach(income => { function groupAndSumByCategory(incomes) {
const category = income.incomeCategory.name; const groupedData = new Map();
if (groupedData.has(category)) { incomes.forEach(income => {
groupedData.set(category, groupedData.get(category) + income.amount); const category = income.incomeCategory.name;
} else { if (groupedData.has(category)) {
groupedData.set(category, income.amount); groupedData.set(category, groupedData.get(category) + parseInt(income.amount));
} else {
groupedData.set(category, income.amount);
}
}
);
return groupedData;
} }
});
return groupedData;
}
function updateGraph() { const groupedIncomeData = groupAndSumByCategory(data);
const incomeDataArray = $incomeData;
const groupedIncomeData = groupAndSumByCategory(incomeDataArray);
const chartLabels = Array.from(groupedIncomeData.keys()); const chartLabels = Array.from(groupedIncomeData.keys());
const chartValues = Array.from(groupedIncomeData.values()); const chartValues = Array.from(groupedIncomeData.values());
if (chartCanvas) {
ctx = chartCanvas.getContext('2d'); ctx = chartCanvas.getContext('2d');
if (ctx.chart) {
ctx.chart.destroy(); if (!chart) {
chart = new Chart(ctx, {
type: 'bar',
data: {
labels: chartLabels,
datasets: [{
label: 'Revenue',
backgroundColor: 'rgb(255, 99, 132)',
data: chartValues
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
});
} else {
chart.data.labels = chartLabels;
chart.data.datasets[0].data = chartValues;
console.log(chart.data.datasets[0].data);
chart.update();
} }
new Chart(ctx, { } catch (error) {
type: 'bar', console.error('Error:', error);
data: {
labels: chartLabels,
datasets: [{
label: 'Revenue',
backgroundColor: 'rgb(255, 99, 132)',
data: chartValues
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
});
} }
} }
onMount(updateGraph); $: {
if ($incomeData) {
createGraph($incomeData);
console.log($incomeData);
}
}
onMount(() => {
createGraph($incomeData);
});
</script> </script>
<div id="chart"> <div id="chart">
<canvas bind:this={chartCanvas}></canvas> <canvas bind:this={chartCanvas}></canvas>
</div> </div>
<style> <style>
#chart { #chart {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);

View File

@@ -122,10 +122,8 @@
.expense-form { .expense-form {
background-color: #fff; background-color: #fff;
border: 1px solid #ccc; border-radius: 20px;
border-radius: 5px;
padding: 20px; padding: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
max-width: 400px; max-width: 400px;
margin: 0 auto; margin: 0 auto;
} }

View File

@@ -4,12 +4,44 @@
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
import axios from 'axios'; import axios from 'axios';
import { getCookie } from "svelte-cookie"; import { getCookie } from "svelte-cookie";
import {incomeData} from "../../../stores.js";
import {incomeTypes} from "../../../stores.js";
let showModal; let showModal;
let amount = ''; let amount = '';
let newData;
const selectedIncomeId = writable(''); const selectedIncomeId = writable('');
function addNewIncome(id, amount) {
const today = new Date().toISOString().split('T')[0];
const incomeCategory = $incomeTypes.find(incomeType => incomeType.id === id);
console.log(amount);
if (incomeCategory) {
const newIncome = {
incomeId: 0,
userDTO: {
name: "Dummy",
surname: "User",
username: "dummyuser"
},
incomeCategory: incomeCategory,
date: today,
amount: amount
};
newData = $incomeData;
newData.push(newIncome);
$incomeData = newData;
console.log("ggWPPPPP", newIncome);
} else {
console.error('Income category not found for id:', id);
}
}
onMount(async () => { onMount(async () => {
try { try {
const token = getCookie('access_token'); const token = getCookie('access_token');
@@ -37,6 +69,8 @@
amount: amount, amount: amount,
}; };
addNewIncome(selectedIncome.id, amount);
try { try {
const token = getCookie('access_token'); const token = getCookie('access_token');
console.log(token); console.log(token);
@@ -47,8 +81,6 @@
}, },
}); });
console.log(response.data);
if (response.status === 200) { if (response.status === 200) {
console.log("cool"); console.log("cool");
} else { } else {
@@ -122,10 +154,8 @@
.income-form { .income-form {
background-color: #fff; background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px; border-radius: 5px;
padding: 20px; padding: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
max-width: 400px; max-width: 400px;
margin: 0 auto; margin: 0 auto;
} }

View File

@@ -15,18 +15,14 @@
<!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-no-static-element-interactions -->
<div on:click|stopPropagation> <div on:click|stopPropagation>
<slot name="header" /> <slot name="header" />
<hr />
<slot /> <slot />
<hr />
<!-- svelte-ignore a11y-autofocus -->
<button autofocus on:click={() => dialog.close()}>close modal</button>
</div> </div>
</dialog> </dialog>
<style> <style>
dialog { dialog {
max-width: 32em; max-width: 32em;
border-radius: 0.2em; border-radius: 20px;
border: none; border: none;
padding: 0; padding: 0;
} }

View File

@@ -0,0 +1,7 @@
import {writable} from "svelte/store";
export const incomeData = writable([]);
export const expenseData = writable([]);
export const incomeTypes = writable([]);