* Update expense-form.tsx to handle shares as strings
Proposing fix to #424
The issue is in the data flow between the form and the schema transform function:
When editing existing expenses: Form loads shares by dividing database values by 100 (e.g., 200 / 100 = 2), but loads them as numbers
When users change values: Input fields return strings via enforceCurrencyPattern
Schema transform: Only multiplies by 100 for string values, not number values
Result: Modified shares (strings) get multiplied by 100, unmodified shares (numbers) stay as-is
Proposed fix: handle all shares consistently as strings throughout the form
* Add type assertions to fix TypeScript errors in expense form
Fix formatting.
---------
Co-authored-by: yllar <yllar.pajus@gmail.com>
Clarify group currency field description
Use default currency code instead of symbol
Hide currency symbol field when using a non-custom Currency
Run prettier
Update currency data
Update package-lock.json
* Add health check API endpoint with database connectivity
* Update locale handling to fallback to default language on invalid input
* Add health check endpoints for application readiness and liveness
- Introduced `/api/health/readiness` endpoint to check if the application can serve requests, including database connectivity.
- Introduced `/api/health/liveness` endpoint to verify if the application is running independently of external dependencies.
- Updated the health check logic to streamline database connectivity checks and response handling.
* Refactor health check logic
---------
Co-authored-by: Julen Dixneuf <julen.d@padoa-group.com>
* add id property to manifest for identity of PWA
* add multiple sizes high quality pngs with transparent background to support multiple sizes
* delete unused png
* Added computed expenses per balance to fix#127
* add missing import that got lost during merge
* if we are in percentage mode or amount mode, the shares have to be multiplied by 100
* install json2csv package
* add necessary labels
* add support convert the JSON to redable CSV format and export
* add a popover to export btton and provide options for exporting to JSON and CSV
* Use a DropdownMenu
* Translations
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* feat(expense-list): Display the attachment count only when the expense includes attachments
* handle attachments - singular & plural
* move documents count between amount and date
* Remove label
* Use document count only instead of whole document list
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* no division of amount
* use gpt-4-turbo
* testing setup and naive test
* test multiple variants
* document
* correct locale names
* test large amounts
* test wth strings
* prettier
* Added french version and title/description from json messages
* Revert back default language to en-US
* Code reviewed with prettier :)
* Updated json to add information field
* Updated json to add information block (missed on previous)
* Reviewed code language
* correction traduction "groupes étoilés" en "groupes favoris"
---------
Co-authored-by: Andy Trouvé <andy@strekol.eu>
* add group information field to group and Information tab to display
* add breaks to info page
* Improve UX
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* Allow negative amount for expenses to be entered
- an expense becomes an income
- this does not affect calculations, i.e. an income can be split just like an expense
* Incomes should not be reimbursements
when entering a negative number
- deselect 'isReimbursement'
- hide reimbursement checkbox
* Change captions when entering a negative number
- "expense" becomes "income"
- "paid" becomes "received"
* Format incomes on expense list
- replace "paid by" with "received by"
* Format incomes on "Stats" tab
- a group's or participants balance might be negative
- in this case "spendings" will be "earnings" (display accordingly)
- always display positive numbers
- for active user: highlight spendings/earnings in red/green
* Fix typo
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* Extract ExpenseCard vom ExpenseList
* Implement simple pagination of expenses (see #30)
- display only this year's entries by default
- a "Show more" button reveals all expenses
* Turn getPrisma() into constant "prisma"
- getPrisma() is not async and doesn't need to be awaited
- turn getPrisma() into exported constant "prisma"
* Select fields to be returned by getGroupExpenses()
- make JSON more concise and less redundant
- some properties were removed (i.e.instead of "expense.paidById" use "expense.paidBy.id")
* Remove "participants" from ExpenseCard
- no need to search for participant by id to get it's name
- name property is already present in expense
* Add option to fetch a slice of group expenses
- specify offset and length to get expenses for [offset, offset+length[
- add function to get total number of group expenses
* Add api route for client to fetch group expenses
* Remove "Show more" button from expense list
* Implement infinite scroll
- in server component Page
- only load first 200 expenses max
- pass preloaded expenses and total count
- in client component ExpenseList, if there are more expenses to show
- test if there are more expenses
- append preloading "skeletons" to end of list
- fetch more expenses when last item in list comes into view
- after each fetch increase fetch-length by factor 1.5
- rationale: db fetch usually is not the issue here, the longer the list gets, the longer react needs to redraw
* Use server action instead of api endpoint
* Fixes
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* Add devcontainer configuration for codespace support
* Show the impact of an expense on the active user's balance
* Run prettier
* Put the balance on a different line
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* feat: initialise a new totals tab with basic UI
* fix: update group tabs and add stats page
* fix: styling within the new elements
* Prettier
* Display active user expenses only if active user is set
---------
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* Move prisma to runtime dependencies
* Optimize Dockerfile and build script
* Fix: remove mention of generated next-env.d.ts in Dockerfile
* Add missing reset.d.ts file to Dockerfile
* Remove compression steps from Dockerfile and entrypoint script
* Add an env file with mocked env vars added for Docker production builds
* Use server actions to get runtime env vars
* Refactor types and names
* Rollback serverActions, use parsed Zod object for runtime env
* Reintroduce featureFlags object to avoid passing secret envs to the frontend
* Improve string to boolean coercion
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>
* Run prettier autoformat
* Fix type issue, rename function to match behaviour better
---------
Co-authored-by: Lauri Vuorela <lauri.vuorela@gmail.com>
Co-authored-by: Sebastien Castiel <sebastien@castiel.me>