diff --git a/client/src/components/Admin/AuditLogPanel.test.tsx b/client/src/components/Admin/AuditLogPanel.test.tsx
index a6e73507..4d076f0e 100644
--- a/client/src/components/Admin/AuditLogPanel.test.tsx
+++ b/client/src/components/Admin/AuditLogPanel.test.tsx
@@ -47,7 +47,7 @@ describe('AuditLogPanel', () => {
}),
);
render();
- expect(screen.getByText('Loading…')).toBeInTheDocument();
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
expect(document.querySelector('table')).not.toBeInTheDocument();
});
diff --git a/client/src/components/Admin/GitHubPanel.test.tsx b/client/src/components/Admin/GitHubPanel.test.tsx
index 429bd042..617bdd88 100644
--- a/client/src/components/Admin/GitHubPanel.test.tsx
+++ b/client/src/components/Admin/GitHubPanel.test.tsx
@@ -55,7 +55,7 @@ describe('GitHubPanel', () => {
it('FE-ADMIN-GH-002: all support links have correct href and target=_blank', async () => {
render();
- await waitFor(() => expect(screen.queryByText('Loading…')).not.toBeInTheDocument());
+ await waitFor(() => expect(screen.queryByText('Loading...')).not.toBeInTheDocument());
const kofi = screen.getByText('Ko-fi').closest('a')!;
expect(kofi).toHaveAttribute('href', 'https://ko-fi.com/mauriceboe');
@@ -272,7 +272,7 @@ describe('GitHubPanel', () => {
it('FE-ADMIN-GH-016: support card hover effects fire without error', async () => {
render();
- await waitFor(() => expect(screen.queryByText('Loading…')).not.toBeInTheDocument());
+ await waitFor(() => expect(screen.queryByText('Loading...')).not.toBeInTheDocument());
const kofiLink = screen.getByText('Ko-fi').closest('a')!;
fireEvent.mouseEnter(kofiLink);
diff --git a/client/src/components/Settings/NotificationsTab.test.tsx b/client/src/components/Settings/NotificationsTab.test.tsx
index ef894d34..b3b808a4 100644
--- a/client/src/components/Settings/NotificationsTab.test.tsx
+++ b/client/src/components/Settings/NotificationsTab.test.tsx
@@ -35,14 +35,14 @@ describe('NotificationsTab', () => {
http.get('/api/notifications/preferences', () => new Promise(() => {})),
);
render();
- expect(screen.getByText('Loading…')).toBeInTheDocument();
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
});
it('FE-COMP-NOTIFICATIONS-002: renders the matrix after preferences load', async () => {
render();
// The event label is translated; fallback is the key itself
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// Should render a toggle (ToggleSwitch renders a button)
const toggles = await screen.findAllByRole('button');
@@ -52,7 +52,7 @@ describe('NotificationsTab', () => {
it('FE-COMP-NOTIFICATIONS-003: renders channel header labels', async () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// inapp channel header should appear (either translated or raw key)
const headers = screen.getAllByText(/inapp|in.?app/i);
@@ -72,7 +72,7 @@ describe('NotificationsTab', () => {
);
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// Should show noChannels message (translated or key)
const noChannelEl = await screen.findByText(/no.*channel|noChannels/i);
@@ -97,7 +97,7 @@ describe('NotificationsTab', () => {
);
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// A dash should appear for non-implemented combos
const dashes = await screen.findAllByText('—');
@@ -116,7 +116,7 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// minimalMatrix has inapp:true and email:false for trip_invite
@@ -144,7 +144,7 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// Find the inapp toggle for trip_invite — it starts as "on"
@@ -156,8 +156,8 @@ describe('NotificationsTab', () => {
// After the error, the toggle should revert back (still rendered in the DOM)
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
- expect(screen.queryByText('Saving…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
+ expect(screen.queryByText('Saving...')).not.toBeInTheDocument();
});
// The toggle should still be present (not removed on error)
@@ -178,20 +178,20 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
const toggleButtons = await screen.findAllByRole('button');
await user.click(toggleButtons[0]);
await waitFor(() => {
- expect(screen.getByText('Saving…')).toBeInTheDocument();
+ expect(screen.getByText('Saving...')).toBeInTheDocument();
});
resolveRequest();
await waitFor(() => {
- expect(screen.queryByText('Saving…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Saving...')).not.toBeInTheDocument();
});
});
@@ -209,7 +209,7 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
// Webhook URL input should be present
@@ -238,7 +238,7 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
const input = await screen.findByRole('textbox');
@@ -265,7 +265,7 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
const input = await screen.findByRole('textbox');
@@ -297,7 +297,7 @@ describe('NotificationsTab', () => {
render();
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
await screen.findByRole('textbox');
@@ -330,7 +330,7 @@ describe('NotificationsTab', () => {
);
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
const input = await screen.findByRole('textbox');
@@ -371,7 +371,7 @@ describe('NotificationsTab', () => {
);
await waitFor(() => {
- expect(screen.queryByText('Loading…')).not.toBeInTheDocument();
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
});
const input = await screen.findByRole('textbox');
diff --git a/client/src/components/Trips/TripFormModal.test.tsx b/client/src/components/Trips/TripFormModal.test.tsx
index 9c1042a8..ed5bbac9 100644
--- a/client/src/components/Trips/TripFormModal.test.tsx
+++ b/client/src/components/Trips/TripFormModal.test.tsx
@@ -284,6 +284,6 @@ describe('TripFormModal', () => {
const submitBtns = screen.getAllByText('Create New Trip');
const submitBtn = submitBtns.find(el => el.closest('button'))!;
await user.click(submitBtn.closest('button')!);
- await waitFor(() => expect(screen.getByText('Saving…')).toBeInTheDocument());
+ await waitFor(() => expect(screen.getByText('Saving...')).toBeInTheDocument());
});
});
diff --git a/client/src/i18n/translations/en.ts b/client/src/i18n/translations/en.ts
index f34f9475..13593e11 100644
--- a/client/src/i18n/translations/en.ts
+++ b/client/src/i18n/translations/en.ts
@@ -5,7 +5,7 @@ const en: Record = {
'common.delete': 'Delete',
'common.edit': 'Edit',
'common.add': 'Add',
- 'common.loading': 'Loading…',
+ 'common.loading': 'Loading...',
'common.import': 'Import',
'common.error': 'Error',
'common.unknownError': 'Unknown error',
@@ -27,7 +27,7 @@ const en: Record = {
'common.name': 'Name',
'common.email': 'Email',
'common.password': 'Password',
- 'common.saving': 'Saving…',
+ 'common.saving': 'Saving...',
'common.justNow': 'just now',
'common.hoursAgo': '{count}h ago',
'common.daysAgo': '{count}d ago',