mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-03-19 10:43:08 +00:00
Make memory and context views mobile-friendly (#813)
* Changes from fix/memory-and-context-mobile-friendly * fix: Improve file extension detection and add path traversal protection * refactor: Extract file extension utilities and add path traversal guards Code review improvements: - Extract isMarkdownFilename and isImageFilename to shared image-utils.ts - Remove duplicated code from context-view.tsx and memory-view.tsx - Add path traversal guard for context fixture utilities (matching memory) - Add 7 new tests for context fixture path traversal protection - Total 61 tests pass Addresses code review feedback from PR #813 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test: Add e2e tests for profiles crud and board background persistence * Update apps/ui/playwright.config.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix: Add robust test navigation handling and file filtering * fix: Format NODE_OPTIONS configuration on single line * test: Update profiles and board background persistence tests * test: Replace iPhone 13 Pro with Pixel 5 for mobile test consistency --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
@@ -12,9 +12,12 @@ export async function navigateToBoard(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Wait for any pending navigation to complete before starting a new one
|
||||
await page.waitForLoadState('domcontentloaded').catch(() => {});
|
||||
await page.waitForTimeout(100);
|
||||
|
||||
// Navigate directly to /board route
|
||||
await page.goto('/board');
|
||||
await page.waitForLoadState('load');
|
||||
await page.goto('/board', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
// Wait for splash screen to disappear (safety net)
|
||||
await waitForSplashScreenToDisappear(page, 3000);
|
||||
@@ -34,9 +37,13 @@ export async function navigateToContext(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Wait for any pending navigation to complete before starting a new one
|
||||
// This prevents race conditions, especially on mobile viewports
|
||||
await page.waitForLoadState('domcontentloaded').catch(() => {});
|
||||
await page.waitForTimeout(100);
|
||||
|
||||
// Navigate directly to /context route
|
||||
await page.goto('/context');
|
||||
await page.waitForLoadState('load');
|
||||
await page.goto('/context', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
// Wait for splash screen to disappear (safety net)
|
||||
await waitForSplashScreenToDisappear(page, 3000);
|
||||
@@ -59,6 +66,14 @@ export async function navigateToContext(page: Page): Promise<void> {
|
||||
// Wait for the context view to be visible
|
||||
// Increase timeout to handle slower server startup
|
||||
await waitForElement(page, 'context-view', { timeout: 15000 });
|
||||
|
||||
// On mobile, close the sidebar if open so the header actions trigger is clickable (not covered by backdrop)
|
||||
// Use JavaScript click to avoid force:true hitting the sidebar (z-30) instead of the backdrop (z-20)
|
||||
const backdrop = page.locator('[data-testid="sidebar-backdrop"]');
|
||||
if (await backdrop.isVisible().catch(() => false)) {
|
||||
await backdrop.evaluate((el) => (el as HTMLElement).click());
|
||||
await page.waitForTimeout(200);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,9 +84,12 @@ export async function navigateToSpec(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Wait for any pending navigation to complete before starting a new one
|
||||
await page.waitForLoadState('domcontentloaded').catch(() => {});
|
||||
await page.waitForTimeout(100);
|
||||
|
||||
// Navigate directly to /spec route
|
||||
await page.goto('/spec');
|
||||
await page.waitForLoadState('load');
|
||||
await page.goto('/spec', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
// Wait for splash screen to disappear (safety net)
|
||||
await waitForSplashScreenToDisappear(page, 3000);
|
||||
@@ -105,9 +123,12 @@ export async function navigateToAgent(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Wait for any pending navigation to complete before starting a new one
|
||||
await page.waitForLoadState('domcontentloaded').catch(() => {});
|
||||
await page.waitForTimeout(100);
|
||||
|
||||
// Navigate directly to /agent route
|
||||
await page.goto('/agent');
|
||||
await page.waitForLoadState('load');
|
||||
await page.goto('/agent', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
// Wait for splash screen to disappear (safety net)
|
||||
await waitForSplashScreenToDisappear(page, 3000);
|
||||
|
||||
Reference in New Issue
Block a user