Commit Graph

1006 Commits

Author SHA1 Message Date
Víctor Falcón 9431ba0e05
Set up PWA with maskable icons and native status bar integration (#22)
## Changes

- Updated `site.webmanifest` with proper PWA configuration:
  - Added all maskable icons (48, 72, 96, 128, 192, 384, 512)
  - Set theme_color and background_color for native feel
  - Added start_url, scope, id, description, and categories

- Enhanced iOS/Safari support in `app.blade.php`:
  - Added `apple-mobile-web-app-capable` for fullscreen mode
- Added `apple-mobile-web-app-status-bar-style: black-translucent` for
integrated status bar
  - Added `mobile-web-app-capable` for Android

The dynamic theme-color meta tags (`#ffffff` for light, `#383838` for
dark) match the app's background colors, ensuring the status bar blends
seamlessly with the app.
2025-12-09 17:02:20 +01:00
Víctor Falcón 436f72bd16 Adapt for mobile screen 2025-12-09 16:44:56 +01:00
Víctor Falcón 85465f9adc Add previous transaction button (Ctrl+B) 2025-12-09 15:04:53 +01:00
Víctor Falcón e51bad0cae
Quick Categorization Wizard (#21)
## Summary

Add a new quick categorization page that allows users to categorize
transactions without categories one by one, in a game-like interface.


https://github.com/user-attachments/assets/14fd7386-e87e-4a75-ae94-e487e3a48112

## Features

- **Quick Categorization Page**: A clean, focused interface for
categorizing transactions
  - White screen with centered transaction card
  - Categories sorted by usage frequency (stored in localStorage)
- Smooth animations when categorizing (card exits, success feedback,
next card enters)
  - Progress indicator showing remaining transactions

- **Keyboard Shortcuts**:
  - `Ctrl+R`: Open automation rules dialog
  - `Ctrl+N`: Skip current transaction
  - `Escape`: Go back to transactions page
  - Arrow keys + Enter: Navigate and select categories

- **Automation Rules Integration**:
  - Rules button in header to manage automation rules
- When closing the rules dialog, all remaining transactions are checked
against rules
  - Matching transactions are automatically categorized

- **UI/UX**:
  - Command component for category search and selection
  - Encrypted text component for account names
  - Responsive amount display with positive/negative styling
  - Skip button moved to header for cleaner card design

## Access

New "Categorize" button added to the transactions page toolbar (left of
"Add Transaction" button) showing the count of uncategorized
transactions.
2025-12-09 14:38:39 +01:00
Víctor Falcón 4e8a8e2154 Trend indicator on mobile 2025-12-09 11:56:01 +01:00
Víctor Falcón 8ff9792dfc Show founder discount for people who join the community 2025-12-09 11:50:25 +01:00
Víctor Falcón 58b934333f
feat: centralize pricing config with multiple plans support (#20)
## Summary

Centralizes all pricing/subscription plan configuration in a single PHP
config file, making it easy to modify prices, features, and promotional
codes from one place.

## Changes

### Config (`config/subscriptions.php`)
- Added `plans` array with support for multiple billing cycles (monthly,
yearly, lifetime)
- Each plan includes: name, price, original_price (for discounts),
stripe_price_id, billing_period, and features
- Added `default_plan` setting to control which plan is highlighted
- Added `promo` config with enabled flag, code, description, and badge

### Frontend
- Created TypeScript types for `Plan`, `PromoConfig`, and
`PricingConfig`
- Updated `welcome.tsx` to display all plans in a responsive grid layout
- Updated `paywall.tsx` to show all plans with "Most Popular" and "Best
Value" badges
- Promo code section is now conditionally rendered based on
`promo.enabled`

### Backend
- Updated `HandleInertiaRequests.php` to share pricing config globally
- Removed redundant props from routes

### Tests
- Added test to verify pricing config structure is passed correctly

## How to Use

To modify pricing, edit `config/subscriptions.php`:
- Change `default_plan` to highlight a different plan
- Set `promo.enabled` to `false` (or `PROMO_ENABLED=false` in `.env`) to
hide promo codes
- Add/remove/modify plans as needed
2025-12-09 10:03:35 +01:00
Víctor Falcón 1d96f5dc63 fix: re-enable ssr for all routes after issue is fixed 2025-12-08 19:41:23 +01:00
Víctor Falcón a87b36de3f fix: increase nginx buffer sizes 2025-12-08 19:36:24 +01:00
Víctor Falcón 8db7f30a02
Disable SSR for dashboard routes and extract API routes (#19)
## Summary

- Add `WithoutSsr` middleware to disable SSR per route
- Extract API endpoints to `routes/api.php` for better organization
- Apply `WithoutSsr` to dashboard, accounts, and transactions routes

## Changes

### New Files
- `app/Http/Middleware/WithoutSsr.php` - Middleware that disables SSR
for specific routes
- `routes/api.php` - Dedicated file for API endpoints

### Modified Files
- `bootstrap/app.php` - Register API routes
- `routes/web.php` - Remove API routes, apply WithoutSsr middleware

## Route Structure

- **routes/web.php** - Page routes only (Inertia pages)
- **routes/api.php** - All `/api/*` endpoints
- **routes/settings.php** - Settings routes (existing)
2025-12-08 19:21:48 +01:00
Víctor Falcón 9e6688e8b3 Set --runtime=bun parameter on inertia:start-ssr command 2025-12-08 19:04:44 +01:00
Víctor Falcón 8eab41ac89 fix: asd key element to accounts index page 2025-12-08 18:36:17 +01:00
Víctor Falcón 44860941ee undo deploy ci check 2025-12-08 18:31:03 +01:00
Víctor Falcón d4410a67fe fix: deploy ci 2025-12-08 18:27:39 +01:00
Víctor Falcón 4ad965b44e Fix ci deploy 2025-12-08 18:20:22 +01:00
Víctor Falcón 3b56e24447 fix: add SSR guards to localStorage/sessionStorage access
- Add window check to getInitialColumnVisibility in transaction-list.tsx
- Add window check to getInitialColumnVisibility in transactions/index.tsx
- Add SSR guards to balance-import-config-storage.ts functions
- Add SSR guards to import-config-storage.ts functions
- Add SSR guards to use-appearance.tsx functions
2025-12-08 18:19:20 +01:00
Víctor Falcón aaaba66684 ci: skip deployment if there is another HEAD deploy in queue 2025-12-08 18:14:19 +01:00
Víctor Falcón 3177fa3519 fix: add SyncProvider to SSR entry point
The SyncProvider was also missing from the SSR setup, causing
'useSyncContext must be used within a SyncProvider' error.
2025-12-08 18:06:50 +01:00
Víctor Falcón 770f091b9b fix: wrap SSR app with EncryptionKeyProvider
The EncryptionKeyProvider was missing from the SSR entry point,
causing 'useEncryptionKey must be used within an EncryptionKeyProvider'
error when server-side rendering pages that use EncryptedText.
2025-12-08 17:51:43 +01:00
Víctor Falcón 413f83f961 fix: apply border radius to visible bar segments in stacked chart
The previous implementation applied rounded corners based on static
position in the dataKeys array. When first/last segments had small
or zero values, the rounding wasn't visible.

Now uses a custom StackedBarShape component that dynamically determines
which segments are actually visible and applies border radius only to
the truly first/last visible segments in each bar stack.
2025-12-08 17:50:33 +01:00
Víctor Falcón ec6c5dd6b6 Sidebar: Fix app logo on desktop 2025-12-08 17:38:50 +01:00
Víctor Falcón 40762bc528 fix: make useIsMobile hook and utility functions SSR-safe
- Refactor use-mobile.tsx to use getServerSnapshot for SSR
- Add window guard to consoleDebug in debug.ts
- Add window guard to isLocalEnvironment in track-event.ts
2025-12-08 17:33:54 +01:00
Víctor Falcón 30d64f8249
refactor: use shared trend indicator components with hover tooltips (#18)
## Summary

Refactored all places using TrendingUp/TrendingDown icons directly to
use the shared `AmountTrendIndicator` and `PercentageTrendIndicator`
components.

<img width="1113" height="799" alt="image"
src="https://github.com/user-attachments/assets/8a635d23-3c14-48b6-80d0-b5641af93024"
/>

## Changes

- **AmountTrendIndicator**: Now shows percentage diff on hover via
tooltip
- **PercentageTrendIndicator**: Now shows amount diff on hover via
tooltip
- Added `invertColors` prop to `PercentageTrendIndicator` for spending
categories (where spending less is good)
- Added `className` prop to both components for flexibility

## Files refactored

- `account-list-card.tsx` - Now uses `AmountTrendIndicator`
- `top-categories-card.tsx` - Now uses `PercentageTrendIndicator`
- `account-balance-chart.tsx` - Removed local `TrendIndicator` function,
now uses shared `PercentageTrendIndicator`
- `account-balance-card.tsx` - Updated to pass new props
- `net-worth-chart.tsx` - Updated to pass new props

## Testing

- All existing tests pass
- Hover over any trend indicator to see the alternate metric (percentage
or amount)
2025-12-08 17:31:22 +01:00
Víctor Falcón dbf00f8468 format 2025-12-08 17:18:04 +01:00
Víctor Falcón 0fcc66e25d fix: make encryption key storage SSR-safe to prevent 502 errors
- Add isBrowser() check to key-storage.ts functions
- Initialize EncryptionKeyProvider with false and hydrate on mount
- Guard getInitialDisplayState against SSR execution
2025-12-08 17:13:45 +01:00
Víctor Falcón f260e933ca Fix accounts/index page grid 2025-12-08 17:12:33 +01:00
Víctor Falcón 3a6991484a Fix pending operations count an dialog 2025-12-08 16:19:45 +01:00
Víctor Falcón 753b87baf2 Fix net-worth chart on desktop 2025-12-08 16:19:37 +01:00
Víctor Falcón 04ad228e47 Transactions table rows clickable 2025-12-08 16:13:29 +01:00
Víctor Falcón 9ac9eeceae Format + Open transactions on row click 2025-12-08 15:58:50 +01:00
Víctor Falcón 0272e6e3fb
Mobile design (#17)
<img width="993" height="1066" alt="image"
src="https://github.com/user-attachments/assets/e784bcd3-29bf-454c-b2b4-5edfe7281889"
/>
2025-12-08 15:43:09 +01:00
Víctor Falcón 7507c3aefb Make account balances clickable to open update balance dialog
Add click handlers to balance displays in account chart and list card components, allowing users to quickly update account balances by clicking on the displayed balance amount.
2025-12-06 22:05:15 +01:00
Víctor Falcón 1236bf093e
Add pending operations dialog and improve sync status UI (#16)
- Add PendingOperationsDialog component to display pending sync
operations
- Replace sync status tooltip with dropdown menu showing pending count
badge
- Add pending operations tracking to sync context with refresh
capability
- Improve sync manager error handling for 404 responses on
updates/deletes
- Only remove successfully synced changes from pending queue

## Images
<img width="100%" height="auto" alt="image"
src="https://github.com/user-attachments/assets/3855a239-aa72-4579-a19e-9cad8027b006"
/>
<img width="100%" height="auto" alt="image"
src="https://github.com/user-attachments/assets/cf14b3e2-fb0e-41fb-ba5e-01013b7a5ce1"
/>
2025-12-06 21:54:11 +01:00
Víctor Falcón 760824f0c8 Improve header responsive behavior and refactor class names with cn utility 2025-12-06 20:44:37 +01:00
Víctor Falcón 0eab7b9050 Adjust header and welcome page spacing and padding 2025-12-06 20:40:43 +01:00
Víctor Falcón 7d8840c47d Hide GitHub and Discord link text on mobile in header 2025-12-06 20:35:09 +01:00
Víctor Falcón 48549a1db8 Add config option to hide registration and redirect to login
- Add `hideAuthButtons` config check in Fortify login view
- Pass `hideAuthButtons` prop to register view from config
- Redirect to login when registration is hidden
- Add early return in register component when registration is disabled
2025-12-06 19:35:41 +01:00
Víctor Falcón d67b39a7a3 Hide pricing section when auth buttons are hidden and remove registration route blocking
- Add `!hideAuthButtons` condition to pricing section visibility
- Remove registration route blocking based on `hide_auth_buttons` config
- Fix Tailwind class ordering for consistency
2025-12-06 19:29:19 +01:00
Víctor Falcón 374ce0546b
Subscriptions (#15)
## Subscribe paywall
<img width="1119" height="764" alt="image"
src="https://github.com/user-attachments/assets/55367c91-f2b9-43f5-b450-75faf867bde0"
/>

## Subscribe success page
<img width="1112" height="681" alt="image"
src="https://github.com/user-attachments/assets/a923752a-d506-410e-ac66-e02b96acca20"
/>

## Manage subscription page
<img width="1221" height="705" alt="image"
src="https://github.com/user-attachments/assets/1eba1fec-7fb7-4500-8549-d8def809ddae"
/>
2025-12-06 19:09:56 +01:00
Víctor Falcón 517d758a9d
Import balances assistant (#14)
<img width="1220" height="803" alt="image"
src="https://github.com/user-attachments/assets/ae0be642-6648-456a-8c43-cca69fd2e750"
/>
2025-12-05 16:39:56 +01:00
Víctor Falcón 8be7ea98e0
Accounts: new pages to list, and see account details (#13)
## 🆕  Accounts page
<img width="1222" height="1118" alt="image"
src="https://github.com/user-attachments/assets/2ab659b3-c368-4824-9f00-cdeb6ae8e713"
/>

## 🆕  Accounts details page
<img width="1220" height="1171" alt="image"
src="https://github.com/user-attachments/assets/7c64b1cf-c1fd-4ada-8ab0-17ee4f6991de"
/>

## 🆕 Update current account balance
<img width="1069" height="778" alt="image"
src="https://github.com/user-attachments/assets/76586b8a-7088-4ef8-a890-22910644a2d3"
/>

## 🆕 Edit/update account balance history
<img width="1200" height="681" alt="image"
src="https://github.com/user-attachments/assets/fa589553-7be8-4049-bdf4-89996b81a863"
/>
2025-12-05 14:33:18 +01:00
Víctor Falcón 2d92afa66d Add bank logos and improve transaction table UI
- Add bank logos for BBVA, Indexa Capital, and ING
- Move bank logo from Bank column to Account column
- Make bank logos rounded-full in both custom bank form and transaction table
- Adjust description column max width from 500px to 400px
- Improve Account column layout with flex container and min-width
2025-12-05 10:09:30 +01:00
Víctor Falcón 952634603c Refactor rule engine to decrypt account names during evaluation
- Make rule evaluation functions async to support account name decryption
- Add encryption key parameter to all rule evaluation functions
- Decrypt account names before rule matching and normalize to lowercase
- Update all call sites to await async rule evaluation and pass encryption key
- Simplify note decryption logic in edit transaction dialog by moving key retrieval earlier
2025-12-04 17:22:00 +01:00
Víctor Falcón 323b7386c1 fix(transactions): Decrypt account names for automation rule evaluation
The rule engine now properly decrypts account names before evaluating automation rules, ensuring accurate matching against encrypted account data. Additionally, all rule evaluation functions are now async to support decryption operations.
2025-12-04 17:03:22 +01:00
Víctor Falcón f6f1cba041 Prevent duplicate notes when re-evaluating automation rules
Add appendNoteIfNotPresent helper to check if rule note already exists
in transaction notes before appending, preventing duplicate concatenation
when rules are re-evaluated multiple times.
2025-12-04 16:42:54 +01:00
Víctor Falcón d04b6a0174 feat(ui): Improve chart tooltip content rendering and calculation 2025-12-04 16:35:17 +01:00
Víctor Falcón 525e7709cc feat(use-dashboard-data): Add conditional formatting for current year dates 2025-12-04 16:30:17 +01:00
Víctor Falcón 7f2771381c Add bank relation to account model and update related components 2025-12-04 16:24:12 +01:00
Víctor Falcón d179c952c7
Accounts: Allow users to create custom banks with his own logo, and name (#12)
**When a bank is not found**
<img width="1220" height="619" alt="image"
src="https://github.com/user-attachments/assets/f46cdedf-8c12-4d9b-a531-8ab17abba9c2"
/>

**You can create a new one**
<img width="1218" height="695" alt="image"
src="https://github.com/user-attachments/assets/115e6b44-d423-4edf-a9aa-e45da81f9598"
/>
2025-12-04 15:24:04 +01:00
Víctor Falcón a13253d32b ci.yml: Remove browser-tests dependency 2025-12-04 10:11:34 +01:00