diff --git a/backend/src/main.rs b/backend/src/main.rs
index 1a2cc01..fa81f2b 100644
--- a/backend/src/main.rs
+++ b/backend/src/main.rs
@@ -1,7 +1,6 @@
use family_budget::*;
use sea_orm::DbErr;
use sea_orm_migration::prelude::*;
-//TODO: НЕУДОБНОЕ РАСПОЛОЖЕНИЕ ДОБАВИТЬ РАСХОД + ИСТОРИЯ, ВОЗВРАЩАЕТ В НАЧАЛО ПОСЛЕ ДОБАВЛЕНИЯ РАСХОДА + ЗАКРЫВАЕТ ДОБАВИТЬ РАСХОД, ИСТОРИЯ НЕ ОБНОВЛЯЕТСЯ
#[tokio::main]
async fn main() -> Result<(), DbErr> {
let db = establish_connection().await?;
diff --git a/frontend/index.html b/frontend/index.html
index 8862032..668a942 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -4,6 +4,9 @@
+
+
+
Family budget
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 932a513..49d520e 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -16,9 +16,20 @@ function AppContent() {
const { user, isAuthenticated, isLoading, setUser, setIsLoading } = useStore();
const location = useLocation();
+ const themeColors: Record = {
+ light: '#667eea',
+ dark: '#000000',
+ sunset: '#f97316',
+ ocean: '#3b82f6',
+ forest: '#22c55e',
+ purple: '#8b5cf6',
+ };
+
useEffect(() => {
const storedTheme = localStorage.getItem('theme') || 'light';
document.documentElement.setAttribute('data-theme', storedTheme);
+ const metaTheme = document.querySelector('meta[name="theme-color"]');
+ if (metaTheme) metaTheme.setAttribute('content', themeColors[storedTheme] ?? '#667eea');
const storedLocale = localStorage.getItem('locale');
if (storedLocale && storedLocale !== i18n.language) {
diff --git a/frontend/src/index.css b/frontend/src/index.css
index 619d3fb..54db033 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -1,5 +1,12 @@
@import "tailwindcss";
+html,
+body {
+ background: linear-gradient(135deg, var(--gradient-start) 0%, var(--gradient-end) 100%);
+ background-attachment: fixed;
+ overscroll-behavior-y: none;
+}
+
:root,
[data-theme="light"] {
--gradient-start: #667eea;
diff --git a/frontend/src/pages/FamilyView.tsx b/frontend/src/pages/FamilyView.tsx
index 9027e4a..f901793 100644
--- a/frontend/src/pages/FamilyView.tsx
+++ b/frontend/src/pages/FamilyView.tsx
@@ -164,7 +164,17 @@ export default function FamilyView() {
setExpenseAmount('');
setExpenseDescription('');
setShowAddExpense(null);
- loadCategories();
+
+ const limitResponse = await expenseApi.getRemainingLimit(parseInt(familyId), categoryId);
+ const limitValue = typeof limitResponse.data.remaining_limit === 'string'
+ ? parseFloat(limitResponse.data.remaining_limit)
+ : limitResponse.data.remaining_limit;
+ setRemainingLimits(prev => new Map(prev).set(categoryId, limitValue));
+
+ if (showHistory === categoryId) {
+ const historyResponse = await expenseApi.getHistory(parseInt(familyId), categoryId, false);
+ setHistoryData(historyResponse.data);
+ }
} catch (err) {
alert(t('expense.addError'));
console.error(err);
@@ -452,6 +462,55 @@ export default function FamilyView() {
+ {showAddExpense === category.id && (
+
+
+ {t('expense.addTitle')}
+
+
+
+
+ setExpenseAmount(e.target.value)}
+ className="w-full px-4 py-3 border-2 border-gray-300 rounded-2xl focus:border-purple-500 focus:ring-2 focus:ring-purple-200 transition-all text-center font-semibold text-lg"
+ />
+
+
+
+ setExpenseDescription(e.target.value)}
+ className="w-full px-4 py-3 border-2 border-gray-300 rounded-2xl focus:border-purple-500 focus:ring-2 focus:ring-purple-200 transition-all"
+ />
+
+
+
+
+
+
+
+ )}
+
{showHistory === category.id && historyData && (
@@ -585,54 +644,6 @@ export default function FamilyView() {
)}
- {showAddExpense === category.id && (
-
-
- {t('expense.addTitle')}
-
-
-
-
- setExpenseAmount(e.target.value)}
- className="w-full px-4 py-3 border-2 border-gray-300 rounded-2xl focus:border-purple-500 focus:ring-2 focus:ring-purple-200 transition-all text-center font-semibold text-lg"
- />
-
-
-
- setExpenseDescription(e.target.value)}
- className="w-full px-4 py-3 border-2 border-gray-300 rounded-2xl focus:border-purple-500 focus:ring-2 focus:ring-purple-200 transition-all"
- />
-
-
-
-
-
-
-
- )}
);
})}
diff --git a/frontend/src/pages/Profile.tsx b/frontend/src/pages/Profile.tsx
index 414d76f..99d06b7 100644
--- a/frontend/src/pages/Profile.tsx
+++ b/frontend/src/pages/Profile.tsx
@@ -97,9 +97,20 @@ export default function Profile() {
}
};
+ const themeColors: Record = {
+ light: '#667eea',
+ dark: '#000000',
+ sunset: '#f97316',
+ ocean: '#3b82f6',
+ forest: '#22c55e',
+ purple: '#8b5cf6',
+ };
+
const handleThemeChange = (theme: Theme) => {
setPreferences({ theme });
document.documentElement.setAttribute('data-theme', theme);
+ const metaTheme = document.querySelector('meta[name="theme-color"]');
+ if (metaTheme) metaTheme.setAttribute('content', themeColors[theme] ?? '#667eea');
};
const handleLocaleChange = (locale: 'ru' | 'en') => {