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 Settings: 
- Security Center: 
+- Users: 
+- SSL Manager: 
+- DNS Zones: 
+- Backups: 
+- Services: 
-User panel and flows (placeholder screenshots; replace with real captures):
+User panel and flows:
-- User Dashboard: 
-- Domain Management: 
-- Migration Progress: 
-- Backups: 
+- User Dashboard: 
+- Domain Management: 
+- Backups: 
+- cPanel Migration: 
-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 @@
-
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 @@
-
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 @@
-
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 @@
-
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);