diff --git a/README.md b/README.md index e3f72f1..c019141 100644 --- a/README.md +++ b/README.md @@ -24,20 +24,31 @@ Admin panel: - Server Status: ![Server Status](docs/screenshots/admin-server-status.png) - Server Settings: ![Server Settings](docs/screenshots/admin-server-settings.png) - Security Center: ![Security Center](docs/screenshots/admin-security.png) +- Users: ![User Management](docs/screenshots/admin-users.png) +- SSL Manager: ![SSL Manager](docs/screenshots/admin-ssl-manager.png) +- DNS Zones: ![DNS Zones](docs/screenshots/admin-dns-zones.png) +- Backups: ![Admin Backups](docs/screenshots/admin-backups.png) +- Services: ![Services](docs/screenshots/admin-services.png) -User panel and flows (placeholder screenshots; replace with real captures): +User panel and flows: -- User Dashboard: ![User Dashboard](docs/screenshots/user-dashboard.svg) -- Domain Management: ![User Domains](docs/screenshots/user-domains.svg) -- Migration Progress: ![Migration Progress](docs/screenshots/migration-progress.svg) -- Backups: ![Backups](docs/screenshots/backups.svg) +- User Dashboard: ![User Dashboard](docs/screenshots/user-dashboard.png) +- Domain Management: ![User Domains](docs/screenshots/user-domains.png) +- Backups: ![User Backups](docs/screenshots/user-backups.png) +- cPanel Migration: ![cPanel Migration](docs/screenshots/user-cpanel-migration.png) -Regenerate admin screenshots with: +Regenerate screenshots with: ``` node tests/take-screenshots.cjs --output-dir=docs/screenshots ``` +Optional overrides: + +``` +node tests/take-screenshots.cjs --output-dir=docs/screenshots --base-url=https://panel.example.com +``` + ## Feature Map ### Admin Panel diff --git a/docs/screenshots/admin-backups.png b/docs/screenshots/admin-backups.png new file mode 100644 index 0000000..91fef78 Binary files /dev/null and b/docs/screenshots/admin-backups.png differ diff --git a/docs/screenshots/admin-dashboard.png b/docs/screenshots/admin-dashboard.png index 1d9f0d7..6c32ba1 100644 Binary files a/docs/screenshots/admin-dashboard.png and b/docs/screenshots/admin-dashboard.png differ diff --git a/docs/screenshots/admin-dns-zones.png b/docs/screenshots/admin-dns-zones.png new file mode 100644 index 0000000..2f103ac Binary files /dev/null and b/docs/screenshots/admin-dns-zones.png differ diff --git a/docs/screenshots/admin-security.png b/docs/screenshots/admin-security.png index 11abc14..c639bba 100644 Binary files a/docs/screenshots/admin-security.png and b/docs/screenshots/admin-security.png differ diff --git a/docs/screenshots/admin-server-settings.png b/docs/screenshots/admin-server-settings.png index ae495e2..66c173f 100644 Binary files a/docs/screenshots/admin-server-settings.png and b/docs/screenshots/admin-server-settings.png differ diff --git a/docs/screenshots/admin-server-status.png b/docs/screenshots/admin-server-status.png index a763f91..9262736 100644 Binary files a/docs/screenshots/admin-server-status.png and b/docs/screenshots/admin-server-status.png differ diff --git a/docs/screenshots/admin-services.png b/docs/screenshots/admin-services.png new file mode 100644 index 0000000..0d014ec Binary files /dev/null and b/docs/screenshots/admin-services.png differ diff --git a/docs/screenshots/admin-ssl-manager.png b/docs/screenshots/admin-ssl-manager.png new file mode 100644 index 0000000..44e8696 Binary files /dev/null and b/docs/screenshots/admin-ssl-manager.png differ diff --git a/docs/screenshots/admin-users.png b/docs/screenshots/admin-users.png new file mode 100644 index 0000000..845743d Binary files /dev/null and b/docs/screenshots/admin-users.png differ diff --git a/docs/screenshots/backups.svg b/docs/screenshots/backups.svg deleted file mode 100644 index b2ee05a..0000000 --- a/docs/screenshots/backups.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Backups - - - Placeholder screenshot - diff --git a/docs/screenshots/migration-progress.svg b/docs/screenshots/migration-progress.svg deleted file mode 100644 index 6736a07..0000000 --- a/docs/screenshots/migration-progress.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Migration Progress - - - - - Placeholder screenshot - diff --git a/docs/screenshots/user-backups.png b/docs/screenshots/user-backups.png new file mode 100644 index 0000000..83cbf34 Binary files /dev/null and b/docs/screenshots/user-backups.png differ diff --git a/docs/screenshots/user-cpanel-migration.png b/docs/screenshots/user-cpanel-migration.png new file mode 100644 index 0000000..9b94d3d Binary files /dev/null and b/docs/screenshots/user-cpanel-migration.png differ diff --git a/docs/screenshots/user-dashboard.png b/docs/screenshots/user-dashboard.png new file mode 100644 index 0000000..ae2c801 Binary files /dev/null and b/docs/screenshots/user-dashboard.png differ diff --git a/docs/screenshots/user-dashboard.svg b/docs/screenshots/user-dashboard.svg deleted file mode 100644 index 4fe5a76..0000000 --- a/docs/screenshots/user-dashboard.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - User Dashboard - Placeholder screenshot - diff --git a/docs/screenshots/user-domains.png b/docs/screenshots/user-domains.png new file mode 100644 index 0000000..231babe Binary files /dev/null and b/docs/screenshots/user-domains.png differ diff --git a/docs/screenshots/user-domains.svg b/docs/screenshots/user-domains.svg deleted file mode 100644 index 229131f..0000000 --- a/docs/screenshots/user-domains.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Domain Management - - - Placeholder screenshot - diff --git a/tests/Unit/ReadmeScreenshotsTest.php b/tests/Unit/ReadmeScreenshotsTest.php new file mode 100644 index 0000000..2e221ed --- /dev/null +++ b/tests/Unit/ReadmeScreenshotsTest.php @@ -0,0 +1,31 @@ +assertNotFalse($content); + $this->assertStringContainsString('docs/screenshots/admin-dashboard.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-server-status.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-server-settings.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-security.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-users.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-ssl-manager.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-dns-zones.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-backups.png', $content); + $this->assertStringContainsString('docs/screenshots/admin-services.png', $content); + $this->assertStringContainsString('docs/screenshots/user-dashboard.png', $content); + $this->assertStringContainsString('docs/screenshots/user-domains.png', $content); + $this->assertStringContainsString('docs/screenshots/user-backups.png', $content); + $this->assertStringContainsString('docs/screenshots/user-cpanel-migration.png', $content); + } +} diff --git a/tests/take-screenshots.cjs b/tests/take-screenshots.cjs index 38ac6cb..9d93728 100644 --- a/tests/take-screenshots.cjs +++ b/tests/take-screenshots.cjs @@ -1,10 +1,10 @@ #!/usr/bin/env node /** - * Jabali Admin Panel Screenshot Script + * Jabali Panel Screenshot Script * - * Takes screenshots of admin panel pages for documentation. + * Takes screenshots of admin and user panels for documentation. * - * Usage: node tests/take-screenshots.js [--output-dir=/path/to/dir] + * Usage: node tests/take-screenshots.cjs [--output-dir=/path/to/dir] * * Requires: puppeteer (npm install puppeteer) */ @@ -12,20 +12,36 @@ const puppeteer = require('puppeteer'); const path = require('path'); -// Configuration -const CONFIG = { - baseUrl: 'https://mx.jabali-panel.com', - adminPath: '/jabali-admin', - credentials: { - email: 'admin@mx.jabali-panel.com', - password: 'PycpS1dUuLvxMMQs' - }, - viewport: { width: 1400, height: 900 }, - outputDir: process.argv.find(a => a.startsWith('--output-dir='))?.split('=')[1] || '/tmp' +const args = process.argv.slice(2); +const getArg = (key, fallback) => { + const arg = args.find((item) => item.startsWith(`--${key}=`)); + return arg ? arg.split('=').slice(1).join('=') : fallback; }; -// Pages to screenshot -const PAGES = [ +const hasFlag = (flag) => args.includes(`--${flag}`); +let browser; + +// Configuration +const CONFIG = { + baseUrl: getArg('base-url', 'https://mx.jabali-panel.com'), + adminPath: getArg('admin-path', '/jabali-admin'), + userPath: getArg('user-path', '/jabali-panel'), + admin: { + email: getArg('admin-email', 'admin@mx.jabali-panel.com'), + password: getArg('admin-password', 'PycpS1dUuLvxMMQs') + }, + user: { + email: getArg('user-email', 'user@jabali-panel.com'), + password: getArg('user-password', 'PycpS1dUuLvxMMQs') + }, + viewport: { width: 1400, height: 900 }, + outputDir: getArg('output-dir', '/tmp'), + skipAdmin: hasFlag('skip-admin'), + skipUser: hasFlag('skip-user') +}; + +// Admin pages to screenshot +const ADMIN_PAGES = [ { name: 'dashboard', path: '', description: 'Admin Dashboard' }, { name: 'server-status', path: '/server-status', description: 'Server Status' }, { name: 'server-settings', path: '/server-settings', description: 'Server Settings' }, @@ -37,39 +53,40 @@ const PAGES = [ { name: 'services', path: '/services', description: 'Services' }, ]; -async function takeScreenshots() { - console.log('Starting Jabali Admin Screenshot Script...\n'); +// User pages to screenshot +const USER_PAGES = [ + { name: 'dashboard', path: '', description: 'User Dashboard' }, + { name: 'domains', path: '/domains', description: 'Domain Management' }, + { name: 'backups', path: '/backups', description: 'Backups' }, + { name: 'cpanel-migration', path: '/cpanel-migration', description: 'cPanel Migration' } +]; - const browser = await puppeteer.launch({ - headless: 'new', - args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'] - }); +const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); - const page = await browser.newPage(); +async function capturePanel({ panelName, basePath, credentials, pages, outputPrefix }) { + const context = await browser.createBrowserContext(); + const page = await context.newPage(); await page.setViewport(CONFIG.viewport); try { - // Login - console.log('Logging in to admin panel...'); - await page.goto(`${CONFIG.baseUrl}${CONFIG.adminPath}/login`, { waitUntil: 'networkidle0' }); - await new Promise(r => setTimeout(r, 2000)); + console.log(`Logging in to ${panelName} panel...`); + await page.goto(`${CONFIG.baseUrl}${basePath}/login`, { waitUntil: 'networkidle0' }); + await wait(1500); - await page.type('input[type="email"]', CONFIG.credentials.email); - await page.type('input[type="password"]', CONFIG.credentials.password); + await page.type('input[type="email"]', credentials.email); + await page.type('input[type="password"]', credentials.password); await page.click('button[type="submit"]'); - await new Promise(r => setTimeout(r, 5000)); + await wait(4000); - // Check if login succeeded const currentUrl = page.url(); if (currentUrl.includes('/login')) { - throw new Error('Login failed - still on login page'); + throw new Error(`${panelName} login failed - still on login page`); } - console.log('Login successful!\n'); + console.log(`${panelName} login successful!\n`); - // Take screenshots - for (const pageInfo of PAGES) { - const url = `${CONFIG.baseUrl}${CONFIG.adminPath}${pageInfo.path}`; - const filename = `admin-${pageInfo.name}.png`; + for (const pageInfo of pages) { + const url = `${CONFIG.baseUrl}${basePath}${pageInfo.path}`; + const filename = `${outputPrefix}-${pageInfo.name}.png`; const filepath = path.join(CONFIG.outputDir, filename); console.log(`Taking screenshot: ${pageInfo.description}`); @@ -77,17 +94,51 @@ async function takeScreenshots() { try { await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 }); - await new Promise(r => setTimeout(r, 3000)); + await wait(3000); await page.screenshot({ path: filepath, fullPage: true }); console.log(` Saved: ${filepath}\n`); } catch (err) { console.log(` Error: ${err.message}\n`); } } + } catch (err) { + console.error(`${panelName} screenshots failed:`, err.message); + } finally { + await context.close(); + } +} - console.log('All screenshots completed!'); +async function takeScreenshots() { + console.log('Starting Jabali Panel Screenshot Script...\n'); + + browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'] + }); + + try { + if (!CONFIG.skipAdmin) { + await capturePanel({ + panelName: 'Admin', + basePath: CONFIG.adminPath, + credentials: CONFIG.admin, + pages: ADMIN_PAGES, + outputPrefix: 'admin' + }); + } + + if (!CONFIG.skipUser) { + await capturePanel({ + panelName: 'User', + basePath: CONFIG.userPath, + credentials: CONFIG.user, + pages: USER_PAGES, + outputPrefix: 'user' + }); + } + + console.log('Screenshot capture completed!'); console.log(`Output directory: ${CONFIG.outputDir}`); - } catch (err) { console.error('Error:', err.message); process.exit(1);