Compare commits

..

58 Commits
ph4 ... prod

Author SHA1 Message Date
mo
3d2bc3846a Merge pull request 'Update API base URL to production environment in api-config.ts' (#59) from ph4 into prod
Reviewed-on: #59
2025-06-07 22:14:52 +02:00
mo
ef2caaee56 Merge pull request 'Update logging level to INFO, refine chore update logic, and enhance invite acceptance flow' (#58) from ph4 into prod
Reviewed-on: #58
2025-06-07 22:09:00 +02:00
mo
6004911912 Merge pull request 'ph4' (#57) from ph4 into prod
Reviewed-on: #57
2025-06-07 18:56:59 +02:00
mo
ef41ebb954 Merge pull request 'ph4' (#56) from ph4 into prod
Reviewed-on: #56
2025-06-07 18:08:41 +02:00
mo
24a5024e88 Merge pull request 'ph4' (#55) from ph4 into prod
Reviewed-on: #55
2025-06-05 01:05:04 +02:00
mo
acdf1af9b9 Merge pull request 'Update API base URL to production environment' (#54) from ph4 into prod
Reviewed-on: #54
2025-06-04 17:56:00 +02:00
mo
f3fdbc0592 Merge pull request 'ph4' (#53) from ph4 into prod
Reviewed-on: #53
2025-06-04 17:51:17 +02:00
mo
1f7abcbd85 Merge pull request 'ph4' (#52) from ph4 into prod
Reviewed-on: #52
2025-06-02 19:09:21 +02:00
mo
76446cf84e Merge pull request 'Update Dockerfile to use npm install and modify PWA theme and background colors in vite.config.ts' (#51) from ph4 into prod
Reviewed-on: #51
2025-06-02 00:29:25 +02:00
mo
df08bdaf9e Merge pull request 'Update vue-i18n dependency to version 9.9.1 in package.json' (#50) from ph4 into prod
Reviewed-on: #50
2025-06-02 00:25:41 +02:00
mo
6a61bb8df4 Merge pull request 'ph4' (#49) from ph4 into prod
Reviewed-on: #49
2025-06-02 00:20:48 +02:00
mo
e124f05e7b Merge pull request 'Update OAuth redirect URIs and API routing structure' (#48) from ph4 into prod
Reviewed-on: #48
2025-06-01 22:43:17 +02:00
mo
f60002d98e Merge pull request 'Refactor API routing and update login URLs' (#47) from ph4 into prod
Reviewed-on: #47
2025-06-01 22:38:08 +02:00
mo
708a6280d6 Merge pull request 'Update API base URL in api-config.ts to point to the new production environment' (#46) from ph4 into prod
Reviewed-on: #46
2025-06-01 22:16:58 +02:00
mo
20e1c2ac69 Merge pull request 'ph4' (#45) from ph4 into prod
Reviewed-on: #45
2025-06-01 22:03:25 +02:00
mo
e777268643 Merge pull request 'Update API base URL in api-config.ts to point to the production environment' (#44) from ph4 into prod
Reviewed-on: #44
2025-06-01 21:06:58 +02:00
mo
3be38002e7 Merge pull request 'Refactor: Update styling and functionality in various components' (#43) from ph4 into prod
Reviewed-on: #43
2025-06-01 20:41:23 +02:00
mo
d23219fd60 Merge pull request 'Refactor GroupsPage: Replace VButton and VIcon components with standard HTML button and SVG for improved compatibility and maintainability. Added console logs for better debugging during the create list dialog flow.' (#42) from ph4 into prod
Reviewed-on: #42
2025-06-01 20:00:16 +02:00
mo
088f371547 Merge pull request 'Enhance group selection flow by ensuring latest groups data is fetched before opening the create list dialog. Additionally, refresh the groups list after a new list is created to reflect updates. This improves data consistency and user experience on th…' (#40) from ph4 into prod
Reviewed-on: #40
2025-06-01 19:56:27 +02:00
mo
b5f16a3d0d Merge pull request 'Refactor: Replace button elements with VButton and VIcon components in GroupsPage' (#39) from ph4 into prod
Reviewed-on: #39
2025-06-01 19:51:23 +02:00
mo
0a6877852a Merge pull request 'ph4' (#38) from ph4 into prod
Reviewed-on: #38
2025-06-01 19:19:20 +02:00
mo
d3d5f88e09 Merge pull request 'refactor: Simplify upgrade function by directly creating enums and adding new tables for chores and chore assignments in the initial schema' (#37) from ph4 into prod
Reviewed-on: #37
2025-06-01 18:20:43 +02:00
mo
1ccd4456f6 Merge pull request 'refactor: Encapsulate enum creation logic within a dedicated function in the upgrade process for improved readability and maintainability' (#36) from ph4 into prod
Reviewed-on: #36
2025-06-01 18:15:41 +02:00
mo
acdb628777 Merge pull request 'refactor: Modify upgrade function to accept context parameter for enhanced migration flexibility' (#35) from ph4 into prod
Reviewed-on: #35
2025-06-01 18:13:11 +02:00
mo
463cfe070c Merge pull request 'refactor: Clarify access to revision strings in migration function by referencing Script object within RevisionStep' (#34) from ph4 into prod
Reviewed-on: #34
2025-06-01 18:09:45 +02:00
mo
8a98aee6c1 Merge pull request 'refactor: Update migration function to access revision strings from RevisionStep objects for improved clarity' (#33) from ph4 into prod
Reviewed-on: #33
2025-06-01 17:50:18 +02:00
mo
0a42d68853 Merge pull request 'refactor: Introduce migration function to streamline upgrade steps in Alembic migrations' (#32) from ph4 into prod
Reviewed-on: #32
2025-06-01 17:45:43 +02:00
mo
26315cd407 Merge pull request 'refactor: Improve Alembic migration functions by integrating configuration and script directory handling for enhanced migration context management' (#31) from ph4 into prod
Reviewed-on: #31
2025-06-01 17:42:33 +02:00
mo
8517cbee99 Merge pull request 'refactor: Update migration functions to accept connection parameter for improved flexibility and consistency' (#30) from ph4 into prod
Reviewed-on: #30
2025-06-01 17:39:22 +02:00
mo
f882b86f05 Merge pull request 'refactor: Separate async migration logic into dedicated module and streamline migration functions for improved clarity and maintainability' (#29) from ph4 into prod
Reviewed-on: #29
2025-06-01 17:33:14 +02:00
mo
5e79be16d3 Merge pull request 'refactor: Enhance Alembic migration functions to support direct execution and improve error handling for database URL configuration' (#28) from ph4 into prod
Reviewed-on: #28
2025-06-01 17:30:01 +02:00
mo
d1b8191c8d Merge pull request 'refactor: Update Alembic migration functions to support asynchronous execution and streamline migration handling in application startup' (#27) from ph4 into prod
Reviewed-on: #27
2025-06-01 17:20:42 +02:00
mo
8d3bf927b6 Merge pull request 'fix: Add Alembic directory and configuration file to production Dockerfile for migration support' (#26) from ph4 into prod
Reviewed-on: #26
2025-06-01 17:16:39 +02:00
mo
e62bceb955 Merge pull request 'fix: Update Alembic configuration to use absolute paths for ini file and script location in migration process' (#25) from ph4 into prod
Reviewed-on: #25
2025-06-01 17:13:21 +02:00
mo
99d06baa03 Merge pull request 'fix: Enhance Alembic configuration by setting script location and database URL validation in migration process' (#24) from ph4 into prod
Reviewed-on: #24
2025-06-01 17:10:06 +02:00
mo
530867bb16 Merge pull request 'refactor: Simplify Dockerfile by reorganizing Alembic file copying and enhance migration handling in application startup' (#23) from ph4 into prod
Reviewed-on: #23
2025-06-01 17:03:25 +02:00
mo
de5f54f970 Merge pull request 'fix: Update Alembic configuration in startup event to set script location and database URL' (#22) from ph4 into prod
Reviewed-on: #22
2025-06-01 16:57:22 +02:00
mo
792a7878f0 Merge pull request 'feat: Add Alembic configuration and migration command to application startup' (#21) from ph4 into prod
Reviewed-on: #21
2025-06-01 16:54:30 +02:00
mo
c62c0d0157 Merge pull request 'fix ig' (#20) from ph4 into prod
Reviewed-on: #20
2025-06-01 16:49:35 +02:00
mo
855dd852c5 Merge pull request 'refactor: Update production Dockerfile to use Node.js for serving built assets and enhance environment variable injection' (#19) from ph4 into prod
Reviewed-on: #19
2025-06-01 16:46:19 +02:00
mo
028c991d91 Merge pull request 'refactor: Transition production Dockerfile to use Nginx for serving built assets and streamline environment variable handling' (#18) from ph4 into prod
Reviewed-on: #18
2025-06-01 16:39:34 +02:00
mo
1f7f573f64 Merge pull request 'refactor: Update environment variable handling in Dockerfile for production' (#17) from ph4 into prod
Reviewed-on: #17
2025-06-01 16:33:08 +02:00
mo
350ccaf5d8 Merge pull request 'refactor: Optimize Dockerfiles and deployment workflow for improved performance and reliability' (#16) from ph4 into prod
Reviewed-on: #16
2025-06-01 16:27:10 +02:00
mo
ca73d6ca79 Merge pull request 'refactor: Revise .dockerignore and Dockerfile for enhanced build efficiency and organization' (#15) from ph4 into prod
Reviewed-on: #15
2025-06-01 16:15:12 +02:00
mo
d7bd69f68c Merge pull request 'refactor: Improve deployment workflow with retry logic for image pushes and optimized build process' (#14) from ph4 into prod
Reviewed-on: #14
2025-06-01 16:04:11 +02:00
mo
fd15ed5a35 Merge pull request 'refactor: Enhance deployment workflow for backend and frontend images' (#13) from ph4 into prod
Reviewed-on: #13
2025-06-01 16:01:25 +02:00
mo
0cdc47d0d2 Merge pull request 'refactor: Update .dockerignore for improved clarity and organization' (#12) from ph4 into prod
Reviewed-on: #12
2025-06-01 15:58:00 +02:00
mo
c90ee6b73f Merge pull request 'refactor: Standardize user creation in Dockerfile and improve multi-stage build syntax' (#11) from ph4 into prod
Reviewed-on: #11
2025-06-01 15:47:57 +02:00
mo
3c30eaeaee Merge pull request 'refactor: Update backend Dockerfile to use Alpine package names' (#10) from ph4 into prod
Reviewed-on: #10
2025-06-01 15:46:24 +02:00
mo
1907911779 Merge pull request 'refactor: Switch backend Dockerfile to use Alpine package manager' (#9) from ph4 into prod
Reviewed-on: #9
2025-06-01 15:44:29 +02:00
mo
cda51e34ba Merge pull request 'refactor: Update Docker configurations for improved environment variable handling' (#8) from ph4 into prod
Reviewed-on: #8
2025-06-01 15:41:57 +02:00
mo
c7f296597e Merge pull request 'refactor: Improve environment variable injection in Dockerfile for production' (#7) from ph4 into prod
Reviewed-on: #7
2025-06-01 15:35:15 +02:00
mo
b3fd3acad9 Merge pull request 'fix: Update API base URL for development environment' (#6) from ph4 into prod
Reviewed-on: #6
2025-06-01 15:16:16 +02:00
mo
258798846d Merge pull request 'refactor: Update frontend components and Dockerfile for production' (#5) from ph4 into prod
Reviewed-on: #5
2025-06-01 14:59:49 +02:00
mo
6f69ad8fcc Merge pull request 'Enhance deployment workflow with context variable debugging and fallback logic' (#4) from ph4 into prod
Reviewed-on: #4
2025-06-01 14:51:29 +02:00
mo
7a3e91a324 Merge pull request 'fix: Update Docker image tags' (#3) from ph4 into prod
Reviewed-on: #3
2025-06-01 14:47:59 +02:00
mo
e43b4fe50a Merge pull request 'fix: Update Docker login commands in deployment workflow' (#2) from ph4 into prod
Reviewed-on: #2
2025-06-01 14:41:35 +02:00
mo
b37cbebf8a Merge pull request 'ph4' (#1) from ph4 into prod
Reviewed-on: #1
2025-06-01 14:39:42 +02:00
12 changed files with 1181 additions and 2074 deletions

File diff suppressed because it is too large Load Diff

View File

@ -73,10 +73,7 @@
"groupNameRequired": "Group name is required",
"createFailed": "Failed to create group. Please try again.",
"inviteCodeRequired": "Invite code is required",
"joinFailed": "Failed to join group. Please check the invite code and try again.",
"invalidDataFromServer": "Invalid data received from server.",
"createFailedConsole": "Error creating group:",
"joinFailedConsole": "Error joining group:"
"joinFailed": "Failed to join group. Please check the invite code and try again."
},
"notifications": {
"groupCreatedSuccess": "Group '{groupName}' created successfully.",
@ -88,8 +85,7 @@
"authCallbackPage": {
"redirecting": "Redirecting...",
"errors": {
"authenticationFailed": "Authentication failed",
"noTokenProvided": "No token provided"
"authenticationFailed": "Authentication failed"
}
},
"choresPage": {
@ -129,17 +125,7 @@
"save": "Save Changes",
"create": "Create",
"editChore": "Edit Chore",
"createChore": "Create Chore",
"intervalPlaceholder": "e.g., 10"
},
"consoleErrors": {
"loadFailed": "Failed to load all chores:",
"loadGroupsFailed": "Failed to load groups",
"createAssignmentForNewChoreFailed": "Failed to create assignment for new chore:",
"saveFailed": "Failed to save chore:",
"deleteFailed": "Failed to delete chore:",
"createAssignmentFailed": "Failed to create assignment:",
"updateCompletionStatusFailed": "Failed to update chore completion status:"
"createChore": "Create Chore"
},
"deleteConfirm": {
"title": "Confirm Deletion",
@ -174,14 +160,10 @@
"title": "Group Members",
"defaultRole": "Member",
"removeButton": "Remove",
"emptyState": "No members found.",
"closeMenuLabel": "Close menu"
"emptyState": "No members found."
},
"invites": {
"title": "Invite Members",
"description": "Invite new members by generating a shareable code.",
"addMemberButtonLabel": "Add member",
"closeInviteLabel": "Close invite",
"regenerateButton": "Regenerate Invite Code",
"generateButton": "Generate Invite Code",
"activeCodeLabel": "Current Active Invite Code:",
@ -192,15 +174,6 @@
"newDataInvalid": "New invite code data is invalid."
}
},
"errors": {
"failedToFetchActiveInvite": "Failed to fetch active invite code.",
"failedToFetchGroupDetails": "Failed to fetch group details.",
"failedToLoadUpcomingChores": "Error loading upcoming chores:",
"failedToLoadRecentExpenses": "Error loading recent expenses:"
},
"console": {
"noActiveInvite": "No active invite code found for this group."
},
"chores": {
"title": "Group Chores",
"manageButton": "Manage Chores",
@ -218,8 +191,6 @@
"settleShareButton": "Settle My Share",
"activityLabel": "Activity:",
"byUser": "by",
"fallbackUserName": "User ID: {userId}",
"activityByUserFallback": "User {userId}",
"splitTypes": {
"equal": "Equal",
"exactAmounts": "Exact Amounts",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,11 @@
import en from './en.json';
import de from './de.json';
import nl from './nl.json';
import fr from './fr.json';
import es from './es.json';
export default {
en,
de,
nl,
fr,
es
};

View File

@ -1,631 +0,0 @@
{
"message": {
"hello": "Hallo"
},
"loginPage": {
"emailLabel": "E-mail",
"passwordLabel": "Wachtwoord",
"togglePasswordVisibilityLabel": "Wachtwoord zichtbaarheid wisselen",
"loginButton": "Inloggen",
"signupLink": "Geen account? Aanmelden",
"errors": {
"emailRequired": "E-mail is vereist",
"emailInvalid": "Ongeldig e-mailformaat",
"passwordRequired": "Wachtwoord is vereist",
"loginFailed": "Inloggen mislukt. Controleer uw gegevens."
},
"notifications": {
"loginSuccess": "Succesvol ingelogd"
}
},
"listsPage": {
"retryButton": "Opnieuw proberen",
"emptyState": {
"noListsForGroup": "Geen lijsten gevonden voor deze groep.",
"noListsYet": "U heeft nog geen lijsten.",
"personalGlobalInfo": "Maak een persoonlijke lijst of word lid van een groep om gedeelde lijsten te zien.",
"groupSpecificInfo": "Deze groep heeft nog geen lijsten."
},
"createNewListButton": "Nieuwe lijst maken",
"loadingLists": "Lijsten laden...",
"noDescription": "Geen beschrijving",
"addItemPlaceholder": "Nieuw item toevoegen...",
"createCard": {
"title": "+ Lijst"
},
"pageTitle": {
"forGroup": "Lijsten voor {groupName}",
"forGroupId": "Lijsten voor Groep {groupId}",
"myLists": "Mijn Lijsten"
},
"errors": {
"fetchFailed": "Ophalen van lijsten mislukt."
}
},
"groupsPage": {
"retryButton": "Opnieuw proberen",
"emptyState": {
"title": "Nog geen groepen!",
"description": "U bent nog geen lid van groepen. Maak er een aan of word lid met een uitnodigingscode.",
"createButton": "Nieuwe groep maken"
},
"groupCard": {
"newListButton": "Lijst"
},
"createCard": {
"title": "+ Groep"
},
"joinGroup": {
"title": "Lid worden van een groep met uitnodigingscode",
"inputLabel": "Voer uitnodigingscode in",
"inputPlaceholder": "Voer uitnodigingscode in",
"joinButton": "Deelnemen"
},
"createDialog": {
"title": "Nieuwe groep maken",
"closeButtonLabel": "Sluiten",
"groupNameLabel": "Groepsnaam",
"cancelButton": "Annuleren",
"createButton": "Maken"
},
"errors": {
"fetchFailed": "Laden van groepen mislukt",
"groupNameRequired": "Groepsnaam is vereist",
"createFailed": "Maken van groep mislukt. Probeer het opnieuw.",
"inviteCodeRequired": "Uitnodigingscode is vereist",
"joinFailed": "Deelnemen aan groep mislukt. Controleer de uitnodigingscode en probeer het opnieuw.",
"invalidDataFromServer": "Ongeldige gegevens ontvangen van server.",
"createFailedConsole": "Fout bij het maken van groep:",
"joinFailedConsole": "Fout bij het deelnemen aan groep:"
},
"notifications": {
"groupCreatedSuccess": "Groep '{groupName}' succesvol aangemaakt.",
"joinSuccessNamed": "Succesvol lid geworden van groep '{groupName}'.",
"joinSuccessGeneric": "Succesvol lid geworden van groep.",
"listCreatedSuccess": "Lijst '{listName}' succesvol aangemaakt."
}
},
"authCallbackPage": {
"redirecting": "Bezig met omleiden...",
"errors": {
"authenticationFailed": "Authenticatie mislukt",
"noTokenProvided": "Geen token opgegeven"
}
},
"choresPage": {
"title": "Taken",
"tabs": {
"overdue": "Achterstallig",
"today": "Vandaag",
"upcoming": "Aankomend",
"allPending": "Alle openstaande",
"completed": "Voltooid"
},
"viewToggle": {
"calendarLabel": "Kalenderweergave",
"calendarText": "Kalender",
"listLabel": "Lijstweergave",
"listText": "Lijst"
},
"newChoreButtonLabel": "Nieuwe taak",
"newChoreButtonText": "Nieuwe taak",
"loadingState": {
"loadingChores": "Taken laden..."
},
"calendar": {
"prevMonthLabel": "Vorige maand",
"nextMonthLabel": "Volgende maand",
"weekdays": {
"sun": "Zo",
"mon": "Ma",
"tue": "Di",
"wed": "Wo",
"thu": "Do",
"fri": "Vr",
"sat": "Za"
},
"addChoreToDayLabel": "Taak aan deze dag toevoegen",
"emptyState": "Geen taken om weer te geven voor deze periode."
},
"listView": {
"choreTypePersonal": "Persoonlijk",
"choreTypeGroupFallback": "Groep",
"completedDatePrefix": "Voltooid:",
"actions": {
"doneTitle": "Markeer als voltooid",
"doneText": "Gedaan",
"undoTitle": "Markeer als niet voltooid",
"undoText": "Ongedaan maken",
"editTitle": "Bewerken",
"editLabel": "Taak bewerken",
"editText": "Bewerken",
"deleteTitle": "Verwijderen",
"deleteLabel": "Taak verwijderen",
"deleteText": "Verwijderen"
},
"emptyState": {
"message": "Geen taken in deze weergave. Goed gedaan!",
"viewAllButton": "Alle openstaande bekijken"
}
},
"choreModal": {
"editTitle": "Taak bewerken",
"newTitle": "Nieuwe taak",
"closeButtonLabel": "Modal sluiten",
"nameLabel": "Naam",
"namePlaceholder": "Voer taaknaam in",
"typeLabel": "Type",
"typePersonal": "Persoonlijk",
"typeGroup": "Groep",
"groupLabel": "Groep",
"groupSelectDefault": "Selecteer een groep",
"descriptionLabel": "Beschrijving",
"descriptionPlaceholder": "Voeg een beschrijving toe (optioneel)",
"frequencyLabel": "Frequentie",
"intervalLabel": "Interval (dagen)",
"intervalPlaceholder": "bijv. 10",
"dueDateLabel": "Vervaldatum",
"quickDueDateToday": "Vandaag",
"quickDueDateTomorrow": "Morgen",
"quickDueDateNextWeek": "Volgende week",
"cancelButton": "Annuleren",
"saveButton": "Opslaan"
},
"consoleErrors": {
"loadFailed": "Laden van alle taken mislukt:",
"loadGroupsFailed": "Laden van groepen mislukt",
"createAssignmentForNewChoreFailed": "Toewijzing voor nieuwe taak kon niet worden gemaakt:",
"saveFailed": "Opslaan van taak mislukt:",
"deleteFailed": "Verwijderen van taak mislukt:",
"createAssignmentFailed": "Toewijzing kon niet worden gemaakt:",
"updateCompletionStatusFailed": "Voltooiingsstatus van taak kon niet worden bijgewerkt:"
},
"deleteDialog": {
"title": "Taak verwijderen",
"confirmationText": "Weet u zeker dat u deze taak wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"deleteButton": "Verwijderen"
},
"shortcutsModal": {
"title": "Sneltoetsen",
"descNewChore": "Nieuwe taak",
"descToggleView": "Weergave wisselen (Lijst/Kalender)",
"descToggleShortcuts": "Sneltoetsen tonen/verbergen",
"descCloseModal": "Open Modal/Dialoog sluiten"
},
"frequencyOptions": {
"oneTime": "Eenmalig",
"daily": "Dagelijks",
"weekly": "Wekelijks",
"monthly": "Maandelijks",
"custom": "Aangepast"
},
"frequency": {
"customInterval": "Elke {n} dag | Elke {n} dagen"
},
"formatters": {
"noDueDate": "Geen vervaldatum",
"dueToday": "Vandaag te doen",
"dueTomorrow": "Morgen te doen",
"overdueFull": "Achterstallig: {date}",
"dueFull": "Vervalt op {date}",
"invalidDate": "Ongeldige datum"
},
"notifications": {
"loadFailed": "Laden van taken mislukt.",
"loadGroupsFailed": "Laden van groepen mislukt.",
"updateSuccess": "Taak '{name}' succesvol bijgewerkt.",
"createSuccess": "Taak '{name}' succesvol aangemaakt.",
"updateFailed": "Bijwerken van taak mislukt.",
"createFailed": "Aanmaken van taak mislukt.",
"deleteSuccess": "Taak '{name}' succesvol verwijderd.",
"deleteFailed": "Verwijderen van taak mislukt.",
"markedDone": "{name} gemarkeerd als voltooid.",
"markedNotDone": "{name} gemarkeerd als niet voltooid.",
"statusUpdateFailed": "Status van taak kon niet worden bijgewerkt.",
"createAssignmentFailed": "Toewijzing voor taak kon niet worden gemaakt."
},
"validation": {
"nameRequired": "Taaknaam is vereist.",
"groupRequired": "Selecteer een groep voor groepstaken.",
"intervalRequired": "Aangepast interval moet minimaal 1 dag zijn.",
"dueDateRequired": "Vervaldatum is vereist.",
"invalidDueDate": "Ongeldig formaat vervaldatum."
},
"unsavedChangesConfirmation": "U heeft niet-opgeslagen wijzigingen in het taakformulier. Weet u zeker dat u wilt vertrekken?"
},
"errorNotFoundPage": {
"errorCode": "404",
"errorMessage": "Oeps. Hier is niets...",
"goHomeButton": "Naar de startpagina"
},
"groupDetailPage": {
"loadingLabel": "Groepsdetails laden...",
"retryButton": "Opnieuw proberen",
"groupNotFound": "Groep niet gevonden of er is een fout opgetreden.",
"members": {
"title": "Groepsleden",
"defaultRole": "Lid",
"removeButton": "Verwijderen",
"emptyState": "Geen leden gevonden.",
"closeMenuLabel": "Menu sluiten"
},
"invites": {
"title": "Leden uitnodigen",
"description": "Nodig nieuwe leden uit door een deelbare code te genereren.",
"addMemberButtonLabel": "Lid toevoegen",
"closeInviteLabel": "Uitnodiging sluiten",
"regenerateButton": "Uitnodigingscode opnieuw genereren",
"generateButton": "Uitnodigingscode genereren",
"activeCodeLabel": "Huidige actieve uitnodigingscode:",
"copyButtonLabel": "Kopieer uitnodigingscode",
"copySuccess": "Uitnodigingscode gekopieerd naar klembord!",
"emptyState": "Geen actieve uitnodigingscode. Klik op de knop hierboven om er een te genereren.",
"errors": {
"newDataInvalid": "Gegevens van nieuwe uitnodigingscode zijn ongeldig."
}
},
"errors": {
"failedToFetchActiveInvite": "Ophalen van actieve uitnodigingscode mislukt.",
"failedToFetchGroupDetails": "Ophalen van groepsdetails mislukt.",
"failedToLoadUpcomingChores": "Fout bij het laden van aankomende taken:",
"failedToLoadRecentExpenses": "Fout bij het laden van recente uitgaven:"
},
"console": {
"noActiveInvite": "Geen actieve uitnodigingscode gevonden voor deze groep."
},
"chores": {
"title": "Groepstaken",
"manageButton": "Taken beheren",
"duePrefix": "Vervalt:",
"emptyState": "Geen taken gepland. Klik op \"Taken beheren\" om er enkele aan te maken!"
},
"expenses": {
"title": "Groepsuitgaven",
"manageButton": "Uitgaven beheren",
"emptyState": "Geen uitgaven geregistreerd. Klik op \"Uitgaven beheren\" om er enkele toe te voegen!",
"paidBy": "Betaald door:",
"owes": "is verschuldigd",
"paidAmount": "Betaald:",
"onDate": "op",
"settleShareButton": "Mijn deel vereffenen",
"activityLabel": "Activiteit:",
"byUser": "door",
"fallbackUserName": "Gebruikers-ID: {userId}",
"activityByUserFallback": "Gebruiker {userId}",
"splitTypes": {
"equal": "Gelijk",
"exactAmounts": "Exacte bedragen",
"percentage": "Percentage",
"shares": "Aandelen",
"itemBased": "Op item gebaseerd"
}
},
"notifications": {
"fetchDetailsFailed": "Ophalen van groepsdetails mislukt.",
"fetchInviteFailed": "Ophalen van actieve uitnodigingscode mislukt.",
"generateInviteSuccess": "Nieuwe uitnodigingscode succesvol gegenereerd!",
"generateInviteError": "Genereren van uitnodigingscode mislukt.",
"clipboardNotSupported": "Klembord niet ondersteund of geen code om te kopiëren.",
"copyInviteFailed": "Kopiëren van uitnodigingscode mislukt.",
"removeMemberSuccess": "Lid succesvol verwijderd",
"removeMemberFailed": "Verwijderen van lid mislukt",
"loadExpensesFailed": "Laden van recente uitgaven mislukt.",
"cannotSettleOthersShares": "U kunt alleen uw eigen aandelen vereffenen.",
"settlementDataMissing": "Kan vereffening niet verwerken: gegevens ontbreken.",
"settleShareSuccess": "Aandeel succesvol vereffend!",
"settleShareFailed": "Vereffenen van aandeel mislukt."
},
"loading": {
"settlement": "Bezig met vereffenen..."
},
"settleShareModal": {
"title": "Aandeel vereffenen",
"settleAmountFor": "Bedrag vereffenen voor {userName}:",
"amountLabel": "Bedrag",
"cancelButton": "Annuleren",
"confirmButton": "Bevestigen",
"errors": {
"enterAmount": "Voer een bedrag in.",
"positiveAmount": "Voer een positief bedrag in.",
"exceedsRemaining": "Bedrag mag resterend bedrag niet overschrijden: {amount}.",
"noSplitSelected": "Fout: Geen verdeling geselecteerd."
}
},
"status": {
"settled": "Vereffend",
"partiallySettled": "Gedeeltelijk vereffend",
"unsettled": "Openstaand",
"paid": "Betaald",
"partiallyPaid": "Gedeeltelijk betaald",
"unpaid": "Onbetaald",
"unknown": "Onbekende status"
}
},
"accountPage": {
"title": "Accountinstellingen",
"loadingProfile": "Profiel laden...",
"retryButton": "Opnieuw proberen",
"profileSection": {
"header": "Profielinformatie",
"nameLabel": "Naam",
"emailLabel": "E-mail",
"saveButton": "Wijzigingen opslaan"
},
"passwordSection": {
"header": "Wachtwoord wijzigen",
"currentPasswordLabel": "Huidig wachtwoord",
"newPasswordLabel": "Nieuw wachtwoord",
"changeButton": "Wachtwoord wijzigen"
},
"notificationsSection": {
"header": "Notificatievoorkeuren",
"emailNotificationsLabel": "E-mailnotificaties",
"emailNotificationsDescription": "Ontvang e-mailnotificaties voor belangrijke updates",
"listUpdatesLabel": "Lijstupdates",
"listUpdatesDescription": "Ontvang een melding wanneer lijsten worden bijgewerkt",
"groupActivitiesLabel": "Groepsactiviteiten",
"groupActivitiesDescription": "Ontvang meldingen voor groepsactiviteiten"
},
"notifications": {
"profileLoadFailed": "Laden van profiel mislukt",
"profileUpdateSuccess": "Profiel succesvol bijgewerkt",
"profileUpdateFailed": "Bijwerken van profiel mislukt",
"passwordFieldsRequired": "Vul zowel het huidige als het nieuwe wachtwoordveld in.",
"passwordTooShort": "Nieuw wachtwoord moet minimaal 8 tekens lang zijn.",
"passwordChangeSuccess": "Wachtwoord succesvol gewijzigd",
"passwordChangeFailed": "Wijzigen van wachtwoord mislukt",
"preferencesUpdateSuccess": "Voorkeuren succesvol bijgewerkt",
"preferencesUpdateFailed": "Bijwerken van voorkeuren mislukt"
},
"saving": "Opslaan..."
},
"signupPage": {
"header": "Aanmelden",
"fullNameLabel": "Volledige naam",
"emailLabel": "E-mail",
"passwordLabel": "Wachtwoord",
"confirmPasswordLabel": "Bevestig wachtwoord",
"togglePasswordVisibility": "Wachtwoord zichtbaarheid wisselen",
"submitButton": "Aanmelden",
"loginLink": "Heeft u al een account? Inloggen",
"validation": {
"nameRequired": "Naam is vereist",
"emailRequired": "E-mail is vereist",
"emailInvalid": "Ongeldig e-mailformaat",
"passwordRequired": "Wachtwoord is vereist",
"passwordLength": "Wachtwoord moet minimaal 8 tekens lang zijn",
"confirmPasswordRequired": "Bevestig uw wachtwoord",
"passwordsNoMatch": "Wachtwoorden komen niet overeen"
},
"notifications": {
"signupFailed": "Aanmelden mislukt. Probeer het opnieuw.",
"signupSuccess": "Account succesvol aangemaakt. Log in alstublieft."
}
},
"listDetailPage": {
"loading": {
"list": "Lijst laden...",
"items": "Items laden...",
"ocrProcessing": "Afbeelding verwerken...",
"addingOcrItems": "OCR-items toevoegen...",
"costSummary": "Samenvatting laden...",
"expenses": "Uitgaven laden...",
"settlement": "Bezig met vereffenen..."
},
"errors": {
"fetchFailed": "Laden van lijstdetails mislukt.",
"genericLoadFailure": "Groep niet gevonden of er is een fout opgetreden.",
"ocrNoItems": "Geen items uit de afbeelding gehaald.",
"ocrFailed": "Verwerken van afbeelding mislukt.",
"addItemFailed": "Toevoegen van item mislukt.",
"updateItemFailed": "Bijwerken van item mislukt.",
"updateItemPriceFailed": "Bijwerken van itemprijs mislukt.",
"deleteItemFailed": "Verwijderen van item mislukt.",
"addOcrItemsFailed": "Toevoegen van OCR-items mislukt.",
"fetchItemsFailed": "Laden van items mislukt: {errorMessage}",
"loadCostSummaryFailed": "Laden van kostensamenvatting mislukt."
},
"retryButton": "Opnieuw proberen",
"buttons": {
"addViaOcr": "Toevoegen via OCR",
"addItem": "Toevoegen",
"addItems": "Items toevoegen",
"cancel": "Annuleren",
"confirm": "Bevestigen",
"saveChanges": "Wijzigingen opslaan",
"close": "Sluiten",
"costSummary": "Kostensamenvatting"
},
"badges": {
"groupList": "Groepslijst",
"personalList": "Persoonlijke lijst"
},
"items": {
"emptyState": {
"title": "Nog geen items!",
"message": "Voeg items toe via het onderstaande formulier."
},
"addItemForm": {
"placeholder": "Nieuw item toevoegen",
"quantityPlaceholder": "Aantal",
"itemNameSrLabel": "Naam nieuw item",
"quantitySrLabel": "Hoeveelheid"
},
"pricePlaceholder": "Prijs",
"editItemAriaLabel": "Item bewerken",
"deleteItemAriaLabel": "Item verwijderen"
},
"modals": {
"ocr": {
"title": "Items toevoegen via OCR",
"uploadLabel": "Afbeelding uploaden"
},
"confirmation": {
"title": "Bevestiging"
},
"editItem": {
"title": "Item bewerken",
"nameLabel": "Itemnaam",
"quantityLabel": "Hoeveelheid"
},
"costSummary": {
"title": "Kostensamenvatting lijst",
"totalCostLabel": "Totale kosten lijst:",
"equalShareLabel": "Gelijk deel per gebruiker:",
"participantsLabel": "Deelnemende gebruikers:",
"userBalancesHeader": "Gebruikerssaldi",
"tableHeaders": {
"user": "Gebruiker",
"itemsAddedValue": "Waarde toegevoegde items",
"amountDue": "Verschuldigd bedrag",
"balance": "Saldo"
},
"emptyState": "Geen kostensamenvatting beschikbaar."
},
"settleShare": {
"title": "Aandeel vereffenen",
"settleAmountFor": "Bedrag vereffenen voor {userName}:",
"amountLabel": "Bedrag",
"errors": {
"enterAmount": "Voer een bedrag in.",
"positiveAmount": "Voer een positief bedrag in.",
"exceedsRemaining": "Bedrag mag resterend bedrag niet overschrijden: {amount}.",
"noSplitSelected": "Fout: Geen verdeling geselecteerd."
}
}
},
"confirmations": {
"updateMessage": "'{itemName}' markeren als {status}?",
"statusComplete": "voltooid",
"statusIncomplete": "onvolledig",
"deleteMessage": "'{itemName}' verwijderen? Dit kan niet ongedaan worden gemaakt."
},
"notifications": {
"itemAddedSuccess": "Item succesvol toegevoegd.",
"itemsAddedSuccessOcr": "{count} item(s) succesvol toegevoegd via OCR.",
"itemUpdatedSuccess": "Item succesvol bijgewerkt.",
"itemDeleteSuccess": "Item succesvol verwijderd.",
"enterItemName": "Voer een itemnaam in.",
"costSummaryLoadFailed": "Laden van kostensamenvatting mislukt.",
"cannotSettleOthersShares": "U kunt alleen uw eigen aandelen vereffenen.",
"settlementDataMissing": "Kan vereffening niet verwerken: gegevens ontbreken.",
"settleShareSuccess": "Aandeel succesvol vereffend!",
"settleShareFailed": "Vereffenen van aandeel mislukt."
},
"expensesSection": {
"title": "Uitgaven",
"addExpenseButton": "Uitgave toevoegen",
"loading": "Uitgaven laden...",
"emptyState": "Nog geen uitgaven geregistreerd voor deze lijst.",
"paidBy": "Betaald door:",
"onDate": "op",
"owes": "is verschuldigd",
"paidAmount": "Betaald:",
"activityLabel": "Activiteit:",
"byUser": "door",
"settleShareButton": "Mijn deel vereffenen",
"retryButton": "Opnieuw proberen"
},
"status": {
"settled": "Vereffend",
"partiallySettled": "Gedeeltelijk vereffend",
"unsettled": "Openstaand",
"paid": "Betaald",
"partiallyPaid": "Gedeeltelijk betaald",
"unpaid": "Onbetaald",
"unknown": "Onbekende status"
}
},
"myChoresPage": {
"title": "Mijn toegewezen taken",
"showCompletedToggle": "Voltooide tonen",
"timelineHeaders": {
"overdue": "Achterstallig",
"today": "Vandaag te doen",
"thisWeek": "Deze week",
"later": "Later",
"completed": "Voltooid"
},
"choreCard": {
"personal": "Persoonlijk",
"group": "Groep",
"duePrefix": "Vervalt",
"completedPrefix": "Voltooid",
"dueToday": "Vandaag te doen",
"markCompleteButton": "Markeer als voltooid"
},
"frequencies": {
"one_time": "Eenmalig",
"daily": "Dagelijks",
"weekly": "Wekelijks",
"monthly": "Maandelijks",
"custom": "Aangepast",
"unknown": "Onbekende frequentie"
},
"dates": {
"invalidDate": "Ongeldige datum",
"unknownDate": "Onbekende datum"
},
"emptyState": {
"title": "Nog geen toewijzingen!",
"noAssignmentsPending": "U heeft geen openstaande taaktoewijzingen.",
"noAssignmentsAll": "U heeft geen taaktoewijzingen (voltooid of openstaand).",
"viewAllChoresButton": "Alle taken bekijken"
},
"notifications": {
"loadFailed": "Laden van toewijzingen mislukt",
"markedComplete": "\"{choreName}\" gemarkeerd als voltooid!",
"markCompleteFailed": "Markeren van toewijzing als voltooid mislukt"
}
},
"personalChoresPage": {
"title": "Persoonlijke taken",
"newChoreButton": "Nieuwe taak",
"editButton": "Bewerken",
"deleteButton": "Verwijderen",
"cancelButton": "Annuleren",
"saveButton": "Opslaan",
"modals": {
"editChoreTitle": "Taak bewerken",
"newChoreTitle": "Nieuwe taak",
"deleteChoreTitle": "Taak verwijderen"
},
"form": {
"nameLabel": "Naam",
"descriptionLabel": "Beschrijving",
"frequencyLabel": "Frequentie",
"intervalLabel": "Interval (dagen)",
"dueDateLabel": "Volgende vervaldatum"
},
"deleteDialog": {
"confirmationText": "Weet u zeker dat u deze taak wilt verwijderen?"
},
"frequencies": {
"one_time": "Eenmalig",
"daily": "Dagelijks",
"weekly": "Wekelijks",
"monthly": "Maandelijks",
"custom": "Aangepast",
"unknown": "Onbekende frequentie"
},
"dates": {
"invalidDate": "Ongeldige datum",
"duePrefix": "Vervalt"
},
"notifications": {
"loadFailed": "Laden van persoonlijke taken mislukt",
"updateSuccess": "Persoonlijke taak succesvol bijgewerkt",
"createSuccess": "Persoonlijke taak succesvol aangemaakt",
"saveFailed": "Opslaan van persoonlijke taak mislukt",
"deleteSuccess": "Persoonlijke taak succesvol verwijderd",
"deleteFailed": "Verwijderen van persoonlijke taak mislukt"
}
},
"indexPage": {
"welcomeMessage": "Welkom bij de Valerie UI App",
"mainPageInfo": "Dit is de hoofdindexpagina.",
"sampleTodosHeader": "Voorbeeldtaken (uit IndexPage-gegevens)",
"totalCountLabel": "Totaal aantal uit meta:",
"noTodos": "Geen taken om weer te geven."
}
}

View File

@ -9,7 +9,6 @@ import enMessages from './i18n/en.json' // Import en.json directly
import deMessages from './i18n/de.json'
import frMessages from './i18n/fr.json'
import esMessages from './i18n/es.json'
import nlMessages from './i18n/nl.json'
// Global styles
import './assets/main.scss'

View File

@ -38,7 +38,7 @@ onMounted(async () => {
const tokenToUse = accessToken || legacyToken;
if (!tokenToUse) {
throw new Error(t('authCallbackPage.errors.noTokenProvided'));
throw new Error('No token provided');
}
await authStore.setTokens({ access_token: tokenToUse, refresh_token: refreshToken });

View File

@ -80,7 +80,7 @@ const loadChores = async () => {
cachedChores.value = mappedChores;
cachedTimestamp.value = Date.now()
} catch (error) {
console.error(t('choresPage.consoleErrors.loadFailed'), error)
console.error('Failed to load all chores:', error)
notificationStore.addNotification({ message: t('choresPage.notifications.loadFailed', 'Failed to load chores.'), type: 'error' })
} finally {
isLoading.value = false
@ -91,7 +91,7 @@ const loadGroups = async () => {
try {
groups.value = await groupService.getUserGroups();
} catch (error) {
console.error(t('choresPage.consoleErrors.loadGroupsFailed'), error);
console.error("Failed to load groups", error);
notificationStore.addNotification({ message: t('choresPage.notifications.loadGroupsFailed', 'Failed to load groups.'), type: 'error' });
}
}
@ -227,7 +227,7 @@ const handleFormSubmit = async () => {
due_date: createdChore.next_due_date
});
} catch (assignmentError) {
console.error(t('choresPage.consoleErrors.createAssignmentForNewChoreFailed'), assignmentError);
console.error('Failed to create assignment for new chore:', assignmentError);
// Continue anyway since the chore was created
}
}
@ -237,7 +237,7 @@ const handleFormSubmit = async () => {
showChoreModal.value = false;
await loadChores();
} catch (error) {
console.error(t('choresPage.consoleErrors.saveFailed'), error);
console.error('Failed to save chore:', error);
notificationStore.addNotification({ message: t('choresPage.notifications.saveFailed', 'Failed to save the chore.'), type: 'error' });
}
}
@ -255,7 +255,7 @@ const deleteChore = async () => {
showDeleteDialog.value = false
await loadChores()
} catch (error) {
console.error(t('choresPage.consoleErrors.deleteFailed'), error)
console.error('Failed to delete chore:', error)
notificationStore.addNotification({ message: t('choresPage.notifications.deleteFailed', 'Failed to delete chore.'), type: 'error' })
}
}
@ -271,7 +271,7 @@ const toggleCompletion = async (chore: ChoreWithCompletion) => {
});
chore.current_assignment_id = assignment.id;
} catch (error) {
console.error(t('choresPage.consoleErrors.createAssignmentFailed'), error);
console.error('Failed to create assignment:', error);
notificationStore.addNotification({
message: t('choresPage.notifications.createAssignmentFailed', 'Failed to create assignment for chore.'),
type: 'error'
@ -299,7 +299,7 @@ const toggleCompletion = async (chore: ChoreWithCompletion) => {
});
await loadChores();
} catch (error) {
console.error(t('choresPage.consoleErrors.updateCompletionStatusFailed'), error);
console.error('Failed to update chore completion status:', error);
notificationStore.addNotification({ message: t('choresPage.notifications.updateFailed', 'Failed to update chore status.'), type: 'error' });
chore.is_completed = originalCompleted;
} finally {
@ -403,7 +403,7 @@ const toggleCompletion = async (chore: ChoreWithCompletion) => {
<label class="form-label" for="chore-interval">{{ t('choresPage.form.interval', 'Interval (days)')
}}</label>
<input id="chore-interval" type="number" v-model.number="choreForm.custom_interval_days"
class="form-input" :placeholder="t('choresPage.form.intervalPlaceholder')" min="1">
class="form-input" placeholder="e.g., 10" min="1">
</div>
<div class="form-group">
<label class="form-label">{{ t('choresPage.form.type', 'Type') }}</label>

View File

@ -21,7 +21,7 @@
<div class="popup-header">
<span class="font-semibold truncate">{{ member.email }}</span>
<VButton variant="neutral" size="sm" :icon-only="true" iconLeft="x" @click="activeMemberMenu = null"
:aria-label="t('groupDetailPage.members.closeMenuLabel')" />
aria-label="Close menu" />
</div>
<div class="member-menu-content">
<VBadge :text="member.role || t('groupDetailPage.members.defaultRole')"
@ -37,7 +37,8 @@
</div>
<button ref="addMemberButtonRef" @click="toggleInviteUI" class="add-member-btn"
:aria-label="t('groupDetailPage.invites.title')">
{{ t('groupDetailPage.invites.addMemberButtonLabel') }}
<!-- <VIcon name="plus" size="md" /> -->
+
</button>
<!-- Invite Members Popup -->
@ -46,9 +47,9 @@
<VHeading :level="3" class="!m-0 !p-0 !border-none">{{ t('groupDetailPage.invites.title') }}
</VHeading>
<VButton variant="neutral" size="sm" :icon-only="true" iconLeft="x" @click="showInviteUI = false"
:aria-label="t('groupDetailPage.invites.closeInviteLabel')" />
aria-label="Close invite" />
</div>
<p class="text-sm text-gray-500 my-2">{{ t('groupDetailPage.invites.description') }}</p>
<p class="text-sm text-gray-500 my-2">Invite new members by generating a shareable code.</p>
<VButton variant="primary" class="w-full" @click="generateInviteCode" :disabled="generatingInvite">
<VSpinner v-if="generatingInvite" size="sm" /> {{ inviteCode ?
t('groupDetailPage.invites.regenerateButton') :
@ -145,7 +146,7 @@
<div class="neo-splits-list">
<div v-for="split in expense.splits" :key="split.id" class="neo-split-item">
<div class="split-col split-user">
<strong>{{ split.user?.name || split.user?.email || t('groupDetailPage.expenses.fallbackUserName', { userId: split.user_id }) }}</strong>
<strong>{{ split.user?.name || split.user?.email || `User ID: ${split.user_id}` }}</strong>
</div>
<div class="split-col split-owes">
{{ t('groupDetailPage.expenses.owes') }} <strong>{{
@ -177,7 +178,8 @@
{{ t('groupDetailPage.expenses.activityLabel') }} {{
formatCurrency(activity.amount_paid) }}
{{
t('groupDetailPage.expenses.byUser') }} {{ activity.payer?.name || t('groupDetailPage.expenses.activityByUserFallback', { userId: activity.paid_by_user_id }) }} {{ t('groupDetailPage.expenses.onDate') }} {{ new
t('groupDetailPage.expenses.byUser') }} {{ activity.payer?.name || `User
${activity.paid_by_user_id}` }} {{ t('groupDetailPage.expenses.onDate') }} {{ new
Date(activity.paid_at).toLocaleDateString() }}
</li>
</ul>
@ -207,7 +209,7 @@
<div v-else>
<p>{{ t('groupDetailPage.settleShareModal.settleAmountFor', {
userName: selectedSplitForSettlement?.user?.name
|| selectedSplitForSettlement?.user?.email || t('groupDetailPage.expenses.fallbackUserName', { userId: selectedSplitForSettlement?.user_id })
|| selectedSplitForSettlement?.user?.email || `User ID: ${selectedSplitForSettlement?.user_id}`
}) }}</p>
<VFormField :label="t('groupDetailPage.settleShareModal.amountLabel')"
:error-message="settleAmountError || undefined">
@ -381,9 +383,9 @@ const fetchActiveInviteCode = async () => {
inviteCode.value = null; // Explicitly set to null on 404
inviteExpiresAt.value = null;
// Optional: notify user or set a flag to show "generate one" message more prominently
console.info(t('groupDetailPage.console.noActiveInvite'));
console.info('No active invite code found for this group.');
} else {
const message = err instanceof Error ? err.message : t('groupDetailPage.errors.failedToFetchActiveInvite');
const message = err instanceof Error ? err.message : 'Failed to fetch active invite code.';
// error.value = message; // This would display a large error banner, might be too much
console.error('Error fetching active invite code:', err);
notificationStore.addNotification({ message, type: 'error' });
@ -416,7 +418,7 @@ const fetchGroupDetails = async () => {
timestamp: Date.now(),
};
} catch (err: unknown) {
const message = err instanceof Error ? err.message : t('groupDetailPage.errors.failedToFetchGroupDetails');
const message = err instanceof Error ? err.message : 'Failed to fetch group details.';
// Only show the main error banner if we have no data at all to show
if (!group.value) {
error.value = message;
@ -522,7 +524,7 @@ const loadUpcomingChores = async () => {
timestamp: Date.now()
};
} catch (error) {
console.error(t('groupDetailPage.errors.failedToLoadUpcomingChores'), error)
console.error('Error loading upcoming chores:', error)
}
}
@ -561,7 +563,7 @@ const loadRecentExpenses = async () => {
)
recentExpenses.value = response.data
} catch (error) {
console.error(t('groupDetailPage.errors.failedToLoadRecentExpenses'), error)
console.error('Error loading recent expenses:', error)
notificationStore.addNotification({ message: t('groupDetailPage.notifications.loadExpensesFailed'), type: 'error' });
}
}

View File

@ -281,12 +281,12 @@ const handleCreateGroup = async () => {
cachedGroups.value = groups.value;
cachedTimestamp.value = Date.now();
} else {
throw new Error(t('groupsPage.errors.invalidDataFromServer'));
throw new Error('Invalid data received from server.');
}
} catch (error: any) {
const message = error.response?.data?.detail || (error instanceof Error ? error.message : t('groupsPage.errors.createFailed'));
createGroupFormError.value = message;
console.error(t('groupsPage.errors.createFailedConsole'), error);
console.error('Error creating group:', error);
notificationStore.addNotification({ message, type: 'error' });
} finally {
creatingGroup.value = false;
@ -327,7 +327,7 @@ const handleJoinGroup = async () => {
} catch (error: any) {
const message = error.response?.data?.detail || (error instanceof Error ? error.message : t('groupsPage.errors.joinFailed'));
joinGroupFormError.value = message;
console.error(t('groupsPage.errors.joinFailedConsole'), error);
console.error('Error joining group:', error);
notificationStore.addNotification({ message, type: 'error' });
} finally {
joiningGroup.value = false;

View File

@ -57,7 +57,6 @@ export const useAuthStore = defineStore('auth', () => {
const fetchCurrentUser = async () => {
if (!accessToken.value) {
// No token, so definitely clear any residual state and return.
clearTokens()
return null
}
@ -66,28 +65,7 @@ export const useAuthStore = defineStore('auth', () => {
setUser(response.data)
return response.data
} catch (error: any) {
// Check if the error is from an Axios request and has a response status
if (error.isAxiosError && error.response) {
const status = error.response.status
if (status === 401 || status === 403) {
// Authentication error from the server, clear tokens.
console.error('Authentication error fetching user, clearing tokens:', error)
clearTokens()
} else {
// Other HTTP error, log it but don't clear tokens.
// The user might be null, but the token remains for other cached calls.
console.error('HTTP error fetching user, token preserved:', error)
}
} else {
// Network error (offline) or other non-HTTP error.
// Log the error but preserve tokens.
// This allows the app to function with cached data if available.
console.error('Network or other error fetching user, token preserved:', error)
}
// In all error cases where tokens are not cleared, return null for the user object.
// The existing user object (if any) will remain until explicitly cleared or overwritten.
// If the intention is to clear the user object on any fetch error, uncomment the next line:
// setUser(null);
clearTokens()
return null
}
}