- Add interactive modal popup for announcement 'Read More' functionality - Fix nonce conflict by creating separate hvac_announcements_ajax object - Implement secure AJAX handler with rate limiting and permission checks - Add comprehensive modal CSS with smooth animations and responsive design - Include accessibility features (ARIA, keyboard navigation, screen reader support) - Create detailed documentation in docs/ANNOUNCEMENT-MODAL-SYSTEM.md - Update API-REFERENCE.md with new modal endpoints and security details - Add automated Playwright E2E testing for modal functionality - All modal interactions working: click to open, X to close, ESC to close, outside click - Production-ready with full error handling and content sanitization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			87 lines
		
	
	
		
			No EOL
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			No EOL
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Test script to verify announcement pages are created properly
 | |
|  */
 | |
| 
 | |
| const { chromium } = require('playwright');
 | |
| 
 | |
| async function testCreateAnnouncementPages() {
 | |
|     const browser = await chromium.launch({ headless: false });
 | |
|     const context = await browser.newContext();
 | |
|     const page = await context.newPage();
 | |
| 
 | |
|     try {
 | |
|         console.log('🚀 Testing Announcement Pages Creation...');
 | |
|         
 | |
|         // Navigate to login page  
 | |
|         console.log('1. Navigating to login page...');
 | |
|         await page.goto('https://upskill-staging.measurequick.com/training-login/');
 | |
|         await page.waitForTimeout(2000);
 | |
|         
 | |
|         // Login as test master trainer
 | |
|         console.log('2. Logging in as master trainer...');
 | |
|         await page.fill('[name="log"]', 'test_master');
 | |
|         await page.fill('[name="pwd"]', 'TestMaster123!');
 | |
|         await page.click('[type="submit"]');
 | |
|         await page.waitForTimeout(3000);
 | |
|         
 | |
|         // Test Master Trainer Announcements page
 | |
|         console.log('3. Testing master trainer announcements page...');
 | |
|         await page.goto('https://upskill-staging.measurequick.com/master-trainer/announcements/');
 | |
|         await page.waitForTimeout(2000);
 | |
|         
 | |
|         const announcementsTitle = await page.textContent('h1').catch(() => null);
 | |
|         console.log('Announcements page title:', announcementsTitle);
 | |
|         
 | |
|         if (page.url().includes('404') || announcementsTitle?.includes('not found')) {
 | |
|             console.log('❌ Master announcements page does not exist');
 | |
|         } else {
 | |
|             console.log('✅ Master announcements page exists');
 | |
|         }
 | |
|         
 | |
|         // Test Trainer Resources page
 | |
|         console.log('4. Testing trainer resources page...');
 | |
|         await page.goto('https://upskill-staging.measurequick.com/trainer/resources/');
 | |
|         await page.waitForTimeout(2000);
 | |
|         
 | |
|         const resourcesTitle = await page.textContent('h1').catch(() => null);
 | |
|         console.log('Resources page title:', resourcesTitle);
 | |
|         
 | |
|         if (page.url().includes('404') || resourcesTitle?.includes('not found')) {
 | |
|             console.log('❌ Trainer resources page does not exist');
 | |
|         } else {
 | |
|             console.log('✅ Trainer resources page exists');
 | |
|         }
 | |
|         
 | |
|         // Test WordPress admin pages list
 | |
|         console.log('5. Checking WordPress admin pages list...');
 | |
|         await page.goto('https://upskill-staging.measurequick.com/wp-admin/edit.php?post_type=page');
 | |
|         await page.waitForTimeout(3000);
 | |
|         
 | |
|         // Search for announcement pages
 | |
|         const searchBox = await page.$('#post-search-input');
 | |
|         if (searchBox) {
 | |
|             await searchBox.fill('announcements');
 | |
|             await page.click('#search-submit');
 | |
|             await page.waitForTimeout(2000);
 | |
|             
 | |
|             const searchResults = await page.$$('.row-title');
 | |
|             console.log('Found announcement pages:', searchResults.length);
 | |
|             
 | |
|             for (let i = 0; i < searchResults.length; i++) {
 | |
|                 const title = await searchResults[i].textContent();
 | |
|                 console.log(`- Page ${i+1}: ${title}`);
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         console.log('🎉 Test completed!');
 | |
|         
 | |
|     } catch (error) {
 | |
|         console.error('❌ Test failed:', error.message);
 | |
|         console.error(error.stack);
 | |
|     } finally {
 | |
|         await browser.close();
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Run the test
 | |
| testCreateAnnouncementPages().catch(console.error); |