Add Deluge integration; revamp admin Jobs & Logs UI

Introduce Deluge download client service and tests, remove obsolete rdtclient service, and update qbittorrent integration/tests and download-client interfaces/manager. Large UI refactor for admin pages: Jobs and Logs were redesigned to be responsive (mobile card views + desktop tables), improved headers, dialogs, controls, and better status/detail rendering. Also updated DownloadClient components (card, management, modal), organize-files processor, audible-series integration, and related unit tests to align with integration changes. Minor UX and accessibility tweaks, cron handling/validation adjustments, and a few formatting/cleanup fixes throughout.
This commit is contained in:
kikootwo
2026-02-20 20:44:26 -05:00
parent 04dbb05a6e
commit d70f6c9957
22 changed files with 1742 additions and 679 deletions
+7 -7
View File
@@ -68,14 +68,14 @@ describe('AdminLogsPage', () => {
render(<AdminLogsPage />);
expect(await screen.findByText('System Logs')).toBeInTheDocument();
expect(screen.getByText('Search Book')).toBeInTheDocument();
expect(screen.getAllByText('Search Book')[0]).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: 'Show Details' }));
expect(screen.getByText('Event Log')).toBeInTheDocument();
expect(screen.getByText('Job Result')).toBeInTheDocument();
expect(screen.getByText('Error')).toBeInTheDocument();
fireEvent.click(screen.getAllByRole('button', { name: 'Show Details' })[0]);
expect(screen.getAllByText('Event Log')[0]).toBeInTheDocument();
expect(screen.getAllByText('Job Result')[0]).toBeInTheDocument();
expect(screen.getAllByText('Error')[0]).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: 'Hide Details' }));
fireEvent.click(screen.getAllByRole('button', { name: 'Hide Details' })[0]);
expect(screen.queryByText('Event Log')).not.toBeInTheDocument();
});
@@ -122,6 +122,6 @@ describe('AdminLogsPage', () => {
render(<AdminLogsPage />);
expect(await screen.findByText('No logs found')).toBeInTheDocument();
expect((await screen.findAllByText('No logs found'))[0]).toBeInTheDocument();
});
});