merge fixes

This commit is contained in:
Connor Yoh 2025-08-01 17:34:13 +01:00
parent 5b798ba558
commit 0d2a72b42e
6 changed files with 53 additions and 30 deletions

View File

@ -2,7 +2,6 @@ import React from 'react';
import { RainbowThemeProvider } from './components/shared/RainbowThemeProvider'; import { RainbowThemeProvider } from './components/shared/RainbowThemeProvider';
import { FileContextProvider } from './contexts/FileContext'; import { FileContextProvider } from './contexts/FileContext';
import { FilesModalProvider } from './contexts/FilesModalContext'; import { FilesModalProvider } from './contexts/FilesModalContext';
import FileUploadModal from './components/shared/FileUploadModal';
import HomePage from './pages/HomePage'; import HomePage from './pages/HomePage';
// Import global styles // Import global styles
@ -15,7 +14,6 @@ export default function App() {
<FileContextProvider enableUrlSync={true} enablePersistence={true}> <FileContextProvider enableUrlSync={true} enablePersistence={true}>
<FilesModalProvider> <FilesModalProvider>
<HomePage /> <HomePage />
<FileUploadModal />
</FilesModalProvider> </FilesModalProvider>
</FileContextProvider> </FileContextProvider>
</RainbowThemeProvider> </RainbowThemeProvider>

View File

@ -2,10 +2,16 @@ import React from 'react';
import { Modal } from '@mantine/core'; import { Modal } from '@mantine/core';
import FileUploadSelector from './FileUploadSelector'; import FileUploadSelector from './FileUploadSelector';
import { useFilesModalContext } from '../../contexts/FilesModalContext'; import { useFilesModalContext } from '../../contexts/FilesModalContext';
import { Tool } from '../../types/tool';
const FileUploadModal: React.FC = () => { interface FileUploadModalProps {
selectedTool?: Tool | null;
}
const FileUploadModal: React.FC<FileUploadModalProps> = ({ selectedTool }) => {
const { isFilesModalOpen, closeFilesModal, onFileSelect, onFilesSelect } = useFilesModalContext(); const { isFilesModalOpen, closeFilesModal, onFileSelect, onFilesSelect } = useFilesModalContext();
return ( return (
<Modal <Modal
opened={isFilesModalOpen} opened={isFilesModalOpen}
@ -18,9 +24,10 @@ const FileUploadModal: React.FC = () => {
title="Upload Files" title="Upload Files"
subtitle="Choose files from storage or upload new files" subtitle="Choose files from storage or upload new files"
onFileSelect={onFileSelect} onFileSelect={onFileSelect}
onFilesSelect={onFilesSelect} onFilesSelect={onFilesSelect}
accept={["application/pdf"]} accept={["*/*"]}
supportedExtensions={["pdf"]} supportedExtensions={selectedTool?.supportedFormats || ["pdf"]}
data-testid="file-upload-modal"
/> />
</Modal> </Modal>
); );

View File

@ -276,6 +276,7 @@ const QuickAccessBar = ({
onClick={config.onClick} onClick={config.onClick}
style={getButtonStyle(config)} style={getButtonStyle(config)}
className={isButtonActive(config) ? 'activeIconScale' : ''} className={isButtonActive(config) ? 'activeIconScale' : ''}
data-testid={`${config.id}-button`}
> >
<span className="iconContainer"> <span className="iconContainer">
{config.icon} {config.icon}
@ -313,6 +314,7 @@ const QuickAccessBar = ({
onClick={config.onClick} onClick={config.onClick}
style={getButtonStyle(config)} style={getButtonStyle(config)}
className={isButtonActive(config) ? 'activeIconScale' : ''} className={isButtonActive(config) ? 'activeIconScale' : ''}
data-testid={`${config.id}-button`}
> >
<span className="iconContainer"> <span className="iconContainer">
{config.icon} {config.icon}

View File

@ -198,7 +198,7 @@ const ConvertSettings = ({
</Text> </Text>
<GroupedFormatDropdown <GroupedFormatDropdown
name="convert-from-dropdown" name="convert-from-dropdown"
data-testid="from-format-dropdown" data-testid="convert-from-dropdown"
value={parameters.fromExtension} value={parameters.fromExtension}
placeholder={t("convert.sourceFormatPlaceholder", "Source format")} placeholder={t("convert.sourceFormatPlaceholder", "Source format")}
options={enhancedFromOptions} options={enhancedFromOptions}
@ -236,7 +236,7 @@ const ConvertSettings = ({
) : ( ) : (
<GroupedFormatDropdown <GroupedFormatDropdown
name="convert-to-dropdown" name="convert-to-dropdown"
data-testid="to-format-dropdown" data-testid="convert-to-dropdown"
value={parameters.toExtension} value={parameters.toExtension}
placeholder={t("convert.targetFormatPlaceholder", "Target format")} placeholder={t("convert.targetFormatPlaceholder", "Target format")}
options={enhancedToOptions} options={enhancedToOptions}

View File

@ -18,6 +18,7 @@ import Viewer from "../components/viewer/Viewer";
import ToolRenderer from "../components/tools/ToolRenderer"; import ToolRenderer from "../components/tools/ToolRenderer";
import QuickAccessBar from "../components/shared/QuickAccessBar"; import QuickAccessBar from "../components/shared/QuickAccessBar";
import LandingPage from "../components/shared/LandingPage"; import LandingPage from "../components/shared/LandingPage";
import FileUploadModal from "../components/shared/FileUploadModal";
function HomePageContent() { function HomePageContent() {
const { t } = useTranslation(); const { t } = useTranslation();
@ -35,6 +36,7 @@ function HomePageContent() {
selectTool, selectTool,
clearToolSelection, clearToolSelection,
} = useToolManagement(); } = useToolManagement();
const [sidebarsVisible, setSidebarsVisible] = useState(true); const [sidebarsVisible, setSidebarsVisible] = useState(true);
const [leftPanelView, setLeftPanelView] = useState<'toolPicker' | 'toolContent'>('toolPicker'); const [leftPanelView, setLeftPanelView] = useState<'toolPicker' | 'toolContent'>('toolPicker');
const [readerMode, setReaderMode] = useState(false); const [readerMode, setReaderMode] = useState(false);
@ -266,6 +268,9 @@ function HomePageContent() {
)} )}
</Box> </Box>
</Box> </Box>
{/* Global Modals */}
<FileUploadModal selectedTool={selectedTool} />
</Group> </Group>
); );
} }

View File

@ -127,6 +127,27 @@ const getExpectedExtension = (toFormat: string): string => {
return extensionMap[toFormat] || '.pdf'; return extensionMap[toFormat] || '.pdf';
}; };
/**
* Helper function to upload files through the modal system
*/
async function uploadFileViaModal(page: Page, filePath: string) {
// Click the Files button in the QuickAccessBar to open the modal
await page.click('[data-testid="files-button"]');
// Wait for the modal to open
await page.waitForSelector('.mantine-Modal-overlay', { state: 'visible' }, { timeout: 5000 });
//await page.waitForSelector('[data-testid="file-upload-modal"]', { timeout: 5000 });
// Upload the file through the modal's file input
await page.setInputFiles('input[type="file"]', filePath);
// Wait for the file to be processed and the modal to close
await page.waitForSelector('[data-testid="file-upload-modal"]', { state: 'hidden' });
// Wait for the file thumbnail to appear in the main interface
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
}
/** /**
* Generic test function for any conversion * Generic test function for any conversion
*/ */
@ -288,8 +309,8 @@ test.describe('Convert Tool E2E Tests', () => {
// Wait for the page to load // Wait for the page to load
await page.waitForLoadState('networkidle'); await page.waitForLoadState('networkidle');
// Wait for the file upload area to appear (shown when no active files) // Wait for the QuickAccessBar to appear
await page.waitForSelector('[data-testid="file-dropzone"]', { timeout: 10000 }); await page.waitForSelector('[data-testid="files-button"]', { timeout: 10000 });
}); });
test.describe('Dynamic Conversion Tests', () => { test.describe('Dynamic Conversion Tests', () => {
@ -302,8 +323,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -314,8 +334,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -326,8 +345,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -338,8 +356,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -350,8 +367,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -362,8 +378,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -374,8 +389,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -386,8 +400,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -398,8 +411,7 @@ test.describe('Convert Tool E2E Tests', () => {
test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`); test.skip(!isAvailable, `Endpoint ${conversion.endpoint} is not available`);
const testFile = getTestFileForFormat(conversion.fromFormat); const testFile = getTestFileForFormat(conversion.fromFormat);
await page.setInputFiles('input[type="file"]', testFile); await uploadFileViaModal(page, testFile);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
await testConversion(page, conversion); await testConversion(page, conversion);
}); });
@ -410,8 +422,7 @@ test.describe('Convert Tool E2E Tests', () => {
// Test that disabled conversions don't appear in dropdowns when they shouldn't // Test that disabled conversions don't appear in dropdowns when they shouldn't
test('should not show conversion button when no valid conversions available', async ({ page }) => { test('should not show conversion button when no valid conversions available', async ({ page }) => {
// This test ensures the convert button is disabled when no valid conversion is possible // This test ensures the convert button is disabled when no valid conversion is possible
await page.setInputFiles('input[type="file"]', TEST_FILES.pdf); await uploadFileViaModal(page, TEST_FILES.pdf);
await page.waitForSelector('[data-testid="file-thumbnail"]', { timeout: 10000 });
// Click the Convert tool button // Click the Convert tool button
await page.click('[data-testid="tool-convert"]'); await page.click('[data-testid="tool-convert"]');