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') => {