Implements the Email Attendees feature which allows trainers to: - Email event attendees directly from the Event Summary page - Filter attendees by ticket type - Use a rich text editor to compose messages - Include CC recipients - Send personalized emails to selected attendees Includes unit tests, integration tests, and E2E tests to verify functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			89 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Page } from '@playwright/test';
 | |
| import { DashboardPage } from '../pages/DashboardPage';
 | |
| import { CreateEventPage } from '../pages/CreateEventPage';
 | |
| 
 | |
| interface EventData {
 | |
|   title: string;
 | |
|   description?: string;
 | |
|   startDate?: string;
 | |
|   endDate?: string;
 | |
|   startTime?: string;
 | |
|   endTime?: string;
 | |
|   ticketType?: string;
 | |
|   price?: string;
 | |
|   venue?: string;
 | |
|   organizer?: string;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Helper function to create a test event
 | |
|  * @param page Playwright Page object
 | |
|  * @param eventData Event data to create
 | |
|  * @returns Event ID of the created event
 | |
|  */
 | |
| export async function createTestEvent(page: Page, eventData: EventData): Promise<string> {
 | |
|   // Navigate to dashboard
 | |
|   const dashboardPage = new DashboardPage(page);
 | |
|   await dashboardPage.navigate();
 | |
|   
 | |
|   // Click create event button
 | |
|   await dashboardPage.clickCreateEvent();
 | |
|   
 | |
|   // Fill event form
 | |
|   const createEventPage = new CreateEventPage(page);
 | |
|   await createEventPage.fillEventTitle(eventData.title);
 | |
|   
 | |
|   if (eventData.description) {
 | |
|     await createEventPage.fillEventDescription(eventData.description);
 | |
|   }
 | |
|   
 | |
|   // Set dates and times if provided
 | |
|   if (eventData.startDate) {
 | |
|     await createEventPage.setStartDate(eventData.startDate);
 | |
|   }
 | |
|   
 | |
|   if (eventData.endDate) {
 | |
|     await createEventPage.setEndDate(eventData.endDate);
 | |
|   }
 | |
|   
 | |
|   if (eventData.startTime) {
 | |
|     await createEventPage.setStartTime(eventData.startTime);
 | |
|   }
 | |
|   
 | |
|   if (eventData.endTime) {
 | |
|     await createEventPage.setEndTime(eventData.endTime);
 | |
|   }
 | |
|   
 | |
|   // Add ticket if price is provided
 | |
|   if (eventData.ticketType && eventData.price) {
 | |
|     await createEventPage.addTicket(eventData.ticketType, eventData.price);
 | |
|   }
 | |
|   
 | |
|   // Set venue if provided
 | |
|   if (eventData.venue) {
 | |
|     await createEventPage.setVenue(eventData.venue);
 | |
|   }
 | |
|   
 | |
|   // Set organizer if provided
 | |
|   if (eventData.organizer) {
 | |
|     await createEventPage.setOrganizer(eventData.organizer);
 | |
|   }
 | |
|   
 | |
|   // Submit the form
 | |
|   const eventId = await createEventPage.submitForm();
 | |
|   
 | |
|   return eventId;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Helper function to get event ID from URL
 | |
|  * @param url Event URL
 | |
|  * @returns Event ID extracted from URL
 | |
|  */
 | |
| export function extractEventId(url: string): string {
 | |
|   const match = url.match(/event_id=(\d+)/);
 | |
|   if (match && match[1]) {
 | |
|     return match[1];
 | |
|   }
 | |
|   return '';
 | |
| } |