+
@@ -195,6 +251,34 @@ const ServerGroupsTable = () => {
serverGroup={serverGroup}
isOpen={serverGroupModalOpen}
onClose={closeServerGroupForm}
+ onSaved={handleServerGroupSaved}
+ />
+
+
setConfirmDeleteOpen(false)}
+ onConfirm={() => executeDeleteServerGroup(deleteTarget)}
+ loading={deleting}
+ title="Confirm Server Group Deletion"
+ message={
+ groupToDelete ? (
+
+ {`Are you sure you want to delete the following server group?
+
+Name: ${groupToDelete.name}
+Accounts: ${groupToDelete.accountCount ?? 0}
+
+Accounts in this group will no longer share connection limits. This action cannot be undone.`}
+
+ ) : (
+ 'Are you sure you want to delete this server group? This action cannot be undone.'
+ )
+ }
+ confirmLabel="Delete"
+ cancelLabel="Cancel"
+ actionKey="delete-server-group"
+ onSuppressChange={suppressWarning}
+ zIndex={401}
/>
);
diff --git a/frontend/src/components/tables/__tests__/ServerGroupsTable.test.jsx b/frontend/src/components/tables/__tests__/ServerGroupsTable.test.jsx
new file mode 100644
index 00000000..93f8b480
--- /dev/null
+++ b/frontend/src/components/tables/__tests__/ServerGroupsTable.test.jsx
@@ -0,0 +1,62 @@
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+import { render, screen, waitFor } from '@testing-library/react';
+import { MantineProvider } from '@mantine/core';
+import ServerGroupsTable from '../ServerGroupsTable';
+
+const renderTable = () =>
+ render(
+
+
+
+ );
+
+vi.mock('../../../api', () => ({
+ default: {
+ deleteServerGroup: vi.fn(),
+ },
+}));
+
+vi.mock('../../../store/serverGroups', () => ({
+ default: (selector) =>
+ selector({
+ serverGroups: [
+ { id: 1, name: 'Pool A' },
+ { id: 2, name: 'Pool B' },
+ ],
+ fetchServerGroups: vi.fn().mockResolvedValue(undefined),
+ }),
+}));
+
+vi.mock('../../../store/playlists', () => ({
+ default: (selector) =>
+ selector({
+ playlists: [
+ { id: 10, server_group: 2 },
+ { id: 11, server_group: 1 },
+ ],
+ }),
+}));
+
+vi.mock('../../forms/ServerGroup', () => ({
+ default: () => null,
+}));
+
+vi.mock('../../../hooks/useLocalStorage', () => ({
+ default: () => ['default', vi.fn()],
+}));
+
+describe('ServerGroupsTable', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('renders server groups without tooltip errors', async () => {
+ expect(() => renderTable()).not.toThrow();
+
+ await waitFor(() => {
+ expect(screen.getByText('Pool A')).toBeInTheDocument();
+ expect(screen.getByText('Pool B')).toBeInTheDocument();
+ expect(screen.getByText('Accounts')).toBeInTheDocument();
+ });
+ });
+});
diff --git a/frontend/src/pages/Settings.jsx b/frontend/src/pages/Settings.jsx
index c3481984..29d46dd8 100644
--- a/frontend/src/pages/Settings.jsx
+++ b/frontend/src/pages/Settings.jsx
@@ -14,9 +14,6 @@ import {
const UserAgentsTable = React.lazy(
() => import('../components/tables/UserAgentsTable.jsx')
);
-const ServerGroupsTable = React.lazy(
- () => import('../components/tables/ServerGroupsTable.jsx')
-);
const StreamProfilesTable = React.lazy(
() => import('../components/tables/StreamProfilesTable.jsx')
);
@@ -138,19 +135,6 @@ const SettingsPage = () => {
-
- Server Groups
-
-
- }>
-
-
-
-
-
-
User-Agents