@flusys/ng-email 1.1.0-beta → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-email.mjs","sources":["../../../projects/ng-email/enums/email-provider.enum.ts","../../../projects/ng-email/enums/email-block-type.enum.ts","../../../projects/ng-email/interfaces/email-schema.interface.ts","../../../projects/ng-email/services/email-config-api.service.ts","../../../projects/ng-email/services/email-template-api.service.ts","../../../projects/ng-email/services/email-send.service.ts","../../../projects/ng-email/services/email-builder-state.service.ts","../../../projects/ng-email/routes/email.routes.ts","../../../projects/ng-email/pages/email-container/email-container.component.ts","../../../projects/ng-email/public-api.ts","../../../projects/ng-email/flusys-ng-email.ts"],"sourcesContent":["/**\n * Supported email provider types\n */\nexport enum EmailProviderEnum {\n SMTP = 'smtp',\n SENDGRID = 'sendgrid',\n MAILGUN = 'mailgun',\n}\n","/**\n * Email content block types\n */\nexport enum EmailBlockType {\n TEXT = 'text',\n IMAGE = 'image',\n BUTTON = 'button',\n DIVIDER = 'divider',\n HTML = 'html',\n}\n","import { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Email template variable definition\n */\nexport interface IEmailTemplateVariable {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date';\n required?: boolean;\n defaultValue?: string;\n description?: string;\n}\n\n/**\n * Email section style\n */\nexport interface IEmailSectionStyle {\n backgroundColor?: string;\n padding?: string;\n maxWidth?: string;\n}\n\n/**\n * Email block style\n */\nexport interface IEmailBlockStyle {\n textAlign?: 'left' | 'center' | 'right';\n padding?: string;\n margin?: string;\n backgroundColor?: string;\n}\n\n/**\n * Text block content\n */\nexport interface ITextBlockContent {\n text: string;\n html?: string;\n}\n\n/**\n * Image block content\n */\nexport interface IImageBlockContent {\n src: string;\n alt?: string;\n link?: string;\n width?: string;\n height?: string;\n}\n\n/**\n * Button block content\n */\nexport interface IButtonBlockContent {\n text: string;\n link: string;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: string;\n}\n\n/**\n * Divider block content\n */\nexport interface IDividerBlockContent {\n height?: string;\n color?: string;\n style?: 'solid' | 'dashed' | 'dotted';\n}\n\n/**\n * HTML block content\n */\nexport interface IHtmlBlockContent {\n html: string;\n}\n\n/**\n * Email content block\n */\nexport interface IEmailBlock {\n id: string;\n type: EmailBlockType;\n order: number;\n content: ITextBlockContent | IImageBlockContent | IButtonBlockContent | IDividerBlockContent | IHtmlBlockContent;\n style?: IEmailBlockStyle;\n}\n\n/**\n * Email section (header, body, footer)\n */\nexport interface IEmailSection {\n id: string;\n type: 'header' | 'body' | 'footer';\n name: string;\n blocks: IEmailBlock[];\n order: number;\n style?: IEmailSectionStyle;\n}\n\n/**\n * Email schema settings\n */\nexport interface IEmailSettings {\n maxWidth?: string;\n backgroundColor?: string;\n fontFamily?: string;\n baseTextColor?: string;\n}\n\n/**\n * Full email schema structure\n */\nexport interface IEmailSchema {\n id: string;\n version: string;\n name: string;\n subject: string;\n preheader?: string;\n sections: IEmailSection[];\n variables?: IEmailTemplateVariable[];\n settings?: IEmailSettings;\n}\n\n/**\n * Default email settings\n */\nexport const DEFAULT_EMAIL_SETTINGS: IEmailSettings = {\n maxWidth: '600px',\n backgroundColor: '#f5f5f5',\n fontFamily: 'Arial, sans-serif',\n baseTextColor: '#333333',\n};\n\n/**\n * Create a new email schema\n */\nexport function createEmailSchema(partial: Partial<IEmailSchema> = {}): IEmailSchema {\n return {\n id: crypto.randomUUID(),\n version: '1.0.0',\n name: partial.name || 'Untitled Template',\n subject: partial.subject || '',\n sections: partial.sections || [\n { id: crypto.randomUUID(), type: 'header', name: 'Header', blocks: [], order: 0 },\n { id: crypto.randomUUID(), type: 'body', name: 'Body', blocks: [], order: 1 },\n { id: crypto.randomUUID(), type: 'footer', name: 'Footer', blocks: [], order: 2 },\n ],\n settings: { ...DEFAULT_EMAIL_SETTINGS, ...partial.settings },\n variables: partial.variables || [],\n ...partial,\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { IEmailConfig, IUpdateEmailConfigDto } from '../interfaces/email-config.interface';\nimport { Observable } from 'rxjs';\nimport { ITestSendResult } from '../interfaces/email-send.interface';\n\n/**\n * Email Config API Service\n * Handles email configuration CRUD operations\n * Endpoint: POST /email/email-config/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailConfigApiService extends ApiResourceService<\n IUpdateEmailConfigDto,\n IEmailConfig\n> {\n private readonly apiBaseUrl: string;\n\n constructor() {\n const http = inject(HttpClient);\n super('email/email-config', http);\n this.apiBaseUrl = inject(APP_CONFIG).apiBaseUrl;\n }\n\n /**\n * Send test email to verify configuration\n */\n sendTest(configId: string, recipient: string): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.apiBaseUrl}/email/send/test`,\n { emailConfigId: configId, recipient },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { IEmailTemplate, IUpdateEmailTemplateDto } from '../interfaces/email-template.interface';\nimport { Observable } from 'rxjs';\n\n/**\n * Email Template API Service\n * Handles email template CRUD operations\n * Endpoint: POST /email/email-template/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailTemplateApiService extends ApiResourceService<\n IUpdateEmailTemplateDto,\n IEmailTemplate\n> {\n constructor() {\n const http = inject(HttpClient);\n super('email/email-template', http);\n }\n\n /**\n * Get template by slug (POST-only RPC pattern)\n */\n getBySlug(slug: string): Observable<ISingleResponse<IEmailTemplate | null>> {\n return this.http.post<ISingleResponse<IEmailTemplate | null>>(\n `${this.baseUrl}/get-by-slug`,\n { slug },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ISendEmailDto,\n ISendTemplateEmailDto,\n ITestSendDto,\n ITestSendResult,\n} from '../interfaces/email-send.interface';\n\n/**\n * Email Send Service\n * Handles sending emails directly or using templates\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailSendService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(APP_CONFIG).apiBaseUrl;\n\n /**\n * Send email directly (without template)\n */\n sendDirect(dto: ISendEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/direct`,\n dto,\n );\n }\n\n /**\n * Send email using template\n */\n sendTemplate(dto: ISendTemplateEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/template`,\n dto,\n );\n }\n\n /**\n * Send test email (for testing configuration)\n */\n sendTest(dto: ITestSendDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/test`,\n { emailConfigId: dto.configId, recipient: dto.recipient },\n );\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n IEmailSchema,\n IEmailSection,\n IEmailBlock,\n IEmailSettings,\n createEmailSchema,\n DEFAULT_EMAIL_SETTINGS,\n} from '../interfaces/email-schema.interface';\nimport { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Manages the email builder UI state including schema, selection, and UI toggles.\n * Should be provided at the EmailBuilder component level (not root).\n */\n@Injectable()\nexport class EmailBuilderStateService {\n // Schema state\n private readonly _schema = signal<IEmailSchema>(createEmailSchema());\n private readonly _isDirty = signal(false);\n\n // Selection state\n private readonly _selectedSectionId = signal<string | null>(null);\n private readonly _selectedBlockId = signal<string | null>(null);\n\n // View mode\n private readonly _viewMode = signal<'visual' | 'html'>('visual');\n\n // Public readonly signals\n readonly schema = this._schema.asReadonly();\n readonly isDirty = this._isDirty.asReadonly();\n readonly selectedSectionId = this._selectedSectionId.asReadonly();\n readonly selectedBlockId = this._selectedBlockId.asReadonly();\n readonly viewMode = this._viewMode.asReadonly();\n\n // Computed signals\n readonly sections = computed(() => this._schema().sections);\n readonly templateName = computed(() => this._schema().name);\n readonly subject = computed(() => this._schema().subject);\n readonly settings = computed(() => this._schema().settings ?? DEFAULT_EMAIL_SETTINGS);\n readonly variables = computed(() => this._schema().variables ?? []);\n\n readonly headerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'header') ?? null;\n });\n\n readonly bodySection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'body') ?? null;\n });\n\n readonly footerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'footer') ?? null;\n });\n\n readonly selectedSection = computed((): IEmailSection | null => {\n const sectionId = this._selectedSectionId();\n if (!sectionId) return null;\n return this.sections().find((s) => s.id === sectionId) ?? null;\n });\n\n readonly selectedBlock = computed((): IEmailBlock | null => {\n const blockId = this._selectedBlockId();\n if (!blockId) return null;\n for (const section of this.sections()) {\n const block = section.blocks.find((b) => b.id === blockId);\n if (block) return block;\n }\n return null;\n });\n\n readonly allBlocks = computed((): IEmailBlock[] => {\n return this.sections().flatMap((s) => s.blocks);\n });\n\n // =========================================\n // Schema Operations\n // =========================================\n\n /**\n * Load an existing schema into the builder\n */\n loadSchema(schema: IEmailSchema): void {\n const cloned = structuredClone(schema);\n this._schema.set(cloned);\n this._isDirty.set(false);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Create a new empty schema\n */\n createNewSchema(name: string = 'Untitled Template'): void {\n this._schema.set(createEmailSchema({ name }));\n this._isDirty.set(true);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Update template metadata\n */\n updateSchemaMeta(\n updates: Partial<Pick<IEmailSchema, 'name' | 'subject' | 'preheader' | 'settings' | 'variables'>>,\n ): void {\n this._schema.update((schema) => ({\n ...schema,\n ...updates,\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Mark schema as saved (clears dirty flag)\n */\n markAsSaved(): void {\n this._isDirty.set(false);\n }\n\n /**\n * Set view mode (visual or html)\n */\n setViewMode(mode: 'visual' | 'html'): void {\n this._viewMode.set(mode);\n }\n\n // =========================================\n // Section Operations\n // =========================================\n\n /**\n * Update section properties\n */\n updateSection(sectionId: string, updates: Partial<IEmailSection>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) =>\n s.id === sectionId ? { ...s, ...updates } : s,\n ),\n }));\n this._isDirty.set(true);\n }\n\n // =========================================\n // Block Operations\n // =========================================\n\n /**\n * Add a new block to a section\n */\n addBlock(\n sectionId: string,\n blockType: EmailBlockType,\n block?: Partial<IEmailBlock>,\n ): string | null {\n const newBlock: IEmailBlock = {\n id: crypto.randomUUID(),\n type: blockType,\n order: 0,\n content: this.getDefaultContent(blockType),\n ...block,\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks, newBlock];\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n /**\n * Update block properties\n */\n updateBlock(sectionId: string, blockId: string, updates: Partial<IEmailBlock>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n return {\n ...s,\n blocks: s.blocks.map((b) => (b.id === blockId ? { ...b, ...updates } : b)),\n };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Delete a block from a section\n */\n deleteBlock(sectionId: string, blockId: string): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = s.blocks.filter((b) => b.id !== blockId);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n\n // Clear selection if deleted block was selected\n if (this._selectedBlockId() === blockId) {\n this._selectedBlockId.set(null);\n }\n }\n\n /**\n * Reorder blocks within a section\n */\n reorderBlocks(sectionId: string, fromIndex: number, toIndex: number): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks];\n const [removed] = blocks.splice(fromIndex, 1);\n blocks.splice(toIndex, 0, removed);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Duplicate a block\n */\n duplicateBlock(sectionId: string, blockId: string): string | null {\n const section = this.sections().find((s) => s.id === sectionId);\n const block = section?.blocks.find((b) => b.id === blockId);\n if (!block) return null;\n\n const newBlock: IEmailBlock = {\n ...structuredClone(block),\n id: crypto.randomUUID(),\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blockIndex = s.blocks.findIndex((b) => b.id === blockId);\n const blocks = [...s.blocks];\n blocks.splice(blockIndex + 1, 0, newBlock);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n // =========================================\n // Selection Operations\n // =========================================\n\n /**\n * Select a section\n */\n selectSection(sectionId: string | null): void {\n this._selectedSectionId.set(sectionId);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Select a block\n */\n selectBlock(blockId: string | null): void {\n if (blockId) {\n // Find the section containing this block\n for (const section of this.sections()) {\n if (section.blocks.some((b) => b.id === blockId)) {\n this._selectedSectionId.set(section.id);\n break;\n }\n }\n }\n this._selectedBlockId.set(blockId);\n }\n\n /**\n * Clear all selection\n */\n clearSelection(): void {\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n // =========================================\n // Helper Methods\n // =========================================\n\n /**\n * Get default content for a block type\n */\n private getDefaultContent(type: EmailBlockType): Record<string, any> {\n switch (type) {\n case EmailBlockType.TEXT:\n return { text: 'Enter your text here...', html: '<p>Enter your text here...</p>' };\n case EmailBlockType.IMAGE:\n return { src: '', alt: 'Image' };\n case EmailBlockType.BUTTON:\n return {\n text: 'Click Here',\n link: 'https://',\n backgroundColor: '#007bff',\n textColor: '#ffffff',\n borderRadius: '4px',\n };\n case EmailBlockType.DIVIDER:\n return { height: '1px', color: '#cccccc', style: 'solid' };\n case EmailBlockType.HTML:\n return { html: '<!-- Custom HTML -->' };\n default:\n return {};\n }\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Email module routes\n */\nexport const EMAIL_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/email-container/email-container.component').then(\n (m) => m.EmailContainerComponent,\n ),\n children: [\n // Templates\n {\n path: 'templates',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/template/template-list.component').then(\n (m) => m.TemplateListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n ],\n },\n // Configs\n {\n path: 'configs',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/config/email-config-list.component').then(\n (m) => m.EmailConfigListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n ],\n },\n // Default redirect\n {\n path: '',\n redirectTo: 'templates',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Email container component with tab navigation\n */\n@Component({\n selector: 'lib-email-container',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n template: `\n <div class=\"email-page p-4\">\n <div class=\"email-header mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Email</h1>\n <p class=\"text-gray-500 mt-1\">Manage email templates and provider configurations</p>\n </div>\n\n <div class=\"email-tabs flex gap-1 mb-4 border-b border-gray-200\">\n @for (tab of tabs; track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"active\"\n class=\"tab-link flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div class=\"email-content\">\n <router-outlet />\n </div>\n </div>\n `,\n styles: [\n `\n .tab-link {\n color: var(--text-color-secondary, #6b7280);\n text-decoration: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .tab-link.active {\n color: var(--primary-color, #3b82f6);\n border-bottom-color: var(--primary-color, #3b82f6);\n background-color: var(--surface-ground, #f9fafb);\n }\n .tab-link:hover:not(.active) {\n background-color: var(--surface-hover, #f3f4f6);\n }\n `,\n ],\n})\nexport class EmailContainerComponent {\n readonly tabs: ITab[] = [\n { id: 'templates', label: 'Templates', icon: 'pi pi-file', route: 'templates' },\n { id: 'configs', label: 'Configurations', icon: 'pi pi-cog', route: 'configs' },\n ];\n}\n","// =============================================================================\n// @flusys/ng-email - Email Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport { EmailConfigApiService } from './services/email-config-api.service';\nexport { EmailTemplateApiService } from './services/email-template-api.service';\nexport { EmailSendService } from './services/email-send.service';\nexport { EmailBuilderStateService } from './services/email-builder-state.service';\n\n// Routes\nexport { EMAIL_ROUTES } from './routes/email.routes';\n\n// Components\nexport { EmailContainerComponent } from './pages/email-container/email-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-email.mjs","sources":["../../../projects/ng-email/enums/email-provider.enum.ts","../../../projects/ng-email/enums/email-block-type.enum.ts","../../../projects/ng-email/interfaces/email-schema.interface.ts","../../../projects/ng-email/services/email-config-api.service.ts","../../../projects/ng-email/services/email-template-api.service.ts","../../../projects/ng-email/services/email-send.service.ts","../../../projects/ng-email/services/email-builder-state.service.ts","../../../projects/ng-email/routes/email.routes.ts","../../../projects/ng-email/pages/email-container/email-container.component.ts","../../../projects/ng-email/public-api.ts","../../../projects/ng-email/flusys-ng-email.ts"],"sourcesContent":["/**\n * Supported email provider types\n */\nexport enum EmailProviderEnum {\n SMTP = 'smtp',\n SENDGRID = 'sendgrid',\n MAILGUN = 'mailgun',\n}\n","/**\n * Email content block types\n */\nexport enum EmailBlockType {\n TEXT = 'text',\n IMAGE = 'image',\n BUTTON = 'button',\n DIVIDER = 'divider',\n HTML = 'html',\n}\n","import { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Email template variable types\n */\nexport type EmailVariableType = 'string' | 'number' | 'boolean' | 'date';\n\n/**\n * Email section types\n */\nexport type EmailSectionType = 'header' | 'body' | 'footer';\n\n/**\n * Email template variable definition\n */\nexport interface IEmailTemplateVariable {\n name: string;\n type: EmailVariableType;\n required?: boolean;\n defaultValue?: string;\n description?: string;\n}\n\n/**\n * Email section style\n */\nexport interface IEmailSectionStyle {\n backgroundColor?: string;\n padding?: string;\n maxWidth?: string;\n}\n\n/**\n * Email block style\n */\nexport interface IEmailBlockStyle {\n textAlign?: 'left' | 'center' | 'right';\n padding?: string;\n margin?: string;\n backgroundColor?: string;\n}\n\n/**\n * Text block content\n */\nexport interface ITextBlockContent {\n text: string;\n html?: string;\n}\n\n/**\n * Image block content\n */\nexport interface IImageBlockContent {\n src: string;\n alt?: string;\n link?: string;\n width?: string;\n height?: string;\n}\n\n/**\n * Button block content\n */\nexport interface IButtonBlockContent {\n text: string;\n link: string;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: string;\n}\n\n/**\n * Divider block content\n */\nexport interface IDividerBlockContent {\n height?: string;\n color?: string;\n style?: 'solid' | 'dashed' | 'dotted';\n}\n\n/**\n * HTML block content\n */\nexport interface IHtmlBlockContent {\n html: string;\n}\n\n/**\n * Block content union type\n */\nexport type EmailBlockContent =\n | ITextBlockContent\n | IImageBlockContent\n | IButtonBlockContent\n | IDividerBlockContent\n | IHtmlBlockContent;\n\n/**\n * Email content block\n */\nexport interface IEmailBlock {\n id: string;\n type: EmailBlockType;\n order: number;\n content: EmailBlockContent;\n style?: IEmailBlockStyle;\n}\n\n/**\n * Email section (header, body, footer)\n */\nexport interface IEmailSection {\n id: string;\n type: EmailSectionType;\n name: string;\n blocks: IEmailBlock[];\n order: number;\n style?: IEmailSectionStyle;\n}\n\n/**\n * Email schema settings\n */\nexport interface IEmailSettings {\n maxWidth?: string;\n backgroundColor?: string;\n fontFamily?: string;\n baseTextColor?: string;\n}\n\n/**\n * Full email schema structure\n */\nexport interface IEmailSchema {\n id: string;\n version: string;\n name: string;\n subject: string;\n preheader?: string;\n sections: IEmailSection[];\n variables?: IEmailTemplateVariable[];\n settings?: IEmailSettings;\n}\n\n/**\n * Default email settings\n */\nexport const DEFAULT_EMAIL_SETTINGS: IEmailSettings = {\n maxWidth: '600px',\n backgroundColor: '#f5f5f5',\n fontFamily: 'Arial, sans-serif',\n baseTextColor: '#333333',\n};\n\n/**\n * Create a new email schema with default sections\n */\nexport function createEmailSchema(partial: Partial<IEmailSchema> = {}): IEmailSchema {\n return {\n id: partial.id ?? crypto.randomUUID(),\n version: partial.version ?? '1.0.0',\n name: partial.name ?? 'Untitled Template',\n subject: partial.subject ?? '',\n preheader: partial.preheader,\n sections: partial.sections ?? createDefaultSections(),\n variables: partial.variables ?? [],\n settings: { ...DEFAULT_EMAIL_SETTINGS, ...partial.settings },\n };\n}\n\n/**\n * Create default email sections (header, body, footer)\n */\nfunction createDefaultSections(): IEmailSection[] {\n return [\n { id: crypto.randomUUID(), type: 'header', name: 'Header', blocks: [], order: 0 },\n { id: crypto.randomUUID(), type: 'body', name: 'Body', blocks: [], order: 1 },\n { id: crypto.randomUUID(), type: 'footer', name: 'Footer', blocks: [], order: 2 },\n ];\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateEmailConfigDto,\n IEmailConfig,\n IUpdateEmailConfigDto,\n} from '../interfaces/email-config.interface';\nimport { ITestSendResult } from '../interfaces/email-send.interface';\n\n/**\n * Email Config API Service\n * Handles email configuration CRUD operations\n * Endpoint: POST /email/email-config/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailConfigApiService extends ApiResourceService<\n ICreateEmailConfigDto | IUpdateEmailConfigDto,\n IEmailConfig\n> {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n\n constructor() {\n super('email-config', inject(HttpClient), 'email');\n }\n\n /**\n * Send test email to verify configuration\n */\n sendTest(configId: string, recipient: string): Observable<ISingleResponse<ITestSendResult>> {\n const emailBaseUrl = getServiceUrl(this.appConfig, 'email');\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${emailBaseUrl}/send/test`,\n { emailConfigId: configId, recipient },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { ICreateEmailTemplateDto, IEmailTemplate, IUpdateEmailTemplateDto } from '../interfaces/email-template.interface';\nimport { Observable } from 'rxjs';\n\n/**\n * Email Template API Service\n * Handles email template CRUD operations\n * Endpoint: POST /email/email-template/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailTemplateApiService extends ApiResourceService<\n ICreateEmailTemplateDto | IUpdateEmailTemplateDto,\n IEmailTemplate\n> {\n constructor() {\n super('email-template', inject(HttpClient), 'email');\n }\n\n /**\n * Get template by slug (POST-only RPC pattern)\n */\n getBySlug(slug: string): Observable<ISingleResponse<IEmailTemplate | null>> {\n return this.http.post<ISingleResponse<IEmailTemplate | null>>(\n `${this.baseUrl}/get-by-slug`,\n { slug },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ISendEmailDto,\n ISendTemplateEmailDto,\n ITestSendResult,\n} from '../interfaces/email-send.interface';\n\n/**\n * Email Send Service\n * Handles sending emails directly or using templates\n * Endpoint: POST /email/send/*\n *\n * Note: For testing configurations, use EmailConfigApiService.sendTest()\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailSendService {\n private readonly http = inject(HttpClient);\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n private readonly baseUrl = `${getServiceUrl(this.appConfig, 'email')}/send`;\n\n /**\n * Send email directly (without template)\n */\n sendDirect(dto: ISendEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/direct`,\n dto,\n );\n }\n\n /**\n * Send email using template\n */\n sendTemplate(dto: ISendTemplateEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/template`,\n dto,\n );\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n IEmailSchema,\n IEmailSection,\n IEmailBlock,\n EmailBlockContent,\n createEmailSchema,\n DEFAULT_EMAIL_SETTINGS,\n} from '../interfaces/email-schema.interface';\nimport { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Manages the email builder UI state including schema, selection, and UI toggles.\n * Should be provided at the EmailBuilder component level (not root).\n */\n@Injectable()\nexport class EmailBuilderStateService {\n // Schema state\n private readonly _schema = signal<IEmailSchema>(createEmailSchema());\n private readonly _isDirty = signal(false);\n\n // Selection state\n private readonly _selectedSectionId = signal<string | null>(null);\n private readonly _selectedBlockId = signal<string | null>(null);\n\n // View mode\n private readonly _viewMode = signal<'visual' | 'html'>('visual');\n\n // Public readonly signals\n readonly schema = this._schema.asReadonly();\n readonly isDirty = this._isDirty.asReadonly();\n readonly selectedSectionId = this._selectedSectionId.asReadonly();\n readonly selectedBlockId = this._selectedBlockId.asReadonly();\n readonly viewMode = this._viewMode.asReadonly();\n\n // Computed signals\n readonly sections = computed(() => this._schema().sections);\n readonly templateName = computed(() => this._schema().name);\n readonly subject = computed(() => this._schema().subject);\n readonly settings = computed(() => this._schema().settings ?? DEFAULT_EMAIL_SETTINGS);\n readonly variables = computed(() => this._schema().variables ?? []);\n\n readonly headerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'header') ?? null;\n });\n\n readonly bodySection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'body') ?? null;\n });\n\n readonly footerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'footer') ?? null;\n });\n\n readonly selectedSection = computed((): IEmailSection | null => {\n const sectionId = this._selectedSectionId();\n if (!sectionId) return null;\n return this.sections().find((s) => s.id === sectionId) ?? null;\n });\n\n readonly selectedBlock = computed((): IEmailBlock | null => {\n const blockId = this._selectedBlockId();\n if (!blockId) return null;\n for (const section of this.sections()) {\n const block = section.blocks.find((b) => b.id === blockId);\n if (block) return block;\n }\n return null;\n });\n\n readonly allBlocks = computed((): IEmailBlock[] => {\n return this.sections().flatMap((s) => s.blocks);\n });\n\n // =========================================\n // Schema Operations\n // =========================================\n\n /**\n * Load an existing schema into the builder\n */\n loadSchema(schema: IEmailSchema): void {\n const cloned = structuredClone(schema);\n this._schema.set(cloned);\n this._isDirty.set(false);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Create a new empty schema\n */\n createNewSchema(name: string = 'Untitled Template'): void {\n this._schema.set(createEmailSchema({ name }));\n this._isDirty.set(true);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Update template metadata\n */\n updateSchemaMeta(\n updates: Partial<Pick<IEmailSchema, 'name' | 'subject' | 'preheader' | 'settings' | 'variables'>>,\n ): void {\n this._schema.update((schema) => ({\n ...schema,\n ...updates,\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Mark schema as saved (clears dirty flag)\n */\n markAsSaved(): void {\n this._isDirty.set(false);\n }\n\n /**\n * Set view mode (visual or html)\n */\n setViewMode(mode: 'visual' | 'html'): void {\n this._viewMode.set(mode);\n }\n\n // =========================================\n // Section Operations\n // =========================================\n\n /**\n * Update section properties\n */\n updateSection(sectionId: string, updates: Partial<IEmailSection>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) =>\n s.id === sectionId ? { ...s, ...updates } : s,\n ),\n }));\n this._isDirty.set(true);\n }\n\n // =========================================\n // Block Operations\n // =========================================\n\n /**\n * Add a new block to a section\n */\n addBlock(\n sectionId: string,\n blockType: EmailBlockType,\n block?: Partial<IEmailBlock>,\n ): string | null {\n const newBlock: IEmailBlock = {\n id: crypto.randomUUID(),\n type: blockType,\n order: 0,\n content: this.getDefaultContent(blockType),\n ...block,\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks, newBlock];\n this.reindexBlocks(blocks);\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n /**\n * Update block properties\n */\n updateBlock(sectionId: string, blockId: string, updates: Partial<IEmailBlock>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n return {\n ...s,\n blocks: s.blocks.map((b) => (b.id === blockId ? { ...b, ...updates } : b)),\n };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Delete a block from a section\n */\n deleteBlock(sectionId: string, blockId: string): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = s.blocks.filter((b) => b.id !== blockId);\n this.reindexBlocks(blocks);\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n\n // Clear selection if deleted block was selected\n if (this._selectedBlockId() === blockId) {\n this._selectedBlockId.set(null);\n }\n }\n\n /**\n * Reorder blocks within a section\n */\n reorderBlocks(sectionId: string, fromIndex: number, toIndex: number): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks];\n const [removed] = blocks.splice(fromIndex, 1);\n blocks.splice(toIndex, 0, removed);\n this.reindexBlocks(blocks);\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Duplicate a block\n */\n duplicateBlock(sectionId: string, blockId: string): string | null {\n const section = this.sections().find((s) => s.id === sectionId);\n const block = section?.blocks.find((b) => b.id === blockId);\n if (!block) return null;\n\n const newBlock: IEmailBlock = {\n ...structuredClone(block),\n id: crypto.randomUUID(),\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blockIndex = s.blocks.findIndex((b) => b.id === blockId);\n const blocks = [...s.blocks];\n blocks.splice(blockIndex + 1, 0, newBlock);\n this.reindexBlocks(blocks);\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n // =========================================\n // Selection Operations\n // =========================================\n\n /**\n * Select a section\n */\n selectSection(sectionId: string | null): void {\n this._selectedSectionId.set(sectionId);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Select a block\n */\n selectBlock(blockId: string | null): void {\n if (blockId) {\n // Find the section containing this block\n for (const section of this.sections()) {\n if (section.blocks.some((b) => b.id === blockId)) {\n this._selectedSectionId.set(section.id);\n break;\n }\n }\n }\n this._selectedBlockId.set(blockId);\n }\n\n /**\n * Clear all selection\n */\n clearSelection(): void {\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n // =========================================\n // Helper Methods\n // =========================================\n\n /**\n * Get default content for a block type\n */\n private getDefaultContent(type: EmailBlockType): EmailBlockContent {\n switch (type) {\n case EmailBlockType.TEXT:\n return { text: 'Enter your text here...', html: '<p>Enter your text here...</p>' };\n case EmailBlockType.IMAGE:\n return { src: '', alt: 'Image' };\n case EmailBlockType.BUTTON:\n return {\n text: 'Click Here',\n link: 'https://',\n backgroundColor: '#007bff',\n textColor: '#ffffff',\n borderRadius: '4px',\n };\n case EmailBlockType.DIVIDER:\n return { height: '1px', color: '#cccccc', style: 'solid' };\n case EmailBlockType.HTML:\n return { html: '<!-- Custom HTML -->' };\n default:\n return { text: '' };\n }\n }\n\n /**\n * Reindex block order values after add/remove/reorder\n */\n private reindexBlocks(blocks: IEmailBlock[]): void {\n blocks.forEach((b, i) => (b.order = i));\n }\n}\n","import { Routes } from '@angular/router';\nimport {\n EMAIL_CONFIG_PERMISSIONS,\n EMAIL_TEMPLATE_PERMISSIONS,\n permissionGuard,\n} from '@flusys/ng-shared';\n\n/**\n * Email Module Routes\n * All routes protected by permission guards\n */\nexport const EMAIL_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/email-container/email-container.component').then(\n (m) => m.EmailContainerComponent,\n ),\n children: [\n // Template Routes\n {\n path: 'templates',\n canActivate: [permissionGuard(EMAIL_TEMPLATE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/template/template-list.component').then(\n (m) => m.TemplateListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(EMAIL_TEMPLATE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(EMAIL_TEMPLATE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n ],\n },\n\n // Config Routes\n {\n path: 'configs',\n canActivate: [permissionGuard(EMAIL_CONFIG_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/config/email-config-list.component').then(\n (m) => m.EmailConfigListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(EMAIL_CONFIG_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(EMAIL_CONFIG_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect\n { path: '', redirectTo: 'templates', pathMatch: 'full' },\n ],\n },\n];\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n EMAIL_CONFIG_PERMISSIONS,\n EMAIL_TEMPLATE_PERMISSIONS,\n PermissionValidatorService,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n/**\n * Email container component with tab navigation\n * Filters tabs based on user permissions\n */\n@Component({\n selector: 'lib-email-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, RouterLink, RouterLinkActive],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">Email</h1>\n <p class=\"text-sm text-muted-color mt-1\">Manage email templates and provider configurations</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap -mx-2 sm:mx-0 px-2 sm:px-0\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n [routerLinkActiveOptions]=\"{ exact: false }\"\n class=\"flex items-center gap-2 px-3 sm:px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0 text-sm sm:text-base\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class EmailContainerComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'templates',\n label: 'Templates',\n icon: 'pi pi-file',\n route: 'templates',\n permission: EMAIL_TEMPLATE_PERMISSIONS.READ,\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n permission: EMAIL_CONFIG_PERMISSIONS.READ,\n },\n ];\n\n /** Visible tabs based on user permissions */\n readonly visibleTabs = computed(() =>\n this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission)),\n );\n}\n","// =============================================================================\n// @flusys/ng-email - Email Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport { EmailConfigApiService } from './services/email-config-api.service';\nexport { EmailTemplateApiService } from './services/email-template-api.service';\nexport { EmailSendService } from './services/email-send.service';\nexport { EmailBuilderStateService } from './services/email-builder-state.service';\n\n// Routes\nexport { EMAIL_ROUTES } from './routes/email.routes';\n\n// Components\nexport { EmailContainerComponent } from './pages/email-container/email-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAAA;;AAEG;IACS;AAAZ,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,iBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;;ACH7B;;AAEG;IACS;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EANW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;;AC8I1B;;AAEG;AACI,MAAM,sBAAsB,GAAmB;AACpD,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,UAAU,EAAE,mBAAmB;AAC/B,IAAA,aAAa,EAAE,SAAS;;AAG1B;;AAEG;AACG,SAAU,iBAAiB,CAAC,OAAA,GAAiC,EAAE,EAAA;IACnE,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE;AACrC,QAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO;AACnC,QAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,mBAAmB;AACzC,QAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;AAC5B,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,qBAAqB,EAAE;AACrD,QAAA,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QAClC,QAAQ,EAAE,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;KAC7D;AACH;AAEA;;AAEG;AACH,SAAS,qBAAqB,GAAA;IAC5B,OAAO;QACL,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACjF,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAC7E,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;KAClF;AACH;;ACxKA;;;;AAIG;AAIG,MAAO,qBAAsB,SAAQ,kBAG1C,CAAA;AACkB,IAAA,SAAS,GAAG,MAAM,CAAa,UAAU,CAAC;AAE3D,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IACpD;AAEA;;AAEG;IACH,QAAQ,CAAC,QAAgB,EAAE,SAAiB,EAAA;QAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;AAC3D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,GAAG,YAAY,CAAA,UAAA,CAAY,EAC3B,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,CACvC;IACH;uGAnBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACbD;;;;AAIG;AAIG,MAAO,uBAAwB,SAAQ,kBAG5C,CAAA;AACC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IACtD;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,IAAY,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,cAAc,EAC7B,EAAE,IAAI,EAAE,CACT;IACH;uGAhBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACFD;;;;;;AAMG;MAIU,gBAAgB,CAAA;AACV,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,SAAS,GAAG,MAAM,CAAa,UAAU,CAAC;IAC1C,OAAO,GAAG,CAAA,EAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA,KAAA,CAAO;AAE3E;;AAEG;AACH,IAAA,UAAU,CAAC,GAAkB,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,OAAA,CAAS,EACxB,GAAG,CACJ;IACH;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,GAA0B,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,SAAA,CAAW,EAC1B,GAAG,CACJ;IACH;uGAvBW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACTD;;;AAGG;MAEU,wBAAwB,CAAA;;AAElB,IAAA,OAAO,GAAG,MAAM,CAAe,iBAAiB,EAAE,mDAAC;AACnD,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;;AAGxB,IAAA,kBAAkB,GAAG,MAAM,CAAgB,IAAI,8DAAC;AAChD,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,4DAAC;;AAG9C,IAAA,SAAS,GAAG,MAAM,CAAoB,QAAQ,qDAAC;;AAGvD,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpC,IAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;AACxD,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACpD,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;AAGtC,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,oDAAC;AAClD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,wDAAC;AAClD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,mDAAC;AAChD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,IAAI,sBAAsB,oDAAC;AAC5E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,IAAI,EAAE,qDAAC;AAE1D,IAAA,aAAa,GAAG,QAAQ,CAAC,MAA2B;QAC3D,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI;AACjE,IAAA,CAAC,yDAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAA2B;QACzD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI;AAC/D,IAAA,CAAC,uDAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAA2B;QAC3D,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI;AACjE,IAAA,CAAC,yDAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAA2B;AAC7D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC3C,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;QAC3B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI;AAChE,IAAA,CAAC,2DAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAyB;AACzD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AAC1D,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,KAAK;QACzB;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,yDAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAoB;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AACjD,IAAA,CAAC,qDAAC;;;;AAMF;;AAEG;AACH,IAAA,UAAU,CAAC,MAAoB,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA;;AAEG;IACH,eAAe,CAAC,OAAe,mBAAmB,EAAA;AAChD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CACd,OAAiG,EAAA;QAEjG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;AACT,YAAA,GAAG,OAAO;AACX,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,IAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;;;;AAMA;;AAEG;IACH,aAAa,CAAC,SAAiB,EAAE,OAA+B,EAAA;QAC9D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;AACT,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAC9B,CAAC,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,CAC9C;AACF,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;;;;AAMA;;AAEG;AACH,IAAA,QAAQ,CACN,SAAiB,EACjB,SAAyB,EACzB,KAA4B,EAAA;AAE5B,QAAA,MAAM,QAAQ,GAAgB;AAC5B,YAAA,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;AACvB,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAC1C,YAAA,GAAG,KAAK;SACT;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;gBAChC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC;AACtC,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,OAAO,QAAQ,CAAC,EAAE;IACpB;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,SAAiB,EAAE,OAAe,EAAE,OAA6B,EAAA;QAC3E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;gBAChC,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;iBAC3E;AACH,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;IACH,WAAW,CAAC,SAAiB,EAAE,OAAe,EAAA;QAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;AAChC,gBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AACvD,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGvB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,OAAO,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC;IACF;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe,EAAA;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;gBAChC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAC5B,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC;AAClC,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;IACH,cAAc,CAAC,SAAiB,EAAE,OAAe,EAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AAC/D,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,MAAM,QAAQ,GAAgB;YAC5B,GAAG,eAAe,CAAC,KAAK,CAAC;AACzB,YAAA,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;AAChC,gBAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;gBAC9D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;AAC1C,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,OAAO,QAAQ,CAAC,EAAE;IACpB;;;;AAMA;;AAEG;AACH,IAAA,aAAa,CAAC,SAAwB,EAAA;AACpC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,EAAE;;YAEX,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrC,gBAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;oBAChD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvC;gBACF;YACF;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;IACpC;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;;;;AAMA;;AAEG;AACK,IAAA,iBAAiB,CAAC,IAAoB,EAAA;QAC5C,QAAQ,IAAI;YACV,KAAK,cAAc,CAAC,IAAI;gBACtB,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,gCAAgC,EAAE;YACpF,KAAK,cAAc,CAAC,KAAK;gBACvB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;YAClC,KAAK,cAAc,CAAC,MAAM;gBACxB,OAAO;AACL,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,SAAS,EAAE,SAAS;AACpB,oBAAA,YAAY,EAAE,KAAK;iBACpB;YACH,KAAK,cAAc,CAAC,OAAO;AACzB,gBAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAC5D,KAAK,cAAc,CAAC,IAAI;AACtB,gBAAA,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;AACzC,YAAA;AACE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;;IAEzB;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,MAAqB,EAAA;AACzC,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACzC;uGA7TW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAxB,wBAAwB,EAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC;;;ACRD;;;AAGG;AACI,MAAM,YAAY,GAAW;AAClC,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,aAAa,EAAE,MACb,wEAA4D,CAAC,IAAI,CAC/D,CAAC,CAAC,KAAK,CAAC,CAAC,uBAAuB,CACjC;AACH,QAAA,QAAQ,EAAE;;AAER,YAAA;AACE,gBAAA,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,CAAC,eAAe,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;AAC/D,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,wDAA2C,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC/B;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;wBACX,WAAW,EAAE,CAAC,eAAe,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACjE,wBAAA,aAAa,EAAE,MACb,OAAO,wDAA2C,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC/B;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;wBACX,WAAW,EAAE,CAAC,eAAe,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACjE,wBAAA,aAAa,EAAE,MACb,OAAO,wDAA2C,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC/B;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;AAGD,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;AAC7D,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,4DAA6C,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;wBACX,WAAW,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC/D,wBAAA,aAAa,EAAE,MACb,OAAO,4DAA6C,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;wBACX,WAAW,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC/D,wBAAA,aAAa,EAAE,MACb,OAAO,4DAA6C,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;YAGD,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;AACzD,SAAA;AACF,KAAA;;;ACpEH;;;AAGG;MAoCU,uBAAuB,CAAA;AACjB,IAAA,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,CAAC;;AAGxD,IAAA,OAAO,GAAW;AACjC,QAAA;AACE,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,KAAK,EAAE,WAAW;AAClB,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,0BAA0B,CAAC,IAAI;AAC5C,SAAA;AACD,QAAA;AACE,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,KAAK,EAAE,gBAAgB;AACvB,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,wBAAwB,CAAC,IAAI;AAC1C,SAAA;KACF;;AAGQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,uDACrF;uGAxBU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBxB;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,iHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA9BS,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAgCzC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAnCnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAQ3C;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,iHAAA,CAAA,EAAA;;;;;;;;ACrDH;AACA;AACA;AAEA;;ACJA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "name": "@flusys/ng-email",
3
- "version": "1.1.0-beta",
3
+ "version": "1.1.0",
4
4
  "description": "Email management module for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
- "@angular/common": "^21.0.0",
8
- "@angular/core": "^21.0.0",
9
- "@angular/forms": "^21.0.0",
10
- "@angular/router": "^21.0.0",
11
- "@flusys/ng-core": "^1.1.0-beta",
12
- "@flusys/ng-shared": "^1.1.0-beta",
13
- "@primeuix/themes": "^1.0.0",
14
- "primeicons": "^7.0.0",
15
- "primeng": "^21.0.0"
7
+ "@angular/common": ">=21.0.0",
8
+ "@angular/core": ">=21.0.0",
9
+ "@angular/forms": ">=21.0.0",
10
+ "@angular/router": ">=21.0.0",
11
+ "@flusys/ng-core": ">=1.1.0",
12
+ "@flusys/ng-layout": ">=1.1.0",
13
+ "@flusys/ng-shared": ">=1.1.0",
14
+ "@primeuix/themes": ">=1.0.0",
15
+ "primeicons": ">=7.0.0",
16
+ "primeng": ">=21.0.0"
16
17
  },
17
18
  "sideEffects": false,
18
19
  "module": "fesm2022/flusys-ng-email.mjs",
@@ -24,13 +24,47 @@ declare enum EmailBlockType {
24
24
  HTML = "html"
25
25
  }
26
26
 
27
+ /**
28
+ * SMTP auth credentials (nodemailer style)
29
+ */
30
+ interface ISmtpAuth {
31
+ user: string;
32
+ pass: string;
33
+ }
34
+ /**
35
+ * SMTP provider configuration (nodemailer style)
36
+ */
37
+ interface ISmtpConfig {
38
+ host: string;
39
+ port: number;
40
+ secure?: boolean;
41
+ auth: ISmtpAuth;
42
+ }
43
+ /**
44
+ * SendGrid provider configuration
45
+ */
46
+ interface ISendGridConfig {
47
+ apiKey: string;
48
+ }
49
+ /**
50
+ * Mailgun provider configuration
51
+ */
52
+ interface IMailgunConfig {
53
+ apiKey: string;
54
+ domain: string;
55
+ region?: 'us' | 'eu';
56
+ }
57
+ /**
58
+ * Union type for all provider configurations
59
+ */
60
+ type EmailProviderConfig = ISmtpConfig | ISendGridConfig | IMailgunConfig;
27
61
  /**
28
62
  * Email configuration interface
29
63
  */
30
64
  interface IEmailConfig extends IBaseEntity {
31
65
  name: string;
32
66
  provider: EmailProviderEnum;
33
- config: Record<string, any>;
67
+ config: EmailProviderConfig;
34
68
  fromEmail: string | null;
35
69
  fromName: string | null;
36
70
  isActive: boolean;
@@ -43,7 +77,7 @@ interface IEmailConfig extends IBaseEntity {
43
77
  interface ICreateEmailConfigDto {
44
78
  name: string;
45
79
  provider: EmailProviderEnum;
46
- config: Record<string, any>;
80
+ config: EmailProviderConfig;
47
81
  fromEmail?: string;
48
82
  fromName?: string;
49
83
  isActive?: boolean;
@@ -55,37 +89,21 @@ interface ICreateEmailConfigDto {
55
89
  interface IUpdateEmailConfigDto extends Partial<ICreateEmailConfigDto> {
56
90
  id: string;
57
91
  }
92
+
58
93
  /**
59
- * SMTP provider configuration
60
- */
61
- interface ISmtpConfig {
62
- host: string;
63
- port: number;
64
- secure?: boolean;
65
- username: string;
66
- password: string;
67
- }
68
- /**
69
- * SendGrid provider configuration
94
+ * Email template variable types
70
95
  */
71
- interface ISendGridConfig {
72
- apiKey: string;
73
- }
96
+ type EmailVariableType = 'string' | 'number' | 'boolean' | 'date';
74
97
  /**
75
- * Mailgun provider configuration
98
+ * Email section types
76
99
  */
77
- interface IMailgunConfig {
78
- apiKey: string;
79
- domain: string;
80
- region?: 'us' | 'eu';
81
- }
82
-
100
+ type EmailSectionType = 'header' | 'body' | 'footer';
83
101
  /**
84
102
  * Email template variable definition
85
103
  */
86
104
  interface IEmailTemplateVariable {
87
105
  name: string;
88
- type: 'string' | 'number' | 'boolean' | 'date';
106
+ type: EmailVariableType;
89
107
  required?: boolean;
90
108
  defaultValue?: string;
91
109
  description?: string;
@@ -148,6 +166,10 @@ interface IDividerBlockContent {
148
166
  interface IHtmlBlockContent {
149
167
  html: string;
150
168
  }
169
+ /**
170
+ * Block content union type
171
+ */
172
+ type EmailBlockContent = ITextBlockContent | IImageBlockContent | IButtonBlockContent | IDividerBlockContent | IHtmlBlockContent;
151
173
  /**
152
174
  * Email content block
153
175
  */
@@ -155,7 +177,7 @@ interface IEmailBlock {
155
177
  id: string;
156
178
  type: EmailBlockType;
157
179
  order: number;
158
- content: ITextBlockContent | IImageBlockContent | IButtonBlockContent | IDividerBlockContent | IHtmlBlockContent;
180
+ content: EmailBlockContent;
159
181
  style?: IEmailBlockStyle;
160
182
  }
161
183
  /**
@@ -163,7 +185,7 @@ interface IEmailBlock {
163
185
  */
164
186
  interface IEmailSection {
165
187
  id: string;
166
- type: 'header' | 'body' | 'footer';
188
+ type: EmailSectionType;
167
189
  name: string;
168
190
  blocks: IEmailBlock[];
169
191
  order: number;
@@ -196,7 +218,7 @@ interface IEmailSchema {
196
218
  */
197
219
  declare const DEFAULT_EMAIL_SETTINGS: IEmailSettings;
198
220
  /**
199
- * Create a new email schema
221
+ * Create a new email schema with default sections
200
222
  */
201
223
  declare function createEmailSchema(partial?: Partial<IEmailSchema>): IEmailSchema;
202
224
 
@@ -239,16 +261,6 @@ interface IUpdateEmailTemplateDto extends Partial<ICreateEmailTemplateDto> {
239
261
  id: string;
240
262
  }
241
263
 
242
- /**
243
- * Test send request DTO
244
- */
245
- interface ITestSendDto {
246
- templateId: string;
247
- configId: string;
248
- recipient: string;
249
- subject?: string;
250
- variables?: Record<string, string>;
251
- }
252
264
  /**
253
265
  * Test send result
254
266
  */
@@ -293,8 +305,8 @@ interface ISendTemplateEmailDto {
293
305
  * Handles email configuration CRUD operations
294
306
  * Endpoint: POST /email/email-config/*
295
307
  */
296
- declare class EmailConfigApiService extends ApiResourceService<IUpdateEmailConfigDto, IEmailConfig> {
297
- private readonly apiBaseUrl;
308
+ declare class EmailConfigApiService extends ApiResourceService<ICreateEmailConfigDto | IUpdateEmailConfigDto, IEmailConfig> {
309
+ private readonly appConfig;
298
310
  constructor();
299
311
  /**
300
312
  * Send test email to verify configuration
@@ -309,7 +321,7 @@ declare class EmailConfigApiService extends ApiResourceService<IUpdateEmailConfi
309
321
  * Handles email template CRUD operations
310
322
  * Endpoint: POST /email/email-template/*
311
323
  */
312
- declare class EmailTemplateApiService extends ApiResourceService<IUpdateEmailTemplateDto, IEmailTemplate> {
324
+ declare class EmailTemplateApiService extends ApiResourceService<ICreateEmailTemplateDto | IUpdateEmailTemplateDto, IEmailTemplate> {
313
325
  constructor();
314
326
  /**
315
327
  * Get template by slug (POST-only RPC pattern)
@@ -322,9 +334,13 @@ declare class EmailTemplateApiService extends ApiResourceService<IUpdateEmailTem
322
334
  /**
323
335
  * Email Send Service
324
336
  * Handles sending emails directly or using templates
337
+ * Endpoint: POST /email/send/*
338
+ *
339
+ * Note: For testing configurations, use EmailConfigApiService.sendTest()
325
340
  */
326
341
  declare class EmailSendService {
327
342
  private readonly http;
343
+ private readonly appConfig;
328
344
  private readonly baseUrl;
329
345
  /**
330
346
  * Send email directly (without template)
@@ -334,10 +350,6 @@ declare class EmailSendService {
334
350
  * Send email using template
335
351
  */
336
352
  sendTemplate(dto: ISendTemplateEmailDto): Observable<ISingleResponse<ITestSendResult>>;
337
- /**
338
- * Send test email (for testing configuration)
339
- */
340
- sendTest(dto: ITestSendDto): Observable<ISingleResponse<ITestSendResult>>;
341
353
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmailSendService, never>;
342
354
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<EmailSendService>;
343
355
  }
@@ -360,7 +372,7 @@ declare class EmailBuilderStateService {
360
372
  readonly sections: _angular_core.Signal<IEmailSection[]>;
361
373
  readonly templateName: _angular_core.Signal<string>;
362
374
  readonly subject: _angular_core.Signal<string>;
363
- readonly settings: _angular_core.Signal<IEmailSettings>;
375
+ readonly settings: _angular_core.Signal<_flusys_ng_email.IEmailSettings>;
364
376
  readonly variables: _angular_core.Signal<_flusys_ng_email.IEmailTemplateVariable[]>;
365
377
  readonly headerSection: _angular_core.Signal<IEmailSection | null>;
366
378
  readonly bodySection: _angular_core.Signal<IEmailSection | null>;
@@ -428,12 +440,17 @@ declare class EmailBuilderStateService {
428
440
  * Get default content for a block type
429
441
  */
430
442
  private getDefaultContent;
443
+ /**
444
+ * Reindex block order values after add/remove/reorder
445
+ */
446
+ private reindexBlocks;
431
447
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmailBuilderStateService, never>;
432
448
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<EmailBuilderStateService>;
433
449
  }
434
450
 
435
451
  /**
436
- * Email module routes
452
+ * Email Module Routes
453
+ * All routes protected by permission guards
437
454
  */
438
455
  declare const EMAIL_ROUTES: Routes;
439
456
 
@@ -442,15 +459,21 @@ interface ITab {
442
459
  label: string;
443
460
  icon: string;
444
461
  route: string;
462
+ permission: string;
445
463
  }
446
464
  /**
447
465
  * Email container component with tab navigation
466
+ * Filters tabs based on user permissions
448
467
  */
449
468
  declare class EmailContainerComponent {
450
- readonly tabs: ITab[];
469
+ private readonly permissionValidator;
470
+ /** All available tabs */
471
+ private readonly allTabs;
472
+ /** Visible tabs based on user permissions */
473
+ readonly visibleTabs: _angular_core.Signal<ITab[]>;
451
474
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmailContainerComponent, never>;
452
475
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EmailContainerComponent, "lib-email-container", never, {}, {}, never, never, true, never>;
453
476
  }
454
477
 
455
478
  export { DEFAULT_EMAIL_SETTINGS, EMAIL_ROUTES, EmailBlockType, EmailBuilderStateService, EmailConfigApiService, EmailContainerComponent, EmailProviderEnum, EmailSendService, EmailTemplateApiService, createEmailSchema };
456
- export type { IButtonBlockContent, ICreateEmailConfigDto, ICreateEmailTemplateDto, IDividerBlockContent, IEmailBlock, IEmailBlockStyle, IEmailConfig, IEmailSchema, IEmailSection, IEmailSectionStyle, IEmailSettings, IEmailTemplate, IEmailTemplateVariable, IHtmlBlockContent, IImageBlockContent, IMailgunConfig, ISendEmailDto, ISendGridConfig, ISendTemplateEmailDto, ISmtpConfig, ITestSendDto, ITestSendResult, ITextBlockContent, IUpdateEmailConfigDto, IUpdateEmailTemplateDto };
479
+ export type { EmailBlockContent, EmailProviderConfig, EmailSectionType, EmailVariableType, IButtonBlockContent, ICreateEmailConfigDto, ICreateEmailTemplateDto, IDividerBlockContent, IEmailBlock, IEmailBlockStyle, IEmailConfig, IEmailSchema, IEmailSection, IEmailSectionStyle, IEmailSettings, IEmailTemplate, IEmailTemplateVariable, IHtmlBlockContent, IImageBlockContent, IMailgunConfig, ISendEmailDto, ISendGridConfig, ISendTemplateEmailDto, ISmtpAuth, ISmtpConfig, ITestSendResult, ITextBlockContent, IUpdateEmailConfigDto, IUpdateEmailTemplateDto };
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-email-email-config-form.component-8dOBD-Q-.mjs","sources":["../../../projects/ng-email/pages/config/email-config-form.component.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { EmailProviderEnum } from '../../enums/email-provider.enum';\nimport { IEmailConfig } from '../../interfaces/email-config.interface';\nimport { EmailConfigApiService } from '../../services/email-config-api.service';\n\n/**\n * Email configuration form component (create/edit)\n */\n@Component({\n selector: 'lib-email-config-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterLink, FormsModule, PrimeModule],\n providers: [MessageService],\n template: `\n <div class=\"config-form\">\n <!-- Header -->\n <div class=\"flex justify-between items-center mb-4\">\n <div class=\"flex items-center gap-2\">\n <p-button icon=\"pi pi-arrow-left\" [text]=\"true\" routerLink=\"../\" />\n <h2 class=\"text-xl font-semibold\">\n {{ isEditMode() ? 'Edit Configuration' : 'New Configuration' }}\n </h2>\n </div>\n <div class=\"flex gap-2\">\n <p-button label=\"Cancel\" [text]=\"true\" routerLink=\"../\" />\n <p-button\n label=\"Save\"\n icon=\"pi pi-save\"\n [loading]=\"isLoading()\"\n (onClick)=\"onSave()\"\n />\n </div>\n </div>\n\n <!-- Form -->\n <div class=\"card\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Common Fields -->\n <div class=\"field\">\n <label for=\"name\" class=\"block font-medium mb-2\"\n >Configuration Name *</label\n >\n <input\n pInputText\n id=\"name\"\n [(ngModel)]=\"formModel.name\"\n class=\"w-full\"\n placeholder=\"e.g., Production SMTP\"\n />\n </div>\n\n <div class=\"field\">\n <label for=\"provider\" class=\"block font-medium mb-2\"\n >Email Provider *</label\n >\n <p-select\n id=\"provider\"\n [options]=\"providerOptions\"\n [(ngModel)]=\"formModel.provider\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select provider\"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"field\">\n <label for=\"fromEmail\" class=\"block font-medium mb-2\"\n >From Email</label\n >\n <input\n pInputText\n id=\"fromEmail\"\n [(ngModel)]=\"formModel.fromEmail\"\n class=\"w-full\"\n placeholder=\"noreply@example.com\"\n />\n </div>\n\n <div class=\"field\">\n <label for=\"fromName\" class=\"block font-medium mb-2\"\n >From Name</label\n >\n <input\n pInputText\n id=\"fromName\"\n [(ngModel)]=\"formModel.fromName\"\n class=\"w-full\"\n placeholder=\"FLUSYS\"\n />\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [(ngModel)]=\"formModel.isActive\" />\n <label>Active</label>\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [(ngModel)]=\"formModel.isDefault\" />\n <label>Set as Default</label>\n </div>\n </div>\n\n <!-- SMTP Fields -->\n @if (formModel.provider === providerEnum.SMTP) {\n <div class=\"border-t mt-4 pt-4\">\n <h3 class=\"font-semibold mb-4\">SMTP Settings</h3>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label for=\"smtpHost\" class=\"block font-medium mb-2\"\n >SMTP Host *</label\n >\n <input\n pInputText\n id=\"smtpHost\"\n [(ngModel)]=\"formModel.smtpHost\"\n class=\"w-full\"\n placeholder=\"smtp.gmail.com\"\n />\n </div>\n <div class=\"field\">\n <label for=\"smtpPort\" class=\"block font-medium mb-2\"\n >Port *</label\n >\n <p-inputNumber\n id=\"smtpPort\"\n [(ngModel)]=\"formModel.smtpPort\"\n [useGrouping]=\"false\"\n class=\"w-full\"\n placeholder=\"587\"\n />\n </div>\n <div class=\"field\">\n <label for=\"smtpUser\" class=\"block font-medium mb-2\"\n >Username *</label\n >\n <input\n pInputText\n id=\"smtpUser\"\n [(ngModel)]=\"formModel.smtpUser\"\n class=\"w-full\"\n placeholder=\"user@gmail.com\"\n />\n </div>\n <div class=\"field\">\n <label for=\"smtpPass\" class=\"block font-medium mb-2\"\n >Password *</label\n >\n <p-password\n id=\"smtpPass\"\n [(ngModel)]=\"formModel.smtpPass\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\"\n placeholder=\"App password\"\n />\n </div>\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [(ngModel)]=\"formModel.smtpSecure\" />\n <label>Use SSL/TLS (Port 465)</label>\n </div>\n </div>\n </div>\n }\n\n <!-- SendGrid Fields -->\n @if (formModel.provider === providerEnum.SENDGRID) {\n <div class=\"border-t mt-4 pt-4\">\n <h3 class=\"font-semibold mb-4\">SendGrid Settings</h3>\n <div class=\"grid grid-cols-1 gap-4\">\n <div class=\"field\">\n <label for=\"sendgridApiKey\" class=\"block font-medium mb-2\"\n >API Key *</label\n >\n <p-password\n id=\"sendgridApiKey\"\n [(ngModel)]=\"formModel.sendgridApiKey\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\"\n placeholder=\"SG.xxxx...\"\n />\n </div>\n </div>\n </div>\n }\n\n <!-- Mailgun Fields -->\n @if (formModel.provider === providerEnum.MAILGUN) {\n <div class=\"border-t mt-4 pt-4\">\n <h3 class=\"font-semibold mb-4\">Mailgun Settings</h3>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label for=\"mailgunApiKey\" class=\"block font-medium mb-2\"\n >API Key *</label\n >\n <p-password\n id=\"mailgunApiKey\"\n [(ngModel)]=\"formModel.mailgunApiKey\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\"\n placeholder=\"key-xxxx...\"\n />\n </div>\n <div class=\"field\">\n <label for=\"mailgunDomain\" class=\"block font-medium mb-2\"\n >Domain *</label\n >\n <input\n pInputText\n id=\"mailgunDomain\"\n [(ngModel)]=\"formModel.mailgunDomain\"\n class=\"w-full\"\n placeholder=\"mg.example.com\"\n />\n </div>\n <div class=\"field\">\n <label for=\"mailgunRegion\" class=\"block font-medium mb-2\"\n >Region</label\n >\n <p-select\n id=\"mailgunRegion\"\n [options]=\"regionOptions\"\n [(ngModel)]=\"formModel.mailgunRegion\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select region\"\n class=\"w-full\"\n />\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <p-toast />\n `,\n})\nexport class EmailConfigFormComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly configService = inject(EmailConfigApiService);\n private readonly messageService = inject(MessageService);\n\n readonly providerEnum = EmailProviderEnum;\n\n readonly isLoading = signal(false);\n readonly existingConfig = signal<IEmailConfig | null>(null);\n readonly isEditMode = computed(() => !!this.existingConfig());\n\n readonly providerOptions = [\n { label: 'SMTP', value: EmailProviderEnum.SMTP },\n { label: 'SendGrid', value: EmailProviderEnum.SENDGRID },\n { label: 'Mailgun', value: EmailProviderEnum.MAILGUN },\n ];\n\n readonly regionOptions = [\n { label: 'US', value: 'us' },\n { label: 'EU', value: 'eu' },\n ];\n\n formModel = {\n id: '',\n name: '',\n provider: EmailProviderEnum.SMTP,\n fromEmail: '',\n fromName: '',\n isActive: true,\n isDefault: false,\n // SMTP\n smtpHost: '',\n smtpPort: 587,\n smtpUser: '',\n smtpPass: '',\n smtpSecure: false,\n // SendGrid\n sendgridApiKey: '',\n // Mailgun\n mailgunApiKey: '',\n mailgunDomain: '',\n mailgunRegion: 'us',\n };\n\n ngOnInit(): void {\n const id = this.route.snapshot.paramMap.get('id');\n if (id) {\n this.loadConfig(id);\n }\n }\n\n async loadConfig(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.configService.findByIdAsync(id);\n if (response.success && response.data) {\n const config = response.data;\n this.existingConfig.set(config);\n\n this.formModel = {\n id: config.id,\n name: config.name,\n provider: config.provider,\n fromEmail: config.fromEmail || '',\n fromName: config.fromName || '',\n isActive: config.isActive,\n isDefault: config.isDefault ?? false,\n // SMTP\n smtpHost: config.config?.['host'] || '',\n smtpPort: config.config?.['port'] || 587,\n smtpUser: config.config?.['auth']?.['user'] || '',\n smtpPass: config.config?.['auth']?.['pass'] || '',\n smtpSecure: config.config?.['secure'] || false,\n // SendGrid\n sendgridApiKey: config.config?.['apiKey'] || '',\n // Mailgun\n mailgunApiKey: config.config?.['apiKey'] || '',\n mailgunDomain: config.config?.['domain'] || '',\n mailgunRegion: config.config?.['region'] || 'us',\n };\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSave(): Promise<void> {\n if (!this.formModel.name || !this.formModel.provider) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n // Build provider-specific config\n let config: Record<string, any> = {};\n switch (this.formModel.provider) {\n case EmailProviderEnum.SMTP:\n config = {\n host: this.formModel.smtpHost,\n port: this.formModel.smtpPort,\n secure: this.formModel.smtpSecure,\n auth: {\n user: this.formModel.smtpUser,\n pass: this.formModel.smtpPass,\n },\n };\n break;\n case EmailProviderEnum.SENDGRID:\n config = {\n apiKey: this.formModel.sendgridApiKey,\n };\n break;\n case EmailProviderEnum.MAILGUN:\n config = {\n apiKey: this.formModel.mailgunApiKey,\n domain: this.formModel.mailgunDomain,\n region: this.formModel.mailgunRegion,\n };\n break;\n }\n\n this.isLoading.set(true);\n try {\n if (this.isEditMode()) {\n await this.configService.updateAsync({\n id: this.formModel.id,\n name: this.formModel.name,\n provider: this.formModel.provider,\n config,\n fromEmail: this.formModel.fromEmail || undefined,\n fromName: this.formModel.fromName || undefined,\n isActive: this.formModel.isActive,\n isDefault: this.formModel.isDefault,\n });\n } else {\n await this.configService.insertAsync({\n name: this.formModel.name,\n provider: this.formModel.provider,\n config,\n fromEmail: this.formModel.fromEmail || undefined,\n fromName: this.formModel.fromName || undefined,\n isActive: this.formModel.isActive,\n isDefault: this.formModel.isDefault,\n } as any);\n }\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Configuration ${this.isEditMode() ? 'updated' : 'created'} successfully.`,\n });\n\n this.router.navigate(['../'], { relativeTo: this.route });\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to save configuration.',\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n}\n"],"names":["i4","i5","i7","i8"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-email-email-config-list.component-CJhSPkCZ.mjs","sources":["../../../projects/ng-email/pages/config/email-config-list.component.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, inject, signal, OnInit, computed } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { EmailConfigApiService } from '../../services/email-config-api.service';\nimport { IEmailConfig } from '../../interfaces/email-config.interface';\nimport { EmailProviderEnum } from '../../enums/email-provider.enum';\n\n/**\n * Email configuration list component\n */\n@Component({\n selector: 'lib-email-config-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormsModule],\n providers: [ConfirmationService, MessageService],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Email Configurations</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"New Configuration\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n />\n </div>\n\n <p-table\n [value]=\"configs()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Provider</th>\n <th>From Email</th>\n <th>Status</th>\n <th>Created</th>\n <th style=\"width: 150px\">Actions</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-config>\n <tr>\n <td>\n <i [class]=\"getProviderIcon(config.provider)\" class=\"mr-2\"></i>\n {{ config.name }}\n </td>\n <td>\n <p-tag\n [value]=\"getProviderLabel(config.provider)\"\n [severity]=\"getProviderSeverity(config.provider)\"\n />\n </td>\n <td>{{ config.fromEmail || '-' }}</td>\n <td>\n <p-tag\n [value]=\"config.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"config.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td>{{ config.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-send\"\n [text]=\"true\"\n size=\"small\"\n pTooltip=\"Test\"\n (onClick)=\"onTest(config)\"\n />\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(config.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(config)\"\n />\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4\">\n No email configurations found. Add a provider to start sending emails.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Test Email Dialog -->\n <p-dialog\n header=\"Test Email Configuration\"\n [(visible)]=\"showTestDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '400px' }\"\n >\n <div class=\"grid gap-4\">\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Configuration</label>\n <input\n pInputText\n [value]=\"selectedConfig()?.name || ''\"\n class=\"w-full\"\n [disabled]=\"true\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Provider</label>\n <p-tag\n [value]=\"getProviderLabel(selectedConfig()?.provider || '')\"\n [severity]=\"getProviderSeverity(selectedConfig()?.provider || '')\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Recipient Email *</label>\n <input\n pInputText\n [(ngModel)]=\"testRecipient\"\n class=\"w-full\"\n placeholder=\"recipient@example.com\"\n type=\"email\"\n />\n <small class=\"text-gray-500 mt-1 block\">\n A test email will be sent to this address\n </small>\n </div>\n </div>\n\n <ng-template #footer>\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n (onClick)=\"showTestDialog = false\"\n />\n <p-button\n label=\"Send Test\"\n icon=\"pi pi-send\"\n [loading]=\"isSendingTest()\"\n (onClick)=\"sendTestEmail()\"\n />\n </ng-template>\n </p-dialog>\n\n <p-confirmDialog />\n <p-toast />\n `,\n})\nexport class EmailConfigListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly configService = inject(EmailConfigApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly configs = signal<IEmailConfig[]>([]);\n readonly totalRecords = signal(0);\n readonly pageSize = signal(10);\n readonly currentPage = signal(1);\n\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // Test dialog state\n showTestDialog = false;\n readonly selectedConfig = signal<IEmailConfig | null>(null);\n readonly isSendingTest = signal(false);\n testRecipient = '';\n\n ngOnInit(): void {\n this.loadConfigs();\n }\n\n onCreate(): void {\n this.router.navigate(['/email/configs/new']);\n }\n\n onEdit(configId: string): void {\n this.router.navigate(['/email/configs', configId]);\n }\n\n async loadConfigs(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1,\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.configs.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadConfigs();\n }\n\n getProviderIcon(provider: EmailProviderEnum): string {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'pi pi-server';\n case EmailProviderEnum.SENDGRID:\n return 'pi pi-cloud';\n case EmailProviderEnum.MAILGUN:\n return 'pi pi-cloud';\n default:\n return 'pi pi-envelope';\n }\n }\n\n getProviderLabel(provider: EmailProviderEnum | string): string {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'SMTP';\n case EmailProviderEnum.SENDGRID:\n return 'SendGrid';\n case EmailProviderEnum.MAILGUN:\n return 'Mailgun';\n default:\n return provider || '';\n }\n }\n\n getProviderSeverity(\n provider: EmailProviderEnum | string,\n ): 'success' | 'secondary' | 'info' | 'warn' | 'danger' | 'contrast' {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'info';\n case EmailProviderEnum.SENDGRID:\n return 'success';\n case EmailProviderEnum.MAILGUN:\n return 'warn';\n default:\n return 'secondary';\n }\n }\n\n onTest(config: IEmailConfig): void {\n this.selectedConfig.set(config);\n this.testRecipient = '';\n this.showTestDialog = true;\n }\n\n async sendTestEmail(): Promise<void> {\n const config = this.selectedConfig();\n if (!config || !this.testRecipient) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please enter a recipient email address.',\n });\n return;\n }\n\n this.isSendingTest.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.sendTest(config.id, this.testRecipient),\n );\n\n if (response.data?.success) {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Test email sent successfully! Message ID: ${response.data.messageId}`,\n });\n this.showTestDialog = false;\n } else {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: response.data?.error || 'Failed to send test email.',\n });\n }\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to send test email.',\n });\n } finally {\n this.isSendingTest.set(false);\n }\n }\n\n onDelete(config: IEmailConfig): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${config.name}\"?`,\n header: 'Delete Configuration',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.configService.deleteAsync({ id: config.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Configuration deleted successfully.',\n });\n this.loadConfigs();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete configuration.',\n });\n }\n },\n });\n }\n}\n"],"names":["i6","i7","i8","i9","i10"],"mappings":"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"}