diff --git a/package-lock.json b/package-lock.json index 66a2c17..211df60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "axios": "^1.7.7", "chart.js": "^4.4.4", "chartjs-plugin-datalabels": "^2.2.0", + "circle-progress.vue": "^3.3.0", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "pinia": "^2.2.6", @@ -2195,6 +2196,12 @@ "node": ">=6.0" } }, + "node_modules/circle-progress.vue": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/circle-progress.vue/-/circle-progress.vue-3.3.0.tgz", + "integrity": "sha512-Ynj/ZaB6LvbkWiT42OURlfE3gZN0fbCOgag1DMPJ7Dj87qUoDZocCPF0Os1xhXwdo6dqU9BchYVkt6QOXl19NQ==", + "license": "MIT" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -11333,6 +11340,11 @@ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==" }, + "circle-progress.vue": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/circle-progress.vue/-/circle-progress.vue-3.3.0.tgz", + "integrity": "sha512-Ynj/ZaB6LvbkWiT42OURlfE3gZN0fbCOgag1DMPJ7Dj87qUoDZocCPF0Os1xhXwdo6dqU9BchYVkt6QOXl19NQ==" + }, "clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", diff --git a/package.json b/package.json index 9307994..b90d54c 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "axios": "^1.7.7", "chart.js": "^4.4.4", "chartjs-plugin-datalabels": "^2.2.0", + "circle-progress.vue": "^3.3.0", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "pinia": "^2.2.6", diff --git a/src/components/analytics/AnalyticsView.vue b/src/components/analytics/AnalyticsView.vue index 13e03f5..1cacce5 100644 --- a/src/components/analytics/AnalyticsView.vue +++ b/src/components/analytics/AnalyticsView.vue @@ -137,9 +137,12 @@ const chartOptions = { // Преобразование данных для таблицы const prepareTableData = (categories) => { // 1. Собираем все уникальные значения date из monthlySums + + const onlyExpenses = categories.filter((it) => it.categoryType == "EXPENSE") + const allDates = [ ...new Set( - categories.flatMap((category) => + onlyExpenses.flatMap((category) => category.monthlySums.map((sumItem) => sumItem.date) ) ), @@ -164,7 +167,7 @@ const prepareTableData = (categories) => { // console.log(tableColumns.value[0].field); const sums = {} // 4. Формируем строки (для каждой категории) - const rows = categories.map((category) => { + const rows = onlyExpenses.map((category) => { // Начинаем со строки, где есть поле с именем категории const row = {category: category.categoryIcon + " " + category.categoryName}; let categorySum = 0 @@ -218,6 +221,7 @@ const selectedSpace = computed(() => spaceStore.space) watch( selectedSpace, async (newValue, oldValue) => { if (newValue != oldValue) { + await fetchCategoriesCatalog() await fetchCategoriesSums() } }) @@ -249,26 +253,30 @@ const fetchCategoriesCatalog = async () => { } onMounted(async () => { - await Promise.all([ fetchCategoriesCatalog()]) + if (selectedSpace.value) { + await fetchCategoriesCatalog() await fetchCategoriesSums(); } }); + diff --git a/src/components/auth/LoginView.vue b/src/components/auth/LoginView.vue index b5c38dc..45b328f 100644 --- a/src/components/auth/LoginView.vue +++ b/src/components/auth/LoginView.vue @@ -59,28 +59,26 @@ const errors = ref({ username: '', password: '' }) // Получение tg_id (Telegram ID) const tg_id = computed(() => { + if (window.Telegram?.WebApp) { const tg = window.Telegram.WebApp tg.expand() // Разворачиваем WebApp return tg.initDataUnsafe.user?.id ?? null } - return null +return '' }) // Авто-вход по Telegram ID const autoLoginWithTgId = async () => { if (tg_id.value) { try { - const response = await apiClient.post('/auth/token/tg', { tg_id: tg_id.value }) - const token = response.data.access_token - localStorage.setItem('token', token) - apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}` + await userStore.login(null, null, tg_id.value) - toast.add({ severity: 'success', summary: 'Вход выполнен', detail: 'Добро пожаловать!', life: 3000 }) + // toast.add({ severity: 'success', summary: 'Вход выполнен', detail: 'Добро пожаловать!', life: 3000 }) await router.replace(route.query['back'] ? route.query['back'].toString() : '/') } catch (error) { console.error(error) - toast.add({ severity: 'error', summary: 'Ошибка входа', detail: 'Ошибка Telegram авторизации', life: 3000 }) + // toast.add({ severity: 'error', summary: 'Ошибка входа', detail: 'Ошибка Telegram авторизации', life: 3000 }) } } } diff --git a/src/components/budgets/BudgetCreationView.vue b/src/components/budgets/BudgetCreationView.vue index 0114216..a8d42e3 100644 --- a/src/components/budgets/BudgetCreationView.vue +++ b/src/components/budgets/BudgetCreationView.vue @@ -5,10 +5,11 @@ import Button from "primevue/button"; import InputText from "primevue/inputtext"; import FloatLabel from "primevue/floatlabel"; import DatePicker from "primevue/datepicker"; -import {onMounted, ref} from "vue"; +import {computed, onMounted, ref, watch} from "vue"; import {getMonthName} from "@/utils/utils"; import {Budget} from "@/models/Budget"; import {getCategories} from "@/services/categoryService"; +import {useSpaceStore} from "@/stores/spaceStore"; const props = defineProps({ opened: { @@ -63,9 +64,31 @@ const resetForm = () => { } budget.value.name = getMonthName(budget.value.dateFrom.getMonth()) + ' ' + budget.value.dateFrom.getFullYear(); } +const spaceStore = useSpaceStore() +const selectedSpace = computed(() => spaceStore.space) + +watch( + () => selectedSpace.value, + async (newValue, oldValue) => { + + if (newValue != oldValue || !oldValue) { + try { + // loading.value = true; + // Если выбранный space изменился, получаем новую информацию о бюджете + await fetchCategories() + } catch (error) { + console.error('Error fetching budget infos:', error); + } + } + } +); + onMounted(() => { resetForm() + if (selectedSpace.value) { + fetchCategories() + } }) @@ -91,6 +114,7 @@ onMounted(() => { Создать ежемесячные платежи? +
Сперва лучше создать категории
@@ -50,7 +50,8 @@
-
+ + @@ -352,7 +353,7 @@ + + + + \ No newline at end of file diff --git a/src/components/settings/SettingsView.vue b/src/components/settings/SettingsView.vue index 5ceff10..5189201 100644 --- a/src/components/settings/SettingsView.vue +++ b/src/components/settings/SettingsView.vue @@ -7,11 +7,17 @@ import {ref} from "vue"; import Divider from "primevue/divider"; import CategoriesList from "@/components/settings/categories/CategoriesList.vue"; import RecurrentList from "@/components/settings/recurrent/RecurrentList.vue"; +import CommonSettings from "@/components/settings/CommonSettings.vue"; -const selectedModeCode = ref("categories") +const selectedModeCode = ref("common") const pages = ref([ + { + "code": "common", + "title": "Общие", + "icon": "pi pi-cog" + }, { "code": "categories", "title": "Категории", @@ -57,7 +63,8 @@ const pages = ref([
- + +

NOTIFICATIONS UNDER CONSTRUCTIONS

diff --git a/src/components/settings/categories/CategoriesList.vue b/src/components/settings/categories/CategoriesList.vue index c33b127..00f0801 100644 --- a/src/components/settings/categories/CategoriesList.vue +++ b/src/components/settings/categories/CategoriesList.vue @@ -89,6 +89,7 @@ { }; const saveCategory = async (newCategory: Category) => { - if (newCategory.id) { - await updateCategory(newCategory.id, newCategory); - } else { - await createCategory(newCategory); - } await fetchCategories() closeCreateDialog(); }; diff --git a/src/components/settings/categories/CreateCategoryModal.vue b/src/components/settings/categories/CreateCategoryModal.vue index 65bde63..85936f4 100644 --- a/src/components/settings/categories/CreateCategoryModal.vue +++ b/src/components/settings/categories/CreateCategoryModal.vue @@ -3,9 +3,10 @@ class="w-[95%] xl:!w-1/3">
+
@@ -14,16 +15,32 @@
- +
- + - - + +
+

Добавленные теги

+
+ {{ tag.name }} + ({{ tag.code }}) + +
+
+
+

Доступные теги

+
+ + {{ tag.name }} ({{ tag.code }}) + +
+
@@ -32,95 +49,151 @@ -