diff --git a/README.md b/README.md index f7db9a7..18ec3c7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A modern web hosting control panel for WordPress and general PHP hosting. Built with Laravel 12, Filament v5, Livewire 4, and Tailwind CSS v4. -Version: 0.9-rc (initial release) +Version: 0.9-rc1 (release candidate) This is a release candidate. Expect rapid iteration and breaking changes until 1.0. diff --git a/VERSION b/VERSION index 0d7ea3b..5661e51 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -VERSION=0.9-rc +VERSION=0.9-rc1 diff --git a/docs/screenshots/admin-backups.png b/docs/screenshots/admin-backups.png index 91fef78..3b7f3d4 100644 Binary files a/docs/screenshots/admin-backups.png and b/docs/screenshots/admin-backups.png differ diff --git a/docs/screenshots/admin-dashboard.png b/docs/screenshots/admin-dashboard.png index 6c32ba1..1adbf5a 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 index 2f103ac..925de19 100644 Binary files a/docs/screenshots/admin-dns-zones.png and b/docs/screenshots/admin-dns-zones.png differ diff --git a/docs/screenshots/admin-security.png b/docs/screenshots/admin-security.png index c639bba..a46bea9 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 66c173f..eab7433 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 9262736..a4e2c3a 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 index 0d014ec..2ed2459 100644 Binary files a/docs/screenshots/admin-services.png and b/docs/screenshots/admin-services.png differ diff --git a/docs/screenshots/admin-ssl-manager.png b/docs/screenshots/admin-ssl-manager.png index 44e8696..789a9e7 100644 Binary files a/docs/screenshots/admin-ssl-manager.png and b/docs/screenshots/admin-ssl-manager.png differ diff --git a/docs/screenshots/admin-users.png b/docs/screenshots/admin-users.png index 845743d..e4710a7 100644 Binary files a/docs/screenshots/admin-users.png and b/docs/screenshots/admin-users.png differ diff --git a/docs/screenshots/user-backups.png b/docs/screenshots/user-backups.png index 83cbf34..14e3e7a 100644 Binary files a/docs/screenshots/user-backups.png and b/docs/screenshots/user-backups.png differ diff --git a/docs/screenshots/user-cpanel-migration.png b/docs/screenshots/user-cpanel-migration.png index 9b94d3d..e19ef01 100644 Binary files a/docs/screenshots/user-cpanel-migration.png and b/docs/screenshots/user-cpanel-migration.png differ diff --git a/docs/screenshots/user-dashboard.png b/docs/screenshots/user-dashboard.png index ae2c801..f223261 100644 Binary files a/docs/screenshots/user-dashboard.png and b/docs/screenshots/user-dashboard.png differ diff --git a/docs/screenshots/user-domains.png b/docs/screenshots/user-domains.png index 231babe..e040c55 100644 Binary files a/docs/screenshots/user-domains.png and b/docs/screenshots/user-domains.png differ diff --git a/tests/Unit/VersionFileTest.php b/tests/Unit/VersionFileTest.php index bcaef42..9595f75 100644 --- a/tests/Unit/VersionFileTest.php +++ b/tests/Unit/VersionFileTest.php @@ -14,7 +14,7 @@ class VersionFileTest extends TestCase $content = file_get_contents($versionPath); $this->assertNotFalse($content); - $this->assertStringContainsString('VERSION=0.9-rc', $content); + $this->assertStringContainsString('VERSION=0.9-rc1', $content); $this->assertStringNotContainsString('BUILD=', $content); } } diff --git a/tests/take-screenshots.cjs b/tests/take-screenshots.cjs index 9d93728..66f3672 100644 --- a/tests/take-screenshots.cjs +++ b/tests/take-screenshots.cjs @@ -22,6 +22,11 @@ const hasFlag = (flag) => args.includes(`--${flag}`); let browser; // Configuration +const viewportWidth = Number(getArg('viewport-width', '1400')); +const viewportHeight = Number(getArg('viewport-height', '800')); +const fullPage = hasFlag('full-page'); +const impersonateUserId = getArg('impersonate-user-id', null); + const CONFIG = { baseUrl: getArg('base-url', 'https://mx.jabali-panel.com'), adminPath: getArg('admin-path', '/jabali-admin'), @@ -34,10 +39,11 @@ const CONFIG = { email: getArg('user-email', 'user@jabali-panel.com'), password: getArg('user-password', 'PycpS1dUuLvxMMQs') }, - viewport: { width: 1400, height: 900 }, + viewport: { width: viewportWidth, height: viewportHeight }, outputDir: getArg('output-dir', '/tmp'), skipAdmin: hasFlag('skip-admin'), - skipUser: hasFlag('skip-user') + skipUser: hasFlag('skip-user'), + impersonateUserId }; // Admin pages to screenshot @@ -63,26 +69,53 @@ const USER_PAGES = [ const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +async function loginPanel(page, panelName, basePath, credentials) { + 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"]', credentials.email); + await page.type('input[type="password"]', credentials.password); + await page.click('button[type="submit"]'); + await wait(4000); + + const currentUrl = page.url(); + if (currentUrl.includes('/login')) { + throw new Error(`${panelName} login failed - still on login page`); + } + console.log(`${panelName} login successful!\n`); +} + +async function loginUserViaImpersonation(page) { + if (!CONFIG.impersonateUserId) { + throw new Error('Missing --impersonate-user-id for user screenshots'); + } + + await loginPanel(page, 'Admin', CONFIG.adminPath, CONFIG.admin); + + const impersonateUrl = `${CONFIG.baseUrl}/impersonate/start/${CONFIG.impersonateUserId}`; + console.log(`Impersonating user via: ${impersonateUrl}`); + await page.goto(impersonateUrl, { waitUntil: 'networkidle0' }); + await wait(2000); + + const currentUrl = page.url(); + if (currentUrl.includes('/login')) { + throw new Error('Impersonation failed - still on login page'); + } + console.log('User impersonation successful!\n'); +} + async function capturePanel({ panelName, basePath, credentials, pages, outputPrefix }) { const context = await browser.createBrowserContext(); const page = await context.newPage(); await page.setViewport(CONFIG.viewport); try { - 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"]', credentials.email); - await page.type('input[type="password"]', credentials.password); - await page.click('button[type="submit"]'); - await wait(4000); - - const currentUrl = page.url(); - if (currentUrl.includes('/login')) { - throw new Error(`${panelName} login failed - still on login page`); + if (panelName === 'User' && CONFIG.impersonateUserId) { + await loginUserViaImpersonation(page); + } else { + await loginPanel(page, panelName, basePath, credentials); } - console.log(`${panelName} login successful!\n`); for (const pageInfo of pages) { const url = `${CONFIG.baseUrl}${basePath}${pageInfo.path}`; @@ -95,7 +128,7 @@ async function capturePanel({ panelName, basePath, credentials, pages, outputPre try { await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 }); await wait(3000); - await page.screenshot({ path: filepath, fullPage: true }); + await page.screenshot({ path: filepath, fullPage }); console.log(` Saved: ${filepath}\n`); } catch (err) { console.log(` Error: ${err.message}\n`);