├── CNAME
├── .gitignore
├── public
└── CNAME
├── src
├── components
│ ├── SidebarTabs.jsx
│ ├── NewsView.jsx
│ ├── NotesView.jsx
│ ├── TutorialView.jsx
│ ├── StatsView.css
│ ├── CalendarView.css
│ ├── TransactionForm.css
│ ├── Navbar.css
│ ├── TransactionsList.css
│ ├── Navbar.jsx
│ ├── CalendarView.jsx
│ ├── TransactionForm.jsx
│ ├── StatsView.jsx
│ ├── Sidebar.jsx
│ └── TransactionsList.jsx
├── App.css
├── main.jsx
├── index.css
├── firebase.js
└── App.jsx
├── .DS_Store
├── background.jpeg
├── vite.config.js
├── vite-project
├── src
│ ├── counter.ts
│ ├── main.ts
│ ├── typescript.svg
│ └── style.css
├── package.json
├── .gitignore
├── index.html
├── tsconfig.json
├── public
│ └── vite.svg
└── package-lock.json
├── index.html
├── dist
├── assets
│ └── index-7baddf09.css
└── index.html
├── package.json
├── .github
└── workflows
│ └── deploy.yml
└── README.md
/CNAME:
--------------------------------------------------------------------------------
1 | finance.vietnq.space
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | dist/
--------------------------------------------------------------------------------
/public/CNAME:
--------------------------------------------------------------------------------
1 | finance.vietnq.space
2 |
--------------------------------------------------------------------------------
/src/components/SidebarTabs.jsx:
--------------------------------------------------------------------------------
1 | export {};
2 |
--------------------------------------------------------------------------------
/src/components/NewsView.jsx:
--------------------------------------------------------------------------------
1 | export {};
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/NotesView.jsx:
--------------------------------------------------------------------------------
1 | export {};
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/TutorialView.jsx:
--------------------------------------------------------------------------------
1 | export {};
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/quocviethere/finance/main/.DS_Store
--------------------------------------------------------------------------------
/background.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/quocviethere/finance/main/background.jpeg
--------------------------------------------------------------------------------
/src/components/StatsView.css:
--------------------------------------------------------------------------------
1 | .stats-view {
2 | margin-top: 1rem;
3 | }
4 |
5 | .stats-view h2 {
6 | margin: 1.2rem 0 0.6rem;
7 | }
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .app-container {
2 | min-height: 100vh;
3 | display: flex;
4 | flex-direction: column;
5 | }
6 |
7 | .content {
8 | flex: 1;
9 | }
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import react from '@vitejs/plugin-react';
3 |
4 | export default defineConfig({
5 | plugins: [react()],
6 | base: '/', // <-- Change this line!
7 | });
--------------------------------------------------------------------------------
/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import App from './App';
4 | import './index.css';
5 |
6 | ReactDOM.createRoot(document.getElementById('root')).render(
7 |
19 | Click on the Vite and TypeScript logos to learn more 20 |
21 |Income: {incomeTotal.toLocaleString('vi-VN')} VND
30 |Expense: {expenseTotal.toLocaleString('vi-VN')} VND
31 || Date | 222 |Description | 223 |Category | 224 |Amount (VND) | 225 |226 | | 227 | 246 | | 247 |
|---|
| {format(tx.date.toDate(), 'yyyy-MM-dd')} | 256 |257 | {editingId === tx.id ? ( 258 | setFormState({ ...formState, description: e.target.value })} 261 | /> 262 | ) : ( 263 | tx.description 264 | )} 265 | | 266 |267 | {editingId === tx.id ? ( 268 | setFormState({ ...formState, category: e.target.value })} 271 | /> 272 | ) : ( 273 | 274 | {categoryIcons[tx.category] || null} 275 | {tx.category} 276 | 277 | )} 278 | | 279 |280 | {editingId === tx.id ? ( 281 | setFormState({ ...formState, amount: e.target.value })} 285 | /> 286 | ) : ( 287 | `${tx.type === 'income' ? '+' : '-'}${tx.amount.toLocaleString('vi-VN')}` 288 | )} 289 | | 290 |291 | {editingId === tx.id ? ( 292 | 293 | ) : ( 294 | <> 295 | 296 | 297 | > 298 | )} 299 | | 300 |301 | |
| Date | 886 |Type | 887 |Category | 888 |Amount | 889 |Note | 890 |Actions | 891 |{t.date} | 898 |899 | 900 | {t.type === 'income' ? 'Income' : 'Expense'} 901 | 902 | | 903 |{t.category} | 904 |{VND.format(t.amount)} | 905 |
906 | {t.note}
907 | |
908 |
909 |
910 |
913 |
916 |
917 | |
918 |
|---|