Add Site Builder help docs and fix FloatingHelpButton paths

- Add HelpSiteBuilder.tsx with comprehensive documentation for the
  drag-and-drop page editor (components, publishing, settings)
- Fix FloatingHelpButton to use /dashboard/help/* paths on tenant sites
- Update HelpComprehensive and HelpAutomations to rename plugins to automations
- Add site-crawler utility with cross-subdomain redirect detection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-16 22:42:46 -05:00
parent 725a3c5d84
commit 94e37a2522
8 changed files with 913 additions and 189 deletions

View File

@@ -117,33 +117,47 @@ test.describe('Site Crawler - Platform Dashboard', () => {
});
});
// Uncomment and configure when tenant test users are set up
// test.describe('Site Crawler - Tenant Dashboard', () => {
// test('should crawl tenant dashboard without errors', async ({ page, context }) => {
// const user = TEST_USERS.businessOwner;
// const loggedIn = await loginAsUser(page, user);
// expect(loggedIn).toBe(true);
//
// const crawler = new SiteCrawler(page, context, CRAWLER_OPTIONS);
// const report = await crawler.crawl('http://demo.lvh.me:5173');
//
// console.log(formatReport(report));
//
// expect(report.totalPages).toBeGreaterThan(0);
//
// const criticalErrors = report.results.flatMap(r =>
// r.errors.filter(e => {
// if (e.message.includes('React DevTools')) return false;
// if (e.message.includes('favicon.ico')) return false;
// if (e.message.includes('hot-update')) return false;
// if (e.message.includes('WebSocket')) return false;
// return true;
// })
// );
//
// expect(criticalErrors.length).toBe(0);
// });
// });
test.describe('Site Crawler - Tenant Dashboard', () => {
test('should crawl tenant dashboard without cross-subdomain redirects', async ({ page, context }) => {
const user = TEST_USERS.businessOwner;
const loggedIn = await loginAsUser(page, user);
expect(loggedIn).toBe(true);
const crawler = new SiteCrawler(page, context, {
...CRAWLER_OPTIONS,
detectCrossSubdomainRedirects: true, // Detect redirects to public site
});
const report = await crawler.crawl('http://demo.lvh.me:5173');
console.log(formatReport(report));
expect(report.totalPages).toBeGreaterThan(0);
// Filter critical errors (excluding minor dev warnings)
const criticalErrors = report.results.flatMap(r =>
r.errors.filter(e => {
if (e.message.includes('React DevTools')) return false;
if (e.message.includes('favicon.ico')) return false;
if (e.message.includes('hot-update')) return false;
if (e.message.includes('WebSocket')) return false;
return true;
})
);
// Log redirect issues separately for visibility
const redirectErrors = criticalErrors.filter(e => e.type === 'redirect');
if (redirectErrors.length > 0) {
console.error('\n⚠ CROSS-SUBDOMAIN REDIRECTS DETECTED:');
redirectErrors.forEach(e => {
console.error(` - ${e.url}`);
console.error(` ${e.message}`);
if (e.details) console.error(` ${e.details}`);
});
}
expect(criticalErrors.length).toBe(0);
});
});
// test.describe('Site Crawler - Customer Portal', () => {
// test('should crawl customer booking portal without errors', async ({ page, context }) => {